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

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

Issue 10161035: Adding UsbService and UsbDevice constructs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Adding DEPS 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
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..ffb38d3dc571f719cbc368b651fd0e04c0d1d614
--- /dev/null
+++ b/chrome/browser/usb/usb_device.h
@@ -0,0 +1,115 @@
+// 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 { INBOUND, OUTBOUND };
+ enum TransferRequestType { STANDARD, CLASS, VENDOR, RESERVED };
+ enum TransferRecipient { DEVICE, INTERFACE, ENDPOINT, OTHER };
+
+ // Usually you will not want to directly create a UsbDevice, favoring 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 {
+ Transfer();
+ ~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);
+
+ // The UsbService isn't referenced here to prevent a dependency cycle between
+ // the service and the devices. Since a service owns every device, and is
+ // responsible for its destruction, there is no case where a UsbDevice can
+ // have outlived its originating UsbService.
+ 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_

Powered by Google App Engine
This is Rietveld 408576698