1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
// 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
|