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