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

#include <base/logging.h>

using std::ostream;

namespace mist {

UsbDirection GetUsbDirectionOfEndpointAddress(uint8_t endpoint_address) {
  // The MSB of an endpoint address indicates the direction, and kUsbDirectionIn
  // is effectively a mask to extract the MSB.
  return (endpoint_address & kUsbDirectionIn) == kUsbDirectionIn
             ? kUsbDirectionIn
             : kUsbDirectionOut;
}

const char* UsbDirectionToString(UsbDirection direction) {
  switch (direction) {
    case kUsbDirectionIn:
      return "In";
    case kUsbDirectionOut:
      return "Out";
  }
  NOTREACHED();
  return nullptr;
}

const char* UsbSpeedToString(UsbSpeed speed) {
  switch (speed) {
    case kUsbSpeedUnknown:
      return "Unknown";
    case kUsbSpeedLow:
      return "Low";
    case kUsbSpeedFull:
      return "Full";
    case kUsbSpeedHigh:
      return "High";
    case kUsbSpeedSuper:
      return "Super";
  }
  NOTREACHED();
  return nullptr;
}

const char* UsbTransferTypeToString(UsbTransferType transfer_type) {
  switch (transfer_type) {
    case kUsbTransferTypeControl:
      return "Control";
    case kUsbTransferTypeIsochronous:
      return "Isochronous";
    case kUsbTransferTypeBulk:
      return "Bulk";
    case kUsbTransferTypeInterrupt:
      return "Interrupt";
    case kUsbTransferTypeUnknown:
      return "Unknown";
  }
  NOTREACHED();
  return nullptr;
}

const char* UsbTransferStatusToString(UsbTransferStatus transfer_status) {
  switch (transfer_status) {
    case kUsbTransferStatusCompleted:
      return "Completed";
    case kUsbTransferStatusError:
      return "Error";
    case kUsbTransferStatusTimedOut:
      return "TimedOut";
    case kUsbTransferStatusCancelled:
      return "Cancelled";
    case kUsbTransferStatusStall:
      return "Stall";
    case kUsbTransferStatusNoDevice:
      return "NoDevice";
    case kUsbTransferStatusOverflow:
      return "Overflow";
    case kUsbTransferStatusUnknown:
      return "Unknown";
  }
  NOTREACHED();
  return nullptr;
}

}  // namespace mist

ostream& operator<<(ostream& stream, mist::UsbDirection direction) {
  stream << UsbDirectionToString(direction);
  return stream;
}

ostream& operator<<(ostream& stream, mist::UsbSpeed speed) {
  stream << UsbSpeedToString(speed);
  return stream;
}

ostream& operator<<(ostream& stream, mist::UsbTransferType transfer_type) {
  stream << UsbTransferTypeToString(transfer_type);
  return stream;
}

ostream& operator<<(ostream& stream, mist::UsbTransferStatus transfer_status) {
  stream << UsbTransferStatusToString(transfer_status);
  return stream;
}
