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


#ifdef WIN32
#pragma warning (disable : 4786)
#endif

#if !defined(_ISOAPFAULT_H____OF_AXIS_INCLUDED_)
#define _ISOAPFAULT_H____OF_AXIS_INCLUDED_

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

AXIS_CPP_NAMESPACE_START

using namespace std;

/**
 *  @class ISoapFault
 *  @brief Interface to represent SoapFault
 */
class ISoapFault  
{

public:
    /**
     * Destructor
     */
    virtual ~ISoapFault(){};

    /** 
      * When a complex fault arrives this method can be used to
      * get the name of that fault. This is useful because once 
      * we have the fault name we can pass the information necessary
      * to deserialize it, back to the SoapFault class.
      * 
      * @return name of the complex fault
      */
    virtual const AxisChar* getCmplxFaultObjectName() = 0;
    
    /** 
      * Once we know the complex fault name we can pass the information such as the
      * knowledge to deserialize the complex fault by calling this method.
      *
      * @param pDZFunct deserialize callback function pointer
      * @param pCreFunct create callback function
      * @param pDelFunct delete callback function
      * @param pName name
      * @param pNamespace url
      */
    virtual void* getCmplxFaultObject(void* pDZFunct, 
                                      void* pCreFunct, 
                                      void* pDelFunct, 
                                      const AxisChar* pName, 
                                      const AxisChar* pNamespace) = 0;

    /**
     * To retrieve a complex fault detail object
     * 
     *  @ return Complex fault detail object
     */
    virtual const void* getCmplxFaultObject() = 0;
    
    /** 
      * To retrieve a simple fault detail string
      *
      * @return Simple fault detail
      */
    virtual const AxisChar* getSimpleFaultDetail() = 0;

    /**
      * To retrieve the soap fault code
      *
      * @return fault code
      */
    virtual const AxisChar* getFaultcode() = 0;

    /**
      * To retrieve the soap fault string
      *
      * @return fault string
      */
    virtual const AxisChar* getFaultstring() = 0;

    /** 
      * To retrieve the soap fault actor
      *
      * @return fault actor
      */
    virtual const AxisChar* getFaultactor() = 0;

    /**
     * To set the soap fault code
     * 
     * @param sFaultcode fault code
     * @return status
     */
    virtual int setFaultcode(const AxisChar* sFaultcode) = 0;

    /**
     * To set the soap fault string
     * 
     * @param sFaultstring fault string
     * @return status
     */
    virtual int setFaultstring(const AxisChar* sFaultstring) = 0;

    /**
     * To set the soap fault actor
     * 
     * @param sFaultactor fault actor
     * @return status
     */
    virtual int setFaultactor(const AxisChar* sFaultactor) = 0;

    /**
     * To set the soap fault detail for simple text detail
     * 
     * @param sFaultdetail detail
     * @return status
     */
    virtual int setFaultDetail(const AxisChar* sFaultdetail) = 0;

    /**
     * To set the soap fault detail for complex detail
     * 
     * @param pCmplxFaultObject detail
     * @return status
     */
    virtual int setCmplxFaultObject(const void* pCmplxFaultObject) = 0;

};

AXIS_CPP_NAMESPACE_END

#endif 

