OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "extensions/browser/api/usb/usb_api.h" | 5 #include "extensions/browser/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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 using usb::RequestType; | 49 using usb::RequestType; |
50 using usb::SynchronizationType; | 50 using usb::SynchronizationType; |
51 using usb::TransferType; | 51 using usb::TransferType; |
52 using usb::UsageType; | 52 using usb::UsageType; |
53 using device::UsbConfigDescriptor; | 53 using device::UsbConfigDescriptor; |
54 using device::UsbDevice; | 54 using device::UsbDevice; |
55 using device::UsbDeviceFilter; | 55 using device::UsbDeviceFilter; |
56 using device::UsbDeviceHandle; | 56 using device::UsbDeviceHandle; |
57 using device::UsbEndpointDescriptor; | 57 using device::UsbEndpointDescriptor; |
58 using device::UsbEndpointDirection; | 58 using device::UsbEndpointDirection; |
59 using device::UsbInterfaceAltSettingDescriptor; | |
60 using device::UsbInterfaceDescriptor; | 59 using device::UsbInterfaceDescriptor; |
61 using device::UsbService; | 60 using device::UsbService; |
62 using device::UsbSynchronizationType; | 61 using device::UsbSynchronizationType; |
63 using device::UsbTransferStatus; | 62 using device::UsbTransferStatus; |
64 using device::UsbTransferType; | 63 using device::UsbTransferType; |
65 using device::UsbUsageType; | 64 using device::UsbUsageType; |
66 | 65 |
67 typedef std::vector<scoped_refptr<UsbDevice> > DeviceVector; | 66 typedef std::vector<scoped_refptr<UsbDevice> > DeviceVector; |
68 typedef scoped_ptr<DeviceVector> ScopedDeviceVector; | 67 typedef scoped_ptr<DeviceVector> ScopedDeviceVector; |
69 | 68 |
(...skipping 684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
754 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); | 753 EXTENSION_FUNCTION_VALIDATE(parameters_.get()); |
755 return true; | 754 return true; |
756 } | 755 } |
757 | 756 |
758 void UsbListInterfacesFunction::AsyncWorkStart() { | 757 void UsbListInterfacesFunction::AsyncWorkStart() { |
759 scoped_refptr<UsbDeviceHandle> device_handle = | 758 scoped_refptr<UsbDeviceHandle> device_handle = |
760 GetDeviceHandleOrCompleteWithError(parameters_->handle); | 759 GetDeviceHandleOrCompleteWithError(parameters_->handle); |
761 if (!device_handle.get()) | 760 if (!device_handle.get()) |
762 return; | 761 return; |
763 | 762 |
764 scoped_refptr<UsbConfigDescriptor> config = | 763 const UsbConfigDescriptor& config = |
765 device_handle->GetDevice()->ListInterfaces(); | 764 device_handle->GetDevice()->GetConfiguration(); |
766 | 765 |
767 if (!config.get()) { | 766 scoped_ptr<base::ListValue> result(new base::ListValue()); |
768 SetError(kErrorCannotListInterfaces); | 767 |
769 AsyncWorkCompleted(); | 768 for (size_t i = 0; i < config.interfaces.size(); ++i) { |
770 return; | 769 const UsbInterfaceDescriptor& usb_interface = config.interfaces[i]; |
| 770 std::vector<linked_ptr<EndpointDescriptor> > endpoints; |
| 771 |
| 772 for (size_t j = 0; j < usb_interface.endpoints.size(); ++j) { |
| 773 const UsbEndpointDescriptor& endpoint = usb_interface.endpoints[j]; |
| 774 linked_ptr<EndpointDescriptor> endpoint_desc(new EndpointDescriptor()); |
| 775 |
| 776 TransferType type; |
| 777 Direction direction; |
| 778 SynchronizationType synchronization; |
| 779 UsageType usage; |
| 780 |
| 781 if (!ConvertTransferTypeSafely(endpoint.transfer_type, &type) || |
| 782 !ConvertDirectionSafely(endpoint.direction, &direction) || |
| 783 !ConvertSynchronizationTypeSafely(endpoint.synchronization_type, |
| 784 &synchronization) || |
| 785 !ConvertUsageTypeSafely(endpoint.usage_type, &usage)) { |
| 786 SetError(kErrorCannotListInterfaces); |
| 787 AsyncWorkCompleted(); |
| 788 return; |
| 789 } |
| 790 |
| 791 endpoint_desc->address = endpoint.address; |
| 792 endpoint_desc->type = type; |
| 793 endpoint_desc->direction = direction; |
| 794 endpoint_desc->maximum_packet_size = endpoint.maximum_packet_size; |
| 795 endpoint_desc->synchronization = synchronization; |
| 796 endpoint_desc->usage = usage; |
| 797 endpoint_desc->polling_interval.reset(new int(endpoint.polling_interval)); |
| 798 |
| 799 endpoints.push_back(endpoint_desc); |
| 800 } |
| 801 |
| 802 result->Append(PopulateInterfaceDescriptor(usb_interface.interface_number, |
| 803 usb_interface.alternate_setting, |
| 804 usb_interface.interface_class, |
| 805 usb_interface.interface_subclass, |
| 806 usb_interface.interface_protocol, |
| 807 &endpoints)); |
771 } | 808 } |
772 | 809 |
773 result_.reset(new base::ListValue()); | 810 SetResult(result.release()); |
774 | |
775 for (size_t i = 0, num_interfaces = config->GetNumInterfaces(); | |
776 i < num_interfaces; | |
777 ++i) { | |
778 scoped_refptr<const UsbInterfaceDescriptor> usb_interface( | |
779 config->GetInterface(i)); | |
780 for (size_t j = 0, num_descriptors = usb_interface->GetNumAltSettings(); | |
781 j < num_descriptors; | |
782 ++j) { | |
783 scoped_refptr<const UsbInterfaceAltSettingDescriptor> descriptor = | |
784 usb_interface->GetAltSetting(j); | |
785 std::vector<linked_ptr<EndpointDescriptor> > endpoints; | |
786 for (size_t k = 0, num_endpoints = descriptor->GetNumEndpoints(); | |
787 k < num_endpoints; | |
788 k++) { | |
789 scoped_refptr<const UsbEndpointDescriptor> endpoint = | |
790 descriptor->GetEndpoint(k); | |
791 linked_ptr<EndpointDescriptor> endpoint_desc(new EndpointDescriptor()); | |
792 | |
793 TransferType type; | |
794 Direction direction; | |
795 SynchronizationType synchronization; | |
796 UsageType usage; | |
797 | |
798 if (!ConvertTransferTypeSafely(endpoint->GetTransferType(), &type) || | |
799 !ConvertDirectionSafely(endpoint->GetDirection(), &direction) || | |
800 !ConvertSynchronizationTypeSafely( | |
801 endpoint->GetSynchronizationType(), &synchronization) || | |
802 !ConvertUsageTypeSafely(endpoint->GetUsageType(), &usage)) { | |
803 SetError(kErrorCannotListInterfaces); | |
804 AsyncWorkCompleted(); | |
805 return; | |
806 } | |
807 | |
808 endpoint_desc->address = endpoint->GetAddress(); | |
809 endpoint_desc->type = type; | |
810 endpoint_desc->direction = direction; | |
811 endpoint_desc->maximum_packet_size = endpoint->GetMaximumPacketSize(); | |
812 endpoint_desc->synchronization = synchronization; | |
813 endpoint_desc->usage = usage; | |
814 | |
815 int* polling_interval = new int; | |
816 endpoint_desc->polling_interval.reset(polling_interval); | |
817 *polling_interval = endpoint->GetPollingInterval(); | |
818 | |
819 endpoints.push_back(endpoint_desc); | |
820 } | |
821 | |
822 result_->Append( | |
823 PopulateInterfaceDescriptor(descriptor->GetInterfaceNumber(), | |
824 descriptor->GetAlternateSetting(), | |
825 descriptor->GetInterfaceClass(), | |
826 descriptor->GetInterfaceSubclass(), | |
827 descriptor->GetInterfaceProtocol(), | |
828 &endpoints)); | |
829 } | |
830 } | |
831 | |
832 SetResult(result_.release()); | |
833 AsyncWorkCompleted(); | 811 AsyncWorkCompleted(); |
834 } | 812 } |
835 | 813 |
836 bool UsbListInterfacesFunction::ConvertDirectionSafely( | 814 bool UsbListInterfacesFunction::ConvertDirectionSafely( |
837 const UsbEndpointDirection& input, | 815 const UsbEndpointDirection& input, |
838 usb::Direction* output) { | 816 usb::Direction* output) { |
839 const bool converted = ConvertDirectionToApi(input, output); | 817 const bool converted = ConvertDirectionToApi(input, output); |
840 if (!converted) | 818 if (!converted) |
841 SetError(kErrorConvertDirection); | 819 SetError(kErrorConvertDirection); |
842 return converted; | 820 return converted; |
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1216 SetResult(new base::FundamentalValue(false)); | 1194 SetResult(new base::FundamentalValue(false)); |
1217 CompleteWithError(kErrorResetDevice); | 1195 CompleteWithError(kErrorResetDevice); |
1218 return; | 1196 return; |
1219 } | 1197 } |
1220 | 1198 |
1221 SetResult(new base::FundamentalValue(true)); | 1199 SetResult(new base::FundamentalValue(true)); |
1222 AsyncWorkCompleted(); | 1200 AsyncWorkCompleted(); |
1223 } | 1201 } |
1224 | 1202 |
1225 } // namespace extensions | 1203 } // namespace extensions |
OLD | NEW |