/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "prerror.h"
#include "prlog.h"
#include <errno.h>
#include <windows.h>

/*
 * On Win32, we map three kinds of error codes:
 * - GetLastError(): for Win32 functions
 * - WSAGetLastError(): for Winsock functions
 * - errno: for standard C library functions
 *
 * GetLastError() and WSAGetLastError() return error codes in
 * non-overlapping ranges, so their error codes (ERROR_* and
 * WSAE*) can be mapped by the same function.  On the other hand,
 * errno and GetLastError() have overlapping ranges, so we need
 * to use a separate function to map errno.
 *
 * We do not check for WSAEINPROGRESS and WSAEINTR because we do not
 * use blocking Winsock 1.1 calls.
 *
 * Except for the 'socket' call, we do not check for WSAEINITIALISED.
 * It is assumed that if Winsock is not initialized, that fact will
 * be detected at the time we create new sockets.
 */

static void _MD_win32_map_default_errno(PRInt32 err)
{
    PRErrorCode prError;

    switch (err) {
        case EACCES:
            prError = PR_NO_ACCESS_RIGHTS_ERROR;
            break;
        case ENOENT:
            prError = PR_FILE_NOT_FOUND_ERROR;
            break;
        default:
            prError = PR_UNKNOWN_ERROR;
            break;
    }
    PR_SetError(prError, err);
}

void _MD_win32_map_default_error(PRInt32 err)
{
    PRErrorCode prError;

    switch (err) {
        case ERROR_ACCESS_DENIED:
            prError = PR_NO_ACCESS_RIGHTS_ERROR;
            break;
        case ERROR_ALREADY_EXISTS:
            prError = PR_FILE_EXISTS_ERROR;
            break;
        case ERROR_CALL_NOT_IMPLEMENTED:
            prError = PR_NOT_IMPLEMENTED_ERROR;
            break;
        case ERROR_DISK_CORRUPT:
            prError = PR_IO_ERROR;
            break;
        case ERROR_DISK_FULL:
            prError = PR_NO_DEVICE_SPACE_ERROR;
            break;
        case ERROR_DISK_OPERATION_FAILED:
            prError = PR_IO_ERROR;
            break;
        case ERROR_DRIVE_LOCKED:
            prError = PR_FILE_IS_LOCKED_ERROR;
            break;
        case ERROR_FILENAME_EXCED_RANGE:
            prError = PR_NAME_TOO_LONG_ERROR;
            break;
        case ERROR_FILE_CORRUPT:
            prError = PR_IO_ERROR;
            break;
        case ERROR_FILE_EXISTS:
            prError = PR_FILE_EXISTS_ERROR;
            break;
        case ERROR_FILE_INVALID:
            prError = PR_BAD_DESCRIPTOR_ERROR;
            break;
        case ERROR_FILE_NOT_FOUND:
            prError = PR_FILE_NOT_FOUND_ERROR;
            break;
        case ERROR_HANDLE_DISK_FULL:
            prError = PR_NO_DEVICE_SPACE_ERROR;
            break;
        case ERROR_INVALID_ADDRESS:
            prError = PR_ACCESS_FAULT_ERROR;
            break;
        case ERROR_INVALID_HANDLE:
            prError = PR_BAD_DESCRIPTOR_ERROR;
            break;
        case ERROR_INVALID_NAME:
            prError = PR_INVALID_ARGUMENT_ERROR;
            break;
        case ERROR_INVALID_PARAMETER:
            prError = PR_INVALID_ARGUMENT_ERROR;
            break;
        case ERROR_INVALID_USER_BUFFER:
            prError = PR_INSUFFICIENT_RESOURCES_ERROR;
            break;
        case ERROR_LOCKED:
            prError = PR_FILE_IS_LOCKED_ERROR;
            break;
        case ERROR_NETNAME_DELETED:
            prError = PR_CONNECT_RESET_ERROR;
            break;
        case ERROR_NOACCESS:
            prError = PR_ACCESS_FAULT_ERROR;
            break;
        case ERROR_NOT_ENOUGH_MEMORY:
            prError = PR_INSUFFICIENT_RESOURCES_ERROR;
            break;
        case ERROR_NOT_ENOUGH_QUOTA:
            prError = PR_OUT_OF_MEMORY_ERROR;
            break;
        case ERROR_NOT_READY:
            prError = PR_IO_ERROR;
            break;
        case ERROR_NO_MORE_FILES:
            prError = PR_NO_MORE_FILES_ERROR;
            break;
        case ERROR_OPEN_FAILED:
            prError = PR_IO_ERROR;
            break;
        case ERROR_OPEN_FILES:
            prError = PR_IO_ERROR;
            break;
        case ERROR_OPERATION_ABORTED:
            prError = PR_OPERATION_ABORTED_ERROR;
            break;
        case ERROR_OUTOFMEMORY:
            prError = PR_INSUFFICIENT_RESOURCES_ERROR;
            break;
        case ERROR_PATH_BUSY:
            prError = PR_IO_ERROR;
            break;
        case ERROR_PATH_NOT_FOUND:
            prError = PR_FILE_NOT_FOUND_ERROR;
            break;
        case ERROR_SEEK_ON_DEVICE:
            prError = PR_IO_ERROR;
            break;
        case ERROR_SHARING_VIOLATION:
            prError = PR_FILE_IS_BUSY_ERROR;
            break;
        case ERROR_STACK_OVERFLOW:
            prError = PR_ACCESS_FAULT_ERROR;
            break;
        case ERROR_TOO_MANY_OPEN_FILES:
            prError = PR_SYS_DESC_TABLE_FULL_ERROR;
            break;
        case ERROR_WRITE_PROTECT:
            prError = PR_NO_ACCESS_RIGHTS_ERROR;
            break;
        case WSAEACCES:
            prError = PR_NO_ACCESS_RIGHTS_ERROR;
            break;
        case WSAEADDRINUSE:
            prError = PR_ADDRESS_IN_USE_ERROR;
            break;
        case WSAEADDRNOTAVAIL:
        case ERROR_INVALID_NETNAME:
            prError = PR_ADDRESS_NOT_AVAILABLE_ERROR;
            break;
        case WSAEAFNOSUPPORT:
        case ERROR_INCORRECT_ADDRESS:
            prError = PR_ADDRESS_NOT_SUPPORTED_ERROR;
            break;
        case WSAEALREADY:
        case ERROR_ALREADY_INITIALIZED:
            prError = PR_ALREADY_INITIATED_ERROR;
            break;
        case WSAEBADF:
            prError = PR_BAD_DESCRIPTOR_ERROR;
            break;
        case WSAECONNABORTED:
        case ERROR_CONNECTION_ABORTED:
            prError = PR_CONNECT_ABORTED_ERROR;
            break;
        case WSAECONNREFUSED:
        case ERROR_CONNECTION_REFUSED:
            prError = PR_CONNECT_REFUSED_ERROR;
            break;
        case WSAECONNRESET:
            prError = PR_CONNECT_RESET_ERROR;
            break;
        case WSAEDESTADDRREQ:
            prError = PR_INVALID_ARGUMENT_ERROR;
            break;
        case WSAEFAULT:
            prError = PR_ACCESS_FAULT_ERROR;
            break;
        case WSAEHOSTUNREACH:
        case ERROR_HOST_UNREACHABLE:
            prError = PR_HOST_UNREACHABLE_ERROR;
            break;
        case WSAEINVAL:
            prError = PR_INVALID_ARGUMENT_ERROR;
            break;
        case WSAEISCONN:
            prError = PR_IS_CONNECTED_ERROR;
            break;
        case WSAEMFILE:
            prError = PR_PROC_DESC_TABLE_FULL_ERROR;
            break;
        case WSAEMSGSIZE:
            prError = PR_BUFFER_OVERFLOW_ERROR;
            break;
        case WSAENETDOWN:
        case ERROR_NO_NETWORK:
            prError = PR_NETWORK_DOWN_ERROR;
            break;
        case WSAENETRESET:
            prError = PR_CONNECT_ABORTED_ERROR;
            break;
        case WSAENETUNREACH:
        case ERROR_NETWORK_UNREACHABLE:
            prError = PR_NETWORK_UNREACHABLE_ERROR;
            break;
        case WSAENOBUFS:
            prError = PR_INSUFFICIENT_RESOURCES_ERROR;
            break;
        case WSAENOPROTOOPT:
            prError = PR_INVALID_ARGUMENT_ERROR;
            break;
        case WSAENOTCONN:
            prError = PR_NOT_CONNECTED_ERROR;
            break;
        case WSAENOTSOCK:
            prError = PR_NOT_SOCKET_ERROR;
            break;
        case WSAEOPNOTSUPP:
            prError = PR_OPERATION_NOT_SUPPORTED_ERROR;
            break;
        case WSAEPROTONOSUPPORT:
            prError = PR_PROTOCOL_NOT_SUPPORTED_ERROR;
            break;
        case WSAEPROTOTYPE:
            prError = PR_INVALID_ARGUMENT_ERROR;
            break;
        case WSAESHUTDOWN:
            prError = PR_SOCKET_SHUTDOWN_ERROR;
            break;
        case WSAESOCKTNOSUPPORT:
            prError = PR_INVALID_ARGUMENT_ERROR;
            break;
        case WSAETIMEDOUT:
            prError = PR_CONNECT_ABORTED_ERROR;
            break;
        case WSAEWOULDBLOCK:
            prError = PR_WOULD_BLOCK_ERROR;
            break;
        default:
            prError = PR_UNKNOWN_ERROR;
            break;
    }
    PR_SetError(prError, err);
}

void _MD_win32_map_opendir_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_closedir_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_unix_readdir_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_delete_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

/* The error code for stat() is in errno. */
void _MD_win32_map_stat_error(PRInt32 err)
{
    _MD_win32_map_default_errno(err);
}

void _MD_win32_map_fstat_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_rename_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

/* The error code for access() is in errno. */
void _MD_win32_map_access_error(PRInt32 err)
{
    _MD_win32_map_default_errno(err);
}

void _MD_win32_map_mkdir_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_rmdir_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_read_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_transmitfile_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_write_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_lseek_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_fsync_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

/*
 * For both CloseHandle() and closesocket().
 */
void _MD_win32_map_close_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_socket_error(PRInt32 err)
{
    PR_ASSERT(err != WSANOTINITIALISED);
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_recv_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_recvfrom_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_send_error(PRInt32 err)
{
    PRErrorCode prError;

    switch (err) {
        case WSAEMSGSIZE:
            prError = PR_INVALID_ARGUMENT_ERROR;
            break;
        default:
            _MD_win32_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_win32_map_sendto_error(PRInt32 err)
{
    PRErrorCode prError;

    switch (err) {
        case WSAEMSGSIZE:
            prError = PR_INVALID_ARGUMENT_ERROR;
            break;
        default:
            _MD_win32_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_win32_map_accept_error(PRInt32 err)
{
    PRErrorCode prError;

    switch (err) {
        case WSAEOPNOTSUPP:
            prError = PR_NOT_TCP_SOCKET_ERROR;
            break;
        case WSAEINVAL:
            prError = PR_INVALID_STATE_ERROR;
            break;
        default:
            _MD_win32_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_win32_map_acceptex_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_connect_error(PRInt32 err)
{
    PRErrorCode prError;

    switch (err) {
        case WSAEWOULDBLOCK:
            prError = PR_IN_PROGRESS_ERROR;
            break;
        case WSAEINVAL:
            prError = PR_ALREADY_INITIATED_ERROR;
            break;
        case WSAETIMEDOUT:
            prError = PR_IO_TIMEOUT_ERROR;
            break;
        default:
            _MD_win32_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_win32_map_bind_error(PRInt32 err)
{
    PRErrorCode prError;

    switch (err) {
        case WSAEINVAL:
            prError = PR_SOCKET_ADDRESS_IS_BOUND_ERROR;
            break;
        default:
            _MD_win32_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_win32_map_listen_error(PRInt32 err)
{
    PRErrorCode prError;

    switch (err) {
        case WSAEOPNOTSUPP:
            prError = PR_NOT_TCP_SOCKET_ERROR;
            break;
        case WSAEINVAL:
            prError = PR_INVALID_STATE_ERROR;
            break;
        default:
            _MD_win32_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_win32_map_shutdown_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_getsockname_error(PRInt32 err)
{
    PRErrorCode prError;

    switch (err) {
        case WSAEINVAL:
            prError = PR_INVALID_STATE_ERROR;
            break;
        default:
            _MD_win32_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_win32_map_getpeername_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_getsockopt_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_setsockopt_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_open_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

void _MD_win32_map_gethostname_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}

/* Win32 select() only works on sockets.  So in this
** context, WSAENOTSOCK is equivalent to EBADF on Unix.
*/
void _MD_win32_map_select_error(PRInt32 err)
{
    PRErrorCode prError;

    switch (err) {
        case WSAENOTSOCK:
            prError = PR_BAD_DESCRIPTOR_ERROR;
            break;
        default:
            _MD_win32_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_win32_map_lockf_error(PRInt32 err)
{
    _MD_win32_map_default_error(err);
}
