C++程序  |  142行  |  4.05 KB

// 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_INTERFACE_H_
#define CHROME_BROWSER_USB_USB_INTERFACE_H_

#include "base/memory/ref_counted.h"

struct libusb_config_descriptor;
struct libusb_endpoint_descriptor;
struct libusb_interface;
struct libusb_interface_descriptor;

typedef libusb_config_descriptor* PlatformUsbConfigDescriptor;
typedef const libusb_endpoint_descriptor* PlatformUsbEndpointDescriptor;
typedef const libusb_interface* PlatformUsbInterface;
typedef const libusb_interface_descriptor* PlatformUsbInterfaceDescriptor;

enum UsbTransferType {
  USB_TRANSFER_CONTROL = 0,
  USB_TRANSFER_ISOCHRONOUS,
  USB_TRANSFER_BULK,
  USB_TRANSFER_INTERRUPT,
};

enum UsbEndpointDirection {
  USB_DIRECTION_INBOUND = 0,
  USB_DIRECTION_OUTBOUND,
};

enum UsbSynchronizationType {
  USB_SYNCHRONIZATION_NONE = 0,
  USB_SYNCHRONIZATION_ASYNCHRONOUS,
  USB_SYNCHRONIZATION_ADAPTIVE,
  USB_SYNCHRONIZATION_SYNCHRONOUS,
};

enum UsbUsageType {
  USB_USAGE_DATA = 0,
  USB_USAGE_FEEDBACK,
  USB_USAGE_EXPLICIT_FEEDBACK
};

class UsbDevice;
class UsbConfigDescriptor;
class UsbInterfaceDescriptor;
class UsbInterfaceAltSettingDescriptor;

class UsbEndpointDescriptor
    : public base::RefCounted<const UsbEndpointDescriptor> {
 public:
  int GetAddress() const;
  UsbEndpointDirection GetDirection() const;
  int GetMaximumPacketSize() const;
  UsbSynchronizationType GetSynchronizationType() const;
  UsbTransferType GetTransferType() const;
  UsbUsageType GetUsageType() const;
  int GetPollingInterval() const;

 private:
  friend class base::RefCounted<const UsbEndpointDescriptor>;
  friend class UsbInterfaceAltSettingDescriptor;

  UsbEndpointDescriptor(
      scoped_refptr<const UsbConfigDescriptor> config,
      PlatformUsbEndpointDescriptor descriptor);
  ~UsbEndpointDescriptor();

  scoped_refptr<const UsbConfigDescriptor> config_;
  PlatformUsbEndpointDescriptor descriptor_;

  DISALLOW_COPY_AND_ASSIGN(UsbEndpointDescriptor);
};

class UsbInterfaceAltSettingDescriptor
    : public base::RefCounted<const UsbInterfaceAltSettingDescriptor> {
 public:
  size_t GetNumEndpoints() const;
  scoped_refptr<const UsbEndpointDescriptor> GetEndpoint(size_t index) const;

  int GetInterfaceNumber() const;
  int GetAlternateSetting() const;
  int GetInterfaceClass() const;
  int GetInterfaceSubclass() const;
  int GetInterfaceProtocol() const;

 private:
  friend class base::RefCounted<const UsbInterfaceAltSettingDescriptor>;
  friend class UsbInterfaceDescriptor;

  UsbInterfaceAltSettingDescriptor(
      scoped_refptr<const UsbConfigDescriptor> config,
      PlatformUsbInterfaceDescriptor descriptor);
  ~UsbInterfaceAltSettingDescriptor();

  scoped_refptr<const UsbConfigDescriptor> config_;
  PlatformUsbInterfaceDescriptor descriptor_;

  DISALLOW_COPY_AND_ASSIGN(UsbInterfaceAltSettingDescriptor);
};

class UsbInterfaceDescriptor
    : public base::RefCounted<const UsbInterfaceDescriptor> {
 public:
  size_t GetNumAltSettings() const;
  scoped_refptr<const UsbInterfaceAltSettingDescriptor> GetAltSetting(
      size_t index) const;

 private:
  friend class base::RefCounted<const UsbInterfaceDescriptor>;
  friend class UsbConfigDescriptor;

  UsbInterfaceDescriptor(scoped_refptr<const UsbConfigDescriptor> config,
               PlatformUsbInterface usbInterface);
  ~UsbInterfaceDescriptor();

  scoped_refptr<const UsbConfigDescriptor> config_;
  PlatformUsbInterface interface_;

  DISALLOW_COPY_AND_ASSIGN(UsbInterfaceDescriptor);
};

class UsbConfigDescriptor : public base::RefCounted<UsbConfigDescriptor> {
 public:
  size_t GetNumInterfaces() const;
  scoped_refptr<const UsbInterfaceDescriptor> GetInterface(size_t index) const;

 private:
  friend class base::RefCounted<UsbConfigDescriptor>;
  friend class UsbDevice;

  explicit UsbConfigDescriptor(PlatformUsbConfigDescriptor config);
  ~UsbConfigDescriptor();

  PlatformUsbConfigDescriptor config_;

  DISALLOW_COPY_AND_ASSIGN(UsbConfigDescriptor);
};

#endif  // CHROME_BROWSER_USB_USB_INTERFACE_H_