/*

File: socketManager.cpp
Author: Sean Neubert

This class is for managing our sockets classes and such...

*/

#include "socketManager.h"

// this will be file scope...
static WSADATA wsaData;

// so here we will load our windows DLL...if needed...
bool socketManager::initFramework(){
    
#ifdef WIN32
    /* Load Winsock 2.0 DLL */
    if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0){
        return false;
    } // end of checking 
#endif

    return true;
} // end of initSocket
    
// so here we will unload our windows DLL...again, this is only if needed
bool socketManager::cleanFramework(){

#ifdef WIN32
    WSACleanup();  /* Cleanup Winsock */
#endif

    return true;
} // end of cleanSocket

// this is to keep our error handling cross platform...
const char * socketManager::getSocketError(){

#ifdef WIN32
    return socketManager::getWSAMsg( WSAGetLastError() );
#else
    return strerror( errno );
#endif

} // end of getSocketError function

#ifdef WIN32
/*
we'll return what the error is...
Note that there is likely a smarter way to do this.  I don't know what it 
is at the moment, so here it is.  It's long too, sorry :-(
*/
const char * socketManager::getWSAMsg( int error ){
    
    switch( error ){
        case WSAEINTR:
            return "Interrupted function call";
        break;
        
        case WSAEACCES:
            return "Permission denied";
        break;

        case WSAEFAULT:
            return "Bad address";
        break;

        case WSAEINVAL:
            return "Invalid argument";
        break;

        case WSAEMFILE:
            return "Too many open files";
        break;

        case WSAEWOULDBLOCK:
            return "Resource temporarily unavailable";
        break;

        case WSAEINPROGRESS:
            return "Operation now in progress";
        break;

        case WSAEALREADY:
            return "Operation already in progress";
        break;

        case WSAENOTSOCK:
            return "Socket operation on nonsocket";
        break;

        case WSAEDESTADDRREQ:
            return "Destination address required";
        break;

        case WSAEMSGSIZE:
            return "Message too long";
        break;

        case WSAEPROTOTYPE:
            return "Protocol wrong type for socket";
        break;

        case WSAENOPROTOOPT:
            return "Bad protocol option";
        break;

        case WSAEPROTONOSUPPORT:
            return "Protocol not supported";
        break;

        case WSAESOCKTNOSUPPORT:
            return "Socket type not supported";
        break;

        case WSAEOPNOTSUPP:
            return "Operation not supported";
        break;

        case WSAEPFNOSUPPORT:
            return "Protocol family not supported";
        break;

        case WSAEAFNOSUPPORT:
            return "Address family not supported by protocol family";
        break;

        case WSAEADDRINUSE:
            return "Address already in use";
        break;

        case WSAEADDRNOTAVAIL:
            return "Cannot assign requested address";
        break;

        case WSAENETDOWN:
            return "Network is down";
        break;

        case WSAENETUNREACH:
            return "Network is unreachable";
        break;

        case WSAENETRESET:
            return "Network dropped connection on reset";
        break;

        case WSAECONNABORTED:
            return "Software caused connection abort";
        break;

        case WSAECONNRESET:
            return "Connection reset by peer";
        break;
        
        case WSAENOBUFS:
            return "No buffer space available";
        break;

        case WSAEISCONN:
            return "Socket is already connected";
        break;

        case WSAENOTCONN:
            return "Socket is not connected";
        break;

        case WSAESHUTDOWN:
            return "Cannot send after socket shutdown";
        break;

        case WSAETIMEDOUT:
            return "Connection timed out";
        break;

        case WSAECONNREFUSED:
            return "Connection refused";
        break;

        case WSAEHOSTDOWN:
            return "Host is down";
        break;

        case WSAEHOSTUNREACH:
            return "No route to host";
        break;

        case WSAEPROCLIM:
            return "Too many processes";
        break;

        case WSASYSNOTREADY:
            return "Network subsystem is unavailable";
        break;

        case WSAVERNOTSUPPORTED:
            return "Winsock.dll version out of range";
        break;

        case WSANOTINITIALISED:
            return "Successful WSAStartup not yet performed";
        break;

        case WSAEDISCON:
            return "Graceful shutdown in progress";
        break;

        case WSATYPE_NOT_FOUND:
            return "Class type not found";
        break;

        case WSAHOST_NOT_FOUND:
            return "Host not found";
        break;

        case WSATRY_AGAIN:
            return "Nonauthoritative host not found";
        break;

        case WSANO_RECOVERY:
            return "This is a nonrecoverable error";
        break;

        case WSANO_DATA:
            return "Valid name, no data record of requested type";
        break;

        /*
        case WSA_INVALID_HANDLE:
            return "Specified event object handle is invalid";
        break;

        case WSA_INVALID_PARAMETER:
            return "One or more parameters are invalid";
        break;

        case WSA_IO_INCOMPLETE:
            return "Overlapped I/O event object not in signaled state";
        break;

        case WSA_IO_PENDING:
            return "Overlapped operations will complete later";
        break;

        case WSA_NOT_ENOUGH_MEMORY:
            return "Insufficient memory available";
        break;

        case WSA_OPERATION_ABORTED:
            return "Overlapped operation aborted";
        break;

        case WSAINVALIDPROCTABLE:
            return "Invalid procedure table from service provider";
        break;

        case WSAINVALIDPROVIDER:
            return "Invalid service provider version number";
        break;

        case WSAPROVIDERFAILEDINIT:
            return "Unable to initilize a service provider";
        break;

        case WSASYSCALLFAILURE:
            return "System call failure";
        break;
        */

    } // end of switch statement

    return "Unknown Error";
} // end of getWSAMsg

#endif


// EOF