OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "modules/webusb/USBDevice.h" | 5 #include "modules/webusb/USBDevice.h" |
6 | 6 |
7 #include "bindings/core/v8/CallbackPromiseAdapter.h" | 7 #include "bindings/core/v8/CallbackPromiseAdapter.h" |
8 #include "bindings/core/v8/ScriptPromise.h" | 8 #include "bindings/core/v8/ScriptPromise.h" |
9 #include "bindings/core/v8/ScriptPromiseResolver.h" | 9 #include "bindings/core/v8/ScriptPromiseResolver.h" |
10 #include "bindings/core/v8/ToV8.h" | 10 #include "bindings/core/v8/ToV8.h" |
11 #include "core/dom/DOMArrayBuffer.h" | 11 #include "core/dom/DOMArrayBuffer.h" |
12 #include "core/dom/DOMArrayBufferView.h" | 12 #include "core/dom/DOMArrayBufferView.h" |
13 #include "core/dom/DOMException.h" | 13 #include "core/dom/DOMException.h" |
14 #include "core/dom/ExceptionCode.h" | 14 #include "core/dom/ExceptionCode.h" |
15 #include "modules/webusb/USBConfiguration.h" | 15 #include "modules/webusb/USBConfiguration.h" |
16 #include "modules/webusb/USBControlTransferParameters.h" | 16 #include "modules/webusb/USBControlTransferParameters.h" |
17 #include "modules/webusb/USBError.h" | 17 #include "modules/webusb/USBError.h" |
18 #include "modules/webusb/USBInTransferResult.h" | 18 #include "modules/webusb/USBInTransferResult.h" |
| 19 #include "modules/webusb/USBIsochronousInTransferResult.h" |
| 20 #include "modules/webusb/USBIsochronousOutTransferResult.h" |
19 #include "modules/webusb/USBOutTransferResult.h" | 21 #include "modules/webusb/USBOutTransferResult.h" |
20 #include "public/platform/modules/webusb/WebUSBTransferInfo.h" | 22 #include "public/platform/modules/webusb/WebUSBTransferInfo.h" |
| 23 #include "wtf/Assertions.h" |
21 | 24 |
22 namespace blink { | 25 namespace blink { |
23 | 26 |
24 namespace { | 27 namespace { |
25 | 28 |
26 DOMException* convertControlTransferParameters( | 29 DOMException* convertControlTransferParameters( |
27 WebUSBDevice::TransferDirection direction, | 30 WebUSBDevice::TransferDirection direction, |
28 const USBControlTransferParameters& parameters, | 31 const USBControlTransferParameters& parameters, |
29 WebUSBDevice::ControlTransferParameters* webParameters) | 32 WebUSBDevice::ControlTransferParameters* webParameters) |
30 { | 33 { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 Persistent<ScriptPromiseResolver> m_resolver; | 97 Persistent<ScriptPromiseResolver> m_resolver; |
95 }; | 98 }; |
96 | 99 |
97 class InputTransferResult { | 100 class InputTransferResult { |
98 WTF_MAKE_NONCOPYABLE(InputTransferResult); | 101 WTF_MAKE_NONCOPYABLE(InputTransferResult); |
99 public: | 102 public: |
100 using WebType = OwnPtr<WebUSBTransferInfo>; | 103 using WebType = OwnPtr<WebUSBTransferInfo>; |
101 | 104 |
102 static USBInTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBTr
ansferInfo> webTransferInfo) | 105 static USBInTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBTr
ansferInfo> webTransferInfo) |
103 { | 106 { |
104 return USBInTransferResult::create(convertTransferStatus(webTransferInfo
->status), webTransferInfo->data); | 107 ASSERT(webTransferInfo->status.size() == 1); |
| 108 return USBInTransferResult::create(convertTransferStatus(webTransferInfo
->status[0]), webTransferInfo->data); |
105 } | 109 } |
106 | 110 |
107 private: | 111 private: |
108 InputTransferResult() = delete; | 112 InputTransferResult() = delete; |
109 }; | 113 }; |
110 | 114 |
111 class OutputTransferResult { | 115 class OutputTransferResult { |
112 WTF_MAKE_NONCOPYABLE(OutputTransferResult); | 116 WTF_MAKE_NONCOPYABLE(OutputTransferResult); |
113 public: | 117 public: |
114 using WebType = OwnPtr<WebUSBTransferInfo>; | 118 using WebType = OwnPtr<WebUSBTransferInfo>; |
115 | 119 |
116 static USBOutTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBT
ransferInfo> webTransferInfo) | 120 static USBOutTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBT
ransferInfo> webTransferInfo) |
117 { | 121 { |
118 return USBOutTransferResult::create(convertTransferStatus(webTransferInf
o->status), webTransferInfo->bytesWritten); | 122 ASSERT(webTransferInfo->status.size() == 1); |
| 123 ASSERT(webTransferInfo->bytesTransferred.size() == 1); |
| 124 return USBOutTransferResult::create(convertTransferStatus(webTransferInf
o->status[0]), webTransferInfo->bytesTransferred[0]); |
119 } | 125 } |
120 | 126 |
121 private: | 127 private: |
122 OutputTransferResult() = delete; | 128 OutputTransferResult() = delete; |
123 }; | 129 }; |
124 | 130 |
| 131 class IsochronousInputTransferResult { |
| 132 WTF_MAKE_NONCOPYABLE(IsochronousInputTransferResult); |
| 133 |
| 134 public: |
| 135 using WebType = OwnPtr<WebUSBTransferInfo>; |
| 136 |
| 137 static USBIsochronousInTransferResult* take(ScriptPromiseResolver*, PassOwnP
tr<WebUSBTransferInfo> webTransferInfo) |
| 138 { |
| 139 ASSERT(webTransferInfo->status.size() == webTransferInfo->packetLength.s
ize() && webTransferInfo->packetLength.size() == webTransferInfo->bytesTransferr
ed.size()); |
| 140 RefPtr<DOMArrayBuffer> buffer = DOMArrayBuffer::create(webTransferInfo->
data.data(), webTransferInfo->data.size()); |
| 141 HeapVector<Member<USBIsochronousInTransferPacket>> packets(webTransferIn
fo->status.size()); |
| 142 size_t byteOffset = 0; |
| 143 for (size_t i = 0; i < webTransferInfo->status.size(); ++i) { |
| 144 packets.append(USBIsochronousInTransferPacket::create(convertTransfe
rStatus(webTransferInfo->status[i]), DOMDataView::create(buffer, byteOffset, web
TransferInfo->bytesTransferred[i]))); |
| 145 byteOffset += webTransferInfo->packetLength[i]; |
| 146 } |
| 147 return USBIsochronousInTransferResult::create(buffer, packets); |
| 148 } |
| 149 }; |
| 150 |
| 151 class IsochronousOutputTransferResult { |
| 152 WTF_MAKE_NONCOPYABLE(IsochronousOutputTransferResult); |
| 153 |
| 154 public: |
| 155 using WebType = OwnPtr<WebUSBTransferInfo>; |
| 156 |
| 157 static USBIsochronousOutTransferResult* take(ScriptPromiseResolver*, PassOwn
Ptr<WebUSBTransferInfo> webTransferInfo) |
| 158 { |
| 159 ASSERT(webTransferInfo->status.size() == webTransferInfo->bytesTransferr
ed.size()); |
| 160 HeapVector<Member<USBIsochronousOutTransferPacket>> packets(webTransferI
nfo->status.size()); |
| 161 for (size_t i = 0; i < webTransferInfo->status.size(); ++i) |
| 162 packets.append(USBIsochronousOutTransferPacket::create(convertTransf
erStatus(webTransferInfo->status[i]), webTransferInfo->bytesTransferred[i])); |
| 163 return USBIsochronousOutTransferResult::create(packets); |
| 164 } |
| 165 }; |
| 166 |
125 class BufferSource { | 167 class BufferSource { |
126 WTF_MAKE_NONCOPYABLE(BufferSource); | 168 WTF_MAKE_NONCOPYABLE(BufferSource); |
127 public: | 169 public: |
128 BufferSource(const ArrayBufferOrArrayBufferView& buffer) : m_buffer(buffer) | 170 BufferSource(const ArrayBufferOrArrayBufferView& buffer) : m_buffer(buffer) |
129 { | 171 { |
130 ASSERT(!m_buffer.isNull()); | 172 ASSERT(!m_buffer.isNull()); |
131 } | 173 } |
132 | 174 |
133 uint8_t* data() const | 175 uint8_t* data() const |
134 { | 176 { |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 | 317 |
276 ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN
umber, const ArrayBufferOrArrayBufferView& data) | 318 ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN
umber, const ArrayBufferOrArrayBufferView& data) |
277 { | 319 { |
278 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 320 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
279 ScriptPromise promise = resolver->promise(); | 321 ScriptPromise promise = resolver->promise(); |
280 BufferSource buffer(data); | 322 BufferSource buffer(data); |
281 m_device->transfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buf
fer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, U
SBError>(resolver)); | 323 m_device->transfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buf
fer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, U
SBError>(resolver)); |
282 return promise; | 324 return promise; |
283 } | 325 } |
284 | 326 |
| 327 ScriptPromise USBDevice::isochronousTransferIn(ScriptState* scriptState, uint8_t
endpointNumber, Vector<unsigned> packetLengths) |
| 328 { |
| 329 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 330 ScriptPromise promise = resolver->promise(); |
| 331 m_device->isochronousTransfer(WebUSBDevice::TransferDirection::In, endpointN
umber, nullptr, 0, packetLengths, 0, new CallbackPromiseAdapter<IsochronousInput
TransferResult, USBError>(resolver)); |
| 332 return promise; |
| 333 } |
| 334 |
| 335 ScriptPromise USBDevice::isochronousTransferOut(ScriptState* scriptState, uint8_
t endpointNumber, const ArrayBufferOrArrayBufferView& data, Vector<unsigned> pac
ketLengths) |
| 336 { |
| 337 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 338 ScriptPromise promise = resolver->promise(); |
| 339 BufferSource buffer(data); |
| 340 m_device->isochronousTransfer(WebUSBDevice::TransferDirection::Out, endpoint
Number, buffer.data(), buffer.size(), packetLengths, 0, new CallbackPromiseAdapt
er<IsochronousOutputTransferResult, USBError>(resolver)); |
| 341 return promise; |
| 342 } |
| 343 |
285 ScriptPromise USBDevice::reset(ScriptState* scriptState) | 344 ScriptPromise USBDevice::reset(ScriptState* scriptState) |
286 { | 345 { |
287 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; | 346 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
288 ScriptPromise promise = resolver->promise(); | 347 ScriptPromise promise = resolver->promise(); |
289 m_device->reset(new CallbackPromiseAdapter<void, USBError>(resolver)); | 348 m_device->reset(new CallbackPromiseAdapter<void, USBError>(resolver)); |
290 return promise; | 349 return promise; |
291 } | 350 } |
292 | 351 |
293 void USBDevice::contextDestroyed() | 352 void USBDevice::contextDestroyed() |
294 { | 353 { |
295 m_device->close(new WebUSBDeviceCloseCallbacks()); | 354 m_device->close(new WebUSBDeviceCloseCallbacks()); |
296 } | 355 } |
297 | 356 |
298 DEFINE_TRACE(USBDevice) | 357 DEFINE_TRACE(USBDevice) |
299 { | 358 { |
300 ContextLifecycleObserver::trace(visitor); | 359 ContextLifecycleObserver::trace(visitor); |
301 } | 360 } |
302 | 361 |
303 } // namespace blink | 362 } // namespace blink |
OLD | NEW |