/*
 *   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 Call.hpp
 *
 * This file Contains the Call class and equivalent C function tables
 * that all web service stubs generated by WSDL2Ws tool use to talk
 * to Axis Engine.
 *
 */
#ifndef CALL_INCLUDED
#define CALL_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/TypeMapping.h>
#include <axis/AxisUserAPI.h>
#include <axis/WSDDDefines.h>
#include <axis/IHeaderBlock.h>

/**
 * @class Call
 *
 * @brief This file Contains the Call class and equivalent C function tables
 *        that all web service stubs generated by WSDL2Ws tool use to talk
 *        to Axis Engine.
 *
 */

/* A separate call class object should be used by each thread */
AXISC_STORAGE_CLASS_INFO
AXISCHANDLE axiscCallCreate();

AXISC_STORAGE_CLASS_INFO
void axiscCallDestroy(AXISCHANDLE call);

/**
 * Set the expected SOAP version.  The currently supported SOAP versions
 * are 1.1 and 1.2.
 *
 * @param version is an enumerated type.  SOAP_VERSION is defined in
 * SoapEnvVersions.hpp and currently has the following values;- SOAP_VER_1_1
 * and SOAP_VER_1_2.
 */
AXISC_STORAGE_CLASS_INFO
void axiscCallSetSOAPVersion(AXISCHANDLE call, AXISC_SOAP_VERSION version);

/**
 * Set a property in the transport layer.
 *
 * @param type is an enumerated type.  AXIS_TRANSPORT_INFORMATION_TYPE is
 * defined in GDefine.hpp and currently has the following values;- @n
 * SOAPACTION_HEADER, SERVICE_URI, OPERATION_NAME, SOAP_MESSAGE_LENGTH,
 * TRANSPORT_PROPERTIES, SECURE_PROPERTIES, DLL_NAME, CHANNEL_HTTP_SSL_DLL_NAME (same as DLL_NAME),
 * CHANNEL_HTTP_DLL_NAME and CONTENT_TYPE.
 * @param value points to a null terminated string that contains the new
 * transport property value.
 * @return The return value is either AXIS_SUCCESS or AXIS_FAIL.
 * @note This method can also throw the following exception;- AxisGenException
 */
AXISC_STORAGE_CLASS_INFO
int axiscCallSetTransportProperty(AXISCHANDLE call, AXISC_TRANSPORT_INFORMATION_TYPE type, 
	const char * value);

/**
 * Get a property from either the request or response HTTP Header.
 *
 * @param key is a null terminated character string.  The 'key' is the name
 * of the HTTP header information element that is to be found.  For example,
 * the HTTP header may look something like this;- @n
 * POST /axis/AxisBench HTTP/1.1 @n
 * Host: 127.0.0.1:12345 @n
 * Content-Type: text/xml; charset=UTF-8 @n
 * SOAPAction: "" @n
 * Content-Length: 83779 @n
 * Then if 'key' was "Host", the returned null terminated character string would
 * be "127.0.0.1:12345".
 *
 * @param response is a boolean.  If 'response' is set to TRUE, then the
 * response HTTP header is used, else the request HTTP header will be used.
 * The default is TRUE, which implies that the response HTTP header will be used.
 * @return is a null terminated character string containing the associated
 * 'key' value.  If the key was not found, then the return value will be NULL.
 */
AXISC_STORAGE_CLASS_INFO
const char * axiscCallGetTransportProperty(AXISCHANDLE call, const char * key, 
	AxiscBool response);

AXISC_STORAGE_CLASS_INFO
void axiscCloseTransportConnection(AXISCHANDLE call);

/**
 * Set a handler property.  This adds a new property to a list of properties
 * that a handler can access when it is invoked.
 *
 * @param name is a null terminated character string containing the name of
 * the handler property.
 * @param value is a pointer to an untyped object.
 * @param len is an integer value that is the length of the object passed in
 * the 'value' parameter.
 * @return Always AXIS_SUCCESS.
 * @note The method does not check if the name already exists in the list of
 * handler properties and so it is possible to have more than one object with
 * the same name in the list.  The user is advised to ensure that all names
 * are unique.
 */
AXISC_STORAGE_CLASS_INFO
int axiscCallSetHandlerProperty(AXISCHANDLE call, AxiscChar * name, 
	void * value, 
	int len);

/**
 * set the protocol that the underlying transport will use.
 * If there is not transport set then the transport protocol is stored locally
 * until there is a transport.
 *
 * @param protocol the protocol that you want. Allowed values are  defined in
 * GDefine.hpp AXIS_PROTOCOL_TYPE
 * @return AXIS_SUCCESS if the protocol was set correctly in the underlying
 * transport or, if there is no transport then the value was stored safely.
 */
AXISC_STORAGE_CLASS_INFO
int axiscCallSetProtocol(AXISCHANDLE call, AXISC_PROTOCOL_TYPE protocol);

/**
 * Get the protocol that the transport is or will use.
 *
 * @return the transport protocol being used.
 */
AXISC_STORAGE_CLASS_INFO
AXISC_PROTOCOL_TYPE axiscCallGetProtocol(AXISCHANDLE call);

/**
 * At the end of every web service (request/reply SOAP message pair) call,
 * the deserialiser needs to be uninitialised.  If there was a "sessionid" in
 * the message data, then replace the existing session id with the one from the
 * message.  If there was no new session id, then delete the existing one.  An
 * example of it use can be found in any generated stub or in this code snippet
 * below:- @n
 * try @n
 * { @n
 *   if( AXIS_SUCCESS != m_pCall->initialize( CPP_DOC_PROVIDER)) return pReturn; @n
 *   if( NULL == m_pCall->getTransportProperty( "SOAPAction", false)) @n
 *   { @n
 *     m_pCall->setTransportProperty( SOAPACTION_HEADER , ""); @n
 *   } @n
 *   m_pCall->setSOAPVersion( SOAP_VER_1_1); @n
 *   m_pCall->setOperation( "doBenchRequest", "http://axisbench.test.apache.org"); @n
 *   includeSecure(); @n
 *   applyUserPreferences(); @n
 *   : @n
 *   if( AXIS_SUCCESS == m_pCall->invoke()) @n
 *   { @n
 *   : @n
 *   } @n
 *   <B> m_pCall->unInitialize(); </B>@n
 * }
 *
 * @return Always AXIS_SUCCESS.
 */
AXISC_STORAGE_CLASS_INFO
int axiscCallUnInitialize(AXISCHANDLE call);

/**
 * Populate the message data object by doing the following;- @n
 * Move the handler data previously added using the setHandlerProperty method. @n
 * Add the serialiser and deserialiser entry points. @n
 * Set the serialiser and deserialiser provider type (as defined by nStyle). @n
 * Reset and initialise the serialiser and deserialiser engines. @n
 * Set the serialiser and deserialiser encoder/decoder styles to RPC or DOC @n
 * Set the sessionid property. @n
 * Move the attachments data. @n
 *
 * @param nStyle Set the serialiser and deserialiser provider type.  PROVIDERTYPE
 * is an enumerated type and is defined in WSDDDefines.hpp.  The current values
 * are:- @n
 * C_RPC_PROVIDER @n
 * C_DOC_PROVIDER @n
 * CPP_RPC_PROVIDER @n
 * CPP_DOC_PROVIDER @n
 * COM_PROVIDER (not implemented)@n
 * @return If the initialisation is successful, then AXIS_SUCCESS is returned,
 * otherwise AXIS_FAIL is returned.
 * @note This method may thrown an exception.
 */
AXISC_STORAGE_CLASS_INFO
int axiscCallInitialize(AXISCHANDLE call, AXISC_PROVIDERTYPE nStyle);

/**
 * @see axiscCallSendAndReceive
 * @deprecated use axiscCallSendAndReceive
 * @return If the invocation is successful, then AXIS_SUCCESS is returned,
 * otherwise AXIS_FAIL is returned.
 * @note This method may thrown an exception.
 */
AXISC_STORAGE_CLASS_INFO
int axiscCallInvoke(AXISCHANDLE call);

/**
 * This is the main entry point into the Axis engine.  Calling this method
 * will begin the sequence that serialises the message, invokes that request
 * handlers, transmits the request message and then wait for the response
 * message, calls the response handlers and then deserialises the response
 * message.
 * @return If the invocation is successful, then AXIS_SUCCESS is returned,
 * otherwise AXIS_FAIL is returned.
 * @note This method may thrown an exception.
 */
AXISC_STORAGE_CLASS_INFO
int axiscCallSendAndReceive(AXISCHANDLE call);

/**
 * This is the main entry point into the Axis engine.  Calling this method
 * will begin the sequence that serialises the message, invokes that request
 * handlers, transmits the request message. No response is expected and
 * no response handlers are called. 
 * @return If the invocation is successful, then AXIS_SUCCESS is returned,
 * otherwise AXIS_FAIL is returned.
 * @note This method may thrown an exception.
 */
AXISC_STORAGE_CLASS_INFO
int axiscCallSend(AXISCHANDLE call);

/**
 * Sets an Attribute to the SOAPMethod, using the given Attribute data.
 *
 * @param pLocalname The local name of the Attribute.
 * @param pPrefix The prefix of the Attribute.
 * @param pUri The namespace uri of the Attribute.
 * @param pValue The value of the Attribute.
 */
AXISC_STORAGE_CLASS_INFO
void axiscCallSetSOAPMethodAttribute(AXISCHANDLE call, const AxiscChar * pLocalname, 
	const AxiscChar * pPrefix, 
	const AxiscChar * pUri, 
	const AxiscChar * pValue);

/**
 * Ensure that existing attributes are cleared.
 */ 
AXISC_STORAGE_CLASS_INFO                      
void axiscCallClearSOAPMethodAttributes(AXISCHANDLE call);

/**
 * Method for adding complex parameters to the engine, ready to be serialised.
 *   An example of this method (taken from the automatically generated stubs
 * of the AxisBench test) follows:- @n
 * BenchDataType * AxisBench::doBenchRequest( BenchDataType * pBenchDataTypeObj) @n
 * : @n
 * char cPrefixAndParamName[17]; @n
 * sprintf( cPrefixAndParamName, @n
 *            "%s:doBench", @n
 *            m_pCall->getNamespacePrefix( Axis_URI_BenchDataType)); @n
 * m_pCall->addCmplxParameter( pBenchDataTypeObj, @n
 *                             (void *) Axis_Serialize_BenchDataType, @n
 *                               (void *) Axis_Delete_BenchDataType, @n
 *                               cPrefixAndParamName, @n
 *                               Axis_URI_BenchDataType); @n
 *
 * @param pObject is the 'complex' object.
 * @param pSZFunct is a pointer to the function that knows how to serialise
 * the object.
 * @param pDelFunct is a pointer to the function that knows how to delete the object.
 * @param pName is a null terminated character string that contains the
 * prefix:name of the object.
 * @param pNamespace is the namespace associated with the prefix used in 'pName'.
 */
AXISC_STORAGE_CLASS_INFO
void axiscCallAddCmplxParameter(AXISCHANDLE call, void * pObject, 
	void * pSZFunct, 
	void * pDelFunct, 
	const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method for adding complex type array parameters to the engine, ready to
 * be serialised.
 *
 * @param pArray is a pointer the an Axis_Array object.
 * @param pSZFunct is a pointer to the function that knows how to serialise the object.
 * @param pDelFunct is a pointer to the function that knows how to delete the object.
 * @param pName is a null terminated character string that contains the
 * prefix:name of the object.
 * @param pNamespace is the namespace associated with the prefix used in 'pName'.
 */
AXISC_STORAGE_CLASS_INFO
void axiscCallAddCmplxArrayParameter(AXISCHANDLE call, Axisc_Array * pArray, 
	void * pSZFunct, 
	void * pDelFunct, 
	const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method for adding basic type array parameters to the engine, ready to be serialised.
 *
 * @param pArray is a pointer the an Axis_Array object.
 * @param nType is an enumerated type that defines the type of array (XSDTYPE
 * is defined in TypeMapping.hpp).
 * @param pName is a null terminated character string containing the name of the array.
 */
AXISC_STORAGE_CLASS_INFO
void axiscCallAddBasicArrayParameter(AXISCHANDLE call, Axisc_Array * pArray, 
	AXISC_XSDTYPE nType, 
	const AxiscChar * pName);

/**
 * Method for adding parameters of basic types to the engine, ready to be serialised.
 *
 * @param pValue is a pointer to the object.
 * @param pchName is a null terminated character string containing the name of
 * the parameter.
 * @param nType is an enumerated type that defines the type of parameter
 * (XSDTYPE is defined in TypeMapping.hpp).
 */
AXISC_STORAGE_CLASS_INFO
void axiscCallAddParameter(AXISCHANDLE call, void * pValue, 
	const char * pchName, 
	AXISC_XSDTYPE nType);

/**
 * Adds an attachment and references it from a parameter in the SOAP body.
 * Axis C++ will delete the storage for the ISoapAttachment and IAttributes
 * passed to this method during ~Call.
 *
 * @param attachment The attachment to add to the MIME message, referenced
 * from the SOAP body (mandatory).
 * @param pName The name of the parameter (mandatory).
 * @param attributes An array of pointers to attributes that will be added
 * to the attachment reference in the SOAP body (optional).
 * @param nAttributes The number of elements in the attributes array.
 */
AXISC_STORAGE_CLASS_INFO
void axiscCallAddAttachmentParameter(AXISCHANDLE call, AXISCHANDLE attachment, 
	const char * pName, 
	AXISCHANDLE attributes, 
	int nAttributes);

/**
 * Creates an IAttribute that can be used on an attachment reference on
 * Call::addAttachmentParameter.  If this IAttribute is subsequently passed
 * to Call::addAttachmentParameter, Axis C++ will delete the storage associated
 * with the IAttribute during ~Call. You must ensure the prefix has a valid
 * namespace declared, otherwise an invalid SOAP message will be produced.
 *
 * @param pLocalname The local name of the Attribute.
 * @param pPrefix The prefix of the Attribute.
 * @param pValue The value of the Attribute.
 * @return a pointer to an IAttribute object.
 */
AXISC_STORAGE_CLASS_INFO
AXISCHANDLE axiscCallCreateAttribute(AXISCHANDLE call, const AxiscChar * pLocalname, 
	const AxiscChar * pPrefix, 
	const AxiscChar * pValue);

/**
 * Method to set the remote method name.
 *
 * @param pchOperation null terminated character string that contains the
 * request tag name. i.e. @n
 * m_pCall->setOperation( "doBenchRequest", Axis_URI_BenchDataType);@n
 * @param pchNamespace null terminated character string that contains the
 * namespace for the operation.
 */
AXISC_STORAGE_CLASS_INFO
void axiscCallSetOperation(AXISCHANDLE call, const char * pchOperation, 
	const char * pchNamespace);

/**
 * Method to set the remote method name in non-wrapper style operation.
 *
 * @param pchOperation null terminated character string that contains the
 * request tag name. i.e. @n
 * m_pCall->setOperation( "doBenchRequest", Axis_URI_BenchDataType);@n
 * @param pchNamespace null terminated character string that contains the
 * namespace for the operation.
 */
AXISC_STORAGE_CLASS_INFO
void axiscCallSetOperationUnwrapped(AXISCHANDLE call, const char * pchOperation, 
	const char * pchNamespace);

/**
 * Method to set the endpoint URI for the service.
 *
 * @param pchEndpointURI null terminated character string that contains the
 * new endpoint URI.
 * @return Always AXIS_SUCCESS.
 * @note There is no syntax parsing used on the URI so the user must be careful
 * to ensure that it is correctly formatted.
 */
AXISC_STORAGE_CLASS_INFO
int axiscCallSetEndpointURI(AXISCHANDLE call, const char * pchEndpointURI);

/**
 * Method to create a IHeaderBlock object (defined in IHeaderBlock.hpp).
 * @param pachLocalName null terminated character string that contains the
 * local name of the header block.
 *
 * @param pachUri null terminated character string that contains the URI
 * associated with the local name of the header block.
 * @param pachPrefix null terminated character string that contains the
 * associated prefix for the URI of the header block.
 * @return Pointer to the created IHeaderBlock object.
 */
AXISC_STORAGE_CLASS_INFO
AXISCHANDLE axiscCallCreateHeaderBlock(AXISCHANDLE call, AxiscChar * pachLocalName, 
	AxiscChar * pachUri, 
	AxiscChar * pachPrefix);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to the xsd__int type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__int * axiscCallGetElementAsInt(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to the xsd__boolean type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__boolean * axiscCallGetElementAsBoolean(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to the xsd__unsignedInt type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__unsignedInt * axiscCallGetElementAsUnsignedInt(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__short type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__short * axiscCallGetElementAsShort(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__unsignedShort type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__unsignedShort * axiscCallGetElementAsUnsignedShort(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__byte type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__byte * axiscCallGetElementAsByte(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__unsignedByte type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__unsignedByte * axiscCallGetElementAsUnsignedByte(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__long type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__long * axiscCallGetElementAsLong(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__integer type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__integer * axiscCallGetElementAsInteger(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__unsignedLong type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__unsignedLong * axiscCallGetElementAsUnsignedLong(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__float type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__float * axiscCallGetElementAsFloat(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__double type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__double * axiscCallGetElementAsDouble(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__decimal type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__decimal * axiscCallGetElementAsDecimal(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__string type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__string axiscCallGetElementAsString(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__anyURI type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__anyURI axiscCallGetElementAsAnyURI(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__QName type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__QName axiscCallGetElementAsQName(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__hexBinary type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__hexBinary * axiscCallGetElementAsHexBinary(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__base64Binary type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__base64Binary * axiscCallGetElementAsBase64Binary(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__dateTime type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__dateTime * axiscCallGetElementAsDateTime(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__date type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__date * axiscCallGetElementAsDate(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__time type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__time * axiscCallGetElementAsTime(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__duration type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__duration * axiscCallGetElementAsDuration(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__gYearMonth type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__gYearMonth * axiscCallGetElementAsGYearMonth(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__gYear type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__gYear * axiscCallGetElementAsGYear(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__gMonthDay type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__gMonthDay * axiscCallGetElementAsGMonthDay(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__gDay type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__gDay * axiscCallGetElementAsGDay(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__gMonth type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__gMonth * axiscCallGetElementAsGMonth(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__nonPositiveInteger type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__nonPositiveInteger * axiscCallGetElementAsNonPositiveInteger(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__negativeInteger type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__negativeInteger * axiscCallGetElementAsNegativeInteger(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__nonNegativeInteger type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__nonNegativeInteger * axiscCallGetElementAsNonNegativeInteger(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__positiveInteger type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__positiveInteger * axiscCallGetElementAsPositiveInteger(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__normalizedString type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__normalizedString axiscCallGetElementAsNormalizedString(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__token type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__token axiscCallGetElementAsToken(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__language type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__language axiscCallGetElementAsLanguage(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__Name type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__Name axiscCallGetElementAsName(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__NCName type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__NCName axiscCallGetElementAsNCName(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__ID type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__ID axiscCallGetElementAsID(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__IDREF type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__IDREF axiscCallGetElementAsIDREF(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__IDREFS type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__IDREFS axiscCallGetElementAsIDREFS(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__ENTITY type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__ENTITY axiscCallGetElementAsENTITY(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__ENTITIES type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__ENTITIES axiscCallGetElementAsENTITIES(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__NMTOKEN type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__NMTOKEN axiscCallGetElementAsNMTOKEN(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__NMTOKENS type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__NMTOKENS axiscCallGetElementAsNMTOKENS(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__NOTATION type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__NOTATION axiscCallGetElementAsNOTATION(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of XML element as any type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the element.
 * @return pointer to xsd__anyType type containing the contents of the element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__anyType axiscCallGetElementAsAnyType(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__int type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__int * axiscCallGetAttributeAsInt(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__boolean type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__boolean * axiscCallGetAttributeAsBoolean(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__unsignedInt type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__unsignedInt * axiscCallGetAttributeAsUnsignedInt(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__short type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__short * axiscCallGetAttributeAsShort(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__unsignedShort type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__unsignedShort * axiscCallGetAttributeAsUnsignedShort(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__byte type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__byte * axiscCallGetAttributeAsByte(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__unsignedByte type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__unsignedByte * axiscCallGetAttributeAsUnsignedByte(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__long type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__long * axiscCallGetAttributeAsLong(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__integer type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__integer * axiscCallGetAttributeAsInteger(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__unsignedLong type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__unsignedLong * axiscCallGetAttributeAsUnsignedLong(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__float type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__float * axiscCallGetAttributeAsFloat(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__double type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__double * axiscCallGetAttributeAsDouble(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__decimal type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__decimal * axiscCallGetAttributeAsDecimal(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__string type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__string axiscCallGetAttributeAsString(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__anyURI type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__anyURI axiscCallGetAttributeAsAnyURI(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__QName type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__QName axiscCallGetAttributeAsQName(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__hexBinary type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__hexBinary * axiscCallGetAttributeAsHexBinary(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__base64Binary type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__base64Binary * axiscCallGetAttributeAsBase64Binary(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__dateTime type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__dateTime * axiscCallGetAttributeAsDateTime(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__date type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__date * axiscCallGetAttributeAsDate(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__time type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__time * axiscCallGetAttributeAsTime(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__duration type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__duration * axiscCallGetAttributeAsDuration(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__gYearMonth type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__gYearMonth * axiscCallGetAttributeAsGYearMonth(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__gYear type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__gYear * axiscCallGetAttributeAsGYear(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__gMonthDay type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__gMonthDay * axiscCallGetAttributeAsGMonthDay(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__gDay type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__gDay * axiscCallGetAttributeAsGDay(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__gMonth type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__gMonth * axiscCallGetAttributeAsGMonth(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__NOTATION type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__NOTATION axiscCallGetAttributeAsNOTATION(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__normalizedString type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__normalizedString axiscCallGetAttributeAsNormalizedString(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__token type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__token axiscCallGetAttributeAsToken(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__language type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__language axiscCallGetAttributeAsLanguage(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__Name type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__Name axiscCallGetAttributeAsName(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__NCName type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__NCName axiscCallGetAttributeAsNCName(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__ID type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__ID axiscCallGetAttributeAsID(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__IDREF type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__IDREF axiscCallGetAttributeAsIDREF(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__IDREFS type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__IDREFS axiscCallGetAttributeAsIDREFS(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__ENTITY type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__ENTITY axiscCallGetAttributeAsENTITY(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__ENTITIES type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__ENTITIES axiscCallGetAttributeAsENTITIES(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__NMTOKEN type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__NMTOKEN axiscCallGetAttributeAsNMTOKEN(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__NMTOKENS type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__NMTOKENS axiscCallGetAttributeAsNMTOKENS(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__nonPositiveInteger type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__nonPositiveInteger * axiscCallGetAttributeAsNonPositiveInteger(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__negativeInteger type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__negativeInteger * axiscCallGetAttributeAsNegativeInteger(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__nonNegativeInteger type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__nonNegativeInteger * axiscCallGetAttributeAsNonNegativeInteger(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of a XML attribute as basic type.
 *
 * @param pName null terminated character string that contains the name of
 * the tag containing the attribute element.
 * @param pNamespace null terminated character string that contains the
 * namespace of the tag containing the attribute element.
 * @return pointer to xsd__positiveInteger type containing the contents of
 * the attribute element.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__positiveInteger * axiscCallGetAttributeAsPositiveInteger(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized value of complex types.
 *
 * @param pDZFunct is a pointer to the function that knows how to de-serialise
 * the object.
 * @param pCreFunct is a pointer to the function that knows how to create the object.
 * @param pDelFunct is a pointer to the function that knows how to delete the object.
 * @param pName is a null terminated character string that contains the
 * prefix:name of the object.
 * @param pNamespace is the namespace associated with the prefix used in 'pName'.
 * @return pointer to a void object that contains the 'complex' object.
 */
AXISC_STORAGE_CLASS_INFO
void * axiscCallGetCmplxObject(AXISCHANDLE call, void * pDZFunct, 
	void * pCreFunct, 
	void * pDelFunct, 
	const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized Array of complex type.
 *
 * @param pArray is a pointer to array of objects that needs to be de-serialised.
 * @param pDZFunct is a pointer to the function that knows how to de-serialise
 * the object.
 * @param pCreFunct is a pointer to the function that knows how to create the object.
 * @param pDelFunct is a pointer to the function that knows how to delete the object.
 * @param pName is a null terminated character string that contains the
 * prefix:name of the object.
 * @param pNamespace is the namespace associated with the prefix used in 'pName'.
 * @return pointer to a void object that contains the 'complex' object.
 */
AXISC_STORAGE_CLASS_INFO
Axisc_Array * axiscCallGetCmplxArray(AXISCHANDLE call, Axisc_Array * pArray, 
	void * pDZFunct, 
	void * pCreFunct, 
	void * pDelFunct, 
	const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method used by stubs to get a deserialized Array of basic type.
 *
 * @param nType is an enumerated type that defines the type of array (XSDTYPE
 * is defined in TypeMapping.hpp).
 * @param pName is a null terminated character string containing the name
 * of the array.
 * @param pNamespace is a null terminated character string  containing the
 * namespace for the array.
 * @return is a pointer to the Axis_Array object.
 */
AXISC_STORAGE_CLASS_INFO
Axisc_Array * axiscCallGetBasicArray(AXISCHANDLE call, AXISC_XSDTYPE nType, 
	const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method to check that the SOAP message body contains the specified name and
 * namespace.
 *
 * @param pName is a null terminated character string containing the response name.
 * @param pNamespace is a null terminated character string containing the
 * response namespace.
 * @return The return value is either AXIS_SUCCESS or AXIS_FAIL depending
 * if the name was found.
 * 
 * @deprecated use validateMessage().
 */
AXISC_STORAGE_CLASS_INFO
int axiscCallCheckMessage(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method to check that the SOAP message body contains the specified name and
 * namespace.
 *
 * @param pName is a null terminated character string containing the response name.
 * @param pNamespace is a null terminated character string containing the
 * response namespace.
 * @return The return value is either AXIS_SUCCESS or AXIS_FAIL depending
 * if the name was found.
 */
AXISC_STORAGE_CLASS_INFO
int axiscCallValidateMessage( AXISCHANDLE call,
		                      const AxiscChar * pName,
                              const AxiscChar * pNamespace,
                              AxiscBool consumeIt); 

/**
 * Method to check that the SOAP message fault contains the specified name and
 * namespace.
 *
 * @param pName is a null terminated character string containing the response name.
 * @param pNamespace is a null terminated character string containing the
 * response namespace.
 * @return The return value is a pointer to ISoapFault object if a fault exists,
 * or NULL if there is no fault.
 */
AXISC_STORAGE_CLASS_INFO
void * axiscCallCheckFault(AXISCHANDLE call, const AxiscChar * pName, 
	const AxiscChar * pNamespace);

/**
 * Method to retrieve the status flag of the engine.
 *
 * @return The return value is either AXIS_SUCCESS or AXIS_FAIL.
 */
AXISC_STORAGE_CLASS_INFO
int axiscCallGetStatus(AXISCHANDLE call);


/**
 * Method to retrieve the current SOAP Serializer object.
 *
 * @return A pointer to the currently loaded SOAP serialiser.
 */
AXISC_STORAGE_CLASS_INFO
AXISCHANDLE axiscCallGetSOAPSerializer(AXISCHANDLE call);

/**
 * Deserialize character data, ie the data typically enclosed by an XML tag
 * 
 * @param pValue object into which deserialized value will be placed
 * @param type The xsd simple type of the data.
 */
AXISC_STORAGE_CLASS_INFO
void axiscCallGetChardataAs(AXISCHANDLE call, void** pValue, AXISC_XSDTYPE type);

/**
 * Set proxy server and port for transport.
 *
 * @param pcProxyHost Host name of proxy server.
 * @param uiProxyPort Port of proxy server.
 */
AXISC_STORAGE_CLASS_INFO
void axiscCallSetProxy(AXISCHANDLE call, const char * pcProxyHost, 
	unsigned int uiProxyPort);

/**
 * Method to get an 'ANY' object from the engine.
 *
 * @return A pointer to an 'ANY' type object (the 'AnyType' object is defined in
 * AxisUserAPI.hpp).
 */
AXISC_STORAGE_CLASS_INFO
AxiscAnyType * axiscCallGetAnyObject(AXISCHANDLE call);

/**
 * Method to add an 'ANY' object to the engine.
 *
 * @param pAnyObject a pointer to an 'ANY' type object (the 'AnyType' object is defined in
 * AxisUserAPI.hpp).
 * @return The return value is either AXIS_SUCCESS or AXIS_FAIL.
 */
AXISC_STORAGE_CLASS_INFO
int axiscCallAddAnyObject(AXISCHANDLE call, AxiscAnyType * pAnyObject);

/**
 * Returns the prefix for a previously defined namespace. If the
 * namespace has not previously been associated with a prefix, it
 * creates a new prefix, which is unique and returns that. It will
 * only return prefixes for user-defined namespaces, so passing a
 * standard namespace will cause a new prefix to be created.
 *
 * @param pNamespace the namespace to look for.
 * @return the prefix for this namespace.
 */
AXISC_STORAGE_CLASS_INFO
const AxiscChar * axiscCallGetNamespacePrefix(AXISCHANDLE call, const AxiscChar * pNamespace);

/**
 * Returns a complex fault as an XML string.
 *
 * @return a null terminated character string of the complex fault in XML.
 */
AXISC_STORAGE_CLASS_INFO
xsdc__string axiscCallGetFaultAsXMLString(AXISCHANDLE call);

/**
 * Adds an attachment to the MIME message. This attachment will not be
 * referenced from the SOAP body. The storage associated with the ISoapAttachment
 * will be deleted during ~Call.
 *
 * @param objAttach the attachment to add to the message.
 */
AXISC_STORAGE_CLASS_INFO
void axiscCallAddAttachment(AXISCHANDLE call, AXISCHANDLE objAttach);

/**
 * Creates an ISoapAttachment which represents an attachment. The ISoapAttachment
 * can be passed to addAttachment or addAttachmentParameter. The attachment
 * will not be added to the message unless it is subsequently passed to
 * addAttachment or addAttachmentParameter. The storage associated with the
 * ISoapAttachment will not be automatically deleted by Axis C++ unless it
 * is passed to addAttachment or addAttachmentParamater.
 *
 * @return Pointer to an ISoapAttachment object.
 */
AXISC_STORAGE_CLASS_INFO
AXISCHANDLE axiscCallCreateSoapAttachment(AXISCHANDLE call);

/**
 * Set pointer to exception handler function for call object.
 * The pSoapFaultNamespace is used as-is - i.e. it should not be deleted
 * by the caller unless a subsequent call to this function is being made.
 * Calling this function will result in the resetting of the SOAP Fault list.
 * If service does not have any SOAP faults defined, call this function with
 * NULL pointer in order to clear the SOAP fault list.
 * This function was added in support of the c-Binding implementation.
 *
 * @param pSoapFaultNamespace - pointer to namespace to use when checking for fault.
 */
AXISC_STORAGE_CLASS_INFO
void axiscCallSetSoapFaultNamespace(AXISCHANDLE call, const char * pSoapFaultNamespace);

/**
 * Set pointer to exception handler function for call object.
 * Calling this function will result in the resetting of the SOAP Fault list.
 * This function was added in support of the c-Binding implementation.
 *
 * @param faultName - pointer to fault name.
 * @param createFp - pointer to object creation function for fault detail
 * @param deleteFp - pointer to object deletion function for fault detail
 * @param deserializerFp - pointer to object deserializer function for fault detail
 */
AXISC_STORAGE_CLASS_INFO
void axiscCallAddSoapFaultToList(AXISCHANDLE call, const char * faultName, 
	void * createFp, 
	void * deleteFp, 
	void * deserializerFp);


#ifdef __cplusplus
 }
#endif

#endif /* CALL_INCLUDED */
