OLD | NEW |
| (Empty) |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "device/usb/type_converters.h" | |
6 | |
7 #include <map> | |
8 #include <utility> | |
9 | |
10 #include "base/logging.h" | |
11 #include "base/strings/utf_string_conversions.h" | |
12 #include "device/usb/usb_device.h" | |
13 #include "third_party/mojo/src/mojo/public/cpp/bindings/array.h" | |
14 | |
15 namespace mojo { | |
16 | |
17 // static | |
18 device::UsbDeviceFilter | |
19 TypeConverter<device::UsbDeviceFilter, device::usb::DeviceFilterPtr>::Convert( | |
20 const device::usb::DeviceFilterPtr& mojo_filter) { | |
21 device::UsbDeviceFilter filter; | |
22 if (mojo_filter->has_vendor_id) | |
23 filter.SetVendorId(mojo_filter->vendor_id); | |
24 if (mojo_filter->has_product_id) | |
25 filter.SetProductId(mojo_filter->product_id); | |
26 if (mojo_filter->has_class_code) | |
27 filter.SetInterfaceClass(mojo_filter->class_code); | |
28 if (mojo_filter->has_subclass_code) | |
29 filter.SetInterfaceSubclass(mojo_filter->subclass_code); | |
30 if (mojo_filter->has_protocol_code) | |
31 filter.SetInterfaceProtocol(mojo_filter->protocol_code); | |
32 return filter; | |
33 } | |
34 | |
35 // static | |
36 device::usb::TransferDirection | |
37 TypeConverter<device::usb::TransferDirection, device::UsbEndpointDirection>:: | |
38 Convert(const device::UsbEndpointDirection& direction) { | |
39 if (direction == device::USB_DIRECTION_INBOUND) | |
40 return device::usb::TRANSFER_DIRECTION_IN; | |
41 DCHECK(direction == device::USB_DIRECTION_OUTBOUND); | |
42 return device::usb::TRANSFER_DIRECTION_OUT; | |
43 } | |
44 | |
45 // static | |
46 device::usb::EndpointType | |
47 TypeConverter<device::usb::EndpointType, device::UsbTransferType>::Convert( | |
48 const device::UsbTransferType& type) { | |
49 switch (type) { | |
50 case device::USB_TRANSFER_ISOCHRONOUS: | |
51 return device::usb::ENDPOINT_TYPE_ISOCHRONOUS; | |
52 case device::USB_TRANSFER_BULK: | |
53 return device::usb::ENDPOINT_TYPE_BULK; | |
54 case device::USB_TRANSFER_INTERRUPT: | |
55 return device::usb::ENDPOINT_TYPE_INTERRUPT; | |
56 // Note that we do not expose control transfer in the public interface | |
57 // because control endpoints are implied rather than explicitly enumerated | |
58 // there. | |
59 default: | |
60 NOTREACHED(); | |
61 return device::usb::ENDPOINT_TYPE_BULK; | |
62 } | |
63 } | |
64 | |
65 // static | |
66 device::usb::EndpointInfoPtr | |
67 TypeConverter<device::usb::EndpointInfoPtr, device::UsbEndpointDescriptor>:: | |
68 Convert(const device::UsbEndpointDescriptor& endpoint) { | |
69 device::usb::EndpointInfoPtr info = device::usb::EndpointInfo::New(); | |
70 info->endpoint_number = endpoint.address; | |
71 info->direction = | |
72 ConvertTo<device::usb::TransferDirection>(endpoint.direction); | |
73 info->type = ConvertTo<device::usb::EndpointType>(endpoint.transfer_type); | |
74 info->packet_size = static_cast<uint32_t>(endpoint.maximum_packet_size); | |
75 return info.Pass(); | |
76 } | |
77 | |
78 // static | |
79 device::usb::AlternateInterfaceInfoPtr | |
80 TypeConverter<device::usb::AlternateInterfaceInfoPtr, | |
81 device::UsbInterfaceDescriptor>:: | |
82 Convert(const device::UsbInterfaceDescriptor& interface) { | |
83 device::usb::AlternateInterfaceInfoPtr info = | |
84 device::usb::AlternateInterfaceInfo::New(); | |
85 info->alternate_setting = interface.alternate_setting; | |
86 info->class_code = interface.interface_class; | |
87 info->subclass_code = interface.interface_subclass; | |
88 info->protocol_code = interface.interface_protocol; | |
89 | |
90 // Filter out control endpoints for the public interface. | |
91 info->endpoints = mojo::Array<device::usb::EndpointInfoPtr>::New(0); | |
92 for (const auto& endpoint : interface.endpoints) { | |
93 if (endpoint.transfer_type != device::USB_TRANSFER_CONTROL) | |
94 info->endpoints.push_back(device::usb::EndpointInfo::From(endpoint)); | |
95 } | |
96 | |
97 return info.Pass(); | |
98 } | |
99 | |
100 // static | |
101 mojo::Array<device::usb::InterfaceInfoPtr> | |
102 TypeConverter<mojo::Array<device::usb::InterfaceInfoPtr>, | |
103 std::vector<device::UsbInterfaceDescriptor>>:: | |
104 Convert(const std::vector<device::UsbInterfaceDescriptor>& interfaces) { | |
105 auto infos = mojo::Array<device::usb::InterfaceInfoPtr>::New(0); | |
106 | |
107 // Aggregate each alternate setting into an InterfaceInfo corresponding to its | |
108 // interface number. | |
109 std::map<uint8_t, device::usb::InterfaceInfo*> interface_map; | |
110 for (size_t i = 0; i < interfaces.size(); ++i) { | |
111 auto alternate = device::usb::AlternateInterfaceInfo::From(interfaces[i]); | |
112 auto iter = interface_map.find(interfaces[i].interface_number); | |
113 if (iter == interface_map.end()) { | |
114 // This is the first time we're seeing an alternate with this interface | |
115 // number, so add a new InterfaceInfo to the array and map the number. | |
116 auto info = device::usb::InterfaceInfo::New(); | |
117 iter = interface_map.insert(std::make_pair(interfaces[i].interface_number, | |
118 info.get())).first; | |
119 infos.push_back(info.Pass()); | |
120 } | |
121 iter->second->alternates.push_back(alternate.Pass()); | |
122 } | |
123 | |
124 return infos.Pass(); | |
125 } | |
126 | |
127 // static | |
128 device::usb::ConfigurationInfoPtr | |
129 TypeConverter<device::usb::ConfigurationInfoPtr, device::UsbConfigDescriptor>:: | |
130 Convert(const device::UsbConfigDescriptor& config) { | |
131 device::usb::ConfigurationInfoPtr info = | |
132 device::usb::ConfigurationInfo::New(); | |
133 info->configuration_value = config.configuration_value; | |
134 info->interfaces = | |
135 mojo::Array<device::usb::InterfaceInfoPtr>::From(config.interfaces); | |
136 return info.Pass(); | |
137 } | |
138 | |
139 // static | |
140 device::usb::DeviceInfoPtr | |
141 TypeConverter<device::usb::DeviceInfoPtr, device::UsbDevice>::Convert( | |
142 const device::UsbDevice& device) { | |
143 device::usb::DeviceInfoPtr info = device::usb::DeviceInfo::New(); | |
144 info->vendor_id = device.vendor_id(); | |
145 info->product_id = device.product_id(); | |
146 info->manufacturer = base::UTF16ToUTF8(device.manufacturer_string()); | |
147 info->product = base::UTF16ToUTF8(device.product_string()); | |
148 info->serial_number = base::UTF16ToUTF8(device.serial_number()); | |
149 return info.Pass(); | |
150 } | |
151 | |
152 } // namespace mojo | |
OLD | NEW |