#ifndef SOCKETEXCEPTION_H_
#define SOCKETEXCEPTION_H_

#include <cstring>

class SocketException
{
public:
    SocketException( const char* message, int errcode = 0 )
        : message_( NULL ), errno_( errcode )
    {
        int length = strlen( message );
        if( length > 8191 ) length = 8191;
        message_ = new char[length + 1];
        strncpy( message_, message, length );
        message_[length] = 0;
    }

    SocketException( const char* message1, const char* message2, int errcode = 0 )
        : message_( NULL ), errno_( errcode )
    {
        size_t length1 = strlen( message1 );
        if( length1 > 4095 ) length1 = 4095;
        size_t length2 = strlen( message2 );
        if( length2 > 4095 ) length2 = 4095;
        message_ = new char[length1 + length2 + 1];
        strncpy( message_, message1, length1 );
        strncpy( message_ + length1, message2, length2 );
        message_[length1 + length2] = 0;
    }

    ~SocketException()
    {
        delete[] message_;
    }

    const char* what() const throw()
    {
        return message_;
    }

    int getErrno()
    {
        return errno_;
    }

    SocketException( const SocketException& old )
    {
        int length = strlen( old.message_ ) + 1;
        message_ = new char[ length ];
        strncpy( message_, old.message_, length );
        errno_ = old.errno_;
    }

private:
    char* message_;
    int errno_;
};

#endif /*SOCKETEXCEPTION_H_*/
