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 "config.h" | 5 #include "config.h" |
6 #include "modules/webusb/USBDevice.h" | 6 #include "modules/webusb/USBDevice.h" |
7 | 7 |
| 8 #include "bindings/core/v8/CallbackPromiseAdapter.h" |
| 9 #include "bindings/core/v8/ScriptPromise.h" |
| 10 #include "bindings/core/v8/ScriptPromiseResolver.h" |
| 11 #include "bindings/core/v8/ToV8.h" |
| 12 #include "core/dom/DOMArrayBuffer.h" |
| 13 #include "core/dom/DOMArrayBufferView.h" |
| 14 #include "core/dom/DOMException.h" |
| 15 #include "core/dom/ExceptionCode.h" |
8 #include "modules/webusb/USBConfiguration.h" | 16 #include "modules/webusb/USBConfiguration.h" |
| 17 #include "modules/webusb/USBControlTransferParameters.h" |
| 18 #include "modules/webusb/USBError.h" |
| 19 #include "modules/webusb/USBInTransferResult.h" |
| 20 #include "modules/webusb/USBOutTransferResult.h" |
| 21 #include "public/platform/modules/webusb/WebUSBTransferInfo.h" |
9 | 22 |
10 namespace blink { | 23 namespace blink { |
11 | 24 |
| 25 namespace { |
| 26 |
| 27 DOMException* convertControlTransferParameters( |
| 28 WebUSBDevice::TransferDirection direction, |
| 29 const USBControlTransferParameters& parameters, |
| 30 WebUSBDevice::ControlTransferParameters* webParameters) |
| 31 { |
| 32 webParameters->direction = direction; |
| 33 |
| 34 if (parameters.requestType() == "standard") |
| 35 webParameters->type = WebUSBDevice::RequestType::Standard; |
| 36 else if (parameters.requestType() == "class") |
| 37 webParameters->type = WebUSBDevice::RequestType::Class; |
| 38 else if (parameters.requestType() == "vendor") |
| 39 webParameters->type = WebUSBDevice::RequestType::Vendor; |
| 40 else |
| 41 return DOMException::create(TypeMismatchError, "The control transfer req
uestType parameter is invalid."); |
| 42 |
| 43 if (parameters.recipient() == "device") |
| 44 webParameters->recipient = WebUSBDevice::RequestRecipient::Device; |
| 45 else if (parameters.recipient() == "interface") |
| 46 webParameters->recipient = WebUSBDevice::RequestRecipient::Interface; |
| 47 else if (parameters.recipient() == "endpoint") |
| 48 webParameters->recipient = WebUSBDevice::RequestRecipient::Endpoint; |
| 49 else if (parameters.recipient() == "other") |
| 50 webParameters->recipient = WebUSBDevice::RequestRecipient::Other; |
| 51 else |
| 52 return DOMException::create(TypeMismatchError, "The control transfer rec
ipient parameter is invalid."); |
| 53 |
| 54 webParameters->request = parameters.request(); |
| 55 webParameters->value = parameters.value(); |
| 56 webParameters->index = parameters.index(); |
| 57 return nullptr; |
| 58 } |
| 59 |
| 60 String convertTransferStatus(const WebUSBTransferInfo::Status& status) |
| 61 { |
| 62 switch (status) { |
| 63 case WebUSBTransferInfo::Status::Ok: |
| 64 return "ok"; |
| 65 case WebUSBTransferInfo::Status::Stall: |
| 66 return "stall"; |
| 67 case WebUSBTransferInfo::Status::Babble: |
| 68 return "babble"; |
| 69 default: |
| 70 ASSERT_NOT_REACHED(); |
| 71 return ""; |
| 72 } |
| 73 } |
| 74 |
| 75 class InputTransferResult { |
| 76 WTF_MAKE_NONCOPYABLE(InputTransferResult); |
| 77 public: |
| 78 using WebType = OwnPtr<WebUSBTransferInfo>; |
| 79 |
| 80 static USBInTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBTr
ansferInfo> webTransferInfo) |
| 81 { |
| 82 return USBInTransferResult::create(convertTransferStatus(webTransferInfo
->status), webTransferInfo->data); |
| 83 } |
| 84 |
| 85 private: |
| 86 InputTransferResult() = delete; |
| 87 }; |
| 88 |
| 89 class OutputTransferResult { |
| 90 WTF_MAKE_NONCOPYABLE(OutputTransferResult); |
| 91 public: |
| 92 using WebType = OwnPtr<WebUSBTransferInfo>; |
| 93 |
| 94 static USBOutTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBT
ransferInfo> webTransferInfo) |
| 95 { |
| 96 return USBOutTransferResult::create(convertTransferStatus(webTransferInf
o->status), webTransferInfo->bytesWritten); |
| 97 } |
| 98 |
| 99 private: |
| 100 OutputTransferResult() = delete; |
| 101 }; |
| 102 |
| 103 class BufferSource { |
| 104 WTF_MAKE_NONCOPYABLE(BufferSource); |
| 105 public: |
| 106 BufferSource(const ArrayBufferOrArrayBufferView& buffer) : m_buffer(buffer) |
| 107 { |
| 108 ASSERT(!m_buffer.isNull()); |
| 109 } |
| 110 |
| 111 uint8_t* data() const |
| 112 { |
| 113 if (m_buffer.isArrayBuffer()) |
| 114 return static_cast<uint8_t*>(m_buffer.getAsArrayBuffer()->data()); |
| 115 return static_cast<uint8_t*>(m_buffer.getAsArrayBufferView()->baseAddres
s()); |
| 116 } |
| 117 |
| 118 unsigned size() const |
| 119 { |
| 120 if (m_buffer.isArrayBuffer()) |
| 121 return m_buffer.getAsArrayBuffer()->byteLength(); |
| 122 return m_buffer.getAsArrayBufferView()->byteLength(); |
| 123 } |
| 124 |
| 125 private: |
| 126 const ArrayBufferOrArrayBufferView& m_buffer; |
| 127 }; |
| 128 |
| 129 } // namespace |
| 130 |
12 HeapVector<Member<USBConfiguration>> USBDevice::configurations() const | 131 HeapVector<Member<USBConfiguration>> USBDevice::configurations() const |
13 { | 132 { |
14 HeapVector<Member<USBConfiguration>> configurations; | 133 HeapVector<Member<USBConfiguration>> configurations; |
15 for (size_t i = 0; i < info().configurations.size(); ++i) | 134 for (size_t i = 0; i < info().configurations.size(); ++i) |
16 configurations.append(USBConfiguration::create(this, i)); | 135 configurations.append(USBConfiguration::create(this, i)); |
17 return configurations; | 136 return configurations; |
18 } | 137 } |
19 | 138 |
| 139 ScriptPromise USBDevice::open(ScriptState* scriptState) |
| 140 { |
| 141 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 142 ScriptPromise promise = resolver->promise(); |
| 143 m_device->open(new CallbackPromiseAdapter<void, USBError>(resolver)); |
| 144 return promise; |
| 145 } |
| 146 |
| 147 ScriptPromise USBDevice::close(ScriptState* scriptState) |
| 148 { |
| 149 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 150 ScriptPromise promise = resolver->promise(); |
| 151 m_device->close(new CallbackPromiseAdapter<void, USBError>(resolver)); |
| 152 return promise; |
| 153 } |
| 154 |
| 155 ScriptPromise USBDevice::setConfiguration(ScriptState* scriptState, uint8_t conf
igurationValue) |
| 156 { |
| 157 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 158 ScriptPromise promise = resolver->promise(); |
| 159 m_device->setConfiguration(configurationValue, new CallbackPromiseAdapter<vo
id, USBError>(resolver)); |
| 160 return promise; |
| 161 } |
| 162 |
| 163 ScriptPromise USBDevice::claimInterface(ScriptState* scriptState, uint8_t interf
aceNumber) |
| 164 { |
| 165 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 166 ScriptPromise promise = resolver->promise(); |
| 167 m_device->claimInterface(interfaceNumber, new CallbackPromiseAdapter<void, U
SBError>(resolver)); |
| 168 return promise; |
| 169 } |
| 170 |
| 171 ScriptPromise USBDevice::releaseInterface(ScriptState* scriptState, uint8_t inte
rfaceNumber) |
| 172 { |
| 173 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 174 ScriptPromise promise = resolver->promise(); |
| 175 m_device->releaseInterface(interfaceNumber, new CallbackPromiseAdapter<void,
USBError>(resolver)); |
| 176 return promise; |
| 177 } |
| 178 |
| 179 ScriptPromise USBDevice::setInterface(ScriptState* scriptState, uint8_t interfac
eNumber, uint8_t alternateSetting) |
| 180 { |
| 181 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 182 ScriptPromise promise = resolver->promise(); |
| 183 m_device->setInterface(interfaceNumber, alternateSetting, new CallbackPromis
eAdapter<void, USBError>(resolver)); |
| 184 return promise; |
| 185 } |
| 186 |
| 187 ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo
ntrolTransferParameters& setup, unsigned length) |
| 188 { |
| 189 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 190 ScriptPromise promise = resolver->promise(); |
| 191 WebUSBDevice::ControlTransferParameters parameters; |
| 192 DOMException* error = convertControlTransferParameters(WebUSBDevice::Transfe
rDirection::In, setup, ¶meters); |
| 193 if (error) |
| 194 resolver->reject(error); |
| 195 else |
| 196 m_device->controlTransfer(parameters, nullptr, length, 0, new CallbackPr
omiseAdapter<InputTransferResult, USBError>(resolver)); |
| 197 return promise; |
| 198 } |
| 199 |
| 200 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup) |
| 201 { |
| 202 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 203 ScriptPromise promise = resolver->promise(); |
| 204 WebUSBDevice::ControlTransferParameters parameters; |
| 205 DOMException* error = convertControlTransferParameters(WebUSBDevice::Transfe
rDirection::Out, setup, ¶meters); |
| 206 if (error) |
| 207 resolver->reject(error); |
| 208 else |
| 209 m_device->controlTransfer(parameters, nullptr, 0, 0, new CallbackPromise
Adapter<OutputTransferResult, USBError>(resolver)); |
| 210 return promise; |
| 211 } |
| 212 |
| 213 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC
ontrolTransferParameters& setup, const ArrayBufferOrArrayBufferView& data) |
| 214 { |
| 215 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 216 ScriptPromise promise = resolver->promise(); |
| 217 WebUSBDevice::ControlTransferParameters parameters; |
| 218 DOMException* error = convertControlTransferParameters(WebUSBDevice::Transfe
rDirection::Out, setup, ¶meters); |
| 219 if (error) { |
| 220 resolver->reject(error); |
| 221 } else { |
| 222 BufferSource buffer(data); |
| 223 m_device->controlTransfer(parameters, buffer.data(), buffer.size(), 0, n
ew CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); |
| 224 } |
| 225 return promise; |
| 226 } |
| 227 |
| 228 ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, uint8_t endpointNum
ber) |
| 229 { |
| 230 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 231 ScriptPromise promise = resolver->promise(); |
| 232 m_device->clearHalt(endpointNumber, new CallbackPromiseAdapter<void, USBErro
r>(resolver)); |
| 233 return promise; |
| 234 } |
| 235 |
| 236 ScriptPromise USBDevice::transferIn(ScriptState* scriptState, uint8_t endpointNu
mber, unsigned length) |
| 237 { |
| 238 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 239 ScriptPromise promise = resolver->promise(); |
| 240 m_device->transfer(WebUSBDevice::TransferDirection::In, endpointNumber, null
ptr, length, 0, new CallbackPromiseAdapter<InputTransferResult, USBError>(resolv
er)); |
| 241 return promise; |
| 242 } |
| 243 |
| 244 ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN
umber, const ArrayBufferOrArrayBufferView& data) |
| 245 { |
| 246 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 247 ScriptPromise promise = resolver->promise(); |
| 248 BufferSource buffer(data); |
| 249 m_device->transfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buf
fer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, U
SBError>(resolver)); |
| 250 return promise; |
| 251 } |
| 252 |
| 253 ScriptPromise USBDevice::reset(ScriptState* scriptState) |
| 254 { |
| 255 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState)
; |
| 256 ScriptPromise promise = resolver->promise(); |
| 257 m_device->reset(new CallbackPromiseAdapter<void, USBError>(resolver)); |
| 258 return promise; |
| 259 } |
| 260 |
20 } // namespace blink | 261 } // namespace blink |
OLD | NEW |