Index: third_party/WebKit/Source/modules/webusb/USBDevice.cpp |
diff --git a/third_party/WebKit/Source/modules/webusb/USBDevice.cpp b/third_party/WebKit/Source/modules/webusb/USBDevice.cpp |
index 0ef39681c97262696ba1e69f495d7d520c667cf4..2cd305b89b8551414b73206987015665dc353197 100644 |
--- a/third_party/WebKit/Source/modules/webusb/USBDevice.cpp |
+++ b/third_party/WebKit/Source/modules/webusb/USBDevice.cpp |
@@ -4,7 +4,7 @@ |
#include "modules/webusb/USBDevice.h" |
-#include "bindings/core/v8/CallbackPromiseAdapter.h" |
+#include "bindings/core/v8/MojoPromiseAdapter.h" |
#include "bindings/core/v8/ScriptPromise.h" |
#include "bindings/core/v8/ScriptPromiseResolver.h" |
#include "bindings/core/v8/ToV8.h" |
@@ -14,31 +14,57 @@ |
#include "core/dom/ExceptionCode.h" |
#include "modules/webusb/USBConfiguration.h" |
#include "modules/webusb/USBControlTransferParameters.h" |
-#include "modules/webusb/USBError.h" |
#include "modules/webusb/USBInTransferResult.h" |
#include "modules/webusb/USBIsochronousInTransferResult.h" |
#include "modules/webusb/USBIsochronousOutTransferResult.h" |
#include "modules/webusb/USBOutTransferResult.h" |
-#include "public/platform/modules/webusb/WebUSBTransferInfo.h" |
#include "wtf/Assertions.h" |
+namespace usb = device::usb::blink; |
+ |
namespace blink { |
namespace { |
const char kDeviceStateChangeInProgress[] = "An operation that changes the device state is in progress."; |
+const char kDeviceUnavailable[] = "Device unavailable."; |
const char kInterfaceNotFound[] = "The interface number provided is not supported by the device in its current configuration."; |
const char kInterfaceStateChangeInProgress[] = "An operation that changes interface state is in progress."; |
const char kOpenRequired[] = "The device must be opened first."; |
-String convertTransferStatus(const WebUSBTransferInfo::Status& status) |
+DOMException* convertFatalTransferStatus(const usb::TransferStatus& status) |
{ |
switch (status) { |
- case WebUSBTransferInfo::Status::Ok: |
+ case usb::TransferStatus::TRANSFER_ERROR: |
+ return DOMException::create(NetworkError, "A transfer error has occured."); |
+ case usb::TransferStatus::PERMISSION_DENIED: |
+ return DOMException::create(SecurityError, "The transfer was not allowed."); |
juncai
2016/04/15 16:52:47
This error message may be modified to better refle
|
+ case usb::TransferStatus::TIMEOUT: |
+ return DOMException::create(TimeoutError, "The transfer timed out."); |
+ case usb::TransferStatus::CANCELLED: |
+ return DOMException::create(AbortError, "The transfer was cancelled."); |
+ case usb::TransferStatus::DISCONNECT: |
+ return DOMException::create(NotFoundError, kDeviceUnavailable); |
+ case usb::TransferStatus::COMPLETED: |
+ case usb::TransferStatus::STALLED: |
+ case usb::TransferStatus::BABBLE: |
+ case usb::TransferStatus::SHORT_PACKET: |
+ return nullptr; |
+ default: |
+ ASSERT_NOT_REACHED(); |
+ return nullptr; |
+ } |
+} |
+ |
+String convertTransferStatus(const usb::TransferStatus& status) |
+{ |
+ switch (status) { |
+ case usb::TransferStatus::COMPLETED: |
+ case usb::TransferStatus::SHORT_PACKET: |
return "ok"; |
- case WebUSBTransferInfo::Status::Stall: |
+ case usb::TransferStatus::STALLED: |
return "stall"; |
- case WebUSBTransferInfo::Status::Babble: |
+ case usb::TransferStatus::BABBLE: |
return "babble"; |
default: |
ASSERT_NOT_REACHED(); |
@@ -46,250 +72,476 @@ String convertTransferStatus(const WebUSBTransferInfo::Status& status) |
} |
} |
-class OpenClosePromiseAdapter : public WebCallbacks<void, const WebUSBError&> { |
+mojo::WTFArray<uint8_t> convertBufferSource(const ArrayBufferOrArrayBufferView& buffer) |
+{ |
+ ASSERT(!buffer.isNull()); |
+ Vector<uint8_t> vector; |
+ if (buffer.isArrayBuffer()) |
+ vector.append(static_cast<uint8_t*>(buffer.getAsArrayBuffer()->data()), buffer.getAsArrayBuffer()->byteLength()); |
+ else |
+ vector.append(static_cast<uint8_t*>(buffer.getAsArrayBufferView()->baseAddress()), buffer.getAsArrayBufferView()->byteLength()); |
+ return mojo::WTFArray<uint8_t>(std::move(vector)); |
+} |
+ |
+class OpenPromiseAdapter : public MojoPromiseAdapter<usb::Device::OpenCallback> { |
+ WTF_MAKE_NONCOPYABLE(OpenPromiseAdapter); |
+ |
public: |
- OpenClosePromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver, bool desiredState) |
- : m_device(device) |
- , m_resolver(resolver) |
- , m_desiredState(desiredState) |
+ OpenPromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver) |
+ : MojoPromiseAdapter(resolver) |
+ , m_device(device) |
+ { |
+ } |
+ |
+ ~OpenPromiseAdapter() override |
+ { |
+ if (active()) |
+ reject(DOMException::create(NotFoundError, kDeviceUnavailable)); |
+ } |
+ |
+ void Run(usb::OpenDeviceError error) override |
{ |
+ if (active()) { |
+ switch (error) { |
+ case usb::OpenDeviceError::ALREADY_OPEN: |
+ ASSERT_NOT_REACHED(); |
+ // fall through |
+ case usb::OpenDeviceError::OK: |
+ m_device->onDeviceOpenedOrClosed(true); |
juncai
2016/04/15 16:52:47
nit: add comment for true parameter.
|
+ resolve(); |
+ break; |
juncai
2016/04/15 16:52:47
can just use return; here.
|
+ case usb::OpenDeviceError::ACCESS_DENIED: |
+ m_device->onDeviceOpenedOrClosed(false); |
juncai
2016/04/15 16:52:47
nit: add comment for false parameter.
|
+ reject(DOMException::create(SecurityError, "Access denied.")); |
+ break; |
juncai
2016/04/15 16:52:47
can just use return; here.
|
+ } |
+ } |
} |
- void onSuccess() override |
+private: |
+ Persistent<USBDevice> m_device; |
+}; |
+ |
+class ClosePromiseAdapter : public MojoPromiseAdapter<usb::Device::CloseCallback> { |
+ WTF_MAKE_NONCOPYABLE(ClosePromiseAdapter); |
+ |
+public: |
+ ClosePromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver) |
+ : MojoPromiseAdapter(resolver) |
+ , m_device(device) |
{ |
- if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) |
- return; |
+ } |
- m_device->onDeviceOpenedOrClosed(m_desiredState); |
- m_resolver->resolve(); |
+ ~ClosePromiseAdapter() override |
+ { |
+ if (active()) |
+ reject(DOMException::create(NotFoundError, kDeviceUnavailable)); |
} |
- void onError(const WebUSBError& e) override |
+ void Run() override |
{ |
- if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) |
- return; |
- m_device->onDeviceOpenedOrClosed(!m_desiredState); |
- m_resolver->reject(USBError::take(m_resolver, e)); |
+ if (active()) { |
+ m_device->onDeviceOpenedOrClosed(false); |
+ resolve(); |
+ } |
} |
private: |
Persistent<USBDevice> m_device; |
- Persistent<ScriptPromiseResolver> m_resolver; |
- bool m_desiredState; // true: open, false: closed |
}; |
-class SelectConfigurationPromiseAdapter : public WebCallbacks<void, const WebUSBError&> { |
+class SelectConfigurationPromiseAdapter : public MojoPromiseAdapter<usb::Device::SetConfigurationCallback> { |
+ WTF_MAKE_NONCOPYABLE(SelectConfigurationPromiseAdapter); |
+ |
public: |
SelectConfigurationPromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver, size_t configurationIndex) |
- : m_device(device) |
- , m_resolver(resolver) |
+ : MojoPromiseAdapter(resolver) |
+ , m_device(device) |
, m_configurationIndex(configurationIndex) |
{ |
} |
- void onSuccess() override |
+ ~SelectConfigurationPromiseAdapter() override |
{ |
- if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) |
- return; |
- m_device->onConfigurationSelected(true /* success */, m_configurationIndex); |
- m_resolver->resolve(); |
+ if (active()) |
+ reject(DOMException::create(NotFoundError, kDeviceUnavailable)); |
} |
- void onError(const WebUSBError& e) override |
+ void Run(bool success) override |
{ |
- if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) |
- return; |
- m_device->onConfigurationSelected(false /* failure */, m_configurationIndex); |
- m_resolver->reject(USBError::take(m_resolver, e)); |
+ if (active()) { |
+ m_device->onConfigurationSelected(success, m_configurationIndex); |
+ if (success) |
+ resolve(); |
+ else |
+ reject(DOMException::create(NetworkError, "Unable to set device configuration.")); |
+ } |
} |
private: |
Persistent<USBDevice> m_device; |
- Persistent<ScriptPromiseResolver> m_resolver; |
size_t m_configurationIndex; |
}; |
-class ClaimInterfacePromiseAdapter : public WebCallbacks<void, const WebUSBError&> { |
+class ClaimInterfacePromiseAdapter : public MojoPromiseAdapter<usb::Device::ClaimInterfaceCallback> { |
+ WTF_MAKE_NONCOPYABLE(ClaimInterfacePromiseAdapter); |
+ |
+public: |
+ ClaimInterfacePromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver, size_t interfaceIndex) |
+ : MojoPromiseAdapter(resolver) |
+ , m_device(device) |
+ , m_interfaceIndex(interfaceIndex) |
+ { |
+ } |
+ |
+ ~ClaimInterfacePromiseAdapter() override |
+ { |
+ if (active()) |
+ reject(DOMException::create(NotFoundError, kDeviceUnavailable)); |
+ } |
+ |
+ void Run(bool success) override |
+ { |
+ if (active()) { |
+ m_device->onInterfaceClaimedOrUnclaimed(success, m_interfaceIndex); |
+ if (success) |
+ resolve(); |
+ else |
+ reject(DOMException::create(NetworkError, "Unable to claim interface.")); |
+ } |
+ } |
+ |
+private: |
+ Persistent<USBDevice> m_device; |
+ size_t m_interfaceIndex; |
+}; |
+ |
+class ReleaseInterfacePromiseAdapter : public MojoPromiseAdapter<usb::Device::ReleaseInterfaceCallback> { |
+ WTF_MAKE_NONCOPYABLE(ReleaseInterfacePromiseAdapter); |
+ |
public: |
- ClaimInterfacePromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver, size_t interfaceIndex, bool desiredState) |
- : m_device(device) |
- , m_resolver(resolver) |
+ ReleaseInterfacePromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver, size_t interfaceIndex) |
+ : MojoPromiseAdapter(resolver) |
+ , m_device(device) |
, m_interfaceIndex(interfaceIndex) |
- , m_desiredState(desiredState) |
{ |
} |
- void onSuccess() override |
+ ~ReleaseInterfacePromiseAdapter() override |
{ |
- if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) |
- return; |
- m_device->onInterfaceClaimedOrUnclaimed(m_desiredState, m_interfaceIndex); |
- m_resolver->resolve(); |
+ if (active()) |
+ reject(DOMException::create(NotFoundError, kDeviceUnavailable)); |
} |
- void onError(const WebUSBError& e) override |
+ void Run(bool success) override |
{ |
- if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) |
- return; |
- m_device->onInterfaceClaimedOrUnclaimed(!m_desiredState, m_interfaceIndex); |
- m_resolver->reject(USBError::take(m_resolver, e)); |
+ if (active()) { |
+ m_device->onInterfaceClaimedOrUnclaimed(!success, m_interfaceIndex); |
+ if (success) |
+ resolve(); |
+ else |
+ reject(DOMException::create(NetworkError, "Unable to release interface.")); |
+ } |
} |
private: |
Persistent<USBDevice> m_device; |
- Persistent<ScriptPromiseResolver> m_resolver; |
size_t m_interfaceIndex; |
- bool m_desiredState; // true: claimed, false: unclaimed |
}; |
-class SelectAlternateInterfacePromiseAdapter : public WebCallbacks<void, const WebUSBError&> { |
+class SetInterfacePromiseAdapter : public MojoPromiseAdapter<usb::Device::SetInterfaceAlternateSettingCallback> { |
+ WTF_MAKE_NONCOPYABLE(SetInterfacePromiseAdapter); |
+ |
public: |
- SelectAlternateInterfacePromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver, size_t interfaceIndex, size_t alternateIndex) |
- : m_device(device) |
- , m_resolver(resolver) |
+ SetInterfacePromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver, size_t interfaceIndex, size_t alternateIndex) |
+ : MojoPromiseAdapter(resolver) |
+ , m_device(device) |
, m_interfaceIndex(interfaceIndex) |
, m_alternateIndex(alternateIndex) |
{ |
} |
- void onSuccess() override |
+ ~SetInterfacePromiseAdapter() override |
{ |
- if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) |
- return; |
- m_device->onAlternateInterfaceSelected(true /* success */, m_interfaceIndex, m_alternateIndex); |
- m_resolver->resolve(); |
+ if (active()) |
+ reject(DOMException::create(NotFoundError, kDeviceUnavailable)); |
} |
- void onError(const WebUSBError& e) override |
+ void Run(bool success) override |
{ |
- if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) |
- return; |
- m_device->onAlternateInterfaceSelected(false /* failure */, m_interfaceIndex, m_alternateIndex); |
- m_resolver->reject(USBError::take(m_resolver, e)); |
+ if (active()) { |
+ m_device->onAlternateInterfaceSelected(success, m_interfaceIndex, m_alternateIndex); |
+ if (success) |
+ resolve(); |
+ else |
+ reject(DOMException::create(NetworkError, "Unable to set device interface.")); |
+ } |
} |
private: |
Persistent<USBDevice> m_device; |
- Persistent<ScriptPromiseResolver> m_resolver; |
size_t m_interfaceIndex; |
size_t m_alternateIndex; |
}; |
-class InputTransferResult { |
- WTF_MAKE_NONCOPYABLE(InputTransferResult); |
+class ControlTransferInPromiseAdapter : public MojoPromiseAdapter<usb::Device::ControlTransferInCallback> { |
+ WTF_MAKE_NONCOPYABLE(ControlTransferInPromiseAdapter); |
+ |
public: |
- using WebType = OwnPtr<WebUSBTransferInfo>; |
+ ControlTransferInPromiseAdapter(ScriptPromiseResolver* resolver) |
+ : MojoPromiseAdapter(resolver) |
+ { |
+ } |
- static USBInTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBTransferInfo> webTransferInfo) |
+ ~ControlTransferInPromiseAdapter() override |
{ |
- ASSERT(webTransferInfo->status.size() == 1); |
- return USBInTransferResult::create(convertTransferStatus(webTransferInfo->status[0]), webTransferInfo->data); |
+ if (active()) |
+ reject(DOMException::create(NotFoundError, kDeviceUnavailable)); |
} |
-private: |
- InputTransferResult() = delete; |
+ void Run(usb::TransferStatus status, mojo::WTFArray<uint8_t> data) override |
+ { |
+ if (active()) { |
+ DOMException* error = convertFatalTransferStatus(status); |
+ if (error) |
+ reject(error); |
+ else |
+ resolve(USBInTransferResult::create(convertTransferStatus(status), data.PassStorage())); |
+ } |
+ } |
}; |
-class OutputTransferResult { |
- WTF_MAKE_NONCOPYABLE(OutputTransferResult); |
+class ControlTransferOutPromiseAdapter : public MojoPromiseAdapter<usb::Device::ControlTransferOutCallback> { |
+ WTF_MAKE_NONCOPYABLE(ControlTransferOutPromiseAdapter); |
+ |
public: |
- using WebType = OwnPtr<WebUSBTransferInfo>; |
+ ControlTransferOutPromiseAdapter(ScriptPromiseResolver* resolver, unsigned transferLength) |
+ : MojoPromiseAdapter(resolver) |
+ , m_transferLength(transferLength) |
+ { |
+ } |
- static USBOutTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBTransferInfo> webTransferInfo) |
+ ~ControlTransferOutPromiseAdapter() override |
{ |
- ASSERT(webTransferInfo->status.size() == 1); |
- ASSERT(webTransferInfo->bytesTransferred.size() == 1); |
- return USBOutTransferResult::create(convertTransferStatus(webTransferInfo->status[0]), webTransferInfo->bytesTransferred[0]); |
+ if (active()) |
+ reject(DOMException::create(NotFoundError, kDeviceUnavailable)); |
+ } |
+ |
+ void Run(usb::TransferStatus status) override |
+ { |
+ if (active()) { |
+ DOMException* error = convertFatalTransferStatus(status); |
+ if (error) |
+ reject(error); |
+ else |
+ resolve(USBOutTransferResult::create(convertTransferStatus(status), m_transferLength)); |
+ } |
} |
private: |
- OutputTransferResult() = delete; |
+ unsigned m_transferLength; |
}; |
-class IsochronousInputTransferResult { |
- WTF_MAKE_NONCOPYABLE(IsochronousInputTransferResult); |
+class ClearHaltPromiseAdapter : public MojoPromiseAdapter<usb::Device::ClearHaltCallback> { |
+ WTF_MAKE_NONCOPYABLE(ClearHaltPromiseAdapter); |
public: |
- using WebType = OwnPtr<WebUSBTransferInfo>; |
+ ClearHaltPromiseAdapter(ScriptPromiseResolver* resolver) |
+ : MojoPromiseAdapter(resolver) |
+ { |
+ } |
- static USBIsochronousInTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBTransferInfo> webTransferInfo) |
+ ~ClearHaltPromiseAdapter() override |
{ |
- ASSERT(webTransferInfo->status.size() == webTransferInfo->packetLength.size() && webTransferInfo->packetLength.size() == webTransferInfo->bytesTransferred.size()); |
- DOMArrayBuffer* buffer = DOMArrayBuffer::create(webTransferInfo->data.data(), webTransferInfo->data.size()); |
- HeapVector<Member<USBIsochronousInTransferPacket>> packets(webTransferInfo->status.size()); |
- size_t byteOffset = 0; |
- for (size_t i = 0; i < webTransferInfo->status.size(); ++i) { |
- packets[i] = USBIsochronousInTransferPacket::create(convertTransferStatus(webTransferInfo->status[i]), DOMDataView::create(buffer, byteOffset, webTransferInfo->bytesTransferred[i])); |
- byteOffset += webTransferInfo->packetLength[i]; |
+ if (active()) |
+ reject(DOMException::create(NotFoundError, kDeviceUnavailable)); |
+ } |
+ |
+ void Run(bool success) override |
+ { |
+ if (active()) { |
+ if (success) |
+ resolve(); |
+ else |
+ reject(DOMException::create(NetworkError, "Unable to clear endpoint.")); |
} |
- return USBIsochronousInTransferResult::create(buffer, packets); |
} |
}; |
-class IsochronousOutputTransferResult { |
- WTF_MAKE_NONCOPYABLE(IsochronousOutputTransferResult); |
+class GenericTransferInPromiseAdapter : public MojoPromiseAdapter<usb::Device::GenericTransferInCallback> { |
+ WTF_MAKE_NONCOPYABLE(GenericTransferInPromiseAdapter); |
public: |
- using WebType = OwnPtr<WebUSBTransferInfo>; |
+ GenericTransferInPromiseAdapter(ScriptPromiseResolver* resolver) |
+ : MojoPromiseAdapter(resolver) |
+ { |
+ } |
- static USBIsochronousOutTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBTransferInfo> webTransferInfo) |
+ ~GenericTransferInPromiseAdapter() override |
{ |
- ASSERT(webTransferInfo->status.size() == webTransferInfo->bytesTransferred.size()); |
- HeapVector<Member<USBIsochronousOutTransferPacket>> packets(webTransferInfo->status.size()); |
- for (size_t i = 0; i < webTransferInfo->status.size(); ++i) |
- packets[i] = USBIsochronousOutTransferPacket::create(convertTransferStatus(webTransferInfo->status[i]), webTransferInfo->bytesTransferred[i]); |
- return USBIsochronousOutTransferResult::create(packets); |
+ if (active()) |
+ reject(DOMException::create(NotFoundError, kDeviceUnavailable)); |
+ } |
+ |
+ void Run(usb::TransferStatus status, mojo::WTFArray<uint8_t> data) override |
+ { |
+ if (active()) { |
+ DOMException* error = convertFatalTransferStatus(status); |
+ if (error) |
+ reject(error); |
+ else |
+ resolve(USBInTransferResult::create(convertTransferStatus(status), data.PassStorage())); |
+ } |
} |
}; |
-class BufferSource { |
- WTF_MAKE_NONCOPYABLE(BufferSource); |
+class GenericTransferOutPromiseAdapter : public MojoPromiseAdapter<usb::Device::GenericTransferOutCallback> { |
+ WTF_MAKE_NONCOPYABLE(GenericTransferOutPromiseAdapter); |
+ |
public: |
- BufferSource(const ArrayBufferOrArrayBufferView& buffer) : m_buffer(buffer) |
+ GenericTransferOutPromiseAdapter(ScriptPromiseResolver* resolver, unsigned transferLength) |
+ : MojoPromiseAdapter(resolver) |
+ , m_transferLength(transferLength) |
{ |
- ASSERT(!m_buffer.isNull()); |
} |
- uint8_t* data() const |
+ ~GenericTransferOutPromiseAdapter() override |
{ |
- if (m_buffer.isArrayBuffer()) |
- return static_cast<uint8_t*>(m_buffer.getAsArrayBuffer()->data()); |
- return static_cast<uint8_t*>(m_buffer.getAsArrayBufferView()->baseAddress()); |
+ if (active()) |
+ reject(DOMException::create(NotFoundError, kDeviceUnavailable)); |
} |
- unsigned size() const |
+ void Run(usb::TransferStatus status) override |
{ |
- if (m_buffer.isArrayBuffer()) |
- return m_buffer.getAsArrayBuffer()->byteLength(); |
- return m_buffer.getAsArrayBufferView()->byteLength(); |
+ if (active()) { |
+ DOMException* error = convertFatalTransferStatus(status); |
+ if (error) |
+ reject(error); |
+ else |
+ resolve(USBOutTransferResult::create(convertTransferStatus(status), m_transferLength)); |
+ } |
} |
private: |
- const ArrayBufferOrArrayBufferView& m_buffer; |
+ unsigned m_transferLength; |
}; |
-} // namespace |
+class IsochronousTransferInPromiseAdapter : public MojoPromiseAdapter<usb::Device::IsochronousTransferInCallback> { |
+ WTF_MAKE_NONCOPYABLE(IsochronousTransferInPromiseAdapter); |
-// static |
-USBDevice* USBDevice::take(ScriptPromiseResolver* resolver, PassOwnPtr<WebUSBDevice> device) |
-{ |
- return USBDevice::create(device, resolver->getExecutionContext()); |
-} |
+public: |
+ IsochronousTransferInPromiseAdapter(ScriptPromiseResolver* resolver) |
+ : MojoPromiseAdapter(resolver) |
+ { |
+ } |
+ |
+ ~IsochronousTransferInPromiseAdapter() override |
+ { |
+ if (active()) |
+ reject(DOMException::create(NotFoundError, kDeviceUnavailable)); |
+ } |
+ |
+ void Run(mojo::WTFArray<uint8_t> data, mojo::WTFArray<usb::IsochronousPacketPtr> mojoPackets) override |
+ { |
+ DOMArrayBuffer* buffer = DOMArrayBuffer::create(data.storage().data(), data.storage().size()); |
+ HeapVector<Member<USBIsochronousInTransferPacket>> packets; |
+ packets.reserveCapacity(mojoPackets.size()); |
+ size_t byteOffset = 0; |
+ for (const auto& packet : mojoPackets.storage()) { |
+ DOMException* error = convertFatalTransferStatus(packet->status); |
+ if (error) { |
+ reject(error); |
+ return; |
+ } |
+ packets.append(USBIsochronousInTransferPacket::create(convertTransferStatus(packet->status), DOMDataView::create(buffer, byteOffset, packet->transferred_length))); |
+ byteOffset += packet->length; |
+ } |
+ resolve(USBIsochronousInTransferResult::create(buffer, packets)); |
+ } |
+}; |
+ |
+class IsochronousTransferOutPromiseAdapter : public MojoPromiseAdapter<usb::Device::IsochronousTransferOutCallback> { |
+ WTF_MAKE_NONCOPYABLE(IsochronousTransferOutPromiseAdapter); |
+ |
+public: |
+ IsochronousTransferOutPromiseAdapter(ScriptPromiseResolver* resolver) |
+ : MojoPromiseAdapter(resolver) |
+ { |
+ } |
+ |
+ ~IsochronousTransferOutPromiseAdapter() override |
+ { |
+ if (active()) |
+ reject(DOMException::create(NotFoundError, kDeviceUnavailable)); |
+ } |
+ |
+ void Run(mojo::WTFArray<usb::IsochronousPacketPtr> mojoPackets) override |
+ { |
+ HeapVector<Member<USBIsochronousOutTransferPacket>> packets; |
+ packets.reserveCapacity(mojoPackets.size()); |
+ for (const auto& packet : mojoPackets.storage()) { |
+ DOMException* error = convertFatalTransferStatus(packet->status); |
+ if (error) { |
+ reject(error); |
+ return; |
+ } |
+ packets.append(USBIsochronousOutTransferPacket::create(convertTransferStatus(packet->status), packet->transferred_length)); |
+ } |
+ resolve(USBIsochronousOutTransferResult::create(packets)); |
+ } |
+}; |
+ |
+class ResetPromiseAdapter : public MojoPromiseAdapter<usb::Device::ResetCallback> { |
+ WTF_MAKE_NONCOPYABLE(ResetPromiseAdapter); |
+ |
+public: |
+ ResetPromiseAdapter(ScriptPromiseResolver* resolver) |
+ : MojoPromiseAdapter(resolver) |
+ { |
+ } |
+ |
+ ~ResetPromiseAdapter() override |
+ { |
+ if (active()) |
+ reject(DOMException::create(NotFoundError, kDeviceUnavailable)); |
+ } |
+ |
+ void Run(bool success) override |
+ { |
+ if (active()) { |
+ if (success) |
+ resolve(); |
+ else |
+ reject(DOMException::create(NetworkError, "Unable to reset the device.")); |
+ } |
+ } |
+}; |
+ |
+} // namespace |
-USBDevice::USBDevice(PassOwnPtr<WebUSBDevice> device, ExecutionContext* context) |
+USBDevice::USBDevice(usb::DeviceInfoPtr deviceInfo, usb::DevicePtr device, ExecutionContext* context) |
: ContextLifecycleObserver(context) |
- , m_device(device) |
+ , m_deviceInfo(std::move(deviceInfo)) |
+ , m_device(std::move(device)) |
, m_opened(false) |
, m_deviceStateChangeInProgress(false) |
, m_configurationIndex(-1) |
- , m_inEndpoints(15) |
- , m_outEndpoints(15) |
{ |
- int configurationIndex = findConfigurationIndex(info().activeConfiguration); |
+ if (m_device) { |
+ m_device.set_connection_error_handler([this]() { |
+ m_device = nullptr; |
+ m_opened = false; |
+ }); |
+ } |
+ int configurationIndex = findConfigurationIndex(info().active_configuration); |
if (configurationIndex != -1) |
onConfigurationSelected(true /* success */, configurationIndex); |
} |
+USBDevice::~USBDevice() |
+{ |
+} |
+ |
void USBDevice::onDeviceOpenedOrClosed(bool opened) |
{ |
m_opened = opened; |
@@ -300,7 +552,7 @@ void USBDevice::onConfigurationSelected(bool success, size_t configurationIndex) |
{ |
if (success) { |
m_configurationIndex = configurationIndex; |
- size_t numInterfaces = info().configurations[m_configurationIndex].interfaces.size(); |
+ size_t numInterfaces = info().configurations[m_configurationIndex]->interfaces.size(); |
m_claimedInterfaces.clearAll(); |
m_claimedInterfaces.resize(numInterfaces); |
m_interfaceStateChangeInProgress.clearAll(); |
@@ -352,10 +604,10 @@ USBConfiguration* USBDevice::configuration() const |
HeapVector<Member<USBConfiguration>> USBDevice::configurations() const |
{ |
- HeapVector<Member<USBConfiguration>> configurations; |
size_t numConfigurations = info().configurations.size(); |
+ HeapVector<Member<USBConfiguration>> configurations(numConfigurations); |
for (size_t i = 0; i < numConfigurations; ++i) |
- configurations.append(USBConfiguration::create(this, i)); |
+ configurations[i] = USBConfiguration::create(this, i); |
return configurations; |
} |
@@ -368,7 +620,8 @@ ScriptPromise USBDevice::open(ScriptState* scriptState) |
resolver->resolve(); |
} else { |
m_deviceStateChangeInProgress = true; |
- m_device->open(new OpenClosePromiseAdapter(this, resolver, true /* open */)); |
+ auto adapter = new OpenPromiseAdapter(this, resolver); |
+ m_device->Open(adapter->callback()); |
} |
} |
return promise; |
@@ -383,7 +636,8 @@ ScriptPromise USBDevice::close(ScriptState* scriptState) |
resolver->resolve(); |
} else { |
m_deviceStateChangeInProgress = true; |
- m_device->close(new OpenClosePromiseAdapter(this, resolver, false /* closed */)); |
+ auto adapter = new ClosePromiseAdapter(this, resolver); |
+ m_device->Close(adapter->callback()); |
} |
} |
return promise; |
@@ -404,7 +658,8 @@ ScriptPromise USBDevice::selectConfiguration(ScriptState* scriptState, uint8_t c |
resolver->resolve(); |
} else { |
m_deviceStateChangeInProgress = true; |
- m_device->setConfiguration(configurationValue, new SelectConfigurationPromiseAdapter(this, resolver, configurationIndex)); |
+ auto adapter = new SelectConfigurationPromiseAdapter(this, resolver, configurationIndex); |
+ m_device->SetConfiguration(configurationValue, adapter->callback()); |
} |
} |
} |
@@ -425,7 +680,8 @@ ScriptPromise USBDevice::claimInterface(ScriptState* scriptState, uint8_t interf |
resolver->resolve(); |
} else { |
m_interfaceStateChangeInProgress.set(interfaceIndex); |
- m_device->claimInterface(interfaceNumber, new ClaimInterfacePromiseAdapter(this, resolver, interfaceIndex, true /* claim */)); |
+ auto adapter = new ClaimInterfacePromiseAdapter(this, resolver, interfaceIndex); |
+ m_device->ClaimInterface(interfaceNumber, adapter->callback()); |
} |
} |
return promise; |
@@ -448,7 +704,8 @@ ScriptPromise USBDevice::releaseInterface(ScriptState* scriptState, uint8_t inte |
// changing. |
setEndpointsForInterface(interfaceIndex, false); |
m_interfaceStateChangeInProgress.set(interfaceIndex); |
- m_device->releaseInterface(interfaceNumber, new ClaimInterfacePromiseAdapter(this, resolver, interfaceIndex, false /* release */)); |
+ auto adapter = new ReleaseInterfacePromiseAdapter(this, resolver, interfaceIndex); |
+ m_device->ReleaseInterface(interfaceNumber, adapter->callback()); |
} |
} |
return promise; |
@@ -470,7 +727,8 @@ ScriptPromise USBDevice::selectAlternateInterface(ScriptState* scriptState, uint |
// the change is in progress. |
setEndpointsForInterface(interfaceIndex, false); |
m_interfaceStateChangeInProgress.set(interfaceIndex); |
- m_device->setInterface(interfaceNumber, alternateSetting, new SelectAlternateInterfacePromiseAdapter(this, resolver, interfaceIndex, alternateIndex)); |
+ auto adapter = new SetInterfacePromiseAdapter(this, resolver, interfaceIndex, alternateIndex); |
+ m_device->SetInterfaceAlternateSetting(interfaceNumber, alternateSetting, adapter->callback()); |
} |
} |
return promise; |
@@ -481,9 +739,11 @@ ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo |
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
ScriptPromise promise = resolver->promise(); |
if (ensureDeviceConfigured(resolver)) { |
- WebUSBDevice::ControlTransferParameters parameters; |
- if (convertControlTransferParameters(WebUSBDevice::TransferDirection::In, setup, ¶meters, resolver)) |
- m_device->controlTransfer(parameters, nullptr, length, 0, new CallbackPromiseAdapter<InputTransferResult, USBError>(resolver)); |
+ auto parameters = convertControlTransferParameters(setup, resolver); |
+ if (parameters) { |
+ auto adapter = new ControlTransferInPromiseAdapter(resolver); |
+ m_device->ControlTransferIn(std::move(parameters), length, 0, adapter->callback()); |
+ } |
} |
return promise; |
} |
@@ -493,9 +753,11 @@ ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC |
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
ScriptPromise promise = resolver->promise(); |
if (ensureDeviceConfigured(resolver)) { |
- WebUSBDevice::ControlTransferParameters parameters; |
- if (convertControlTransferParameters(WebUSBDevice::TransferDirection::Out, setup, ¶meters, resolver)) |
- m_device->controlTransfer(parameters, nullptr, 0, 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); |
+ auto parameters = convertControlTransferParameters(setup, resolver); |
+ if (parameters) { |
+ auto adapter = new ControlTransferOutPromiseAdapter(resolver, 0); |
+ m_device->ControlTransferOut(std::move(parameters), mojo::WTFArray<uint8_t>(), 0, adapter->callback()); |
+ } |
} |
return promise; |
} |
@@ -505,10 +767,11 @@ ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC |
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
ScriptPromise promise = resolver->promise(); |
if (ensureDeviceConfigured(resolver)) { |
- WebUSBDevice::ControlTransferParameters parameters; |
- if (convertControlTransferParameters(WebUSBDevice::TransferDirection::Out, setup, ¶meters, resolver)) { |
- BufferSource buffer(data); |
- m_device->controlTransfer(parameters, buffer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); |
+ auto parameters = convertControlTransferParameters(setup, resolver); |
+ if (parameters) { |
+ mojo::WTFArray<uint8_t> buffer = convertBufferSource(data); |
+ auto adapter = new ControlTransferOutPromiseAdapter(resolver, buffer.size()); |
+ m_device->ControlTransferOut(std::move(parameters), std::move(buffer), 0, adapter->callback()); |
} |
} |
return promise; |
@@ -518,8 +781,10 @@ ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, String direction, u |
{ |
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
ScriptPromise promise = resolver->promise(); |
- if (ensureEndpointAvailable(direction == "in", endpointNumber, resolver)) |
- m_device->clearHalt(endpointNumber, new CallbackPromiseAdapter<void, USBError>(resolver)); |
+ if (ensureEndpointAvailable(direction == "in", endpointNumber, resolver)) { |
+ auto adapter = new ClearHaltPromiseAdapter(resolver); |
+ m_device->ClearHalt(endpointNumber, adapter->callback()); |
+ } |
return promise; |
} |
@@ -527,8 +792,10 @@ ScriptPromise USBDevice::transferIn(ScriptState* scriptState, uint8_t endpointNu |
{ |
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
ScriptPromise promise = resolver->promise(); |
- if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) |
- m_device->transfer(WebUSBDevice::TransferDirection::In, endpointNumber, nullptr, length, 0, new CallbackPromiseAdapter<InputTransferResult, USBError>(resolver)); |
+ if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { |
+ auto adapter = new GenericTransferInPromiseAdapter(resolver); |
+ m_device->GenericTransferIn(endpointNumber, length, 0, adapter->callback()); |
+ } |
return promise; |
} |
@@ -537,8 +804,9 @@ ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN |
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
ScriptPromise promise = resolver->promise(); |
if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { |
- BufferSource buffer(data); |
- m_device->transfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buffer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); |
+ mojo::WTFArray<uint8_t> buffer = convertBufferSource(data); |
+ auto adapter = new GenericTransferOutPromiseAdapter(resolver, buffer.size()); |
+ m_device->GenericTransferOut(endpointNumber, std::move(buffer), 0, adapter->callback()); |
} |
return promise; |
} |
@@ -547,8 +815,10 @@ ScriptPromise USBDevice::isochronousTransferIn(ScriptState* scriptState, uint8_t |
{ |
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
ScriptPromise promise = resolver->promise(); |
- if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) |
- m_device->isochronousTransfer(WebUSBDevice::TransferDirection::In, endpointNumber, nullptr, 0, packetLengths, 0, new CallbackPromiseAdapter<IsochronousInputTransferResult, USBError>(resolver)); |
+ if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { |
+ auto adapter = new IsochronousTransferInPromiseAdapter(resolver); |
+ m_device->IsochronousTransferIn(endpointNumber, mojo::WTFArray<uint32_t>(std::move(packetLengths)), 0, adapter->callback()); |
+ } |
return promise; |
} |
@@ -557,8 +827,8 @@ ScriptPromise USBDevice::isochronousTransferOut(ScriptState* scriptState, uint8_ |
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
ScriptPromise promise = resolver->promise(); |
if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { |
- BufferSource buffer(data); |
- m_device->isochronousTransfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buffer.data(), buffer.size(), packetLengths, 0, new CallbackPromiseAdapter<IsochronousOutputTransferResult, USBError>(resolver)); |
+ auto adapter = new IsochronousTransferOutPromiseAdapter(resolver); |
+ m_device->IsochronousTransferOut(endpointNumber, convertBufferSource(data), mojo::WTFArray<uint32_t>(std::move(packetLengths)), 0, adapter->callback()); |
} |
return promise; |
} |
@@ -568,20 +838,19 @@ ScriptPromise USBDevice::reset(ScriptState* scriptState) |
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
ScriptPromise promise = resolver->promise(); |
if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { |
- if (!m_opened) |
+ if (!m_opened) { |
resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); |
- else |
- m_device->reset(new CallbackPromiseAdapter<void, USBError>(resolver)); |
+ } else { |
+ auto adapter = new ResetPromiseAdapter(resolver); |
+ m_device->Reset(adapter->callback()); |
+ } |
} |
return promise; |
} |
void USBDevice::contextDestroyed() |
{ |
- if (m_opened) { |
- m_device->close(new WebUSBDeviceCloseCallbacks()); |
- m_opened = false; |
- } |
+ m_device.reset(); |
} |
DEFINE_TRACE(USBDevice) |
@@ -593,7 +862,7 @@ int USBDevice::findConfigurationIndex(uint8_t configurationValue) const |
{ |
const auto& configurations = info().configurations; |
for (size_t i = 0; i < configurations.size(); ++i) { |
- if (configurations[i].configurationValue == configurationValue) |
+ if (configurations[i]->configuration_value == configurationValue) |
return i; |
} |
return -1; |
@@ -602,9 +871,9 @@ int USBDevice::findConfigurationIndex(uint8_t configurationValue) const |
int USBDevice::findInterfaceIndex(uint8_t interfaceNumber) const |
{ |
ASSERT(m_configurationIndex != -1); |
- const auto& interfaces = info().configurations[m_configurationIndex].interfaces; |
+ const auto& interfaces = info().configurations[m_configurationIndex]->interfaces; |
for (size_t i = 0; i < interfaces.size(); ++i) { |
- if (interfaces[i].interfaceNumber == interfaceNumber) |
+ if (interfaces[i]->interface_number == interfaceNumber) |
return i; |
} |
return -1; |
@@ -613,9 +882,9 @@ int USBDevice::findInterfaceIndex(uint8_t interfaceNumber) const |
int USBDevice::findAlternateIndex(size_t interfaceIndex, uint8_t alternateSetting) const |
{ |
ASSERT(m_configurationIndex != -1); |
- const auto& alternates = info().configurations[m_configurationIndex].interfaces[interfaceIndex].alternates; |
+ const auto& alternates = info().configurations[m_configurationIndex]->interfaces[interfaceIndex]->alternates; |
for (size_t i = 0; i < alternates.size(); ++i) { |
- if (alternates[i].alternateSetting == alternateSetting) |
+ if (alternates[i]->alternate_setting == alternateSetting) |
return i; |
} |
return -1; |
@@ -623,7 +892,9 @@ int USBDevice::findAlternateIndex(size_t interfaceIndex, uint8_t alternateSettin |
bool USBDevice::ensureNoDeviceOrInterfaceChangeInProgress(ScriptPromiseResolver* resolver) const |
{ |
- if (m_deviceStateChangeInProgress) |
+ if (!m_device) |
+ resolver->reject(DOMException::create(NotFoundError, kDeviceUnavailable)); |
+ else if (m_deviceStateChangeInProgress) |
resolver->reject(DOMException::create(InvalidStateError, kDeviceStateChangeInProgress)); |
else if (anyInterfaceChangeInProgress()) |
resolver->reject(DOMException::create(InvalidStateError, kInterfaceStateChangeInProgress)); |
@@ -634,7 +905,9 @@ bool USBDevice::ensureNoDeviceOrInterfaceChangeInProgress(ScriptPromiseResolver* |
bool USBDevice::ensureDeviceConfigured(ScriptPromiseResolver* resolver) const |
{ |
- if (m_deviceStateChangeInProgress) |
+ if (!m_device) |
+ resolver->reject(DOMException::create(NotFoundError, kDeviceUnavailable)); |
+ else if (m_deviceStateChangeInProgress) |
resolver->reject(DOMException::create(InvalidStateError, kDeviceStateChangeInProgress)); |
else if (!m_opened) |
resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); |
@@ -686,64 +959,63 @@ bool USBDevice::anyInterfaceChangeInProgress() const |
return false; |
} |
-bool USBDevice::convertControlTransferParameters( |
- WebUSBDevice::TransferDirection direction, |
+usb::ControlTransferParamsPtr USBDevice::convertControlTransferParameters( |
const USBControlTransferParameters& parameters, |
- WebUSBDevice::ControlTransferParameters* webParameters, |
ScriptPromiseResolver* resolver) const |
{ |
- webParameters->direction = direction; |
+ auto mojoParameters = usb::ControlTransferParams::New(); |
if (parameters.requestType() == "standard") { |
- webParameters->type = WebUSBDevice::RequestType::Standard; |
+ mojoParameters->type = usb::ControlTransferType::STANDARD; |
} else if (parameters.requestType() == "class") { |
- webParameters->type = WebUSBDevice::RequestType::Class; |
+ mojoParameters->type = usb::ControlTransferType::CLASS; |
} else if (parameters.requestType() == "vendor") { |
- webParameters->type = WebUSBDevice::RequestType::Vendor; |
+ mojoParameters->type = usb::ControlTransferType::VENDOR; |
} else { |
resolver->reject(DOMException::create(TypeMismatchError, "The control transfer requestType parameter is invalid.")); |
- return false; |
+ return nullptr; |
} |
if (parameters.recipient() == "device") { |
- webParameters->recipient = WebUSBDevice::RequestRecipient::Device; |
+ mojoParameters->recipient = usb::ControlTransferRecipient::DEVICE; |
} else if (parameters.recipient() == "interface") { |
size_t interfaceNumber = parameters.index() & 0xff; |
if (!ensureInterfaceClaimed(interfaceNumber, resolver)) |
- return false; |
- webParameters->recipient = WebUSBDevice::RequestRecipient::Interface; |
+ return nullptr; |
+ mojoParameters->recipient = usb::ControlTransferRecipient::INTERFACE; |
} else if (parameters.recipient() == "endpoint") { |
bool inTransfer = parameters.index() & 0x80; |
size_t endpointNumber = parameters.index() & 0x0f; |
if (!ensureEndpointAvailable(inTransfer, endpointNumber, resolver)) |
- return false; |
- webParameters->recipient = WebUSBDevice::RequestRecipient::Endpoint; |
+ return nullptr; |
+ mojoParameters->recipient = usb::ControlTransferRecipient::ENDPOINT; |
} else if (parameters.recipient() == "other") { |
- webParameters->recipient = WebUSBDevice::RequestRecipient::Other; |
+ mojoParameters->recipient = usb::ControlTransferRecipient::OTHER; |
} else { |
resolver->reject(DOMException::create(TypeMismatchError, "The control transfer recipient parameter is invalid.")); |
- return false; |
+ return nullptr; |
} |
- webParameters->request = parameters.request(); |
- webParameters->value = parameters.value(); |
- webParameters->index = parameters.index(); |
- return true; |
+ mojoParameters->request = parameters.request(); |
+ mojoParameters->value = parameters.value(); |
+ mojoParameters->index = parameters.index(); |
+ return mojoParameters; |
} |
void USBDevice::setEndpointsForInterface(size_t interfaceIndex, bool set) |
{ |
- const auto& configuration = info().configurations[m_configurationIndex]; |
- const auto& interface = configuration.interfaces[interfaceIndex]; |
- const auto& alternate = interface.alternates[m_selectedAlternates[interfaceIndex]]; |
- for (const auto& endpoint : alternate.endpoints) { |
- if (endpoint.endpointNumber == 0 || endpoint.endpointNumber >= 16) |
+ const auto& configuration = *info().configurations[m_configurationIndex]; |
+ const auto& interface = *configuration.interfaces[interfaceIndex]; |
+ const auto& alternate = *interface.alternates[m_selectedAlternates[interfaceIndex]]; |
+ for (const auto& endpoint : alternate.endpoints.storage()) { |
+ uint8_t endpointNumber = endpoint->endpoint_number; |
+ if (endpointNumber == 0 || endpointNumber >= 16) |
continue; // Ignore endpoints with invalid indices. |
- auto& bitVector = endpoint.direction == WebUSBDevice::TransferDirection::In ? m_inEndpoints : m_outEndpoints; |
+ auto& bitVector = endpoint->direction == usb::TransferDirection::INBOUND ? m_inEndpoints : m_outEndpoints; |
if (set) |
- bitVector.set(endpoint.endpointNumber - 1); |
+ bitVector.set(endpointNumber - 1); |
else |
- bitVector.clear(endpoint.endpointNumber - 1); |
+ bitVector.clear(endpointNumber - 1); |
} |
} |