/*
 *   Copyright 2003-2004 The Apache Software Foundation.
// (c) Copyright IBM Corp. 2004, 2005 All Rights Reserved
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 *
 *
 *
 */

/**
 * @file AxisException.hpp
 *
 */
 
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE   */
/* ----------------------------------------------------------------   */
/* CHANGES TO hpp HEADER FILE MAY NEED TO BE PROPAGATED TO THE        */
/* C-EQUIVALENT HEADER FILE IN SUPPORT OF THE C-BINDING INTERFACES.   */
/* ----------------------------------------------------------------   */
/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE   */
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */

#ifndef __AXISEXCEPTION_H_OF_AXIS_INCLUDED_
#define __AXISEXCEPTION_H_OF_AXIS_INCLUDED_

#include <axis/GDefine.hpp>
#include <string>
#include <exception>
#include <new>
#include <typeinfo>
#include <stdexcept>

AXIS_CPP_NAMESPACE_START
using namespace std;

/*
 * The following enumeration is used to serve the Axis C++ codes for 
 * faults.
 */
#define CLIENT_FAULT_OFFSET      0x0
#define SERVER_FAULT_OFFSET      0x1000
#define SOAP_FAULT_OFFSET        0x2000
#define ENGINE_FAULT_OFFSET      0x3000
#define WSDD_FAULT_OFFSET        0x4000
#define TRANSPORT_FAULT_OFFSET   0x5000
#define CONFIG_FAULT_OFFSET      0x6000
#define AXISC_FAULT_OFFSET       0x7000

/**
 * @enum AXISC_EXCEPTIONS
 * Enumeration of exception codes used by AxisException
 */
typedef enum 
{
    /*The notation used for naming these exceptions is as follows
     *CLIENT at the beginning means when this interpreted as a soap fault
     *    it's fault code is CLIENT
     *SERVER at the beginning means when this interpreted as a soap fault
     *    it's fault code is SERVER
     *SOAP that comes next to CLIENT/SERVER means this is a soap related
     *    exception
     *ENGINE that comes next to CLIENT/SERVER means this is a axisc++ engine
     *    related exception
     *WSDD that comes next to CLIENT/SERVER means this is a wsdd related
     *    exception
     *TRANSPORT that comes next to CLIENT/SERVER means this is a transport related
     *    exception
     *CONFIG that comes next to CLIENT/SERVER means this is a axisc++ configuration
     *    related exception
     *AXISC ?
     */
    /* SOAP faults */
        /** AxisSoapException:Soap Version mismatch fault occurred */
/*0*/    SOAP_VERSION_MISMATCH, 
        /** AxisSoapException:Soap Must understand fault occurred */
/*1*/    SOAP_MUST_UNDERSTAND,    

    /* Client faults */
        /**
         * AxisSoapException:Received message is incomplete
         */
/*2*/    CLIENT_SOAP_MESSAGE_INCOMPLETE,
        /**
         * AxisSoapException:Soap action is empty
         */
/*3*/    CLIENT_SOAP_SOAP_ACTION_EMTPY,
        /**
         * AxisSoapException:Received content is faulty
         */
/*4*/    CLIENT_SOAP_SOAP_CONTENT_ERROR,
        /**
         * AxisSoapException:Request method is not a soap method
         */
/*5*/    CLIENT_SOAP_NO_SOAP_METHOD,
        /**
         * AxisSoapException:Content is not a valid soap message
         */
/*6*/    CLIENT_SOAP_CONTENT_NOT_SOAP,
        /**
         * AxisWsddException:Requested service not found
         */
/*7*/    CLIENT_WSDD_SERVICE_NOT_FOUND,
        /**
         * AxisWsddException:Requested method is not allowed
         */
/*8*/    CLIENT_WSDD_METHOD_NOT_ALLOWED,
        /**
         * AxisWsddException: Parameter type mismatch
         */
/*9*/    CLIENT_WSDD_PARA_TYPE_MISMATCH,
        /**
         * 
         */
/*10*/   CLIENT_ENGINE_CLIENT_HANDLER_FAILED,
        /**
         * HTTPTransportException:Generic client transport exception
         */
/*11*/   CLIENT_TRANSPORT_EXCEPTION,
        /**
         * HTTPTransportException:Client failed to open connection to server
         */
/*12*/   CLIENT_TRANSPORT_OPEN_CONNECTION_FAILED,
        /**
         * HTTPTransportException:Client attempted to use SSL functions without the proper prerquistes
         */
/*13*/   CLIENT_TRANSPORT_TYPE_MISMATCH,
        /**
         * CLIENT_TRANSPORT_HAS_NO_UNSECURE_TRANSPORT_LAYER
         */
/*14*/   CLIENT_TRANSPORT_HAS_NO_UNSECURE_TRANSPORT_LAYER,
        /**
         * HTTPTransportException:Client attempted to use secure transport (https) without an SSL layer
         */
/*15*/   CLIENT_TRANSPORT_HAS_NO_SECURE_TRANSPORT_LAYER,
        /**
         * 
         */
/*16*/   CLIENT_SSLCHANNEL_RECEPTION_EXCEPTION,
        /**
         * 
         */
/*17*/   CLIENT_SSLCHANNEL_SENDING_EXCEPTION,
        /**
         * 
         */
/*18*/   CLIENT_SSLCHANNEL_CHANNEL_INIT_ERROR,
        /**
         * 
         */
/*19*/   CLIENT_SSLCHANNEL_SOCKET_CREATE_ERROR,
        /**
         * 
         */
/*20*/   CLIENT_SSLCHANNEL_SOCKET_CONNECT_ERROR,
        /**
         * 
         */
/*21*/   CLIENT_SSLCHANNEL_INVALID_SOCKET_ERROR,
        /**
         * Check implementation specific error message
         */
/*22*/   CLIENT_SSLCHANNEL_CONTEXT_CREATE_ERROR,
        /**
         * Check implementation specific error message
         */
/*23*/   CLIENT_SSLCHANNEL_ERROR,
        /**
         * AxisSoapException:Content is not unique within the MIME message
         */
/*24*/   CLIENT_MIME_CONTENT_ID_NOT_UNIQUE,

    /* Server faults */
        /**
         * SERVER_ENGINE_EXCEPTION
         */
/*25*/    SERVER_ENGINE_EXCEPTION,
        /**
         * AxisEngineException:Could not load service
         */
/*26*/    SERVER_ENGINE_COULD_NOT_LOAD_SRV,
        /**
         * AxisEngineException:Could not load handler
         */
/*27*/    SERVER_ENGINE_COULD_NOT_LOAD_HDL,
        /**
         * DLOPEN FAILED in loading transport library
         */
/*28*/    SERVER_ENGINE_LOADING_TRANSPORT_FAILED,
        /**
         * DLOPEN FAILED in loading parser library
         */
/*29*/    SERVER_ENGINE_LOADING_PARSER_FAILED,
        /**
         * AxisEngineException:Handler failed
         */
/*30*/    SERVER_ENGINE_HANDLER_FAILED,
        /**
         * AxisEngineException:Web Service failed
         */
/*31*/    SERVER_ENGINE_WEBSERVICE_FAILED,
        /**
         * AxisEngineException:Handler initialization failed
         */
/*32*/    SERVER_ENGINE_HANDLER_INIT_FAILED,
        /**
         * AxisEngineException:Handler creation failed
         */
/*33*/    SERVER_ENGINE_HANDLER_CREATION_FAILED,
        /**
         * AxisEngineException:Library loading failed
         */
/*34*/    SERVER_ENGINE_LIBRARY_LOADING_FAILED,
        /**
         * AxisEngineException:Handler is not loaded
         */
/*35*/    SERVER_ENGINE_HANDLER_NOT_LOADED,
        /**
         * AxisEngineException:Handler is being used
         */
/*36*/    SERVER_ENGINE_HANDLER_BEING_USED,
        /**
         * AxisEngineException:Get handler failed
         */
/*37*/    SERVER_ENGINE_GET_HANDLER_FAILED,
        /**
         * AxisEngineException:Wrong handler type
         */
/*38*/    SERVER_ENGINE_WRONG_HANDLER_TYPE,
        /**
         * AxisConfigException:Unknown Axis C++ Configuration Exception
         */
/*39*/    SERVER_CONFIG_EXCEPTION,
        /**
         * AxisConfigException:Transport layer is not configured properly
         */
/*40*/    SERVER_CONFIG_TRANSPORT_CONF_FAILED,
        /**
         * AxisConfigException:Library path is empty(Not in server.wsdd file)
         */
/*41*/    SERVER_CONFIG_LIBRARY_PATH_EMPTY,
        /**
         * AxisWsddException:WSDD loading fail
         */
/*42*/    SERVER_WSDD_FILE_NOT_FOUND,
        /**
         * AxisWsddException:Unknown wsdd exception
         */
/*43*/    SERVER_WSDD_EXCEPTION,
        /**
         * AxisWsddException:No handlers configured in server.wsdd
         */
/*44*/    SERVER_WSDD_NO_HANDLERS_CONFIGURED,
        /**
         * AxisSoapException:Unknown Soap Exception
         */
/*45*/    SERVER_SOAP_EXCEPTION,
        /**
         * 
         */
/*46*/    SERVER_TRANSPORT_EXCEPTION,
        /**
         * HTTPTransportException:Problem occurred when receiving the stream
         */
/*47*/    SERVER_TRANSPORT_RECEPTION_EXCEPTION,
        /**
         * HTTPTransportException:Problem occurred when sending the stream
         */
/*48*/    SERVER_TRANSPORT_SENDING_EXCEPTION,
        /**
         * HTTPTransportException:HTTP Error, cannot process response message
         */
/*49*/    SERVER_TRANSPORT_PROCESS_EXCEPTION,
        /**
         * HTTPTransportException:Unknow HTTP response, cannot process response message
         */
/*50*/    SERVER_TRANSPORT_UNKNOWN_HTTP_RESPONSE,
        /**
         * HTTPTransportException:HTTP transport error
         */
/*51*/    SERVER_TRANSPORT_HTTP_EXCEPTION,
        /**
         * HTTPTransportException:Unexpected string received.
         * Most probably server returned an empty stream
         */
/*52*/    SERVER_TRANSPORT_UNEXPECTED_STRING,
        /**
         * HTTPTransportException:Cannot initialize a channel to the remote end
         */
/*53*/    SERVER_TRANSPORT_CHANNEL_INIT_ERROR,
        /**
         * AxisTransportException:Sockets error Couldn't create socket
         */
/*54*/    SERVER_TRANSPORT_SOCKET_CREATE_ERROR,
        /**
         * AxisTransportException:Cannot open a channel to the remote end, shutting down the channel
         */
/*55*/    SERVER_TRANSPORT_SOCKET_CONNECT_ERROR,
        /**
         * AxisTransportException:Invalid socket. Socket may not be open
         */
/*56*/    SERVER_TRANSPORT_INVALID_SOCKET,
        /**
         * AxisTransportException:Output streaming error on Channel while writing data
         */
/*57*/    SERVER_TRANSPORT_OUTPUT_STREAMING_ERROR,
        /**
         * AxisTransportException:Input streaming error while getting data
         */
/*58*/    SERVER_TRANSPORT_INPUT_STREAMING_ERROR,
        /**
         * AxisTransportException:Channel error while waiting for timeout
         */
/*59*/    SERVER_TRANSPORT_TIMEOUT_EXCEPTION,
        /**
         * AxisTransportException:Channel error connection timeout before receiving
         */
/*60*/    SERVER_TRANSPORT_TIMEOUT_EXPIRED,
        /**
         * See implementation specific error message
         */
/*61*/    SERVER_TRANSPORT_LOADING_SSLCHANNEL_FAILED,
        /**
         * DLOPEN FAILED in loading channel library
         */
/*62*/    SERVER_TRANSPORT_LOADING_CHANNEL_FAILED,
        /**
         * AxisTransportException:Transport buffer is empty
         */
/*63*/    SERVER_TRANSPORT_BUFFER_EMPTY,
        /**
         * AxisParseException:Buffer received from the parser is empty.  
         */
/*64*/    SERVER_PARSE_BUFFER_EMPTY,
        /**
         * AxisParseException:XML_STATUS_ERROR thrown from parser.  
         */
/*65*/    SERVER_PARSE_PARSER_FAILED, 
        /**
         * AxisParseException:Error when getting the byte stream from the transport.  
         */
/*66*/    SERVER_PARSE_TRANSPORT_FAILED,
        /**
         * This is a testing error
         */
/*67*/    SERVER_TEST_EXCEPTION,
        /**
         * Unknown error
         */
/*68*/    SERVER_UNKNOWN_ERROR,
        /**
         * AxisEngineException:Engine cannot be initialized as both client and server
         */
/*69*/    SERVER_CLIENT_ENGINE_MISMATCH,

    /* AXIS C faults */
    /*Following exceptions are not releated to soap faults
     */
        /**
         * A service has thrown an exception. see detail 
         */
/*70*/    AXISC_SERVICE_THROWN_EXCEPTION,
        /**
         * 
         */
/*71*/    AXISC_UNKNOWN_ELEMENT_EXCEPTION,
        /**
         * Cannot deserialize the requested element.
         * This may indicate a fault has been received.
         */
/*72*/    AXISC_NODE_VALUE_MISMATCH_EXCEPTION,
        /**
         * 
         */
/*73*/    AXISC_READ_CONF_EXCEPTION,

    /* CONFIG faults */
    /*Following exceptions are related to configuration faults
     */
        /**
         * AxisConfigException:configuration defaults have already been set
         */
/*74*/    CONFIG_DEFAULTS_ALREADY_SET,

    /**
     * HTTPTransportException: Redirect received
     */
/*75*/   SERVER_TRANSPORT_REDIRECT_RECEIVED,

    /*
     * This FAULT_LAST is not used as a fault code, but instead is used 
     * internaly in the code. Developers should not use this as a fault 
     * code.
     */
/*76*/    FAULT_LAST
} AXISC_EXCEPTIONS;

/**
 *   @class AxisException
 *   @brief Base class for Axis C++ exception hierarchy.
 *
 *   This will act as the base class for Axis C++ exception hierarchy. 
 *   This is class is derived from the std c++ exception class. Derived
 *   from this class are AxisConfigExceptin, AxisSoapExceptin, AxisWsddException,
 *   AxisEngineException, AxisTransportException and AxisParseException.
 *
 *   @author Damitha Kumarage (damitha@opensource.lk, damitha@jkcsworld.com)
 */
class STORAGE_CLASS_INFO AxisException : public exception
{
public:
    /** No parameter constructor*/
    AxisException():m_iExceptionCode(0), m_sMessage("") { }

    /** This can be used to throw an exception with exception code which is
      * is defined in the AxisException.h file, under AXISC_EXCEPTIONS type.
      * An additional description of the exception could be appended.
      *
      * @param iExceptionCode Exception code which is defined in the AxisException.h file,
      *  under AXISC_EXCEPTIONS type.
      * @param pcMessage A char pointer that will point to an exception message.
      * 
      * Example usage:
      * <pre>
      * throw AxisException(AXISC_NODE_VALUE_MISMATCH_EXCEPTION, 
      *                     "Some additional exception info");
        </pre>
      */
    AxisException(int iExceptionCode, const char* pcMessage = NULL):m_iExceptionCode(iExceptionCode)
    {
        setMessage(pcMessage);    
    }

    /** This can be used to throw an exception with another exception as a
      * parameter. One situation in which this can be used is when we catch
      * a standard exception like std::bad_alloc
      *
      * @param e An exception class derived from std::exception
      *
      * Example usage:
      * <pre>
      * throw AxisException(std::bad_alloc);
      * </pre>
      */
    AxisException(const AxisException& e):m_iExceptionCode(e.m_iExceptionCode)
    {
        setMessage(e.m_sMessage.c_str());
    }
    
    /** Destructor */
    virtual ~AxisException() throw() { }

    /**
     *  This method is defined in std::exception. AxisException and derived
     * classes will override this to print exception messages
     * 
     * @return Exception message
     */
    virtual const char* what() const throw() { return m_sMessage.c_str(); }

    /**
     * This can be called to get the exception code.
     *
     * @return Exception code
     */
    virtual int getExceptionCode() const { return m_iExceptionCode; }

    /**
     * This can be called to set the exception code
     * 
     * @param exceptionCode for this exception.
     */
    void setExceptionCode(int exceptionCode) { m_iExceptionCode = exceptionCode;}

    /**
     * 
     * Get error message text
     * @deprecated This method has now been deprecated, use AxisException::what()
     * 
     * @return Exception message
     */
    const char* getMessage() const { return what(); }
    
    /**
      * The method setMessage(std::string psMessage) uses to set the private data member m_sMessage
      * This method should be used to set the m_sMessage variable in derived classes.
      * 
      * @param psMessage The exception message to be set.
      */
    void setMessage(const char* psMessage) { m_sMessage = psMessage ? psMessage : "";  }
     
    /**
      * The method setMessage(std::string psMessage) uses to set the code and message.
      * This method will retrieve the corresponding message for the exceptionCode and then append 
      * the detailMessage if set.
      * 
      * @param exceptionCode The exception code for which message is to be retrieved.
      * @param defaultMsg    If exception code cannot be mapped to message, this will be used.
      * @param detailMessage Additional message information that will be appended to the exception message.
      */
    void setMessage(int exceptionCode, const char *defaultMsg, const char* detailMessage=NULL)
    {
        m_iExceptionCode = exceptionCode;
        std::string sMessage = detailMessage ? detailMessage : "";
        m_sMessage = getMessageForExceptionCode(exceptionCode, defaultMsg) + "\n" + sMessage;
    }
    
    /** 
     * The method will set exception data from another exception
     * 
     * @param e Exception from which data is to be set.
     */
    void setExceptionFromException(const AxisException& e)
    {
        m_iExceptionCode = e.m_iExceptionCode;
        m_sMessage       = e.m_sMessage;
    }

    /**
      * The method will reset exception object as if no parameters
      * where passed to constructor
      */
    void resetException()
    {
        m_iExceptionCode = 0;
        m_sMessage       = "";
    }
    
    /**
     * This method is used to map AXIS exception code to a text message. Primarily used
     * by classes that inherit from AxisException. 
     * 
     * @param exceptionCode The exception code for which message is to be retrieved.
     * @param defaultMsg    If exception code cannot be mapped to message, this will be returned.
     */
     static std::string getMessageForExceptionCode(int exceptionCode, const char *defaultMsg=NULL)
     {
        std::string sMsg;
        
        switch (exceptionCode)
        {
            case SOAP_VERSION_MISMATCH:
                sMsg = "AxisSoapException: Soap VersionMismatch fault occurred.";
                break;
            case SOAP_MUST_UNDERSTAND:    
                sMsg = "AxisSoapException: Soap MustUnderstand fault occurred.";
                break;
            case CLIENT_SOAP_MESSAGE_INCOMPLETE:
                sMsg = "AxisSoapException: Soap message is incomplete.";
                break;
            case CLIENT_SOAP_SOAP_ACTION_EMTPY:
                sMsg = "AxisSoapException: SOAPAction HTTP header is empty.";
                break;
            case CLIENT_SOAP_SOAP_CONTENT_ERROR:
                sMsg = "AxisSoapException: Soap message content is not valid.";
                break;
            case CLIENT_SOAP_NO_SOAP_METHOD:
                sMsg = "AxisSoapException: Request method is not a soap method.";
                break;
            case CLIENT_SOAP_CONTENT_NOT_SOAP:
                sMsg = "AxisSoapException: Content is not a valid soap message.";
                break;
            case CLIENT_WSDD_SERVICE_NOT_FOUND:
                sMsg = "AxisWsddException: Requested service not found.";
                break;
            case CLIENT_WSDD_METHOD_NOT_ALLOWED:
                sMsg = "AxisWsddException: Requested method is not allowed.";
                break;
            case CLIENT_WSDD_PARA_TYPE_MISMATCH:
                sMsg = "AxisWsddException: Parameter type mismatch.";
                break;
            case CLIENT_ENGINE_CLIENT_HANDLER_FAILED:
                sMsg = "AxisEngineException: Client handler failed.";
                break;
            case CLIENT_TRANSPORT_EXCEPTION:
                sMsg = "HTTPTransportException: Client transport exception.";
                break;
            case CLIENT_TRANSPORT_OPEN_CONNECTION_FAILED:
                sMsg = "HTTPTransportException: Client failed to open.";
                break;
            case CLIENT_TRANSPORT_TYPE_MISMATCH:
                sMsg = "HTTPTransportException: Client attempted to use SSL functions without the proper prerequisites.";
                break;
            case CLIENT_TRANSPORT_HAS_NO_UNSECURE_TRANSPORT_LAYER:
                sMsg = "HTTPTransportException: Client attempted to use non-existant unsecure transport (http).";
                break;
            case CLIENT_TRANSPORT_HAS_NO_SECURE_TRANSPORT_LAYER:
                sMsg = "HTTPTransportException: Client attempted to use non-existant secure transport (https).";
                break;
            case CLIENT_MIME_CONTENT_ID_NOT_UNIQUE:
                sMsg = "AxisSoapException: Content is not unique within the MIME message.";
                break;
            case SERVER_ENGINE_EXCEPTION:
                sMsg = "AxisEngineException: Exception occurred.";
                break;
            case SERVER_ENGINE_COULD_NOT_LOAD_SRV:
                sMsg = "AxisEngineException: Could not load service.";
                break;
            case SERVER_ENGINE_COULD_NOT_LOAD_HDL:
                sMsg = "AxisEngineException: Could not load handler.";
                break;
            case SERVER_ENGINE_LOADING_TRANSPORT_FAILED:
                sMsg = "AxisEngineException: Failed to load transport library.";
                break;
            case SERVER_ENGINE_LOADING_PARSER_FAILED:
                sMsg = "AxisEngineException: Failed to load parser library.";
                break;
            case SERVER_ENGINE_HANDLER_FAILED:
                sMsg = "AxisEngineException: Handler failed.";
                break;
            case SERVER_ENGINE_WEBSERVICE_FAILED:
                sMsg = "AxisEngineException: Web service failed.";
                break;
            case SERVER_ENGINE_HANDLER_INIT_FAILED:
                sMsg = "AxisEngineException: Handler initialization failed.";
                break;
            case SERVER_ENGINE_HANDLER_CREATION_FAILED:
                sMsg = "AxisEngineException: Handler creation failed.";
                break;
            case SERVER_ENGINE_LIBRARY_LOADING_FAILED:
                sMsg = "AxisEngineException: Library loading failed.";
                break;
            case SERVER_ENGINE_HANDLER_NOT_LOADED:
                sMsg = "AxisEngineException: Handler is not loaded.";
                break;
            case SERVER_ENGINE_HANDLER_BEING_USED:
                sMsg = "AxisEngineException: Handler is being used.";
                break;
            case SERVER_ENGINE_GET_HANDLER_FAILED:
                sMsg = "AxisEngineException: Failed to get handler.";
                break;
            case SERVER_ENGINE_WRONG_HANDLER_TYPE:
                sMsg = "AxisEngineException: Wrong handler type.";
                break;
            case SERVER_CONFIG_EXCEPTION:
                sMsg = "AxisConfigException: Exception occurred.";
                break;
            case SERVER_CONFIG_TRANSPORT_CONF_FAILED:
                sMsg = "AxisConfigException: Transport layer is not configured properly.";
                break;
            case SERVER_CONFIG_LIBRARY_PATH_EMPTY:
                sMsg = "AxisConfigException: Library path is empty (not in server.wsdd file).";
                break;
            case SERVER_WSDD_FILE_NOT_FOUND:
                sMsg = "AxisWsddException: Unable to load file.";
                break;
            case SERVER_WSDD_EXCEPTION:
                sMsg = "AxisWsddException: Exception occurred.";
                break;
            case SERVER_WSDD_NO_HANDLERS_CONFIGURED:
                sMsg = "AxisWsddException: No handlers configured in server.wsdd file.";
                break;
            case SERVER_SOAP_EXCEPTION:
                sMsg = "AxisSoapException: Exception occurred.";
                break;
            case SERVER_TRANSPORT_EXCEPTION:
                sMsg = "HTTPTransportException: Exception occurred.";
                break;
            case CLIENT_SSLCHANNEL_RECEPTION_EXCEPTION:
            case SERVER_TRANSPORT_RECEPTION_EXCEPTION:
                sMsg = "HTTPTransportException: Problem occurred when receiving the stream.";
                break;
            case CLIENT_SSLCHANNEL_SENDING_EXCEPTION:
            case SERVER_TRANSPORT_SENDING_EXCEPTION:
                sMsg = "HTTPTransportException: Problem occurred when sending the stream.";
                break;
            case SERVER_TRANSPORT_PROCESS_EXCEPTION:
                sMsg = "HTTPTransportException: Cannot process response message.";
                break;
            case SERVER_TRANSPORT_UNKNOWN_HTTP_RESPONSE:
                sMsg = "HTTPTransportException: Unknown HTTP response, cannot process response message.";
                break;
            case CLIENT_SSLCHANNEL_CONTEXT_CREATE_ERROR:
                sMsg = "HTTPTransportException: Context creation error.";
                break;
            case CLIENT_SSLCHANNEL_ERROR:
                sMsg = "HTTPTransportException: HTTPS transport error.";
                break;
            case SERVER_TRANSPORT_HTTP_EXCEPTION:
                sMsg = "HTTPTransportException: HTTP transport error.";
                break;
            case SERVER_TRANSPORT_UNEXPECTED_STRING:
                sMsg = "HTTPTransportException: Unexpected string received.";
                break;
            case CLIENT_SSLCHANNEL_CHANNEL_INIT_ERROR:    
            case SERVER_TRANSPORT_CHANNEL_INIT_ERROR:
                sMsg = "HTTPTransportException: Cannot initialize a channel to the remote end.";
                break;
            case CLIENT_SSLCHANNEL_SOCKET_CREATE_ERROR:                
            case SERVER_TRANSPORT_SOCKET_CREATE_ERROR:
                sMsg = "AxisTransportException: Unable to create a socket.";
                break;
            case CLIENT_SSLCHANNEL_SOCKET_CONNECT_ERROR:                
            case SERVER_TRANSPORT_SOCKET_CONNECT_ERROR:
                sMsg = "AxisTransportException: Cannot open a channel to the remote end.";
                break;
            case CLIENT_SSLCHANNEL_INVALID_SOCKET_ERROR:                
            case SERVER_TRANSPORT_INVALID_SOCKET:
                sMsg = "AxisTransportException: Socket not valid.";
                break;
            case SERVER_TRANSPORT_OUTPUT_STREAMING_ERROR:
                sMsg = "HTTPTransportException: Output streaming error while writing to channel.";
                break;
            case SERVER_TRANSPORT_INPUT_STREAMING_ERROR:
                sMsg = "HTTPTransportException: Input streaming error while reading from channel.";
                break;
            case SERVER_TRANSPORT_TIMEOUT_EXCEPTION:
                sMsg = "HTTPTransportException: Channel error while doing a timed wait.";
                break;
            case SERVER_TRANSPORT_TIMEOUT_EXPIRED:
                sMsg = "HTTPTransportException: Channel I/O operation timed out.";
                break;
            case SERVER_TRANSPORT_LOADING_SSLCHANNEL_FAILED:
            case SERVER_TRANSPORT_LOADING_CHANNEL_FAILED:
                sMsg = "HTTPTransportException: Unable to load channel library.";
                break;
            case SERVER_TRANSPORT_BUFFER_EMPTY:
                sMsg = "HTTPTransportException: Transport buffer is empty.";
                break;
            case SERVER_PARSE_BUFFER_EMPTY:
                sMsg = "AxisParseException: Buffer received from the parser is empty.";
                break;
            case SERVER_PARSE_PARSER_FAILED: 
                sMsg = "AxisParseException: Parser error occurred.";
                break;
            case SERVER_PARSE_TRANSPORT_FAILED:
                sMsg = "AxisParseException: Error when getting the byte stream from the transport.";
                break;
            case SERVER_TEST_EXCEPTION:
                sMsg = "This is a testing error.";
                break;
            case SERVER_CLIENT_ENGINE_MISMATCH:
                sMsg = "AxisEngineException: Engine cannot be initialized as both client and server.";
                break;
            case AXISC_SERVICE_THROWN_EXCEPTION:
                sMsg = "A service has thrown an exception.";
                break;
            case AXISC_UNKNOWN_ELEMENT_EXCEPTION:
                sMsg = "AxisParseException: Unknown element encountered.";
                break;
            case AXISC_NODE_VALUE_MISMATCH_EXCEPTION:
                sMsg = "AxisSoapException: Cannot deserialize the requested element.";
                break;
            case AXISC_READ_CONF_EXCEPTION:
                sMsg = "AxisConfigException: Unable to read configuration file.";
                break;
            case CONFIG_DEFAULTS_ALREADY_SET:  
                sMsg = "AxisConfigException: Configuration defaults have already been set.";
                break;
            case SERVER_UNKNOWN_ERROR:
            default:    
                sMsg= defaultMsg ? defaultMsg : "AxisException:";      
                break;
        }
        
        return sMsg;
     }

protected:
    /**
      * This data member is common to all the inherited classes of this base class.
      * The integer variable m_iExceptionCode stores the Exception code
      */
    int m_iExceptionCode;

    /**
      * This data member is common to all the inherited classes of this base class.
      * The variable m_sMessage is used to store the Exception message
      */
    std::string m_sMessage;
};

AXIS_CPP_NAMESPACE_END

#endif

