OLD | NEW |
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 Loading... |
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, ¶m)) { |
| 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 Loading... |
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, ¶m)) { | 533 GetExtension(), APIPermission::kUsbDevice, ¶m)) { |
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, ¶m)) { |
| 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 Loading... |
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 Loading... |
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 |
OLD | NEW |