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

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

Issue 16316004: Separate usb device handle from usb device. (deprecate) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix Windows compile and a bug. Created 7 years, 6 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/permissions_data.h" 17 #include "chrome/common/extensions/permissions/permissions_data.h"
18 #include "chrome/common/extensions/permissions/usb_device_permission.h" 18 #include "chrome/common/extensions/permissions/usb_device_permission.h"
19 19
20 namespace BulkTransfer = extensions::api::usb::BulkTransfer; 20 namespace BulkTransfer = extensions::api::usb::BulkTransfer;
21 namespace ClaimInterface = extensions::api::usb::ClaimInterface; 21 namespace ClaimInterface = extensions::api::usb::ClaimInterface;
22 namespace ListInterfaces = extensions::api::usb::ListInterfaces; 22 namespace ListInterfaces = extensions::api::usb::ListInterfaces;
23 namespace CloseDevice = extensions::api::usb::CloseDevice; 23 namespace CloseDevice = extensions::api::usb::CloseDevice;
24 namespace ControlTransfer = extensions::api::usb::ControlTransfer; 24 namespace ControlTransfer = extensions::api::usb::ControlTransfer;
25 namespace FindDevices = extensions::api::usb::FindDevices; 25 namespace FindDevices = extensions::api::usb::FindDevices;
26 namespace OpenDevice = extensions::api::usb::OpenDevice;
26 namespace InterruptTransfer = extensions::api::usb::InterruptTransfer; 27 namespace InterruptTransfer = extensions::api::usb::InterruptTransfer;
27 namespace IsochronousTransfer = extensions::api::usb::IsochronousTransfer; 28 namespace IsochronousTransfer = extensions::api::usb::IsochronousTransfer;
28 namespace ReleaseInterface = extensions::api::usb::ReleaseInterface; 29 namespace ReleaseInterface = extensions::api::usb::ReleaseInterface;
29 namespace ResetDevice = extensions::api::usb::ResetDevice; 30 namespace ResetDevice = extensions::api::usb::ResetDevice;
30 namespace SetInterfaceAlternateSetting = 31 namespace SetInterfaceAlternateSetting =
31 extensions::api::usb::SetInterfaceAlternateSetting; 32 extensions::api::usb::SetInterfaceAlternateSetting;
32 namespace usb = extensions::api::usb; 33 namespace usb = extensions::api::usb;
33 34
34 using std::string; 35 using std::string;
35 using std::vector; 36 using std::vector;
36 using usb::ControlTransferInfo; 37 using usb::ControlTransferInfo;
37 using usb::Device; 38 using usb::Device;
39 using usb::DeviceHandle;
38 using usb::Direction; 40 using usb::Direction;
39 using usb::EndpointDescriptor; 41 using usb::EndpointDescriptor;
40 using usb::GenericTransferInfo; 42 using usb::GenericTransferInfo;
41 using usb::InterfaceDescriptor; 43 using usb::InterfaceDescriptor;
42 using usb::IsochronousTransferInfo; 44 using usb::IsochronousTransferInfo;
43 using usb::Recipient; 45 using usb::Recipient;
44 using usb::RequestType; 46 using usb::RequestType;
45 using usb::SynchronizationType; 47 using usb::SynchronizationType;
46 using usb::TransferType; 48 using usb::TransferType;
47 using usb::UsageType; 49 using usb::UsageType;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 "a positive number less than 4,194,304."; 83 "a positive number less than 4,194,304.";
82 static const char kErrorInvalidPacketLength[] = "Packet length must be a " 84 static const char kErrorInvalidPacketLength[] = "Packet length must be a "
83 "positive number less than 65,536."; 85 "positive number less than 65,536.";
84 static const char kErrorResetDevice[] = 86 static const char kErrorResetDevice[] =
85 "Error resetting the device. The device has been closed."; 87 "Error resetting the device. The device has been closed.";
86 88
87 static const size_t kMaxTransferLength = 100 * 1024 * 1024; 89 static const size_t kMaxTransferLength = 100 * 1024 * 1024;
88 static const int kMaxPackets = 4 * 1024 * 1024; 90 static const int kMaxPackets = 4 * 1024 * 1024;
89 static const int kMaxPacketLength = 64 * 1024; 91 static const int kMaxPacketLength = 64 * 1024;
90 92
91 static UsbDevice* device_for_test_ = NULL; 93 static UsbDeviceHandle* device_for_test_ = NULL;
92 94
93 static bool ConvertDirectionToApi(const UsbEndpointDirection& input, 95 static bool ConvertDirectionToApi(const UsbEndpointDirection& input,
94 Direction* output) { 96 Direction* output) {
95 switch (input) { 97 switch (input) {
96 case USB_DIRECTION_INBOUND: 98 case USB_DIRECTION_INBOUND:
97 *output = usb::DIRECTION_IN; 99 *output = usb::DIRECTION_IN;
98 return true; 100 return true;
99 case USB_DIRECTION_OUTBOUND: 101 case USB_DIRECTION_OUTBOUND:
100 *output = usb::DIRECTION_OUT; 102 *output = usb::DIRECTION_OUT;
101 return true; 103 return true;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 case usb::DIRECTION_OUT: 178 case usb::DIRECTION_OUT:
177 *output = USB_DIRECTION_OUTBOUND; 179 *output = USB_DIRECTION_OUTBOUND;
178 return true; 180 return true;
179 default: 181 default:
180 NOTREACHED(); 182 NOTREACHED();
181 return false; 183 return false;
182 } 184 }
183 } 185 }
184 186
185 static bool ConvertRequestType(const RequestType& input, 187 static bool ConvertRequestType(const RequestType& input,
186 UsbDevice::TransferRequestType* output) { 188 UsbDeviceHandle::TransferRequestType* output) {
187 switch (input) { 189 switch (input) {
188 case usb::REQUEST_TYPE_STANDARD: 190 case usb::REQUEST_TYPE_STANDARD:
189 *output = UsbDevice::STANDARD; 191 *output = UsbDeviceHandle::STANDARD;
190 return true; 192 return true;
191 case usb::REQUEST_TYPE_CLASS: 193 case usb::REQUEST_TYPE_CLASS:
192 *output = UsbDevice::CLASS; 194 *output = UsbDeviceHandle::CLASS;
193 return true; 195 return true;
194 case usb::REQUEST_TYPE_VENDOR: 196 case usb::REQUEST_TYPE_VENDOR:
195 *output = UsbDevice::VENDOR; 197 *output = UsbDeviceHandle::VENDOR;
196 return true; 198 return true;
197 case usb::REQUEST_TYPE_RESERVED: 199 case usb::REQUEST_TYPE_RESERVED:
198 *output = UsbDevice::RESERVED; 200 *output = UsbDeviceHandle::RESERVED;
199 return true; 201 return true;
200 default: 202 default:
201 NOTREACHED(); 203 NOTREACHED();
202 return false; 204 return false;
203 } 205 }
204 } 206 }
205 207
206 static bool ConvertRecipient(const Recipient& input, 208 static bool ConvertRecipient(const Recipient& input,
207 UsbDevice::TransferRecipient* output) { 209 UsbDeviceHandle::TransferRecipient* output) {
208 switch (input) { 210 switch (input) {
209 case usb::RECIPIENT_DEVICE: 211 case usb::RECIPIENT_DEVICE:
210 *output = UsbDevice::DEVICE; 212 *output = UsbDeviceHandle::DEVICE;
211 return true; 213 return true;
212 case usb::RECIPIENT_INTERFACE: 214 case usb::RECIPIENT_INTERFACE:
213 *output = UsbDevice::INTERFACE; 215 *output = UsbDeviceHandle::INTERFACE;
214 return true; 216 return true;
215 case usb::RECIPIENT_ENDPOINT: 217 case usb::RECIPIENT_ENDPOINT:
216 *output = UsbDevice::ENDPOINT; 218 *output = UsbDeviceHandle::ENDPOINT;
217 return true; 219 return true;
218 case usb::RECIPIENT_OTHER: 220 case usb::RECIPIENT_OTHER:
219 *output = UsbDevice::OTHER; 221 *output = UsbDeviceHandle::OTHER;
220 return true; 222 return true;
221 default: 223 default:
222 NOTREACHED(); 224 NOTREACHED();
223 return false; 225 return false;
224 } 226 }
225 } 227 }
226 228
227 template<class T> 229 template<class T>
228 static bool GetTransferSize(const T& input, size_t* output) { 230 static bool GetTransferSize(const T& input, size_t* output) {
229 if (input.direction == usb::DIRECTION_IN) { 231 if (input.direction == usb::DIRECTION_IN) {
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 return ""; 293 return "";
292 } 294 }
293 } 295 }
294 296
295 static base::DictionaryValue* CreateTransferInfo( 297 static base::DictionaryValue* CreateTransferInfo(
296 UsbTransferStatus status, 298 UsbTransferStatus status,
297 scoped_refptr<net::IOBuffer> data, 299 scoped_refptr<net::IOBuffer> data,
298 size_t length) { 300 size_t length) {
299 base::DictionaryValue* result = new base::DictionaryValue(); 301 base::DictionaryValue* result = new base::DictionaryValue();
300 result->SetInteger(kResultCodeKey, status); 302 result->SetInteger(kResultCodeKey, status);
301 result->Set(kDataKey, base::BinaryValue::CreateWithCopiedBuffer(data->data(), 303 if (data.get()) {
302 length)); 304 result->Set(
305 kDataKey,
306 base::BinaryValue::CreateWithCopiedBuffer(data->data(), length));
307 }
303 return result; 308 return result;
304 } 309 }
305 310
306 static base::Value* PopulateDevice(int handle, int vendor_id, int product_id) { 311 static base::Value* PopulateDevice(
312 int device_id, int vendor_id, int product_id) {
307 Device device; 313 Device device;
308 device.handle = handle; 314 device.device = device_id;
309 device.vendor_id = vendor_id; 315 device.vendor_id = vendor_id;
310 device.product_id = product_id; 316 device.product_id = product_id;
311 return device.ToValue().release(); 317 return device.ToValue().release();
312 } 318 }
313 319
314 static base::Value* PopulateInterfaceDescriptor(int interface_number, 320 static base::Value* PopulateInterfaceDescriptor(int interface_number,
315 int alternate_setting, int interface_class, int interface_subclass, 321 int alternate_setting, int interface_class, int interface_subclass,
316 int interface_protocol, 322 int interface_protocol,
317 std::vector<linked_ptr<EndpointDescriptor> >* endpoints) { 323 std::vector<linked_ptr<EndpointDescriptor> >* endpoints) {
318 InterfaceDescriptor descriptor; 324 InterfaceDescriptor descriptor;
(...skipping 21 matching lines...) Expand all
340 manager_ = ExtensionSystem::Get(profile())->usb_device_resource_manager(); 346 manager_ = ExtensionSystem::Get(profile())->usb_device_resource_manager();
341 return manager_ != NULL; 347 return manager_ != NULL;
342 } 348 }
343 349
344 bool UsbAsyncApiFunction::Respond() { 350 bool UsbAsyncApiFunction::Respond() {
345 return error_.empty(); 351 return error_.empty();
346 } 352 }
347 353
348 UsbDeviceResource* UsbAsyncApiFunction::GetUsbDeviceResource( 354 UsbDeviceResource* UsbAsyncApiFunction::GetUsbDeviceResource(
349 int api_resource_id) { 355 int api_resource_id) {
350 return manager_->Get(extension_->id(), api_resource_id); 356 UsbDeviceResource* resource =
357 manager_->Get(extension_->id(), api_resource_id);
358
359 if (resource == NULL)
360 return NULL;
361
362 if (device_for_test_) {
363 return resource;
364 }
365
366 // TODO(ikarienator): Instead of doing this check and release the object
367 // lazily, find a way to inform the ApiResourceManager from the resource that
368 // a it is closed.
369 if (resource->device()->handle() == NULL) {
370 // If the device handle is closed, then remove the resource.
371 manager_->Remove(extension_->id(), api_resource_id);
372 return NULL;
373 }
374
375 return resource;
351 } 376 }
352 377
353 void UsbAsyncApiFunction::RemoveUsbDeviceResource(int api_resource_id) { 378 void UsbAsyncApiFunction::RemoveUsbDeviceResource(int api_resource_id) {
354 manager_->Remove(extension_->id(), api_resource_id); 379 manager_->Remove(extension_->id(), api_resource_id);
355 } 380 }
356 381
357 void UsbAsyncApiFunction::CompleteWithError(const std::string& error) { 382 void UsbAsyncApiFunction::CompleteWithError(const std::string& error) {
358 SetError(error); 383 SetError(error);
359 AsyncWorkCompleted(); 384 AsyncWorkCompleted();
360 } 385 }
(...skipping 14 matching lines...) Expand all
375 400
376 bool UsbAsyncApiTransferFunction::ConvertDirectionSafely( 401 bool UsbAsyncApiTransferFunction::ConvertDirectionSafely(
377 const Direction& input, UsbEndpointDirection* output) { 402 const Direction& input, UsbEndpointDirection* output) {
378 const bool converted = ConvertDirection(input, output); 403 const bool converted = ConvertDirection(input, output);
379 if (!converted) 404 if (!converted)
380 SetError(kErrorConvertDirection); 405 SetError(kErrorConvertDirection);
381 return converted; 406 return converted;
382 } 407 }
383 408
384 bool UsbAsyncApiTransferFunction::ConvertRequestTypeSafely( 409 bool UsbAsyncApiTransferFunction::ConvertRequestTypeSafely(
385 const RequestType& input, UsbDevice::TransferRequestType* output) { 410 const RequestType& input, UsbDeviceHandle::TransferRequestType* output) {
386 const bool converted = ConvertRequestType(input, output); 411 const bool converted = ConvertRequestType(input, output);
387 if (!converted) 412 if (!converted)
388 SetError(kErrorConvertRequestType); 413 SetError(kErrorConvertRequestType);
389 return converted; 414 return converted;
390 } 415 }
391 416
392 bool UsbAsyncApiTransferFunction::ConvertRecipientSafely( 417 bool UsbAsyncApiTransferFunction::ConvertRecipientSafely(
393 const Recipient& input, UsbDevice::TransferRecipient* output) { 418 const Recipient& input, UsbDeviceHandle::TransferRecipient* output) {
394 const bool converted = ConvertRecipient(input, output); 419 const bool converted = ConvertRecipient(input, output);
395 if (!converted) 420 if (!converted)
396 SetError(kErrorConvertRecipient); 421 SetError(kErrorConvertRecipient);
397 return converted; 422 return converted;
398 } 423 }
399 424
400 UsbFindDevicesFunction::UsbFindDevicesFunction() {} 425 UsbFindDevicesFunction::UsbFindDevicesFunction()
426 : service_(NULL) {}
401 427
402 UsbFindDevicesFunction::~UsbFindDevicesFunction() {} 428 UsbFindDevicesFunction::~UsbFindDevicesFunction() {}
403 429
404 void UsbFindDevicesFunction::SetDeviceForTest(UsbDevice* device) { 430 void UsbFindDevicesFunction::SetDeviceForTest(UsbDeviceHandle* device) {
405 device_for_test_ = device; 431 device_for_test_ = device;
406 } 432 }
407 433
434 bool UsbFindDevicesFunction::PrePrepare() {
435 service_ = UsbServiceFactory::GetInstance()->GetForProfile(profile());
436 if (service_ == NULL) {
437 LOG(WARNING) << "Could not get UsbService for active profile.";
438 SetError(kErrorNoDevice);
439 return false;
440 }
441 return UsbAsyncApiFunction::PrePrepare();
442 }
443
408 bool UsbFindDevicesFunction::Prepare() { 444 bool UsbFindDevicesFunction::Prepare() {
409 parameters_ = FindDevices::Params::Create(*args_); 445 parameters_ = FindDevices::Params::Create(*args_);
410 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 446 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
411 return true; 447 return true;
412 } 448 }
413 449
414 void UsbFindDevicesFunction::AsyncWorkStart() { 450 void UsbFindDevicesFunction::AsyncWorkStart() {
415 result_.reset(new base::ListValue()); 451 result_.reset(new base::ListValue());
416 452
417 if (device_for_test_) { 453 if (device_for_test_) {
418 UsbDeviceResource* const resource = new UsbDeviceResource(
419 extension_->id(),
420 device_for_test_);
421
422 Device device; 454 Device device;
423 result_->Append(PopulateDevice(manager_->Add(resource), 0, 0)); 455 result_->Append(PopulateDevice(device_for_test_->device(), 0, 0));
424 SetResult(result_.release()); 456 SetResult(result_.release());
425 AsyncWorkCompleted(); 457 AsyncWorkCompleted();
426 return; 458 return;
427 } 459 }
428 460
429 const uint16_t vendor_id = parameters_->options.vendor_id; 461 const uint16_t vendor_id = parameters_->options.vendor_id;
430 const uint16_t product_id = parameters_->options.product_id; 462 const uint16_t product_id = parameters_->options.product_id;
431 int interface_id = parameters_->options.interface_id.get() ? 463 int interface_id = parameters_->options.interface_id.get() ?
432 *parameters_->options.interface_id.get() : 464 *parameters_->options.interface_id.get() :
433 UsbDevicePermissionData::ANY_INTERFACE; 465 UsbDevicePermissionData::ANY_INTERFACE;
434 UsbDevicePermission::CheckParam param(vendor_id, product_id, interface_id); 466 UsbDevicePermission::CheckParam param(vendor_id, product_id, interface_id);
435 if (!PermissionsData::CheckAPIPermissionWithParam( 467 if (!PermissionsData::CheckAPIPermissionWithParam(
436 GetExtension(), APIPermission::kUsbDevice, &param)) { 468 GetExtension(), APIPermission::kUsbDevice, &param)) {
437 LOG(WARNING) << "Insufficient permissions to access device."; 469 LOG(WARNING) << "Insufficient permissions to access device.";
438 CompleteWithError(kErrorPermissionDenied); 470 CompleteWithError(kErrorPermissionDenied);
439 return; 471 return;
440 } 472 }
441 473
442 UsbService* const service = UsbServiceFactory::GetInstance()->GetForProfile( 474 BrowserThread::PostTask(
443 profile()); 475 BrowserThread::FILE,
444 if (!service) { 476 FROM_HERE,
445 LOG(WARNING) << "Could not get UsbService for active profile."; 477 base::Bind(&UsbService::FindDevices,
446 CompleteWithError(kErrorNoDevice); 478 base::Unretained(service_),
447 return; 479 vendor_id, product_id, interface_id, &devices_,
448 } 480 base::Bind(&UsbFindDevicesFunction::OnCompleted, this)));
449
450 service->FindDevices(vendor_id, product_id, interface_id, &devices_,
451 base::Bind(&UsbFindDevicesFunction::OnCompleted, this));
452 } 481 }
453 482
454 void UsbFindDevicesFunction::OnCompleted() { 483 void UsbFindDevicesFunction::OnCompleted() {
455 for (size_t i = 0; i < devices_.size(); ++i) { 484 for (size_t i = 0; i < devices_.size(); ++i) {
456 UsbDevice* const device = devices_[i].get(); 485 result_->Append(PopulateDevice(devices_[i],
457 UsbDeviceResource* const resource =
458 new UsbDeviceResource(extension_->id(), device);
459
460 Device js_device;
461 result_->Append(PopulateDevice(manager_->Add(resource),
462 parameters_->options.vendor_id, 486 parameters_->options.vendor_id,
463 parameters_->options.product_id)); 487 parameters_->options.product_id));
464 } 488 }
465 489
466 SetResult(result_.release()); 490 SetResult(result_.release());
467 AsyncWorkCompleted(); 491 AsyncWorkCompleted();
468 } 492 }
469 493
494 UsbOpenDeviceFunction::UsbOpenDeviceFunction() : service_(NULL) {}
495
496 UsbOpenDeviceFunction::~UsbOpenDeviceFunction() {}
497
498 bool UsbOpenDeviceFunction::PrePrepare() {
499 service_ = UsbServiceFactory::GetInstance()->GetForProfile(profile());
500 if (service_ == NULL) {
501 LOG(WARNING) << "Could not get UsbService for active profile.";
502 SetError(kErrorNoDevice);
503 return false;
504 }
505 return UsbAsyncApiFunction::PrePrepare();
506 }
507
508 bool UsbOpenDeviceFunction::Prepare() {
509 parameters_ = OpenDevice::Params::Create(*args_);
510 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
511 return true;
512 }
513
514 void UsbOpenDeviceFunction::AsyncWorkStart() {
515 if (device_for_test_) {
516 DeviceHandle handle;
517 UsbDeviceResource* const resource = new UsbDeviceResource(
518 extension_->id(),
519 device_for_test_);
520 handle.handle = manager_->Add(resource);
521 SetResult(handle.ToValue().release());
522 AsyncWorkCompleted();
523 return;
524 }
525 BrowserThread::PostTask(
526 BrowserThread::FILE,
527 FROM_HERE,
528 base::Bind(&UsbService::OpenDevice,
529 base::Unretained(service_),
530 parameters_->device.device,
531 base::Bind(
532 &UsbOpenDeviceFunction::OnOpened,
533 this)));
534 }
535
536 void UsbOpenDeviceFunction::OnOpened(scoped_refptr<UsbDeviceHandle> handle) {
537 if (!handle.get()) {
538 CompleteWithError(kErrorDisconnect);
539 return;
540 }
541 BrowserThread::PostTask(
542 BrowserThread::IO,
543 FROM_HERE,
544 base::Bind(&UsbOpenDeviceFunction::OnCompleted,
545 this,
546 handle));
547 }
548
549 void UsbOpenDeviceFunction::OnCompleted(scoped_refptr<UsbDeviceHandle> handle) {
550 UsbDeviceResource* const resource = new UsbDeviceResource(
551 extension_->id(),
552 handle);
553 DeviceHandle result;
554 result.handle = manager_->Add(resource);
555 SetResult(result.ToValue().release());
556 AsyncWorkCompleted();
557 return;
558 }
559
470 UsbListInterfacesFunction::UsbListInterfacesFunction() {} 560 UsbListInterfacesFunction::UsbListInterfacesFunction() {}
471 561
472 UsbListInterfacesFunction::~UsbListInterfacesFunction() {} 562 UsbListInterfacesFunction::~UsbListInterfacesFunction() {}
473 563
474 bool UsbListInterfacesFunction::Prepare() { 564 bool UsbListInterfacesFunction::Prepare() {
475 parameters_ = ListInterfaces::Params::Create(*args_); 565 parameters_ = ListInterfaces::Params::Create(*args_);
476 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 566 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
477 return true; 567 return true;
478 } 568 }
479 569
480 void UsbListInterfacesFunction::AsyncWorkStart() { 570 void UsbListInterfacesFunction::AsyncWorkStart() {
481 UsbDeviceResource* const resource = GetUsbDeviceResource( 571 UsbDeviceResource* const resource = GetUsbDeviceResource(
482 parameters_->device.handle); 572 parameters_->handle.handle);
483 if (!resource) { 573 if (!resource) {
484 CompleteWithError(kErrorNoDevice); 574 CompleteWithError(kErrorNoDevice);
485 return; 575 return;
486 } 576 }
487 577
488 config_ = new UsbConfigDescriptor(); 578 config_ = new UsbConfigDescriptor();
489 resource->device()->ListInterfaces( 579 resource->device()->ListInterfaces(
490 config_.get(), base::Bind(&UsbListInterfacesFunction::OnCompleted, this)); 580 config_.get(), base::Bind(&UsbListInterfacesFunction::OnCompleted, this));
491 } 581 }
492 582
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 UsbCloseDeviceFunction::~UsbCloseDeviceFunction() {} 687 UsbCloseDeviceFunction::~UsbCloseDeviceFunction() {}
598 688
599 bool UsbCloseDeviceFunction::Prepare() { 689 bool UsbCloseDeviceFunction::Prepare() {
600 parameters_ = CloseDevice::Params::Create(*args_); 690 parameters_ = CloseDevice::Params::Create(*args_);
601 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 691 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
602 return true; 692 return true;
603 } 693 }
604 694
605 void UsbCloseDeviceFunction::AsyncWorkStart() { 695 void UsbCloseDeviceFunction::AsyncWorkStart() {
606 UsbDeviceResource* const resource = GetUsbDeviceResource( 696 UsbDeviceResource* const resource = GetUsbDeviceResource(
607 parameters_->device.handle); 697 parameters_->handle.handle);
608 if (!resource) { 698 if (!resource) {
609 CompleteWithError(kErrorNoDevice); 699 CompleteWithError(kErrorNoDevice);
610 return; 700 return;
611 } 701 }
612 702
613 resource->device()->Close(base::Bind(&UsbCloseDeviceFunction::OnCompleted, 703 resource->device()->Close(
614 this)); 704 base::Bind(&UsbCloseDeviceFunction::OnCompleted, this));
615 RemoveUsbDeviceResource(parameters_->device.handle); 705 RemoveUsbDeviceResource(parameters_->handle.handle);
616 } 706 }
617 707
618 void UsbCloseDeviceFunction::OnCompleted() { 708 void UsbCloseDeviceFunction::OnCompleted() {
619 AsyncWorkCompleted(); 709 AsyncWorkCompleted();
620 } 710 }
621 711
622 UsbClaimInterfaceFunction::UsbClaimInterfaceFunction() {} 712 UsbClaimInterfaceFunction::UsbClaimInterfaceFunction() {}
623 713
624 UsbClaimInterfaceFunction::~UsbClaimInterfaceFunction() {} 714 UsbClaimInterfaceFunction::~UsbClaimInterfaceFunction() {}
625 715
626 bool UsbClaimInterfaceFunction::Prepare() { 716 bool UsbClaimInterfaceFunction::Prepare() {
627 parameters_ = ClaimInterface::Params::Create(*args_); 717 parameters_ = ClaimInterface::Params::Create(*args_);
628 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 718 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
629 return true; 719 return true;
630 } 720 }
631 721
632 void UsbClaimInterfaceFunction::AsyncWorkStart() { 722 void UsbClaimInterfaceFunction::AsyncWorkStart() {
633 UsbDeviceResource* resource = 723 UsbDeviceResource* resource =
634 GetUsbDeviceResource(parameters_->device.handle); 724 GetUsbDeviceResource(parameters_->handle.handle);
635 if (!resource) { 725 if (!resource) {
636 CompleteWithError(kErrorNoDevice); 726 CompleteWithError(kErrorNoDevice);
637 return; 727 return;
638 } 728 }
639 729
640 resource->device()->ClaimInterface(parameters_->interface_number, 730 resource->device()->ClaimInterface(parameters_->interface_number,
641 base::Bind(&UsbClaimInterfaceFunction::OnCompleted, this)); 731 base::Bind(&UsbClaimInterfaceFunction::OnCompleted, this));
642 } 732 }
643 733
644 void UsbClaimInterfaceFunction::OnCompleted(bool success) { 734 void UsbClaimInterfaceFunction::OnCompleted(bool success) {
645 if (!success) 735 if (!success)
646 SetError(kErrorCannotClaimInterface); 736 SetError(kErrorCannotClaimInterface);
647 AsyncWorkCompleted(); 737 AsyncWorkCompleted();
648 } 738 }
649 739
650 UsbReleaseInterfaceFunction::UsbReleaseInterfaceFunction() {} 740 UsbReleaseInterfaceFunction::UsbReleaseInterfaceFunction() {}
651 741
652 UsbReleaseInterfaceFunction::~UsbReleaseInterfaceFunction() {} 742 UsbReleaseInterfaceFunction::~UsbReleaseInterfaceFunction() {}
653 743
654 bool UsbReleaseInterfaceFunction::Prepare() { 744 bool UsbReleaseInterfaceFunction::Prepare() {
655 parameters_ = ReleaseInterface::Params::Create(*args_); 745 parameters_ = ReleaseInterface::Params::Create(*args_);
656 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 746 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
657 return true; 747 return true;
658 } 748 }
659 749
660 void UsbReleaseInterfaceFunction::AsyncWorkStart() { 750 void UsbReleaseInterfaceFunction::AsyncWorkStart() {
661 UsbDeviceResource* resource = 751 UsbDeviceResource* resource =
662 GetUsbDeviceResource(parameters_->device.handle); 752 GetUsbDeviceResource(parameters_->handle.handle);
663 if (!resource) { 753 if (!resource) {
664 CompleteWithError(kErrorNoDevice); 754 CompleteWithError(kErrorNoDevice);
665 return; 755 return;
666 } 756 }
667 757
668 resource->device()->ReleaseInterface(parameters_->interface_number, 758 resource->device()->ReleaseInterface(parameters_->interface_number,
669 base::Bind(&UsbReleaseInterfaceFunction::OnCompleted, this)); 759 base::Bind(&UsbReleaseInterfaceFunction::OnCompleted, this));
670 } 760 }
671 761
672 void UsbReleaseInterfaceFunction::OnCompleted(bool success) { 762 void UsbReleaseInterfaceFunction::OnCompleted(bool success) {
673 if (!success) 763 if (!success)
674 SetError(kErrorCannotReleaseInterface); 764 SetError(kErrorCannotReleaseInterface);
675 AsyncWorkCompleted(); 765 AsyncWorkCompleted();
676 } 766 }
677 767
678 UsbSetInterfaceAlternateSettingFunction:: 768 UsbSetInterfaceAlternateSettingFunction::
679 UsbSetInterfaceAlternateSettingFunction() {} 769 UsbSetInterfaceAlternateSettingFunction() {}
680 770
681 UsbSetInterfaceAlternateSettingFunction:: 771 UsbSetInterfaceAlternateSettingFunction::
682 ~UsbSetInterfaceAlternateSettingFunction() {} 772 ~UsbSetInterfaceAlternateSettingFunction() {}
683 773
684 bool UsbSetInterfaceAlternateSettingFunction::Prepare() { 774 bool UsbSetInterfaceAlternateSettingFunction::Prepare() {
685 parameters_ = SetInterfaceAlternateSetting::Params::Create(*args_); 775 parameters_ = SetInterfaceAlternateSetting::Params::Create(*args_);
686 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 776 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
687 return true; 777 return true;
688 } 778 }
689 779
690 void UsbSetInterfaceAlternateSettingFunction::AsyncWorkStart() { 780 void UsbSetInterfaceAlternateSettingFunction::AsyncWorkStart() {
691 UsbDeviceResource* resource = 781 UsbDeviceResource* resource =
692 GetUsbDeviceResource(parameters_->device.handle); 782 GetUsbDeviceResource(parameters_->handle.handle);
693 if (!resource) { 783 if (!resource) {
694 CompleteWithError(kErrorNoDevice); 784 CompleteWithError(kErrorNoDevice);
695 return; 785 return;
696 } 786 }
697 787
698 resource->device()->SetInterfaceAlternateSetting( 788 resource->device()->SetInterfaceAlternateSetting(
699 parameters_->interface_number, 789 parameters_->interface_number,
700 parameters_->alternate_setting, 790 parameters_->alternate_setting,
701 base::Bind(&UsbSetInterfaceAlternateSettingFunction::OnCompleted, this)); 791 base::Bind(&UsbSetInterfaceAlternateSettingFunction::OnCompleted, this));
702 } 792 }
703 793
704 void UsbSetInterfaceAlternateSettingFunction::OnCompleted(bool success) { 794 void UsbSetInterfaceAlternateSettingFunction::OnCompleted(bool success) {
705 if (!success) 795 if (!success)
706 SetError(kErrorCannotSetInterfaceAlternateSetting); 796 SetError(kErrorCannotSetInterfaceAlternateSetting);
707 AsyncWorkCompleted(); 797 AsyncWorkCompleted();
708 } 798 }
709 799
710 UsbControlTransferFunction::UsbControlTransferFunction() {} 800 UsbControlTransferFunction::UsbControlTransferFunction() {}
711 801
712 UsbControlTransferFunction::~UsbControlTransferFunction() {} 802 UsbControlTransferFunction::~UsbControlTransferFunction() {}
713 803
714 bool UsbControlTransferFunction::Prepare() { 804 bool UsbControlTransferFunction::Prepare() {
715 parameters_ = ControlTransfer::Params::Create(*args_); 805 parameters_ = ControlTransfer::Params::Create(*args_);
716 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 806 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
717 return true; 807 return true;
718 } 808 }
719 809
720 void UsbControlTransferFunction::AsyncWorkStart() { 810 void UsbControlTransferFunction::AsyncWorkStart() {
721 UsbDeviceResource* const resource = GetUsbDeviceResource( 811 UsbDeviceResource* const resource = GetUsbDeviceResource(
722 parameters_->device.handle); 812 parameters_->handle.handle);
723 if (!resource) { 813 if (!resource) {
724 CompleteWithError(kErrorNoDevice); 814 CompleteWithError(kErrorNoDevice);
725 return; 815 return;
726 } 816 }
727 817
728 const ControlTransferInfo& transfer = parameters_->transfer_info; 818 const ControlTransferInfo& transfer = parameters_->transfer_info;
729 819
730 UsbEndpointDirection direction; 820 UsbEndpointDirection direction;
731 UsbDevice::TransferRequestType request_type; 821 UsbDeviceHandle::TransferRequestType request_type;
732 UsbDevice::TransferRecipient recipient; 822 UsbDeviceHandle::TransferRecipient recipient;
733 size_t size = 0; 823 size_t size = 0;
734 824
735 if (!ConvertDirectionSafely(transfer.direction, &direction) || 825 if (!ConvertDirectionSafely(transfer.direction, &direction) ||
736 !ConvertRequestTypeSafely(transfer.request_type, &request_type) || 826 !ConvertRequestTypeSafely(transfer.request_type, &request_type) ||
737 !ConvertRecipientSafely(transfer.recipient, &recipient)) { 827 !ConvertRecipientSafely(transfer.recipient, &recipient)) {
738 AsyncWorkCompleted(); 828 AsyncWorkCompleted();
739 return; 829 return;
740 } 830 }
741 831
742 if (!GetTransferSize(transfer, &size)) { 832 if (!GetTransferSize(transfer, &size)) {
(...skipping 26 matching lines...) Expand all
769 UsbBulkTransferFunction::~UsbBulkTransferFunction() {} 859 UsbBulkTransferFunction::~UsbBulkTransferFunction() {}
770 860
771 bool UsbBulkTransferFunction::Prepare() { 861 bool UsbBulkTransferFunction::Prepare() {
772 parameters_ = BulkTransfer::Params::Create(*args_); 862 parameters_ = BulkTransfer::Params::Create(*args_);
773 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 863 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
774 return true; 864 return true;
775 } 865 }
776 866
777 void UsbBulkTransferFunction::AsyncWorkStart() { 867 void UsbBulkTransferFunction::AsyncWorkStart() {
778 UsbDeviceResource* const resource = GetUsbDeviceResource( 868 UsbDeviceResource* const resource = GetUsbDeviceResource(
779 parameters_->device.handle); 869 parameters_->handle.handle);
780 if (!resource) { 870 if (!resource) {
781 CompleteWithError(kErrorNoDevice); 871 CompleteWithError(kErrorNoDevice);
782 return; 872 return;
783 } 873 }
784 874
785 const GenericTransferInfo& transfer = parameters_->transfer_info; 875 const GenericTransferInfo& transfer = parameters_->transfer_info;
786 876
787 UsbEndpointDirection direction; 877 UsbEndpointDirection direction;
788 size_t size = 0; 878 size_t size = 0;
789 879
(...skipping 28 matching lines...) Expand all
818 UsbInterruptTransferFunction::~UsbInterruptTransferFunction() {} 908 UsbInterruptTransferFunction::~UsbInterruptTransferFunction() {}
819 909
820 bool UsbInterruptTransferFunction::Prepare() { 910 bool UsbInterruptTransferFunction::Prepare() {
821 parameters_ = InterruptTransfer::Params::Create(*args_); 911 parameters_ = InterruptTransfer::Params::Create(*args_);
822 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 912 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
823 return true; 913 return true;
824 } 914 }
825 915
826 void UsbInterruptTransferFunction::AsyncWorkStart() { 916 void UsbInterruptTransferFunction::AsyncWorkStart() {
827 UsbDeviceResource* const resource = GetUsbDeviceResource( 917 UsbDeviceResource* const resource = GetUsbDeviceResource(
828 parameters_->device.handle); 918 parameters_->handle.handle);
829 if (!resource) { 919 if (!resource) {
830 CompleteWithError(kErrorNoDevice); 920 CompleteWithError(kErrorNoDevice);
831 return; 921 return;
832 } 922 }
833 923
834 const GenericTransferInfo& transfer = parameters_->transfer_info; 924 const GenericTransferInfo& transfer = parameters_->transfer_info;
835 925
836 UsbEndpointDirection direction; 926 UsbEndpointDirection direction;
837 size_t size = 0; 927 size_t size = 0;
838 928
(...skipping 28 matching lines...) Expand all
867 UsbIsochronousTransferFunction::~UsbIsochronousTransferFunction() {} 957 UsbIsochronousTransferFunction::~UsbIsochronousTransferFunction() {}
868 958
869 bool UsbIsochronousTransferFunction::Prepare() { 959 bool UsbIsochronousTransferFunction::Prepare() {
870 parameters_ = IsochronousTransfer::Params::Create(*args_); 960 parameters_ = IsochronousTransfer::Params::Create(*args_);
871 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 961 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
872 return true; 962 return true;
873 } 963 }
874 964
875 void UsbIsochronousTransferFunction::AsyncWorkStart() { 965 void UsbIsochronousTransferFunction::AsyncWorkStart() {
876 UsbDeviceResource* const resource = GetUsbDeviceResource( 966 UsbDeviceResource* const resource = GetUsbDeviceResource(
877 parameters_->device.handle); 967 parameters_->handle.handle);
878 if (!resource) { 968 if (!resource) {
879 CompleteWithError(kErrorNoDevice); 969 CompleteWithError(kErrorNoDevice);
880 return; 970 return;
881 } 971 }
882 972
883 const IsochronousTransferInfo& transfer = parameters_->transfer_info; 973 const IsochronousTransferInfo& transfer = parameters_->transfer_info;
884 const GenericTransferInfo& generic_transfer = transfer.transfer_info; 974 const GenericTransferInfo& generic_transfer = transfer.transfer_info;
885 975
886 size_t size = 0; 976 size_t size = 0;
887 UsbEndpointDirection direction; 977 UsbEndpointDirection direction;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 UsbResetDeviceFunction::~UsbResetDeviceFunction() {} 1024 UsbResetDeviceFunction::~UsbResetDeviceFunction() {}
935 1025
936 bool UsbResetDeviceFunction::Prepare() { 1026 bool UsbResetDeviceFunction::Prepare() {
937 parameters_ = ResetDevice::Params::Create(*args_); 1027 parameters_ = ResetDevice::Params::Create(*args_);
938 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); 1028 EXTENSION_FUNCTION_VALIDATE(parameters_.get());
939 return true; 1029 return true;
940 } 1030 }
941 1031
942 void UsbResetDeviceFunction::AsyncWorkStart() { 1032 void UsbResetDeviceFunction::AsyncWorkStart() {
943 UsbDeviceResource* const resource = GetUsbDeviceResource( 1033 UsbDeviceResource* const resource = GetUsbDeviceResource(
944 parameters_->device.handle); 1034 parameters_->handle.handle);
945 if (!resource) { 1035 if (!resource) {
946 CompleteWithError(kErrorNoDevice); 1036 CompleteWithError(kErrorNoDevice);
947 return; 1037 return;
948 } 1038 }
949 1039
950 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 1040 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
951 base::Bind(&UsbResetDeviceFunction::OnStartResest, 1041 base::Bind(&UsbResetDeviceFunction::OnStartResest,
952 this, resource)); 1042 this, resource));
953 } 1043 }
954 1044
955 void UsbResetDeviceFunction::OnStartResest(UsbDeviceResource* resource) { 1045 void UsbResetDeviceFunction::OnStartResest(UsbDeviceResource* resource) {
956 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 1046 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
957 resource->device()->ResetDevice( 1047 resource->device()->ResetDevice(
958 base::Bind(&UsbResetDeviceFunction::OnCompletedFileThread, this)); 1048 base::Bind(&UsbResetDeviceFunction::OnCompletedFileThread, this));
959 } 1049 }
960 1050
961 void UsbResetDeviceFunction::OnCompletedFileThread(bool success) { 1051 void UsbResetDeviceFunction::OnCompletedFileThread(bool success) {
962 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 1052 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
963 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 1053 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
964 base::Bind(&UsbResetDeviceFunction::OnCompleted, 1054 base::Bind(&UsbResetDeviceFunction::OnCompleted,
965 this, success)); 1055 this, success));
966 return; 1056 return;
967 } 1057 }
968 1058
969 void UsbResetDeviceFunction::OnCompleted(bool success) { 1059 void UsbResetDeviceFunction::OnCompleted(bool success) {
970 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1060 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
971 if (!success) { 1061 if (!success) {
972 UsbDeviceResource* const resource = GetUsbDeviceResource( 1062 UsbDeviceResource* const resource = GetUsbDeviceResource(
973 parameters_->device.handle); 1063 parameters_->handle.handle);
974 if (!resource) { 1064 if (!resource) {
975 CompleteWithError(kErrorNoDevice); 1065 CompleteWithError(kErrorNoDevice);
976 return; 1066 return;
977 } 1067 }
978 // Close the device now because the handle is invalid after an 1068 // Close the device now because the handle is invalid after an
979 // unsuccessful reset. 1069 // unsuccessful reset.
980 resource->device()->Close( 1070 resource->device()->Close(
981 base::Bind(&UsbResetDeviceFunction::OnError, this)); 1071 base::Bind(&UsbResetDeviceFunction::OnError, this));
982 return; 1072 return;
983 } 1073 }
984 SetResult(Value::CreateBooleanValue(true)); 1074 SetResult(Value::CreateBooleanValue(true));
985 AsyncWorkCompleted(); 1075 AsyncWorkCompleted();
986 } 1076 }
987 1077
988 void UsbResetDeviceFunction::OnError() { 1078 void UsbResetDeviceFunction::OnError() {
989 RemoveUsbDeviceResource(parameters_->device.handle); 1079 RemoveUsbDeviceResource(parameters_->handle.handle);
990 SetError(kErrorResetDevice); 1080 SetError(kErrorResetDevice);
991 SetResult(Value::CreateBooleanValue(false)); 1081 SetResult(Value::CreateBooleanValue(false));
992 AsyncWorkCompleted(); 1082 AsyncWorkCompleted();
993 } 1083 }
994 1084
995 } // namespace extensions 1085 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698