| Index: chrome/browser/extensions/api/usb/usb_api.cc
|
| diff --git a/chrome/browser/extensions/api/usb/usb_api.cc b/chrome/browser/extensions/api/usb/usb_api.cc
|
| deleted file mode 100644
|
| index 94c0f8c2f07798196211d16378e3ae7f86539242..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/extensions/api/usb/usb_api.cc
|
| +++ /dev/null
|
| @@ -1,1164 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/extensions/api/usb/usb_api.h"
|
| -
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/message_loop/message_loop_proxy.h"
|
| -#include "chrome/browser/extensions/api/usb/usb_device_resource.h"
|
| -#include "chrome/common/extensions/api/usb.h"
|
| -#include "components/usb_service/usb_device_handle.h"
|
| -#include "components/usb_service/usb_service.h"
|
| -#include "extensions/browser/extension_system.h"
|
| -#include "extensions/common/permissions/permissions_data.h"
|
| -#include "extensions/common/permissions/usb_device_permission.h"
|
| -
|
| -namespace usb = extensions::api::usb;
|
| -namespace BulkTransfer = usb::BulkTransfer;
|
| -namespace ClaimInterface = usb::ClaimInterface;
|
| -namespace CloseDevice = usb::CloseDevice;
|
| -namespace ControlTransfer = usb::ControlTransfer;
|
| -namespace FindDevices = usb::FindDevices;
|
| -namespace GetDevices = usb::GetDevices;
|
| -namespace InterruptTransfer = usb::InterruptTransfer;
|
| -namespace IsochronousTransfer = usb::IsochronousTransfer;
|
| -namespace ListInterfaces = usb::ListInterfaces;
|
| -namespace OpenDevice = usb::OpenDevice;
|
| -namespace ReleaseInterface = usb::ReleaseInterface;
|
| -namespace RequestAccess = usb::RequestAccess;
|
| -namespace ResetDevice = usb::ResetDevice;
|
| -namespace SetInterfaceAlternateSetting = usb::SetInterfaceAlternateSetting;
|
| -
|
| -using content::BrowserThread;
|
| -using std::string;
|
| -using std::vector;
|
| -using usb::ControlTransferInfo;
|
| -using usb::ConnectionHandle;
|
| -using usb::Device;
|
| -using usb::Direction;
|
| -using usb::EndpointDescriptor;
|
| -using usb::GenericTransferInfo;
|
| -using usb::InterfaceDescriptor;
|
| -using usb::IsochronousTransferInfo;
|
| -using usb::Recipient;
|
| -using usb::RequestType;
|
| -using usb::SynchronizationType;
|
| -using usb::TransferType;
|
| -using usb::UsageType;
|
| -using usb_service::UsbConfigDescriptor;
|
| -using usb_service::UsbDevice;
|
| -using usb_service::UsbDeviceHandle;
|
| -using usb_service::UsbEndpointDescriptor;
|
| -using usb_service::UsbEndpointDirection;
|
| -using usb_service::UsbInterfaceAltSettingDescriptor;
|
| -using usb_service::UsbInterfaceDescriptor;
|
| -using usb_service::UsbService;
|
| -using usb_service::UsbSynchronizationType;
|
| -using usb_service::UsbTransferStatus;
|
| -using usb_service::UsbTransferType;
|
| -using usb_service::UsbUsageType;
|
| -
|
| -typedef std::vector<scoped_refptr<UsbDevice> > DeviceVector;
|
| -typedef scoped_ptr<DeviceVector> ScopedDeviceVector;
|
| -
|
| -namespace {
|
| -
|
| -const char kDataKey[] = "data";
|
| -const char kResultCodeKey[] = "resultCode";
|
| -
|
| -const char kErrorInitService[] = "Failed to initialize USB service.";
|
| -
|
| -const char kErrorOpen[] = "Failed to open device.";
|
| -const char kErrorCancelled[] = "Transfer was cancelled.";
|
| -const char kErrorDisconnect[] = "Device disconnected.";
|
| -const char kErrorGeneric[] = "Transfer failed.";
|
| -#if !defined(OS_CHROMEOS)
|
| -const char kErrorNotSupported[] = "Not supported on this platform.";
|
| -#endif
|
| -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[] =
|
| - "Error setting alternate interface setting.";
|
| -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";
|
| -const char kErrorInvalidTransferLength[] =
|
| - "Transfer length must be a positive number less than 104,857,600.";
|
| -const char kErrorInvalidNumberOfPackets[] =
|
| - "Number of packets must be a positive number less than 4,194,304.";
|
| -const char kErrorInvalidPacketLength[] = "Packet length must be a "
|
| - "positive number less than 65,536.";
|
| -const char kErrorResetDevice[] =
|
| - "Error resetting the device. The device has been closed.";
|
| -
|
| -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 usb_service::USB_DIRECTION_INBOUND:
|
| - *output = usb::DIRECTION_IN;
|
| - return true;
|
| - case usb_service::USB_DIRECTION_OUTBOUND:
|
| - *output = usb::DIRECTION_OUT;
|
| - return true;
|
| - default:
|
| - NOTREACHED();
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -bool ConvertSynchronizationTypeToApi(const UsbSynchronizationType& input,
|
| - usb::SynchronizationType* output) {
|
| - switch (input) {
|
| - case usb_service::USB_SYNCHRONIZATION_NONE:
|
| - *output = usb::SYNCHRONIZATION_TYPE_NONE;
|
| - return true;
|
| - case usb_service::USB_SYNCHRONIZATION_ASYNCHRONOUS:
|
| - *output = usb::SYNCHRONIZATION_TYPE_ASYNCHRONOUS;
|
| - return true;
|
| - case usb_service::USB_SYNCHRONIZATION_ADAPTIVE:
|
| - *output = usb::SYNCHRONIZATION_TYPE_ADAPTIVE;
|
| - return true;
|
| - case usb_service::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 usb_service::USB_TRANSFER_CONTROL:
|
| - *output = usb::TRANSFER_TYPE_CONTROL;
|
| - return true;
|
| - case usb_service::USB_TRANSFER_INTERRUPT:
|
| - *output = usb::TRANSFER_TYPE_INTERRUPT;
|
| - return true;
|
| - case usb_service::USB_TRANSFER_ISOCHRONOUS:
|
| - *output = usb::TRANSFER_TYPE_ISOCHRONOUS;
|
| - return true;
|
| - case usb_service::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 usb_service::USB_USAGE_DATA:
|
| - *output = usb::USAGE_TYPE_DATA;
|
| - return true;
|
| - case usb_service::USB_USAGE_FEEDBACK:
|
| - *output = usb::USAGE_TYPE_FEEDBACK;
|
| - return true;
|
| - case usb_service::USB_USAGE_EXPLICIT_FEEDBACK:
|
| - *output = usb::USAGE_TYPE_EXPLICITFEEDBACK;
|
| - return true;
|
| - default:
|
| - NOTREACHED();
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -bool ConvertDirection(const Direction& input,
|
| - UsbEndpointDirection* output) {
|
| - switch (input) {
|
| - case usb::DIRECTION_IN:
|
| - *output = usb_service::USB_DIRECTION_INBOUND;
|
| - return true;
|
| - case usb::DIRECTION_OUT:
|
| - *output = usb_service::USB_DIRECTION_OUTBOUND;
|
| - return true;
|
| - default:
|
| - NOTREACHED();
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -bool ConvertRequestType(const RequestType& input,
|
| - UsbDeviceHandle::TransferRequestType* output) {
|
| - switch (input) {
|
| - case usb::REQUEST_TYPE_STANDARD:
|
| - *output = UsbDeviceHandle::STANDARD;
|
| - return true;
|
| - case usb::REQUEST_TYPE_CLASS:
|
| - *output = UsbDeviceHandle::CLASS;
|
| - return true;
|
| - case usb::REQUEST_TYPE_VENDOR:
|
| - *output = UsbDeviceHandle::VENDOR;
|
| - return true;
|
| - case usb::REQUEST_TYPE_RESERVED:
|
| - *output = UsbDeviceHandle::RESERVED;
|
| - return true;
|
| - default:
|
| - NOTREACHED();
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -bool ConvertRecipient(const Recipient& input,
|
| - UsbDeviceHandle::TransferRecipient* output) {
|
| - switch (input) {
|
| - case usb::RECIPIENT_DEVICE:
|
| - *output = UsbDeviceHandle::DEVICE;
|
| - return true;
|
| - case usb::RECIPIENT_INTERFACE:
|
| - *output = UsbDeviceHandle::INTERFACE;
|
| - return true;
|
| - case usb::RECIPIENT_ENDPOINT:
|
| - *output = UsbDeviceHandle::ENDPOINT;
|
| - return true;
|
| - case usb::RECIPIENT_OTHER:
|
| - *output = UsbDeviceHandle::OTHER;
|
| - return true;
|
| - default:
|
| - NOTREACHED();
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -template<class T>
|
| -bool GetTransferSize(const T& input, size_t* output) {
|
| - if (input.direction == usb::DIRECTION_IN) {
|
| - const int* length = input.length.get();
|
| - if (length && *length >= 0 &&
|
| - static_cast<size_t>(*length) < kMaxTransferLength) {
|
| - *output = *length;
|
| - return true;
|
| - }
|
| - } else if (input.direction == usb::DIRECTION_OUT) {
|
| - if (input.data.get()) {
|
| - *output = input.data->size();
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -template<class T>
|
| -scoped_refptr<net::IOBuffer> CreateBufferForTransfer(
|
| - const T& input, UsbEndpointDirection direction, size_t size) {
|
| -
|
| - if (size >= kMaxTransferLength)
|
| - return NULL;
|
| -
|
| - // Allocate a |size|-bytes buffer, or a one-byte buffer if |size| is 0. This
|
| - // is due to an impedance mismatch between IOBuffer and URBs. An IOBuffer
|
| - // cannot represent a zero-length buffer, while an URB can.
|
| - scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(std::max(
|
| - static_cast<size_t>(1), size));
|
| -
|
| - if (direction == usb_service::USB_DIRECTION_INBOUND) {
|
| - return buffer;
|
| - } else if (direction == usb_service::USB_DIRECTION_OUTBOUND) {
|
| - if (input.data.get() && size <= input.data->size()) {
|
| - memcpy(buffer->data(), input.data->data(), size);
|
| - return buffer;
|
| - }
|
| - }
|
| - NOTREACHED();
|
| - return NULL;
|
| -}
|
| -
|
| -const char* ConvertTransferStatusToErrorString(const UsbTransferStatus status) {
|
| - switch (status) {
|
| - case usb_service::USB_TRANSFER_COMPLETED:
|
| - return "";
|
| - case usb_service::USB_TRANSFER_ERROR:
|
| - return kErrorGeneric;
|
| - case usb_service::USB_TRANSFER_TIMEOUT:
|
| - return kErrorTimeout;
|
| - case usb_service::USB_TRANSFER_CANCELLED:
|
| - return kErrorCancelled;
|
| - case usb_service::USB_TRANSFER_STALLED:
|
| - return kErrorStalled;
|
| - case usb_service::USB_TRANSFER_DISCONNECT:
|
| - return kErrorDisconnect;
|
| - case usb_service::USB_TRANSFER_OVERFLOW:
|
| - return kErrorOverflow;
|
| - case usb_service::USB_TRANSFER_LENGTH_SHORT:
|
| - return kErrorTransferLength;
|
| - default:
|
| - NOTREACHED();
|
| - return "";
|
| - }
|
| -}
|
| -
|
| -#if defined(OS_CHROMEOS)
|
| -void RequestUsbDevicesAccessHelper(
|
| - ScopedDeviceVector devices,
|
| - std::vector<scoped_refptr<UsbDevice> >::iterator i,
|
| - int interface_id,
|
| - const base::Callback<void(ScopedDeviceVector result)>& callback,
|
| - bool success) {
|
| - if (success) {
|
| - ++i;
|
| - } else {
|
| - i = devices->erase(i);
|
| - }
|
| - if (i == devices->end()) {
|
| - callback.Run(devices.Pass());
|
| - return;
|
| - }
|
| - (*i)->RequestUsbAcess(interface_id, base::Bind(RequestUsbDevicesAccessHelper,
|
| - base::Passed(devices.Pass()),
|
| - i, interface_id, callback));
|
| -}
|
| -
|
| -void RequestUsbDevicesAccess(
|
| - ScopedDeviceVector devices,
|
| - int interface_id,
|
| - const base::Callback<void(ScopedDeviceVector result)>& callback) {
|
| - if (devices->empty()) {
|
| - callback.Run(devices.Pass());
|
| - return;
|
| - }
|
| - std::vector<scoped_refptr<UsbDevice> >::iterator i = devices->begin();
|
| - (*i)->RequestUsbAcess(
|
| - interface_id,
|
| - base::Bind(RequestUsbDevicesAccessHelper, base::Passed(devices.Pass()),
|
| - i, interface_id, callback));
|
| -}
|
| -#endif // OS_CHROMEOS
|
| -
|
| -base::DictionaryValue* CreateTransferInfo(
|
| - UsbTransferStatus status,
|
| - scoped_refptr<net::IOBuffer> data,
|
| - size_t length) {
|
| - base::DictionaryValue* result = new base::DictionaryValue();
|
| - result->SetInteger(kResultCodeKey, status);
|
| - result->Set(kDataKey, base::BinaryValue::CreateWithCopiedBuffer(data->data(),
|
| - length));
|
| - return result;
|
| -}
|
| -
|
| -base::Value* PopulateConnectionHandle(int handle, int vendor_id,
|
| - int product_id) {
|
| - ConnectionHandle result;
|
| - result.handle = handle;
|
| - result.vendor_id = vendor_id;
|
| - result.product_id = product_id;
|
| - return result.ToValue().release();
|
| -}
|
| -
|
| -base::Value* PopulateDevice(UsbDevice* device) {
|
| - Device result;
|
| - result.device = device->unique_id();
|
| - result.vendor_id = device->vendor_id();
|
| - result.product_id = device->product_id();
|
| - 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();
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -namespace extensions {
|
| -
|
| -UsbAsyncApiFunction::UsbAsyncApiFunction()
|
| - : manager_(NULL) {
|
| -}
|
| -
|
| -UsbAsyncApiFunction::~UsbAsyncApiFunction() {
|
| -}
|
| -
|
| -bool UsbAsyncApiFunction::PrePrepare() {
|
| - manager_ = ApiResourceManager<UsbDeviceResource>::Get(browser_context());
|
| - set_work_thread_id(BrowserThread::FILE);
|
| - return manager_ != NULL;
|
| -}
|
| -
|
| -bool UsbAsyncApiFunction::Respond() {
|
| - return error_.empty();
|
| -}
|
| -
|
| -scoped_refptr<UsbDevice>
|
| -UsbAsyncApiFunction::GetDeviceOrOrCompleteWithError(
|
| - const Device& input_device) {
|
| - const uint16_t vendor_id = input_device.vendor_id;
|
| - const uint16_t product_id = input_device.product_id;
|
| - UsbDevicePermission::CheckParam param(
|
| - vendor_id, product_id, UsbDevicePermissionData::UNSPECIFIED_INTERFACE);
|
| - if (!PermissionsData::CheckAPIPermissionWithParam(
|
| - GetExtension(), APIPermission::kUsbDevice, ¶m)) {
|
| - LOG(WARNING) << "Insufficient permissions to access device.";
|
| - CompleteWithError(kErrorPermissionDenied);
|
| - return NULL;
|
| - }
|
| -
|
| - UsbService* service = UsbService::GetInstance();
|
| - if (!service) {
|
| - CompleteWithError(kErrorInitService);
|
| - return NULL;
|
| - }
|
| - scoped_refptr<UsbDevice> device;
|
| -
|
| - device = service->GetDeviceById(input_device.device);
|
| -
|
| - if (!device) {
|
| - CompleteWithError(kErrorNoDevice);
|
| - return NULL;
|
| - }
|
| -
|
| - if (device->vendor_id() != input_device.vendor_id ||
|
| - device->product_id() != input_device.product_id) {
|
| - // Must act as if there is no such a device.
|
| - // Otherwise can be used to finger print unauthorized devices.
|
| - CompleteWithError(kErrorNoDevice);
|
| - return NULL;
|
| - }
|
| -
|
| - return device;
|
| -}
|
| -
|
| -scoped_refptr<UsbDeviceHandle>
|
| -UsbAsyncApiFunction::GetDeviceHandleOrCompleteWithError(
|
| - const ConnectionHandle& input_device_handle) {
|
| - UsbDeviceResource* resource =
|
| - manager_->Get(extension_->id(), input_device_handle.handle);
|
| - if (!resource) {
|
| - CompleteWithError(kErrorNoDevice);
|
| - return NULL;
|
| - }
|
| -
|
| - if (!resource->device() || !resource->device()->device()) {
|
| - CompleteWithError(kErrorDisconnect);
|
| - manager_->Remove(extension_->id(), input_device_handle.handle);
|
| - return NULL;
|
| - }
|
| -
|
| - if (resource->device()->device()->vendor_id() !=
|
| - input_device_handle.vendor_id ||
|
| - resource->device()->device()->product_id() !=
|
| - input_device_handle.product_id) {
|
| - CompleteWithError(kErrorNoDevice);
|
| - return NULL;
|
| - }
|
| -
|
| - return resource->device();
|
| -}
|
| -
|
| -void UsbAsyncApiFunction::RemoveUsbDeviceResource(int api_resource_id) {
|
| - manager_->Remove(extension_->id(), api_resource_id);
|
| -}
|
| -
|
| -void UsbAsyncApiFunction::CompleteWithError(const std::string& error) {
|
| - SetError(error);
|
| - AsyncWorkCompleted();
|
| -}
|
| -
|
| -UsbAsyncApiTransferFunction::UsbAsyncApiTransferFunction() {}
|
| -
|
| -UsbAsyncApiTransferFunction::~UsbAsyncApiTransferFunction() {}
|
| -
|
| -void UsbAsyncApiTransferFunction::OnCompleted(UsbTransferStatus status,
|
| - scoped_refptr<net::IOBuffer> data,
|
| - size_t length) {
|
| - if (status != usb_service::USB_TRANSFER_COMPLETED)
|
| - SetError(ConvertTransferStatusToErrorString(status));
|
| -
|
| - SetResult(CreateTransferInfo(status, data, length));
|
| - AsyncWorkCompleted();
|
| -}
|
| -
|
| -bool UsbAsyncApiTransferFunction::ConvertDirectionSafely(
|
| - const Direction& input, UsbEndpointDirection* output) {
|
| - const bool converted = ConvertDirection(input, output);
|
| - if (!converted)
|
| - SetError(kErrorConvertDirection);
|
| - return converted;
|
| -}
|
| -
|
| -bool UsbAsyncApiTransferFunction::ConvertRequestTypeSafely(
|
| - const RequestType& input, UsbDeviceHandle::TransferRequestType* output) {
|
| - const bool converted = ConvertRequestType(input, output);
|
| - if (!converted)
|
| - SetError(kErrorConvertRequestType);
|
| - return converted;
|
| -}
|
| -
|
| -bool UsbAsyncApiTransferFunction::ConvertRecipientSafely(
|
| - const Recipient& input, UsbDeviceHandle::TransferRecipient* output) {
|
| - const bool converted = ConvertRecipient(input, output);
|
| - if (!converted)
|
| - SetError(kErrorConvertRecipient);
|
| - return converted;
|
| -}
|
| -
|
| -UsbFindDevicesFunction::UsbFindDevicesFunction() {}
|
| -
|
| -UsbFindDevicesFunction::~UsbFindDevicesFunction() {}
|
| -
|
| -bool UsbFindDevicesFunction::Prepare() {
|
| - parameters_ = FindDevices::Params::Create(*args_);
|
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get());
|
| - return true;
|
| -}
|
| -
|
| -void UsbFindDevicesFunction::AsyncWorkStart() {
|
| - scoped_ptr<base::ListValue> result(new base::ListValue());
|
| -
|
| - const uint16_t vendor_id = parameters_->options.vendor_id;
|
| - const uint16_t product_id = parameters_->options.product_id;
|
| - int interface_id = parameters_->options.interface_id.get() ?
|
| - *parameters_->options.interface_id.get() :
|
| - UsbDevicePermissionData::ANY_INTERFACE;
|
| - UsbDevicePermission::CheckParam param(vendor_id, product_id, interface_id);
|
| - if (!PermissionsData::CheckAPIPermissionWithParam(
|
| - GetExtension(), APIPermission::kUsbDevice, ¶m)) {
|
| - LOG(WARNING) << "Insufficient permissions to access device.";
|
| - CompleteWithError(kErrorPermissionDenied);
|
| - return;
|
| - }
|
| -
|
| - UsbService *service = UsbService::GetInstance();
|
| - if (!service) {
|
| - CompleteWithError(kErrorInitService);
|
| - return;
|
| - }
|
| -
|
| - ScopedDeviceVector devices(new DeviceVector());
|
| - service->GetDevices(devices.get());
|
| -
|
| - for (DeviceVector::iterator it = devices->begin();
|
| - it != devices->end();) {
|
| - if ((*it)->vendor_id() != vendor_id || (*it)->product_id() != product_id) {
|
| - it = devices->erase(it);
|
| - } else {
|
| - ++it;
|
| - }
|
| - }
|
| -
|
| -#if defined(OS_CHROMEOS)
|
| - RequestUsbDevicesAccess(
|
| - devices.Pass(), interface_id,
|
| - base::Bind(&UsbFindDevicesFunction::OpenDevices, this));
|
| -#else
|
| - OpenDevices(devices.Pass());
|
| -#endif // OS_CHROMEOS
|
| -}
|
| -
|
| -void UsbFindDevicesFunction::OpenDevices(ScopedDeviceVector devices) {
|
| - base::ListValue* result = new base::ListValue();
|
| -
|
| - for (size_t i = 0; i < devices->size(); ++i) {
|
| - scoped_refptr<UsbDeviceHandle> device_handle =
|
| - devices->at(i)->Open();
|
| - if (device_handle)
|
| - device_handles_.push_back(device_handle);
|
| - }
|
| -
|
| - for (size_t i = 0; i < device_handles_.size(); ++i) {
|
| - UsbDeviceHandle* const device_handle = device_handles_[i].get();
|
| - UsbDeviceResource* const resource =
|
| - new UsbDeviceResource(extension_->id(), device_handle);
|
| -
|
| - result->Append(PopulateConnectionHandle(manager_->Add(resource),
|
| - parameters_->options.vendor_id,
|
| - parameters_->options.product_id));
|
| - }
|
| -
|
| - SetResult(result);
|
| - AsyncWorkCompleted();
|
| -}
|
| -
|
| -UsbGetDevicesFunction::UsbGetDevicesFunction() {
|
| -}
|
| -
|
| -UsbGetDevicesFunction::~UsbGetDevicesFunction() {
|
| -}
|
| -
|
| -bool UsbGetDevicesFunction::Prepare() {
|
| - parameters_ = GetDevices::Params::Create(*args_);
|
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get());
|
| - return true;
|
| -}
|
| -
|
| -void UsbGetDevicesFunction::AsyncWorkStart() {
|
| - scoped_ptr<base::ListValue> result(new base::ListValue());
|
| -
|
| - const uint16_t vendor_id = parameters_->options.vendor_id;
|
| - const uint16_t product_id = parameters_->options.product_id;
|
| - UsbDevicePermission::CheckParam param(
|
| - vendor_id, product_id, UsbDevicePermissionData::UNSPECIFIED_INTERFACE);
|
| - if (!PermissionsData::CheckAPIPermissionWithParam(
|
| - GetExtension(), APIPermission::kUsbDevice, ¶m)) {
|
| - LOG(WARNING) << "Insufficient permissions to access device.";
|
| - CompleteWithError(kErrorPermissionDenied);
|
| - return;
|
| - }
|
| -
|
| - UsbService* service = UsbService::GetInstance();
|
| - if (!service) {
|
| - CompleteWithError(kErrorInitService);
|
| - return;
|
| - }
|
| -
|
| - DeviceVector devices;
|
| - service->GetDevices(&devices);
|
| -
|
| - for (DeviceVector::iterator it = devices.begin(); it != devices.end();) {
|
| - if ((*it)->vendor_id() != vendor_id || (*it)->product_id() != product_id) {
|
| - it = devices.erase(it);
|
| - } else {
|
| - ++it;
|
| - }
|
| - }
|
| -
|
| - for (size_t i = 0; i < devices.size(); ++i) {
|
| - result->Append(PopulateDevice(devices[i].get()));
|
| - }
|
| -
|
| - SetResult(result.release());
|
| - AsyncWorkCompleted();
|
| -}
|
| -
|
| -UsbRequestAccessFunction::UsbRequestAccessFunction() {}
|
| -
|
| -UsbRequestAccessFunction::~UsbRequestAccessFunction() {}
|
| -
|
| -bool UsbRequestAccessFunction::Prepare() {
|
| - parameters_ = RequestAccess::Params::Create(*args_);
|
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get());
|
| - return true;
|
| -}
|
| -
|
| -void UsbRequestAccessFunction::AsyncWorkStart() {
|
| -#if defined(OS_CHROMEOS)
|
| - scoped_refptr<UsbDevice> device =
|
| - GetDeviceOrOrCompleteWithError(parameters_->device);
|
| - if (!device) return;
|
| -
|
| - device->RequestUsbAcess(parameters_->interface_id,
|
| - base::Bind(&UsbRequestAccessFunction::OnCompleted,
|
| - this));
|
| -#else
|
| - SetResult(new base::FundamentalValue(false));
|
| - CompleteWithError(kErrorNotSupported);
|
| -#endif // OS_CHROMEOS
|
| -}
|
| -
|
| -void UsbRequestAccessFunction::OnCompleted(bool success) {
|
| - SetResult(new base::FundamentalValue(success));
|
| - AsyncWorkCompleted();
|
| -}
|
| -
|
| -UsbOpenDeviceFunction::UsbOpenDeviceFunction() {}
|
| -
|
| -UsbOpenDeviceFunction::~UsbOpenDeviceFunction() {}
|
| -
|
| -bool UsbOpenDeviceFunction::Prepare() {
|
| - parameters_ = OpenDevice::Params::Create(*args_);
|
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get());
|
| - return true;
|
| -}
|
| -
|
| -void UsbOpenDeviceFunction::AsyncWorkStart() {
|
| - scoped_refptr<UsbDevice> device =
|
| - GetDeviceOrOrCompleteWithError(parameters_->device);
|
| - if (!device) return;
|
| -
|
| - handle_ = device->Open();
|
| - if (!handle_) {
|
| - SetError(kErrorOpen);
|
| - AsyncWorkCompleted();
|
| - return;
|
| - }
|
| -
|
| - SetResult(PopulateConnectionHandle(
|
| - manager_->Add(new UsbDeviceResource(extension_->id(), handle_)),
|
| - handle_->device()->vendor_id(),
|
| - handle_->device()->product_id()));
|
| - AsyncWorkCompleted();
|
| -}
|
| -
|
| -UsbListInterfacesFunction::UsbListInterfacesFunction() {}
|
| -
|
| -UsbListInterfacesFunction::~UsbListInterfacesFunction() {}
|
| -
|
| -bool UsbListInterfacesFunction::Prepare() {
|
| - parameters_ = ListInterfaces::Params::Create(*args_);
|
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get());
|
| - return true;
|
| -}
|
| -
|
| -void UsbListInterfacesFunction::AsyncWorkStart() {
|
| - scoped_refptr<UsbDeviceHandle> device_handle =
|
| - GetDeviceHandleOrCompleteWithError(parameters_->handle);
|
| - if (!device_handle) return;
|
| -
|
| - scoped_refptr<UsbConfigDescriptor> config =
|
| - device_handle->device()->ListInterfaces();
|
| -
|
| - if (!config) {
|
| - SetError(kErrorCannotListInterfaces);
|
| - AsyncWorkCompleted();
|
| - return;
|
| - }
|
| -
|
| - result_.reset(new base::ListValue());
|
| -
|
| - for (size_t i = 0, num_interfaces = config->GetNumInterfaces();
|
| - i < num_interfaces; ++i) {
|
| - scoped_refptr<const UsbInterfaceDescriptor>
|
| - usb_interface(config->GetInterface(i));
|
| - for (size_t j = 0, num_descriptors = usb_interface->GetNumAltSettings();
|
| - j < num_descriptors; ++j) {
|
| - scoped_refptr<const UsbInterfaceAltSettingDescriptor> descriptor
|
| - = usb_interface->GetAltSetting(j);
|
| - std::vector<linked_ptr<EndpointDescriptor> > endpoints;
|
| - for (size_t k = 0, num_endpoints = descriptor->GetNumEndpoints();
|
| - k < num_endpoints; k++) {
|
| - scoped_refptr<const UsbEndpointDescriptor> endpoint
|
| - = descriptor->GetEndpoint(k);
|
| - linked_ptr<EndpointDescriptor> endpoint_desc(new EndpointDescriptor());
|
| -
|
| - TransferType type;
|
| - Direction direction;
|
| - SynchronizationType synchronization;
|
| - UsageType usage;
|
| -
|
| - if (!ConvertTransferTypeSafely(endpoint->GetTransferType(), &type) ||
|
| - !ConvertDirectionSafely(endpoint->GetDirection(), &direction) ||
|
| - !ConvertSynchronizationTypeSafely(
|
| - endpoint->GetSynchronizationType(), &synchronization) ||
|
| - !ConvertUsageTypeSafely(endpoint->GetUsageType(), &usage)) {
|
| - SetError(kErrorCannotListInterfaces);
|
| - AsyncWorkCompleted();
|
| - return;
|
| - }
|
| -
|
| - endpoint_desc->address = endpoint->GetAddress();
|
| - endpoint_desc->type = type;
|
| - endpoint_desc->direction = direction;
|
| - endpoint_desc->maximum_packet_size = endpoint->GetMaximumPacketSize();
|
| - endpoint_desc->synchronization = synchronization;
|
| - endpoint_desc->usage = usage;
|
| -
|
| - int* polling_interval = new int;
|
| - endpoint_desc->polling_interval.reset(polling_interval);
|
| - *polling_interval = endpoint->GetPollingInterval();
|
| -
|
| - endpoints.push_back(endpoint_desc);
|
| - }
|
| -
|
| - result_->Append(PopulateInterfaceDescriptor(
|
| - descriptor->GetInterfaceNumber(),
|
| - descriptor->GetAlternateSetting(),
|
| - descriptor->GetInterfaceClass(),
|
| - descriptor->GetInterfaceSubclass(),
|
| - descriptor->GetInterfaceProtocol(),
|
| - &endpoints));
|
| - }
|
| - }
|
| -
|
| - SetResult(result_.release());
|
| - AsyncWorkCompleted();
|
| -}
|
| -
|
| -bool UsbListInterfacesFunction::ConvertDirectionSafely(
|
| - const UsbEndpointDirection& input,
|
| - usb::Direction* output) {
|
| - const bool converted = ConvertDirectionToApi(input, output);
|
| - if (!converted)
|
| - SetError(kErrorConvertDirection);
|
| - return converted;
|
| -}
|
| -
|
| -bool UsbListInterfacesFunction::ConvertSynchronizationTypeSafely(
|
| - const UsbSynchronizationType& input,
|
| - usb::SynchronizationType* output) {
|
| - const bool converted = ConvertSynchronizationTypeToApi(input, output);
|
| - if (!converted)
|
| - SetError(kErrorConvertSynchronizationType);
|
| - return converted;
|
| -}
|
| -
|
| -bool UsbListInterfacesFunction::ConvertTransferTypeSafely(
|
| - const UsbTransferType& input,
|
| - usb::TransferType* output) {
|
| - const bool converted = ConvertTransferTypeToApi(input, output);
|
| - if (!converted)
|
| - SetError(kErrorConvertTransferType);
|
| - return converted;
|
| -}
|
| -
|
| -bool UsbListInterfacesFunction::ConvertUsageTypeSafely(
|
| - const UsbUsageType& input,
|
| - usb::UsageType* output) {
|
| - const bool converted = ConvertUsageTypeToApi(input, output);
|
| - if (!converted)
|
| - SetError(kErrorConvertUsageType);
|
| - return converted;
|
| -}
|
| -
|
| -UsbCloseDeviceFunction::UsbCloseDeviceFunction() {}
|
| -
|
| -UsbCloseDeviceFunction::~UsbCloseDeviceFunction() {}
|
| -
|
| -bool UsbCloseDeviceFunction::Prepare() {
|
| - parameters_ = CloseDevice::Params::Create(*args_);
|
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get());
|
| - return true;
|
| -}
|
| -
|
| -void UsbCloseDeviceFunction::AsyncWorkStart() {
|
| - scoped_refptr<UsbDeviceHandle> device_handle =
|
| - GetDeviceHandleOrCompleteWithError(parameters_->handle);
|
| - if (!device_handle) return;
|
| -
|
| - device_handle->Close();
|
| - RemoveUsbDeviceResource(parameters_->handle.handle);
|
| - AsyncWorkCompleted();
|
| -}
|
| -
|
| -UsbClaimInterfaceFunction::UsbClaimInterfaceFunction() {}
|
| -
|
| -UsbClaimInterfaceFunction::~UsbClaimInterfaceFunction() {}
|
| -
|
| -bool UsbClaimInterfaceFunction::Prepare() {
|
| - parameters_ = ClaimInterface::Params::Create(*args_);
|
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get());
|
| - return true;
|
| -}
|
| -
|
| -void UsbClaimInterfaceFunction::AsyncWorkStart() {
|
| - scoped_refptr<UsbDeviceHandle> device_handle =
|
| - GetDeviceHandleOrCompleteWithError(parameters_->handle);
|
| - if (!device_handle) return;
|
| -
|
| - bool success = device_handle->ClaimInterface(parameters_->interface_number);
|
| -
|
| - if (!success)
|
| - SetError(kErrorCannotClaimInterface);
|
| - AsyncWorkCompleted();
|
| -}
|
| -
|
| -UsbReleaseInterfaceFunction::UsbReleaseInterfaceFunction() {}
|
| -
|
| -UsbReleaseInterfaceFunction::~UsbReleaseInterfaceFunction() {}
|
| -
|
| -bool UsbReleaseInterfaceFunction::Prepare() {
|
| - parameters_ = ReleaseInterface::Params::Create(*args_);
|
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get());
|
| - return true;
|
| -}
|
| -
|
| -void UsbReleaseInterfaceFunction::AsyncWorkStart() {
|
| - scoped_refptr<UsbDeviceHandle> device_handle =
|
| - GetDeviceHandleOrCompleteWithError(parameters_->handle);
|
| - if (!device_handle) return;
|
| -
|
| - bool success = device_handle->ReleaseInterface(parameters_->interface_number);
|
| - if (!success)
|
| - SetError(kErrorCannotReleaseInterface);
|
| - AsyncWorkCompleted();
|
| -}
|
| -
|
| -UsbSetInterfaceAlternateSettingFunction::
|
| - UsbSetInterfaceAlternateSettingFunction() {}
|
| -
|
| -UsbSetInterfaceAlternateSettingFunction::
|
| - ~UsbSetInterfaceAlternateSettingFunction() {}
|
| -
|
| -bool UsbSetInterfaceAlternateSettingFunction::Prepare() {
|
| - parameters_ = SetInterfaceAlternateSetting::Params::Create(*args_);
|
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get());
|
| - return true;
|
| -}
|
| -
|
| -void UsbSetInterfaceAlternateSettingFunction::AsyncWorkStart() {
|
| - scoped_refptr<UsbDeviceHandle> device_handle =
|
| - GetDeviceHandleOrCompleteWithError(parameters_->handle);
|
| - if (!device_handle) return;
|
| -
|
| - bool success = device_handle->SetInterfaceAlternateSetting(
|
| - parameters_->interface_number,
|
| - parameters_->alternate_setting);
|
| - if (!success)
|
| - SetError(kErrorCannotSetInterfaceAlternateSetting);
|
| -
|
| - AsyncWorkCompleted();
|
| -}
|
| -
|
| -UsbControlTransferFunction::UsbControlTransferFunction() {}
|
| -
|
| -UsbControlTransferFunction::~UsbControlTransferFunction() {}
|
| -
|
| -bool UsbControlTransferFunction::Prepare() {
|
| - parameters_ = ControlTransfer::Params::Create(*args_);
|
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get());
|
| - return true;
|
| -}
|
| -
|
| -void UsbControlTransferFunction::AsyncWorkStart() {
|
| - scoped_refptr<UsbDeviceHandle> device_handle =
|
| - GetDeviceHandleOrCompleteWithError(parameters_->handle);
|
| - if (!device_handle) return;
|
| -
|
| - const ControlTransferInfo& transfer = parameters_->transfer_info;
|
| -
|
| - UsbEndpointDirection direction;
|
| - UsbDeviceHandle::TransferRequestType request_type;
|
| - UsbDeviceHandle::TransferRecipient recipient;
|
| - size_t size = 0;
|
| -
|
| - if (!ConvertDirectionSafely(transfer.direction, &direction) ||
|
| - !ConvertRequestTypeSafely(transfer.request_type, &request_type) ||
|
| - !ConvertRecipientSafely(transfer.recipient, &recipient)) {
|
| - AsyncWorkCompleted();
|
| - return;
|
| - }
|
| -
|
| - if (!GetTransferSize(transfer, &size)) {
|
| - CompleteWithError(kErrorInvalidTransferLength);
|
| - return;
|
| - }
|
| -
|
| - scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer(
|
| - transfer, direction, size);
|
| - if (!buffer.get()) {
|
| - CompleteWithError(kErrorMalformedParameters);
|
| - return;
|
| - }
|
| -
|
| - device_handle->ControlTransfer(
|
| - direction,
|
| - request_type,
|
| - recipient,
|
| - transfer.request,
|
| - transfer.value,
|
| - transfer.index,
|
| - buffer.get(),
|
| - size,
|
| - 0,
|
| - base::Bind(&UsbControlTransferFunction::OnCompleted, this));
|
| -}
|
| -
|
| -UsbBulkTransferFunction::UsbBulkTransferFunction() {}
|
| -
|
| -UsbBulkTransferFunction::~UsbBulkTransferFunction() {}
|
| -
|
| -bool UsbBulkTransferFunction::Prepare() {
|
| - parameters_ = BulkTransfer::Params::Create(*args_);
|
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get());
|
| - return true;
|
| -}
|
| -
|
| -void UsbBulkTransferFunction::AsyncWorkStart() {
|
| - scoped_refptr<UsbDeviceHandle> device_handle =
|
| - GetDeviceHandleOrCompleteWithError(parameters_->handle);
|
| - if (!device_handle) return;
|
| -
|
| - const GenericTransferInfo& transfer = parameters_->transfer_info;
|
| -
|
| - UsbEndpointDirection direction;
|
| - size_t size = 0;
|
| -
|
| - if (!ConvertDirectionSafely(transfer.direction, &direction)) {
|
| - AsyncWorkCompleted();
|
| - return;
|
| - }
|
| -
|
| - if (!GetTransferSize(transfer, &size)) {
|
| - CompleteWithError(kErrorInvalidTransferLength);
|
| - return;
|
| - }
|
| -
|
| - scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer(
|
| - transfer, direction, size);
|
| - if (!buffer.get()) {
|
| - CompleteWithError(kErrorMalformedParameters);
|
| - return;
|
| - }
|
| -
|
| - device_handle->BulkTransfer(
|
| - direction,
|
| - transfer.endpoint,
|
| - buffer.get(),
|
| - size,
|
| - 0,
|
| - base::Bind(&UsbBulkTransferFunction::OnCompleted, this));
|
| -}
|
| -
|
| -UsbInterruptTransferFunction::UsbInterruptTransferFunction() {}
|
| -
|
| -UsbInterruptTransferFunction::~UsbInterruptTransferFunction() {}
|
| -
|
| -bool UsbInterruptTransferFunction::Prepare() {
|
| - parameters_ = InterruptTransfer::Params::Create(*args_);
|
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get());
|
| - return true;
|
| -}
|
| -
|
| -void UsbInterruptTransferFunction::AsyncWorkStart() {
|
| - scoped_refptr<UsbDeviceHandle> device_handle =
|
| - GetDeviceHandleOrCompleteWithError(parameters_->handle);
|
| - if (!device_handle) return;
|
| -
|
| - const GenericTransferInfo& transfer = parameters_->transfer_info;
|
| -
|
| - UsbEndpointDirection direction;
|
| - size_t size = 0;
|
| -
|
| - if (!ConvertDirectionSafely(transfer.direction, &direction)) {
|
| - AsyncWorkCompleted();
|
| - return;
|
| - }
|
| -
|
| - if (!GetTransferSize(transfer, &size)) {
|
| - CompleteWithError(kErrorInvalidTransferLength);
|
| - return;
|
| - }
|
| -
|
| - scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer(
|
| - transfer, direction, size);
|
| - if (!buffer.get()) {
|
| - CompleteWithError(kErrorMalformedParameters);
|
| - return;
|
| - }
|
| -
|
| - device_handle->InterruptTransfer(
|
| - direction,
|
| - transfer.endpoint,
|
| - buffer.get(),
|
| - size,
|
| - 0,
|
| - base::Bind(&UsbInterruptTransferFunction::OnCompleted, this));
|
| -}
|
| -
|
| -UsbIsochronousTransferFunction::UsbIsochronousTransferFunction() {}
|
| -
|
| -UsbIsochronousTransferFunction::~UsbIsochronousTransferFunction() {}
|
| -
|
| -bool UsbIsochronousTransferFunction::Prepare() {
|
| - parameters_ = IsochronousTransfer::Params::Create(*args_);
|
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get());
|
| - return true;
|
| -}
|
| -
|
| -void UsbIsochronousTransferFunction::AsyncWorkStart() {
|
| - scoped_refptr<UsbDeviceHandle> device_handle =
|
| - GetDeviceHandleOrCompleteWithError(parameters_->handle);
|
| - if (!device_handle) return;
|
| -
|
| - const IsochronousTransferInfo& transfer = parameters_->transfer_info;
|
| - const GenericTransferInfo& generic_transfer = transfer.transfer_info;
|
| -
|
| - size_t size = 0;
|
| - UsbEndpointDirection direction;
|
| -
|
| - if (!ConvertDirectionSafely(generic_transfer.direction, &direction)) {
|
| - AsyncWorkCompleted();
|
| - return;
|
| - }
|
| - if (!GetTransferSize(generic_transfer, &size)) {
|
| - CompleteWithError(kErrorInvalidTransferLength);
|
| - return;
|
| - }
|
| - if (transfer.packets < 0 || transfer.packets >= kMaxPackets) {
|
| - CompleteWithError(kErrorInvalidNumberOfPackets);
|
| - return;
|
| - }
|
| - unsigned int packets = transfer.packets;
|
| - if (transfer.packet_length < 0 ||
|
| - transfer.packet_length >= kMaxPacketLength) {
|
| - CompleteWithError(kErrorInvalidPacketLength);
|
| - return;
|
| - }
|
| - unsigned int packet_length = transfer.packet_length;
|
| - const uint64 total_length = packets * packet_length;
|
| - if (packets > size || total_length > size) {
|
| - CompleteWithError(kErrorTransferLength);
|
| - return;
|
| - }
|
| -
|
| - scoped_refptr<net::IOBuffer> buffer = CreateBufferForTransfer(
|
| - generic_transfer, direction, size);
|
| - if (!buffer.get()) {
|
| - CompleteWithError(kErrorMalformedParameters);
|
| - return;
|
| - }
|
| -
|
| - device_handle->IsochronousTransfer(
|
| - direction,
|
| - generic_transfer.endpoint,
|
| - buffer.get(),
|
| - size,
|
| - packets,
|
| - packet_length,
|
| - 0,
|
| - base::Bind(&UsbIsochronousTransferFunction::OnCompleted, this));
|
| -}
|
| -
|
| -UsbResetDeviceFunction::UsbResetDeviceFunction() {}
|
| -
|
| -UsbResetDeviceFunction::~UsbResetDeviceFunction() {}
|
| -
|
| -bool UsbResetDeviceFunction::Prepare() {
|
| - parameters_ = ResetDevice::Params::Create(*args_);
|
| - EXTENSION_FUNCTION_VALIDATE(parameters_.get());
|
| - return true;
|
| -}
|
| -
|
| -void UsbResetDeviceFunction::AsyncWorkStart() {
|
| - scoped_refptr<UsbDeviceHandle> device_handle =
|
| - GetDeviceHandleOrCompleteWithError(parameters_->handle);
|
| - if (!device_handle) return;
|
| -
|
| - bool success = device_handle->ResetDevice();
|
| - if (!success) {
|
| - device_handle->Close();
|
| - RemoveUsbDeviceResource(parameters_->handle.handle);
|
| - SetResult(new base::FundamentalValue(false));
|
| - CompleteWithError(kErrorResetDevice);
|
| - return;
|
| - }
|
| -
|
| - SetResult(new base::FundamentalValue(true));
|
| - AsyncWorkCompleted();
|
| -}
|
| -
|
| -} // namespace extensions
|
|
|