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

Unified Diff: chrome/browser/extensions/api/usb/usb_device_resource.cc

Issue 18593002: Usb backend refactor step 2: Separate Usb Device Handle and Usb Device (deprecate) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 5 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: chrome/browser/extensions/api/usb/usb_device_resource.cc
diff --git a/chrome/browser/extensions/api/usb/usb_device_resource.cc b/chrome/browser/extensions/api/usb/usb_device_resource.cc
index 4d8aa953343e36cf10739eb27833f0ce8113ea6f..9a518c897a0bbf27d9ce72f7c25e3f20849e92be 100644
--- a/chrome/browser/extensions/api/usb/usb_device_resource.cc
+++ b/chrome/browser/extensions/api/usb/usb_device_resource.cc
@@ -13,9 +13,16 @@
#include "chrome/browser/extensions/api/api_resource.h"
#include "chrome/browser/usb/usb_device.h"
#include "chrome/common/extensions/api/usb.h"
+#include "content/public/browser/browser_thread.h"
namespace extensions {
+namespace {
+
+void EmptyCallback(void) {}
+
+}
+
static base::LazyInstance<ProfileKeyedAPIFactory<
ApiResourceManager<UsbDeviceResource> > >
g_factory = LAZY_INSTANCE_INITIALIZER;
@@ -31,6 +38,172 @@ UsbDeviceResource::UsbDeviceResource(const std::string& owner_extension_id,
scoped_refptr<UsbDevice> device)
: ApiResource(owner_extension_id), device_(device) {}
-UsbDeviceResource::~UsbDeviceResource() {}
+UsbDeviceResource::~UsbDeviceResource() {
+ Close(base::Bind(EmptyCallback));
+}
+
+void UsbDeviceResource::Close(const base::Callback<void()>& callback) {
+ scoped_refptr<UsbDevice> handle;
+ handle.swap(device_);
+ if (!handle.get()) {
+ callback.Run();
+ return;
+ }
+ content::BrowserThread::PostTask(
+ content::BrowserThread::FILE,
+ FROM_HERE,
+ base::Bind(&UsbDevice::Close, handle, callback));
+}
+
+void UsbDeviceResource::ListInterfaces(UsbConfigDescriptor* config,
pfeldman 2013/07/22 18:23:13 Unfortunately, all your clients would need to have
+ const UsbInterfaceCallback& callback) {
+ if (!device_.get()) {
+ callback.Run(false);
+ return;
+ }
+ content::BrowserThread::PostTask(
+ content::BrowserThread::FILE, FROM_HERE,
+ base::Bind(&UsbDevice::ListInterfaces,
+ device_,
+ make_scoped_refptr(config),
+ callback));
+}
+
+void UsbDeviceResource::ClaimInterface(const int interface_number,
+ const UsbInterfaceCallback& callback) {
+ if (!device_.get()) {
+ callback.Run(false);
+ return;
+ }
+ content::BrowserThread::PostTask(
+ content::BrowserThread::FILE,
+ FROM_HERE,
+ base::Bind(&UsbDevice::ClaimInterface,
+ device_,
+ interface_number,
+ callback));
+}
+
+void UsbDeviceResource::ReleaseInterface(const int interface_number,
+ const UsbInterfaceCallback& callback) {
+ if (!device_.get()) {
+ callback.Run(false);
+ return;
+ }
+ content::BrowserThread::PostTask(
+ content::BrowserThread::FILE,
+ FROM_HERE,
+ base::Bind(&UsbDevice::ReleaseInterface,
+ device_,
+ interface_number,
+ callback));
+}
+
+void UsbDeviceResource::SetInterfaceAlternateSetting(
+ const int interface_number,
+ const int alternate_setting,
+ const UsbInterfaceCallback& callback) {
+ if (!device_.get()) {
+ callback.Run(false);
+ return;
+ }
+ content::BrowserThread::PostTask(
+ content::BrowserThread::FILE,
+ FROM_HERE,
+ base::Bind(&UsbDevice::SetInterfaceAlternateSetting,
+ device_,
+ interface_number,
+ alternate_setting,
+ callback));
+}
+
+void UsbDeviceResource::ControlTransfer(
+ const UsbEndpointDirection direction,
+ const UsbDevice::TransferRequestType request_type,
+ const UsbDevice::TransferRecipient recipient,
+ const uint8 request,
+ const uint16 value,
+ const uint16 index,
+ net::IOBuffer* buffer,
+ const size_t length,
+ const unsigned int timeout,
+ const UsbTransferCallback& callback) {
+ if (!device_.get()) {
+ callback.Run(USB_TRANSFER_DISCONNECT, buffer, 0);
+ return;
+ }
+ device_->ControlTransfer(direction,
+ request_type,
+ recipient,
+ request,
+ value,
+ index,
+ buffer,
+ length,
+ timeout,
+ callback);
+}
+
+void UsbDeviceResource::BulkTransfer(const UsbEndpointDirection direction,
+ const uint8 endpoint,
+ net::IOBuffer* buffer,
+ const size_t length,
+ const unsigned int timeout,
+ const UsbTransferCallback& callback) {
+ if (!device_.get()) {
+ callback.Run(USB_TRANSFER_DISCONNECT, buffer, 0);
+ return;
+ }
+ device_->BulkTransfer(direction, endpoint, buffer, length, timeout, callback);
+}
+
+void UsbDeviceResource::InterruptTransfer(const UsbEndpointDirection direction,
+ const uint8 endpoint,
+ net::IOBuffer* buffer,
+ const size_t length,
+ const unsigned int timeout,
+ const UsbTransferCallback& callback) {
+ if (!device_.get()) {
+ callback.Run(USB_TRANSFER_DISCONNECT, buffer, 0);
+ return;
+ }
+ device_->InterruptTransfer(direction, endpoint, buffer, length, timeout,
+ callback);
+}
+
+void UsbDeviceResource::IsochronousTransfer(
+ const UsbEndpointDirection direction,
+ const uint8 endpoint,
+ net::IOBuffer* buffer,
+ const size_t length,
+ const unsigned int packets,
+ const unsigned int packet_length,
+ const unsigned int timeout,
+ const UsbTransferCallback& callback) {
+ if (!device_.get()) {
+ callback.Run(USB_TRANSFER_DISCONNECT, buffer, 0);
+ return;
+ }
+ device_->IsochronousTransfer(direction,
+ endpoint,
+ buffer,
+ length,
+ packets,
+ packet_length,
+ timeout,
+ callback);
+}
+
+void UsbDeviceResource::ResetDevice(const UsbResetDeviceCallback& callback) {
+ if (!device_.get()) {
+ callback.Run(false);
+ return;
+ }
+ content::BrowserThread::PostTask(
+ content::BrowserThread::FILE,
+ FROM_HERE,
+ base::Bind(&UsbDevice::ResetDevice, device_, callback));
+}
+
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698