/*
 *   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.
 */

/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/* 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 __SOAPFAULTEXCEPTION_H_OF_AXIS_INCLUDED_
#define __SOAPFAULTEXCEPTION_H_OF_AXIS_INCLUDED_

#include <axis/GDefine.hpp>
#include <axis/AxisException.hpp>

/**
 * @file SoapFaultException.hpp
 */

AXIS_CPP_NAMESPACE_START

/**
 * @class SoapFaultException
 * @brief Superclass of all user-defined soap faults defined in the WSDL
 * 
 * SoapFaultException is the superclass of all user faults that are defined
 * in the WSDL. This enables a client application to catch all soap faults
 * in a single catch block. To catch a specific soap fault, a client
 * application should catch the class that represents the fault's complex
 * type. SoapFaultException is a simple class that encapsulates the fault
 * information and does not reference the SoapFault itself. This means it
 * can clean it's own storage in its destructor so the client application
 * doesn't have to.
 * 
 */

class STORAGE_CLASS_INFO SoapFaultException :public AxisException
{
public:
    /**
     * Default constructor
     */
    SoapFaultException();
    
    /**
     * SoapFaultException constructor
     * 
     * @param code is the SOAP faultcode 
     * @param string is the SOAP faultstring
     * @param actor is the SOAP faultactor
     * @param exceptionCode is the axis exception code
     */
    SoapFaultException(const AxisChar *code, 
                       const AxisChar *string, 
                       const AxisChar *actor, 
                       int exceptionCode);
  
    /**
     * Copy constructor
     * 
     * @param ae is the AxisException to be copied
     */
    SoapFaultException(AxisException& ae);
   
    /**
     * Copy constructor
     * 
     * @param copy is the SoapFaultException to be copied
     */
    SoapFaultException(const SoapFaultException& copy);

    /**
     * Assignment operator
     * 
     * @param other is the SOAPFaultException to be copied
     * @return reference to this
     */
    SoapFaultException& operator=(const SoapFaultException& other);

    /**
     * Destructor
     */
    virtual ~SoapFaultException() throw();

    /**
     * Returns the SOAP faultcode
     * 
     * @return faultCode
     */
    virtual const AxisChar *getFaultCode() const;

    /**
     * Returns the SOAP faultstring
     * 
     * @return faultString
     */
    virtual const AxisChar *getFaultString() const;

    /**
     * Returns the SOAP faultactor
     * 
     * @return faultActor
     */
    virtual const AxisChar *getFaultActor() const;

    /**
     * Set the SOAP faultcode
     * 
     * @param code is the SOAP faultcode
     */
    virtual void setFaultCode(const AxisChar *code);

    /**
     * Set the SOAP faultstring
     * 
     * @param string is the SOAP faultstring
     */
    virtual void setFaultString(const AxisChar *string);

    /**
     * Set the SOAP faultactor
     * 
     * @param actor is the SOAP faultactor
     */
    virtual void setFaultActor(const AxisChar *actor);
       
private:
    /**
     * SOAP faultcode
     */
    AxisChar *m_code;

    /**
     * SOAP faultactor
     */
    AxisChar *m_actor;
};

AXIS_CPP_NAMESPACE_END

#endif

