| 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 |