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

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: remote USBTransferStatus.idl 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
« no previous file with comments | « Source/modules/webusb/USBDevice.h ('k') | Source/modules/webusb/USBDevice.idl » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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(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, &parameters);
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, &parameters);
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, &parameters);
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
OLDNEW
« no previous file with comments | « Source/modules/webusb/USBDevice.h ('k') | Source/modules/webusb/USBDevice.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698