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

Unified Diff: chrome/browser/usb/usb_device.h

Issue 10154008: Experimental USB API implementation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 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
« no previous file with comments | « chrome/browser/profiles/profile_impl.cc ('k') | chrome/browser/usb/usb_device.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/usb/usb_device.h
diff --git a/chrome/browser/usb/usb_device.h b/chrome/browser/usb/usb_device.h
new file mode 100644
index 0000000000000000000000000000000000000000..865dfb6ef3167a687592a405860fd1e929da32c8
--- /dev/null
+++ b/chrome/browser/usb/usb_device.h
@@ -0,0 +1,108 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_USB_USB_DEVICE_H_
+#define CHROME_BROWSER_USB_USB_DEVICE_H_
+#pragma once
+
+#include <map>
+
+#include "base/memory/ref_counted.h"
+#include "base/synchronization/lock.h"
+#include "net/base/completion_callback.h"
+#include "net/base/io_buffer.h"
+#include "third_party/libusb/libusb/libusb.h"
+
+typedef libusb_device *PlatformUsbDevice;
+typedef libusb_device_handle *PlatformUsbDeviceHandle;
+typedef libusb_transfer *PlatformUsbTransferHandle;
+
+class UsbService;
+
+namespace net {
+class IOBuffer;
+} // namespace net
+
+// A UsbDevice wraps the platform's underlying representation of what a USB
+// device actually is, and provides accessors for performing many of the
+// standard USB operations.
+class UsbDevice : public base::RefCounted<UsbDevice> {
+ public:
+ enum TransferDirection { IN, OUT };
+ enum TransferRequestType { STANDARD, CLASS, VENDOR, RESERVED };
+ enum TransferRecipient { DEVICE, INTERFACE, ENDPOINT, OTHER };
+
+ // Usually you will not want to directly create a UsbDevice, favouring to let
+ // the UsbService take care of the logistics of getting a platform device
+ // handle and handling events for it.
+ UsbDevice(UsbService *service, PlatformUsbDeviceHandle handle);
+
+ PlatformUsbDeviceHandle handle() { return handle_; }
+
+ // Close the USB device and release the underlying platform device.
+ void Close();
+
+ void ControlTransfer(const TransferDirection direction,
+ const TransferRequestType request_type,
+ const TransferRecipient recipient,
+ const uint8 request,
+ const uint16 value,
+ const uint16 index,
+ net::IOBuffer *buffer,
+ const size_t length,
+ const unsigned int timeout,
+ const net::CompletionCallback &callback);
+
+ void BulkTransfer(const TransferDirection direction,
+ const uint8 endpoint,
+ net::IOBuffer *buffer,
+ const size_t length,
+ const unsigned int timeout,
+ const net::CompletionCallback &callback);
+
+ void InterruptTransfer(const TransferDirection direction,
+ const uint8 endpoint,
+ net::IOBuffer *buffer,
+ const size_t length,
+ const unsigned int timeout,
+ const net::CompletionCallback &callback);
+
+ // Normal code should not call this function. It is called by the platform's
+ // callback mechanism in such a way that it cannot be made private. Invokes
+ // the callbacks associated with a given transfer, and removes it from the
+ // in-flight transfer set.
+ void TransferComplete(PlatformUsbTransferHandle transfer);
+
+ private:
+ struct Transfer {
+ scoped_refptr<net::IOBuffer> buffer;
+ net::CompletionCallback callback;
+ };
+
+ friend class base::RefCounted<UsbDevice>;
+ virtual ~UsbDevice();
+
+ // Checks that the device has not yet been closed.
+ void CheckDevice();
+
+ // Starts tracking the USB transfer associated with a platform transfer
+ // handle. Retains the buffer and copies the completion callback until the
+ // transfer finishes, whereupon it invokes the callback then releases the
+ // buffer.
+ void AddTransfer(PlatformUsbTransferHandle handle, net::IOBuffer *buffer,
+ const net::CompletionCallback &callback);
+
+ UsbService *const service_;
+ PlatformUsbDeviceHandle handle_;
+
+ // transfers_ tracks all in-flight transfers associated with this device,
+ // allowing the device to retain the buffer and callback associated with a
+ // transfer until such time that it completes. It is protected by lock_.
+ base::Lock lock_;
+ std::map<PlatformUsbTransferHandle, Transfer> transfers_;
+
+ DISALLOW_EVIL_CONSTRUCTORS(UsbDevice);
+};
+
+#endif // CHROME_BROWSER_USB_USB_DEVICE_H_
« no previous file with comments | « chrome/browser/profiles/profile_impl.cc ('k') | chrome/browser/usb/usb_device.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698