Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(770)

Side by Side Diff: Source/modules/webusb/USBDevice.cpp

Issue 1315683002: WebUSB bindings part 6 (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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, &parameters);
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, &parameters);
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, &parameters);
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698