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(AbortError, "The control transfer requestTyp e parameter is invalid."); | |
Reilly Grant (use Gerrit)
2015/08/24 21:47:17
As I understand it these should be TypeErrors.
Ken Rockot(use gerrit already)
2015/08/24 22:52:37
TypeMismatchError?
| |
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(AbortError, "The control transfer recipient 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 uint8_t* data() const | |
109 { | |
110 if (m_buffer.isArrayBuffer()) | |
Reilly Grant (use Gerrit)
2015/08/24 21:47:17
Handle the case of m_buffer.isNull()?
Ken Rockot(use gerrit already)
2015/08/24 22:52:37
Added an ASSERT to the constructor. It should neve
| |
111 return static_cast<uint8_t*>(m_buffer.getAsArrayBuffer()->data()); | |
112 return static_cast<uint8_t*>(m_buffer.getAsArrayBufferView()->baseAddres s()); | |
113 } | |
114 | |
115 unsigned size() const | |
116 { | |
117 if (m_buffer.isArrayBuffer()) | |
118 return m_buffer.getAsArrayBuffer()->byteLength(); | |
119 return m_buffer.getAsArrayBufferView()->byteLength(); | |
120 } | |
121 | |
122 private: | |
123 const ArrayBufferOrArrayBufferView& m_buffer; | |
124 }; | |
125 | |
126 } // namespace | |
127 | |
12 HeapVector<Member<USBConfiguration>> USBDevice::configurations() const | 128 HeapVector<Member<USBConfiguration>> USBDevice::configurations() const |
13 { | 129 { |
14 HeapVector<Member<USBConfiguration>> configurations; | 130 HeapVector<Member<USBConfiguration>> configurations; |
15 for (size_t i = 0; i < info().configurations.size(); ++i) | 131 for (size_t i = 0; i < info().configurations.size(); ++i) |
16 configurations.append(USBConfiguration::create(this, i)); | 132 configurations.append(USBConfiguration::create(this, i)); |
17 return configurations; | 133 return configurations; |
18 } | 134 } |
19 | 135 |
136 ScriptPromise USBDevice::open(ScriptState* scriptState) | |
137 { | |
138 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
139 ScriptPromise promise = resolver->promise(); | |
140 m_device->open(new CallbackPromiseAdapter<void, USBError>(resolver)); | |
141 return promise; | |
142 } | |
143 | |
144 ScriptPromise USBDevice::close(ScriptState* scriptState) | |
145 { | |
146 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
147 ScriptPromise promise = resolver->promise(); | |
148 m_device->close(new CallbackPromiseAdapter<void, USBError>(resolver)); | |
149 return promise; | |
150 } | |
151 | |
152 ScriptPromise USBDevice::setConfiguration(ScriptState* scriptState, uint8_t conf igurationValue) | |
153 { | |
154 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
155 ScriptPromise promise = resolver->promise(); | |
156 m_device->setConfiguration(configurationValue, new CallbackPromiseAdapter<vo id, USBError>(resolver)); | |
157 return promise; | |
158 } | |
159 | |
160 ScriptPromise USBDevice::claimInterface(ScriptState* scriptState, uint8_t interf aceNumber) | |
161 { | |
162 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
163 ScriptPromise promise = resolver->promise(); | |
164 m_device->claimInterface(interfaceNumber, new CallbackPromiseAdapter<void, U SBError>(resolver)); | |
165 return promise; | |
166 } | |
167 | |
168 ScriptPromise USBDevice::releaseInterface(ScriptState* scriptState, uint8_t inte rfaceNumber) | |
169 { | |
170 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
171 ScriptPromise promise = resolver->promise(); | |
172 m_device->releaseInterface(interfaceNumber, new CallbackPromiseAdapter<void, USBError>(resolver)); | |
173 return promise; | |
174 } | |
175 | |
176 ScriptPromise USBDevice::setInterface(ScriptState* scriptState, uint8_t interfac eNumber, uint8_t alternateSetting) | |
177 { | |
178 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
179 ScriptPromise promise = resolver->promise(); | |
180 m_device->setInterface(interfaceNumber, alternateSetting, new CallbackPromis eAdapter<void, USBError>(resolver)); | |
181 return promise; | |
182 } | |
183 | |
184 ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo ntrolTransferParameters& setup, unsigned length) | |
185 { | |
186 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
187 ScriptPromise promise = resolver->promise(); | |
188 WebUSBDevice::ControlTransferParameters parameters; | |
189 DOMException* error = convertControlTransferParameters(WebUSBDevice::Transfe rDirection::In, setup, ¶meters); | |
190 if (error) | |
191 resolver->reject(error); | |
192 else | |
193 m_device->controlTransfer(parameters, nullptr, length, 0, new CallbackPr omiseAdapter<InputTransferResult, USBError>(resolver)); | |
194 return promise; | |
195 } | |
196 | |
197 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ontrolTransferParameters& setup) | |
198 { | |
199 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
200 ScriptPromise promise = resolver->promise(); | |
201 WebUSBDevice::ControlTransferParameters parameters; | |
202 DOMException* error = convertControlTransferParameters(WebUSBDevice::Transfe rDirection::Out, setup, ¶meters); | |
203 if (error) | |
204 resolver->reject(error); | |
205 else | |
206 m_device->controlTransfer(parameters, nullptr, 0, 0, new CallbackPromise Adapter<OutputTransferResult, USBError>(resolver)); | |
207 return promise; | |
208 } | |
209 | |
210 ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ontrolTransferParameters& setup, const ArrayBufferOrArrayBufferView& data) | |
211 { | |
212 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
213 ScriptPromise promise = resolver->promise(); | |
214 WebUSBDevice::ControlTransferParameters parameters; | |
215 DOMException* error = convertControlTransferParameters(WebUSBDevice::Transfe rDirection::Out, setup, ¶meters); | |
216 if (error) { | |
217 resolver->reject(error); | |
218 } else { | |
219 BufferSource buffer(data); | |
220 m_device->controlTransfer(parameters, buffer.data(), buffer.size(), 0, n ew CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); | |
221 } | |
222 return promise; | |
223 } | |
224 | |
225 ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, uint8_t endpointNum ber) | |
226 { | |
227 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
228 ScriptPromise promise = resolver->promise(); | |
229 m_device->clearHalt(endpointNumber, new CallbackPromiseAdapter<void, USBErro r>(resolver)); | |
230 return promise; | |
231 } | |
232 | |
233 ScriptPromise USBDevice::transferIn(ScriptState* scriptState, uint8_t endpointNu mber, unsigned length) | |
234 { | |
235 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
236 ScriptPromise promise = resolver->promise(); | |
237 m_device->transfer(WebUSBDevice::TransferDirection::In, endpointNumber, null ptr, length, 0, new CallbackPromiseAdapter<InputTransferResult, USBError>(resolv er)); | |
238 return promise; | |
239 } | |
240 | |
241 ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN umber, const ArrayBufferOrArrayBufferView& data) | |
242 { | |
243 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
244 ScriptPromise promise = resolver->promise(); | |
245 BufferSource buffer(data); | |
246 m_device->transfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buf fer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, U SBError>(resolver)); | |
247 return promise; | |
248 } | |
249 | |
250 ScriptPromise USBDevice::reset(ScriptState* scriptState) | |
251 { | |
252 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | |
253 ScriptPromise promise = resolver->promise(); | |
254 m_device->reset(new CallbackPromiseAdapter<void, USBError>(resolver)); | |
255 return promise; | |
256 } | |
257 | |
20 } // namespace blink | 258 } // namespace blink |
OLD | NEW |