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 "base/message_loop/message_loop_proxy.h" |
12 #include "chrome/browser/extensions/api/usb/usb_device_resource.h" | 12 #include "chrome/browser/extensions/api/usb/usb_device_resource.h" |
13 #include "chrome/browser/usb/usb_device_handle.h" | |
14 #include "chrome/browser/usb/usb_service.h" | |
15 #include "chrome/common/extensions/api/usb.h" | 13 #include "chrome/common/extensions/api/usb.h" |
| 14 #include "components/usb_service/usb_device_handle.h" |
| 15 #include "components/usb_service/usb_service.h" |
16 #include "extensions/browser/extension_system.h" | 16 #include "extensions/browser/extension_system.h" |
17 #include "extensions/common/permissions/permissions_data.h" | 17 #include "extensions/common/permissions/permissions_data.h" |
18 #include "extensions/common/permissions/usb_device_permission.h" | 18 #include "extensions/common/permissions/usb_device_permission.h" |
19 | 19 |
20 namespace usb = extensions::api::usb; | 20 namespace usb = extensions::api::usb; |
21 namespace BulkTransfer = usb::BulkTransfer; | 21 namespace BulkTransfer = usb::BulkTransfer; |
22 namespace ClaimInterface = usb::ClaimInterface; | 22 namespace ClaimInterface = usb::ClaimInterface; |
23 namespace CloseDevice = usb::CloseDevice; | 23 namespace CloseDevice = usb::CloseDevice; |
24 namespace ControlTransfer = usb::ControlTransfer; | 24 namespace ControlTransfer = usb::ControlTransfer; |
25 namespace FindDevices = usb::FindDevices; | 25 namespace FindDevices = usb::FindDevices; |
(...skipping 16 matching lines...) Expand all Loading... |
42 using usb::Direction; | 42 using usb::Direction; |
43 using usb::EndpointDescriptor; | 43 using usb::EndpointDescriptor; |
44 using usb::GenericTransferInfo; | 44 using usb::GenericTransferInfo; |
45 using usb::InterfaceDescriptor; | 45 using usb::InterfaceDescriptor; |
46 using usb::IsochronousTransferInfo; | 46 using usb::IsochronousTransferInfo; |
47 using usb::Recipient; | 47 using usb::Recipient; |
48 using usb::RequestType; | 48 using usb::RequestType; |
49 using usb::SynchronizationType; | 49 using usb::SynchronizationType; |
50 using usb::TransferType; | 50 using usb::TransferType; |
51 using usb::UsageType; | 51 using usb::UsageType; |
| 52 using usb_service::UsbConfigDescriptor; |
| 53 using usb_service::UsbDevice; |
| 54 using usb_service::UsbDeviceHandle; |
| 55 using usb_service::UsbEndpointDescriptor; |
| 56 using usb_service::UsbEndpointDirection; |
| 57 using usb_service::UsbInterfaceAltSettingDescriptor; |
| 58 using usb_service::UsbInterfaceDescriptor; |
| 59 using usb_service::UsbService; |
| 60 using usb_service::UsbSynchronizationType; |
| 61 using usb_service::UsbTransferStatus; |
| 62 using usb_service::UsbTransferType; |
| 63 using usb_service::UsbUsageType; |
52 | 64 |
53 typedef std::vector<scoped_refptr<UsbDevice> > DeviceVector; | 65 typedef std::vector<scoped_refptr<UsbDevice> > DeviceVector; |
54 typedef scoped_ptr<DeviceVector> ScopedDeviceVector; | 66 typedef scoped_ptr<DeviceVector> ScopedDeviceVector; |
55 | 67 |
56 namespace { | 68 namespace { |
57 | 69 |
58 const char kDataKey[] = "data"; | 70 const char kDataKey[] = "data"; |
59 const char kResultCodeKey[] = "resultCode"; | 71 const char kResultCodeKey[] = "resultCode"; |
60 | 72 |
61 const char kErrorInitService[] = "Failed to initialize USB service."; | 73 const char kErrorInitService[] = "Failed to initialize USB service."; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 | 110 |
99 const size_t kMaxTransferLength = 100 * 1024 * 1024; | 111 const size_t kMaxTransferLength = 100 * 1024 * 1024; |
100 const int kMaxPackets = 4 * 1024 * 1024; | 112 const int kMaxPackets = 4 * 1024 * 1024; |
101 const int kMaxPacketLength = 64 * 1024; | 113 const int kMaxPacketLength = 64 * 1024; |
102 | 114 |
103 UsbDevice* g_device_for_test = NULL; | 115 UsbDevice* g_device_for_test = NULL; |
104 | 116 |
105 bool ConvertDirectionToApi(const UsbEndpointDirection& input, | 117 bool ConvertDirectionToApi(const UsbEndpointDirection& input, |
106 Direction* output) { | 118 Direction* output) { |
107 switch (input) { | 119 switch (input) { |
108 case USB_DIRECTION_INBOUND: | 120 case usb_service::USB_DIRECTION_INBOUND: |
109 *output = usb::DIRECTION_IN; | 121 *output = usb::DIRECTION_IN; |
110 return true; | 122 return true; |
111 case USB_DIRECTION_OUTBOUND: | 123 case usb_service::USB_DIRECTION_OUTBOUND: |
112 *output = usb::DIRECTION_OUT; | 124 *output = usb::DIRECTION_OUT; |
113 return true; | 125 return true; |
114 default: | 126 default: |
115 NOTREACHED(); | 127 NOTREACHED(); |
116 return false; | 128 return false; |
117 } | 129 } |
118 } | 130 } |
119 | 131 |
120 bool ConvertSynchronizationTypeToApi(const UsbSynchronizationType& input, | 132 bool ConvertSynchronizationTypeToApi(const UsbSynchronizationType& input, |
121 usb::SynchronizationType* output) { | 133 usb::SynchronizationType* output) { |
122 switch (input) { | 134 switch (input) { |
123 case USB_SYNCHRONIZATION_NONE: | 135 case usb_service::USB_SYNCHRONIZATION_NONE: |
124 *output = usb::SYNCHRONIZATION_TYPE_NONE; | 136 *output = usb::SYNCHRONIZATION_TYPE_NONE; |
125 return true; | 137 return true; |
126 case USB_SYNCHRONIZATION_ASYNCHRONOUS: | 138 case usb_service::USB_SYNCHRONIZATION_ASYNCHRONOUS: |
127 *output = usb::SYNCHRONIZATION_TYPE_ASYNCHRONOUS; | 139 *output = usb::SYNCHRONIZATION_TYPE_ASYNCHRONOUS; |
128 return true; | 140 return true; |
129 case USB_SYNCHRONIZATION_ADAPTIVE: | 141 case usb_service::USB_SYNCHRONIZATION_ADAPTIVE: |
130 *output = usb::SYNCHRONIZATION_TYPE_ADAPTIVE; | 142 *output = usb::SYNCHRONIZATION_TYPE_ADAPTIVE; |
131 return true; | 143 return true; |
132 case USB_SYNCHRONIZATION_SYNCHRONOUS: | 144 case usb_service::USB_SYNCHRONIZATION_SYNCHRONOUS: |
133 *output = usb::SYNCHRONIZATION_TYPE_SYNCHRONOUS; | 145 *output = usb::SYNCHRONIZATION_TYPE_SYNCHRONOUS; |
134 return true; | 146 return true; |
135 default: | 147 default: |
136 NOTREACHED(); | 148 NOTREACHED(); |
137 return false; | 149 return false; |
138 } | 150 } |
139 } | 151 } |
140 | 152 |
141 bool ConvertTransferTypeToApi( | 153 bool ConvertTransferTypeToApi( |
142 const UsbTransferType& input, | 154 const UsbTransferType& input, |
143 usb::TransferType* output) { | 155 usb::TransferType* output) { |
144 switch (input) { | 156 switch (input) { |
145 case USB_TRANSFER_CONTROL: | 157 case usb_service::USB_TRANSFER_CONTROL: |
146 *output = usb::TRANSFER_TYPE_CONTROL; | 158 *output = usb::TRANSFER_TYPE_CONTROL; |
147 return true; | 159 return true; |
148 case USB_TRANSFER_INTERRUPT: | 160 case usb_service::USB_TRANSFER_INTERRUPT: |
149 *output = usb::TRANSFER_TYPE_INTERRUPT; | 161 *output = usb::TRANSFER_TYPE_INTERRUPT; |
150 return true; | 162 return true; |
151 case USB_TRANSFER_ISOCHRONOUS: | 163 case usb_service::USB_TRANSFER_ISOCHRONOUS: |
152 *output = usb::TRANSFER_TYPE_ISOCHRONOUS; | 164 *output = usb::TRANSFER_TYPE_ISOCHRONOUS; |
153 return true; | 165 return true; |
154 case USB_TRANSFER_BULK: | 166 case usb_service::USB_TRANSFER_BULK: |
155 *output = usb::TRANSFER_TYPE_BULK; | 167 *output = usb::TRANSFER_TYPE_BULK; |
156 return true; | 168 return true; |
157 default: | 169 default: |
158 NOTREACHED(); | 170 NOTREACHED(); |
159 return false; | 171 return false; |
160 } | 172 } |
161 } | 173 } |
162 | 174 |
163 bool ConvertUsageTypeToApi(const UsbUsageType& input, usb::UsageType* output) { | 175 bool ConvertUsageTypeToApi(const UsbUsageType& input, usb::UsageType* output) { |
164 switch (input) { | 176 switch (input) { |
165 case USB_USAGE_DATA: | 177 case usb_service::USB_USAGE_DATA: |
166 *output = usb::USAGE_TYPE_DATA; | 178 *output = usb::USAGE_TYPE_DATA; |
167 return true; | 179 return true; |
168 case USB_USAGE_FEEDBACK: | 180 case usb_service::USB_USAGE_FEEDBACK: |
169 *output = usb::USAGE_TYPE_FEEDBACK; | 181 *output = usb::USAGE_TYPE_FEEDBACK; |
170 return true; | 182 return true; |
171 case USB_USAGE_EXPLICIT_FEEDBACK: | 183 case usb_service::USB_USAGE_EXPLICIT_FEEDBACK: |
172 *output = usb::USAGE_TYPE_EXPLICITFEEDBACK; | 184 *output = usb::USAGE_TYPE_EXPLICITFEEDBACK; |
173 return true; | 185 return true; |
174 default: | 186 default: |
175 NOTREACHED(); | 187 NOTREACHED(); |
176 return false; | 188 return false; |
177 } | 189 } |
178 } | 190 } |
179 | 191 |
180 bool ConvertDirection(const Direction& input, | 192 bool ConvertDirection(const Direction& input, |
181 UsbEndpointDirection* output) { | 193 UsbEndpointDirection* output) { |
182 switch (input) { | 194 switch (input) { |
183 case usb::DIRECTION_IN: | 195 case usb::DIRECTION_IN: |
184 *output = USB_DIRECTION_INBOUND; | 196 *output = usb_service::USB_DIRECTION_INBOUND; |
185 return true; | 197 return true; |
186 case usb::DIRECTION_OUT: | 198 case usb::DIRECTION_OUT: |
187 *output = USB_DIRECTION_OUTBOUND; | 199 *output = usb_service::USB_DIRECTION_OUTBOUND; |
188 return true; | 200 return true; |
189 default: | 201 default: |
190 NOTREACHED(); | 202 NOTREACHED(); |
191 return false; | 203 return false; |
192 } | 204 } |
193 } | 205 } |
194 | 206 |
195 bool ConvertRequestType(const RequestType& input, | 207 bool ConvertRequestType(const RequestType& input, |
196 UsbDeviceHandle::TransferRequestType* output) { | 208 UsbDeviceHandle::TransferRequestType* output) { |
197 switch (input) { | 209 switch (input) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 | 270 |
259 if (size >= kMaxTransferLength) | 271 if (size >= kMaxTransferLength) |
260 return NULL; | 272 return NULL; |
261 | 273 |
262 // Allocate a |size|-bytes buffer, or a one-byte buffer if |size| is 0. This | 274 // Allocate a |size|-bytes buffer, or a one-byte buffer if |size| is 0. This |
263 // is due to an impedance mismatch between IOBuffer and URBs. An IOBuffer | 275 // is due to an impedance mismatch between IOBuffer and URBs. An IOBuffer |
264 // cannot represent a zero-length buffer, while an URB can. | 276 // cannot represent a zero-length buffer, while an URB can. |
265 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(std::max( | 277 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(std::max( |
266 static_cast<size_t>(1), size)); | 278 static_cast<size_t>(1), size)); |
267 | 279 |
268 if (direction == USB_DIRECTION_INBOUND) { | 280 if (direction == usb_service::USB_DIRECTION_INBOUND) { |
269 return buffer; | 281 return buffer; |
270 } else if (direction == USB_DIRECTION_OUTBOUND) { | 282 } else if (direction == usb_service::USB_DIRECTION_OUTBOUND) { |
271 if (input.data.get() && size <= input.data->size()) { | 283 if (input.data.get() && size <= input.data->size()) { |
272 memcpy(buffer->data(), input.data->data(), size); | 284 memcpy(buffer->data(), input.data->data(), size); |
273 return buffer; | 285 return buffer; |
274 } | 286 } |
275 } | 287 } |
276 NOTREACHED(); | 288 NOTREACHED(); |
277 return NULL; | 289 return NULL; |
278 } | 290 } |
279 | 291 |
280 const char* ConvertTransferStatusToErrorString(const UsbTransferStatus status) { | 292 const char* ConvertTransferStatusToErrorString(const UsbTransferStatus status) { |
281 switch (status) { | 293 switch (status) { |
282 case USB_TRANSFER_COMPLETED: | 294 case usb_service::USB_TRANSFER_COMPLETED: |
283 return ""; | 295 return ""; |
284 case USB_TRANSFER_ERROR: | 296 case usb_service::USB_TRANSFER_ERROR: |
285 return kErrorGeneric; | 297 return kErrorGeneric; |
286 case USB_TRANSFER_TIMEOUT: | 298 case usb_service::USB_TRANSFER_TIMEOUT: |
287 return kErrorTimeout; | 299 return kErrorTimeout; |
288 case USB_TRANSFER_CANCELLED: | 300 case usb_service::USB_TRANSFER_CANCELLED: |
289 return kErrorCancelled; | 301 return kErrorCancelled; |
290 case USB_TRANSFER_STALLED: | 302 case usb_service::USB_TRANSFER_STALLED: |
291 return kErrorStalled; | 303 return kErrorStalled; |
292 case USB_TRANSFER_DISCONNECT: | 304 case usb_service::USB_TRANSFER_DISCONNECT: |
293 return kErrorDisconnect; | 305 return kErrorDisconnect; |
294 case USB_TRANSFER_OVERFLOW: | 306 case usb_service::USB_TRANSFER_OVERFLOW: |
295 return kErrorOverflow; | 307 return kErrorOverflow; |
296 case USB_TRANSFER_LENGTH_SHORT: | 308 case usb_service::USB_TRANSFER_LENGTH_SHORT: |
297 return kErrorTransferLength; | 309 return kErrorTransferLength; |
298 default: | 310 default: |
299 NOTREACHED(); | 311 NOTREACHED(); |
300 return ""; | 312 return ""; |
301 } | 313 } |
302 } | 314 } |
303 | 315 |
304 #if defined(OS_CHROMEOS) | 316 #if defined(OS_CHROMEOS) |
305 void RequestUsbDevicesAccessHelper( | 317 void RequestUsbDevicesAccessHelper( |
306 ScopedDeviceVector devices, | 318 ScopedDeviceVector devices, |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
482 AsyncWorkCompleted(); | 494 AsyncWorkCompleted(); |
483 } | 495 } |
484 | 496 |
485 UsbAsyncApiTransferFunction::UsbAsyncApiTransferFunction() {} | 497 UsbAsyncApiTransferFunction::UsbAsyncApiTransferFunction() {} |
486 | 498 |
487 UsbAsyncApiTransferFunction::~UsbAsyncApiTransferFunction() {} | 499 UsbAsyncApiTransferFunction::~UsbAsyncApiTransferFunction() {} |
488 | 500 |
489 void UsbAsyncApiTransferFunction::OnCompleted(UsbTransferStatus status, | 501 void UsbAsyncApiTransferFunction::OnCompleted(UsbTransferStatus status, |
490 scoped_refptr<net::IOBuffer> data, | 502 scoped_refptr<net::IOBuffer> data, |
491 size_t length) { | 503 size_t length) { |
492 if (status != USB_TRANSFER_COMPLETED) | 504 if (status != usb_service::USB_TRANSFER_COMPLETED) |
493 SetError(ConvertTransferStatusToErrorString(status)); | 505 SetError(ConvertTransferStatusToErrorString(status)); |
494 | 506 |
495 SetResult(CreateTransferInfo(status, data, length)); | 507 SetResult(CreateTransferInfo(status, data, length)); |
496 AsyncWorkCompleted(); | 508 AsyncWorkCompleted(); |
497 } | 509 } |
498 | 510 |
499 bool UsbAsyncApiTransferFunction::ConvertDirectionSafely( | 511 bool UsbAsyncApiTransferFunction::ConvertDirectionSafely( |
500 const Direction& input, UsbEndpointDirection* output) { | 512 const Direction& input, UsbEndpointDirection* output) { |
501 const bool converted = ConvertDirection(input, output); | 513 const bool converted = ConvertDirection(input, output); |
502 if (!converted) | 514 if (!converted) |
(...skipping 667 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1170 SetResult(new base::FundamentalValue(false)); | 1182 SetResult(new base::FundamentalValue(false)); |
1171 CompleteWithError(kErrorResetDevice); | 1183 CompleteWithError(kErrorResetDevice); |
1172 return; | 1184 return; |
1173 } | 1185 } |
1174 | 1186 |
1175 SetResult(new base::FundamentalValue(true)); | 1187 SetResult(new base::FundamentalValue(true)); |
1176 AsyncWorkCompleted(); | 1188 AsyncWorkCompleted(); |
1177 } | 1189 } |
1178 | 1190 |
1179 } // namespace extensions | 1191 } // namespace extensions |
OLD | NEW |