/*
 *   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.
 */
#ifndef OTHERFAULTEXCEPTION_INCLUDED
#define OTHERFAULTEXCEPTION_INCLUDED

/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE   */
/* ----------------------------------------------------------------   */
/* THIS HEADER FILE PATTERNED AFTER CORRESPONDING hpp HEADER FILE.    */
/* CHANGES TO hpp HEADER FILE MAY NEED TO BE PROPAGATED HERE AND IN   */
/* THE IMPLEMEMTATION OF THE C APIS.                                  */
/* ----------------------------------------------------------------   */
/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE   */
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */

#ifdef __cplusplus
 extern "C" {
#endif


#include <axis/GDefine.h>
#include <axis/SoapFaultException.h>

/**
 * @file OtherFaultException.hpp
 */
/**
 * @class OtherFaultException
 * @brief A server-generated soap fault exception
 *
 * An exception thrown back to a client application that represents a soap
 * fault generated by the server.
 *
 */

/**
 * Constructor
 *
 * @param code is the SOAP faultcode
 * @param string is the SOAP faultstring
 * @param actor is the SOAP faultactor
 * @param detail is the SOAP fault detail
 * @param exceptionCode is the axis exception code
 */
AXISC_STORAGE_CLASS_INFO
AXISCHANDLE axiscOtherFaultExceptionCreate(const AxiscChar * code, 
	const AxiscChar * string, 
	const AxiscChar * actor, 
	const AxiscChar * detail, 
	int exceptionCode);

/**
 * Destructor
 */
AXISC_STORAGE_CLASS_INFO
void axiscOtherFaultExceptionDestroy(AXISCHANDLE otherFaultException);

/**
 * Returns the SOAP fault detail
 *
 * @return fault detail
 */
AXISC_STORAGE_CLASS_INFO
const AxiscChar * axiscOtherFaultExceptionGetFaultDetail(AXISCHANDLE otherFaultException);

/**
 * Set SOAP fault detail
 *
 * @param detail is the SOAP fault detail
 */
AXISC_STORAGE_CLASS_INFO
void axiscOtherFaultExceptionSetFaultDetail(AXISCHANDLE otherFaultException, const AxiscChar * detail);


#ifdef __cplusplus
 }
#endif

#endif /* OTHERFAULTEXCEPTION_INCLUDED */
