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

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: Rebase to origin/master 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 scoped_ptr<base::ListValue> result(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)); 521 SetResult(result.release());
426 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) { 566 base::ListValue* result = new base::ListValue();
567
453 for (size_t i = 0; i < devices->size(); ++i) { 568 for (size_t i = 0; i < devices->size(); ++i) {
454 scoped_refptr<UsbDeviceHandle> device_handle = 569 scoped_refptr<UsbDeviceHandle> device_handle =
455 devices->at(i)->Open(); 570 devices->at(i)->Open();
456 if (device_handle) 571 if (device_handle)
457 device_handles_.push_back(device_handle); 572 device_handles_.push_back(device_handle);
458 } 573 }
459 574
460 for (size_t i = 0; i < device_handles_.size(); ++i) { 575 for (size_t i = 0; i < device_handles_.size(); ++i) {
461 UsbDeviceHandle* const device_handle = device_handles_[i].get(); 576 UsbDeviceHandle* const device_handle = device_handles_[i].get();
462 UsbDeviceResource* const resource = 577 UsbDeviceResource* const resource =
463 new UsbDeviceResource(extension_->id(), device_handle); 578 new UsbDeviceResource(extension_->id(), device_handle);
464 579
465 result_->Append(PopulateDevice(manager_->Add(resource), 580 result->Append(PopulateConnectionHandle(manager_->Add(resource),
466 parameters_->options.vendor_id, 581 parameters_->options.vendor_id,
467 parameters_->options.product_id)); 582 parameters_->options.product_id));
468 } 583 }
469 584
470 SetResult(result_.release()); 585 SetResult(result);
471 AsyncWorkCompleted(); 586 AsyncWorkCompleted();
472 } 587 }
473 588
589 UsbGetDevicesFunction::UsbGetDevicesFunction() {
590 }
591
592 UsbGetDevicesFunction::~UsbGetDevicesFunction() {
593 }
594
595 void UsbGetDevicesFunction::SetDeviceForTest(UsbDevice* device) {
596 g_device_for_test = device;
597 }
598
599 bool UsbGetDevicesFunction::Prepare() {
600 parameters_ = GetDevices::Params::Create(*args_);
601 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
602 return true;
603 }
604
605 void UsbGetDevicesFunction::AsyncWorkStart() {
606 scoped_ptr<base::ListValue> result(new base::ListValue());
607
608 if (g_device_for_test) {
609 result->Append(PopulateDevice(g_device_for_test));
610 SetResult(result.release());
611 AsyncWorkCompleted();
612 return;
613 }
614
615 const uint16_t vendor_id = parameters_->options.vendor_id;
616 const uint16_t product_id = parameters_->options.product_id;
617 UsbDevicePermission::CheckParam param(
618 vendor_id, product_id, UsbDevicePermissionData::UNSPECIFIED_INTERFACE);
619 if (!PermissionsData::CheckAPIPermissionWithParam(
620 GetExtension(), APIPermission::kUsbDevice, &param)) {
621 LOG(WARNING) << "Insufficient permissions to access device.";
622 CompleteWithError(kErrorPermissionDenied);
623 return;
624 }
625
626 UsbService* service = UsbService::GetInstance();
627 DeviceVector devices;
628 service->GetDevices(&devices);
629
630 for (DeviceVector::iterator it = devices.begin(); it != devices.end();) {
631 if ((*it)->vendor_id() != vendor_id || (*it)->product_id() != product_id) {
632 it = devices.erase(it);
633 } else {
634 ++it;
635 }
636 }
637
638 for (size_t i = 0; i < devices.size(); ++i) {
639 result->Append(PopulateDevice(devices[i].get()));
640 }
641
642 SetResult(result.release());
643 AsyncWorkCompleted();
644 }
645
646 UsbRequestAccessFunction::UsbRequestAccessFunction() {}
647
648 UsbRequestAccessFunction::~UsbRequestAccessFunction() {}
649
650 bool UsbRequestAccessFunction::Prepare() {
651 parameters_ = RequestAccess::Params::Create(*args_);
652 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
653 return true;
654 }
655
656 void UsbRequestAccessFunction::AsyncWorkStart() {
657 #if defined(OS_CHROMEOS)
658 scoped_refptr<UsbDevice> device =
659 GetDeviceOrOrCompleteWithError(parameters_->device);
660 if (!device) return;
661
662 device->RequestUsbAcess(parameters_->interface_id,
663 base::Bind(&UsbRequestAccessFunction::OnCompleted,
664 this));
665 #else
666 SetResult(new base::FundamentalValue(false));
667 CompleteWithError(kErrorNotSupported);
668 #endif // OS_CHROMEOS
669 }
670
671 void UsbRequestAccessFunction::OnCompleted(bool success) {
672 SetResult(new base::FundamentalValue(success));
673 AsyncWorkCompleted();
674 }
675
676 UsbOpenDeviceFunction::UsbOpenDeviceFunction() {}
677
678 UsbOpenDeviceFunction::~UsbOpenDeviceFunction() {}
679
680 bool UsbOpenDeviceFunction::Prepare() {
681 parameters_ = OpenDevice::Params::Create(*args_);
682 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
683 return true;
684 }
685
686 void UsbOpenDeviceFunction::AsyncWorkStart() {
687 scoped_refptr<UsbDevice> device =
688 GetDeviceOrOrCompleteWithError(parameters_->device);
689 if (!device) return;
690
691 handle_ = device->Open();
692 if (!handle_) {
693 SetError(kErrorOpen);
694 AsyncWorkCompleted();
695 return;
696 }
697
698 SetResult(PopulateConnectionHandle(
699 manager_->Add(new UsbDeviceResource(extension_->id(), handle_)),
700 handle_->device()->vendor_id(),
701 handle_->device()->product_id()));
702 AsyncWorkCompleted();
703 }
704
474 UsbListInterfacesFunction::UsbListInterfacesFunction() {} 705 UsbListInterfacesFunction::UsbListInterfacesFunction() {}
475 706
476 UsbListInterfacesFunction::~UsbListInterfacesFunction() {} 707 UsbListInterfacesFunction::~UsbListInterfacesFunction() {}
477 708
478 bool UsbListInterfacesFunction::Prepare() { 709 bool UsbListInterfacesFunction::Prepare() {
479 parameters_ = ListInterfaces::Params::Create(*args_); 710 parameters_ = ListInterfaces::Params::Create(*args_);
480 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 711 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
481 return true; 712 return true;
482 } 713 }
483 714
484 void UsbListInterfacesFunction::AsyncWorkStart() { 715 void UsbListInterfacesFunction::AsyncWorkStart() {
485 UsbDeviceResource* const resource = GetUsbDeviceResource( 716 scoped_refptr<UsbDeviceHandle> device_handle =
486 parameters_->device.handle); 717 GetDeviceHandleOrCompleteWithError(parameters_->handle);
487 if (!resource) { 718 if (!device_handle) return;
488 CompleteWithError(kErrorNoDevice);
489 return;
490 }
491 719
492 scoped_refptr<UsbConfigDescriptor> config = 720 scoped_refptr<UsbConfigDescriptor> config =
493 resource->device()->device()->ListInterfaces(); 721 device_handle->device()->ListInterfaces();
494 722
495 if (!config) { 723 if (!config) {
496 SetError(kErrorCannotListInterfaces); 724 SetError(kErrorCannotListInterfaces);
497 AsyncWorkCompleted(); 725 AsyncWorkCompleted();
498 return; 726 return;
499 } 727 }
500 728
501 result_.reset(new base::ListValue()); 729 result_.reset(new base::ListValue());
502 730
503 for (size_t i = 0, num_interfaces = config->GetNumInterfaces(); 731 for (size_t i = 0, num_interfaces = config->GetNumInterfaces();
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 &endpoints)); 781 &endpoints));
554 } 782 }
555 } 783 }
556 784
557 SetResult(result_.release()); 785 SetResult(result_.release());
558 AsyncWorkCompleted(); 786 AsyncWorkCompleted();
559 } 787 }
560 788
561 bool UsbListInterfacesFunction::ConvertDirectionSafely( 789 bool UsbListInterfacesFunction::ConvertDirectionSafely(
562 const UsbEndpointDirection& input, 790 const UsbEndpointDirection& input,
563 extensions::api::usb::Direction* output) { 791 usb::Direction* output) {
564 const bool converted = ConvertDirectionToApi(input, output); 792 const bool converted = ConvertDirectionToApi(input, output);
565 if (!converted) 793 if (!converted)
566 SetError(kErrorConvertDirection); 794 SetError(kErrorConvertDirection);
567 return converted; 795 return converted;
568 } 796 }
569 797
570 bool UsbListInterfacesFunction::ConvertSynchronizationTypeSafely( 798 bool UsbListInterfacesFunction::ConvertSynchronizationTypeSafely(
571 const UsbSynchronizationType& input, 799 const UsbSynchronizationType& input,
572 extensions::api::usb::SynchronizationType* output) { 800 usb::SynchronizationType* output) {
573 const bool converted = ConvertSynchronizationTypeToApi(input, output); 801 const bool converted = ConvertSynchronizationTypeToApi(input, output);
574 if (!converted) 802 if (!converted)
575 SetError(kErrorConvertSynchronizationType); 803 SetError(kErrorConvertSynchronizationType);
576 return converted; 804 return converted;
577 } 805 }
578 806
579 bool UsbListInterfacesFunction::ConvertTransferTypeSafely( 807 bool UsbListInterfacesFunction::ConvertTransferTypeSafely(
580 const UsbTransferType& input, 808 const UsbTransferType& input,
581 extensions::api::usb::TransferType* output) { 809 usb::TransferType* output) {
582 const bool converted = ConvertTransferTypeToApi(input, output); 810 const bool converted = ConvertTransferTypeToApi(input, output);
583 if (!converted) 811 if (!converted)
584 SetError(kErrorConvertTransferType); 812 SetError(kErrorConvertTransferType);
585 return converted; 813 return converted;
586 } 814 }
587 815
588 bool UsbListInterfacesFunction::ConvertUsageTypeSafely( 816 bool UsbListInterfacesFunction::ConvertUsageTypeSafely(
589 const UsbUsageType& input, 817 const UsbUsageType& input,
590 extensions::api::usb::UsageType* output) { 818 usb::UsageType* output) {
591 const bool converted = ConvertUsageTypeToApi(input, output); 819 const bool converted = ConvertUsageTypeToApi(input, output);
592 if (!converted) 820 if (!converted)
593 SetError(kErrorConvertUsageType); 821 SetError(kErrorConvertUsageType);
594 return converted; 822 return converted;
595 } 823 }
596 824
597 UsbCloseDeviceFunction::UsbCloseDeviceFunction() {} 825 UsbCloseDeviceFunction::UsbCloseDeviceFunction() {}
598 826
599 UsbCloseDeviceFunction::~UsbCloseDeviceFunction() {} 827 UsbCloseDeviceFunction::~UsbCloseDeviceFunction() {}
600 828
601 bool UsbCloseDeviceFunction::Prepare() { 829 bool UsbCloseDeviceFunction::Prepare() {
602 parameters_ = CloseDevice::Params::Create(*args_); 830 parameters_ = CloseDevice::Params::Create(*args_);
603 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 831 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
604 return true; 832 return true;
605 } 833 }
606 834
607 void UsbCloseDeviceFunction::AsyncWorkStart() { 835 void UsbCloseDeviceFunction::AsyncWorkStart() {
608 UsbDeviceResource* const resource = GetUsbDeviceResource( 836 scoped_refptr<UsbDeviceHandle> device_handle =
609 parameters_->device.handle); 837 GetDeviceHandleOrCompleteWithError(parameters_->handle);
610 if (!resource) { 838 if (!device_handle) return;
611 CompleteWithError(kErrorNoDevice);
612 return;
613 }
614 839
615 resource->device()->Close(); 840 device_handle->Close();
616 RemoveUsbDeviceResource(parameters_->device.handle); 841 RemoveUsbDeviceResource(parameters_->handle.handle);
617 AsyncWorkCompleted(); 842 AsyncWorkCompleted();
618 } 843 }
619 844
620 UsbClaimInterfaceFunction::UsbClaimInterfaceFunction() {} 845 UsbClaimInterfaceFunction::UsbClaimInterfaceFunction() {}
621 846
622 UsbClaimInterfaceFunction::~UsbClaimInterfaceFunction() {} 847 UsbClaimInterfaceFunction::~UsbClaimInterfaceFunction() {}
623 848
624 bool UsbClaimInterfaceFunction::Prepare() { 849 bool UsbClaimInterfaceFunction::Prepare() {
625 parameters_ = ClaimInterface::Params::Create(*args_); 850 parameters_ = ClaimInterface::Params::Create(*args_);
626 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 851 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
627 return true; 852 return true;
628 } 853 }
629 854
630 void UsbClaimInterfaceFunction::AsyncWorkStart() { 855 void UsbClaimInterfaceFunction::AsyncWorkStart() {
631 UsbDeviceResource* resource = 856 scoped_refptr<UsbDeviceHandle> device_handle =
632 GetUsbDeviceResource(parameters_->device.handle); 857 GetDeviceHandleOrCompleteWithError(parameters_->handle);
633 if (!resource) { 858 if (!device_handle) return;
634 CompleteWithError(kErrorNoDevice);
635 return;
636 }
637 859
638 bool success = 860 bool success = device_handle->ClaimInterface(parameters_->interface_number);
639 resource->device()->ClaimInterface(parameters_->interface_number);
640 861
641 if (!success) 862 if (!success)
642 SetError(kErrorCannotClaimInterface); 863 SetError(kErrorCannotClaimInterface);
643 AsyncWorkCompleted(); 864 AsyncWorkCompleted();
644 } 865 }
645 866
646 UsbReleaseInterfaceFunction::UsbReleaseInterfaceFunction() {} 867 UsbReleaseInterfaceFunction::UsbReleaseInterfaceFunction() {}
647 868
648 UsbReleaseInterfaceFunction::~UsbReleaseInterfaceFunction() {} 869 UsbReleaseInterfaceFunction::~UsbReleaseInterfaceFunction() {}
649 870
650 bool UsbReleaseInterfaceFunction::Prepare() { 871 bool UsbReleaseInterfaceFunction::Prepare() {
651 parameters_ = ReleaseInterface::Params::Create(*args_); 872 parameters_ = ReleaseInterface::Params::Create(*args_);
652 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 873 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
653 return true; 874 return true;
654 } 875 }
655 876
656 void UsbReleaseInterfaceFunction::AsyncWorkStart() { 877 void UsbReleaseInterfaceFunction::AsyncWorkStart() {
657 UsbDeviceResource* resource = 878 scoped_refptr<UsbDeviceHandle> device_handle =
658 GetUsbDeviceResource(parameters_->device.handle); 879 GetDeviceHandleOrCompleteWithError(parameters_->handle);
659 if (!resource) { 880 if (!device_handle) return;
660 CompleteWithError(kErrorNoDevice); 881
661 return; 882 bool success = device_handle->ReleaseInterface(parameters_->interface_number);
662 }
663 bool success =
664 resource->device()->ReleaseInterface(parameters_->interface_number);
665 if (!success) 883 if (!success)
666 SetError(kErrorCannotReleaseInterface); 884 SetError(kErrorCannotReleaseInterface);
667 AsyncWorkCompleted(); 885 AsyncWorkCompleted();
668 } 886 }
669 887
670 UsbSetInterfaceAlternateSettingFunction:: 888 UsbSetInterfaceAlternateSettingFunction::
671 UsbSetInterfaceAlternateSettingFunction() {} 889 UsbSetInterfaceAlternateSettingFunction() {}
672 890
673 UsbSetInterfaceAlternateSettingFunction:: 891 UsbSetInterfaceAlternateSettingFunction::
674 ~UsbSetInterfaceAlternateSettingFunction() {} 892 ~UsbSetInterfaceAlternateSettingFunction() {}
675 893
676 bool UsbSetInterfaceAlternateSettingFunction::Prepare() { 894 bool UsbSetInterfaceAlternateSettingFunction::Prepare() {
677 parameters_ = SetInterfaceAlternateSetting::Params::Create(*args_); 895 parameters_ = SetInterfaceAlternateSetting::Params::Create(*args_);
678 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 896 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
679 return true; 897 return true;
680 } 898 }
681 899
682 void UsbSetInterfaceAlternateSettingFunction::AsyncWorkStart() { 900 void UsbSetInterfaceAlternateSettingFunction::AsyncWorkStart() {
683 UsbDeviceResource* resource = 901 scoped_refptr<UsbDeviceHandle> device_handle =
684 GetUsbDeviceResource(parameters_->device.handle); 902 GetDeviceHandleOrCompleteWithError(parameters_->handle);
685 if (!resource) { 903 if (!device_handle) return;
686 CompleteWithError(kErrorNoDevice);
687 return;
688 }
689 904
690 bool success = resource->device()->SetInterfaceAlternateSetting( 905 bool success = device_handle->SetInterfaceAlternateSetting(
691 parameters_->interface_number, 906 parameters_->interface_number,
692 parameters_->alternate_setting); 907 parameters_->alternate_setting);
693 if (!success) 908 if (!success)
694 SetError(kErrorCannotSetInterfaceAlternateSetting); 909 SetError(kErrorCannotSetInterfaceAlternateSetting);
695 910
696 AsyncWorkCompleted(); 911 AsyncWorkCompleted();
697 } 912 }
698 913
699 UsbControlTransferFunction::UsbControlTransferFunction() {} 914 UsbControlTransferFunction::UsbControlTransferFunction() {}
700 915
701 UsbControlTransferFunction::~UsbControlTransferFunction() {} 916 UsbControlTransferFunction::~UsbControlTransferFunction() {}
702 917
703 bool UsbControlTransferFunction::Prepare() { 918 bool UsbControlTransferFunction::Prepare() {
704 parameters_ = ControlTransfer::Params::Create(*args_); 919 parameters_ = ControlTransfer::Params::Create(*args_);
705 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 920 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
706 return true; 921 return true;
707 } 922 }
708 923
709 void UsbControlTransferFunction::AsyncWorkStart() { 924 void UsbControlTransferFunction::AsyncWorkStart() {
710 UsbDeviceResource* const resource = GetUsbDeviceResource( 925 scoped_refptr<UsbDeviceHandle> device_handle =
711 parameters_->device.handle); 926 GetDeviceHandleOrCompleteWithError(parameters_->handle);
712 if (!resource) { 927 if (!device_handle) return;
713 CompleteWithError(kErrorNoDevice);
714 return;
715 }
716 928
717 const ControlTransferInfo& transfer = parameters_->transfer_info; 929 const ControlTransferInfo& transfer = parameters_->transfer_info;
718 930
719 UsbEndpointDirection direction; 931 UsbEndpointDirection direction;
720 UsbDeviceHandle::TransferRequestType request_type; 932 UsbDeviceHandle::TransferRequestType request_type;
721 UsbDeviceHandle::TransferRecipient recipient; 933 UsbDeviceHandle::TransferRecipient recipient;
722 size_t size = 0; 934 size_t size = 0;
723 935
724 if (!ConvertDirectionSafely(transfer.direction, &direction) || 936 if (!ConvertDirectionSafely(transfer.direction, &direction) ||
725 !ConvertRequestTypeSafely(transfer.request_type, &request_type) || 937 !ConvertRequestTypeSafely(transfer.request_type, &request_type) ||
726 !ConvertRecipientSafely(transfer.recipient, &recipient)) { 938 !ConvertRecipientSafely(transfer.recipient, &recipient)) {
727 AsyncWorkCompleted(); 939 AsyncWorkCompleted();
728 return; 940 return;
729 } 941 }
730 942
731 if (!GetTransferSize(transfer, &size)) { 943 if (!GetTransferSize(transfer, &size)) {
732 CompleteWithError(kErrorInvalidTransferLength); 944 CompleteWithError(kErrorInvalidTransferLength);
733 return; 945 return;
734 } 946 }
735 947
736 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer( 948 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer(
737 transfer, direction, size); 949 transfer, direction, size);
738 if (!buffer.get()) { 950 if (!buffer.get()) {
739 CompleteWithError(kErrorMalformedParameters); 951 CompleteWithError(kErrorMalformedParameters);
740 return; 952 return;
741 } 953 }
742 954
743 resource->device()->ControlTransfer( 955 device_handle->ControlTransfer(
744 direction, 956 direction,
745 request_type, 957 request_type,
746 recipient, 958 recipient,
747 transfer.request, 959 transfer.request,
748 transfer.value, 960 transfer.value,
749 transfer.index, 961 transfer.index,
750 buffer.get(), 962 buffer.get(),
751 size, 963 size,
752 0, 964 0,
753 base::Bind(&UsbControlTransferFunction::OnCompleted, this)); 965 base::Bind(&UsbControlTransferFunction::OnCompleted, this));
754 } 966 }
755 967
756 UsbBulkTransferFunction::UsbBulkTransferFunction() {} 968 UsbBulkTransferFunction::UsbBulkTransferFunction() {}
757 969
758 UsbBulkTransferFunction::~UsbBulkTransferFunction() {} 970 UsbBulkTransferFunction::~UsbBulkTransferFunction() {}
759 971
760 bool UsbBulkTransferFunction::Prepare() { 972 bool UsbBulkTransferFunction::Prepare() {
761 parameters_ = BulkTransfer::Params::Create(*args_); 973 parameters_ = BulkTransfer::Params::Create(*args_);
762 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 974 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
763 return true; 975 return true;
764 } 976 }
765 977
766 void UsbBulkTransferFunction::AsyncWorkStart() { 978 void UsbBulkTransferFunction::AsyncWorkStart() {
767 UsbDeviceResource* const resource = GetUsbDeviceResource( 979 scoped_refptr<UsbDeviceHandle> device_handle =
768 parameters_->device.handle); 980 GetDeviceHandleOrCompleteWithError(parameters_->handle);
769 if (!resource) { 981 if (!device_handle) return;
770 CompleteWithError(kErrorNoDevice);
771 return;
772 }
773 982
774 const GenericTransferInfo& transfer = parameters_->transfer_info; 983 const GenericTransferInfo& transfer = parameters_->transfer_info;
775 984
776 UsbEndpointDirection direction; 985 UsbEndpointDirection direction;
777 size_t size = 0; 986 size_t size = 0;
778 987
779 if (!ConvertDirectionSafely(transfer.direction, &direction)) { 988 if (!ConvertDirectionSafely(transfer.direction, &direction)) {
780 AsyncWorkCompleted(); 989 AsyncWorkCompleted();
781 return; 990 return;
782 } 991 }
783 992
784 if (!GetTransferSize(transfer, &size)) { 993 if (!GetTransferSize(transfer, &size)) {
785 CompleteWithError(kErrorInvalidTransferLength); 994 CompleteWithError(kErrorInvalidTransferLength);
786 return; 995 return;
787 } 996 }
788 997
789 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer( 998 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer(
790 transfer, direction, size); 999 transfer, direction, size);
791 if (!buffer.get()) { 1000 if (!buffer.get()) {
792 CompleteWithError(kErrorMalformedParameters); 1001 CompleteWithError(kErrorMalformedParameters);
793 return; 1002 return;
794 } 1003 }
795 1004
796 resource->device() 1005 device_handle->BulkTransfer(
797 ->BulkTransfer(direction, 1006 direction,
798 transfer.endpoint, 1007 transfer.endpoint,
799 buffer.get(), 1008 buffer.get(),
800 size, 1009 size,
801 0, 1010 0,
802 base::Bind(&UsbBulkTransferFunction::OnCompleted, this)); 1011 base::Bind(&UsbBulkTransferFunction::OnCompleted, this));
803 } 1012 }
804 1013
805 UsbInterruptTransferFunction::UsbInterruptTransferFunction() {} 1014 UsbInterruptTransferFunction::UsbInterruptTransferFunction() {}
806 1015
807 UsbInterruptTransferFunction::~UsbInterruptTransferFunction() {} 1016 UsbInterruptTransferFunction::~UsbInterruptTransferFunction() {}
808 1017
809 bool UsbInterruptTransferFunction::Prepare() { 1018 bool UsbInterruptTransferFunction::Prepare() {
810 parameters_ = InterruptTransfer::Params::Create(*args_); 1019 parameters_ = InterruptTransfer::Params::Create(*args_);
811 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 1020 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
812 return true; 1021 return true;
813 } 1022 }
814 1023
815 void UsbInterruptTransferFunction::AsyncWorkStart() { 1024 void UsbInterruptTransferFunction::AsyncWorkStart() {
816 UsbDeviceResource* const resource = GetUsbDeviceResource( 1025 scoped_refptr<UsbDeviceHandle> device_handle =
817 parameters_->device.handle); 1026 GetDeviceHandleOrCompleteWithError(parameters_->handle);
818 if (!resource) { 1027 if (!device_handle) return;
819 CompleteWithError(kErrorNoDevice);
820 return;
821 }
822 1028
823 const GenericTransferInfo& transfer = parameters_->transfer_info; 1029 const GenericTransferInfo& transfer = parameters_->transfer_info;
824 1030
825 UsbEndpointDirection direction; 1031 UsbEndpointDirection direction;
826 size_t size = 0; 1032 size_t size = 0;
827 1033
828 if (!ConvertDirectionSafely(transfer.direction, &direction)) { 1034 if (!ConvertDirectionSafely(transfer.direction, &direction)) {
829 AsyncWorkCompleted(); 1035 AsyncWorkCompleted();
830 return; 1036 return;
831 } 1037 }
832 1038
833 if (!GetTransferSize(transfer, &size)) { 1039 if (!GetTransferSize(transfer, &size)) {
834 CompleteWithError(kErrorInvalidTransferLength); 1040 CompleteWithError(kErrorInvalidTransferLength);
835 return; 1041 return;
836 } 1042 }
837 1043
838 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer( 1044 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer(
839 transfer, direction, size); 1045 transfer, direction, size);
840 if (!buffer.get()) { 1046 if (!buffer.get()) {
841 CompleteWithError(kErrorMalformedParameters); 1047 CompleteWithError(kErrorMalformedParameters);
842 return; 1048 return;
843 } 1049 }
844 1050
845 resource->device()->InterruptTransfer( 1051 device_handle->InterruptTransfer(
846 direction, 1052 direction,
847 transfer.endpoint, 1053 transfer.endpoint,
848 buffer.get(), 1054 buffer.get(),
849 size, 1055 size,
850 0, 1056 0,
851 base::Bind(&UsbInterruptTransferFunction::OnCompleted, this)); 1057 base::Bind(&UsbInterruptTransferFunction::OnCompleted, this));
852 } 1058 }
853 1059
854 UsbIsochronousTransferFunction::UsbIsochronousTransferFunction() {} 1060 UsbIsochronousTransferFunction::UsbIsochronousTransferFunction() {}
855 1061
856 UsbIsochronousTransferFunction::~UsbIsochronousTransferFunction() {} 1062 UsbIsochronousTransferFunction::~UsbIsochronousTransferFunction() {}
857 1063
858 bool UsbIsochronousTransferFunction::Prepare() { 1064 bool UsbIsochronousTransferFunction::Prepare() {
859 parameters_ = IsochronousTransfer::Params::Create(*args_); 1065 parameters_ = IsochronousTransfer::Params::Create(*args_);
860 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 1066 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
861 return true; 1067 return true;
862 } 1068 }
863 1069
864 void UsbIsochronousTransferFunction::AsyncWorkStart() { 1070 void UsbIsochronousTransferFunction::AsyncWorkStart() {
865 UsbDeviceResource* const resource = GetUsbDeviceResource( 1071 scoped_refptr<UsbDeviceHandle> device_handle =
866 parameters_->device.handle); 1072 GetDeviceHandleOrCompleteWithError(parameters_->handle);
867 if (!resource) { 1073 if (!device_handle) return;
868 CompleteWithError(kErrorNoDevice);
869 return;
870 }
871 1074
872 const IsochronousTransferInfo& transfer = parameters_->transfer_info; 1075 const IsochronousTransferInfo& transfer = parameters_->transfer_info;
873 const GenericTransferInfo& generic_transfer = transfer.transfer_info; 1076 const GenericTransferInfo& generic_transfer = transfer.transfer_info;
874 1077
875 size_t size = 0; 1078 size_t size = 0;
876 UsbEndpointDirection direction; 1079 UsbEndpointDirection direction;
877 1080
878 if (!ConvertDirectionSafely(generic_transfer.direction, &direction)) { 1081 if (!ConvertDirectionSafely(generic_transfer.direction, &direction)) {
879 AsyncWorkCompleted(); 1082 AsyncWorkCompleted();
880 return; 1083 return;
(...skipping 19 matching lines...) Expand all
900 return; 1103 return;
901 } 1104 }
902 1105
903 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer( 1106 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer(
904 generic_transfer, direction, size); 1107 generic_transfer, direction, size);
905 if (!buffer.get()) { 1108 if (!buffer.get()) {
906 CompleteWithError(kErrorMalformedParameters); 1109 CompleteWithError(kErrorMalformedParameters);
907 return; 1110 return;
908 } 1111 }
909 1112
910 resource->device()->IsochronousTransfer( 1113 device_handle->IsochronousTransfer(
911 direction, 1114 direction,
912 generic_transfer.endpoint, 1115 generic_transfer.endpoint,
913 buffer.get(), 1116 buffer.get(),
914 size, 1117 size,
915 packets, 1118 packets,
916 packet_length, 1119 packet_length,
917 0, 1120 0,
918 base::Bind(&UsbIsochronousTransferFunction::OnCompleted, this)); 1121 base::Bind(&UsbIsochronousTransferFunction::OnCompleted, this));
919 } 1122 }
920 1123
921 UsbResetDeviceFunction::UsbResetDeviceFunction() {} 1124 UsbResetDeviceFunction::UsbResetDeviceFunction() {}
922 1125
923 UsbResetDeviceFunction::~UsbResetDeviceFunction() {} 1126 UsbResetDeviceFunction::~UsbResetDeviceFunction() {}
924 1127
925 bool UsbResetDeviceFunction::Prepare() { 1128 bool UsbResetDeviceFunction::Prepare() {
926 parameters_ = ResetDevice::Params::Create(*args_); 1129 parameters_ = ResetDevice::Params::Create(*args_);
927 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 1130 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
928 return true; 1131 return true;
929 } 1132 }
930 1133
931 void UsbResetDeviceFunction::AsyncWorkStart() { 1134 void UsbResetDeviceFunction::AsyncWorkStart() {
932 UsbDeviceResource* const resource = GetUsbDeviceResource( 1135 scoped_refptr<UsbDeviceHandle> device_handle =
933 parameters_->device.handle); 1136 GetDeviceHandleOrCompleteWithError(parameters_->handle);
934 if (!resource) { 1137 if (!device_handle) return;
935 CompleteWithError(kErrorNoDevice); 1138
1139 bool success = device_handle->ResetDevice();
1140 if (!success) {
1141 device_handle->Close();
1142 RemoveUsbDeviceResource(parameters_->handle.handle);
1143 SetResult(new base::FundamentalValue(false));
1144 CompleteWithError(kErrorResetDevice);
936 return; 1145 return;
937 } 1146 }
938 1147
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)); 1148 SetResult(new base::FundamentalValue(true));
955 AsyncWorkCompleted(); 1149 AsyncWorkCompleted();
956 } 1150 }
957 1151
958 } // namespace extensions 1152 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/api/usb/usb_api.h ('k') | chrome/browser/extensions/api/usb/usb_apitest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698