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

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 ClaimInterface = extensions::api::usb::ClaimInterface;
22 namespace ListInterfaces = extensions::api::usb::ListInterfaces;
23 namespace CloseDevice = extensions::api::usb::CloseDevice;
24 namespace ControlTransfer = extensions::api::usb::ControlTransfer;
25 namespace FindDevices = extensions::api::usb::FindDevices;
26 namespace InterruptTransfer = extensions::api::usb::InterruptTransfer;
27 namespace IsochronousTransfer = extensions::api::usb::IsochronousTransfer;
28 namespace ReleaseInterface = extensions::api::usb::ReleaseInterface;
29 namespace ResetDevice = extensions::api::usb::ResetDevice;
30 namespace SetInterfaceAlternateSetting =
31 extensions::api::usb::SetInterfaceAlternateSetting;
32 namespace usb = extensions::api::usb; 21 namespace usb = extensions::api::usb;
22 namespace BulkTransfer = usb::BulkTransfer;
23 namespace ClaimInterface = usb::ClaimInterface;
24 namespace CloseDevice = usb::CloseDevice;
25 namespace ControlTransfer = usb::ControlTransfer;
26 namespace FindDevices = usb::FindDevices;
27 namespace GetDevices = usb::GetDevices;
28 namespace InterruptTransfer = usb::InterruptTransfer;
29 namespace IsochronousTransfer = usb::IsochronousTransfer;
30 namespace ListInterfaces = usb::ListInterfaces;
31 namespace OpenDevice = usb::OpenDevice;
32 namespace ReleaseInterface = usb::ReleaseInterface;
33 namespace RequestAccess = usb::RequestAccess;
34 namespace ResetDevice = usb::ResetDevice;
35 namespace SetInterfaceAlternateSetting = usb::SetInterfaceAlternateSetting;
33 36
34 using content::BrowserThread; 37 using content::BrowserThread;
35 using std::string; 38 using std::string;
36 using std::vector; 39 using std::vector;
37 using usb::ControlTransferInfo; 40 using usb::ControlTransferInfo;
41 using usb::ConnectionHandle;
38 using usb::Device; 42 using usb::Device;
39 using usb::Direction; 43 using usb::Direction;
40 using usb::EndpointDescriptor; 44 using usb::EndpointDescriptor;
41 using usb::GenericTransferInfo; 45 using usb::GenericTransferInfo;
42 using usb::InterfaceDescriptor; 46 using usb::InterfaceDescriptor;
43 using usb::IsochronousTransferInfo; 47 using usb::IsochronousTransferInfo;
44 using usb::Recipient; 48 using usb::Recipient;
45 using usb::RequestType; 49 using usb::RequestType;
46 using usb::SynchronizationType; 50 using usb::SynchronizationType;
47 using usb::TransferType; 51 using usb::TransferType;
48 using usb::UsageType; 52 using usb::UsageType;
49 53
54 typedef std::vector<scoped_refptr<UsbDevice> > DeviceVector;
55 typedef scoped_ptr<DeviceVector> 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 kErrorNotSupported[] = "Not supported on this platform.";
60 static const char kErrorTimeout[] = "Transfer timed out."; 67 const char kErrorOverflow[] = "Inbound transfer overflow.";
61 static const char kErrorTransferLength[] = "Transfer length is insufficient."; 68 const char kErrorStalled[] = "Transfer stalled.";
69 const char kErrorTimeout[] = "Transfer timed out.";
70 const char kErrorTransferLength[] = "Transfer length is insufficient.";
62 71
63 static const char kErrorCannotListInterfaces[] = "Error listing interfaces."; 72 const char kErrorCannotListInterfaces[] = "Error listing interfaces.";
64 static const char kErrorCannotClaimInterface[] = "Error claiming interface."; 73 const char kErrorCannotClaimInterface[] = "Error claiming interface.";
65 static const char kErrorCannotReleaseInterface[] = "Error releasing interface."; 74 const char kErrorCannotReleaseInterface[] = "Error releasing interface.";
66 static const char kErrorCannotSetInterfaceAlternateSetting[] = 75 const char kErrorCannotSetInterfaceAlternateSetting[] =
67 "Error setting alternate interface setting."; 76 "Error setting alternate interface setting.";
68 static const char kErrorConvertDirection[] = "Invalid transfer direction."; 77 const char kErrorConvertDirection[] = "Invalid transfer direction.";
69 static const char kErrorConvertRecipient[] = "Invalid transfer recipient."; 78 const char kErrorConvertRecipient[] = "Invalid transfer recipient.";
70 static const char kErrorConvertRequestType[] = "Invalid request type."; 79 const char kErrorConvertRequestType[] = "Invalid request type.";
71 static const char kErrorConvertSynchronizationType[] = 80 const char kErrorConvertSynchronizationType[] = "Invalid synchronization type";
72 "Invalid synchronization type"; 81 const char kErrorConvertTransferType[] = "Invalid endpoint type.";
73 static const char kErrorConvertTransferType[] = "Invalid endpoint type."; 82 const char kErrorConvertUsageType[] = "Invalid usage type.";
74 static const char kErrorConvertUsageType[] = "Invalid usage type."; 83 const char kErrorMalformedParameters[] = "Error parsing parameters.";
75 static const char kErrorMalformedParameters[] = "Error parsing parameters."; 84 const char kErrorNoDevice[] = "No such device.";
76 static const char kErrorNoDevice[] = "No such device."; 85 const char kErrorPermissionDenied[] =
77 static const char kErrorPermissionDenied[] =
78 "Permission to access device was denied"; 86 "Permission to access device was denied";
79 static const char kErrorInvalidTransferLength[] = "Transfer length must be a " 87 const char kErrorInvalidTransferLength[] =
80 "positive number less than 104,857,600."; 88 "Transfer length must be a positive number less than 104,857,600.";
81 static const char kErrorInvalidNumberOfPackets[] = "Number of packets must be " 89 const char kErrorInvalidNumberOfPackets[] =
82 "a positive number less than 4,194,304."; 90 "Number of packets must be a positive number less than 4,194,304.";
83 static const char kErrorInvalidPacketLength[] = "Packet length must be a " 91 const char kErrorInvalidPacketLength[] = "Packet length must be a "
84 "positive number less than 65,536."; 92 "positive number less than 65,536.";
85 static const char kErrorResetDevice[] = 93 const char kErrorResetDevice[] =
86 "Error resetting the device. The device has been closed."; 94 "Error resetting the device. The device has been closed.";
87 95
88 static const size_t kMaxTransferLength = 100 * 1024 * 1024; 96 const size_t kMaxTransferLength = 100 * 1024 * 1024;
89 static const int kMaxPackets = 4 * 1024 * 1024; 97 const int kMaxPackets = 4 * 1024 * 1024;
90 static const int kMaxPacketLength = 64 * 1024; 98 const int kMaxPacketLength = 64 * 1024;
91 99
92 static UsbDevice* g_device_for_test = NULL; 100 UsbDevice* g_device_for_test = NULL;
93 101
94 static bool ConvertDirectionToApi(const UsbEndpointDirection& input, 102 bool ConvertDirectionToApi(const UsbEndpointDirection& input,
95 Direction* output) { 103 Direction* output) {
96 switch (input) { 104 switch (input) {
97 case USB_DIRECTION_INBOUND: 105 case USB_DIRECTION_INBOUND:
98 *output = usb::DIRECTION_IN; 106 *output = usb::DIRECTION_IN;
99 return true; 107 return true;
100 case USB_DIRECTION_OUTBOUND: 108 case USB_DIRECTION_OUTBOUND:
101 *output = usb::DIRECTION_OUT; 109 *output = usb::DIRECTION_OUT;
102 return true; 110 return true;
103 default: 111 default:
104 NOTREACHED(); 112 NOTREACHED();
105 return false; 113 return false;
106 } 114 }
107 } 115 }
108 116
109 static bool ConvertSynchronizationTypeToApi( 117 bool ConvertSynchronizationTypeToApi(const UsbSynchronizationType& input,
110 const UsbSynchronizationType& input, 118 usb::SynchronizationType* output) {
111 extensions::api::usb::SynchronizationType* output) {
112 switch (input) { 119 switch (input) {
113 case USB_SYNCHRONIZATION_NONE: 120 case USB_SYNCHRONIZATION_NONE:
114 *output = usb::SYNCHRONIZATION_TYPE_NONE; 121 *output = usb::SYNCHRONIZATION_TYPE_NONE;
115 return true; 122 return true;
116 case USB_SYNCHRONIZATION_ASYNCHRONOUS: 123 case USB_SYNCHRONIZATION_ASYNCHRONOUS:
117 *output = usb::SYNCHRONIZATION_TYPE_ASYNCHRONOUS; 124 *output = usb::SYNCHRONIZATION_TYPE_ASYNCHRONOUS;
118 return true; 125 return true;
119 case USB_SYNCHRONIZATION_ADAPTIVE: 126 case USB_SYNCHRONIZATION_ADAPTIVE:
120 *output = usb::SYNCHRONIZATION_TYPE_ADAPTIVE; 127 *output = usb::SYNCHRONIZATION_TYPE_ADAPTIVE;
121 return true; 128 return true;
122 case USB_SYNCHRONIZATION_SYNCHRONOUS: 129 case USB_SYNCHRONIZATION_SYNCHRONOUS:
123 *output = usb::SYNCHRONIZATION_TYPE_SYNCHRONOUS; 130 *output = usb::SYNCHRONIZATION_TYPE_SYNCHRONOUS;
124 return true; 131 return true;
125 default: 132 default:
126 NOTREACHED(); 133 NOTREACHED();
127 return false; 134 return false;
128 } 135 }
129 } 136 }
130 137
131 static bool ConvertTransferTypeToApi( 138 bool ConvertTransferTypeToApi(
132 const UsbTransferType& input, 139 const UsbTransferType& input,
133 extensions::api::usb::TransferType* output) { 140 usb::TransferType* output) {
134 switch (input) { 141 switch (input) {
135 case USB_TRANSFER_CONTROL: 142 case USB_TRANSFER_CONTROL:
136 *output = usb::TRANSFER_TYPE_CONTROL; 143 *output = usb::TRANSFER_TYPE_CONTROL;
137 return true; 144 return true;
138 case USB_TRANSFER_INTERRUPT: 145 case USB_TRANSFER_INTERRUPT:
139 *output = usb::TRANSFER_TYPE_INTERRUPT; 146 *output = usb::TRANSFER_TYPE_INTERRUPT;
140 return true; 147 return true;
141 case USB_TRANSFER_ISOCHRONOUS: 148 case USB_TRANSFER_ISOCHRONOUS:
142 *output = usb::TRANSFER_TYPE_ISOCHRONOUS; 149 *output = usb::TRANSFER_TYPE_ISOCHRONOUS;
143 return true; 150 return true;
144 case USB_TRANSFER_BULK: 151 case USB_TRANSFER_BULK:
145 *output = usb::TRANSFER_TYPE_BULK; 152 *output = usb::TRANSFER_TYPE_BULK;
146 return true; 153 return true;
147 default: 154 default:
148 NOTREACHED(); 155 NOTREACHED();
149 return false; 156 return false;
150 } 157 }
151 } 158 }
152 159
153 static bool ConvertUsageTypeToApi(const UsbUsageType& input, 160 bool ConvertUsageTypeToApi(const UsbUsageType& input, usb::UsageType* output) {
154 extensions::api::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 #if defined(OS_CHROMEOS)
302 void RequestUsbDevicesAccessHelper(
303 std::vector<scoped_refptr<UsbDevice> >* devices,
304 std::vector<scoped_refptr<UsbDevice> >::iterator i,
305 int interface_id,
306 const base::Closure& callback,
307 bool success) {
308 if (success) {
309 ++i;
310 } else {
311 i = devices->erase(i);
312 }
313 if (i == devices->end()) {
314 callback.Run();
315 return;
316 }
317 (*i)->RequestUsbAcess(interface_id,
318 base::Bind(RequestUsbDevicesAccessHelper, devices, i,
319 interface_id, callback));
320 }
321
322 void RequestUsbDevicesAccess(
323 std::vector<scoped_refptr<UsbDevice> >* devices,
324 int interface_id,
325 const base::Closure& callback) {
326 RequestUsbDevicesAccessHelper(devices, devices->begin(), interface_id,
327 callback, true);
328 }
329 #endif // OS_CHROMEOS
330
331 base::DictionaryValue* CreateTransferInfo(
297 UsbTransferStatus status, 332 UsbTransferStatus status,
298 scoped_refptr<net::IOBuffer> data, 333 scoped_refptr<net::IOBuffer> data,
299 size_t length) { 334 size_t length) {
300 base::DictionaryValue* result = new base::DictionaryValue(); 335 base::DictionaryValue* result = new base::DictionaryValue();
301 result->SetInteger(kResultCodeKey, status); 336 result->SetInteger(kResultCodeKey, status);
302 result->Set(kDataKey, base::BinaryValue::CreateWithCopiedBuffer(data->data(), 337 result->Set(kDataKey, base::BinaryValue::CreateWithCopiedBuffer(data->data(),
303 length)); 338 length));
304 return result; 339 return result;
305 } 340 }
306 341
307 static base::Value* PopulateDevice(int handle, int vendor_id, int product_id) { 342 base::Value* PopulateConnectionHandle(int handle, int vendor_id,
308 Device device; 343 int product_id) {
309 device.handle = handle; 344 ConnectionHandle result;
310 device.vendor_id = vendor_id; 345 result.handle = handle;
311 device.product_id = product_id; 346 result.vendor_id = vendor_id;
312 return device.ToValue().release(); 347 result.product_id = product_id;
348 return result.ToValue().release();
313 } 349 }
314 350
315 static base::Value* PopulateInterfaceDescriptor(int interface_number, 351 base::Value* PopulateDevice(UsbDevice* device) {
316 int alternate_setting, int interface_class, int interface_subclass, 352 Device result;
317 int interface_protocol, 353 result.device = device->unique_id();
318 std::vector<linked_ptr<EndpointDescriptor> >* endpoints) { 354 result.vendor_id = device->vendor_id();
355 result.product_id = device->product_id();
356 return result.ToValue().release();
357 }
358
359 base::Value* PopulateInterfaceDescriptor(
360 int interface_number,
361 int alternate_setting,
362 int interface_class,
363 int interface_subclass,
364 int interface_protocol,
365 std::vector<linked_ptr<EndpointDescriptor> >* endpoints) {
319 InterfaceDescriptor descriptor; 366 InterfaceDescriptor descriptor;
320 descriptor.interface_number = interface_number; 367 descriptor.interface_number = interface_number;
321 descriptor.alternate_setting = alternate_setting; 368 descriptor.alternate_setting = alternate_setting;
322 descriptor.interface_class = interface_class; 369 descriptor.interface_class = interface_class;
323 descriptor.interface_subclass = interface_subclass; 370 descriptor.interface_subclass = interface_subclass;
324 descriptor.interface_protocol = interface_protocol; 371 descriptor.interface_protocol = interface_protocol;
325 descriptor.endpoints = *endpoints; 372 descriptor.endpoints = *endpoints;
326 return descriptor.ToValue().release(); 373 return descriptor.ToValue().release();
327 } 374 }
328 375
(...skipping 11 matching lines...) Expand all
340 bool UsbAsyncApiFunction::PrePrepare() { 387 bool UsbAsyncApiFunction::PrePrepare() {
341 manager_ = ApiResourceManager<UsbDeviceResource>::Get(profile()); 388 manager_ = ApiResourceManager<UsbDeviceResource>::Get(profile());
342 set_work_thread_id(BrowserThread::FILE); 389 set_work_thread_id(BrowserThread::FILE);
343 return manager_ != NULL; 390 return manager_ != NULL;
344 } 391 }
345 392
346 bool UsbAsyncApiFunction::Respond() { 393 bool UsbAsyncApiFunction::Respond() {
347 return error_.empty(); 394 return error_.empty();
348 } 395 }
349 396
350 UsbDeviceResource* UsbAsyncApiFunction::GetUsbDeviceResource( 397 scoped_refptr<UsbDevice>
351 int api_resource_id) { 398 UsbAsyncApiFunction::GetDeviceOrOrCompleteWithError(
352 return manager_->Get(extension_->id(), api_resource_id); 399 const Device& input_device) {
400 if (g_device_for_test)
401 return g_device_for_test;
402
403 const uint16_t vendor_id = input_device.vendor_id;
404 const uint16_t product_id = input_device.product_id;
405 UsbDevicePermission::CheckParam param(
406 vendor_id, product_id, UsbDevicePermissionData::UNSPECIFIED_INTERFACE);
407 if (!PermissionsData::CheckAPIPermissionWithParam(
408 GetExtension(), APIPermission::kUsbDevice, &param)) {
409 LOG(WARNING) << "Insufficient permissions to access device.";
410 CompleteWithError(kErrorPermissionDenied);
411 return NULL;
412 }
413
414 UsbService* service = UsbService::GetInstance();
415 scoped_refptr<UsbDevice> device;
416
417 device = service->GetDeviceById(input_device.device);
418
419 if (!device) {
420 CompleteWithError(kErrorNoDevice);
421 return NULL;
422 }
423
424 if (device->vendor_id() != input_device.vendor_id ||
425 device->product_id() != input_device.product_id) {
426 // Must act as if there is no such a device.
427 // Otherwise can be used to finger print unauthorized devices.
428 CompleteWithError(kErrorNoDevice);
429 return NULL;
430 }
431
432 return device;
433 }
434
435 scoped_refptr<UsbDeviceHandle>
436 UsbAsyncApiFunction::GetDeviceHandleOrCompleteWithError(
437 const ConnectionHandle& input_device_handle) {
438 UsbDeviceResource* resource =
439 manager_->Get(extension_->id(), input_device_handle.handle);
440 if (!resource) {
441 CompleteWithError(kErrorNoDevice);
442 return NULL;
443 }
444 if (resource->device()->device()->vendor_id() !=
445 input_device_handle.vendor_id ||
446 resource->device()->device()->product_id() !=
447 input_device_handle.product_id) {
448 CompleteWithError(kErrorNoDevice);
449 return NULL;
450 }
451
452 return resource->device();
353 } 453 }
354 454
355 void UsbAsyncApiFunction::RemoveUsbDeviceResource(int api_resource_id) { 455 void UsbAsyncApiFunction::RemoveUsbDeviceResource(int api_resource_id) {
356 manager_->Remove(extension_->id(), api_resource_id); 456 manager_->Remove(extension_->id(), api_resource_id);
357 } 457 }
358 458
359 void UsbAsyncApiFunction::CompleteWithError(const std::string& error) { 459 void UsbAsyncApiFunction::CompleteWithError(const std::string& error) {
360 SetError(error); 460 SetError(error);
361 AsyncWorkCompleted(); 461 AsyncWorkCompleted();
362 } 462 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 const bool converted = ConvertRecipient(input, output); 496 const bool converted = ConvertRecipient(input, output);
397 if (!converted) 497 if (!converted)
398 SetError(kErrorConvertRecipient); 498 SetError(kErrorConvertRecipient);
399 return converted; 499 return converted;
400 } 500 }
401 501
402 UsbFindDevicesFunction::UsbFindDevicesFunction() {} 502 UsbFindDevicesFunction::UsbFindDevicesFunction() {}
403 503
404 UsbFindDevicesFunction::~UsbFindDevicesFunction() {} 504 UsbFindDevicesFunction::~UsbFindDevicesFunction() {}
405 505
406 void UsbFindDevicesFunction::SetDeviceForTest(UsbDevice* device) {
407 g_device_for_test = device;
408 }
409
410 bool UsbFindDevicesFunction::Prepare() { 506 bool UsbFindDevicesFunction::Prepare() {
411 parameters_ = FindDevices::Params::Create(*args_); 507 parameters_ = FindDevices::Params::Create(*args_);
412 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 508 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
413 return true; 509 return true;
414 } 510 }
415 511
416 void UsbFindDevicesFunction::AsyncWorkStart() { 512 void UsbFindDevicesFunction::AsyncWorkStart() {
417 result_.reset(new base::ListValue()); 513 result_.reset(new base::ListValue());
418 514
419 if (g_device_for_test) { 515 if (g_device_for_test) {
420 UsbDeviceResource* const resource = new UsbDeviceResource( 516 UsbDeviceResource* const resource = new UsbDeviceResource(
421 extension_->id(), 517 extension_->id(),
422 g_device_for_test->Open()); 518 g_device_for_test->Open());
423 519
424 Device device; 520 result_->Append(PopulateConnectionHandle(manager_->Add(resource), 0, 0));
425 result_->Append(PopulateDevice(manager_->Add(resource), 0, 0));
426 SetResult(result_.release()); 521 SetResult(result_.release());
427 AsyncWorkCompleted(); 522 AsyncWorkCompleted();
428 return; 523 return;
429 } 524 }
430 525
431 const uint16_t vendor_id = parameters_->options.vendor_id; 526 const uint16_t vendor_id = parameters_->options.vendor_id;
432 const uint16_t product_id = parameters_->options.product_id; 527 const uint16_t product_id = parameters_->options.product_id;
433 int interface_id = parameters_->options.interface_id.get() ? 528 int interface_id = parameters_->options.interface_id.get() ?
434 *parameters_->options.interface_id.get() : 529 *parameters_->options.interface_id.get() :
435 UsbDevicePermissionData::ANY_INTERFACE; 530 UsbDevicePermissionData::ANY_INTERFACE;
436 UsbDevicePermission::CheckParam param(vendor_id, product_id, interface_id); 531 UsbDevicePermission::CheckParam param(vendor_id, product_id, interface_id);
437 if (!PermissionsData::CheckAPIPermissionWithParam( 532 if (!PermissionsData::CheckAPIPermissionWithParam(
438 GetExtension(), APIPermission::kUsbDevice, &param)) { 533 GetExtension(), APIPermission::kUsbDevice, &param)) {
439 LOG(WARNING) << "Insufficient permissions to access device."; 534 LOG(WARNING) << "Insufficient permissions to access device.";
440 CompleteWithError(kErrorPermissionDenied); 535 CompleteWithError(kErrorPermissionDenied);
441 return; 536 return;
442 } 537 }
443 538
444 UsbService *service = UsbService::GetInstance(); 539 UsbService *service = UsbService::GetInstance();
445 service->FindDevices( 540 ScopedDeviceVector devices(new DeviceVector());
446 vendor_id, product_id, interface_id, 541 service->GetDevices(devices.get());
447 base::Bind(&UsbFindDevicesFunction::EnumerationCompletedFileThread, 542
448 this)); 543 for (DeviceVector::iterator it = devices->begin();
544 it != devices->end();) {
545 if ((*it)->vendor_id() != vendor_id || (*it)->product_id() != product_id) {
546 it = devices->erase(it);
547 } else {
548 ++it;
549 }
550 }
551
552 #if defined(OS_CHROMEOS)
553 if (parameters_->options.interface_id.get()) {
554 int interface_id = *parameters_->options.interface_id.get();
555 RequestUsbDevicesAccess(devices.get(), interface_id,
556 base::Bind(&UsbFindDevicesFunction::OpenDevices,
557 this,
558 base::Passed(devices.Pass())));
559 return;
560 }
561 #endif // OS_CHROMEOS
562 OpenDevices(devices.Pass());
449 } 563 }
450 564
451 void UsbFindDevicesFunction::EnumerationCompletedFileThread( 565 void UsbFindDevicesFunction::OpenDevices(ScopedDeviceVector devices) {
452 scoped_ptr<std::vector<scoped_refptr<UsbDevice> > > devices) {
453 for (size_t i = 0; i < devices->size(); ++i) { 566 for (size_t i = 0; i < devices->size(); ++i) {
454 scoped_refptr<UsbDeviceHandle> device_handle = 567 scoped_refptr<UsbDeviceHandle> device_handle =
455 devices->at(i)->Open(); 568 devices->at(i)->Open();
456 if (device_handle) 569 if (device_handle)
457 device_handles_.push_back(device_handle); 570 device_handles_.push_back(device_handle);
458 } 571 }
459 572
460 for (size_t i = 0; i < device_handles_.size(); ++i) { 573 for (size_t i = 0; i < device_handles_.size(); ++i) {
461 UsbDeviceHandle* const device_handle = device_handles_[i].get(); 574 UsbDeviceHandle* const device_handle = device_handles_[i].get();
462 UsbDeviceResource* const resource = 575 UsbDeviceResource* const resource =
463 new UsbDeviceResource(extension_->id(), device_handle); 576 new UsbDeviceResource(extension_->id(), device_handle);
464 577
465 result_->Append(PopulateDevice(manager_->Add(resource), 578 result_->Append(PopulateConnectionHandle(manager_->Add(resource),
466 parameters_->options.vendor_id, 579 parameters_->options.vendor_id,
467 parameters_->options.product_id)); 580 parameters_->options.product_id));
468 } 581 }
469 582
470 SetResult(result_.release()); 583 SetResult(result_.release());
471 AsyncWorkCompleted(); 584 AsyncWorkCompleted();
472 } 585 }
473 586
587 UsbGetDevicesFunction::UsbGetDevicesFunction() {
588 }
589
590 UsbGetDevicesFunction::~UsbGetDevicesFunction() {
591 }
592
593 void UsbGetDevicesFunction::SetDeviceForTest(UsbDevice* device) {
594 g_device_for_test = device;
595 }
596
597 bool UsbGetDevicesFunction::Prepare() {
598 parameters_ = GetDevices::Params::Create(*args_);
599 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
600 return true;
601 }
602
603 void UsbGetDevicesFunction::AsyncWorkStart() {
604 result_.reset(new base::ListValue());
605
606 if (g_device_for_test) {
607 result_->Append(PopulateDevice(g_device_for_test));
608 SetResult(result_.release());
609 AsyncWorkCompleted();
610 return;
611 }
612
613 const uint16_t vendor_id = parameters_->options.vendor_id;
614 const uint16_t product_id = parameters_->options.product_id;
615 UsbDevicePermission::CheckParam param(
616 vendor_id, product_id, UsbDevicePermissionData::UNSPECIFIED_INTERFACE);
617 if (!PermissionsData::CheckAPIPermissionWithParam(
618 GetExtension(), APIPermission::kUsbDevice, &param)) {
619 LOG(WARNING) << "Insufficient permissions to access device.";
620 CompleteWithError(kErrorPermissionDenied);
621 return;
622 }
623
624 UsbService* service = UsbService::GetInstance();
625 ScopedDeviceVector devices(new DeviceVector());
626 service->GetDevices(devices.get());
627
628 for (DeviceVector::iterator it = devices->begin();
629 it != devices->end();) {
630 if ((*it)->vendor_id() != vendor_id || (*it)->product_id() != product_id) {
631 it = devices->erase(it);
632 } else {
633 ++it;
634 }
635 }
636
637 for (size_t i = 0; i < devices->size(); ++i) {
638 result_->Append(PopulateDevice(devices->at(i).get()));
639 }
640
641 SetResult(result_.release());
642 AsyncWorkCompleted();
643 }
644
645 UsbRequestAccessFunction::UsbRequestAccessFunction() {}
646
647 UsbRequestAccessFunction::~UsbRequestAccessFunction() {}
648
649 bool UsbRequestAccessFunction::Prepare() {
650 parameters_ = RequestAccess::Params::Create(*args_);
651 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
652 return true;
653 }
654
655 void UsbRequestAccessFunction::AsyncWorkStart() {
656 #if defined(OS_CHROMEOS)
657 scoped_refptr<UsbDevice> device =
658 GetDeviceOrOrCompleteWithError(parameters_->device);
659 if (!device) return;
660
661 device->RequestUsbAcess(parameters_->interface_id,
662 base::Bind(&UsbRequestAccessFunction::OnCompleted,
663 this));
664 #else
665 SetResult(new base::FundamentalValue(false));
666 CompleteWithError(kErrorNotSupported);
667 #endif // OS_CHROMEOS
668 }
669
670 void UsbRequestAccessFunction::OnCompleted(bool success) {
671 SetResult(new base::FundamentalValue(success));
672 AsyncWorkCompleted();
673 }
674
675 UsbOpenDeviceFunction::UsbOpenDeviceFunction() {}
676
677 UsbOpenDeviceFunction::~UsbOpenDeviceFunction() {}
678
679 bool UsbOpenDeviceFunction::Prepare() {
680 parameters_ = OpenDevice::Params::Create(*args_);
681 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
682 return true;
683 }
684
685 void UsbOpenDeviceFunction::AsyncWorkStart() {
686 scoped_refptr<UsbDevice> device =
687 GetDeviceOrOrCompleteWithError(parameters_->device);
688 if (!device) return;
689
690 handle_ = device->Open();
691 if (!handle_) {
692 SetError(kErrorOpen);
693 AsyncWorkCompleted();
694 return;
695 }
696
697 SetResult(PopulateConnectionHandle(
698 manager_->Add(new UsbDeviceResource(extension_->id(), handle_)),
699 handle_->device()->vendor_id(),
700 handle_->device()->product_id()));
701 AsyncWorkCompleted();
702 }
703
474 UsbListInterfacesFunction::UsbListInterfacesFunction() {} 704 UsbListInterfacesFunction::UsbListInterfacesFunction() {}
475 705
476 UsbListInterfacesFunction::~UsbListInterfacesFunction() {} 706 UsbListInterfacesFunction::~UsbListInterfacesFunction() {}
477 707
478 bool UsbListInterfacesFunction::Prepare() { 708 bool UsbListInterfacesFunction::Prepare() {
479 parameters_ = ListInterfaces::Params::Create(*args_); 709 parameters_ = ListInterfaces::Params::Create(*args_);
480 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 710 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
481 return true; 711 return true;
482 } 712 }
483 713
484 void UsbListInterfacesFunction::AsyncWorkStart() { 714 void UsbListInterfacesFunction::AsyncWorkStart() {
485 UsbDeviceResource* const resource = GetUsbDeviceResource( 715 scoped_refptr<UsbDeviceHandle> device_handle =
486 parameters_->device.handle); 716 GetDeviceHandleOrCompleteWithError(parameters_->handle);
487 if (!resource) { 717 if (!device_handle) return;
488 CompleteWithError(kErrorNoDevice);
489 return;
490 }
491 718
492 scoped_refptr<UsbConfigDescriptor> config = 719 scoped_refptr<UsbConfigDescriptor> config =
493 resource->device()->device()->ListInterfaces(); 720 device_handle->device()->ListInterfaces();
494 721
495 if (!config) { 722 if (!config) {
496 SetError(kErrorCannotListInterfaces); 723 SetError(kErrorCannotListInterfaces);
497 AsyncWorkCompleted(); 724 AsyncWorkCompleted();
498 return; 725 return;
499 } 726 }
500 727
501 result_.reset(new base::ListValue()); 728 result_.reset(new base::ListValue());
502 729
503 for (size_t i = 0, num_interfaces = config->GetNumInterfaces(); 730 for (size_t i = 0, num_interfaces = config->GetNumInterfaces();
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 &endpoints)); 780 &endpoints));
554 } 781 }
555 } 782 }
556 783
557 SetResult(result_.release()); 784 SetResult(result_.release());
558 AsyncWorkCompleted(); 785 AsyncWorkCompleted();
559 } 786 }
560 787
561 bool UsbListInterfacesFunction::ConvertDirectionSafely( 788 bool UsbListInterfacesFunction::ConvertDirectionSafely(
562 const UsbEndpointDirection& input, 789 const UsbEndpointDirection& input,
563 extensions::api::usb::Direction* output) { 790 usb::Direction* output) {
564 const bool converted = ConvertDirectionToApi(input, output); 791 const bool converted = ConvertDirectionToApi(input, output);
565 if (!converted) 792 if (!converted)
566 SetError(kErrorConvertDirection); 793 SetError(kErrorConvertDirection);
567 return converted; 794 return converted;
568 } 795 }
569 796
570 bool UsbListInterfacesFunction::ConvertSynchronizationTypeSafely( 797 bool UsbListInterfacesFunction::ConvertSynchronizationTypeSafely(
571 const UsbSynchronizationType& input, 798 const UsbSynchronizationType& input,
572 extensions::api::usb::SynchronizationType* output) { 799 usb::SynchronizationType* output) {
573 const bool converted = ConvertSynchronizationTypeToApi(input, output); 800 const bool converted = ConvertSynchronizationTypeToApi(input, output);
574 if (!converted) 801 if (!converted)
575 SetError(kErrorConvertSynchronizationType); 802 SetError(kErrorConvertSynchronizationType);
576 return converted; 803 return converted;
577 } 804 }
578 805
579 bool UsbListInterfacesFunction::ConvertTransferTypeSafely( 806 bool UsbListInterfacesFunction::ConvertTransferTypeSafely(
580 const UsbTransferType& input, 807 const UsbTransferType& input,
581 extensions::api::usb::TransferType* output) { 808 usb::TransferType* output) {
582 const bool converted = ConvertTransferTypeToApi(input, output); 809 const bool converted = ConvertTransferTypeToApi(input, output);
583 if (!converted) 810 if (!converted)
584 SetError(kErrorConvertTransferType); 811 SetError(kErrorConvertTransferType);
585 return converted; 812 return converted;
586 } 813 }
587 814
588 bool UsbListInterfacesFunction::ConvertUsageTypeSafely( 815 bool UsbListInterfacesFunction::ConvertUsageTypeSafely(
589 const UsbUsageType& input, 816 const UsbUsageType& input,
590 extensions::api::usb::UsageType* output) { 817 usb::UsageType* output) {
591 const bool converted = ConvertUsageTypeToApi(input, output); 818 const bool converted = ConvertUsageTypeToApi(input, output);
592 if (!converted) 819 if (!converted)
593 SetError(kErrorConvertUsageType); 820 SetError(kErrorConvertUsageType);
594 return converted; 821 return converted;
595 } 822 }
596 823
597 UsbCloseDeviceFunction::UsbCloseDeviceFunction() {} 824 UsbCloseDeviceFunction::UsbCloseDeviceFunction() {}
598 825
599 UsbCloseDeviceFunction::~UsbCloseDeviceFunction() {} 826 UsbCloseDeviceFunction::~UsbCloseDeviceFunction() {}
600 827
601 bool UsbCloseDeviceFunction::Prepare() { 828 bool UsbCloseDeviceFunction::Prepare() {
602 parameters_ = CloseDevice::Params::Create(*args_); 829 parameters_ = CloseDevice::Params::Create(*args_);
603 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 830 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
604 return true; 831 return true;
605 } 832 }
606 833
607 void UsbCloseDeviceFunction::AsyncWorkStart() { 834 void UsbCloseDeviceFunction::AsyncWorkStart() {
608 UsbDeviceResource* const resource = GetUsbDeviceResource( 835 scoped_refptr<UsbDeviceHandle> device_handle =
609 parameters_->device.handle); 836 GetDeviceHandleOrCompleteWithError(parameters_->handle);
610 if (!resource) { 837 if (!device_handle) return;
611 CompleteWithError(kErrorNoDevice);
612 return;
613 }
614 838
615 resource->device()->Close(); 839 device_handle->Close();
616 RemoveUsbDeviceResource(parameters_->device.handle); 840 RemoveUsbDeviceResource(parameters_->handle.handle);
617 AsyncWorkCompleted(); 841 AsyncWorkCompleted();
618 } 842 }
619 843
620 UsbClaimInterfaceFunction::UsbClaimInterfaceFunction() {} 844 UsbClaimInterfaceFunction::UsbClaimInterfaceFunction() {}
621 845
622 UsbClaimInterfaceFunction::~UsbClaimInterfaceFunction() {} 846 UsbClaimInterfaceFunction::~UsbClaimInterfaceFunction() {}
623 847
624 bool UsbClaimInterfaceFunction::Prepare() { 848 bool UsbClaimInterfaceFunction::Prepare() {
625 parameters_ = ClaimInterface::Params::Create(*args_); 849 parameters_ = ClaimInterface::Params::Create(*args_);
626 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 850 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
627 return true; 851 return true;
628 } 852 }
629 853
630 void UsbClaimInterfaceFunction::AsyncWorkStart() { 854 void UsbClaimInterfaceFunction::AsyncWorkStart() {
631 UsbDeviceResource* resource = 855 scoped_refptr<UsbDeviceHandle> device_handle =
632 GetUsbDeviceResource(parameters_->device.handle); 856 GetDeviceHandleOrCompleteWithError(parameters_->handle);
633 if (!resource) { 857 if (!device_handle) return;
634 CompleteWithError(kErrorNoDevice);
635 return;
636 }
637 858
638 bool success = 859 bool success = device_handle->ClaimInterface(parameters_->interface_number);
639 resource->device()->ClaimInterface(parameters_->interface_number);
640 860
641 if (!success) 861 if (!success)
642 SetError(kErrorCannotClaimInterface); 862 SetError(kErrorCannotClaimInterface);
643 AsyncWorkCompleted(); 863 AsyncWorkCompleted();
644 } 864 }
645 865
646 UsbReleaseInterfaceFunction::UsbReleaseInterfaceFunction() {} 866 UsbReleaseInterfaceFunction::UsbReleaseInterfaceFunction() {}
647 867
648 UsbReleaseInterfaceFunction::~UsbReleaseInterfaceFunction() {} 868 UsbReleaseInterfaceFunction::~UsbReleaseInterfaceFunction() {}
649 869
650 bool UsbReleaseInterfaceFunction::Prepare() { 870 bool UsbReleaseInterfaceFunction::Prepare() {
651 parameters_ = ReleaseInterface::Params::Create(*args_); 871 parameters_ = ReleaseInterface::Params::Create(*args_);
652 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 872 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
653 return true; 873 return true;
654 } 874 }
655 875
656 void UsbReleaseInterfaceFunction::AsyncWorkStart() { 876 void UsbReleaseInterfaceFunction::AsyncWorkStart() {
657 UsbDeviceResource* resource = 877 scoped_refptr<UsbDeviceHandle> device_handle =
658 GetUsbDeviceResource(parameters_->device.handle); 878 GetDeviceHandleOrCompleteWithError(parameters_->handle);
659 if (!resource) { 879 if (!device_handle) return;
660 CompleteWithError(kErrorNoDevice); 880
661 return; 881 bool success = device_handle->ReleaseInterface(parameters_->interface_number);
662 }
663 bool success =
664 resource->device()->ReleaseInterface(parameters_->interface_number);
665 if (!success) 882 if (!success)
666 SetError(kErrorCannotReleaseInterface); 883 SetError(kErrorCannotReleaseInterface);
667 AsyncWorkCompleted(); 884 AsyncWorkCompleted();
668 } 885 }
669 886
670 UsbSetInterfaceAlternateSettingFunction:: 887 UsbSetInterfaceAlternateSettingFunction::
671 UsbSetInterfaceAlternateSettingFunction() {} 888 UsbSetInterfaceAlternateSettingFunction() {}
672 889
673 UsbSetInterfaceAlternateSettingFunction:: 890 UsbSetInterfaceAlternateSettingFunction::
674 ~UsbSetInterfaceAlternateSettingFunction() {} 891 ~UsbSetInterfaceAlternateSettingFunction() {}
675 892
676 bool UsbSetInterfaceAlternateSettingFunction::Prepare() { 893 bool UsbSetInterfaceAlternateSettingFunction::Prepare() {
677 parameters_ = SetInterfaceAlternateSetting::Params::Create(*args_); 894 parameters_ = SetInterfaceAlternateSetting::Params::Create(*args_);
678 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 895 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
679 return true; 896 return true;
680 } 897 }
681 898
682 void UsbSetInterfaceAlternateSettingFunction::AsyncWorkStart() { 899 void UsbSetInterfaceAlternateSettingFunction::AsyncWorkStart() {
683 UsbDeviceResource* resource = 900 scoped_refptr<UsbDeviceHandle> device_handle =
684 GetUsbDeviceResource(parameters_->device.handle); 901 GetDeviceHandleOrCompleteWithError(parameters_->handle);
685 if (!resource) { 902 if (!device_handle) return;
686 CompleteWithError(kErrorNoDevice);
687 return;
688 }
689 903
690 bool success = resource->device()->SetInterfaceAlternateSetting( 904 bool success = device_handle->SetInterfaceAlternateSetting(
691 parameters_->interface_number, 905 parameters_->interface_number,
692 parameters_->alternate_setting); 906 parameters_->alternate_setting);
693 if (!success) 907 if (!success)
694 SetError(kErrorCannotSetInterfaceAlternateSetting); 908 SetError(kErrorCannotSetInterfaceAlternateSetting);
695 909
696 AsyncWorkCompleted(); 910 AsyncWorkCompleted();
697 } 911 }
698 912
699 UsbControlTransferFunction::UsbControlTransferFunction() {} 913 UsbControlTransferFunction::UsbControlTransferFunction() {}
700 914
701 UsbControlTransferFunction::~UsbControlTransferFunction() {} 915 UsbControlTransferFunction::~UsbControlTransferFunction() {}
702 916
703 bool UsbControlTransferFunction::Prepare() { 917 bool UsbControlTransferFunction::Prepare() {
704 parameters_ = ControlTransfer::Params::Create(*args_); 918 parameters_ = ControlTransfer::Params::Create(*args_);
705 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 919 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
706 return true; 920 return true;
707 } 921 }
708 922
709 void UsbControlTransferFunction::AsyncWorkStart() { 923 void UsbControlTransferFunction::AsyncWorkStart() {
710 UsbDeviceResource* const resource = GetUsbDeviceResource( 924 scoped_refptr<UsbDeviceHandle> device_handle =
711 parameters_->device.handle); 925 GetDeviceHandleOrCompleteWithError(parameters_->handle);
712 if (!resource) { 926 if (!device_handle) return;
713 CompleteWithError(kErrorNoDevice);
714 return;
715 }
716 927
717 const ControlTransferInfo& transfer = parameters_->transfer_info; 928 const ControlTransferInfo& transfer = parameters_->transfer_info;
718 929
719 UsbEndpointDirection direction; 930 UsbEndpointDirection direction;
720 UsbDeviceHandle::TransferRequestType request_type; 931 UsbDeviceHandle::TransferRequestType request_type;
721 UsbDeviceHandle::TransferRecipient recipient; 932 UsbDeviceHandle::TransferRecipient recipient;
722 size_t size = 0; 933 size_t size = 0;
723 934
724 if (!ConvertDirectionSafely(transfer.direction, &direction) || 935 if (!ConvertDirectionSafely(transfer.direction, &direction) ||
725 !ConvertRequestTypeSafely(transfer.request_type, &request_type) || 936 !ConvertRequestTypeSafely(transfer.request_type, &request_type) ||
726 !ConvertRecipientSafely(transfer.recipient, &recipient)) { 937 !ConvertRecipientSafely(transfer.recipient, &recipient)) {
727 AsyncWorkCompleted(); 938 AsyncWorkCompleted();
728 return; 939 return;
729 } 940 }
730 941
731 if (!GetTransferSize(transfer, &size)) { 942 if (!GetTransferSize(transfer, &size)) {
732 CompleteWithError(kErrorInvalidTransferLength); 943 CompleteWithError(kErrorInvalidTransferLength);
733 return; 944 return;
734 } 945 }
735 946
736 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer( 947 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer(
737 transfer, direction, size); 948 transfer, direction, size);
738 if (!buffer.get()) { 949 if (!buffer.get()) {
739 CompleteWithError(kErrorMalformedParameters); 950 CompleteWithError(kErrorMalformedParameters);
740 return; 951 return;
741 } 952 }
742 953
743 resource->device()->ControlTransfer( 954 device_handle->ControlTransfer(
744 direction, 955 direction,
745 request_type, 956 request_type,
746 recipient, 957 recipient,
747 transfer.request, 958 transfer.request,
748 transfer.value, 959 transfer.value,
749 transfer.index, 960 transfer.index,
750 buffer.get(), 961 buffer.get(),
751 size, 962 size,
752 0, 963 0,
753 base::Bind(&UsbControlTransferFunction::OnCompleted, this)); 964 base::Bind(&UsbControlTransferFunction::OnCompleted, this));
754 } 965 }
755 966
756 UsbBulkTransferFunction::UsbBulkTransferFunction() {} 967 UsbBulkTransferFunction::UsbBulkTransferFunction() {}
757 968
758 UsbBulkTransferFunction::~UsbBulkTransferFunction() {} 969 UsbBulkTransferFunction::~UsbBulkTransferFunction() {}
759 970
760 bool UsbBulkTransferFunction::Prepare() { 971 bool UsbBulkTransferFunction::Prepare() {
761 parameters_ = BulkTransfer::Params::Create(*args_); 972 parameters_ = BulkTransfer::Params::Create(*args_);
762 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 973 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
763 return true; 974 return true;
764 } 975 }
765 976
766 void UsbBulkTransferFunction::AsyncWorkStart() { 977 void UsbBulkTransferFunction::AsyncWorkStart() {
767 UsbDeviceResource* const resource = GetUsbDeviceResource( 978 scoped_refptr<UsbDeviceHandle> device_handle =
768 parameters_->device.handle); 979 GetDeviceHandleOrCompleteWithError(parameters_->handle);
769 if (!resource) { 980 if (!device_handle) return;
770 CompleteWithError(kErrorNoDevice);
771 return;
772 }
773 981
774 const GenericTransferInfo& transfer = parameters_->transfer_info; 982 const GenericTransferInfo& transfer = parameters_->transfer_info;
775 983
776 UsbEndpointDirection direction; 984 UsbEndpointDirection direction;
777 size_t size = 0; 985 size_t size = 0;
778 986
779 if (!ConvertDirectionSafely(transfer.direction, &direction)) { 987 if (!ConvertDirectionSafely(transfer.direction, &direction)) {
780 AsyncWorkCompleted(); 988 AsyncWorkCompleted();
781 return; 989 return;
782 } 990 }
783 991
784 if (!GetTransferSize(transfer, &size)) { 992 if (!GetTransferSize(transfer, &size)) {
785 CompleteWithError(kErrorInvalidTransferLength); 993 CompleteWithError(kErrorInvalidTransferLength);
786 return; 994 return;
787 } 995 }
788 996
789 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer( 997 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer(
790 transfer, direction, size); 998 transfer, direction, size);
791 if (!buffer.get()) { 999 if (!buffer.get()) {
792 CompleteWithError(kErrorMalformedParameters); 1000 CompleteWithError(kErrorMalformedParameters);
793 return; 1001 return;
794 } 1002 }
795 1003
796 resource->device() 1004 device_handle->BulkTransfer(
797 ->BulkTransfer(direction, 1005 direction,
798 transfer.endpoint, 1006 transfer.endpoint,
799 buffer.get(), 1007 buffer.get(),
800 size, 1008 size,
801 0, 1009 0,
802 base::Bind(&UsbBulkTransferFunction::OnCompleted, this)); 1010 base::Bind(&UsbBulkTransferFunction::OnCompleted, this));
803 } 1011 }
804 1012
805 UsbInterruptTransferFunction::UsbInterruptTransferFunction() {} 1013 UsbInterruptTransferFunction::UsbInterruptTransferFunction() {}
806 1014
807 UsbInterruptTransferFunction::~UsbInterruptTransferFunction() {} 1015 UsbInterruptTransferFunction::~UsbInterruptTransferFunction() {}
808 1016
809 bool UsbInterruptTransferFunction::Prepare() { 1017 bool UsbInterruptTransferFunction::Prepare() {
810 parameters_ = InterruptTransfer::Params::Create(*args_); 1018 parameters_ = InterruptTransfer::Params::Create(*args_);
811 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 1019 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
812 return true; 1020 return true;
813 } 1021 }
814 1022
815 void UsbInterruptTransferFunction::AsyncWorkStart() { 1023 void UsbInterruptTransferFunction::AsyncWorkStart() {
816 UsbDeviceResource* const resource = GetUsbDeviceResource( 1024 scoped_refptr<UsbDeviceHandle> device_handle =
817 parameters_->device.handle); 1025 GetDeviceHandleOrCompleteWithError(parameters_->handle);
818 if (!resource) { 1026 if (!device_handle) return;
819 CompleteWithError(kErrorNoDevice);
820 return;
821 }
822 1027
823 const GenericTransferInfo& transfer = parameters_->transfer_info; 1028 const GenericTransferInfo& transfer = parameters_->transfer_info;
824 1029
825 UsbEndpointDirection direction; 1030 UsbEndpointDirection direction;
826 size_t size = 0; 1031 size_t size = 0;
827 1032
828 if (!ConvertDirectionSafely(transfer.direction, &direction)) { 1033 if (!ConvertDirectionSafely(transfer.direction, &direction)) {
829 AsyncWorkCompleted(); 1034 AsyncWorkCompleted();
830 return; 1035 return;
831 } 1036 }
832 1037
833 if (!GetTransferSize(transfer, &size)) { 1038 if (!GetTransferSize(transfer, &size)) {
834 CompleteWithError(kErrorInvalidTransferLength); 1039 CompleteWithError(kErrorInvalidTransferLength);
835 return; 1040 return;
836 } 1041 }
837 1042
838 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer( 1043 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer(
839 transfer, direction, size); 1044 transfer, direction, size);
840 if (!buffer.get()) { 1045 if (!buffer.get()) {
841 CompleteWithError(kErrorMalformedParameters); 1046 CompleteWithError(kErrorMalformedParameters);
842 return; 1047 return;
843 } 1048 }
844 1049
845 resource->device()->InterruptTransfer( 1050 device_handle->InterruptTransfer(
846 direction, 1051 direction,
847 transfer.endpoint, 1052 transfer.endpoint,
848 buffer.get(), 1053 buffer.get(),
849 size, 1054 size,
850 0, 1055 0,
851 base::Bind(&UsbInterruptTransferFunction::OnCompleted, this)); 1056 base::Bind(&UsbInterruptTransferFunction::OnCompleted, this));
852 } 1057 }
853 1058
854 UsbIsochronousTransferFunction::UsbIsochronousTransferFunction() {} 1059 UsbIsochronousTransferFunction::UsbIsochronousTransferFunction() {}
855 1060
856 UsbIsochronousTransferFunction::~UsbIsochronousTransferFunction() {} 1061 UsbIsochronousTransferFunction::~UsbIsochronousTransferFunction() {}
857 1062
858 bool UsbIsochronousTransferFunction::Prepare() { 1063 bool UsbIsochronousTransferFunction::Prepare() {
859 parameters_ = IsochronousTransfer::Params::Create(*args_); 1064 parameters_ = IsochronousTransfer::Params::Create(*args_);
860 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 1065 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
861 return true; 1066 return true;
862 } 1067 }
863 1068
864 void UsbIsochronousTransferFunction::AsyncWorkStart() { 1069 void UsbIsochronousTransferFunction::AsyncWorkStart() {
865 UsbDeviceResource* const resource = GetUsbDeviceResource( 1070 scoped_refptr<UsbDeviceHandle> device_handle =
866 parameters_->device.handle); 1071 GetDeviceHandleOrCompleteWithError(parameters_->handle);
867 if (!resource) { 1072 if (!device_handle) return;
868 CompleteWithError(kErrorNoDevice);
869 return;
870 }
871 1073
872 const IsochronousTransferInfo& transfer = parameters_->transfer_info; 1074 const IsochronousTransferInfo& transfer = parameters_->transfer_info;
873 const GenericTransferInfo& generic_transfer = transfer.transfer_info; 1075 const GenericTransferInfo& generic_transfer = transfer.transfer_info;
874 1076
875 size_t size = 0; 1077 size_t size = 0;
876 UsbEndpointDirection direction; 1078 UsbEndpointDirection direction;
877 1079
878 if (!ConvertDirectionSafely(generic_transfer.direction, &direction)) { 1080 if (!ConvertDirectionSafely(generic_transfer.direction, &direction)) {
879 AsyncWorkCompleted(); 1081 AsyncWorkCompleted();
880 return; 1082 return;
(...skipping 19 matching lines...) Expand all
900 return; 1102 return;
901 } 1103 }
902 1104
903 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer( 1105 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer(
904 generic_transfer, direction, size); 1106 generic_transfer, direction, size);
905 if (!buffer.get()) { 1107 if (!buffer.get()) {
906 CompleteWithError(kErrorMalformedParameters); 1108 CompleteWithError(kErrorMalformedParameters);
907 return; 1109 return;
908 } 1110 }
909 1111
910 resource->device()->IsochronousTransfer( 1112 device_handle->IsochronousTransfer(
911 direction, 1113 direction,
912 generic_transfer.endpoint, 1114 generic_transfer.endpoint,
913 buffer.get(), 1115 buffer.get(),
914 size, 1116 size,
915 packets, 1117 packets,
916 packet_length, 1118 packet_length,
917 0, 1119 0,
918 base::Bind(&UsbIsochronousTransferFunction::OnCompleted, this)); 1120 base::Bind(&UsbIsochronousTransferFunction::OnCompleted, this));
919 } 1121 }
920 1122
921 UsbResetDeviceFunction::UsbResetDeviceFunction() {} 1123 UsbResetDeviceFunction::UsbResetDeviceFunction() {}
922 1124
923 UsbResetDeviceFunction::~UsbResetDeviceFunction() {} 1125 UsbResetDeviceFunction::~UsbResetDeviceFunction() {}
924 1126
925 bool UsbResetDeviceFunction::Prepare() { 1127 bool UsbResetDeviceFunction::Prepare() {
926 parameters_ = ResetDevice::Params::Create(*args_); 1128 parameters_ = ResetDevice::Params::Create(*args_);
927 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 1129 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
928 return true; 1130 return true;
929 } 1131 }
930 1132
931 void UsbResetDeviceFunction::AsyncWorkStart() { 1133 void UsbResetDeviceFunction::AsyncWorkStart() {
932 UsbDeviceResource* const resource = GetUsbDeviceResource( 1134 scoped_refptr<UsbDeviceHandle> device_handle =
933 parameters_->device.handle); 1135 GetDeviceHandleOrCompleteWithError(parameters_->handle);
934 if (!resource) { 1136 if (!device_handle) return;
935 CompleteWithError(kErrorNoDevice); 1137
1138 bool success = device_handle->ResetDevice();
1139 if (!success) {
1140 device_handle->Close();
1141 RemoveUsbDeviceResource(parameters_->handle.handle);
1142 SetResult(new base::FundamentalValue(false));
1143 CompleteWithError(kErrorResetDevice);
936 return; 1144 return;
937 } 1145 }
938 1146
939 bool success = resource->device()->ResetDevice();
940 if (!success) {
941 UsbDeviceResource* const resource = GetUsbDeviceResource(
942 parameters_->device.handle);
943 if (!resource) {
944 CompleteWithError(kErrorNoDevice);
945 return;
946 }
947 resource->device()->Close();
948 RemoveUsbDeviceResource(parameters_->device.handle);
949 SetError(kErrorResetDevice);
950 SetResult(new base::FundamentalValue(false));
951 AsyncWorkCompleted();
952 return;
953 }
954 SetResult(new base::FundamentalValue(true)); 1147 SetResult(new base::FundamentalValue(true));
955 AsyncWorkCompleted(); 1148 AsyncWorkCompleted();
956 } 1149 }
957 1150
958 } // namespace extensions 1151 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698