/*==LICENSE==*

CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011  Cyan Worlds, Inc.

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

You can contact Cyan Worlds, Inc. by email legal@cyan.com
 or by snail mail at:
      Cyan Worlds, Inc.
      14617 N Newport Hwy
      Mead, WA   99021

*==LICENSE==*/
/*****************************************************************************
*
*   $/Plasma20/Sources/Plasma/NucleusLib/pnNetBase/Private/pnNbError.cpp
*   
***/

#include "../Pch.h"
#pragma hdrstop


/*****************************************************************************
*
*   Exported functions
*
***/

//============================================================================
// These errors should only be used in debugging.  They should not be shown
// in release clients because they are not localized
const wchar * NetErrorToString (ENetError code) {

    static wchar * s_errors[] = {
        L"Success",                         // kNetSuccess
        L"Internal Error",                  // kNetErrInternalError
        L"No Response From Server",         // kNetErrTimeout
        L"Invalid Server Data",             // kNetErrBadServerData
        L"Age Not Found",                   // kNetErrAgeNotFound
        L"Network Connection Failed",       // kNetErrConnectFailed
        L"Disconnected From Server",        // kNetErrDisconnected
        L"File Not Found",                  // kNetErrFileNotFound
        L"Old Build",                       // kNetErrOldBuildId
        L"Remote Shutdown",                 // kNetErrRemoteShutdown
        L"Database Timeout",                // kNetErrTimeoutOdbc
        L"Account Already Exists",          // kNetErrAccountAlreadyExists
        L"Player Already Exists",           // kNetErrPlayerAlreadyExists
        L"Account Not Found",               // kNetErrAccountNotFound
        L"Player Not Found",                // kNetErrPlayerNotFound
        L"Invalid Parameter",               // kNetErrInvalidParameter
        L"Name Lookup Failed",              // kNetErrNameLookupFailed
        L"Logged In Elsewhere",             // kNetErrLoggedInElsewhere
        L"Vault Node Not Found",            // kNetErrVaultNodeNotFound
        L"Max Players On Account",          // kNetErrMaxPlayersOnAcct
        L"Authentication Failed",           // kNetErrAuthenticationFailed
        L"State Object Not Found",          // kNetErrStateObjectNotFound
        L"Login Denied",                    // kNetErrLoginDenied
        L"Circular Reference",              // kNetErrCircularReference
        L"Account Not Activated",           // kNetErrAccountNotActivated
        L"Key Already Used",                // kNetErrKeyAlreadyUsed
        L"Key Not Found",                   // kNetErrKeyNotFound
        L"Activation Code Not Found",       // kNetErrActivationCodeNotFound
        L"Player Name Invalid",             // kNetErrPlayerNameInvalid
        L"Not Supported",                   // kNetErrNotSupported
        L"Service Forbidden",               // kNetErrServiceForbidden
        L"Auth Token Too Old",              // kNetErrAuthTokenTooOld
        L"Must Use GameTap Client",         // kNetErrMustUseGameTapClient
        L"Too Many Failed Logins",          // kNetErrTooManyFailedLogins
        L"GameTap: Connection Failed",      // kNetErrGameTapConnectionFailed
        L"GameTap: Too Many Auth Options",  // kNetErrGTTooManyAuthOptions
        L"GameTap: Missing Parameter",      // kNetErrGTMissingParameter
        L"GameTap: Server Error",           // kNetErrGTServerError
        L"Account has been banned",         // kNetErrAccountBanned
        L"Account kicked by CCR",           // kNetErrKickedByCCR
        L"Wrong score type for operation",  // kNetErrScoreWrongType
        L"Not enough points",               // kNetErrScoreNotEnoughPoints
        L"Non-fixed score already exists",  // kNetErrScoreAlreadyExists
        L"No score data found",             // kNetErrScoreNoDataFound
        L"Invite: Couldn't find player",    // kNetErrInviteNoMatchingPlayer
        L"Invite: Too many hoods",          // kNetErrInviteTooManyHoods
        L"Payments not up to date",         // kNetErrNeedToPay
        L"Server Busy",                     // kNetErrServerBusy
        L"Vault Node Access Violation",     // kNetErrVaultNodeAccessViolation
    };
    COMPILER_ASSERT(arrsize(s_errors) == kNumNetErrors);
    
    if ((unsigned)code >= arrsize(s_errors)) {
        if (code == kNetPending)
            return L"Pending";
        return L"Unknown Error";
    }
    
    return s_errors[code];
}

//============================================================================
// These errors should only be used in debugging.  They should not be shown
// in release clients because they are not localized
const wchar * NetErrorAsString (ENetError code) {

    #define ERROR_STRING(e) L#e
    static wchar * s_errors[] = {
        ERROR_STRING(kNetSuccess),
        ERROR_STRING(kNetErrInternalError),
        ERROR_STRING(kNetErrTimeout),
        ERROR_STRING(kNetErrBadServerData),
        ERROR_STRING(kNetErrAgeNotFound),
        ERROR_STRING(kNetErrConnectFailed),
        ERROR_STRING(kNetErrDisconnected),
        ERROR_STRING(kNetErrFileNotFound),
        ERROR_STRING(kNetErrOldBuildId),
        ERROR_STRING(kNetErrRemoteShutdown),
        ERROR_STRING(kNetErrTimeoutOdbc),
        ERROR_STRING(kNetErrAccountAlreadyExists),
        ERROR_STRING(kNetErrPlayerAlreadyExists),
        ERROR_STRING(kNetErrAccountNotFound),
        ERROR_STRING(kNetErrPlayerNotFound),
        ERROR_STRING(kNetErrInvalidParameter),
        ERROR_STRING(kNetErrNameLookupFailed),
        ERROR_STRING(kNetErrLoggedInElsewhere),
        ERROR_STRING(kNetErrVaultNodeNotFound),
        ERROR_STRING(kNetErrMaxPlayersOnAcct),
        ERROR_STRING(kNetErrAuthenticationFailed),
        ERROR_STRING(kNetErrStateObjectNotFound),
        ERROR_STRING(kNetErrLoginDenied),
        ERROR_STRING(kNetErrCircularReference),
        ERROR_STRING(kNetErrAccountNotActivated),
        ERROR_STRING(kNetErrKeyAlreadyUsed),
        ERROR_STRING(kNetErrKeyNotFound),
        ERROR_STRING(kNetErrActivationCodeNotFound),
        ERROR_STRING(kNetErrPlayerNameInvalid),
        ERROR_STRING(kNetErrNotSupported),
        ERROR_STRING(kNetErrServiceForbidden),
        ERROR_STRING(kNetErrAuthTokenTooOld),
        ERROR_STRING(kNetErrMustUseGameTapClient),
        ERROR_STRING(kNetErrTooManyFailedLogins),
        ERROR_STRING(kNetErrGameTapConnectionFailed),
        ERROR_STRING(kNetErrGTTooManyAuthOptions),
        ERROR_STRING(kNetErrGTMissingParameter),
        ERROR_STRING(kNetErrGTServerError),
        ERROR_STRING(kNetErrAccountBanned),
        ERROR_STRING(kNetErrKickedByCCR),
        ERROR_STRING(kNetErrScoreWrongType),
        ERROR_STRING(kNetErrScoreNotEnoughPoints),
        ERROR_STRING(kNetErrScoreAlreadyExists),
        ERROR_STRING(kNetErrScoreNoDataFound),
        ERROR_STRING(kNetErrInviteNoMatchingPlayer),
        ERROR_STRING(kNetErrInviteTooManyHoods),
        ERROR_STRING(kNetErrNeedToPay),
        ERROR_STRING(kNetErrServerBusy),
        ERROR_STRING(kNetErrVaultNodeAccessViolation),
    };
    COMPILER_ASSERT(arrsize(s_errors) == kNumNetErrors);
    
    if ((unsigned)code >= arrsize(s_errors)) {
        if (code == kNetPending)
            return ERROR_STRING(kNetPending);
        return L"ErrUnknown";
    }
    #undef ERROR_STRING
    
    return s_errors[code];
}