// Copyright (c) 2012 The Chromium 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 "content/browser/download/download_interrupt_reasons_impl.h"

#include "base/logging.h"

namespace content {

DownloadInterruptReason ConvertFileErrorToInterruptReason(
    base::File::Error file_error) {
  switch (file_error) {
    case base::File::FILE_OK:
      return DOWNLOAD_INTERRUPT_REASON_NONE;

    case base::File::FILE_ERROR_IN_USE:
      return DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR;

    case base::File::FILE_ERROR_ACCESS_DENIED:
      return DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED;

    case base::File::FILE_ERROR_TOO_MANY_OPENED:
      return DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR;

    case base::File::FILE_ERROR_NO_MEMORY:
      return DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR;

    case base::File::FILE_ERROR_NO_SPACE:
      return DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE;

    case base::File::FILE_ERROR_SECURITY:
      return DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED;

    default:
      return DOWNLOAD_INTERRUPT_REASON_FILE_FAILED;
  }
}

DownloadInterruptReason ConvertNetErrorToInterruptReason(
    net::Error net_error, DownloadInterruptSource source) {
  switch (net_error) {
    case net::OK:
      return DOWNLOAD_INTERRUPT_REASON_NONE;

    // File errors.

    // The file is too large.
    case net::ERR_FILE_TOO_BIG:
      return DOWNLOAD_INTERRUPT_REASON_FILE_TOO_LARGE;

    // Permission to access a resource, other than the network, was denied.
    case net::ERR_ACCESS_DENIED:
      return DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED;

    // There were not enough resources to complete the operation.
    case net::ERR_INSUFFICIENT_RESOURCES:
      return DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR;

    // Memory allocation failed.
    case net::ERR_OUT_OF_MEMORY:
      return DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR;

    // The path or file name is too long.
    case net::ERR_FILE_PATH_TOO_LONG:
      return DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG;

    // Not enough room left on the disk.
    case net::ERR_FILE_NO_SPACE:
      return DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE;

    // The file has a virus.
    case net::ERR_FILE_VIRUS_INFECTED:
      return DOWNLOAD_INTERRUPT_REASON_FILE_VIRUS_INFECTED;

    // The file was blocked by local policy.
    case net::ERR_BLOCKED_BY_CLIENT:
      return DOWNLOAD_INTERRUPT_REASON_FILE_BLOCKED;

    // Network errors.

    // The network operation timed out.
    case net::ERR_TIMED_OUT:
      return DOWNLOAD_INTERRUPT_REASON_NETWORK_TIMEOUT;

    // The network connection was lost or changed.
    case net::ERR_NETWORK_CHANGED:
    case net::ERR_INTERNET_DISCONNECTED:
      return DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED;

    // The server has gone down.
    case net::ERR_CONNECTION_FAILED:
      return DOWNLOAD_INTERRUPT_REASON_NETWORK_SERVER_DOWN;

    // Server responses.

    // The server does not support range requests.
    case net::ERR_REQUEST_RANGE_NOT_SATISFIABLE:
      return DOWNLOAD_INTERRUPT_REASON_SERVER_NO_RANGE;

    default: break;
  }

  // Handle errors that don't have mappings, depending on the source.
  switch (source) {
    case DOWNLOAD_INTERRUPT_FROM_DISK:
      return DOWNLOAD_INTERRUPT_REASON_FILE_FAILED;
    case DOWNLOAD_INTERRUPT_FROM_NETWORK:
      return DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED;
    case DOWNLOAD_INTERRUPT_FROM_SERVER:
      return DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED;
    default:
      break;
  }

  NOTREACHED();

  return DOWNLOAD_INTERRUPT_REASON_NONE;
}

std::string DownloadInterruptReasonToString(DownloadInterruptReason error) {

#define INTERRUPT_REASON(name, value)  \
    case DOWNLOAD_INTERRUPT_REASON_##name: return #name;

  switch (error) {
    INTERRUPT_REASON(NONE, 0)

#include "content/public/browser/download_interrupt_reason_values.h"

    default:
      break;
  }

#undef INTERRUPT_REASON

  return "Unknown error";
}

}  // namespace content
