// Copyright (c) 2013 The Chromium OS 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 MIST_USB_INTERFACE_H_
#define MIST_USB_INTERFACE_H_

#include <base/macros.h>
#include <base/memory/weak_ptr.h>

struct libusb_interface;

namespace mist {

class UsbDevice;
class UsbInterfaceDescriptor;

// A USB interface, which wraps a libusb_interface C struct from libusb 1.0 into
// a C++ object.
class UsbInterface {
 public:
  // Constructs a UsbInterface object by taking a weak pointer to a UsbDevice
  // object as |device| and a raw pointer to a libusb_interface struct as
  // |interface|. |device| is passed to the constructor of
  // UsbInterfaceDescriptor when creating a UsbInterfaceDescriptor object. The
  // ownership of |interface| is not transferred, and thus it should outlive
  // this object.
  UsbInterface(const base::WeakPtr<UsbDevice>& device,
               const libusb_interface* interface);

  ~UsbInterface() = default;

  // Getters for retrieving fields of the libusb_interface struct.
  int GetNumAlternateSettings() const;

  // Returns a pointer to a UsbInterfaceDescriptor object for the interface
  // descriptor indexed at |index|, or a NULL pointer if the index is invalid.
  // The returned object should be deleted by the caller after use and should
  // not be held beyond the lifetime of this object.
  UsbInterfaceDescriptor* GetAlternateSetting(int index) const;

 private:
  base::WeakPtr<UsbDevice> device_;
  const libusb_interface* const interface_;

  DISALLOW_COPY_AND_ASSIGN(UsbInterface);
};

}  // namespace mist

#endif  // MIST_USB_INTERFACE_H_
