// 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_DEVICE_DESCRIPTOR_H_
#define MIST_USB_DEVICE_DESCRIPTOR_H_

#include <stdint.h>

#include <ostream>  // NOLINT(readability/streams)
#include <string>

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

struct libusb_device_descriptor;

namespace mist {

class UsbDevice;

// A USB device descriptor, which wraps a libusb_device_descriptor C struct from
// libusb 1.0 into a C++ object.
class UsbDeviceDescriptor {
 public:
  // Constructs a UsbDeviceDescriptor object by taking a weak pointer to a
  // UsbDevice object as |device| and a raw pointer to a
  // libusb_device_descriptor struct as |device_descriptor|. |device| is
  // used for getting USB string descriptors related to this object. The
  // ownership of |device_descriptor| is not transferred, and thus it should
  // outlive this object.
  UsbDeviceDescriptor(const base::WeakPtr<UsbDevice>& device,
                      const libusb_device_descriptor* device_descriptor);
  UsbDeviceDescriptor(const UsbDeviceDescriptor&) = delete;
  UsbDeviceDescriptor& operator=(const UsbDeviceDescriptor&) = delete;

  ~UsbDeviceDescriptor() = default;

  // Getters for retrieving fields of the libusb_device_descriptor struct.
  uint8_t GetLength() const;
  uint8_t GetDescriptorType() const;
  uint8_t GetDeviceClass() const;
  uint8_t GetDeviceSubclass() const;
  uint8_t GetDeviceProtocol() const;
  uint8_t GetMaxPacketSize0() const;
  uint16_t GetVendorId() const;
  uint16_t GetProductId() const;
  std::string GetManufacturer() const;
  std::string GetProduct() const;
  std::string GetSerialNumber() const;
  uint8_t GetNumConfigurations() const;

  // Returns a string describing the properties of this object for logging
  // purpose.
  std::string ToString() const;

 private:
  base::WeakPtr<UsbDevice> device_;
  const libusb_device_descriptor* const device_descriptor_;
};

}  // namespace mist

// Output stream operator provided to facilitate logging.
std::ostream& operator<<(std::ostream& stream,
                         const mist::UsbDeviceDescriptor& device_descriptor);

#endif  // MIST_USB_DEVICE_DESCRIPTOR_H_
