blob: 1b59a4e23e5da3cf2325396dce5b86b26d4a7e1c [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "modules/webusb/USBEndpoint.h"
#include "bindings/core/v8/ExceptionState.h"
#include "core/dom/DOMException.h"
#include "device/usb/public/interfaces/device.mojom-blink.h"
#include "modules/webusb/USBAlternateInterface.h"
using device::usb::blink::EndpointType;
using device::usb::blink::TransferDirection;
namespace blink {
namespace {
String convertDirectionToEnum(const TransferDirection& direction)
{
switch (direction) {
case TransferDirection::INBOUND:
return "in";
case TransferDirection::OUTBOUND:
return "out";
default:
ASSERT_NOT_REACHED();
return "";
}
}
String convertTypeToEnum(const EndpointType& type)
{
switch (type) {
case EndpointType::BULK:
return "bulk";
case EndpointType::INTERRUPT:
return "interrupt";
case EndpointType::ISOCHRONOUS:
return "isochronous";
default:
ASSERT_NOT_REACHED();
return "";
}
}
} // namespace
USBEndpoint* USBEndpoint::create(const USBAlternateInterface* alternate, size_t endpointIndex)
{
return new USBEndpoint(alternate, endpointIndex);
}
USBEndpoint* USBEndpoint::create(const USBAlternateInterface* alternate, size_t endpointNumber, const String& direction, ExceptionState& exceptionState)
{
TransferDirection mojoDirection = direction == "in" ? TransferDirection::INBOUND : TransferDirection::OUTBOUND;
const auto& endpoints = alternate->info().endpoints;
for (size_t i = 0; i < endpoints.size(); ++i) {
const auto& endpoint = endpoints[i];
if (endpoint->endpoint_number == endpointNumber && endpoint->direction == mojoDirection)
return USBEndpoint::create(alternate, i);
}
exceptionState.throwRangeError("No such endpoint exists in the given alternate interface.");
return nullptr;
}
USBEndpoint::USBEndpoint(const USBAlternateInterface* alternate, size_t endpointIndex)
: m_alternate(alternate)
, m_endpointIndex(endpointIndex)
{
ASSERT(m_alternate);
ASSERT(m_endpointIndex < m_alternate->info().endpoints.size());
}
const device::usb::blink::EndpointInfo& USBEndpoint::info() const
{
const device::usb::blink::AlternateInterfaceInfo& alternateInfo = m_alternate->info();
ASSERT(m_endpointIndex < alternateInfo.endpoints.size());
return *alternateInfo.endpoints[m_endpointIndex];
}
String USBEndpoint::direction() const
{
return convertDirectionToEnum(info().direction);
}
String USBEndpoint::type() const
{
return convertTypeToEnum(info().type);
}
DEFINE_TRACE(USBEndpoint)
{
visitor->trace(m_alternate);
}
} // namespace blink