// 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_config_descriptor.h"

#include <libusb.h>

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

#include "mist/usb_device.h"
#include "mist/usb_interface.h"

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

namespace mist {

UsbConfigDescriptor::UsbConfigDescriptor(
    const base::WeakPtr<UsbDevice>& device,
    libusb_config_descriptor* config_descriptor,
    bool own_config_descriptor)
    : device_(device),
      config_descriptor_(config_descriptor),
      own_config_descriptor_(own_config_descriptor) {
  CHECK(config_descriptor_);
}

UsbConfigDescriptor::~UsbConfigDescriptor() {
  if (own_config_descriptor_) {
    libusb_free_config_descriptor(config_descriptor_);
    config_descriptor_ = nullptr;
  }
}

uint8_t UsbConfigDescriptor::GetLength() const {
  return config_descriptor_->bLength;
}

uint8_t UsbConfigDescriptor::GetDescriptorType() const {
  return config_descriptor_->bDescriptorType;
}

uint16_t UsbConfigDescriptor::GetTotalLength() const {
  return config_descriptor_->wTotalLength;
}

uint8_t UsbConfigDescriptor::GetNumInterfaces() const {
  return config_descriptor_->bNumInterfaces;
}

uint8_t UsbConfigDescriptor::GetConfigurationValue() const {
  return config_descriptor_->bConfigurationValue;
}

string UsbConfigDescriptor::GetConfigurationDescription() const {
  return device_ ? device_->GetStringDescriptorAscii(
                       config_descriptor_->iConfiguration)
                 : string();
}

uint8_t UsbConfigDescriptor::GetAttributes() const {
  return config_descriptor_->bmAttributes;
}

uint8_t UsbConfigDescriptor::GetMaxPower() const {
  return config_descriptor_->MaxPower;
}

UsbInterface* UsbConfigDescriptor::GetInterface(uint8_t index) const {
  if (index >= GetNumInterfaces()) {
    LOG(ERROR) << StringPrintf(
        "Invalid interface index %d. Must be less than %d.", index,
        GetNumInterfaces());
    return nullptr;
  }

  return new UsbInterface(device_, &config_descriptor_->interface[index]);
}

string UsbConfigDescriptor::ToString() const {
  return StringPrintf(
      "Configuration (Length=%u, "
      "DescriptorType=%u, "
      "TotalLength=%u, "
      "NumInterfaces=%u, "
      "ConfigurationValue=%u, "
      "Configuration='%s', "
      "Attributes=0x%02x, "
      "MaxPower=%u)",
      GetLength(), GetDescriptorType(), GetTotalLength(), GetNumInterfaces(),
      GetConfigurationValue(), GetConfigurationDescription().c_str(),
      GetAttributes(), GetMaxPower());
}

}  // namespace mist

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