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

Side by Side Diff: chrome/browser/extensions/api/usb/usb_api.cc

Issue 22914023: Introducing chrome.usb.getDevices/openDevice API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@usb-interface
Patch Set: Fixes Created 7 years, 3 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/browser/extensions/api/usb/usb_api.h" 5 #include "chrome/browser/extensions/api/usb/usb_api.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "base/message_loop/message_loop_proxy.h"
11 #include "chrome/browser/extensions/api/usb/usb_device_resource.h" 12 #include "chrome/browser/extensions/api/usb/usb_device_resource.h"
12 #include "chrome/browser/extensions/extension_system.h" 13 #include "chrome/browser/extensions/extension_system.h"
13 #include "chrome/browser/profiles/profile.h" 14 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/browser/usb/usb_device_handle.h" 15 #include "chrome/browser/usb/usb_device_handle.h"
15 #include "chrome/browser/usb/usb_service.h" 16 #include "chrome/browser/usb/usb_service.h"
16 #include "chrome/common/extensions/api/usb.h" 17 #include "chrome/common/extensions/api/usb.h"
17 #include "chrome/common/extensions/permissions/permissions_data.h" 18 #include "chrome/common/extensions/permissions/permissions_data.h"
18 #include "chrome/common/extensions/permissions/usb_device_permission.h" 19 #include "chrome/common/extensions/permissions/usb_device_permission.h"
19 20
20 namespace BulkTransfer = extensions::api::usb::BulkTransfer; 21 namespace usb = extensions::api::usb;
21 namespace ClaimInterface = extensions::api::usb::ClaimInterface; 22 namespace BulkTransfer = usb::BulkTransfer;
22 namespace ListInterfaces = extensions::api::usb::ListInterfaces; 23 namespace ClaimInterface = usb::ClaimInterface;
23 namespace CloseDevice = extensions::api::usb::CloseDevice; 24 namespace ListInterfaces = usb::ListInterfaces;
asargent_no_longer_on_chrome 2013/08/23 23:57:01 nit: 'ListInterfaces' still isn't sorted in the ri
Bei Zhang 2013/08/26 07:59:59 To be supportive to Google products, I used Google
24 namespace ControlTransfer = extensions::api::usb::ControlTransfer; 25 namespace CloseDevice = usb::CloseDevice;
25 namespace FindDevices = extensions::api::usb::FindDevices; 26 namespace ControlTransfer = usb::ControlTransfer;
26 namespace InterruptTransfer = extensions::api::usb::InterruptTransfer; 27 namespace FindDevices = usb::FindDevices;
27 namespace IsochronousTransfer = extensions::api::usb::IsochronousTransfer; 28 namespace GetDevices = usb::GetDevices;
28 namespace ReleaseInterface = extensions::api::usb::ReleaseInterface; 29 namespace InterruptTransfer = usb::InterruptTransfer;
29 namespace ResetDevice = extensions::api::usb::ResetDevice; 30 namespace IsochronousTransfer = usb::IsochronousTransfer;
31 namespace OpenDevice = usb::OpenDevice;
32 namespace ReleaseInterface = usb::ReleaseInterface;
33 namespace ResetDevice = usb::ResetDevice;
30 namespace SetInterfaceAlternateSetting = 34 namespace SetInterfaceAlternateSetting =
31 extensions::api::usb::SetInterfaceAlternateSetting; 35 usb::SetInterfaceAlternateSetting;
32 namespace usb = extensions::api::usb; 36
33 37
34 using content::BrowserThread; 38 using content::BrowserThread;
35 using std::string; 39 using std::string;
36 using std::vector; 40 using std::vector;
37 using usb::ControlTransferInfo; 41 using usb::ControlTransferInfo;
38 using usb::Device; 42 using usb::Device;
43 using usb::DeviceHandle;
39 using usb::Direction; 44 using usb::Direction;
40 using usb::EndpointDescriptor; 45 using usb::EndpointDescriptor;
41 using usb::GenericTransferInfo; 46 using usb::GenericTransferInfo;
42 using usb::InterfaceDescriptor; 47 using usb::InterfaceDescriptor;
43 using usb::IsochronousTransferInfo; 48 using usb::IsochronousTransferInfo;
44 using usb::Recipient; 49 using usb::Recipient;
45 using usb::RequestType; 50 using usb::RequestType;
46 using usb::SynchronizationType; 51 using usb::SynchronizationType;
47 using usb::TransferType; 52 using usb::TransferType;
48 using usb::UsageType; 53 using usb::UsageType;
49 54
55 typedef scoped_ptr<std::vector<scoped_refptr<UsbDevice> > > ScopedDeviceVector;
56
50 namespace { 57 namespace {
51 58
52 static const char kDataKey[] = "data"; 59 const char kDataKey[] = "data";
53 static const char kResultCodeKey[] = "resultCode"; 60 const char kResultCodeKey[] = "resultCode";
54 61
55 static const char kErrorCancelled[] = "Transfer was cancelled."; 62 const char kErrorOpen[] = "Failed to open device.";
56 static const char kErrorDisconnect[] = "Device disconnected."; 63 const char kErrorCancelled[] = "Transfer was cancelled.";
57 static const char kErrorGeneric[] = "Transfer failed."; 64 const char kErrorDisconnect[] = "Device disconnected.";
58 static const char kErrorOverflow[] = "Inbound transfer overflow."; 65 const char kErrorGeneric[] = "Transfer failed.";
59 static const char kErrorStalled[] = "Transfer stalled."; 66 const char kErrorOverflow[] = "Inbound transfer overflow.";
60 static const char kErrorTimeout[] = "Transfer timed out."; 67 const char kErrorStalled[] = "Transfer stalled.";
61 static const char kErrorTransferLength[] = "Transfer length is insufficient."; 68 const char kErrorTimeout[] = "Transfer timed out.";
69 const char kErrorTransferLength[] = "Transfer length is insufficient.";
62 70
63 static const char kErrorCannotListInterfaces[] = "Error listing interfaces."; 71 const char kErrorCannotListInterfaces[] = "Error listing interfaces.";
64 static const char kErrorCannotClaimInterface[] = "Error claiming interface."; 72 const char kErrorCannotClaimInterface[] = "Error claiming interface.";
65 static const char kErrorCannotReleaseInterface[] = "Error releasing interface."; 73 const char kErrorCannotReleaseInterface[] = "Error releasing interface.";
66 static const char kErrorCannotSetInterfaceAlternateSetting[] = 74 const char kErrorCannotSetInterfaceAlternateSetting[] =
67 "Error setting alternate interface setting."; 75 "Error setting alternate interface setting.";
68 static const char kErrorConvertDirection[] = "Invalid transfer direction."; 76 const char kErrorConvertDirection[] = "Invalid transfer direction.";
69 static const char kErrorConvertRecipient[] = "Invalid transfer recipient."; 77 const char kErrorConvertRecipient[] = "Invalid transfer recipient.";
70 static const char kErrorConvertRequestType[] = "Invalid request type."; 78 const char kErrorConvertRequestType[] = "Invalid request type.";
71 static const char kErrorConvertSynchronizationType[] = 79 const char kErrorConvertSynchronizationType[] = "Invalid synchronization type";
72 "Invalid synchronization type"; 80 const char kErrorConvertTransferType[] = "Invalid endpoint type.";
73 static const char kErrorConvertTransferType[] = "Invalid endpoint type."; 81 const char kErrorConvertUsageType[] = "Invalid usage type.";
74 static const char kErrorConvertUsageType[] = "Invalid usage type."; 82 const char kErrorMalformedParameters[] = "Error parsing parameters.";
75 static const char kErrorMalformedParameters[] = "Error parsing parameters."; 83 const char kErrorNoDevice[] = "No such device.";
76 static const char kErrorNoDevice[] = "No such device."; 84 const char kErrorPermissionDenied[] =
77 static const char kErrorPermissionDenied[] =
78 "Permission to access device was denied"; 85 "Permission to access device was denied";
79 static const char kErrorInvalidTransferLength[] = "Transfer length must be a " 86 const char kErrorInvalidTransferLength[] =
80 "positive number less than 104,857,600."; 87 "Transfer length must be a positive number less than 104,857,600.";
81 static const char kErrorInvalidNumberOfPackets[] = "Number of packets must be " 88 const char kErrorInvalidNumberOfPackets[] =
82 "a positive number less than 4,194,304."; 89 "Number of packets must be a positive number less than 4,194,304.";
83 static const char kErrorInvalidPacketLength[] = "Packet length must be a " 90 const char kErrorInvalidPacketLength[] = "Packet length must be a "
84 "positive number less than 65,536."; 91 "positive number less than 65,536.";
85 static const char kErrorResetDevice[] = 92 const char kErrorResetDevice[] =
86 "Error resetting the device. The device has been closed."; 93 "Error resetting the device. The device has been closed.";
87 94
88 static const size_t kMaxTransferLength = 100 * 1024 * 1024; 95 const size_t kMaxTransferLength = 100 * 1024 * 1024;
89 static const int kMaxPackets = 4 * 1024 * 1024; 96 const int kMaxPackets = 4 * 1024 * 1024;
90 static const int kMaxPacketLength = 64 * 1024; 97 const int kMaxPacketLength = 64 * 1024;
91 98
92 static UsbDevice* g_device_for_test = NULL; 99 UsbDevice* g_device_for_test = NULL;
93 100
94 static bool ConvertDirectionToApi(const UsbEndpointDirection& input, 101 bool ConvertDirectionToApi(const UsbEndpointDirection& input,
95 Direction* output) { 102 Direction* output) {
96 switch (input) { 103 switch (input) {
97 case USB_DIRECTION_INBOUND: 104 case USB_DIRECTION_INBOUND:
98 *output = usb::DIRECTION_IN; 105 *output = usb::DIRECTION_IN;
99 return true; 106 return true;
100 case USB_DIRECTION_OUTBOUND: 107 case USB_DIRECTION_OUTBOUND:
101 *output = usb::DIRECTION_OUT; 108 *output = usb::DIRECTION_OUT;
102 return true; 109 return true;
103 default: 110 default:
104 NOTREACHED(); 111 NOTREACHED();
105 return false; 112 return false;
106 } 113 }
107 } 114 }
108 115
109 static bool ConvertSynchronizationTypeToApi( 116 bool ConvertSynchronizationTypeToApi(const UsbSynchronizationType& input,
110 const UsbSynchronizationType& input, 117 usb::SynchronizationType* output) {
111 extensions::api::usb::SynchronizationType* output) {
112 switch (input) { 118 switch (input) {
113 case USB_SYNCHRONIZATION_NONE: 119 case USB_SYNCHRONIZATION_NONE:
114 *output = usb::SYNCHRONIZATION_TYPE_NONE; 120 *output = usb::SYNCHRONIZATION_TYPE_NONE;
115 return true; 121 return true;
116 case USB_SYNCHRONIZATION_ASYNCHRONOUS: 122 case USB_SYNCHRONIZATION_ASYNCHRONOUS:
117 *output = usb::SYNCHRONIZATION_TYPE_ASYNCHRONOUS; 123 *output = usb::SYNCHRONIZATION_TYPE_ASYNCHRONOUS;
118 return true; 124 return true;
119 case USB_SYNCHRONIZATION_ADAPTIVE: 125 case USB_SYNCHRONIZATION_ADAPTIVE:
120 *output = usb::SYNCHRONIZATION_TYPE_ADAPTIVE; 126 *output = usb::SYNCHRONIZATION_TYPE_ADAPTIVE;
121 return true; 127 return true;
122 case USB_SYNCHRONIZATION_SYNCHRONOUS: 128 case USB_SYNCHRONIZATION_SYNCHRONOUS:
123 *output = usb::SYNCHRONIZATION_TYPE_SYNCHRONOUS; 129 *output = usb::SYNCHRONIZATION_TYPE_SYNCHRONOUS;
124 return true; 130 return true;
125 default: 131 default:
126 NOTREACHED(); 132 NOTREACHED();
127 return false; 133 return false;
128 } 134 }
129 } 135 }
130 136
131 static bool ConvertTransferTypeToApi( 137 bool ConvertTransferTypeToApi(
132 const UsbTransferType& input, 138 const UsbTransferType& input,
133 extensions::api::usb::TransferType* output) { 139 usb::TransferType* output) {
134 switch (input) { 140 switch (input) {
135 case USB_TRANSFER_CONTROL: 141 case USB_TRANSFER_CONTROL:
136 *output = usb::TRANSFER_TYPE_CONTROL; 142 *output = usb::TRANSFER_TYPE_CONTROL;
137 return true; 143 return true;
138 case USB_TRANSFER_INTERRUPT: 144 case USB_TRANSFER_INTERRUPT:
139 *output = usb::TRANSFER_TYPE_INTERRUPT; 145 *output = usb::TRANSFER_TYPE_INTERRUPT;
140 return true; 146 return true;
141 case USB_TRANSFER_ISOCHRONOUS: 147 case USB_TRANSFER_ISOCHRONOUS:
142 *output = usb::TRANSFER_TYPE_ISOCHRONOUS; 148 *output = usb::TRANSFER_TYPE_ISOCHRONOUS;
143 return true; 149 return true;
144 case USB_TRANSFER_BULK: 150 case USB_TRANSFER_BULK:
145 *output = usb::TRANSFER_TYPE_BULK; 151 *output = usb::TRANSFER_TYPE_BULK;
146 return true; 152 return true;
147 default: 153 default:
148 NOTREACHED(); 154 NOTREACHED();
149 return false; 155 return false;
150 } 156 }
151 } 157 }
152 158
153 static bool ConvertUsageTypeToApi(const UsbUsageType& input, 159 static bool ConvertUsageTypeToApi(const UsbUsageType& input,
154 extensions::api::usb::UsageType* output) { 160 usb::UsageType* output) {
155 switch (input) { 161 switch (input) {
156 case USB_USAGE_DATA: 162 case USB_USAGE_DATA:
157 *output = usb::USAGE_TYPE_DATA; 163 *output = usb::USAGE_TYPE_DATA;
158 return true; 164 return true;
159 case USB_USAGE_FEEDBACK: 165 case USB_USAGE_FEEDBACK:
160 *output = usb::USAGE_TYPE_FEEDBACK; 166 *output = usb::USAGE_TYPE_FEEDBACK;
161 return true; 167 return true;
162 case USB_USAGE_EXPLICIT_FEEDBACK: 168 case USB_USAGE_EXPLICIT_FEEDBACK:
163 *output = usb::USAGE_TYPE_EXPLICITFEEDBACK; 169 *output = usb::USAGE_TYPE_EXPLICITFEEDBACK;
164 return true; 170 return true;
165 default: 171 default:
166 NOTREACHED(); 172 NOTREACHED();
167 return false; 173 return false;
168 } 174 }
169 } 175 }
170 176
171 static bool ConvertDirection(const Direction& input, 177 bool ConvertDirection(const Direction& input,
172 UsbEndpointDirection* output) { 178 UsbEndpointDirection* output) {
173 switch (input) { 179 switch (input) {
174 case usb::DIRECTION_IN: 180 case usb::DIRECTION_IN:
175 *output = USB_DIRECTION_INBOUND; 181 *output = USB_DIRECTION_INBOUND;
176 return true; 182 return true;
177 case usb::DIRECTION_OUT: 183 case usb::DIRECTION_OUT:
178 *output = USB_DIRECTION_OUTBOUND; 184 *output = USB_DIRECTION_OUTBOUND;
179 return true; 185 return true;
180 default: 186 default:
181 NOTREACHED(); 187 NOTREACHED();
182 return false; 188 return false;
183 } 189 }
184 } 190 }
185 191
186 static bool ConvertRequestType(const RequestType& input, 192 bool ConvertRequestType(const RequestType& input,
187 UsbDeviceHandle::TransferRequestType* output) { 193 UsbDeviceHandle::TransferRequestType* output) {
188 switch (input) { 194 switch (input) {
189 case usb::REQUEST_TYPE_STANDARD: 195 case usb::REQUEST_TYPE_STANDARD:
190 *output = UsbDeviceHandle::STANDARD; 196 *output = UsbDeviceHandle::STANDARD;
191 return true; 197 return true;
192 case usb::REQUEST_TYPE_CLASS: 198 case usb::REQUEST_TYPE_CLASS:
193 *output = UsbDeviceHandle::CLASS; 199 *output = UsbDeviceHandle::CLASS;
194 return true; 200 return true;
195 case usb::REQUEST_TYPE_VENDOR: 201 case usb::REQUEST_TYPE_VENDOR:
196 *output = UsbDeviceHandle::VENDOR; 202 *output = UsbDeviceHandle::VENDOR;
197 return true; 203 return true;
198 case usb::REQUEST_TYPE_RESERVED: 204 case usb::REQUEST_TYPE_RESERVED:
199 *output = UsbDeviceHandle::RESERVED; 205 *output = UsbDeviceHandle::RESERVED;
200 return true; 206 return true;
201 default: 207 default:
202 NOTREACHED(); 208 NOTREACHED();
203 return false; 209 return false;
204 } 210 }
205 } 211 }
206 212
207 static bool ConvertRecipient(const Recipient& input, 213 bool ConvertRecipient(const Recipient& input,
208 UsbDeviceHandle::TransferRecipient* output) { 214 UsbDeviceHandle::TransferRecipient* output) {
209 switch (input) { 215 switch (input) {
210 case usb::RECIPIENT_DEVICE: 216 case usb::RECIPIENT_DEVICE:
211 *output = UsbDeviceHandle::DEVICE; 217 *output = UsbDeviceHandle::DEVICE;
212 return true; 218 return true;
213 case usb::RECIPIENT_INTERFACE: 219 case usb::RECIPIENT_INTERFACE:
214 *output = UsbDeviceHandle::INTERFACE; 220 *output = UsbDeviceHandle::INTERFACE;
215 return true; 221 return true;
216 case usb::RECIPIENT_ENDPOINT: 222 case usb::RECIPIENT_ENDPOINT:
217 *output = UsbDeviceHandle::ENDPOINT; 223 *output = UsbDeviceHandle::ENDPOINT;
218 return true; 224 return true;
219 case usb::RECIPIENT_OTHER: 225 case usb::RECIPIENT_OTHER:
220 *output = UsbDeviceHandle::OTHER; 226 *output = UsbDeviceHandle::OTHER;
221 return true; 227 return true;
222 default: 228 default:
223 NOTREACHED(); 229 NOTREACHED();
224 return false; 230 return false;
225 } 231 }
226 } 232 }
227 233
228 template<class T> 234 template<class T>
229 static bool GetTransferSize(const T& input, size_t* output) { 235 bool GetTransferSize(const T& input, size_t* output) {
230 if (input.direction == usb::DIRECTION_IN) { 236 if (input.direction == usb::DIRECTION_IN) {
231 const int* length = input.length.get(); 237 const int* length = input.length.get();
232 if (length && *length >= 0 && 238 if (length && *length >= 0 &&
233 static_cast<size_t>(*length) < kMaxTransferLength) { 239 static_cast<size_t>(*length) < kMaxTransferLength) {
234 *output = *length; 240 *output = *length;
235 return true; 241 return true;
236 } 242 }
237 } else if (input.direction == usb::DIRECTION_OUT) { 243 } else if (input.direction == usb::DIRECTION_OUT) {
238 if (input.data.get()) { 244 if (input.data.get()) {
239 *output = input.data->size(); 245 *output = input.data->size();
240 return true; 246 return true;
241 } 247 }
242 } 248 }
243 return false; 249 return false;
244 } 250 }
245 251
246 template<class T> 252 template<class T>
247 static scoped_refptr<net::IOBuffer> CreateBufferForTransfer( 253 scoped_refptr<net::IOBuffer> CreateBufferForTransfer(
248 const T& input, UsbEndpointDirection direction, size_t size) { 254 const T& input, UsbEndpointDirection direction, size_t size) {
249 255
250 if (size >= kMaxTransferLength) 256 if (size >= kMaxTransferLength)
251 return NULL; 257 return NULL;
252 258
253 // Allocate a |size|-bytes buffer, or a one-byte buffer if |size| is 0. This 259 // Allocate a |size|-bytes buffer, or a one-byte buffer if |size| is 0. This
254 // is due to an impedance mismatch between IOBuffer and URBs. An IOBuffer 260 // is due to an impedance mismatch between IOBuffer and URBs. An IOBuffer
255 // cannot represent a zero-length buffer, while an URB can. 261 // cannot represent a zero-length buffer, while an URB can.
256 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(std::max( 262 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(std::max(
257 static_cast<size_t>(1), size)); 263 static_cast<size_t>(1), size));
258 264
259 if (direction == USB_DIRECTION_INBOUND) { 265 if (direction == USB_DIRECTION_INBOUND) {
260 return buffer; 266 return buffer;
261 } else if (direction == USB_DIRECTION_OUTBOUND) { 267 } else if (direction == USB_DIRECTION_OUTBOUND) {
262 if (input.data.get() && size <= input.data->size()) { 268 if (input.data.get() && size <= input.data->size()) {
263 memcpy(buffer->data(), input.data->data(), size); 269 memcpy(buffer->data(), input.data->data(), size);
264 return buffer; 270 return buffer;
265 } 271 }
266 } 272 }
267 NOTREACHED(); 273 NOTREACHED();
268 return NULL; 274 return NULL;
269 } 275 }
270 276
271 static const char* ConvertTransferStatusToErrorString( 277 const char* ConvertTransferStatusToErrorString(const UsbTransferStatus status) {
272 const UsbTransferStatus status) {
273 switch (status) { 278 switch (status) {
274 case USB_TRANSFER_COMPLETED: 279 case USB_TRANSFER_COMPLETED:
275 return ""; 280 return "";
276 case USB_TRANSFER_ERROR: 281 case USB_TRANSFER_ERROR:
277 return kErrorGeneric; 282 return kErrorGeneric;
278 case USB_TRANSFER_TIMEOUT: 283 case USB_TRANSFER_TIMEOUT:
279 return kErrorTimeout; 284 return kErrorTimeout;
280 case USB_TRANSFER_CANCELLED: 285 case USB_TRANSFER_CANCELLED:
281 return kErrorCancelled; 286 return kErrorCancelled;
282 case USB_TRANSFER_STALLED: 287 case USB_TRANSFER_STALLED:
283 return kErrorStalled; 288 return kErrorStalled;
284 case USB_TRANSFER_DISCONNECT: 289 case USB_TRANSFER_DISCONNECT:
285 return kErrorDisconnect; 290 return kErrorDisconnect;
286 case USB_TRANSFER_OVERFLOW: 291 case USB_TRANSFER_OVERFLOW:
287 return kErrorOverflow; 292 return kErrorOverflow;
288 case USB_TRANSFER_LENGTH_SHORT: 293 case USB_TRANSFER_LENGTH_SHORT:
289 return kErrorTransferLength; 294 return kErrorTransferLength;
290 default: 295 default:
291 NOTREACHED(); 296 NOTREACHED();
292 return ""; 297 return "";
293 } 298 }
294 } 299 }
295 300
296 static base::DictionaryValue* CreateTransferInfo( 301 base::DictionaryValue* CreateTransferInfo(
297 UsbTransferStatus status, 302 UsbTransferStatus status,
298 scoped_refptr<net::IOBuffer> data, 303 scoped_refptr<net::IOBuffer> data,
299 size_t length) { 304 size_t length) {
300 base::DictionaryValue* result = new base::DictionaryValue(); 305 base::DictionaryValue* result = new base::DictionaryValue();
301 result->SetInteger(kResultCodeKey, status); 306 result->SetInteger(kResultCodeKey, status);
302 result->Set(kDataKey, base::BinaryValue::CreateWithCopiedBuffer(data->data(), 307 result->Set(kDataKey, base::BinaryValue::CreateWithCopiedBuffer(data->data(),
303 length)); 308 length));
304 return result; 309 return result;
305 } 310 }
306 311
307 static base::Value* PopulateDevice(int handle, int vendor_id, int product_id) { 312 base::Value* PopulateDeviceHandle(int handle, int vendor_id, int product_id) {
308 Device device; 313 DeviceHandle result;
309 device.handle = handle; 314 result.handle = handle;
310 device.vendor_id = vendor_id; 315 result.vendor_id.reset(new int(vendor_id));
311 device.product_id = product_id; 316 result.product_id.reset(new int(product_id));
312 return device.ToValue().release(); 317 return result.ToValue().release();
313 } 318 }
314 319
315 static base::Value* PopulateInterfaceDescriptor(int interface_number, 320 base::Value* PopulateDevice(UsbDevice* device) {
316 int alternate_setting, int interface_class, int interface_subclass, 321 Device result;
317 int interface_protocol, 322 result.device = device->unique_id();
318 std::vector<linked_ptr<EndpointDescriptor> >* endpoints) { 323 result.vendor_id.reset(new int(device->vendor_id()));
324 result.product_id.reset(new int(device->product_id()));
325 return result.ToValue().release();
326 }
327
328 base::Value* PopulateInterfaceDescriptor(
329 int interface_number,
330 int alternate_setting,
331 int interface_class,
332 int interface_subclass,
333 int interface_protocol,
334 std::vector<linked_ptr<EndpointDescriptor> >* endpoints) {
319 InterfaceDescriptor descriptor; 335 InterfaceDescriptor descriptor;
320 descriptor.interface_number = interface_number; 336 descriptor.interface_number = interface_number;
321 descriptor.alternate_setting = alternate_setting; 337 descriptor.alternate_setting = alternate_setting;
322 descriptor.interface_class = interface_class; 338 descriptor.interface_class = interface_class;
323 descriptor.interface_subclass = interface_subclass; 339 descriptor.interface_subclass = interface_subclass;
324 descriptor.interface_protocol = interface_protocol; 340 descriptor.interface_protocol = interface_protocol;
325 descriptor.endpoints = *endpoints; 341 descriptor.endpoints = *endpoints;
326 return descriptor.ToValue().release(); 342 return descriptor.ToValue().release();
327 } 343 }
328 344
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 const bool converted = ConvertRecipient(input, output); 412 const bool converted = ConvertRecipient(input, output);
397 if (!converted) 413 if (!converted)
398 SetError(kErrorConvertRecipient); 414 SetError(kErrorConvertRecipient);
399 return converted; 415 return converted;
400 } 416 }
401 417
402 UsbFindDevicesFunction::UsbFindDevicesFunction() {} 418 UsbFindDevicesFunction::UsbFindDevicesFunction() {}
403 419
404 UsbFindDevicesFunction::~UsbFindDevicesFunction() {} 420 UsbFindDevicesFunction::~UsbFindDevicesFunction() {}
405 421
406 void UsbFindDevicesFunction::SetDeviceForTest(UsbDevice* device) {
407 g_device_for_test = device;
408 }
409
410 bool UsbFindDevicesFunction::Prepare() { 422 bool UsbFindDevicesFunction::Prepare() {
411 parameters_ = FindDevices::Params::Create(*args_); 423 parameters_ = FindDevices::Params::Create(*args_);
412 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 424 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
413 return true; 425 return true;
414 } 426 }
415 427
416 void UsbFindDevicesFunction::AsyncWorkStart() { 428 void UsbFindDevicesFunction::AsyncWorkStart() {
417 result_.reset(new base::ListValue()); 429 result_.reset(new base::ListValue());
418 430
419 if (g_device_for_test) { 431 if (g_device_for_test) {
420 UsbDeviceResource* const resource = new UsbDeviceResource( 432 UsbDeviceResource* const resource = new UsbDeviceResource(
421 extension_->id(), 433 extension_->id(),
422 g_device_for_test->Open()); 434 g_device_for_test->Open());
423 435
424 Device device; 436 result_->Append(PopulateDeviceHandle(manager_->Add(resource), 0, 0));
425 result_->Append(PopulateDevice(manager_->Add(resource), 0, 0));
426 SetResult(result_.release()); 437 SetResult(result_.release());
427 AsyncWorkCompleted(); 438 AsyncWorkCompleted();
428 return; 439 return;
429 } 440 }
430 441
431 const uint16_t vendor_id = parameters_->options.vendor_id; 442 const uint16_t vendor_id = parameters_->options.vendor_id;
432 const uint16_t product_id = parameters_->options.product_id; 443 const uint16_t product_id = parameters_->options.product_id;
433 int interface_id = parameters_->options.interface_id.get() ? 444 int interface_id = parameters_->options.interface_id.get() ?
434 *parameters_->options.interface_id.get() : 445 *parameters_->options.interface_id.get() :
435 UsbDevicePermissionData::ANY_INTERFACE; 446 UsbDevicePermissionData::ANY_INTERFACE;
(...skipping 19 matching lines...) Expand all
455 devices->at(i)->Open(); 466 devices->at(i)->Open();
456 if (device_handle) 467 if (device_handle)
457 device_handles_.push_back(device_handle); 468 device_handles_.push_back(device_handle);
458 } 469 }
459 470
460 for (size_t i = 0; i < device_handles_.size(); ++i) { 471 for (size_t i = 0; i < device_handles_.size(); ++i) {
461 UsbDeviceHandle* const device_handle = device_handles_[i].get(); 472 UsbDeviceHandle* const device_handle = device_handles_[i].get();
462 UsbDeviceResource* const resource = 473 UsbDeviceResource* const resource =
463 new UsbDeviceResource(extension_->id(), device_handle); 474 new UsbDeviceResource(extension_->id(), device_handle);
464 475
465 result_->Append(PopulateDevice(manager_->Add(resource), 476 result_->Append(PopulateDeviceHandle(manager_->Add(resource),
466 parameters_->options.vendor_id, 477 parameters_->options.vendor_id,
467 parameters_->options.product_id)); 478 parameters_->options.product_id));
468 } 479 }
469 480
470 SetResult(result_.release()); 481 SetResult(result_.release());
471 AsyncWorkCompleted(); 482 AsyncWorkCompleted();
472 } 483 }
473 484
485 UsbGetDevicesFunction::UsbGetDevicesFunction() {
486 }
487
488 UsbGetDevicesFunction::~UsbGetDevicesFunction() {
489 }
490
491 void UsbGetDevicesFunction::SetDeviceForTest(UsbDevice* device) {
492 g_device_for_test = device;
493 }
494
495 bool UsbGetDevicesFunction::Prepare() {
496 parameters_ = GetDevices::Params::Create(*args_);
497 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
498 return true;
499 }
500
501 void UsbGetDevicesFunction::AsyncWorkStart() {
502 result_.reset(new base::ListValue());
503
504 if (g_device_for_test) {
505 result_->Append(PopulateDevice(g_device_for_test));
506 SetResult(result_.release());
507 AsyncWorkCompleted();
508 return;
509 }
510
511 const uint16_t vendor_id = parameters_->options.vendor_id;
512 const uint16_t product_id = parameters_->options.product_id;
513 int interface_id = parameters_->options.interface_id.get() ?
514 *parameters_->options.interface_id.get() :
515 UsbDevicePermissionData::ANY_INTERFACE;
516 UsbDevicePermission::CheckParam param(vendor_id, product_id, interface_id);
517 if (!PermissionsData::CheckAPIPermissionWithParam(
518 GetExtension(), APIPermission::kUsbDevice, &param)) {
519 LOG(WARNING) << "Insufficient permissions to access device.";
520 CompleteWithError(kErrorPermissionDenied);
521 return;
522 }
523
524 UsbService* service = UsbService::GetInstance();
525 service->FindDevices(
526 vendor_id,
527 product_id,
528 interface_id,
529 base::Bind(&UsbGetDevicesFunction::EnumerationCompletedFileThread, this));
530 }
531
532 void UsbGetDevicesFunction::EnumerationCompletedFileThread(
533 scoped_ptr<std::vector<scoped_refptr<UsbDevice> > > devices) {
534 for (size_t i = 0; i < devices->size(); ++i) {
535 result_->Append(PopulateDevice(devices->at(i).get()));
536 }
537
538 SetResult(result_.release());
539 AsyncWorkCompleted();
540 }
541
542 UsbOpenDeviceFunction::UsbOpenDeviceFunction() {}
543
544 UsbOpenDeviceFunction::~UsbOpenDeviceFunction() {}
545
546 bool UsbOpenDeviceFunction::Prepare() {
547 parameters_ = OpenDevice::Params::Create(*args_);
548 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
549 return true;
550 }
551
552 void UsbOpenDeviceFunction::AsyncWorkStart() {
553 UsbService* service = UsbService::GetInstance();
554 scoped_refptr<UsbDevice> device;
555 if (g_device_for_test)
556 device = g_device_for_test;
557 else
558 device = service->GetDeviceById(parameters_->device.device);
559
560 if (!device) {
561 SetError(kErrorNoDevice);
562 AsyncWorkCompleted();
563 return;
564 }
565
566 if (parameters_->device.vendor_id &&
567 *parameters_->device.vendor_id.get() != device->vendor_id()) {
568 SetError(kErrorOpen);
569 AsyncWorkCompleted();
570 return;
571 }
572
573 if (parameters_->device.product_id &&
574 *parameters_->device.product_id.get() != device->product_id()) {
575 SetError(kErrorOpen);
576 AsyncWorkCompleted();
577 return;
578 }
579
580 handle_ = device->Open();
581 if (!handle_) {
582 SetError(kErrorOpen);
583 AsyncWorkCompleted();
584 return;
585 }
586
587 SetResult(PopulateDeviceHandle(
588 manager_->Add(new UsbDeviceResource(extension_->id(), handle_)),
589 handle_->device()->vendor_id(),
590 handle_->device()->product_id()));
591 AsyncWorkCompleted();
592 }
593
474 UsbListInterfacesFunction::UsbListInterfacesFunction() {} 594 UsbListInterfacesFunction::UsbListInterfacesFunction() {}
475 595
476 UsbListInterfacesFunction::~UsbListInterfacesFunction() {} 596 UsbListInterfacesFunction::~UsbListInterfacesFunction() {}
477 597
478 bool UsbListInterfacesFunction::Prepare() { 598 bool UsbListInterfacesFunction::Prepare() {
479 parameters_ = ListInterfaces::Params::Create(*args_); 599 parameters_ = ListInterfaces::Params::Create(*args_);
480 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 600 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
481 return true; 601 return true;
482 } 602 }
483 603
484 void UsbListInterfacesFunction::AsyncWorkStart() { 604 void UsbListInterfacesFunction::AsyncWorkStart() {
485 UsbDeviceResource* const resource = GetUsbDeviceResource( 605 UsbDeviceResource* const resource = GetUsbDeviceResource(
486 parameters_->device.handle); 606 parameters_->handle.handle);
487 if (!resource) { 607 if (!resource) {
488 CompleteWithError(kErrorNoDevice); 608 CompleteWithError(kErrorNoDevice);
489 return; 609 return;
490 } 610 }
491 611
492 scoped_refptr<UsbConfigDescriptor> config = 612 scoped_refptr<UsbConfigDescriptor> config =
493 resource->device()->device()->ListInterfaces(); 613 resource->device()->device()->ListInterfaces();
494 614
495 if (!config) { 615 if (!config) {
496 SetError(kErrorCannotListInterfaces); 616 SetError(kErrorCannotListInterfaces);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 &endpoints)); 673 &endpoints));
554 } 674 }
555 } 675 }
556 676
557 SetResult(result_.release()); 677 SetResult(result_.release());
558 AsyncWorkCompleted(); 678 AsyncWorkCompleted();
559 } 679 }
560 680
561 bool UsbListInterfacesFunction::ConvertDirectionSafely( 681 bool UsbListInterfacesFunction::ConvertDirectionSafely(
562 const UsbEndpointDirection& input, 682 const UsbEndpointDirection& input,
563 extensions::api::usb::Direction* output) { 683 usb::Direction* output) {
564 const bool converted = ConvertDirectionToApi(input, output); 684 const bool converted = ConvertDirectionToApi(input, output);
565 if (!converted) 685 if (!converted)
566 SetError(kErrorConvertDirection); 686 SetError(kErrorConvertDirection);
567 return converted; 687 return converted;
568 } 688 }
569 689
570 bool UsbListInterfacesFunction::ConvertSynchronizationTypeSafely( 690 bool UsbListInterfacesFunction::ConvertSynchronizationTypeSafely(
571 const UsbSynchronizationType& input, 691 const UsbSynchronizationType& input,
572 extensions::api::usb::SynchronizationType* output) { 692 usb::SynchronizationType* output) {
573 const bool converted = ConvertSynchronizationTypeToApi(input, output); 693 const bool converted = ConvertSynchronizationTypeToApi(input, output);
574 if (!converted) 694 if (!converted)
575 SetError(kErrorConvertSynchronizationType); 695 SetError(kErrorConvertSynchronizationType);
576 return converted; 696 return converted;
577 } 697 }
578 698
579 bool UsbListInterfacesFunction::ConvertTransferTypeSafely( 699 bool UsbListInterfacesFunction::ConvertTransferTypeSafely(
580 const UsbTransferType& input, 700 const UsbTransferType& input,
581 extensions::api::usb::TransferType* output) { 701 usb::TransferType* output) {
582 const bool converted = ConvertTransferTypeToApi(input, output); 702 const bool converted = ConvertTransferTypeToApi(input, output);
583 if (!converted) 703 if (!converted)
584 SetError(kErrorConvertTransferType); 704 SetError(kErrorConvertTransferType);
585 return converted; 705 return converted;
586 } 706 }
587 707
588 bool UsbListInterfacesFunction::ConvertUsageTypeSafely( 708 bool UsbListInterfacesFunction::ConvertUsageTypeSafely(
589 const UsbUsageType& input, 709 const UsbUsageType& input,
590 extensions::api::usb::UsageType* output) { 710 usb::UsageType* output) {
591 const bool converted = ConvertUsageTypeToApi(input, output); 711 const bool converted = ConvertUsageTypeToApi(input, output);
592 if (!converted) 712 if (!converted)
593 SetError(kErrorConvertUsageType); 713 SetError(kErrorConvertUsageType);
594 return converted; 714 return converted;
595 } 715 }
596 716
597 UsbCloseDeviceFunction::UsbCloseDeviceFunction() {} 717 UsbCloseDeviceFunction::UsbCloseDeviceFunction() {}
598 718
599 UsbCloseDeviceFunction::~UsbCloseDeviceFunction() {} 719 UsbCloseDeviceFunction::~UsbCloseDeviceFunction() {}
600 720
601 bool UsbCloseDeviceFunction::Prepare() { 721 bool UsbCloseDeviceFunction::Prepare() {
602 parameters_ = CloseDevice::Params::Create(*args_); 722 parameters_ = CloseDevice::Params::Create(*args_);
603 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 723 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
604 return true; 724 return true;
605 } 725 }
606 726
607 void UsbCloseDeviceFunction::AsyncWorkStart() { 727 void UsbCloseDeviceFunction::AsyncWorkStart() {
608 UsbDeviceResource* const resource = GetUsbDeviceResource( 728 UsbDeviceResource* const resource = GetUsbDeviceResource(
609 parameters_->device.handle); 729 parameters_->handle.handle);
610 if (!resource) { 730 if (!resource) {
611 CompleteWithError(kErrorNoDevice); 731 CompleteWithError(kErrorNoDevice);
612 return; 732 return;
613 } 733 }
614 734
615 resource->device()->Close(); 735 resource->device()->Close();
616 RemoveUsbDeviceResource(parameters_->device.handle); 736 RemoveUsbDeviceResource(parameters_->handle.handle);
617 AsyncWorkCompleted(); 737 AsyncWorkCompleted();
618 } 738 }
619 739
620 UsbClaimInterfaceFunction::UsbClaimInterfaceFunction() {} 740 UsbClaimInterfaceFunction::UsbClaimInterfaceFunction() {}
621 741
622 UsbClaimInterfaceFunction::~UsbClaimInterfaceFunction() {} 742 UsbClaimInterfaceFunction::~UsbClaimInterfaceFunction() {}
623 743
624 bool UsbClaimInterfaceFunction::Prepare() { 744 bool UsbClaimInterfaceFunction::Prepare() {
625 parameters_ = ClaimInterface::Params::Create(*args_); 745 parameters_ = ClaimInterface::Params::Create(*args_);
626 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 746 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
627 return true; 747 return true;
628 } 748 }
629 749
630 void UsbClaimInterfaceFunction::AsyncWorkStart() { 750 void UsbClaimInterfaceFunction::AsyncWorkStart() {
631 UsbDeviceResource* resource = 751 UsbDeviceResource* resource =
632 GetUsbDeviceResource(parameters_->device.handle); 752 GetUsbDeviceResource(parameters_->handle.handle);
633 if (!resource) { 753 if (!resource) {
634 CompleteWithError(kErrorNoDevice); 754 CompleteWithError(kErrorNoDevice);
635 return; 755 return;
636 } 756 }
637 757
638 bool success = 758 bool success =
639 resource->device()->ClaimInterface(parameters_->interface_number); 759 resource->device()->ClaimInterface(parameters_->interface_number);
640 760
641 if (!success) 761 if (!success)
642 SetError(kErrorCannotClaimInterface); 762 SetError(kErrorCannotClaimInterface);
643 AsyncWorkCompleted(); 763 AsyncWorkCompleted();
644 } 764 }
645 765
646 UsbReleaseInterfaceFunction::UsbReleaseInterfaceFunction() {} 766 UsbReleaseInterfaceFunction::UsbReleaseInterfaceFunction() {}
647 767
648 UsbReleaseInterfaceFunction::~UsbReleaseInterfaceFunction() {} 768 UsbReleaseInterfaceFunction::~UsbReleaseInterfaceFunction() {}
649 769
650 bool UsbReleaseInterfaceFunction::Prepare() { 770 bool UsbReleaseInterfaceFunction::Prepare() {
651 parameters_ = ReleaseInterface::Params::Create(*args_); 771 parameters_ = ReleaseInterface::Params::Create(*args_);
652 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 772 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
653 return true; 773 return true;
654 } 774 }
655 775
656 void UsbReleaseInterfaceFunction::AsyncWorkStart() { 776 void UsbReleaseInterfaceFunction::AsyncWorkStart() {
657 UsbDeviceResource* resource = 777 UsbDeviceResource* resource =
658 GetUsbDeviceResource(parameters_->device.handle); 778 GetUsbDeviceResource(parameters_->handle.handle);
659 if (!resource) { 779 if (!resource) {
660 CompleteWithError(kErrorNoDevice); 780 CompleteWithError(kErrorNoDevice);
661 return; 781 return;
662 } 782 }
663 bool success = 783 bool success =
664 resource->device()->ReleaseInterface(parameters_->interface_number); 784 resource->device()->ReleaseInterface(parameters_->interface_number);
665 if (!success) 785 if (!success)
666 SetError(kErrorCannotReleaseInterface); 786 SetError(kErrorCannotReleaseInterface);
667 AsyncWorkCompleted(); 787 AsyncWorkCompleted();
668 } 788 }
669 789
670 UsbSetInterfaceAlternateSettingFunction:: 790 UsbSetInterfaceAlternateSettingFunction::
671 UsbSetInterfaceAlternateSettingFunction() {} 791 UsbSetInterfaceAlternateSettingFunction() {}
672 792
673 UsbSetInterfaceAlternateSettingFunction:: 793 UsbSetInterfaceAlternateSettingFunction::
674 ~UsbSetInterfaceAlternateSettingFunction() {} 794 ~UsbSetInterfaceAlternateSettingFunction() {}
675 795
676 bool UsbSetInterfaceAlternateSettingFunction::Prepare() { 796 bool UsbSetInterfaceAlternateSettingFunction::Prepare() {
677 parameters_ = SetInterfaceAlternateSetting::Params::Create(*args_); 797 parameters_ = SetInterfaceAlternateSetting::Params::Create(*args_);
678 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 798 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
679 return true; 799 return true;
680 } 800 }
681 801
682 void UsbSetInterfaceAlternateSettingFunction::AsyncWorkStart() { 802 void UsbSetInterfaceAlternateSettingFunction::AsyncWorkStart() {
683 UsbDeviceResource* resource = 803 UsbDeviceResource* resource =
684 GetUsbDeviceResource(parameters_->device.handle); 804 GetUsbDeviceResource(parameters_->handle.handle);
685 if (!resource) { 805 if (!resource) {
686 CompleteWithError(kErrorNoDevice); 806 CompleteWithError(kErrorNoDevice);
687 return; 807 return;
688 } 808 }
689 809
690 bool success = resource->device()->SetInterfaceAlternateSetting( 810 bool success = resource->device()->SetInterfaceAlternateSetting(
691 parameters_->interface_number, 811 parameters_->interface_number,
692 parameters_->alternate_setting); 812 parameters_->alternate_setting);
693 if (!success) 813 if (!success)
694 SetError(kErrorCannotSetInterfaceAlternateSetting); 814 SetError(kErrorCannotSetInterfaceAlternateSetting);
695 815
696 AsyncWorkCompleted(); 816 AsyncWorkCompleted();
697 } 817 }
698 818
699 UsbControlTransferFunction::UsbControlTransferFunction() {} 819 UsbControlTransferFunction::UsbControlTransferFunction() {}
700 820
701 UsbControlTransferFunction::~UsbControlTransferFunction() {} 821 UsbControlTransferFunction::~UsbControlTransferFunction() {}
702 822
703 bool UsbControlTransferFunction::Prepare() { 823 bool UsbControlTransferFunction::Prepare() {
704 parameters_ = ControlTransfer::Params::Create(*args_); 824 parameters_ = ControlTransfer::Params::Create(*args_);
705 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 825 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
706 return true; 826 return true;
707 } 827 }
708 828
709 void UsbControlTransferFunction::AsyncWorkStart() { 829 void UsbControlTransferFunction::AsyncWorkStart() {
710 UsbDeviceResource* const resource = GetUsbDeviceResource( 830 UsbDeviceResource* const resource = GetUsbDeviceResource(
711 parameters_->device.handle); 831 parameters_->handle.handle);
712 if (!resource) { 832 if (!resource) {
713 CompleteWithError(kErrorNoDevice); 833 CompleteWithError(kErrorNoDevice);
714 return; 834 return;
715 } 835 }
716 836
717 const ControlTransferInfo& transfer = parameters_->transfer_info; 837 const ControlTransferInfo& transfer = parameters_->transfer_info;
718 838
719 UsbEndpointDirection direction; 839 UsbEndpointDirection direction;
720 UsbDeviceHandle::TransferRequestType request_type; 840 UsbDeviceHandle::TransferRequestType request_type;
721 UsbDeviceHandle::TransferRecipient recipient; 841 UsbDeviceHandle::TransferRecipient recipient;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
758 UsbBulkTransferFunction::~UsbBulkTransferFunction() {} 878 UsbBulkTransferFunction::~UsbBulkTransferFunction() {}
759 879
760 bool UsbBulkTransferFunction::Prepare() { 880 bool UsbBulkTransferFunction::Prepare() {
761 parameters_ = BulkTransfer::Params::Create(*args_); 881 parameters_ = BulkTransfer::Params::Create(*args_);
762 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 882 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
763 return true; 883 return true;
764 } 884 }
765 885
766 void UsbBulkTransferFunction::AsyncWorkStart() { 886 void UsbBulkTransferFunction::AsyncWorkStart() {
767 UsbDeviceResource* const resource = GetUsbDeviceResource( 887 UsbDeviceResource* const resource = GetUsbDeviceResource(
768 parameters_->device.handle); 888 parameters_->handle.handle);
769 if (!resource) { 889 if (!resource) {
770 CompleteWithError(kErrorNoDevice); 890 CompleteWithError(kErrorNoDevice);
771 return; 891 return;
772 } 892 }
773 893
774 const GenericTransferInfo& transfer = parameters_->transfer_info; 894 const GenericTransferInfo& transfer = parameters_->transfer_info;
775 895
776 UsbEndpointDirection direction; 896 UsbEndpointDirection direction;
777 size_t size = 0; 897 size_t size = 0;
778 898
(...skipping 28 matching lines...) Expand all
807 UsbInterruptTransferFunction::~UsbInterruptTransferFunction() {} 927 UsbInterruptTransferFunction::~UsbInterruptTransferFunction() {}
808 928
809 bool UsbInterruptTransferFunction::Prepare() { 929 bool UsbInterruptTransferFunction::Prepare() {
810 parameters_ = InterruptTransfer::Params::Create(*args_); 930 parameters_ = InterruptTransfer::Params::Create(*args_);
811 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 931 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
812 return true; 932 return true;
813 } 933 }
814 934
815 void UsbInterruptTransferFunction::AsyncWorkStart() { 935 void UsbInterruptTransferFunction::AsyncWorkStart() {
816 UsbDeviceResource* const resource = GetUsbDeviceResource( 936 UsbDeviceResource* const resource = GetUsbDeviceResource(
817 parameters_->device.handle); 937 parameters_->handle.handle);
818 if (!resource) { 938 if (!resource) {
819 CompleteWithError(kErrorNoDevice); 939 CompleteWithError(kErrorNoDevice);
820 return; 940 return;
821 } 941 }
822 942
823 const GenericTransferInfo& transfer = parameters_->transfer_info; 943 const GenericTransferInfo& transfer = parameters_->transfer_info;
824 944
825 UsbEndpointDirection direction; 945 UsbEndpointDirection direction;
826 size_t size = 0; 946 size_t size = 0;
827 947
(...skipping 28 matching lines...) Expand all
856 UsbIsochronousTransferFunction::~UsbIsochronousTransferFunction() {} 976 UsbIsochronousTransferFunction::~UsbIsochronousTransferFunction() {}
857 977
858 bool UsbIsochronousTransferFunction::Prepare() { 978 bool UsbIsochronousTransferFunction::Prepare() {
859 parameters_ = IsochronousTransfer::Params::Create(*args_); 979 parameters_ = IsochronousTransfer::Params::Create(*args_);
860 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 980 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
861 return true; 981 return true;
862 } 982 }
863 983
864 void UsbIsochronousTransferFunction::AsyncWorkStart() { 984 void UsbIsochronousTransferFunction::AsyncWorkStart() {
865 UsbDeviceResource* const resource = GetUsbDeviceResource( 985 UsbDeviceResource* const resource = GetUsbDeviceResource(
866 parameters_->device.handle); 986 parameters_->handle.handle);
867 if (!resource) { 987 if (!resource) {
868 CompleteWithError(kErrorNoDevice); 988 CompleteWithError(kErrorNoDevice);
869 return; 989 return;
870 } 990 }
871 991
872 const IsochronousTransferInfo& transfer = parameters_->transfer_info; 992 const IsochronousTransferInfo& transfer = parameters_->transfer_info;
873 const GenericTransferInfo& generic_transfer = transfer.transfer_info; 993 const GenericTransferInfo& generic_transfer = transfer.transfer_info;
874 994
875 size_t size = 0; 995 size_t size = 0;
876 UsbEndpointDirection direction; 996 UsbEndpointDirection direction;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
923 UsbResetDeviceFunction::~UsbResetDeviceFunction() {} 1043 UsbResetDeviceFunction::~UsbResetDeviceFunction() {}
924 1044
925 bool UsbResetDeviceFunction::Prepare() { 1045 bool UsbResetDeviceFunction::Prepare() {
926 parameters_ = ResetDevice::Params::Create(*args_); 1046 parameters_ = ResetDevice::Params::Create(*args_);
927 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 1047 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
928 return true; 1048 return true;
929 } 1049 }
930 1050
931 void UsbResetDeviceFunction::AsyncWorkStart() { 1051 void UsbResetDeviceFunction::AsyncWorkStart() {
932 UsbDeviceResource* const resource = GetUsbDeviceResource( 1052 UsbDeviceResource* const resource = GetUsbDeviceResource(
933 parameters_->device.handle); 1053 parameters_->handle.handle);
934 if (!resource) { 1054 if (!resource) {
935 CompleteWithError(kErrorNoDevice); 1055 CompleteWithError(kErrorNoDevice);
936 return; 1056 return;
937 } 1057 }
938 1058
939 bool success = resource->device()->ResetDevice(); 1059 bool success = resource->device()->ResetDevice();
940 if (!success) { 1060 if (!success) {
941 UsbDeviceResource* const resource = GetUsbDeviceResource( 1061 UsbDeviceResource* const resource = GetUsbDeviceResource(
942 parameters_->device.handle); 1062 parameters_->handle.handle);
943 if (!resource) { 1063 if (!resource) {
944 CompleteWithError(kErrorNoDevice); 1064 CompleteWithError(kErrorNoDevice);
945 return; 1065 return;
946 } 1066 }
947 resource->device()->Close(); 1067 resource->device()->Close();
948 RemoveUsbDeviceResource(parameters_->device.handle); 1068 RemoveUsbDeviceResource(parameters_->handle.handle);
949 SetError(kErrorResetDevice); 1069 SetError(kErrorResetDevice);
950 SetResult(new base::FundamentalValue(false)); 1070 SetResult(new base::FundamentalValue(false));
951 AsyncWorkCompleted(); 1071 AsyncWorkCompleted();
952 return; 1072 return;
953 } 1073 }
954 SetResult(new base::FundamentalValue(true)); 1074 SetResult(new base::FundamentalValue(true));
955 AsyncWorkCompleted(); 1075 AsyncWorkCompleted();
956 } 1076 }
957 1077
958 } // namespace extensions 1078 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698