// Copyright 2013 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 "ppapi/host/error_conversion.h"

#include "base/safe_numerics.h"
#include "net/base/net_errors.h"
#include "ppapi/c/pp_errors.h"

namespace ppapi {
namespace host {

int32_t NetErrorToPepperError(int net_error) {
  if (net_error > 0)
    return base::checked_numeric_cast<int32_t>(net_error);

  switch (net_error) {
    case net::OK:
      return PP_OK;
    case net::ERR_IO_PENDING:
      return PP_OK_COMPLETIONPENDING;
    case net::ERR_ABORTED:
      return PP_ERROR_ABORTED;
    case net::ERR_INVALID_ARGUMENT:
      return PP_ERROR_BADARGUMENT;
    case net::ERR_INVALID_HANDLE:
      return PP_ERROR_BADARGUMENT;
    case net::ERR_FILE_NOT_FOUND:
      return PP_ERROR_FILENOTFOUND;
    case net::ERR_TIMED_OUT:
      return PP_ERROR_TIMEDOUT;
    case net::ERR_FILE_TOO_BIG:
      return PP_ERROR_FILETOOBIG;
    case net::ERR_ACCESS_DENIED:
      return PP_ERROR_NOACCESS;
    case net::ERR_NOT_IMPLEMENTED:
      return PP_ERROR_NOTSUPPORTED;
    case net::ERR_OUT_OF_MEMORY:
      return PP_ERROR_NOMEMORY;
    case net::ERR_FILE_EXISTS:
      return PP_ERROR_FILEEXISTS;
    case net::ERR_FILE_NO_SPACE:
      return PP_ERROR_NOSPACE;
    case net::ERR_CONNECTION_CLOSED:
      return PP_ERROR_CONNECTION_CLOSED;
    case net::ERR_CONNECTION_RESET:
      return PP_ERROR_CONNECTION_RESET;
    case net::ERR_CONNECTION_REFUSED:
      return PP_ERROR_CONNECTION_REFUSED;
    case net::ERR_CONNECTION_ABORTED:
      return PP_ERROR_CONNECTION_ABORTED;
    case net::ERR_CONNECTION_FAILED:
      return PP_ERROR_CONNECTION_FAILED;
    case net::ERR_NAME_NOT_RESOLVED:
      return PP_ERROR_NAME_NOT_RESOLVED;
    case net::ERR_ADDRESS_INVALID:
      return PP_ERROR_ADDRESS_INVALID;
    case net::ERR_ADDRESS_UNREACHABLE:
      return PP_ERROR_ADDRESS_UNREACHABLE;
    case net::ERR_CONNECTION_TIMED_OUT:
      return PP_ERROR_CONNECTION_TIMEDOUT;
    case net::ERR_NETWORK_ACCESS_DENIED:
      return PP_ERROR_NOACCESS;
    case net::ERR_MSG_TOO_BIG:
      return PP_ERROR_MESSAGE_TOO_BIG;
    case net::ERR_ADDRESS_IN_USE:
      return PP_ERROR_ADDRESS_IN_USE;
    default:
      return PP_ERROR_FAILED;
  }
}

}  // namespace host
}  // namespace ppapi