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

#include <libusb.h>

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

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

namespace mist {

UsbEndpointDescriptor::UsbEndpointDescriptor(
    const libusb_endpoint_descriptor* endpoint_descriptor)
    : endpoint_descriptor_(endpoint_descriptor) {
  CHECK(endpoint_descriptor_);
}

uint8_t UsbEndpointDescriptor::GetLength() const {
  return endpoint_descriptor_->bLength;
}

uint8_t UsbEndpointDescriptor::GetDescriptorType() const {
  return endpoint_descriptor_->bDescriptorType;
}

uint8_t UsbEndpointDescriptor::GetEndpointAddress() const {
  return endpoint_descriptor_->bEndpointAddress;
}

uint8_t UsbEndpointDescriptor::GetEndpointNumber() const {
  return GetEndpointAddress() & LIBUSB_ENDPOINT_ADDRESS_MASK;
}

uint8_t UsbEndpointDescriptor::GetAttributes() const {
  return endpoint_descriptor_->bmAttributes;
}

uint16_t UsbEndpointDescriptor::GetMaxPacketSize() const {
  return endpoint_descriptor_->wMaxPacketSize;
}

uint8_t UsbEndpointDescriptor::GetInterval() const {
  return endpoint_descriptor_->bInterval;
}

UsbDirection UsbEndpointDescriptor::GetDirection() const {
  uint8_t direction = GetEndpointAddress() & LIBUSB_ENDPOINT_DIR_MASK;
  return (direction == LIBUSB_ENDPOINT_IN) ? kUsbDirectionIn : kUsbDirectionOut;
}

UsbTransferType UsbEndpointDescriptor::GetTransferType() const {
  return static_cast<UsbTransferType>(GetAttributes() &
                                      LIBUSB_TRANSFER_TYPE_MASK);
}

string UsbEndpointDescriptor::ToString() const {
  return StringPrintf("Endpoint (Length=%u, "
                      "DescriptorType=%u, "
                      "EndpointAddress=0x%02x, "
                      "EndpointNumber=%u, "
                      "Attributes=0x%02x, "
                      "MaxPacketSize=%u, "
                      "Interval=%u, "
                      "Direction=%s, "
                      "TransferType=%s)",
                      GetLength(),
                      GetDescriptorType(),
                      GetEndpointAddress(),
                      GetEndpointNumber(),
                      GetAttributes(),
                      GetMaxPacketSize(),
                      GetInterval(),
                      UsbDirectionToString(GetDirection()),
                      UsbTransferTypeToString(GetTransferType()));
}

}  // namespace mist

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