Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Unified Diff: extensions/browser/api/usb/usb_api.cc

Issue 980023002: Move device/usb classes from the FILE thread to UI thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed first round of rocket@ feedback. Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 f1fcd239c1428d22a6df91bce31bac1dc33ea898..d0238130ee55710cfa1bc28c1da1301fca064a6a 100644
--- a/extensions/browser/api/usb/usb_api.cc
+++ b/extensions/browser/api/usb/usb_api.cc
@@ -7,8 +7,8 @@
#include <string>
#include <vector>
+#include "base/barrier_closure.h"
#include "base/memory/scoped_ptr.h"
-#include "base/message_loop/message_loop_proxy.h"
#include "device/core/device_client.h"
#include "device/usb/usb_device_handle.h"
#include "device/usb/usb_service.h"
@@ -70,9 +70,6 @@ using usb::SynchronizationType;
using usb::TransferType;
using usb::UsageType;
-typedef std::vector<scoped_refptr<UsbDevice> > DeviceVector;
-typedef scoped_ptr<DeviceVector> ScopedDeviceVector;
-
namespace {
const char kDataKey[] = "data";
@@ -100,6 +97,7 @@ const char kErrorConvertDirection[] = "Invalid transfer direction.";
const char kErrorConvertRecipient[] = "Invalid transfer recipient.";
const char kErrorConvertRequestType[] = "Invalid request type.";
const char kErrorMalformedParameters[] = "Error parsing parameters.";
+const char kErrorNoConnection[] = "No such connection.";
const char kErrorNoDevice[] = "No such device.";
const char kErrorPermissionDenied[] = "Permission to access device was denied";
const char kErrorInvalidTransferLength[] =
@@ -242,56 +240,6 @@ const char* ConvertTransferStatusToApi(const UsbTransferStatus status) {
}
}
-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)->RequestUsbAccess(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)->RequestUsbAccess(interface_id,
- base::Bind(RequestUsbDevicesAccessHelper,
- base::Passed(devices.Pass()),
- i,
- interface_id,
- callback));
-}
-
-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) {
@@ -434,31 +382,25 @@ void ConvertDeviceFilter(const usb::DeviceFilter& input,
namespace extensions {
-UsbAsyncApiFunction::UsbAsyncApiFunction() : manager_(NULL) {
-}
-
-UsbAsyncApiFunction::~UsbAsyncApiFunction() {
+UsbPermissionCheckingFunction::UsbPermissionCheckingFunction()
+ : device_permissions_manager_(nullptr) {
}
-bool UsbAsyncApiFunction::PrePrepare() {
- manager_ = ApiResourceManager<UsbDeviceResource>::Get(browser_context());
- set_work_thread_id(BrowserThread::FILE);
- return manager_ != NULL;
+UsbPermissionCheckingFunction::~UsbPermissionCheckingFunction() {
}
-bool UsbAsyncApiFunction::Respond() {
- return error_.empty();
-}
-
-bool UsbAsyncApiFunction::HasDevicePermission(scoped_refptr<UsbDevice> device) {
- DCHECK(device_permissions_);
+bool UsbPermissionCheckingFunction::HasDevicePermission(
+ scoped_refptr<UsbDevice> device) {
+ if (!device_permissions_manager_) {
+ device_permissions_manager_ =
+ DevicePermissionsManager::Get(browser_context());
+ }
- // Check the DevicePermissionsManager first so that if an entry is found
- // it can be stored for later. This requires the serial number.
- base::string16 serial_number;
- device->GetSerialNumber(&serial_number);
+ DevicePermissions* device_permissions =
+ device_permissions_manager_->GetForExtension(extension_id());
+ DCHECK(device_permissions);
- permission_entry_ = device_permissions_->FindEntry(device, serial_number);
+ permission_entry_ = device_permissions->FindEntry(device);
if (permission_entry_.get()) {
return true;
}
@@ -475,83 +417,65 @@ bool UsbAsyncApiFunction::HasDevicePermission(scoped_refptr<UsbDevice> device) {
return false;
}
-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().get() || !resource->device()->GetDevice().get()) {
- CompleteWithError(kErrorDisconnect);
- manager_->Remove(extension_->id(), input_device_handle.handle);
- return NULL;
- }
-
- if (resource->device()->GetDevice()->vendor_id() !=
- input_device_handle.vendor_id ||
- resource->device()->GetDevice()->product_id() !=
- input_device_handle.product_id) {
- CompleteWithError(kErrorNoDevice);
- return NULL;
+void UsbPermissionCheckingFunction::RecordDeviceLastUsed() {
+ if (permission_entry_.get()) {
+ device_permissions_manager_->UpdateLastUsed(extension_id(),
+ permission_entry_);
}
-
- return resource->device();
}
-void UsbAsyncApiFunction::RemoveUsbDeviceResource(int api_resource_id) {
- manager_->Remove(extension_->id(), api_resource_id);
+UsbConnectionFunction::UsbConnectionFunction() {
}
-void UsbAsyncApiFunction::CompleteWithError(const std::string& error) {
- SetError(error);
- AsyncWorkCompleted();
+UsbConnectionFunction::~UsbConnectionFunction() {
}
-UsbAsyncApiTransferFunction::UsbAsyncApiTransferFunction() {
-}
+scoped_refptr<device::UsbDeviceHandle> UsbConnectionFunction::GetDeviceHandle(
+ const extensions::core_api::usb::ConnectionHandle& handle) {
+ ApiResourceManager<UsbDeviceResource>* manager =
+ ApiResourceManager<UsbDeviceResource>::Get(browser_context());
+ if (!manager) {
+ return nullptr;
+ }
-UsbAsyncApiTransferFunction::~UsbAsyncApiTransferFunction() {
-}
+ UsbDeviceResource* resource = manager->Get(extension_id(), handle.handle);
+ if (!resource) {
+ return nullptr;
+ }
-void UsbAsyncApiTransferFunction::OnCompleted(UsbTransferStatus status,
- scoped_refptr<net::IOBuffer> data,
- size_t length) {
- if (status != device::USB_TRANSFER_COMPLETED)
- SetError(ConvertTransferStatusToApi(status));
+ return resource->device();
+}
- SetResult(CreateTransferInfo(status, data, length));
- AsyncWorkCompleted();
+void UsbConnectionFunction::ReleaseDeviceHandle(
+ const extensions::core_api::usb::ConnectionHandle& handle) {
+ ApiResourceManager<UsbDeviceResource>* manager =
+ ApiResourceManager<UsbDeviceResource>::Get(browser_context());
+ manager->Remove(extension_id(), handle.handle);
}
-bool UsbAsyncApiTransferFunction::ConvertDirectionSafely(
- const Direction& input,
- UsbEndpointDirection* output) {
- const bool converted = ConvertDirectionFromApi(input, output);
- if (!converted)
- SetError(kErrorConvertDirection);
- return converted;
+UsbTransferFunction::UsbTransferFunction() {
}
-bool UsbAsyncApiTransferFunction::ConvertRequestTypeSafely(
- const RequestType& input,
- UsbDeviceHandle::TransferRequestType* output) {
- const bool converted = ConvertRequestTypeFromApi(input, output);
- if (!converted)
- SetError(kErrorConvertRequestType);
- return converted;
+UsbTransferFunction::~UsbTransferFunction() {
}
-bool UsbAsyncApiTransferFunction::ConvertRecipientSafely(
- const Recipient& input,
- UsbDeviceHandle::TransferRecipient* output) {
- const bool converted = ConvertRecipientFromApi(input, output);
- if (!converted)
- SetError(kErrorConvertRecipient);
- return converted;
+void UsbTransferFunction::OnCompleted(UsbTransferStatus status,
+ scoped_refptr<net::IOBuffer> data,
+ size_t length) {
+ scoped_ptr<base::DictionaryValue> transfer_info(new base::DictionaryValue());
+ transfer_info->SetInteger(kResultCodeKey, status);
+ transfer_info->Set(kDataKey, base::BinaryValue::CreateWithCopiedBuffer(
+ data->data(), length));
+
+ if (status == device::USB_TRANSFER_COMPLETED) {
+ Respond(OneArgument(transfer_info.release()));
+ } else {
+ scoped_ptr<base::ListValue> error_args(new base::ListValue());
+ error_args->Append(transfer_info.release());
+ // Returning arguments with an error is wrong but we're stuck with it.
+ Respond(ErrorWithArguments(error_args.Pass(),
+ ConvertTransferStatusToApi(status)));
+ }
}
UsbFindDevicesFunction::UsbFindDevicesFunction() {
@@ -560,71 +484,77 @@ UsbFindDevicesFunction::UsbFindDevicesFunction() {
UsbFindDevicesFunction::~UsbFindDevicesFunction() {
}
-bool UsbFindDevicesFunction::Prepare() {
- parameters_ = FindDevices::Params::Create(*args_);
- EXTENSION_FUNCTION_VALIDATE(parameters_.get());
- return true;
-}
+ExtensionFunction::ResponseAction UsbFindDevicesFunction::Run() {
+ scoped_ptr<extensions::core_api::usb::FindDevices::Params> parameters =
+ FindDevices::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
-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);
+ vendor_id_ = parameters->options.vendor_id;
+ product_id_ = parameters->options.product_id;
+ 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 (!extension()->permissions_data()->CheckAPIPermissionWithParam(
APIPermission::kUsbDevice, &param)) {
- LOG(WARNING) << "Insufficient permissions to access device.";
- CompleteWithError(kErrorPermissionDenied);
- return;
+ return RespondNow(Error(kErrorPermissionDenied));
}
UsbService* service = device::DeviceClient::Get()->GetUsbService();
if (!service) {
- CompleteWithError(kErrorInitService);
- return;
+ return RespondNow(Error(kErrorInitService));
}
- ScopedDeviceVector devices(new DeviceVector());
- service->GetDevices(devices.get());
+ service->GetDevices(
+ base::Bind(&UsbFindDevicesFunction::OnGetDevicesComplete, this));
+ return RespondLater();
+}
- for (DeviceVector::iterator it = devices->begin(); it != devices->end();) {
- if ((*it)->vendor_id() != vendor_id || (*it)->product_id() != product_id) {
- it = devices->erase(it);
+void UsbFindDevicesFunction::OnGetDevicesComplete(
+ const std::vector<scoped_refptr<UsbDevice>>& devices) {
+ result_.reset(new base::ListValue());
+ barrier_ = base::BarrierClosure(
+ devices.size(), base::Bind(&UsbFindDevicesFunction::OpenComplete, this));
+
+ for (const scoped_refptr<UsbDevice>& device : devices) {
+ if (device->vendor_id() != vendor_id_ ||
+ device->product_id() != product_id_) {
+ barrier_.Run();
} else {
- ++it;
+ device->RequestUsbAccess(
+ interface_id_,
+ base::Bind(&UsbFindDevicesFunction::OnRequestAccessComplete, this,
+ device));
}
}
-
- RequestUsbDevicesAccess(
- devices.Pass(),
- interface_id,
- base::Bind(&UsbFindDevicesFunction::OpenDevices, this));
}
-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.get())
- device_handles_.push_back(device_handle);
+void UsbFindDevicesFunction::OnRequestAccessComplete(
+ scoped_refptr<UsbDevice> device,
+ bool success) {
+ if (success) {
+ device->Open(base::Bind(&UsbFindDevicesFunction::OnDeviceOpened, this));
+ } else {
+ barrier_.Run();
}
+}
- 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));
+void UsbFindDevicesFunction::OnDeviceOpened(
+ scoped_refptr<UsbDeviceHandle> device_handle) {
+ if (device_handle.get()) {
+ ApiResourceManager<UsbDeviceResource>* manager =
+ ApiResourceManager<UsbDeviceResource>::Get(browser_context());
+ UsbDeviceResource* resource =
+ new UsbDeviceResource(extension_id(), device_handle);
+ scoped_refptr<UsbDevice> device = device_handle->GetDevice();
+ result_->Append(PopulateConnectionHandle(
+ manager->Add(resource), device->vendor_id(), device->product_id()));
}
+ barrier_.Run();
+}
- SetResult(result);
- AsyncWorkCompleted();
+void UsbFindDevicesFunction::OpenComplete() {
+ Respond(OneArgument(result_.release()));
}
UsbGetDevicesFunction::UsbGetDevicesFunction() {
@@ -633,51 +563,47 @@ UsbGetDevicesFunction::UsbGetDevicesFunction() {
UsbGetDevicesFunction::~UsbGetDevicesFunction() {
}
-bool UsbGetDevicesFunction::Prepare() {
- parameters_ = GetDevices::Params::Create(*args_);
- EXTENSION_FUNCTION_VALIDATE(parameters_.get());
- device_permissions_ = DevicePermissionsManager::Get(browser_context())
- ->GetForExtension(extension()->id());
- return true;
-}
+ExtensionFunction::ResponseAction UsbGetDevicesFunction::Run() {
+ scoped_ptr<extensions::core_api::usb::GetDevices::Params> parameters =
+ GetDevices::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
-void UsbGetDevicesFunction::AsyncWorkStart() {
- std::vector<UsbDeviceFilter> filters;
- if (parameters_->options.filters) {
- filters.resize(parameters_->options.filters->size());
- for (size_t i = 0; i < parameters_->options.filters->size(); ++i) {
- ConvertDeviceFilter(*parameters_->options.filters->at(i).get(),
- &filters[i]);
+ if (parameters->options.filters) {
+ filters_.resize(parameters->options.filters->size());
+ for (size_t i = 0; i < parameters->options.filters->size(); ++i) {
+ ConvertDeviceFilter(*parameters->options.filters->at(i).get(),
+ &filters_[i]);
}
}
- if (parameters_->options.vendor_id) {
- filters.resize(filters.size() + 1);
- filters.back().SetVendorId(*parameters_->options.vendor_id);
- if (parameters_->options.product_id) {
- filters.back().SetProductId(*parameters_->options.product_id);
+ if (parameters->options.vendor_id) {
+ filters_.resize(filters_.size() + 1);
+ filters_.back().SetVendorId(*parameters->options.vendor_id);
+ if (parameters->options.product_id) {
+ filters_.back().SetProductId(*parameters->options.product_id);
}
}
UsbService* service = device::DeviceClient::Get()->GetUsbService();
if (!service) {
- CompleteWithError(kErrorInitService);
- return;
+ return RespondNow(Error(kErrorInitService));
}
- DeviceVector devices;
- service->GetDevices(&devices);
+ service->GetDevices(
+ base::Bind(&UsbGetDevicesFunction::OnGetDevicesComplete, this));
+ return RespondLater();
+}
+void UsbGetDevicesFunction::OnGetDevicesComplete(
+ const std::vector<scoped_refptr<UsbDevice>>& devices) {
scoped_ptr<base::ListValue> result(new base::ListValue());
- for (DeviceVector::iterator it = devices.begin(); it != devices.end(); ++it) {
- scoped_refptr<UsbDevice> device = *it;
- if ((filters.empty() || UsbDeviceFilter::MatchesAny(device, filters)) &&
+ for (const scoped_refptr<UsbDevice>& device : devices) {
+ if ((filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_)) &&
HasDevicePermission(device)) {
- result->Append(PopulateDevice(it->get()));
+ result->Append(PopulateDevice(device.get()));
}
}
- SetResult(result.release());
- AsyncWorkCompleted();
+ Respond(OneArgument(result.release()));
}
UsbGetUserSelectedDevicesFunction::UsbGetUserSelectedDevicesFunction() {
@@ -686,7 +612,7 @@ UsbGetUserSelectedDevicesFunction::UsbGetUserSelectedDevicesFunction() {
UsbGetUserSelectedDevicesFunction::~UsbGetUserSelectedDevicesFunction() {
}
-AsyncApiFunction::ResponseAction UsbGetUserSelectedDevicesFunction::Run() {
+ExtensionFunction::ResponseAction UsbGetUserSelectedDevicesFunction::Run() {
scoped_ptr<extensions::core_api::usb::GetUserSelectedDevices::Params>
parameters = GetUserSelectedDevices::Params::Create(*args_);
EXTENSION_FUNCTION_VALIDATE(parameters.get());
@@ -728,8 +654,7 @@ void UsbGetUserSelectedDevicesFunction::OnUsbDevicesChosen(
result->Append(PopulateDevice(device.get()));
}
- SetResult(result.release());
- SendResponse(true);
+ Respond(OneArgument(result.release()));
Release();
}
@@ -739,15 +664,11 @@ UsbRequestAccessFunction::UsbRequestAccessFunction() {
UsbRequestAccessFunction::~UsbRequestAccessFunction() {
}
-bool UsbRequestAccessFunction::Prepare() {
- parameters_ = RequestAccess::Params::Create(*args_);
- EXTENSION_FUNCTION_VALIDATE(parameters_.get());
- return true;
-}
-
-void UsbRequestAccessFunction::AsyncWorkStart() {
- SetResult(new base::FundamentalValue(true));
- AsyncWorkCompleted();
+ExtensionFunction::ResponseAction UsbRequestAccessFunction::Run() {
+ scoped_ptr<extensions::core_api::usb::RequestAccess::Params> parameters =
+ RequestAccess::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
+ return RespondNow(OneArgument(new base::FundamentalValue(true)));
}
UsbOpenDeviceFunction::UsbOpenDeviceFunction() {
@@ -756,67 +677,60 @@ UsbOpenDeviceFunction::UsbOpenDeviceFunction() {
UsbOpenDeviceFunction::~UsbOpenDeviceFunction() {
}
-bool UsbOpenDeviceFunction::Prepare() {
- parameters_ = OpenDevice::Params::Create(*args_);
- EXTENSION_FUNCTION_VALIDATE(parameters_.get());
- device_permissions_manager_ =
- DevicePermissionsManager::Get(browser_context());
- device_permissions_ =
- device_permissions_manager_->GetForExtension(extension()->id());
- return true;
-}
+ExtensionFunction::ResponseAction UsbOpenDeviceFunction::Run() {
+ scoped_ptr<extensions::core_api::usb::OpenDevice::Params> parameters =
+ OpenDevice::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
-void UsbOpenDeviceFunction::AsyncWorkStart() {
UsbService* service = device::DeviceClient::Get()->GetUsbService();
if (!service) {
- CompleteWithError(kErrorInitService);
- return;
+ return RespondNow(Error(kErrorInitService));
}
- device_ = service->GetDeviceById(parameters_->device.device);
- if (!device_.get()) {
- CompleteWithError(kErrorNoDevice);
- return;
+ scoped_refptr<UsbDevice> device =
+ service->GetDeviceById(parameters->device.device);
+ if (!device.get()) {
+ return RespondNow(Error(kErrorNoDevice));
}
- if (!HasDevicePermission(device_)) {
+ if (!HasDevicePermission(device)) {
// This function must act as if there is no such device. Otherwise it can be
// used to fingerprint unauthorized devices.
- CompleteWithError(kErrorNoDevice);
- return;
+ return RespondNow(Error(kErrorNoDevice));
}
- device_->RequestUsbAccess(
+ device->RequestUsbAccess(
-1, /* any interface, unused by the permission broker */
- base::Bind(&UsbOpenDeviceFunction::OnRequestAccessComplete, this));
+ base::Bind(&UsbOpenDeviceFunction::OnRequestAccessComplete, this,
+ device));
+ return RespondLater();
}
-void UsbOpenDeviceFunction::OnRequestAccessComplete(bool success) {
- if (!success) {
- SetError(kErrorPermissionDenied);
- AsyncWorkCompleted();
- return;
+void UsbOpenDeviceFunction::OnRequestAccessComplete(
+ scoped_refptr<UsbDevice> device,
+ bool success) {
+ if (success) {
+ device->Open(base::Bind(&UsbOpenDeviceFunction::OnDeviceOpened, this));
+ } else {
+ Respond(Error(kErrorPermissionDenied));
}
+}
- scoped_refptr<UsbDeviceHandle> handle = device_->Open();
- if (!handle.get()) {
- SetError(kErrorOpen);
- AsyncWorkCompleted();
+void UsbOpenDeviceFunction::OnDeviceOpened(
+ scoped_refptr<UsbDeviceHandle> device_handle) {
+ if (!device_handle.get()) {
+ Respond(Error(kErrorOpen));
return;
}
- SetResult(PopulateConnectionHandle(
- manager_->Add(new UsbDeviceResource(extension_->id(), handle)),
- device_->vendor_id(), device_->product_id()));
- AsyncWorkCompleted();
-}
+ RecordDeviceLastUsed();
-bool UsbOpenDeviceFunction::Respond() {
- if (permission_entry_.get()) {
- device_permissions_manager_->UpdateLastUsed(extension_->id(),
- permission_entry_);
- }
- return UsbAsyncApiFunction::Respond();
+ ApiResourceManager<UsbDeviceResource>* manager =
+ ApiResourceManager<UsbDeviceResource>::Get(browser_context());
+ scoped_refptr<UsbDevice> device = device_handle->GetDevice();
+ Respond(OneArgument(PopulateConnectionHandle(
+ manager->Add(new UsbDeviceResource(extension_id(), device_handle)),
+ device->vendor_id(), device->product_id())));
}
UsbSetConfigurationFunction::UsbSetConfigurationFunction() {
@@ -825,23 +739,29 @@ UsbSetConfigurationFunction::UsbSetConfigurationFunction() {
UsbSetConfigurationFunction::~UsbSetConfigurationFunction() {
}
-bool UsbSetConfigurationFunction::Prepare() {
- parameters_ = SetConfiguration::Params::Create(*args_);
- EXTENSION_FUNCTION_VALIDATE(parameters_.get());
- return true;
-}
+ExtensionFunction::ResponseAction UsbSetConfigurationFunction::Run() {
+ scoped_ptr<extensions::core_api::usb::SetConfiguration::Params> parameters =
+ SetConfiguration::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
-void UsbSetConfigurationFunction::AsyncWorkStart() {
scoped_refptr<UsbDeviceHandle> device_handle =
- GetDeviceHandleOrCompleteWithError(parameters_->handle);
+ GetDeviceHandle(parameters->handle);
if (!device_handle.get()) {
- return;
+ return RespondNow(Error(kErrorNoConnection));
}
- if (!device_handle->SetConfiguration(parameters_->configuration_value)) {
- SetError(kErrorCannotSetConfiguration);
+ device_handle->SetConfiguration(
+ parameters->configuration_value,
+ base::Bind(&UsbSetConfigurationFunction::OnComplete, this));
+ return RespondLater();
+}
+
+void UsbSetConfigurationFunction::OnComplete(bool success) {
+ if (success) {
+ Respond(NoArguments());
+ } else {
+ Respond(Error(kErrorCannotSetConfiguration));
}
- AsyncWorkCompleted();
}
UsbGetConfigurationFunction::UsbGetConfigurationFunction() {
@@ -850,17 +770,15 @@ UsbGetConfigurationFunction::UsbGetConfigurationFunction() {
UsbGetConfigurationFunction::~UsbGetConfigurationFunction() {
}
-bool UsbGetConfigurationFunction::Prepare() {
- parameters_ = GetConfiguration::Params::Create(*args_);
- EXTENSION_FUNCTION_VALIDATE(parameters_.get());
- return true;
-}
+ExtensionFunction::ResponseAction UsbGetConfigurationFunction::Run() {
+ scoped_ptr<extensions::core_api::usb::GetConfiguration::Params> parameters =
+ GetConfiguration::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
-void UsbGetConfigurationFunction::AsyncWorkStart() {
scoped_refptr<UsbDeviceHandle> device_handle =
- GetDeviceHandleOrCompleteWithError(parameters_->handle);
+ GetDeviceHandle(parameters->handle);
if (!device_handle.get()) {
- return;
+ return RespondNow(Error(kErrorNoConnection));
}
const UsbConfigDescriptor* config_descriptor =
@@ -868,12 +786,10 @@ void UsbGetConfigurationFunction::AsyncWorkStart() {
if (config_descriptor) {
ConfigDescriptor config;
ConvertConfigDescriptor(*config_descriptor, &config);
- SetResult(config.ToValue().release());
+ return RespondNow(OneArgument(config.ToValue().release()));
} else {
- SetError(kErrorNotConfigured);
+ return RespondNow(Error(kErrorNotConfigured));
}
-
- AsyncWorkCompleted();
}
UsbListInterfacesFunction::UsbListInterfacesFunction() {
@@ -882,17 +798,15 @@ UsbListInterfacesFunction::UsbListInterfacesFunction() {
UsbListInterfacesFunction::~UsbListInterfacesFunction() {
}
-bool UsbListInterfacesFunction::Prepare() {
- parameters_ = ListInterfaces::Params::Create(*args_);
- EXTENSION_FUNCTION_VALIDATE(parameters_.get());
- return true;
-}
+ExtensionFunction::ResponseAction UsbListInterfacesFunction::Run() {
+ scoped_ptr<extensions::core_api::usb::ListInterfaces::Params> parameters =
+ ListInterfaces::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
-void UsbListInterfacesFunction::AsyncWorkStart() {
scoped_refptr<UsbDeviceHandle> device_handle =
- GetDeviceHandleOrCompleteWithError(parameters_->handle);
+ GetDeviceHandle(parameters->handle);
if (!device_handle.get()) {
- return;
+ return RespondNow(Error(kErrorNoConnection));
}
const UsbConfigDescriptor* config_descriptor =
@@ -906,12 +820,10 @@ void UsbListInterfacesFunction::AsyncWorkStart() {
result->Append(config.interfaces[i]->ToValue().release());
}
- SetResult(result.release());
+ return RespondNow(OneArgument(result.release()));
} else {
- SetError(kErrorNotConfigured);
+ return RespondNow(Error(kErrorNotConfigured));
}
-
- AsyncWorkCompleted();
}
UsbCloseDeviceFunction::UsbCloseDeviceFunction() {
@@ -920,21 +832,20 @@ UsbCloseDeviceFunction::UsbCloseDeviceFunction() {
UsbCloseDeviceFunction::~UsbCloseDeviceFunction() {
}
-bool UsbCloseDeviceFunction::Prepare() {
- parameters_ = CloseDevice::Params::Create(*args_);
- EXTENSION_FUNCTION_VALIDATE(parameters_.get());
- return true;
-}
+ExtensionFunction::ResponseAction UsbCloseDeviceFunction::Run() {
+ scoped_ptr<extensions::core_api::usb::CloseDevice::Params> parameters =
+ CloseDevice::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
-void UsbCloseDeviceFunction::AsyncWorkStart() {
scoped_refptr<UsbDeviceHandle> device_handle =
- GetDeviceHandleOrCompleteWithError(parameters_->handle);
- if (!device_handle.get())
- return;
+ GetDeviceHandle(parameters->handle);
+ if (!device_handle.get()) {
+ return RespondNow(Error(kErrorNoConnection));
+ }
// The device handle is closed when the resource is destroyed.
- RemoveUsbDeviceResource(parameters_->handle.handle);
- AsyncWorkCompleted();
+ ReleaseDeviceHandle(parameters->handle);
+ return RespondNow(NoArguments());
}
UsbClaimInterfaceFunction::UsbClaimInterfaceFunction() {
@@ -943,23 +854,29 @@ UsbClaimInterfaceFunction::UsbClaimInterfaceFunction() {
UsbClaimInterfaceFunction::~UsbClaimInterfaceFunction() {
}
-bool UsbClaimInterfaceFunction::Prepare() {
- parameters_ = ClaimInterface::Params::Create(*args_);
- EXTENSION_FUNCTION_VALIDATE(parameters_.get());
- return true;
-}
+ExtensionFunction::ResponseAction UsbClaimInterfaceFunction::Run() {
+ scoped_ptr<extensions::core_api::usb::ClaimInterface::Params> parameters =
+ ClaimInterface::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
-void UsbClaimInterfaceFunction::AsyncWorkStart() {
scoped_refptr<UsbDeviceHandle> device_handle =
- GetDeviceHandleOrCompleteWithError(parameters_->handle);
- if (!device_handle.get())
- return;
+ GetDeviceHandle(parameters->handle);
+ if (!device_handle.get()) {
+ return RespondNow(Error(kErrorNoConnection));
+ }
- bool success = device_handle->ClaimInterface(parameters_->interface_number);
+ device_handle->ClaimInterface(
+ parameters->interface_number,
+ base::Bind(&UsbClaimInterfaceFunction::OnComplete, this));
+ return RespondLater();
+}
- if (!success)
- SetError(kErrorCannotClaimInterface);
- AsyncWorkCompleted();
+void UsbClaimInterfaceFunction::OnComplete(bool success) {
+ if (success) {
+ Respond(NoArguments());
+ } else {
+ Respond(Error(kErrorCannotClaimInterface));
+ }
}
UsbReleaseInterfaceFunction::UsbReleaseInterfaceFunction() {
@@ -968,22 +885,22 @@ UsbReleaseInterfaceFunction::UsbReleaseInterfaceFunction() {
UsbReleaseInterfaceFunction::~UsbReleaseInterfaceFunction() {
}
-bool UsbReleaseInterfaceFunction::Prepare() {
- parameters_ = ReleaseInterface::Params::Create(*args_);
- EXTENSION_FUNCTION_VALIDATE(parameters_.get());
- return true;
-}
+ExtensionFunction::ResponseAction UsbReleaseInterfaceFunction::Run() {
+ scoped_ptr<extensions::core_api::usb::ReleaseInterface::Params> parameters =
+ ReleaseInterface::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
-void UsbReleaseInterfaceFunction::AsyncWorkStart() {
scoped_refptr<UsbDeviceHandle> device_handle =
- GetDeviceHandleOrCompleteWithError(parameters_->handle);
- if (!device_handle.get())
- return;
+ GetDeviceHandle(parameters->handle);
+ if (!device_handle.get()) {
+ return RespondNow(Error(kErrorNoConnection));
+ }
- bool success = device_handle->ReleaseInterface(parameters_->interface_number);
- if (!success)
- SetError(kErrorCannotReleaseInterface);
- AsyncWorkCompleted();
+ if (device_handle->ReleaseInterface(parameters->interface_number)) {
+ return RespondNow(NoArguments());
+ } else {
+ return RespondNow(Error(kErrorCannotReleaseInterface));
+ }
}
UsbSetInterfaceAlternateSettingFunction::
@@ -994,24 +911,30 @@ UsbSetInterfaceAlternateSettingFunction::
~UsbSetInterfaceAlternateSettingFunction() {
}
-bool UsbSetInterfaceAlternateSettingFunction::Prepare() {
- parameters_ = SetInterfaceAlternateSetting::Params::Create(*args_);
- EXTENSION_FUNCTION_VALIDATE(parameters_.get());
- return true;
-}
+ExtensionFunction::ResponseAction
+UsbSetInterfaceAlternateSettingFunction::Run() {
+ scoped_ptr<extensions::core_api::usb::SetInterfaceAlternateSetting::Params>
+ parameters = SetInterfaceAlternateSetting::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
-void UsbSetInterfaceAlternateSettingFunction::AsyncWorkStart() {
scoped_refptr<UsbDeviceHandle> device_handle =
- GetDeviceHandleOrCompleteWithError(parameters_->handle);
- if (!device_handle.get())
- return;
+ GetDeviceHandle(parameters->handle);
+ if (!device_handle.get()) {
+ return RespondNow(Error(kErrorNoConnection));
+ }
- bool success = device_handle->SetInterfaceAlternateSetting(
- parameters_->interface_number, parameters_->alternate_setting);
- if (!success)
- SetError(kErrorCannotSetInterfaceAlternateSetting);
+ device_handle->SetInterfaceAlternateSetting(
+ parameters->interface_number, parameters->alternate_setting,
+ base::Bind(&UsbSetInterfaceAlternateSettingFunction::OnComplete, this));
+ return RespondLater();
+}
- AsyncWorkCompleted();
+void UsbSetInterfaceAlternateSettingFunction::OnComplete(bool success) {
+ if (success) {
+ Respond(NoArguments());
+ } else {
+ Respond(Error(kErrorCannotSetInterfaceAlternateSetting));
+ }
}
UsbControlTransferFunction::UsbControlTransferFunction() {
@@ -1020,54 +943,55 @@ UsbControlTransferFunction::UsbControlTransferFunction() {
UsbControlTransferFunction::~UsbControlTransferFunction() {
}
-bool UsbControlTransferFunction::Prepare() {
- parameters_ = ControlTransfer::Params::Create(*args_);
- EXTENSION_FUNCTION_VALIDATE(parameters_.get());
- return true;
-}
+ExtensionFunction::ResponseAction UsbControlTransferFunction::Run() {
+ scoped_ptr<extensions::core_api::usb::ControlTransfer::Params> parameters =
+ ControlTransfer::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
-void UsbControlTransferFunction::AsyncWorkStart() {
scoped_refptr<UsbDeviceHandle> device_handle =
- GetDeviceHandleOrCompleteWithError(parameters_->handle);
- if (!device_handle.get())
- return;
-
- const ControlTransferInfo& transfer = parameters_->transfer_info;
+ GetDeviceHandle(parameters->handle);
+ if (!device_handle.get()) {
+ return RespondNow(Error(kErrorNoConnection));
+ }
+ 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 (!ConvertDirectionFromApi(transfer.direction, &direction)) {
+ return RespondNow(Error(kErrorConvertDirection));
+ }
+
+ if (!ConvertRequestTypeFromApi(transfer.request_type, &request_type)) {
+ return RespondNow(Error(kErrorConvertRequestType));
+ }
+
+ if (!ConvertRecipientFromApi(transfer.recipient, &recipient)) {
+ return RespondNow(Error(kErrorConvertRecipient));
}
if (!GetTransferSize(transfer, &size)) {
- CompleteWithError(kErrorInvalidTransferLength);
- return;
+ return RespondNow(Error(kErrorInvalidTransferLength));
}
scoped_refptr<net::IOBuffer> buffer =
CreateBufferForTransfer(transfer, direction, size);
if (!buffer.get()) {
- CompleteWithError(kErrorMalformedParameters);
- return;
+ return RespondNow(Error(kErrorMalformedParameters));
}
int timeout = transfer.timeout ? *transfer.timeout : 0;
if (timeout < 0) {
- CompleteWithError(kErrorInvalidTimeout);
- return;
+ return RespondNow(Error(kErrorInvalidTimeout));
}
device_handle->ControlTransfer(
direction, request_type, recipient, transfer.request, transfer.value,
transfer.index, buffer.get(), size, timeout,
base::Bind(&UsbControlTransferFunction::OnCompleted, this));
+ return RespondLater();
}
UsbBulkTransferFunction::UsbBulkTransferFunction() {
@@ -1076,49 +1000,44 @@ UsbBulkTransferFunction::UsbBulkTransferFunction() {
UsbBulkTransferFunction::~UsbBulkTransferFunction() {
}
-bool UsbBulkTransferFunction::Prepare() {
- parameters_ = BulkTransfer::Params::Create(*args_);
- EXTENSION_FUNCTION_VALIDATE(parameters_.get());
- return true;
-}
+ExtensionFunction::ResponseAction UsbBulkTransferFunction::Run() {
+ scoped_ptr<extensions::core_api::usb::BulkTransfer::Params> parameters =
+ BulkTransfer::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
-void UsbBulkTransferFunction::AsyncWorkStart() {
scoped_refptr<UsbDeviceHandle> device_handle =
- GetDeviceHandleOrCompleteWithError(parameters_->handle);
- if (!device_handle.get())
- return;
-
- const GenericTransferInfo& transfer = parameters_->transfer_info;
+ GetDeviceHandle(parameters->handle);
+ if (!device_handle.get()) {
+ return RespondNow(Error(kErrorNoConnection));
+ }
+ const GenericTransferInfo& transfer = parameters->transfer_info;
UsbEndpointDirection direction;
size_t size = 0;
- if (!ConvertDirectionSafely(transfer.direction, &direction)) {
- AsyncWorkCompleted();
- return;
+ if (!ConvertDirectionFromApi(transfer.direction, &direction)) {
+ return RespondNow(Error(kErrorConvertDirection));
}
if (!GetTransferSize(transfer, &size)) {
- CompleteWithError(kErrorInvalidTransferLength);
- return;
+ return RespondNow(Error(kErrorInvalidTransferLength));
}
scoped_refptr<net::IOBuffer> buffer =
CreateBufferForTransfer(transfer, direction, size);
if (!buffer.get()) {
- CompleteWithError(kErrorMalformedParameters);
- return;
+ return RespondNow(Error(kErrorMalformedParameters));
}
int timeout = transfer.timeout ? *transfer.timeout : 0;
if (timeout < 0) {
- CompleteWithError(kErrorInvalidTimeout);
- return;
+ return RespondNow(Error(kErrorInvalidTimeout));
}
device_handle->BulkTransfer(
direction, transfer.endpoint, buffer.get(), size, timeout,
base::Bind(&UsbBulkTransferFunction::OnCompleted, this));
+ return RespondLater();
}
UsbInterruptTransferFunction::UsbInterruptTransferFunction() {
@@ -1127,49 +1046,44 @@ UsbInterruptTransferFunction::UsbInterruptTransferFunction() {
UsbInterruptTransferFunction::~UsbInterruptTransferFunction() {
}
-bool UsbInterruptTransferFunction::Prepare() {
- parameters_ = InterruptTransfer::Params::Create(*args_);
- EXTENSION_FUNCTION_VALIDATE(parameters_.get());
- return true;
-}
+ExtensionFunction::ResponseAction UsbInterruptTransferFunction::Run() {
+ scoped_ptr<extensions::core_api::usb::InterruptTransfer::Params> parameters =
+ InterruptTransfer::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
-void UsbInterruptTransferFunction::AsyncWorkStart() {
scoped_refptr<UsbDeviceHandle> device_handle =
- GetDeviceHandleOrCompleteWithError(parameters_->handle);
- if (!device_handle.get())
- return;
-
- const GenericTransferInfo& transfer = parameters_->transfer_info;
+ GetDeviceHandle(parameters->handle);
+ if (!device_handle.get()) {
+ return RespondNow(Error(kErrorNoConnection));
+ }
+ const GenericTransferInfo& transfer = parameters->transfer_info;
UsbEndpointDirection direction;
size_t size = 0;
- if (!ConvertDirectionSafely(transfer.direction, &direction)) {
- AsyncWorkCompleted();
- return;
+ if (!ConvertDirectionFromApi(transfer.direction, &direction)) {
+ return RespondNow(Error(kErrorConvertDirection));
}
if (!GetTransferSize(transfer, &size)) {
- CompleteWithError(kErrorInvalidTransferLength);
- return;
+ return RespondNow(Error(kErrorInvalidTransferLength));
}
scoped_refptr<net::IOBuffer> buffer =
CreateBufferForTransfer(transfer, direction, size);
if (!buffer.get()) {
- CompleteWithError(kErrorMalformedParameters);
- return;
+ return RespondNow(Error(kErrorMalformedParameters));
}
int timeout = transfer.timeout ? *transfer.timeout : 0;
if (timeout < 0) {
- CompleteWithError(kErrorInvalidTimeout);
- return;
+ return RespondNow(Error(kErrorInvalidTimeout));
}
device_handle->InterruptTransfer(
direction, transfer.endpoint, buffer.get(), size, timeout,
base::Bind(&UsbInterruptTransferFunction::OnCompleted, this));
+ return RespondLater();
}
UsbIsochronousTransferFunction::UsbIsochronousTransferFunction() {
@@ -1178,66 +1092,62 @@ UsbIsochronousTransferFunction::UsbIsochronousTransferFunction() {
UsbIsochronousTransferFunction::~UsbIsochronousTransferFunction() {
}
-bool UsbIsochronousTransferFunction::Prepare() {
- parameters_ = IsochronousTransfer::Params::Create(*args_);
- EXTENSION_FUNCTION_VALIDATE(parameters_.get());
- return true;
-}
+ExtensionFunction::ResponseAction UsbIsochronousTransferFunction::Run() {
+ scoped_ptr<extensions::core_api::usb::IsochronousTransfer::Params>
+ parameters = IsochronousTransfer::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(parameters.get());
-void UsbIsochronousTransferFunction::AsyncWorkStart() {
scoped_refptr<UsbDeviceHandle> device_handle =
- GetDeviceHandleOrCompleteWithError(parameters_->handle);
- if (!device_handle.get())
- return;
+ GetDeviceHandle(parameters->handle);
+ if (!device_handle.get()) {
+ return RespondNow(Error(kErrorNoConnection));
+ }
- const IsochronousTransferInfo& transfer = parameters_->transfer_info;
+ 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 (!ConvertDirectionFromApi(generic_transfer.direction, &direction)) {
+ return RespondNow(Error(kErrorConvertDirection));
}
+
if (!GetTransferSize(generic_transfer, &size)) {
- CompleteWithError(kErrorInvalidTransferLength);
- return;
+ return RespondNow(Error(kErrorInvalidTransferLength));
}
+
if (transfer.packets < 0 || transfer.packets >= kMaxPackets) {
- CompleteWithError(kErrorInvalidNumberOfPackets);
- return;
+ return RespondNow(Error(kErrorInvalidNumberOfPackets));
}
+
unsigned int packets = transfer.packets;
if (transfer.packet_length < 0 ||
transfer.packet_length >= kMaxPacketLength) {
- CompleteWithError(kErrorInvalidPacketLength);
- return;
+ return RespondNow(Error(kErrorInvalidPacketLength));
}
+
unsigned int packet_length = transfer.packet_length;
const uint64 total_length = packets * packet_length;
if (packets > size || total_length > size) {
- CompleteWithError(kErrorTransferLength);
- return;
+ return RespondNow(Error(kErrorTransferLength));
}
scoped_refptr<net::IOBuffer> buffer =
CreateBufferForTransfer(generic_transfer, direction, size);
if (!buffer.get()) {
- CompleteWithError(kErrorMalformedParameters);
- return;
+ return RespondNow(Error(kErrorMalformedParameters));
}
int timeout = generic_transfer.timeout ? *generic_transfer.timeout : 0;
if (timeout < 0) {
- CompleteWithError(kErrorInvalidTimeout);
- return;
+ return RespondNow(Error(kErrorInvalidTimeout));
}
device_handle->IsochronousTransfer(
direction, generic_transfer.endpoint, buffer.get(), size, packets,
packet_length, timeout,
base::Bind(&UsbIsochronousTransferFunction::OnCompleted, this));
+ return RespondLater();
}
UsbResetDeviceFunction::UsbResetDeviceFunction() {
@@ -1246,29 +1156,37 @@ UsbResetDeviceFunction::UsbResetDeviceFunction() {
UsbResetDeviceFunction::~UsbResetDeviceFunction() {
}
-bool UsbResetDeviceFunction::Prepare() {
+ExtensionFunction::ResponseAction UsbResetDeviceFunction::Run() {
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.get())
- return;
-
- bool success = device_handle->ResetDevice();
- if (!success) {
- device_handle->Close();
- RemoveUsbDeviceResource(parameters_->handle.handle);
- SetResult(new base::FundamentalValue(false));
- CompleteWithError(kErrorResetDevice);
- return;
+ GetDeviceHandle(parameters_->handle);
+ if (!device_handle.get()) {
+ return RespondNow(Error(kErrorNoConnection));
}
- SetResult(new base::FundamentalValue(true));
- AsyncWorkCompleted();
+ device_handle->ResetDevice(
+ base::Bind(&UsbResetDeviceFunction::OnComplete, this));
+ return RespondLater();
+}
+
+void UsbResetDeviceFunction::OnComplete(bool success) {
+ if (success) {
+ Respond(OneArgument(new base::FundamentalValue(true)));
+ } else {
+ scoped_refptr<UsbDeviceHandle> device_handle =
+ GetDeviceHandle(parameters_->handle);
+ if (device_handle.get()) {
+ device_handle->Close();
+ }
+ ReleaseDeviceHandle(parameters_->handle);
+
+ scoped_ptr<base::ListValue> error_args(new base::ListValue());
+ error_args->AppendBoolean(false);
+ // Returning arguments with an error is wrong but we're stuck with it.
+ Respond(ErrorWithArguments(error_args.Pass(), kErrorResetDevice));
+ }
}
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698