// 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.

#include "mist/usb_device_descriptor.h"

#include <libusb.h>

#include <base/logging.h>
#include <base/strings/stringprintf.h>

#include "mist/usb_device.h"

using base::StringPrintf;
using std::ostream;
using std::string;

namespace mist {

UsbDeviceDescriptor::UsbDeviceDescriptor(
    const base::WeakPtr<UsbDevice>& device,
    const libusb_device_descriptor* device_descriptor)
    : device_(device),
      device_descriptor_(device_descriptor) {
  CHECK(device_descriptor_);
}

uint8_t UsbDeviceDescriptor::GetLength() const {
  return device_descriptor_->bLength;
}

uint8_t UsbDeviceDescriptor::GetDescriptorType() const {
  return device_descriptor_->bDescriptorType;
}

uint8_t UsbDeviceDescriptor::GetDeviceClass() const {
  return device_descriptor_->bDeviceClass;
}

uint8_t UsbDeviceDescriptor::GetDeviceSubclass() const {
  return device_descriptor_->bDeviceSubClass;
}

uint8_t UsbDeviceDescriptor::GetDeviceProtocol() const {
  return device_descriptor_->bDeviceProtocol;
}

uint8_t UsbDeviceDescriptor::GetMaxPacketSize0() const {
  return device_descriptor_->bMaxPacketSize0;
}

uint16_t UsbDeviceDescriptor::GetVendorId() const {
  return device_descriptor_->idVendor;
}

uint16_t UsbDeviceDescriptor::GetProductId() const {
  return device_descriptor_->idProduct;
}

string UsbDeviceDescriptor::GetManufacturer() const {
  return device_ ?
      device_->GetStringDescriptorAscii(device_descriptor_->iManufacturer) :
      string();
}

string UsbDeviceDescriptor::GetProduct() const {
  return device_ ?
      device_->GetStringDescriptorAscii(device_descriptor_->iProduct) :
      string();
}

string UsbDeviceDescriptor::GetSerialNumber() const {
  return device_ ?
      device_->GetStringDescriptorAscii(device_descriptor_->iSerialNumber) :
      string();
}

uint8_t UsbDeviceDescriptor::GetNumConfigurations() const {
  return device_descriptor_->bNumConfigurations;
}

string UsbDeviceDescriptor::ToString() const {
  return StringPrintf("Device (Length=%u, "
                      "DescriptorType=%u, "
                      "DeviceClass=%u, "
                      "DeviceSubclass=%u, "
                      "DeviceProtocol=%u, "
                      "MaxPacketSize0=%u, "
                      "VendorId=0x%04x, "
                      "ProductId=0x%04x, "
                      "Manufacturer='%s', "
                      "Product='%s', "
                      "SerialNumber='%s', "
                      "NumConfigurations=%d)",
                      GetLength(),
                      GetDescriptorType(),
                      GetDeviceClass(),
                      GetDeviceSubclass(),
                      GetDeviceProtocol(),
                      GetMaxPacketSize0(),
                      GetVendorId(),
                      GetProductId(),
                      GetManufacturer().c_str(),
                      GetProduct().c_str(),
                      GetSerialNumber().c_str(),
                      GetNumConfigurations());
}

}  // namespace mist

ostream& operator<<(ostream& stream,
                    const mist::UsbDeviceDescriptor& device_descriptor) {
  stream << device_descriptor.ToString();
  return stream;
}
