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

Side by Side Diff: chrome/browser/extensions/api/usb/usb_api.cc

Issue 12471013: Add chrome.usb.listInterfaces API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Response to Bei's PS1 comments Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/api/usb/usb_api.h" 5 #include "chrome/browser/extensions/api/usb/usb_api.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "chrome/browser/extensions/api/usb/usb_device_resource.h" 11 #include "chrome/browser/extensions/api/usb/usb_device_resource.h"
12 #include "chrome/browser/extensions/extension_system.h" 12 #include "chrome/browser/extensions/extension_system.h"
13 #include "chrome/browser/profiles/profile.h" 13 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/browser/usb/usb_service.h" 14 #include "chrome/browser/usb/usb_service.h"
15 #include "chrome/browser/usb/usb_service_factory.h" 15 #include "chrome/browser/usb/usb_service_factory.h"
16 #include "chrome/common/extensions/api/usb.h" 16 #include "chrome/common/extensions/api/usb.h"
17 #include "chrome/common/extensions/permissions/usb_device_permission.h" 17 #include "chrome/common/extensions/permissions/usb_device_permission.h"
18 18
19 namespace BulkTransfer = extensions::api::usb::BulkTransfer; 19 namespace BulkTransfer = extensions::api::usb::BulkTransfer;
20 namespace ClaimInterface = extensions::api::usb::ClaimInterface; 20 namespace ClaimInterface = extensions::api::usb::ClaimInterface;
21 namespace ListInterfaces = extensions::api::usb::ListInterfaces;
21 namespace CloseDevice = extensions::api::usb::CloseDevice; 22 namespace CloseDevice = extensions::api::usb::CloseDevice;
22 namespace ControlTransfer = extensions::api::usb::ControlTransfer; 23 namespace ControlTransfer = extensions::api::usb::ControlTransfer;
23 namespace FindDevices = extensions::api::usb::FindDevices; 24 namespace FindDevices = extensions::api::usb::FindDevices;
24 namespace InterruptTransfer = extensions::api::usb::InterruptTransfer; 25 namespace InterruptTransfer = extensions::api::usb::InterruptTransfer;
25 namespace IsochronousTransfer = extensions::api::usb::IsochronousTransfer; 26 namespace IsochronousTransfer = extensions::api::usb::IsochronousTransfer;
26 namespace ReleaseInterface = extensions::api::usb::ReleaseInterface; 27 namespace ReleaseInterface = extensions::api::usb::ReleaseInterface;
27 namespace SetInterfaceAlternateSetting = 28 namespace SetInterfaceAlternateSetting =
28 extensions::api::usb::SetInterfaceAlternateSetting; 29 extensions::api::usb::SetInterfaceAlternateSetting;
29 namespace usb = extensions::api::usb; 30 namespace usb = extensions::api::usb;
30 31
31 using std::string; 32 using std::string;
32 using std::vector; 33 using std::vector;
33 using usb::ControlTransferInfo; 34 using usb::ControlTransferInfo;
34 using usb::Device; 35 using usb::Device;
35 using usb::Direction; 36 using usb::Direction;
37 using usb::EndpointDescriptor;
36 using usb::GenericTransferInfo; 38 using usb::GenericTransferInfo;
39 using usb::InterfaceDescriptor;
37 using usb::IsochronousTransferInfo; 40 using usb::IsochronousTransferInfo;
38 using usb::Recipient; 41 using usb::Recipient;
39 using usb::RequestType; 42 using usb::RequestType;
43 using usb::SynchronizationType;
44 using usb::TransferType;
45 using usb::UsageType;
40 46
41 namespace { 47 namespace {
42 48
43 static const char* kDataKey = "data"; 49 static const char* kDataKey = "data";
44 static const char* kResultCodeKey = "resultCode"; 50 static const char* kResultCodeKey = "resultCode";
45 51
46 static const char* kErrorCancelled = "Transfer was cancelled."; 52 static const char* kErrorCancelled = "Transfer was cancelled.";
47 static const char* kErrorDisconnect = "Device disconnected."; 53 static const char* kErrorDisconnect = "Device disconnected.";
48 static const char* kErrorGeneric = "Transfer failed."; 54 static const char* kErrorGeneric = "Transfer failed.";
49 static const char* kErrorOverflow = "Inbound transfer overflow."; 55 static const char* kErrorOverflow = "Inbound transfer overflow.";
50 static const char* kErrorStalled = "Transfer stalled."; 56 static const char* kErrorStalled = "Transfer stalled.";
51 static const char* kErrorTimeout = "Transfer timed out."; 57 static const char* kErrorTimeout = "Transfer timed out.";
52 static const char* kErrorTransferLength = "Transfer length is insufficient."; 58 static const char* kErrorTransferLength = "Transfer length is insufficient.";
53 59
60 static const char* kErrorCannotListInterfaces = "Error listing interfaces.";
54 static const char* kErrorCannotClaimInterface = "Error claiming interface."; 61 static const char* kErrorCannotClaimInterface = "Error claiming interface.";
55 static const char* kErrorCannotReleaseInterface = "Error releasing interface."; 62 static const char* kErrorCannotReleaseInterface = "Error releasing interface.";
56 static const char* kErrorCannotSetInterfaceAlternateSetting = 63 static const char* kErrorCannotSetInterfaceAlternateSetting =
57 "Error setting alternate interface setting."; 64 "Error setting alternate interface setting.";
58 static const char* kErrorConvertDirection = "Invalid transfer direction."; 65 static const char* kErrorConvertDirection = "Invalid transfer direction.";
59 static const char* kErrorConvertRecipient = "Invalid transfer recipient."; 66 static const char* kErrorConvertRecipient = "Invalid transfer recipient.";
60 static const char* kErrorConvertRequestType = "Invalid request type."; 67 static const char* kErrorConvertRequestType = "Invalid request type.";
68 static const char* kErrorConvertSynchronizationType =
69 "Invalid synchronization type";
70 static const char* kErrorConvertTransferType = "Invalid endpoint type.";
71 static const char* kErrorConvertUsageType = "Invalid usage type.";
61 static const char* kErrorMalformedParameters = "Error parsing parameters."; 72 static const char* kErrorMalformedParameters = "Error parsing parameters.";
62 static const char* kErrorNoDevice = "No such device."; 73 static const char* kErrorNoDevice = "No such device.";
63 static const char* kErrorPermissionDenied = 74 static const char* kErrorPermissionDenied =
64 "Permission to access device was denied"; 75 "Permission to access device was denied";
65 static const char* kErrorInvalidTransferLength = "Transfer length must be a " 76 static const char* kErrorInvalidTransferLength = "Transfer length must be a "
66 "positive number less than 104,857,600."; 77 "positive number less than 104,857,600.";
67 static const char* kErrorInvalidNumberOfPackets = "Number of packets must be a " 78 static const char* kErrorInvalidNumberOfPackets = "Number of packets must be a "
68 "positive number less than 4,194,304."; 79 "positive number less than 4,194,304.";
69 static const char* kErrorInvalidPacketLength = "Packet length must be a " 80 static const char* kErrorInvalidPacketLength = "Packet length must be a "
70 "positive number less than 65,536."; 81 "positive number less than 65,536.";
71 82
72 static const size_t kMaxTransferLength = 100 * 1024 * 1024; 83 static const size_t kMaxTransferLength = 100 * 1024 * 1024;
73 static const int kMaxPackets = 4 * 1024 * 1024; 84 static const int kMaxPackets = 4 * 1024 * 1024;
74 static const int kMaxPacketLength = 64 * 1024; 85 static const int kMaxPacketLength = 64 * 1024;
75 86
76 static UsbDevice* device_for_test_ = NULL; 87 static UsbDevice* device_for_test_ = NULL;
77 88
78 static bool ConvertDirection(const Direction& input, 89 static bool ConvertDirectionToApi(const UsbEndpointDirection& input,
79 UsbDevice::TransferDirection* output) { 90 Direction* output) {
80 switch (input) { 91 switch (input) {
81 case usb::DIRECTION_IN: 92 case USB_DIRECTION_INBOUND:
82 *output = UsbDevice::INBOUND; 93 *output = usb::DIRECTION_IN;
83 return true; 94 return true;
84 case usb::DIRECTION_OUT: 95 case USB_DIRECTION_OUTBOUND:
85 *output = UsbDevice::OUTBOUND; 96 *output = usb::DIRECTION_OUT;
86 return true; 97 return true;
87 default: 98 default:
88 return false; 99 return false;
100 }
101 NOTREACHED();
102 return false;
103 }
104
105 static bool ConvertSynchronizationTypeToApi(
106 const UsbSynchronizationType& input,
107 extensions::api::usb::SynchronizationType* output) {
108 switch (input) {
109 case USB_SYNCHRONIZATION_NONE:
110 *output = usb::SYNCHRONIZATION_TYPE_NONE;
111 return true;
112 case USB_SYNCHRONIZATION_ASYNCHRONOUS:
113 *output = usb::SYNCHRONIZATION_TYPE_ASYNCHRONOUS;
114 return true;
115 case USB_SYNCHRONIZATION_ADAPTIVE:
116 *output = usb::SYNCHRONIZATION_TYPE_ADAPTIVE;
117 return true;
118 case USB_SYNCHRONIZATION_SYNCHRONOUS:
119 *output = usb::SYNCHRONIZATION_TYPE_SYNCHRONOUS;
120 return true;
121 default:
122 return false;
123 }
124 NOTREACHED();
125 return false;
126 }
127
128 static bool ConvertTransferTypeToApi(
129 const UsbTransferType& input,
130 extensions::api::usb::TransferType* output) {
131 switch (input) {
132 case USB_TRANSFER_CONTROL:
133 *output = usb::TRANSFER_TYPE_CONTROL;
134 return true;
135 case USB_TRANSFER_INTERRUPT:
136 *output = usb::TRANSFER_TYPE_INTERRUPT;
137 return true;
138 case USB_TRANSFER_ISOCHRONOUS:
139 *output = usb::TRANSFER_TYPE_ISOCHRONOUS;
140 return true;
141 case USB_TRANSFER_BULK:
142 *output = usb::TRANSFER_TYPE_BULK;
143 return true;
144 default:
145 return false;
146 }
147 NOTREACHED();
148 return false;
149 }
150
151 static bool ConvertUsageTypeToApi(const UsbUsageType& input,
152 extensions::api::usb::UsageType* output) {
153 switch (input) {
154 case USB_USAGE_DATA:
155 *output = usb::USAGE_TYPE_DATA;
156 return true;
157 case USB_USAGE_FEEDBACK:
158 *output = usb::USAGE_TYPE_FEEDBACK;
159 return true;
160 case USB_USAGE_EXPLICIT_FEEDBACK:
161 *output = usb::USAGE_TYPE_EXPLICITFEEDBACK;
162 return true;
163 default:
164 return false;
165 }
166 NOTREACHED();
167 return false;
Kenny Root (Google) 2013/05/08 02:29:34 Looks like I did that and accidentally reverted it
168 }
169
170 static bool ConvertDirection(const Direction& input,
171 UsbEndpointDirection* output) {
172 switch (input) {
173 case usb::DIRECTION_IN:
174 *output = USB_DIRECTION_INBOUND;
175 return true;
176 case usb::DIRECTION_OUT:
177 *output = USB_DIRECTION_OUTBOUND;
178 return true;
179 default:
180 return false;
89 } 181 }
90 NOTREACHED(); 182 NOTREACHED();
91 return false; 183 return false;
92 } 184 }
93 185
94 static bool ConvertRequestType(const RequestType& input, 186 static bool ConvertRequestType(const RequestType& input,
95 UsbDevice::TransferRequestType* output) { 187 UsbDevice::TransferRequestType* output) {
96 switch (input) { 188 switch (input) {
97 case usb::REQUEST_TYPE_STANDARD: 189 case usb::REQUEST_TYPE_STANDARD:
98 *output = UsbDevice::STANDARD; 190 *output = UsbDevice::STANDARD;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 if (input.data.get()) { 240 if (input.data.get()) {
149 *output = input.data->size(); 241 *output = input.data->size();
150 return true; 242 return true;
151 } 243 }
152 } 244 }
153 return false; 245 return false;
154 } 246 }
155 247
156 template<class T> 248 template<class T>
157 static scoped_refptr<net::IOBuffer> CreateBufferForTransfer( 249 static scoped_refptr<net::IOBuffer> CreateBufferForTransfer(
158 const T& input, UsbDevice::TransferDirection direction, size_t size) { 250 const T& input, UsbEndpointDirection direction, size_t size) {
159 251
160 if (size >= kMaxTransferLength) 252 if (size >= kMaxTransferLength)
161 return NULL; 253 return NULL;
162 254
163 // Allocate a |size|-bytes buffer, or a one-byte buffer if |size| is 0. This 255 // Allocate a |size|-bytes buffer, or a one-byte buffer if |size| is 0. This
164 // is due to an impedance mismatch between IOBuffer and URBs. An IOBuffer 256 // is due to an impedance mismatch between IOBuffer and URBs. An IOBuffer
165 // cannot represent a zero-length buffer, while an URB can. 257 // cannot represent a zero-length buffer, while an URB can.
166 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(std::max( 258 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(std::max(
167 static_cast<size_t>(1), size)); 259 static_cast<size_t>(1), size));
168 260
169 if (direction == UsbDevice::INBOUND) { 261 if (direction == USB_DIRECTION_INBOUND) {
170 return buffer; 262 return buffer;
171 } else if (direction == UsbDevice::OUTBOUND) { 263 } else if (direction == USB_DIRECTION_OUTBOUND) {
172 if (input.data.get() && size <= input.data->size()) { 264 if (input.data.get() && size <= input.data->size()) {
173 memcpy(buffer->data(), input.data->data(), size); 265 memcpy(buffer->data(), input.data->data(), size);
174 return buffer; 266 return buffer;
175 } 267 }
176 } 268 }
177 NOTREACHED(); 269 NOTREACHED();
178 return NULL; 270 return NULL;
179 } 271 }
180 272
181 static const char* ConvertTransferStatusToErrorString( 273 static const char* ConvertTransferStatusToErrorString(
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 } 307 }
216 308
217 static base::Value* PopulateDevice(int handle, int vendor_id, int product_id) { 309 static base::Value* PopulateDevice(int handle, int vendor_id, int product_id) {
218 Device device; 310 Device device;
219 device.handle = handle; 311 device.handle = handle;
220 device.vendor_id = vendor_id; 312 device.vendor_id = vendor_id;
221 device.product_id = product_id; 313 device.product_id = product_id;
222 return device.ToValue().release(); 314 return device.ToValue().release();
223 } 315 }
224 316
317 static base::Value* PopulateInterfaceDescriptor(int interface_number,
318 int alternate_setting, int interface_class, int interface_subclass,
319 int interface_protocol,
320 std::vector<linked_ptr<EndpointDescriptor> >* endpoints) {
321 InterfaceDescriptor descriptor;
322 descriptor.interface_number = interface_number;
323 descriptor.alternate_setting = alternate_setting;
324 descriptor.interface_class = interface_class;
325 descriptor.interface_subclass = interface_subclass;
326 descriptor.interface_protocol = interface_subclass;
327 descriptor.endpoints = *endpoints;
328 return descriptor.ToValue().release();
329 }
330
225 } // namespace 331 } // namespace
226 332
227 namespace extensions { 333 namespace extensions {
228 334
229 UsbAsyncApiFunction::UsbAsyncApiFunction() 335 UsbAsyncApiFunction::UsbAsyncApiFunction()
230 : manager_(NULL) { 336 : manager_(NULL) {
231 } 337 }
232 338
233 UsbAsyncApiFunction::~UsbAsyncApiFunction() { 339 UsbAsyncApiFunction::~UsbAsyncApiFunction() {
234 } 340 }
(...skipping 29 matching lines...) Expand all
264 scoped_refptr<net::IOBuffer> data, 370 scoped_refptr<net::IOBuffer> data,
265 size_t length) { 371 size_t length) {
266 if (status != USB_TRANSFER_COMPLETED) 372 if (status != USB_TRANSFER_COMPLETED)
267 SetError(ConvertTransferStatusToErrorString(status)); 373 SetError(ConvertTransferStatusToErrorString(status));
268 374
269 SetResult(CreateTransferInfo(status, data, length)); 375 SetResult(CreateTransferInfo(status, data, length));
270 AsyncWorkCompleted(); 376 AsyncWorkCompleted();
271 } 377 }
272 378
273 bool UsbAsyncApiTransferFunction::ConvertDirectionSafely( 379 bool UsbAsyncApiTransferFunction::ConvertDirectionSafely(
274 const Direction& input, UsbDevice::TransferDirection* output) { 380 const Direction& input, UsbEndpointDirection* output) {
275 const bool converted = ConvertDirection(input, output); 381 const bool converted = ConvertDirection(input, output);
276 if (!converted) 382 if (!converted)
277 SetError(kErrorConvertDirection); 383 SetError(kErrorConvertDirection);
278 return converted; 384 return converted;
279 } 385 }
280 386
281 bool UsbAsyncApiTransferFunction::ConvertRequestTypeSafely( 387 bool UsbAsyncApiTransferFunction::ConvertRequestTypeSafely(
282 const RequestType& input, UsbDevice::TransferRequestType* output) { 388 const RequestType& input, UsbDevice::TransferRequestType* output) {
283 const bool converted = ConvertRequestType(input, output); 389 const bool converted = ConvertRequestType(input, output);
284 if (!converted) 390 if (!converted)
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 Device js_device; 460 Device js_device;
355 result_->Append(PopulateDevice(manager_->Add(resource), 461 result_->Append(PopulateDevice(manager_->Add(resource),
356 parameters_->options.vendor_id, 462 parameters_->options.vendor_id,
357 parameters_->options.product_id)); 463 parameters_->options.product_id));
358 } 464 }
359 465
360 SetResult(result_.release()); 466 SetResult(result_.release());
361 AsyncWorkCompleted(); 467 AsyncWorkCompleted();
362 } 468 }
363 469
470 UsbListInterfacesFunction::UsbListInterfacesFunction() {}
471
472 UsbListInterfacesFunction::~UsbListInterfacesFunction() {}
473
474 bool UsbListInterfacesFunction::Prepare() {
475 parameters_ = ListInterfaces::Params::Create(*args_);
476 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
477 return true;
478 }
479
480 void UsbListInterfacesFunction::AsyncWorkStart() {
481 UsbDeviceResource* const device = GetUsbDeviceResource(
482 parameters_->device.handle);
483 if (!device) {
484 CompleteWithError(kErrorNoDevice);
485 return;
486 }
487
488 device->device()->ListInterfaces(config_, base::Bind(
489 &UsbListInterfacesFunction::OnCompleted, this));
490 }
491
492 void UsbListInterfacesFunction::OnCompleted(bool success) {
493 if (!success) {
494 SetError(kErrorCannotListInterfaces);
495 AsyncWorkCompleted();
496 return;
497 }
498
499 for (size_t i = 0, numInterfaces = config_->GetNumInterfaces();
500 i < numInterfaces; ++i) {
501 scoped_refptr<const UsbInterface> usbInterface(config_->GetInterface(i));
502 for (size_t j = 0, numDescriptors = usbInterface->GetNumAltSettings();
503 i < numDescriptors; ++i) {
504 scoped_refptr<const UsbInterfaceDescriptor> descriptor
505 = usbInterface->GetAltSetting(j);
506 std::vector<linked_ptr<EndpointDescriptor> > endpoints;
507 for (size_t k = 0, numEndpoints = descriptor->GetNumEndpoints();
508 k < numEndpoints; k++) {
509 scoped_refptr<const UsbEndpointDescriptor> endpoint
510 = descriptor->GetEndpoint(k);
511 linked_ptr<EndpointDescriptor> endpoint_desc(new EndpointDescriptor());
512
513 TransferType type;
514 Direction direction;
515 SynchronizationType synchronization;
516 UsageType usage;
517
518 if (!ConvertTransferTypeSafely(endpoint->GetTransferType(), &type) ||
519 !ConvertDirectionSafely(endpoint->GetDirection(), &direction) ||
520 !ConvertSynchronizationTypeSafely(
521 endpoint->GetSynchronizationType(), &synchronization) ||
522 !ConvertUsageTypeSafely(endpoint->GetUsageType(), &usage)) {
523 SetError(kErrorCannotListInterfaces);
524 AsyncWorkCompleted();
525 return;
526 }
527
528 endpoint_desc->address = endpoint->GetAddress();
529 endpoint_desc->type = type;
530 endpoint_desc->direction = direction;
531 endpoint_desc->maximum_packet_size = endpoint->GetMaximumPacketSize();
532 endpoint_desc->synchronization = synchronization;
533 endpoint_desc->usage = usage;
534
535 int* polling_interval = new int;
536 endpoint_desc->polling_interval.reset(polling_interval);
537 *polling_interval = endpoint->GetPollingInterval();
538
539 endpoints.push_back(endpoint_desc);
540 }
541
542 result_->Append(PopulateInterfaceDescriptor(
543 descriptor->GetInterfaceNumber(),
544 descriptor->GetAlternateSetting(),
545 descriptor->GetInterfaceClass(),
546 descriptor->GetInterfaceSubclass(),
547 descriptor->GetInterfaceProtocol(),
548 &endpoints));
549 }
550 }
551
552 SetResult(result_.release());
553 AsyncWorkCompleted();
554 }
555
556 bool UsbListInterfacesFunction::ConvertDirectionSafely(
557 const UsbEndpointDirection& input,
558 extensions::api::usb::Direction* output) {
559 const bool converted = ConvertDirectionToApi(input, output);
560 if (!converted)
561 SetError(kErrorConvertDirection);
562 return converted;
563 }
564
565 bool UsbListInterfacesFunction::ConvertSynchronizationTypeSafely(
566 const UsbSynchronizationType& input,
567 extensions::api::usb::SynchronizationType* output) {
568 const bool converted = ConvertSynchronizationTypeToApi(input, output);
569 if (!converted)
570 SetError(kErrorConvertSynchronizationType);
571 return converted;
572 }
573
574 bool UsbListInterfacesFunction::ConvertTransferTypeSafely(
575 const UsbTransferType& input,
576 extensions::api::usb::TransferType* output) {
577 const bool converted = ConvertTransferTypeToApi(input, output);
578 if (!converted)
579 SetError(kErrorConvertTransferType);
580 return converted;
581 }
582
583 bool UsbListInterfacesFunction::ConvertUsageTypeSafely(
584 const UsbUsageType& input,
585 extensions::api::usb::UsageType* output) {
586 const bool converted = ConvertUsageTypeToApi(input, output);
587 if (!converted)
588 SetError(kErrorConvertUsageType);
589 return converted;
590 }
591
364 UsbCloseDeviceFunction::UsbCloseDeviceFunction() {} 592 UsbCloseDeviceFunction::UsbCloseDeviceFunction() {}
365 593
366 UsbCloseDeviceFunction::~UsbCloseDeviceFunction() {} 594 UsbCloseDeviceFunction::~UsbCloseDeviceFunction() {}
367 595
368 bool UsbCloseDeviceFunction::Prepare() { 596 bool UsbCloseDeviceFunction::Prepare() {
369 parameters_ = CloseDevice::Params::Create(*args_); 597 parameters_ = CloseDevice::Params::Create(*args_);
370 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 598 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
371 return true; 599 return true;
372 } 600 }
373 601
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 void UsbControlTransferFunction::AsyncWorkStart() { 714 void UsbControlTransferFunction::AsyncWorkStart() {
487 UsbDeviceResource* const device = GetUsbDeviceResource( 715 UsbDeviceResource* const device = GetUsbDeviceResource(
488 parameters_->device.handle); 716 parameters_->device.handle);
489 if (!device) { 717 if (!device) {
490 CompleteWithError(kErrorNoDevice); 718 CompleteWithError(kErrorNoDevice);
491 return; 719 return;
492 } 720 }
493 721
494 const ControlTransferInfo& transfer = parameters_->transfer_info; 722 const ControlTransferInfo& transfer = parameters_->transfer_info;
495 723
496 UsbDevice::TransferDirection direction; 724 UsbEndpointDirection direction;
497 UsbDevice::TransferRequestType request_type; 725 UsbDevice::TransferRequestType request_type;
498 UsbDevice::TransferRecipient recipient; 726 UsbDevice::TransferRecipient recipient;
499 size_t size = 0; 727 size_t size = 0;
500 728
501 if (!ConvertDirectionSafely(transfer.direction, &direction) || 729 if (!ConvertDirectionSafely(transfer.direction, &direction) ||
502 !ConvertRequestTypeSafely(transfer.request_type, &request_type) || 730 !ConvertRequestTypeSafely(transfer.request_type, &request_type) ||
503 !ConvertRecipientSafely(transfer.recipient, &recipient)) { 731 !ConvertRecipientSafely(transfer.recipient, &recipient)) {
504 AsyncWorkCompleted(); 732 AsyncWorkCompleted();
505 return; 733 return;
506 } 734 }
(...skipping 28 matching lines...) Expand all
535 void UsbBulkTransferFunction::AsyncWorkStart() { 763 void UsbBulkTransferFunction::AsyncWorkStart() {
536 UsbDeviceResource* const device = GetUsbDeviceResource( 764 UsbDeviceResource* const device = GetUsbDeviceResource(
537 parameters_->device.handle); 765 parameters_->device.handle);
538 if (!device) { 766 if (!device) {
539 CompleteWithError(kErrorNoDevice); 767 CompleteWithError(kErrorNoDevice);
540 return; 768 return;
541 } 769 }
542 770
543 const GenericTransferInfo& transfer = parameters_->transfer_info; 771 const GenericTransferInfo& transfer = parameters_->transfer_info;
544 772
545 UsbDevice::TransferDirection direction; 773 UsbEndpointDirection direction;
546 size_t size = 0; 774 size_t size = 0;
547 775
548 if (!ConvertDirectionSafely(transfer.direction, &direction)) { 776 if (!ConvertDirectionSafely(transfer.direction, &direction)) {
549 AsyncWorkCompleted(); 777 AsyncWorkCompleted();
550 return; 778 return;
551 } 779 }
552 780
553 if (!GetTransferSize(transfer, &size)) { 781 if (!GetTransferSize(transfer, &size)) {
554 CompleteWithError(kErrorInvalidTransferLength); 782 CompleteWithError(kErrorInvalidTransferLength);
555 return; 783 return;
(...skipping 23 matching lines...) Expand all
579 void UsbInterruptTransferFunction::AsyncWorkStart() { 807 void UsbInterruptTransferFunction::AsyncWorkStart() {
580 UsbDeviceResource* const device = GetUsbDeviceResource( 808 UsbDeviceResource* const device = GetUsbDeviceResource(
581 parameters_->device.handle); 809 parameters_->device.handle);
582 if (!device) { 810 if (!device) {
583 CompleteWithError(kErrorNoDevice); 811 CompleteWithError(kErrorNoDevice);
584 return; 812 return;
585 } 813 }
586 814
587 const GenericTransferInfo& transfer = parameters_->transfer_info; 815 const GenericTransferInfo& transfer = parameters_->transfer_info;
588 816
589 UsbDevice::TransferDirection direction; 817 UsbEndpointDirection direction;
590 size_t size = 0; 818 size_t size = 0;
591 819
592 if (!ConvertDirectionSafely(transfer.direction, &direction)) { 820 if (!ConvertDirectionSafely(transfer.direction, &direction)) {
593 AsyncWorkCompleted(); 821 AsyncWorkCompleted();
594 return; 822 return;
595 } 823 }
596 824
597 if (!GetTransferSize(transfer, &size)) { 825 if (!GetTransferSize(transfer, &size)) {
598 CompleteWithError(kErrorInvalidTransferLength); 826 CompleteWithError(kErrorInvalidTransferLength);
599 return; 827 return;
(...skipping 25 matching lines...) Expand all
625 parameters_->device.handle); 853 parameters_->device.handle);
626 if (!device) { 854 if (!device) {
627 CompleteWithError(kErrorNoDevice); 855 CompleteWithError(kErrorNoDevice);
628 return; 856 return;
629 } 857 }
630 858
631 const IsochronousTransferInfo& transfer = parameters_->transfer_info; 859 const IsochronousTransferInfo& transfer = parameters_->transfer_info;
632 const GenericTransferInfo& generic_transfer = transfer.transfer_info; 860 const GenericTransferInfo& generic_transfer = transfer.transfer_info;
633 861
634 size_t size = 0; 862 size_t size = 0;
635 UsbDevice::TransferDirection direction; 863 UsbEndpointDirection direction;
636 864
637 if (!ConvertDirectionSafely(generic_transfer.direction, &direction)) { 865 if (!ConvertDirectionSafely(generic_transfer.direction, &direction)) {
638 AsyncWorkCompleted(); 866 AsyncWorkCompleted();
639 return; 867 return;
640 } 868 }
641 if (!GetTransferSize(generic_transfer, &size)) { 869 if (!GetTransferSize(generic_transfer, &size)) {
642 CompleteWithError(kErrorInvalidTransferLength); 870 CompleteWithError(kErrorInvalidTransferLength);
643 return; 871 return;
644 } 872 }
645 if (transfer.packets < 0 || transfer.packets >= kMaxPackets) { 873 if (transfer.packets < 0 || transfer.packets >= kMaxPackets) {
(...skipping 19 matching lines...) Expand all
665 CompleteWithError(kErrorMalformedParameters); 893 CompleteWithError(kErrorMalformedParameters);
666 return; 894 return;
667 } 895 }
668 896
669 device->device()->IsochronousTransfer(direction, generic_transfer.endpoint, 897 device->device()->IsochronousTransfer(direction, generic_transfer.endpoint,
670 buffer, size, packets, packet_length, 0, base::Bind( 898 buffer, size, packets, packet_length, 0, base::Bind(
671 &UsbIsochronousTransferFunction::OnCompleted, this)); 899 &UsbIsochronousTransferFunction::OnCompleted, this));
672 } 900 }
673 901
674 } // namespace extensions 902 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698