Chromium Code Reviews| 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" |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 292 return ""; | 292 return ""; |
| 293 } | 293 } |
| 294 } | 294 } |
| 295 | 295 |
| 296 static base::DictionaryValue* CreateTransferInfo( | 296 static base::DictionaryValue* CreateTransferInfo( |
| 297 UsbTransferStatus status, | 297 UsbTransferStatus status, |
| 298 scoped_refptr<net::IOBuffer> data, | 298 scoped_refptr<net::IOBuffer> data, |
| 299 size_t length) { | 299 size_t length) { |
| 300 base::DictionaryValue* result = new base::DictionaryValue(); | 300 base::DictionaryValue* result = new base::DictionaryValue(); |
| 301 result->SetInteger(kResultCodeKey, status); | 301 result->SetInteger(kResultCodeKey, status); |
| 302 result->Set(kDataKey, base::BinaryValue::CreateWithCopiedBuffer(data->data(), | 302 if (data) { |
| 303 length)); | 303 result->Set( |
| 304 kDataKey, | |
| 305 base::BinaryValue::CreateWithCopiedBuffer(data->data(), length)); | |
| 306 } | |
| 304 return result; | 307 return result; |
| 305 } | 308 } |
| 306 | 309 |
| 307 static base::Value* PopulateDevice(int handle, int vendor_id, int product_id) { | 310 static base::Value* PopulateDevice(int handle, int vendor_id, int product_id) { |
| 308 Device device; | 311 Device device; |
| 309 device.handle = handle; | 312 device.handle = handle; |
| 310 device.vendor_id = vendor_id; | 313 device.vendor_id = vendor_id; |
| 311 device.product_id = product_id; | 314 device.product_id = product_id; |
| 312 return device.ToValue().release(); | 315 return device.ToValue().release(); |
| 313 } | 316 } |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 391 } | 394 } |
| 392 | 395 |
| 393 bool UsbAsyncApiTransferFunction::ConvertRecipientSafely( | 396 bool UsbAsyncApiTransferFunction::ConvertRecipientSafely( |
| 394 const Recipient& input, UsbDevice::TransferRecipient* output) { | 397 const Recipient& input, UsbDevice::TransferRecipient* output) { |
| 395 const bool converted = ConvertRecipient(input, output); | 398 const bool converted = ConvertRecipient(input, output); |
| 396 if (!converted) | 399 if (!converted) |
| 397 SetError(kErrorConvertRecipient); | 400 SetError(kErrorConvertRecipient); |
| 398 return converted; | 401 return converted; |
| 399 } | 402 } |
| 400 | 403 |
| 401 UsbFindDevicesFunction::UsbFindDevicesFunction() {} | 404 UsbFindDevicesFunction::UsbFindDevicesFunction() : service_(NULL) {} |
| 402 | 405 |
| 403 UsbFindDevicesFunction::~UsbFindDevicesFunction() {} | 406 UsbFindDevicesFunction::~UsbFindDevicesFunction() {} |
| 404 | 407 |
| 405 void UsbFindDevicesFunction::SetDeviceForTest(UsbDevice* device) { | 408 void UsbFindDevicesFunction::SetDeviceForTest(UsbDevice* device) { |
| 406 device_for_test_ = device; | 409 device_for_test_ = device; |
| 407 } | 410 } |
| 408 | 411 |
| 409 bool UsbFindDevicesFunction::Prepare() { | 412 bool UsbFindDevicesFunction::Prepare() { |
| 410 parameters_ = FindDevices::Params::Create(*args_); | 413 parameters_ = FindDevices::Params::Create(*args_); |
| 411 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 414 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); |
| 415 if (device_for_test_) return true; | |
| 416 service_ = UsbServiceFactory::GetForProfile(profile()); | |
| 417 if (!service_) { | |
| 418 LOG(ERROR) << "Could not get UsbService for active profile."; | |
| 419 return false; | |
| 420 } | |
| 412 return true; | 421 return true; |
| 413 } | 422 } |
| 414 | 423 |
| 415 void UsbFindDevicesFunction::AsyncWorkStart() { | 424 void UsbFindDevicesFunction::AsyncWorkStart() { |
| 416 result_.reset(new base::ListValue()); | 425 result_.reset(new base::ListValue()); |
| 417 | 426 |
| 418 if (device_for_test_) { | 427 if (device_for_test_) { |
| 419 UsbDeviceResource* const resource = new UsbDeviceResource( | 428 UsbDeviceResource* const resource = new UsbDeviceResource( |
| 420 extension_->id(), | 429 extension_->id(), |
| 421 device_for_test_); | 430 device_for_test_); |
| 422 | 431 |
| 423 Device device; | |
| 424 result_->Append(PopulateDevice(manager_->Add(resource), 0, 0)); | 432 result_->Append(PopulateDevice(manager_->Add(resource), 0, 0)); |
| 425 SetResult(result_.release()); | 433 SetResult(result_.release()); |
| 426 AsyncWorkCompleted(); | 434 AsyncWorkCompleted(); |
| 427 return; | 435 return; |
| 428 } | 436 } |
| 429 | 437 |
| 430 const uint16_t vendor_id = parameters_->options.vendor_id; | 438 const uint16_t vendor_id = parameters_->options.vendor_id; |
| 431 const uint16_t product_id = parameters_->options.product_id; | 439 const uint16_t product_id = parameters_->options.product_id; |
| 432 int interface_id = parameters_->options.interface_id.get() ? | 440 int interface_id = parameters_->options.interface_id.get() ? |
| 433 *parameters_->options.interface_id.get() : | 441 *parameters_->options.interface_id.get() : |
| 434 UsbDevicePermissionData::ANY_INTERFACE; | 442 UsbDevicePermissionData::ANY_INTERFACE; |
| 435 UsbDevicePermission::CheckParam param(vendor_id, product_id, interface_id); | 443 UsbDevicePermission::CheckParam param(vendor_id, product_id, interface_id); |
| 436 if (!PermissionsData::CheckAPIPermissionWithParam( | 444 if (!PermissionsData::CheckAPIPermissionWithParam( |
| 437 GetExtension(), APIPermission::kUsbDevice, ¶m)) { | 445 GetExtension(), APIPermission::kUsbDevice, ¶m)) { |
| 438 LOG(WARNING) << "Insufficient permissions to access device."; | 446 LOG(WARNING) << "Insufficient permissions to access device."; |
| 439 CompleteWithError(kErrorPermissionDenied); | 447 CompleteWithError(kErrorPermissionDenied); |
| 440 return; | 448 return; |
| 441 } | 449 } |
| 442 | 450 |
| 443 UsbService* const service = UsbServiceFactory::GetInstance()->GetForProfile( | 451 BrowserThread::PostTask( |
| 444 profile()); | 452 BrowserThread::FILE, |
| 445 if (!service) { | 453 FROM_HERE, |
| 446 LOG(WARNING) << "Could not get UsbService for active profile."; | 454 base::Bind(&UsbService::FindDevices, |
| 447 CompleteWithError(kErrorNoDevice); | 455 base::Unretained(service_), |
|
pfeldman
2013/07/22 18:23:13
service_ might have been deleted by now. You shoul
Bei Zhang
2013/07/23 17:58:44
I will make it Singleton and it will never shows u
| |
| 448 return; | 456 vendor_id, |
| 449 } | 457 product_id, |
| 458 interface_id, | |
| 459 &device_ids_, | |
| 460 base::Bind(&UsbFindDevicesFunction::OpenDevices, this))); | |
| 461 } | |
| 450 | 462 |
| 451 service->FindDevices(vendor_id, product_id, interface_id, &devices_, | 463 void UsbFindDevicesFunction::OpenDevices() { |
| 452 base::Bind(&UsbFindDevicesFunction::OnCompleted, this)); | 464 for (size_t i = 0; i < device_ids_.size(); ++i) |
| 465 devices_.push_back(service_->OpenDevice(device_ids_[i])); | |
| 466 | |
| 467 BrowserThread::PostTask( | |
| 468 BrowserThread::IO, | |
| 469 FROM_HERE, | |
| 470 base::Bind(&UsbFindDevicesFunction::OnCompleted, this)); | |
| 453 } | 471 } |
| 454 | 472 |
| 455 void UsbFindDevicesFunction::OnCompleted() { | 473 void UsbFindDevicesFunction::OnCompleted() { |
| 456 for (size_t i = 0; i < devices_.size(); ++i) { | 474 for (size_t i = 0; i < devices_.size(); ++i) { |
| 457 UsbDevice* const device = devices_[i].get(); | 475 scoped_refptr<UsbDevice> device = devices_[i]; |
| 458 UsbDeviceResource* const resource = | 476 UsbDeviceResource* const resource = |
| 459 new UsbDeviceResource(extension_->id(), device); | 477 new UsbDeviceResource(extension_->id(), device); |
| 460 | 478 |
| 461 Device js_device; | |
| 462 result_->Append(PopulateDevice(manager_->Add(resource), | 479 result_->Append(PopulateDevice(manager_->Add(resource), |
| 463 parameters_->options.vendor_id, | 480 parameters_->options.vendor_id, |
| 464 parameters_->options.product_id)); | 481 parameters_->options.product_id)); |
| 465 } | 482 } |
| 466 | 483 |
| 467 SetResult(result_.release()); | 484 SetResult(result_.release()); |
| 468 AsyncWorkCompleted(); | 485 AsyncWorkCompleted(); |
| 469 } | 486 } |
| 470 | 487 |
| 471 UsbListInterfacesFunction::UsbListInterfacesFunction() {} | 488 UsbListInterfacesFunction::UsbListInterfacesFunction() {} |
| 472 | 489 |
| 473 UsbListInterfacesFunction::~UsbListInterfacesFunction() {} | 490 UsbListInterfacesFunction::~UsbListInterfacesFunction() {} |
| 474 | 491 |
| 475 bool UsbListInterfacesFunction::Prepare() { | 492 bool UsbListInterfacesFunction::Prepare() { |
| 476 parameters_ = ListInterfaces::Params::Create(*args_); | 493 parameters_ = ListInterfaces::Params::Create(*args_); |
| 477 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 494 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); |
| 478 return true; | 495 return true; |
| 479 } | 496 } |
| 480 | 497 |
| 481 void UsbListInterfacesFunction::AsyncWorkStart() { | 498 void UsbListInterfacesFunction::AsyncWorkStart() { |
| 482 UsbDeviceResource* const resource = GetUsbDeviceResource( | 499 UsbDeviceResource* const resource = GetUsbDeviceResource( |
| 483 parameters_->device.handle); | 500 parameters_->device.handle); |
| 484 if (!resource) { | 501 if (!resource) { |
| 485 CompleteWithError(kErrorNoDevice); | 502 CompleteWithError(kErrorNoDevice); |
| 486 return; | 503 return; |
| 487 } | 504 } |
| 488 | 505 |
| 489 config_ = new UsbConfigDescriptor(); | 506 config_ = new UsbConfigDescriptor(); |
| 490 resource->device()->ListInterfaces( | 507 resource->ListInterfaces( |
| 491 config_.get(), base::Bind(&UsbListInterfacesFunction::OnCompleted, this)); | 508 config_.get(), |
| 509 base::Bind(&UsbListInterfacesFunction::OnCompleted, this)); | |
| 492 } | 510 } |
| 493 | 511 |
| 494 void UsbListInterfacesFunction::OnCompleted(bool success) { | 512 void UsbListInterfacesFunction::OnCompleted(bool success) { |
| 495 if (!success) { | 513 if (!success) { |
| 496 SetError(kErrorCannotListInterfaces); | 514 SetError(kErrorCannotListInterfaces); |
| 497 AsyncWorkCompleted(); | 515 AsyncWorkCompleted(); |
| 498 return; | 516 return; |
| 499 } | 517 } |
| 500 | 518 |
| 501 result_.reset(new base::ListValue()); | 519 result_.reset(new base::ListValue()); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 604 } | 622 } |
| 605 | 623 |
| 606 void UsbCloseDeviceFunction::AsyncWorkStart() { | 624 void UsbCloseDeviceFunction::AsyncWorkStart() { |
| 607 UsbDeviceResource* const resource = GetUsbDeviceResource( | 625 UsbDeviceResource* const resource = GetUsbDeviceResource( |
| 608 parameters_->device.handle); | 626 parameters_->device.handle); |
| 609 if (!resource) { | 627 if (!resource) { |
| 610 CompleteWithError(kErrorNoDevice); | 628 CompleteWithError(kErrorNoDevice); |
| 611 return; | 629 return; |
| 612 } | 630 } |
| 613 | 631 |
| 614 resource->device()->Close(base::Bind(&UsbCloseDeviceFunction::OnCompleted, | 632 resource->Close(base::Bind(&UsbCloseDeviceFunction::OnCompleted, this)); |
| 615 this)); | |
| 616 RemoveUsbDeviceResource(parameters_->device.handle); | 633 RemoveUsbDeviceResource(parameters_->device.handle); |
| 617 } | 634 } |
| 618 | 635 |
| 619 void UsbCloseDeviceFunction::OnCompleted() { | 636 void UsbCloseDeviceFunction::OnCompleted() { |
| 620 AsyncWorkCompleted(); | 637 AsyncWorkCompleted(); |
| 621 } | 638 } |
| 622 | 639 |
| 623 UsbClaimInterfaceFunction::UsbClaimInterfaceFunction() {} | 640 UsbClaimInterfaceFunction::UsbClaimInterfaceFunction() {} |
| 624 | 641 |
| 625 UsbClaimInterfaceFunction::~UsbClaimInterfaceFunction() {} | 642 UsbClaimInterfaceFunction::~UsbClaimInterfaceFunction() {} |
| 626 | 643 |
| 627 bool UsbClaimInterfaceFunction::Prepare() { | 644 bool UsbClaimInterfaceFunction::Prepare() { |
| 628 parameters_ = ClaimInterface::Params::Create(*args_); | 645 parameters_ = ClaimInterface::Params::Create(*args_); |
| 629 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 646 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); |
| 630 return true; | 647 return true; |
| 631 } | 648 } |
| 632 | 649 |
| 633 void UsbClaimInterfaceFunction::AsyncWorkStart() { | 650 void UsbClaimInterfaceFunction::AsyncWorkStart() { |
| 634 UsbDeviceResource* resource = | 651 UsbDeviceResource* resource = |
| 635 GetUsbDeviceResource(parameters_->device.handle); | 652 GetUsbDeviceResource(parameters_->device.handle); |
| 636 if (!resource) { | 653 if (!resource) { |
| 637 CompleteWithError(kErrorNoDevice); | 654 CompleteWithError(kErrorNoDevice); |
| 638 return; | 655 return; |
| 639 } | 656 } |
| 640 | 657 |
| 641 resource->device()->ClaimInterface(parameters_->interface_number, | 658 resource->ClaimInterface( |
| 659 parameters_->interface_number, | |
| 642 base::Bind(&UsbClaimInterfaceFunction::OnCompleted, this)); | 660 base::Bind(&UsbClaimInterfaceFunction::OnCompleted, this)); |
| 643 } | 661 } |
| 644 | 662 |
| 645 void UsbClaimInterfaceFunction::OnCompleted(bool success) { | 663 void UsbClaimInterfaceFunction::OnCompleted(bool success) { |
| 646 if (!success) | 664 if (!success) |
| 647 SetError(kErrorCannotClaimInterface); | 665 SetError(kErrorCannotClaimInterface); |
| 648 AsyncWorkCompleted(); | 666 AsyncWorkCompleted(); |
| 649 } | 667 } |
| 650 | 668 |
| 651 UsbReleaseInterfaceFunction::UsbReleaseInterfaceFunction() {} | 669 UsbReleaseInterfaceFunction::UsbReleaseInterfaceFunction() {} |
| 652 | 670 |
| 653 UsbReleaseInterfaceFunction::~UsbReleaseInterfaceFunction() {} | 671 UsbReleaseInterfaceFunction::~UsbReleaseInterfaceFunction() {} |
| 654 | 672 |
| 655 bool UsbReleaseInterfaceFunction::Prepare() { | 673 bool UsbReleaseInterfaceFunction::Prepare() { |
| 656 parameters_ = ReleaseInterface::Params::Create(*args_); | 674 parameters_ = ReleaseInterface::Params::Create(*args_); |
| 657 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 675 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); |
| 658 return true; | 676 return true; |
| 659 } | 677 } |
| 660 | 678 |
| 661 void UsbReleaseInterfaceFunction::AsyncWorkStart() { | 679 void UsbReleaseInterfaceFunction::AsyncWorkStart() { |
| 662 UsbDeviceResource* resource = | 680 UsbDeviceResource* resource = |
| 663 GetUsbDeviceResource(parameters_->device.handle); | 681 GetUsbDeviceResource(parameters_->device.handle); |
| 664 if (!resource) { | 682 if (!resource) { |
| 665 CompleteWithError(kErrorNoDevice); | 683 CompleteWithError(kErrorNoDevice); |
| 666 return; | 684 return; |
| 667 } | 685 } |
| 668 | 686 |
| 669 resource->device()->ReleaseInterface(parameters_->interface_number, | 687 resource->ReleaseInterface( |
| 688 parameters_->interface_number, | |
| 670 base::Bind(&UsbReleaseInterfaceFunction::OnCompleted, this)); | 689 base::Bind(&UsbReleaseInterfaceFunction::OnCompleted, this)); |
| 671 } | 690 } |
| 672 | 691 |
| 673 void UsbReleaseInterfaceFunction::OnCompleted(bool success) { | 692 void UsbReleaseInterfaceFunction::OnCompleted(bool success) { |
| 674 if (!success) | 693 if (!success) |
| 675 SetError(kErrorCannotReleaseInterface); | 694 SetError(kErrorCannotReleaseInterface); |
| 676 AsyncWorkCompleted(); | 695 AsyncWorkCompleted(); |
| 677 } | 696 } |
| 678 | 697 |
| 679 UsbSetInterfaceAlternateSettingFunction:: | 698 UsbSetInterfaceAlternateSettingFunction:: |
| 680 UsbSetInterfaceAlternateSettingFunction() {} | 699 UsbSetInterfaceAlternateSettingFunction() {} |
| 681 | 700 |
| 682 UsbSetInterfaceAlternateSettingFunction:: | 701 UsbSetInterfaceAlternateSettingFunction:: |
| 683 ~UsbSetInterfaceAlternateSettingFunction() {} | 702 ~UsbSetInterfaceAlternateSettingFunction() {} |
| 684 | 703 |
| 685 bool UsbSetInterfaceAlternateSettingFunction::Prepare() { | 704 bool UsbSetInterfaceAlternateSettingFunction::Prepare() { |
| 686 parameters_ = SetInterfaceAlternateSetting::Params::Create(*args_); | 705 parameters_ = SetInterfaceAlternateSetting::Params::Create(*args_); |
| 687 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 706 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); |
| 688 return true; | 707 return true; |
| 689 } | 708 } |
| 690 | 709 |
| 691 void UsbSetInterfaceAlternateSettingFunction::AsyncWorkStart() { | 710 void UsbSetInterfaceAlternateSettingFunction::AsyncWorkStart() { |
| 692 UsbDeviceResource* resource = | 711 UsbDeviceResource* resource = |
| 693 GetUsbDeviceResource(parameters_->device.handle); | 712 GetUsbDeviceResource(parameters_->device.handle); |
| 694 if (!resource) { | 713 if (!resource) { |
| 695 CompleteWithError(kErrorNoDevice); | 714 CompleteWithError(kErrorNoDevice); |
| 696 return; | 715 return; |
| 697 } | 716 } |
| 698 | 717 |
| 699 resource->device()->SetInterfaceAlternateSetting( | 718 resource->SetInterfaceAlternateSetting( |
| 700 parameters_->interface_number, | 719 parameters_->interface_number, |
| 701 parameters_->alternate_setting, | 720 parameters_->alternate_setting, |
| 702 base::Bind(&UsbSetInterfaceAlternateSettingFunction::OnCompleted, this)); | 721 base::Bind(&UsbSetInterfaceAlternateSettingFunction::OnCompleted, this)); |
| 703 } | 722 } |
| 704 | 723 |
| 705 void UsbSetInterfaceAlternateSettingFunction::OnCompleted(bool success) { | 724 void UsbSetInterfaceAlternateSettingFunction::OnCompleted(bool success) { |
| 706 if (!success) | 725 if (!success) |
| 707 SetError(kErrorCannotSetInterfaceAlternateSetting); | 726 SetError(kErrorCannotSetInterfaceAlternateSetting); |
| 708 AsyncWorkCompleted(); | 727 AsyncWorkCompleted(); |
| 709 } | 728 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 745 return; | 764 return; |
| 746 } | 765 } |
| 747 | 766 |
| 748 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer( | 767 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer( |
| 749 transfer, direction, size); | 768 transfer, direction, size); |
| 750 if (!buffer.get()) { | 769 if (!buffer.get()) { |
| 751 CompleteWithError(kErrorMalformedParameters); | 770 CompleteWithError(kErrorMalformedParameters); |
| 752 return; | 771 return; |
| 753 } | 772 } |
| 754 | 773 |
| 755 resource->device()->ControlTransfer( | 774 resource->ControlTransfer( |
| 756 direction, | 775 direction, |
| 757 request_type, | 776 request_type, |
| 758 recipient, | 777 recipient, |
| 759 transfer.request, | 778 transfer.request, |
| 760 transfer.value, | 779 transfer.value, |
| 761 transfer.index, | 780 transfer.index, |
| 762 buffer.get(), | 781 buffer.get(), |
| 763 size, | 782 size, |
| 764 0, | 783 0, |
| 765 base::Bind(&UsbControlTransferFunction::OnCompleted, this)); | 784 base::Bind(&UsbControlTransferFunction::OnCompleted, this)); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 798 return; | 817 return; |
| 799 } | 818 } |
| 800 | 819 |
| 801 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer( | 820 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer( |
| 802 transfer, direction, size); | 821 transfer, direction, size); |
| 803 if (!buffer.get()) { | 822 if (!buffer.get()) { |
| 804 CompleteWithError(kErrorMalformedParameters); | 823 CompleteWithError(kErrorMalformedParameters); |
| 805 return; | 824 return; |
| 806 } | 825 } |
| 807 | 826 |
| 808 resource->device() | 827 resource->BulkTransfer( |
| 809 ->BulkTransfer(direction, | 828 direction, |
| 810 transfer.endpoint, | 829 transfer.endpoint, |
| 811 buffer.get(), | 830 buffer.get(), |
| 812 size, | 831 size, |
| 813 0, | 832 0, |
| 814 base::Bind(&UsbBulkTransferFunction::OnCompleted, this)); | 833 base::Bind(&UsbBulkTransferFunction::OnCompleted, this)); |
| 815 } | 834 } |
| 816 | 835 |
| 817 UsbInterruptTransferFunction::UsbInterruptTransferFunction() {} | 836 UsbInterruptTransferFunction::UsbInterruptTransferFunction() {} |
| 818 | 837 |
| 819 UsbInterruptTransferFunction::~UsbInterruptTransferFunction() {} | 838 UsbInterruptTransferFunction::~UsbInterruptTransferFunction() {} |
| 820 | 839 |
| 821 bool UsbInterruptTransferFunction::Prepare() { | 840 bool UsbInterruptTransferFunction::Prepare() { |
| 822 parameters_ = InterruptTransfer::Params::Create(*args_); | 841 parameters_ = InterruptTransfer::Params::Create(*args_); |
| 823 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 842 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); |
| 824 return true; | 843 return true; |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 847 return; | 866 return; |
| 848 } | 867 } |
| 849 | 868 |
| 850 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer( | 869 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer( |
| 851 transfer, direction, size); | 870 transfer, direction, size); |
| 852 if (!buffer.get()) { | 871 if (!buffer.get()) { |
| 853 CompleteWithError(kErrorMalformedParameters); | 872 CompleteWithError(kErrorMalformedParameters); |
| 854 return; | 873 return; |
| 855 } | 874 } |
| 856 | 875 |
| 857 resource->device()->InterruptTransfer( | 876 resource->InterruptTransfer( |
| 858 direction, | 877 direction, |
| 859 transfer.endpoint, | 878 transfer.endpoint, |
| 860 buffer.get(), | 879 buffer.get(), |
| 861 size, | 880 size, |
| 862 0, | 881 0, |
| 863 base::Bind(&UsbInterruptTransferFunction::OnCompleted, this)); | 882 base::Bind(&UsbInterruptTransferFunction::OnCompleted, this)); |
| 864 } | 883 } |
| 865 | 884 |
| 866 UsbIsochronousTransferFunction::UsbIsochronousTransferFunction() {} | 885 UsbIsochronousTransferFunction::UsbIsochronousTransferFunction() {} |
| 867 | 886 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 912 return; | 931 return; |
| 913 } | 932 } |
| 914 | 933 |
| 915 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer( | 934 scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer( |
| 916 generic_transfer, direction, size); | 935 generic_transfer, direction, size); |
| 917 if (!buffer.get()) { | 936 if (!buffer.get()) { |
| 918 CompleteWithError(kErrorMalformedParameters); | 937 CompleteWithError(kErrorMalformedParameters); |
| 919 return; | 938 return; |
| 920 } | 939 } |
| 921 | 940 |
| 922 resource->device()->IsochronousTransfer( | 941 resource->IsochronousTransfer( |
| 923 direction, | 942 direction, |
| 924 generic_transfer.endpoint, | 943 generic_transfer.endpoint, |
| 925 buffer.get(), | 944 buffer.get(), |
| 926 size, | 945 size, |
| 927 packets, | 946 packets, |
| 928 packet_length, | 947 packet_length, |
| 929 0, | 948 0, |
| 930 base::Bind(&UsbIsochronousTransferFunction::OnCompleted, this)); | 949 base::Bind(&UsbIsochronousTransferFunction::OnCompleted, this)); |
| 931 } | 950 } |
| 932 | 951 |
| 933 UsbResetDeviceFunction::UsbResetDeviceFunction() {} | 952 UsbResetDeviceFunction::UsbResetDeviceFunction() {} |
| 934 | 953 |
| 935 UsbResetDeviceFunction::~UsbResetDeviceFunction() {} | 954 UsbResetDeviceFunction::~UsbResetDeviceFunction() {} |
| 936 | 955 |
| 937 bool UsbResetDeviceFunction::Prepare() { | 956 bool UsbResetDeviceFunction::Prepare() { |
| 938 parameters_ = ResetDevice::Params::Create(*args_); | 957 parameters_ = ResetDevice::Params::Create(*args_); |
| 939 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 958 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); |
| 940 return true; | 959 return true; |
| 941 } | 960 } |
| 942 | 961 |
| 943 void UsbResetDeviceFunction::AsyncWorkStart() { | 962 void UsbResetDeviceFunction::AsyncWorkStart() { |
| 944 UsbDeviceResource* const resource = GetUsbDeviceResource( | 963 UsbDeviceResource* const resource = GetUsbDeviceResource( |
| 945 parameters_->device.handle); | 964 parameters_->device.handle); |
| 946 if (!resource) { | 965 if (!resource) { |
| 947 CompleteWithError(kErrorNoDevice); | 966 CompleteWithError(kErrorNoDevice); |
| 948 return; | 967 return; |
| 949 } | 968 } |
| 950 | 969 |
| 951 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, | 970 BrowserThread::PostTask( |
| 952 base::Bind(&UsbResetDeviceFunction::OnStartResest, | 971 BrowserThread::FILE, |
| 953 this, resource)); | 972 FROM_HERE, |
| 973 base::Bind(&UsbResetDeviceFunction::OnStartResest, this, resource)); | |
| 954 } | 974 } |
| 955 | 975 |
| 956 void UsbResetDeviceFunction::OnStartResest(UsbDeviceResource* resource) { | 976 void UsbResetDeviceFunction::OnStartResest(UsbDeviceResource* resource) { |
| 957 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 977 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 958 resource->device()->ResetDevice( | 978 resource->ResetDevice( |
| 959 base::Bind(&UsbResetDeviceFunction::OnCompletedFileThread, this)); | 979 base::Bind(&UsbResetDeviceFunction::OnCompletedFileThread, this)); |
| 960 } | 980 } |
| 961 | 981 |
| 962 void UsbResetDeviceFunction::OnCompletedFileThread(bool success) { | 982 void UsbResetDeviceFunction::OnCompletedFileThread(bool success) { |
| 963 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 983 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 964 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 984 BrowserThread::PostTask( |
| 965 base::Bind(&UsbResetDeviceFunction::OnCompleted, | 985 BrowserThread::IO, |
| 966 this, success)); | 986 FROM_HERE, |
| 987 base::Bind(&UsbResetDeviceFunction::OnCompleted, this, success)); | |
| 967 return; | 988 return; |
| 968 } | 989 } |
| 969 | 990 |
| 970 void UsbResetDeviceFunction::OnCompleted(bool success) { | 991 void UsbResetDeviceFunction::OnCompleted(bool success) { |
| 971 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 992 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 972 if (!success) { | 993 if (!success) { |
| 973 UsbDeviceResource* const resource = GetUsbDeviceResource( | 994 UsbDeviceResource* const resource = GetUsbDeviceResource( |
| 974 parameters_->device.handle); | 995 parameters_->device.handle); |
| 975 if (!resource) { | 996 if (!resource) { |
| 976 CompleteWithError(kErrorNoDevice); | 997 CompleteWithError(kErrorNoDevice); |
| 977 return; | 998 return; |
| 978 } | 999 } |
| 979 // Close the device now because the handle is invalid after an | 1000 // Close the device now because the handle is invalid after an |
| 980 // unsuccessful reset. | 1001 // unsuccessful reset. |
| 981 resource->device()->Close( | 1002 resource->Close(base::Bind(&UsbResetDeviceFunction::OnClosed, this)); |
| 982 base::Bind(&UsbResetDeviceFunction::OnError, this)); | |
| 983 return; | 1003 return; |
| 984 } | 1004 } |
| 985 SetResult(Value::CreateBooleanValue(true)); | 1005 SetResult(Value::CreateBooleanValue(true)); |
| 986 AsyncWorkCompleted(); | 1006 AsyncWorkCompleted(); |
| 987 } | 1007 } |
| 988 | 1008 |
| 1009 void UsbResetDeviceFunction::OnClosed() { | |
| 1010 BrowserThread::PostTask( | |
| 1011 BrowserThread::IO, | |
| 1012 FROM_HERE, | |
| 1013 base::Bind(&UsbResetDeviceFunction::OnError, this)); | |
| 1014 } | |
| 1015 | |
| 989 void UsbResetDeviceFunction::OnError() { | 1016 void UsbResetDeviceFunction::OnError() { |
| 990 RemoveUsbDeviceResource(parameters_->device.handle); | 1017 RemoveUsbDeviceResource(parameters_->device.handle); |
| 991 SetError(kErrorResetDevice); | 1018 SetError(kErrorResetDevice); |
| 992 SetResult(Value::CreateBooleanValue(false)); | 1019 SetResult(Value::CreateBooleanValue(false)); |
| 993 AsyncWorkCompleted(); | 1020 AsyncWorkCompleted(); |
| 994 } | 1021 } |
| 995 | 1022 |
| 996 } // namespace extensions | 1023 } // namespace extensions |
| OLD | NEW |