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

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

Issue 18593002: Usb backend refactor step 2: Separate Usb Device Handle and Usb Device (deprecate) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 5 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"
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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, &param)) { 445 GetExtension(), APIPermission::kUsbDevice, &param)) {
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698