// Copyright 2018 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 PERMISSION_BROKER_LIBUSB_WRAPPER_H_
#define PERMISSION_BROKER_LIBUSB_WRAPPER_H_

#include <iostream>
#include <memory>
#include <vector>

#include <libusb-1.0/libusb.h>
#include <linux/usb/ch11.h>

#include <base/strings/stringprintf.h>

namespace permission_broker {

// Container of USB device information. The class encapsulates device
// information like Vendor ID and Product ID and abstracts the way these
// information are extracted from libusb.
struct UsbDeviceInfo {
  uint16_t vid;
  uint16_t pid;
  uint8_t device_class;

  UsbDeviceInfo() : vid(0), pid(0), device_class(LIBUSB_CLASS_VENDOR_SPEC) {}
  // Convenience overloaded constructor used when VID and PID are known at
  // instantiation time.
  UsbDeviceInfo(uint16_t vid, uint16_t pid)
      : vid(vid), pid(pid), device_class(LIBUSB_CLASS_VENDOR_SPEC) {}
  // Convenience overloaded constructor used when VID, PID, and device class are
  // known at instantiation time.
  UsbDeviceInfo(uint16_t vid, uint16_t pid, uint8_t device_class)
      : vid(vid), pid(pid), device_class(device_class) {}

  // We ignore the device class for comparison; the comparison is only based on
  // VID and PID.
  bool operator==(const UsbDeviceInfo& object) const {
    return object.vid == vid && object.pid == pid;
  }

  friend std::ostream& operator<<(std::ostream& os,
                                  const UsbDeviceInfo& object) {
    auto description =
        base::StringPrintf("vid: 0x%04x, pid: 0x%04x, class: 0x%02x",
                           object.vid, object.pid, object.device_class);
    os << description;
    return os;
  }
};

// Convenience deleter object used to manage the libusb context object. Such
// contexts require to be initialized via libusb_init() and destroyed via
// libusb_exit(). To make the lifetime more apparent we use the deleter to
// combine the raw pointer with smart pointers.
struct LibusbContextDeleter {
  void operator()(libusb_context* ctx) { libusb_exit(ctx); }
};

// Interface used to abstract the interaction with the libusb provided API. This
// API defines the required functions needed by UsbControl to be able to
// interact with the USB subsystem.
// Such abstraction is also meant to simplify testing.
class UsbDeviceInterface {
 public:
  virtual ~UsbDeviceInterface() = default;

  virtual UsbDeviceInfo GetInfo() const = 0;
  virtual uint8_t GetPort() const = 0;
  // This function implementation can return nullptr to indicate that it was not
  // possible to obtain a parent device for the represented USB device. This can
  // also be the case when, for example, the parent device is **not** a hub.
  virtual std::unique_ptr<UsbDeviceInterface> GetParent() const = 0;

  // Sets the power state to on/off depending on |enabled| of a specified port.
  // This API can only be used on HUB devices.
  virtual bool SetPowerState(bool enabled, uint16_t port) const = 0;
};

// Specialization of the UsbDeviceInterface that uses the libusb API to
// communicate with the USB peripherals.
class UsbDevice : public UsbDeviceInterface {
 public:
  // When passing a libusb_device pointer to this constructor, the ownership of
  // pointer is assigned to the new instance of UsbDevice.
  // In other words, UsbDevice will take care of ref up and ref down the object
  // respectively at construction and at destructiopn.
  explicit UsbDevice(libusb_device* device);
  UsbDevice(const UsbDevice&) = delete;
  UsbDevice& operator=(const UsbDevice&) = delete;

  ~UsbDevice() override;

  UsbDeviceInfo GetInfo() const override;
  std::unique_ptr<UsbDeviceInterface> GetParent() const override;
  uint8_t GetPort() const override;

  bool SetPowerState(bool enabled, uint16_t port) const override;

 private:
  std::unique_ptr<libusb_device, void (*)(libusb_device*)> device_;
  UsbDeviceInfo info_;
};

// Manager intended to provide an API to interact with multiple USB devices. The
// main purpose of the class is to provide search mechanisms over the list of
// connected devices.
// This interface is intended as a generalization of that for testing purposes.
class UsbDeviceManagerInterface {
 public:
  virtual ~UsbDeviceManagerInterface() = default;

  virtual std::vector<std::unique_ptr<UsbDeviceInterface>> GetDevicesByVidPid(
      uint16_t vid, uint16_t pid) = 0;
};

// Specialized implementation of UsbDeviceManagerInterface that uses libusb
// to retrieve and filter USB devices connected to CrOS.
class UsbDeviceManager : public UsbDeviceManagerInterface {
 public:
  UsbDeviceManager();
  UsbDeviceManager(const UsbDeviceManager&) = delete;
  UsbDeviceManager& operator=(const UsbDeviceManager&) = delete;

  ~UsbDeviceManager() override;

  std::vector<std::unique_ptr<UsbDeviceInterface>> GetDevicesByVidPid(
      uint16_t vid, uint16_t pid) override;

 private:
  std::unique_ptr<libusb_context, LibusbContextDeleter> context_;
};

}  // namespace permission_broker

#endif  // PERMISSION_BROKER_LIBUSB_WRAPPER_H_
