Index: extensions/browser/api/usb/usb_api.cc |
diff --git a/extensions/browser/api/usb/usb_api.cc b/extensions/browser/api/usb/usb_api.cc |
index 22e19c4084a5efdc937f54323069dae6b6117ad3..2c2b4903953b883327a63f9c25cde8b3590495fa 100644 |
--- a/extensions/browser/api/usb/usb_api.cc |
+++ b/extensions/browser/api/usb/usb_api.cc |
@@ -27,6 +27,7 @@ namespace FindDevices = usb::FindDevices; |
namespace GetDevices = usb::GetDevices; |
namespace InterruptTransfer = usb::InterruptTransfer; |
namespace IsochronousTransfer = usb::IsochronousTransfer; |
+namespace GetConfiguration = usb::GetConfiguration; |
namespace ListInterfaces = usb::ListInterfaces; |
namespace OpenDevice = usb::OpenDevice; |
namespace ReleaseInterface = usb::ReleaseInterface; |
@@ -35,8 +36,7 @@ namespace ResetDevice = usb::ResetDevice; |
namespace SetInterfaceAlternateSetting = usb::SetInterfaceAlternateSetting; |
using content::BrowserThread; |
-using std::string; |
-using std::vector; |
+using usb::ConfigDescriptor; |
using usb::ControlTransferInfo; |
using usb::ConnectionHandle; |
using usb::Device; |
@@ -84,8 +84,6 @@ const char kErrorOverflow[] = "Inbound transfer overflow."; |
const char kErrorStalled[] = "Transfer stalled."; |
const char kErrorTimeout[] = "Transfer timed out."; |
const char kErrorTransferLength[] = "Transfer length is insufficient."; |
- |
-const char kErrorCannotListInterfaces[] = "Error listing interfaces."; |
const char kErrorCannotClaimInterface[] = "Error claiming interface."; |
const char kErrorCannotReleaseInterface[] = "Error releasing interface."; |
const char kErrorCannotSetInterfaceAlternateSetting[] = |
@@ -93,9 +91,6 @@ const char kErrorCannotSetInterfaceAlternateSetting[] = |
const char kErrorConvertDirection[] = "Invalid transfer direction."; |
const char kErrorConvertRecipient[] = "Invalid transfer recipient."; |
const char kErrorConvertRequestType[] = "Invalid request type."; |
-const char kErrorConvertSynchronizationType[] = "Invalid synchronization type"; |
-const char kErrorConvertTransferType[] = "Invalid endpoint type."; |
-const char kErrorConvertUsageType[] = "Invalid usage type."; |
const char kErrorMalformedParameters[] = "Error parsing parameters."; |
const char kErrorNoDevice[] = "No such device."; |
const char kErrorPermissionDenied[] = "Permission to access device was denied"; |
@@ -112,81 +107,8 @@ const size_t kMaxTransferLength = 100 * 1024 * 1024; |
const int kMaxPackets = 4 * 1024 * 1024; |
const int kMaxPacketLength = 64 * 1024; |
-bool ConvertDirectionToApi(const UsbEndpointDirection& input, |
- Direction* output) { |
- switch (input) { |
- case device::USB_DIRECTION_INBOUND: |
- *output = usb::DIRECTION_IN; |
- return true; |
- case device::USB_DIRECTION_OUTBOUND: |
- *output = usb::DIRECTION_OUT; |
- return true; |
- default: |
- NOTREACHED(); |
- return false; |
- } |
-} |
- |
-bool ConvertSynchronizationTypeToApi(const UsbSynchronizationType& input, |
- usb::SynchronizationType* output) { |
- switch (input) { |
- case device::USB_SYNCHRONIZATION_NONE: |
- *output = usb::SYNCHRONIZATION_TYPE_NONE; |
- return true; |
- case device::USB_SYNCHRONIZATION_ASYNCHRONOUS: |
- *output = usb::SYNCHRONIZATION_TYPE_ASYNCHRONOUS; |
- return true; |
- case device::USB_SYNCHRONIZATION_ADAPTIVE: |
- *output = usb::SYNCHRONIZATION_TYPE_ADAPTIVE; |
- return true; |
- case device::USB_SYNCHRONIZATION_SYNCHRONOUS: |
- *output = usb::SYNCHRONIZATION_TYPE_SYNCHRONOUS; |
- return true; |
- default: |
- NOTREACHED(); |
- return false; |
- } |
-} |
- |
-bool ConvertTransferTypeToApi(const UsbTransferType& input, |
- usb::TransferType* output) { |
- switch (input) { |
- case device::USB_TRANSFER_CONTROL: |
- *output = usb::TRANSFER_TYPE_CONTROL; |
- return true; |
- case device::USB_TRANSFER_INTERRUPT: |
- *output = usb::TRANSFER_TYPE_INTERRUPT; |
- return true; |
- case device::USB_TRANSFER_ISOCHRONOUS: |
- *output = usb::TRANSFER_TYPE_ISOCHRONOUS; |
- return true; |
- case device::USB_TRANSFER_BULK: |
- *output = usb::TRANSFER_TYPE_BULK; |
- return true; |
- default: |
- NOTREACHED(); |
- return false; |
- } |
-} |
- |
-bool ConvertUsageTypeToApi(const UsbUsageType& input, usb::UsageType* output) { |
- switch (input) { |
- case device::USB_USAGE_DATA: |
- *output = usb::USAGE_TYPE_DATA; |
- return true; |
- case device::USB_USAGE_FEEDBACK: |
- *output = usb::USAGE_TYPE_FEEDBACK; |
- return true; |
- case device::USB_USAGE_EXPLICIT_FEEDBACK: |
- *output = usb::USAGE_TYPE_EXPLICITFEEDBACK; |
- return true; |
- default: |
- NOTREACHED(); |
- return false; |
- } |
-} |
- |
-bool ConvertDirection(const Direction& input, UsbEndpointDirection* output) { |
+bool ConvertDirectionFromApi(const Direction& input, |
+ UsbEndpointDirection* output) { |
switch (input) { |
case usb::DIRECTION_IN: |
*output = device::USB_DIRECTION_INBOUND; |
@@ -200,8 +122,8 @@ bool ConvertDirection(const Direction& input, UsbEndpointDirection* output) { |
} |
} |
-bool ConvertRequestType(const RequestType& input, |
- UsbDeviceHandle::TransferRequestType* output) { |
+bool ConvertRequestTypeFromApi(const RequestType& input, |
+ UsbDeviceHandle::TransferRequestType* output) { |
switch (input) { |
case usb::REQUEST_TYPE_STANDARD: |
*output = UsbDeviceHandle::STANDARD; |
@@ -221,8 +143,8 @@ bool ConvertRequestType(const RequestType& input, |
} |
} |
-bool ConvertRecipient(const Recipient& input, |
- UsbDeviceHandle::TransferRecipient* output) { |
+bool ConvertRecipientFromApi(const Recipient& input, |
+ UsbDeviceHandle::TransferRecipient* output) { |
switch (input) { |
case usb::RECIPIENT_DEVICE: |
*output = UsbDeviceHandle::DEVICE; |
@@ -286,7 +208,7 @@ scoped_refptr<net::IOBuffer> CreateBufferForTransfer( |
return NULL; |
} |
-const char* ConvertTransferStatusToErrorString(const UsbTransferStatus status) { |
+const char* ConvertTransferStatusToApi(const UsbTransferStatus status) { |
switch (status) { |
case device::USB_TRANSFER_COMPLETED: |
return ""; |
@@ -380,21 +302,121 @@ base::Value* PopulateDevice(UsbDevice* device) { |
return result.ToValue().release(); |
} |
-base::Value* PopulateInterfaceDescriptor( |
- int interface_number, |
- int alternate_setting, |
- int interface_class, |
- int interface_subclass, |
- int interface_protocol, |
- std::vector<linked_ptr<EndpointDescriptor> >* endpoints) { |
- InterfaceDescriptor descriptor; |
- descriptor.interface_number = interface_number; |
- descriptor.alternate_setting = alternate_setting; |
- descriptor.interface_class = interface_class; |
- descriptor.interface_subclass = interface_subclass; |
- descriptor.interface_protocol = interface_protocol; |
- descriptor.endpoints = *endpoints; |
- return descriptor.ToValue().release(); |
+TransferType ConvertTransferTypeToApi(const UsbTransferType& input) { |
+ switch (input) { |
+ case device::USB_TRANSFER_CONTROL: |
+ return usb::TRANSFER_TYPE_CONTROL; |
+ case device::USB_TRANSFER_INTERRUPT: |
+ return usb::TRANSFER_TYPE_INTERRUPT; |
+ case device::USB_TRANSFER_ISOCHRONOUS: |
+ return usb::TRANSFER_TYPE_ISOCHRONOUS; |
+ case device::USB_TRANSFER_BULK: |
+ return usb::TRANSFER_TYPE_BULK; |
+ default: |
+ NOTREACHED(); |
+ return usb::TRANSFER_TYPE_NONE; |
+ } |
+} |
+ |
+Direction ConvertDirectionToApi(const UsbEndpointDirection& input) { |
+ switch (input) { |
+ case device::USB_DIRECTION_INBOUND: |
+ return usb::DIRECTION_IN; |
+ case device::USB_DIRECTION_OUTBOUND: |
+ return usb::DIRECTION_OUT; |
+ default: |
+ NOTREACHED(); |
+ return usb::DIRECTION_NONE; |
+ } |
+} |
+ |
+SynchronizationType ConvertSynchronizationTypeToApi( |
+ const UsbSynchronizationType& input) { |
+ switch (input) { |
+ case device::USB_SYNCHRONIZATION_NONE: |
+ return usb::SYNCHRONIZATION_TYPE_NONE; |
+ case device::USB_SYNCHRONIZATION_ASYNCHRONOUS: |
+ return usb::SYNCHRONIZATION_TYPE_ASYNCHRONOUS; |
+ case device::USB_SYNCHRONIZATION_ADAPTIVE: |
+ return usb::SYNCHRONIZATION_TYPE_ADAPTIVE; |
+ case device::USB_SYNCHRONIZATION_SYNCHRONOUS: |
+ return usb::SYNCHRONIZATION_TYPE_SYNCHRONOUS; |
+ default: |
+ NOTREACHED(); |
+ return usb::SYNCHRONIZATION_TYPE_NONE; |
+ } |
+} |
+ |
+UsageType ConvertUsageTypeToApi(const UsbUsageType& input) { |
+ switch (input) { |
+ case device::USB_USAGE_DATA: |
+ return usb::USAGE_TYPE_DATA; |
+ case device::USB_USAGE_FEEDBACK: |
+ return usb::USAGE_TYPE_FEEDBACK; |
+ case device::USB_USAGE_EXPLICIT_FEEDBACK: |
+ return usb::USAGE_TYPE_EXPLICITFEEDBACK; |
+ default: |
+ NOTREACHED(); |
+ return usb::USAGE_TYPE_NONE; |
+ } |
+} |
+ |
+void ConvertEndpointDescriptor(const UsbEndpointDescriptor& input, |
+ EndpointDescriptor* output) { |
+ output->address = input.address; |
+ output->type = ConvertTransferTypeToApi(input.transfer_type); |
+ output->direction = ConvertDirectionToApi(input.direction); |
+ output->maximum_packet_size = input.maximum_packet_size; |
+ output->synchronization = |
+ ConvertSynchronizationTypeToApi(input.synchronization_type); |
+ output->usage = ConvertUsageTypeToApi(input.usage_type); |
+ output->polling_interval.reset(new int(input.polling_interval)); |
+ if (input.extra_data.size() > 0) { |
+ output->extra_data = |
+ std::string(reinterpret_cast<const char*>(&input.extra_data[0]), |
+ input.extra_data.size()); |
+ } |
+} |
+ |
+void ConvertInterfaceDescriptor(const UsbInterfaceDescriptor& input, |
+ InterfaceDescriptor* output) { |
+ output->interface_number = input.interface_number; |
+ output->alternate_setting = input.alternate_setting; |
+ output->interface_class = input.interface_class; |
+ output->interface_subclass = input.interface_subclass; |
+ output->interface_protocol = input.interface_protocol; |
+ for (UsbEndpointDescriptor::Iterator endpointIt = input.endpoints.begin(); |
+ endpointIt != input.endpoints.end(); |
+ ++endpointIt) { |
+ linked_ptr<EndpointDescriptor> endpoint(new EndpointDescriptor); |
+ ConvertEndpointDescriptor(*endpointIt, endpoint.get()); |
+ output->endpoints.push_back(endpoint); |
+ } |
+ if (input.extra_data.size() > 0) { |
+ output->extra_data = |
+ std::string(reinterpret_cast<const char*>(&input.extra_data[0]), |
+ input.extra_data.size()); |
+ } |
+} |
+ |
+void ConvertConfigDescriptor(const UsbConfigDescriptor& input, |
+ ConfigDescriptor* output) { |
+ output->configuration_value = input.configuration_value; |
+ output->self_powered = input.self_powered; |
+ output->remote_wakeup = input.remote_wakeup; |
+ output->max_power = input.maximum_power; |
+ for (UsbInterfaceDescriptor::Iterator interfaceIt = input.interfaces.begin(); |
+ interfaceIt != input.interfaces.end(); |
+ ++interfaceIt) { |
+ linked_ptr<InterfaceDescriptor> interface(new InterfaceDescriptor); |
+ ConvertInterfaceDescriptor(*interfaceIt, interface.get()); |
+ output->interfaces.push_back(interface); |
+ } |
+ if (input.extra_data.size() > 0) { |
+ output->extra_data = |
+ std::string(reinterpret_cast<const char*>(&input.extra_data[0]), |
+ input.extra_data.size()); |
+ } |
} |
} // namespace |
@@ -516,7 +538,7 @@ void UsbAsyncApiTransferFunction::OnCompleted(UsbTransferStatus status, |
scoped_refptr<net::IOBuffer> data, |
size_t length) { |
if (status != device::USB_TRANSFER_COMPLETED) |
- SetError(ConvertTransferStatusToErrorString(status)); |
+ SetError(ConvertTransferStatusToApi(status)); |
SetResult(CreateTransferInfo(status, data, length)); |
AsyncWorkCompleted(); |
@@ -525,7 +547,7 @@ void UsbAsyncApiTransferFunction::OnCompleted(UsbTransferStatus status, |
bool UsbAsyncApiTransferFunction::ConvertDirectionSafely( |
const Direction& input, |
UsbEndpointDirection* output) { |
- const bool converted = ConvertDirection(input, output); |
+ const bool converted = ConvertDirectionFromApi(input, output); |
if (!converted) |
SetError(kErrorConvertDirection); |
return converted; |
@@ -534,7 +556,7 @@ bool UsbAsyncApiTransferFunction::ConvertDirectionSafely( |
bool UsbAsyncApiTransferFunction::ConvertRequestTypeSafely( |
const RequestType& input, |
UsbDeviceHandle::TransferRequestType* output) { |
- const bool converted = ConvertRequestType(input, output); |
+ const bool converted = ConvertRequestTypeFromApi(input, output); |
if (!converted) |
SetError(kErrorConvertRequestType); |
return converted; |
@@ -543,7 +565,7 @@ bool UsbAsyncApiTransferFunction::ConvertRequestTypeSafely( |
bool UsbAsyncApiTransferFunction::ConvertRecipientSafely( |
const Recipient& input, |
UsbDeviceHandle::TransferRecipient* output) { |
- const bool converted = ConvertRecipient(input, output); |
+ const bool converted = ConvertRecipientFromApi(input, output); |
if (!converted) |
SetError(kErrorConvertRecipient); |
return converted; |
@@ -742,113 +764,63 @@ void UsbOpenDeviceFunction::AsyncWorkStart() { |
AsyncWorkCompleted(); |
} |
-UsbListInterfacesFunction::UsbListInterfacesFunction() { |
+UsbGetConfigurationFunction::UsbGetConfigurationFunction() { |
} |
-UsbListInterfacesFunction::~UsbListInterfacesFunction() { |
+UsbGetConfigurationFunction::~UsbGetConfigurationFunction() { |
} |
-bool UsbListInterfacesFunction::Prepare() { |
- parameters_ = ListInterfaces::Params::Create(*args_); |
+bool UsbGetConfigurationFunction::Prepare() { |
+ parameters_ = GetConfiguration::Params::Create(*args_); |
EXTENSION_FUNCTION_VALIDATE(parameters_.get()); |
return true; |
} |
-void UsbListInterfacesFunction::AsyncWorkStart() { |
+void UsbGetConfigurationFunction::AsyncWorkStart() { |
scoped_refptr<UsbDeviceHandle> device_handle = |
GetDeviceHandleOrCompleteWithError(parameters_->handle); |
- if (!device_handle.get()) |
+ if (!device_handle.get()) { |
return; |
- |
- const UsbConfigDescriptor& config = |
- device_handle->GetDevice()->GetConfiguration(); |
- |
- scoped_ptr<base::ListValue> result(new base::ListValue()); |
- |
- for (UsbInterfaceDescriptor::Iterator interfaceIt = config.interfaces.begin(); |
- interfaceIt != config.interfaces.end(); |
- ++interfaceIt) { |
- std::vector<linked_ptr<EndpointDescriptor> > endpoints; |
- |
- for (UsbEndpointDescriptor::Iterator endpointIt = |
- interfaceIt->endpoints.begin(); |
- endpointIt != interfaceIt->endpoints.end(); |
- ++endpointIt) { |
- linked_ptr<EndpointDescriptor> endpoint_desc(new EndpointDescriptor()); |
- |
- TransferType type; |
- Direction direction; |
- SynchronizationType synchronization; |
- UsageType usage; |
- |
- if (!ConvertTransferTypeSafely(endpointIt->transfer_type, &type) || |
- !ConvertDirectionSafely(endpointIt->direction, &direction) || |
- !ConvertSynchronizationTypeSafely(endpointIt->synchronization_type, |
- &synchronization) || |
- !ConvertUsageTypeSafely(endpointIt->usage_type, &usage)) { |
- SetError(kErrorCannotListInterfaces); |
- AsyncWorkCompleted(); |
- return; |
- } |
- |
- endpoint_desc->address = endpointIt->address; |
- endpoint_desc->type = type; |
- endpoint_desc->direction = direction; |
- endpoint_desc->maximum_packet_size = endpointIt->maximum_packet_size; |
- endpoint_desc->synchronization = synchronization; |
- endpoint_desc->usage = usage; |
- endpoint_desc->polling_interval.reset( |
- new int(endpointIt->polling_interval)); |
- |
- endpoints.push_back(endpoint_desc); |
- } |
- |
- result->Append(PopulateInterfaceDescriptor(interfaceIt->interface_number, |
- interfaceIt->alternate_setting, |
- interfaceIt->interface_class, |
- interfaceIt->interface_subclass, |
- interfaceIt->interface_protocol, |
- &endpoints)); |
} |
- SetResult(result.release()); |
+ ConfigDescriptor config; |
+ ConvertConfigDescriptor(device_handle->GetDevice()->GetConfiguration(), |
+ &config); |
+ |
+ SetResult(config.ToValue().release()); |
AsyncWorkCompleted(); |
} |
-bool UsbListInterfacesFunction::ConvertDirectionSafely( |
- const UsbEndpointDirection& input, |
- usb::Direction* output) { |
- const bool converted = ConvertDirectionToApi(input, output); |
- if (!converted) |
- SetError(kErrorConvertDirection); |
- return converted; |
+UsbListInterfacesFunction::UsbListInterfacesFunction() { |
} |
-bool UsbListInterfacesFunction::ConvertSynchronizationTypeSafely( |
- const UsbSynchronizationType& input, |
- usb::SynchronizationType* output) { |
- const bool converted = ConvertSynchronizationTypeToApi(input, output); |
- if (!converted) |
- SetError(kErrorConvertSynchronizationType); |
- return converted; |
+UsbListInterfacesFunction::~UsbListInterfacesFunction() { |
} |
-bool UsbListInterfacesFunction::ConvertTransferTypeSafely( |
- const UsbTransferType& input, |
- usb::TransferType* output) { |
- const bool converted = ConvertTransferTypeToApi(input, output); |
- if (!converted) |
- SetError(kErrorConvertTransferType); |
- return converted; |
+bool UsbListInterfacesFunction::Prepare() { |
+ parameters_ = ListInterfaces::Params::Create(*args_); |
+ EXTENSION_FUNCTION_VALIDATE(parameters_.get()); |
+ return true; |
} |
-bool UsbListInterfacesFunction::ConvertUsageTypeSafely( |
- const UsbUsageType& input, |
- usb::UsageType* output) { |
- const bool converted = ConvertUsageTypeToApi(input, output); |
- if (!converted) |
- SetError(kErrorConvertUsageType); |
- return converted; |
+void UsbListInterfacesFunction::AsyncWorkStart() { |
+ scoped_refptr<UsbDeviceHandle> device_handle = |
+ GetDeviceHandleOrCompleteWithError(parameters_->handle); |
+ if (!device_handle.get()) { |
+ return; |
+ } |
+ |
+ ConfigDescriptor config; |
+ ConvertConfigDescriptor(device_handle->GetDevice()->GetConfiguration(), |
+ &config); |
+ |
+ scoped_ptr<base::ListValue> result(new base::ListValue); |
+ for (size_t i = 0; i < config.interfaces.size(); ++i) { |
+ result->Append(config.interfaces[i]->ToValue().release()); |
+ } |
+ |
+ SetResult(result.release()); |
+ AsyncWorkCompleted(); |
} |
UsbCloseDeviceFunction::UsbCloseDeviceFunction() { |