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, ¶m)) { |
- 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 |