You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by wh...@apache.org on 2004/10/25 15:32:11 UTC

cvs commit: ws-axis/c/include/axis/client Call.hpp Stub.hpp

whitlock    2004/10/25 06:32:11

  Added:       c/include/axis/client Call.hpp Stub.hpp
  Log:
  Rename external C++ headers to .hpp
  
  Revision  Changes    Path
  1.1                  ws-axis/c/include/axis/client/Call.hpp
  
  Index: Call.hpp
  ===================================================================
  /*
   *   Copyright 2003-2004 The Apache Software Foundation.
   *
   *   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.h
   *
   * 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.
   *
   * @author Susantha Kumara (susantha@opensource.lk, skumara@virtusa.com)
   * @author Sanjaya Singharage (sanjayas@opensource.lk)
   * @author Samisa Abeysinghe (sabeysinghe@virtusa.com)
   */
   
  /*
   * Revision 1.1  2004/05/24 samisa
   * Added accesser to transport 
   */
   
  /*
   * Revision 1.2  2004/05/25 samisa
   * Added accesser to SOAP serializer 
   */
  
  /*
   * Revision 1.3  2004/05/31 samisa
   * Added setProxy
   */
  
  /* Call.h: interface for the Call class.*/
  
  
  #if !defined(_CALL_H____OF_AXIS_INCLUDED_)
  #define _CALL_H____OF_AXIS_INCLUDED_
  
  #include "../server/GDefine.h"
  #include "../server/Packet.h"
  
  #include "../server/TypeMapping.h"
  #include "../server/AxisUserAPI.h"
  #include "../server/SoapEnvVersions.h"
  #include "../server/WSDDDefines.h"
  #include "../server/IHeaderBlock.h"
  
  #ifdef __cplusplus
  #include "../server/ISoapHeader.h"
  
  AXIS_CPP_NAMESPACE_START
  
  class ClientAxisEngine;
  class SOAPTransport;
  class MessageData;
  class SoapDeSerializer;
  class SoapSerializer;
  
  AXIS_CPP_NAMESPACE_END
  
  #else
  #endif
  
  AXIS_CPP_NAMESPACE_USE
  
  typedef struct {
      void (AXISCALL* setSOAPVersion)(void* pObj, SOAP_VERSION version);
      int (AXISCALL* setTransportProperty)(void* pObj,
          AXIS_TRANSPORT_INFORMATION_TYPE type, const char* value);
      int (AXISCALL* setHandlerProperty)(void* pObj,
          AxisChar* name, void* value, int len);
      int (AXISCALL* setProtocol)(void* pObj, AXIS_PROTOCOL_TYPE protocol);
      int (AXISCALL* initialize)(void* pObj, PROVIDERTYPE nStyle, int secure);
      int (AXISCALL* invoke)(void* pObj);
      int (AXISCALL* unInitialize)(void* pObj);
  
      /* Method that set the remote method name */
      void (AXISCALL* setOperation)(void* pObj, const char* pchOperation,
          const char* pchNamespace);
      int (AXISCALL* setEndpointURI)(void* pObj, const char* pchEndpointURI);
  
      /* Method for adding complex parameters */
      void (AXISCALL* addCmplxParameter)(void* pObj, void* pObject,
          void* pSZFunct, void* pDelFunct, const AxisChar* pName,
          const AxisChar* pNamespace);
      /* Method for adding complex type array parameters */
      void (AXISCALL* addCmplxArrayParameter)(void* pObj, Axis_Array* pArray,
          void* pSZFunct, void* pDelFunct, void* pSizeFunct,
          const AxisChar* pName, const AxisChar* pNamespace);
      /* Method for adding basic type array parameters */
      void (AXISCALL* addBasicArrayParameter)(void* pObj, Axis_Array* pArray,
          XSDTYPE nType, const char* pName);
      /* Method for adding parameters of basic types */
      void (AXISCALL* addParameter)(void* pObj, void* pValue,const char* pName,
          XSDTYPE nType);
  
      /* Methods used by stubs to get a deserialized value of an XML element
       * as basic types
       */
      int (AXISCALL* getElementAsInt)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      xsd__boolean (AXISCALL* getElementAsBoolean)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      unsigned int (AXISCALL* getElementAsUnsignedInt)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      short (AXISCALL* getElementAsShort)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      unsigned short (AXISCALL* getElementAsUnsignedShort)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      char (AXISCALL* getElementAsByte)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      unsigned char (AXISCALL* getElementAsUnsignedByte)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      long (AXISCALL* getElementAsLong)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      long (AXISCALL* getElementAsInteger)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      unsigned long (AXISCALL* getElementAsUnsignedLong)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      float (AXISCALL* getElementAsFloat)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      double (AXISCALL* getElementAsDouble)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      double (AXISCALL* getElementAsDecimal)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      AxisChar* (AXISCALL* getElementAsString)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      AxisChar* (AXISCALL* getElementAsAnyURI)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      AxisChar* (AXISCALL* getElementAsQName)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      xsd__hexBinary (AXISCALL* getElementAsHexBinary)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      xsd__base64Binary (AXISCALL* getElementAsBase64Binary)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      struct tm (AXISCALL* getElementAsDateTime)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      struct tm (AXISCALL* getElementAsDate)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      struct tm (AXISCALL* getElementAsTime)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      long (AXISCALL* getElementAsDuration)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
  
      /* Methods used by stubs to get a deserialized value of an XML attribute
       * basic types
       */
      int (AXISCALL* getAttributeAsInt)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      xsd__boolean (AXISCALL* getAttributeAsBoolean)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      unsigned int (AXISCALL* getAttributeAsUnsignedInt)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      short (AXISCALL* getAttributeAsShort)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      unsigned short (AXISCALL* getAttributeAsUnsignedShort)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      char (AXISCALL* getAttributeAsByte)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      unsigned char (AXISCALL* getAttributeAsUnsignedByte)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      long (AXISCALL* getAttributeAsLong)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      long (AXISCALL* getAttributeAsInteger)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      unsigned long (AXISCALL* getAttributeAsUnsignedLong)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      float (AXISCALL* getAttributeAsFloat)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      double (AXISCALL* getAttributeAsDouble)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      double (AXISCALL* getAttributeAsDecimal)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      AxisChar* (AXISCALL* getAttributeAsString)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      AxisChar* (AXISCALL* getAttributeAsAnyURI)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      AxisChar* (AXISCALL* getAttributeAsQName)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      xsd__hexBinary (AXISCALL* getAttributeAsHexBinary)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      xsd__base64Binary (AXISCALL* getAttributeAsBase64Binary)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      struct tm (AXISCALL* getAttributeAsDateTime)(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace);
      struct tm (AXISCALL* getAttributeAsDate)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      struct tm (AXISCALL* getAttributeAsTime)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
      long (AXISCALL* getAttributeAsDuration)(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
  
      /* Method used by stubs to get a deserialized value of complex types */
      void* (AXISCALL* getCmplxObject)(void* pObj, void* pDZFunct,
          void* pCreFunct, void* pDelFunct, const AxisChar* pName,
          const AxisChar* pNamespace);
      /* Method used by stubs to get a deserialized Array of complex types */
      Axis_Array (AXISCALL* getCmplxArray)(void* pObj, void* pDZFunct,
          void* pCreFunct, void* pDelFunct, void* pSizeFunct,
          const AxisChar* pName, const AxisChar* pNamespace);
      /* Method used by stubs to get a deserialized Array of basic types */
      Axis_Array (AXISCALL* getBasicArray)(void* pObj, XSDTYPE nType,
          const AxisChar* pName, const AxisChar* pNamespace);
  
      int (AXISCALL* checkMessage)(void *pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
  
      void* (AXISCALL* checkFault)(void *pObj, const AxisChar* pName,
          const AxisChar* pNamespace);
  
      /* Minimal error check */
      int (AXISCALL* getStatus)(void *pObj);
  
      AnyType* (AXISCALL* getAnyObject)(void *pObj);
  
      int (AXISCALL* addAnyObject)(void *pObj, AnyType* pAnyObject);
  
      const AxisChar* (AXISCALL* getNamespacePrefix)(void *pObj,
          const AxisChar* pNamespace);
  
      HeaderBlock_C (AXISCALL* createHeaderBlock)(void *pObj,
          AxisChar *pachLocalName, AxisChar *pachUri);
  
  } CallFunctions;
  
  #ifdef __cplusplus
  AXIS_CPP_NAMESPACE_START
  class STORAGE_CLASS_INFO CallBase
  {
  public:
      virtual void AXISCALL setSOAPVersion(SOAP_VERSION version)=0;
      virtual int AXISCALL setTransportProperty(AXIS_TRANSPORT_INFORMATION_TYPE
          type, const char* value)=0;
  	virtual int AXISCALL setHandlerProperty(AxisChar* name, 
  		void* value, int len)=0;
      virtual int AXISCALL setProtocol(AXIS_PROTOCOL_TYPE protocol)=0;
      virtual int AXISCALL initialize(PROVIDERTYPE nStyle, int secure)=0;
      virtual int AXISCALL invoke()=0;
      virtual int AXISCALL unInitialize()=0;
  
      /* Method that set the remote method name */
      virtual void AXISCALL setOperation(const char* pchOperation,
          const char* pchNamespace)=0;
      virtual int AXISCALL setEndpointURI(const char* pchEndpointURI)=0;
  
      /* Method for adding complex parameters */
      virtual void AXISCALL addCmplxParameter(void* pObject, void* pSZFunct,
          void* pDelFunct, const AxisChar* pName, const AxisChar* pNamespace)=0;
      /* Method for adding complex type array parameters */
      virtual void AXISCALL addCmplxArrayParameter(Axis_Array* pArray,
          void* pSZFunct, void* pDelFunct, void* pSizeFunct,
          const AxisChar* pName, const AxisChar* pNamespace)=0;
      /* Method for adding basic type array parameters */
      virtual void AXISCALL addBasicArrayParameter(Axis_Array* pArray,
          XSDTYPE nType, const char* pName)=0;
      /* Method for adding parameters of basic types */
      virtual void AXISCALL addParameter(void* pValue,const char* pName,
          XSDTYPE nType)=0;
  
      /* Methods used by stubs to get a deserialized value of an XML element
       * as basic types
       */
      virtual int AXISCALL getElementAsInt(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual xsd__boolean AXISCALL getElementAsBoolean(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual unsigned int AXISCALL getElementAsUnsignedInt(const AxisChar*
          pName, const AxisChar* pNamespace)=0;
      virtual short AXISCALL getElementAsShort(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual unsigned short AXISCALL getElementAsUnsignedShort(const AxisChar*
          pName, const AxisChar* pNamespace)=0;
      virtual char AXISCALL getElementAsByte(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual unsigned char AXISCALL getElementAsUnsignedByte(const AxisChar*
          pName, const AxisChar* pNamespace)=0;
      virtual long AXISCALL getElementAsLong(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual long AXISCALL getElementAsInteger(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual unsigned long AXISCALL getElementAsUnsignedLong(const AxisChar*
          pName, const AxisChar* pNamespace)=0;
      virtual float AXISCALL getElementAsFloat(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual double AXISCALL getElementAsDouble(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual double AXISCALL getElementAsDecimal(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual AxisChar* AXISCALL getElementAsString(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual AxisChar* AXISCALL getElementAsAnyURI(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual AxisChar* AXISCALL getElementAsQName(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual xsd__hexBinary AXISCALL getElementAsHexBinary(const AxisChar*
          pName, const AxisChar* pNamespace)=0;
      virtual xsd__base64Binary AXISCALL getElementAsBase64Binary(const
          AxisChar* pName, const AxisChar* pNamespace)=0;
      virtual struct tm AXISCALL getElementAsDateTime(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual struct tm AXISCALL getElementAsDate(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual struct tm AXISCALL getElementAsTime(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual long AXISCALL getElementAsDuration(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
  
      /* Methods used by stubs to get a deserialized value of XML attribute
       * as basic types
       */
      virtual int AXISCALL getAttributeAsInt(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual xsd__boolean AXISCALL getAttributeAsBoolean(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual unsigned int AXISCALL getAttributeAsUnsignedInt(const AxisChar*
          pName, const AxisChar* pNamespace)=0;
      virtual short AXISCALL getAttributeAsShort(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual unsigned short AXISCALL getAttributeAsUnsignedShort(const
          AxisChar* pName, const AxisChar* pNamespace)=0;
      virtual char AXISCALL getAttributeAsByte(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual unsigned char AXISCALL getAttributeAsUnsignedByte(const AxisChar*
          pName, const AxisChar* pNamespace)=0;
      virtual long AXISCALL getAttributeAsLong(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual long AXISCALL getAttributeAsInteger(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual unsigned long AXISCALL getAttributeAsUnsignedLong(const AxisChar*
          pName, const AxisChar* pNamespace)=0;
      virtual float AXISCALL getAttributeAsFloat(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual double AXISCALL getAttributeAsDouble(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual double AXISCALL getAttributeAsDecimal(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual AxisChar* AXISCALL getAttributeAsString(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual AxisChar* AXISCALL getAttributeAsAnyURI(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual AxisChar* AXISCALL getAttributeAsQName(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual xsd__hexBinary AXISCALL getAttributeAsHexBinary(const AxisChar*
          pName, const AxisChar* pNamespace)=0;
      virtual xsd__base64Binary AXISCALL getAttributeAsBase64Binary(const
          AxisChar* pName, const AxisChar* pNamespace)=0;
      virtual struct tm AXISCALL getAttributeAsDateTime(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual struct tm AXISCALL getAttributeAsDate(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual struct tm AXISCALL getAttributeAsTime(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      virtual long AXISCALL getAttributeAsDuration(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
  
      /* Method used by stubs to get a deserialized value of complex types */
      virtual void* AXISCALL getCmplxObject(void* pDZFunct, void* pCreFunct,
          void* pDelFunct, const AxisChar* pName, const AxisChar* pNamespace)=0;
      /* Method used by stubs to get a deserialized Array of complex types */
      virtual Axis_Array AXISCALL getCmplxArray(void* pDZFunct, void* pCreFunct,
          void* pDelFunct, void* pSizeFunct, const AxisChar* pName,
          const AxisChar* pNamespace)=0;
      /* Method used by stubs to get a deserialized Array of basic types */
      virtual Axis_Array AXISCALL getBasicArray(XSDTYPE nType,
          const AxisChar* pName, const AxisChar* pNamespace)=0;
  
      virtual int AXISCALL checkMessage(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
  
      virtual void* AXISCALL checkFault(const AxisChar* pName,
          const AxisChar* pNamespace)=0;
  
      /* Minimal error check */
      virtual int AXISCALL getStatus()=0;
  
      virtual AnyType* AXISCALL getAnyObject()=0;
      virtual int AXISCALL addAnyObject(AnyType* pAnyObject)=0;
      virtual const AxisChar* AXISCALL getNamespacePrefix
          (const AxisChar* pNamespace)=0;
  
      virtual IHeaderBlock* AXISCALL createHeaderBlock(AxisChar *pachLocalName,
          AxisChar *pachUri)=0;
  
      /* following stuff is needed to provide the interface for C web services */
  public:
      static CallFunctions ms_VFtable;
      static bool bInitialized;
      /* add static functions for all interface functions here */
      static void AXISCALL s_SetSOAPVersion(void* pObj, SOAP_VERSION version)
      {((CallBase*)pObj)->setSOAPVersion(version);};
      static int AXISCALL s_SetTransportProperty(void* pObj,
          AXIS_TRANSPORT_INFORMATION_TYPE type, const char* value)
      { return ((CallBase*)pObj)->setTransportProperty(type,value);};
      static int AXISCALL s_SetHandlerProperty(void* pObj,
          AxisChar* name, void* value, int len)
      { return ((CallBase*)pObj)->setHandlerProperty(name,value,len);};
      static int AXISCALL s_SetProtocol(void* pObj, AXIS_PROTOCOL_TYPE protocol)
      { return ((CallBase*)pObj)->setProtocol(protocol);};
      static int AXISCALL s_InitializeCall(void* pObj, PROVIDERTYPE nStyle,
          int secure)
      { return ((CallBase*)pObj)->initialize(nStyle, secure);};
      static int AXISCALL s_Invoke(void* pObj)
      { return ((CallBase*)pObj)->invoke();};
      static int AXISCALL s_UnInitialize(void* pObj)
      { return ((CallBase*)pObj)->unInitialize();};
  
      /* Method that set the remote method name */
      static void AXISCALL s_SetOperation(void* pObj, const char* pchOperation,
          const char* pchNamespace)
      { ((CallBase*)pObj)->setOperation(pchOperation, pchNamespace);};
      static int AXISCALL s_SetEndpointURI(void* pObj,
          const char* pchEndpointURI)
      { return ((CallBase*)pObj)->setEndpointURI(pchEndpointURI);};
  
      static void AXISCALL s_AddParameter(void* pObj, void* pValue,
          const AxisChar* pchName, XSDTYPE type)
      { ((CallBase*)pObj)->addParameter(pValue, pchName, type);};
      static void AXISCALL s_AddCmplxArrayParameter(void* pObj,
          Axis_Array* pArray, void* pSZFunct, void* pDelFunct, void* pSizeFunct,
          const AxisChar* pName, const AxisChar* pNamespace)
      { ((CallBase*)pObj)->addCmplxArrayParameter(pArray, pSZFunct, pDelFunct,
          pSizeFunct, pName, pNamespace);};
      static void AXISCALL s_AddBasicArrayParameter(void* pObj,
          Axis_Array* pArray, XSDTYPE nType, const AxisChar* pName)
      { ((CallBase*)pObj)->addBasicArrayParameter(pArray, nType, pName);};
      static void AXISCALL s_AddCmplxParameter(void* pObj, void* pObject,
          void* pDZFunct, void* pDelFunct, const AxisChar* pName,
          const AxisChar* pNamespace)
      { ((CallBase*)pObj)->addCmplxParameter(pObject, pDZFunct, pDelFunct, pName,
          pNamespace);};
  
      static int AXISCALL s_GetElementAsInt(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsInt(pName, pNamespace);};
      static xsd__boolean AXISCALL s_GetElementAsBoolean(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsBoolean(pName, pNamespace);};
      static unsigned int AXISCALL s_GetElementAsUnsignedInt(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsUnsignedInt(pName, pNamespace);};
      static short AXISCALL s_GetElementAsShort(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsShort(pName, pNamespace);};
      static unsigned short AXISCALL s_GetElementAsUnsignedShort(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsUnsignedShort(pName, pNamespace);};
      static char AXISCALL s_GetElementAsByte(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsByte(pName, pNamespace);};
      static unsigned char AXISCALL s_GetElementAsUnsignedByte(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsUnsignedByte(pName, pNamespace);};
      static long AXISCALL s_GetElementAsLong(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsLong(pName, pNamespace);};
      static long AXISCALL s_GetElementAsInteger(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsInteger(pName, pNamespace);};
      static unsigned long AXISCALL s_GetElementAsUnsignedLong(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsUnsignedLong(pName, pNamespace);};
      static float AXISCALL s_GetElementAsFloat(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsFloat(pName, pNamespace);};
      static double AXISCALL s_GetElementAsDouble(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsDouble(pName, pNamespace);};
      static double AXISCALL s_GetElementAsDecimal(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsDouble(pName, pNamespace);};
      static AxisChar* AXISCALL s_GetElementAsString(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsString(pName, pNamespace);};
      static AxisChar* AXISCALL s_GetElementAsAnyURI(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsAnyURI(pName, pNamespace);};
      static AxisChar* AXISCALL s_GetElementAsQName(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsQName(pName, pNamespace);};
      static xsd__hexBinary AXISCALL s_GetElementAsHexBinary(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsHexBinary(pName, pNamespace);};
      static xsd__base64Binary AXISCALL s_GetElementAsBase64Binary(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsBase64Binary(pName, pNamespace);};
      static struct tm AXISCALL s_GetElementAsDateTime(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsDateTime(pName, pNamespace);};
      static struct tm AXISCALL s_GetElementAsDate(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsDate(pName, pNamespace);};
      static struct tm AXISCALL s_GetElementAsTime(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsTime(pName, pNamespace);};
      static long AXISCALL s_GetElementAsDuration(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getElementAsDuration(pName, pNamespace);};
  
      static int AXISCALL s_GetAttributeAsInt(void* pObj, const AxisChar* pName,
          const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsInt(pName, pNamespace);};
      static xsd__boolean AXISCALL s_GetAttributeAsBoolean(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsBoolean(pName, pNamespace);};
      static unsigned int AXISCALL s_GetAttributeAsUnsignedInt(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsUnsignedInt(pName, pNamespace);};
      static short AXISCALL s_GetAttributeAsShort(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsShort(pName, pNamespace);};
      static unsigned short AXISCALL s_GetAttributeAsUnsignedShort(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsUnsignedShort(pName,
          pNamespace);};
      static char AXISCALL s_GetAttributeAsByte(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsByte(pName, pNamespace);};
      static unsigned char AXISCALL s_GetAttributeAsUnsignedByte(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsUnsignedByte(pName,
          pNamespace);};
      static long AXISCALL s_GetAttributeAsLong(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsLong(pName, pNamespace);};
      static long AXISCALL s_GetAttributeAsInteger(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsInteger(pName, pNamespace);};
      static unsigned long AXISCALL s_GetAttributeAsUnsignedLong(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsUnsignedLong(pName,
          pNamespace);};
      static float AXISCALL s_GetAttributeAsFloat(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsFloat(pName, pNamespace);};
      static double AXISCALL s_GetAttributeAsDouble(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsDouble(pName, pNamespace);};
      static double AXISCALL s_GetAttributeAsDecimal(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsDecimal(pName, pNamespace);};
      static AxisChar* AXISCALL s_GetAttributeAsString(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsString(pName, pNamespace);};
      static AxisChar* AXISCALL s_GetAttributeAsAnyURI(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsAnyURI(pName, pNamespace);};
      static AxisChar* AXISCALL s_GetAttributeAsQName(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsQName(pName, pNamespace);};
      static xsd__hexBinary AXISCALL s_GetAttributeAsHexBinary(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsHexBinary(pName, pNamespace);};
      static xsd__base64Binary AXISCALL s_GetAttributeAsBase64Binary(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsBase64Binary(pName,
          pNamespace);};
      static struct tm AXISCALL s_GetAttributeAsDateTime(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsDateTime(pName, pNamespace);};
      static struct tm AXISCALL s_GetAttributeAsDate(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsDate(pName, pNamespace);};
      static struct tm AXISCALL s_GetAttributeAsTime(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsTime(pName, pNamespace);};
      static long AXISCALL s_GetAttributeAsDuration(void* pObj,
          const AxisChar* pName, const AxisChar* pNamespace)
      { return ((CallBase*)pObj)->getAttributeAsDuration(pName, pNamespace);};
  
      static Axis_Array AXISCALL s_GetCmplxArray(void* pObj, void* pDZFunct,
          void* pCreFunct, void* pDelFunct, void* pSizeFunct,
          const AxisChar* pName, const AxisChar* pNamespace)
      {return ((CallBase*)pObj)->getCmplxArray(pDZFunct, pCreFunct, pDelFunct,
          pSizeFunct, pName, pNamespace);};
      static Axis_Array AXISCALL s_GetBasicArray(void* pObj, XSDTYPE nType,
          const AxisChar* pName, const AxisChar* pNamespace)
      {return ((CallBase*)pObj)->getBasicArray(nType, pName, pNamespace);};
      static void* AXISCALL s_GetCmplxObject(void* pObj, void* pDZFunct,
          void* pCreFunct, void* pDelFunct, const AxisChar* pName,
          const AxisChar* pNamespace)
      {return ((CallBase*)pObj)->getCmplxObject(pDZFunct, pCreFunct, pDelFunct,
          pName, pNamespace);};
  
      static int AXISCALL s_CheckMessage(void *pObj, const AxisChar* pName,
          const AxisChar* pNamespace)
      {return ((CallBase*)pObj)->checkMessage(pName, pNamespace);};
  
      static void* AXISCALL s_CheckFault(void *pObj, const AxisChar* pName,
          const AxisChar* pNamespace)
      {return ((CallBase*)pObj)->checkFault(pName, pNamespace);};
  
      /* Minimal error check */
      static int AXISCALL s_GetStatus(void *pObj)
      {return ((CallBase*)pObj)->getStatus();};
  
      static AnyType* AXISCALL s_GetAnyObject(void *pObj)
      {return ((CallBase*)pObj)->getAnyObject();};
  
      static int AXISCALL s_AddAnyObject(void *pObj, AnyType* pAnyObject)
      {return ((CallBase*)pObj)->addAnyObject(pAnyObject);};
  
      static const AxisChar* AXISCALL s_GetNamespacePrefix(void *pObj,
          const AxisChar* pNamespace)
      {return ((CallBase*)pObj)->getNamespacePrefix(pNamespace);};
  
      static HeaderBlock_C AXISCALL s_CreateHeaderBlock(void *pObj,
          AxisChar *pachLocalName, AxisChar *pachUri);
  
      /* and populate ms_VFtable with corresponding entry */
      static void s_Initialize();
  };
  
  /* A separate call class object should be used by each thread */
  class STORAGE_CLASS_INFO Call : public CallBase
  {
  public:
      Call();
      virtual ~Call();
      void AXISCALL setSOAPVersion(SOAP_VERSION version);
      int AXISCALL setTransportProperty(AXIS_TRANSPORT_INFORMATION_TYPE type,
          const char* value);
  	int AXISCALL setHandlerProperty(AxisChar* name, void* value, int len);
      int AXISCALL setProtocol(AXIS_PROTOCOL_TYPE protocol);
      int AXISCALL unInitialize();
      int AXISCALL initialize(PROVIDERTYPE nStyle, int secure);
      int AXISCALL invoke();
  
      /* Method for adding complex parameters */
      void AXISCALL addCmplxParameter(void* pObject, void* pSZFunct,
          void* pDelFunct, const AxisChar* pName, const AxisChar* pNamespace);
      /* Method for adding complex type array parameters */
      void AXISCALL addCmplxArrayParameter(Axis_Array* pArray, void* pSZFunct,
          void* pDelFunct, void* pSizeFunct, const AxisChar* pName,
          const AxisChar* pNamespace);
      /* Method for adding basic type array parameters */
      void AXISCALL addBasicArrayParameter(Axis_Array* pArray, XSDTYPE nType,
          const AxisChar* pName);
      /* Method for adding parameters of basic types */
      void AXISCALL addParameter(void* pValue,const char* pchName,
          XSDTYPE nType);
  
      /* Method that set the remote method name */
      void AXISCALL setOperation(const char* pchOperation,
          const char* pchNamespace);
      int AXISCALL setEndpointURI(const char* pchEndpointURI);
  public:
      IHeaderBlock* AXISCALL createHeaderBlock(AxisChar *pachLocalName,
          AxisChar *pachUri);
      IHeaderBlock* createHeaderBlock();
      int setSoapHeader(ISoapHeader *pSoapHeader);
      /* Methods used by stubs to get a deserialized value of XML element
       * as basic types
       */
      int AXISCALL getElementAsInt(const AxisChar* pName,
          const AxisChar* pNamespace);
          int AXISCALL getFaultDetail(char** ppcDetail);
      xsd__boolean AXISCALL getElementAsBoolean(const AxisChar* pName,
          const AxisChar* pNamespace);
      unsigned int AXISCALL getElementAsUnsignedInt(const AxisChar* pName,
          const AxisChar* pNamespace);
      short AXISCALL getElementAsShort(const AxisChar* pName,
          const AxisChar* pNamespace);
      unsigned short AXISCALL getElementAsUnsignedShort(const AxisChar* pName,
          const AxisChar* pNamespace);
      char AXISCALL getElementAsByte(const AxisChar* pName,
          const AxisChar* pNamespace);
      unsigned char AXISCALL getElementAsUnsignedByte(const AxisChar* pName,
          const AxisChar* pNamespace);
      long AXISCALL getElementAsLong(const AxisChar* pName,
          const AxisChar* pNamespace);
      long AXISCALL getElementAsInteger(const AxisChar* pName,
          const AxisChar* pNamespace);
      unsigned long AXISCALL getElementAsUnsignedLong(const AxisChar* pName,
          const AxisChar* pNamespace);
      float AXISCALL getElementAsFloat(const AxisChar* pName,
          const AxisChar* pNamespace);
      double AXISCALL getElementAsDouble(const AxisChar* pName,
          const AxisChar* pNamespace);
      double AXISCALL getElementAsDecimal(const AxisChar* pName,
          const AxisChar* pNamespace);
      AxisChar* AXISCALL getElementAsString(const AxisChar* pName,
          const AxisChar* pNamespace);
      AxisChar* AXISCALL getElementAsAnyURI(const AxisChar* pName,
          const AxisChar* pNamespace);
      AxisChar* AXISCALL getElementAsQName(const AxisChar* pName,
          const AxisChar* pNamespace);
      xsd__hexBinary AXISCALL getElementAsHexBinary(const AxisChar* pName,
          const AxisChar* pNamespace);
      xsd__base64Binary AXISCALL getElementAsBase64Binary(const AxisChar* pName,
          const AxisChar* pNamespace);
      struct tm AXISCALL getElementAsDateTime(const AxisChar* pName,
          const AxisChar* pNamespace);
      struct tm AXISCALL getElementAsDate(const AxisChar* pName,
          const AxisChar* pNamespace);
      struct tm AXISCALL getElementAsTime(const AxisChar* pName,
          const AxisChar* pNamespace);
      long AXISCALL getElementAsDuration(const AxisChar* pName,
          const AxisChar* pNamespace);
  
      /* Methods used by stubs to get a deserialized value of a XML attribute
       * as basic types
       */
      int AXISCALL getAttributeAsInt(const AxisChar* pName,
          const AxisChar* pNamespace);
      xsd__boolean AXISCALL getAttributeAsBoolean(const AxisChar* pName,
          const AxisChar* pNamespace);
      unsigned int AXISCALL getAttributeAsUnsignedInt(const AxisChar* pName,
          const AxisChar* pNamespace);
      short AXISCALL getAttributeAsShort(const AxisChar* pName,
          const AxisChar* pNamespace);
      unsigned short AXISCALL getAttributeAsUnsignedShort(const AxisChar* pName,
          const AxisChar* pNamespace);
      char AXISCALL getAttributeAsByte(const AxisChar* pName,
          const AxisChar* pNamespace);
      unsigned char AXISCALL getAttributeAsUnsignedByte(const AxisChar* pName,
          const AxisChar* pNamespace);
      long AXISCALL getAttributeAsLong(const AxisChar* pName,
          const AxisChar* pNamespace);
      long AXISCALL getAttributeAsInteger(const AxisChar* pName,
          const AxisChar* pNamespace);
      unsigned long AXISCALL getAttributeAsUnsignedLong(const AxisChar* pName,
          const AxisChar* pNamespace);
      float AXISCALL getAttributeAsFloat(const AxisChar* pName,
          const AxisChar* pNamespace);
      double AXISCALL getAttributeAsDouble(const AxisChar* pName,
          const AxisChar* pNamespace);
      double AXISCALL getAttributeAsDecimal(const AxisChar* pName,
          const AxisChar* pNamespace);
      AxisChar* AXISCALL getAttributeAsString(const AxisChar* pName,
          const AxisChar* pNamespace);
      AxisChar* AXISCALL getAttributeAsAnyURI(const AxisChar* pName,
          const AxisChar* pNamespace);
      AxisChar* AXISCALL getAttributeAsQName(const AxisChar* pName,
          const AxisChar* pNamespace);
      xsd__hexBinary AXISCALL getAttributeAsHexBinary(const AxisChar* pName,
          const AxisChar* pNamespace);
      xsd__base64Binary AXISCALL getAttributeAsBase64Binary(const AxisChar*
          pName, const AxisChar* pNamespace);
      struct tm AXISCALL getAttributeAsDateTime(const AxisChar* pName,
          const AxisChar* pNamespace);
      struct tm AXISCALL getAttributeAsDate(const AxisChar* pName,
          const AxisChar* pNamespace);
      struct tm AXISCALL getAttributeAsTime(const AxisChar* pName,
          const AxisChar* pNamespace);
      long AXISCALL getAttributeAsDuration(const AxisChar* pName,
          const AxisChar* pNamespace);
  
      /* Method used by stubs to get a deserialized value of complex types */
      void* AXISCALL getCmplxObject(void* pDZFunct, void* pCreFunct,
          void* pDelFunct, const AxisChar* pName, const AxisChar* pNamespace);
      /* Method used by stubs to get a deserialized Array of complex types */
      Axis_Array AXISCALL getCmplxArray(void* pDZFunct, void* pCreFunct,
          void* pDelFunct, void* pSizeFunct, const AxisChar* pName,
          const AxisChar* pNamespace);
      /* Method used by stubs to get a deserialized Array of basic types */
      Axis_Array AXISCALL getBasicArray(XSDTYPE nType, const AxisChar* pName,
          const AxisChar* pNamespace);
  
      int AXISCALL checkMessage(const AxisChar* pName,
          const AxisChar* pNamespace);
  
      void* AXISCALL checkFault(const AxisChar* pName,
          const AxisChar* pNamespace);
  
      int AXISCALL getStatus();
  
      SOAPTransport* getTransport() { return m_pTransport; }
      SoapSerializer* getSOAPSerializer() { return (SoapSerializer*)m_pIWSSZ; }
  
    /**
      * Set proxy server and port for transport.
      *
      * @param pcProxyHost Host name of proxy server
      * @param uiProxyPort Port of proxy server
      */
      void setProxy(const char* pcProxyHost, unsigned int uiProxyPort);
  
      AnyType* AXISCALL getAnyObject();
      int AXISCALL addAnyObject(AnyType* pAnyObject);
      const AxisChar* AXISCALL getNamespacePrefix(const AxisChar* pNamespace);
  
  private:
      int openConnection(int secure);
      void closeConnection();
      int makeArray();
  
  private:
      ClientAxisEngine* m_pAxisEngine;
  	list<void*> m_handlerProperties;
  
      /*
         Following are pointers to relevant objects of the ClientAxisEngine
         instance. So they do not belong to this object and are not created
         or deleted
       */
      SoapSerializer* m_pIWSSZ;
      SoapDeSerializer* m_pIWSDZ;
      char* m_pcEndPointUri;
      AXIS_PROTOCOL_TYPE m_nTransportType;
      /*
         Transport object
       */
      SOAPTransport* m_pTransport;
  
      /* Minimal error check */
      int m_nStatus;
    /**
      * Proxy server name.
      */
      string m_strProxyHost;
    /**
      * Proxy server port.
      */
      unsigned int m_uiProxyPort;
    /**
      * Use Proxy or not?
      */
      bool m_bUseProxy;
      
    /**
      * If this object calls initialize_module, this will be set to true.
      * Helps keep track of whether to call uninitialize_module in destructor.
      * It is possible that initialize_module could have been called already.
      */
      bool m_bModuleInitialized;
  
  };
  AXIS_CPP_NAMESPACE_END
  #endif
  
  #ifdef __cplusplus
  extern "C" { 
  #endif
  STORAGE_CLASS_INFO void* getStubObject(AXIS_PROTOCOL_TYPE nProtocol, 
                                         AxisChar* pchEndpointURI); 
  STORAGE_CLASS_INFO void destroyStubObject(void* pCall); 
  #ifdef __cplusplus
  } 
  #endif
  
  #endif
  
  
  
  1.1                  ws-axis/c/include/axis/client/Stub.hpp
  
  Index: Stub.hpp
  ===================================================================
  /*
   *   Copyright 2003-2004 The Apache Software Foundation.
   *
   *   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 Stub.h
   *
   * Contains the Stub base class that all C++ web service stubs inherit
   * from. The functions in this Stub base class provides the client
   * application some added functionality to manipulate the SOAP messages. 
   */
   
  /*
   * Revision 1.1  2004/05/31 samisa
   * Added setProxy
   */
  
  /*
   * Revision 1.2  2004/05/31 roshan
   * Added calling conventions
   */
  
  /*
   * Revision 1.3  2004/06/01 roshan
   * Added setSOAPMethodAttribute
   */
  
  /*
   * Revision 1.4  2004/06/08 samisa
   * Added setTransportTimeout
   */
  
  /*
   * Revision 1.5  2004/06/10 samisa
   * Added doxygen comments to help autobuild API docs
   */
  
  /*
   * Revision 1.6  2004/06/13 roshan
   * Added doxygen comments to help autobuild API docs
   */
  
  /*
   * Revision 1.13  2004/06/13 susantha
   * Added support for writing C web services and handlers
   */
  
  #if !defined(_STUB_H____OF_AXIS_INCLUDED_)
  #define _STUB_H____OF_AXIS_INCLUDED_
  
  #include <axis/client/Call.h>
  #include <axis/server/Attribute.h>
  
  #ifdef __cplusplus
  
  #include <vector>
  
  AXIS_CPP_NAMESPACE_START
  
  using namespace std;
  
  AXIS_CPP_NAMESPACE_END
  
  #endif
  
  /**
   * @struct StubFunctions
   *
   * Structure that defines the set of function pointers that correspond
   * to the Stub base class's functions. These functions are provided to
   * C Stubs by Axis in order to have the same functionalities as those
   * in Stub base class.
   * @brief Structure with function pointer definitions to provide Stub
   *        base class's functionalities for C stubs.
   */
  typedef struct {
      void (AXISCALL* setEndpoint)(void* pObj, const char* pchEndpoint);
      void (AXISCALL* setTransportProperty)(void* pObj, 
          const char *pcKey, const char *pcValue);
      char* (AXISCALL* getFirstTrasportPropertyKey)(void* pObj);
      char* (AXISCALL* getNextTrasportPropertyKey)(void* pObj);
      char* (AXISCALL* getCurrentTrasportPropertyKey)(void* pObj);
      char* (AXISCALL* getCurrentTrasportPropertyValue)(void* pObj);
      void (AXISCALL* deleteCurrentTrasportProperty)(void* pObj);
      void (AXISCALL* deleteTrasportProperty)(void* pObj, char* pcKey, 
          unsigned int uiOccurance);
      void (AXISCALL* setHandlerProperty)(void* pObj, AxisChar* name, 
  		void* value, int len);
      HeaderBlock_C (AXISCALL* createSOAPHeaderBlock)(void* pObj, 
          AxisChar * pachLocalName, AxisChar * pachUri);
      HeaderBlock_C (AXISCALL* getFirstSOAPHeaderBlock)(void* pObj);
      HeaderBlock_C (AXISCALL* getNextSOAPHeaderBlock)(void* pObj);
      HeaderBlock_C (AXISCALL* getCurrentSOAPHeaderBlock)(void* pObj);
      void (AXISCALL* deleteCurrentSOAPHeaderBlock)(void* pObj);
      void (AXISCALL* deleteSOAPHeaderBlock)(void* pObj,
          HeaderBlock_C hdrBlk);
      void (AXISCALL* setProxy)(void* pObj, const char* pcProxyHost,
          unsigned int uiProxyPort);
      void (AXISCALL* setSOAPMethodAttribute)(void* pObj,
          const AxisChar *pLocalname, const AxisChar *pPrefix,
          const AxisChar* pUri, const AxisChar *pValue);
      Attribute_C (AXISCALL* getFirstSOAPMethodAttribute)(void* pObj);
      Attribute_C (AXISCALL* getNextSOAPMethodAttribute)(void* pObj);
      Attribute_C (AXISCALL* getCurrentSOAPMethodAttribute)(void* pObj);
      void (AXISCALL* deleteCurrentSOAPMethodAttribute)(void* pObj);
      void (AXISCALL* deleteSOAPMethodAttribute)(void* pObj,
          Attribute_C Attr);
      void (AXISCALL* setTransportTimeout)(void* pObj, const long lSeconds);
         int (AXISCALL* getStatus)(void* pObj);
      const AxisChar* (AXISCALL* getNamespacePrefix)(void* pObj,
          const AxisChar* pNamespace);
  } StubFunctions;
  
  #ifdef __cplusplus
  
  /**
   * @class Stub
   *
   * @brief This is the client Stub base class to be inherited by all stub
   *        classes genarated by WSDL2WS tool. This class acts as the interface
   *        between the users and the Axis C++ engine (client side). Programmer
   *        can use the API defined here to enrich the client application
   *        functionality. Setting transport properties, setting SOAP headers,
   *        setting connection timeout and specifying a proxy on the client stub
   *        is facilitated with this interface.
   *
   * @author Samisa Abeysinghe (sabeysinghe@virtusa.com)
   * @author Roshan Weerasuriya (roshan@opensource.lk, roshanw@jkcsworld.com)
   * @author Susantha Kumara (susantha@opensource.lk, skumara@virtusa.com)
   */
  
  AXIS_CPP_NAMESPACE_START
  
  class STORAGE_CLASS_INFO Stub
  {
    public:
    /**
      * Constructor.
      * 
      * @param pcEndPointURI End point URI of the service to connect to. 
      *                       e.g. http://localhost:8080/axis/services/echo
      * @param eProtocol The protocol that this stub should use to communicate
      *        with the endpoint. See AXIS_PROTOCOL_TYPE in GDefine.h for
      *        possible values for eProtocol.
      */
      Stub(const char *pcEndPointURI, AXIS_PROTOCOL_TYPE eProtocol);
  
    /**
     * Default Constructor.
     */
     
    /**
      * Destructor.
      */
      virtual ~Stub();
  
    /**
      * Set end point of service to connect to.
      * 
      * @param pcEndPointURI End point URI of the service to connect to. 
      *                       e.g. http://localhost:8080/axis/services/echo
      */
  
      void AXISCALL setEndPoint(const char *pcEndPointURI);
  
    /**
      * Set transport property.
      *
      * Handling the semantics of the headers is up to the user.
      * The user has to make sure that the key:value paires passed to this method 
      * would make sense at trasport level.
      * The Stub class does not validate the key value paires to see if the properties
      * make sense to the undelying trasport.
      * 
      * Some example trasport properties:
      * <BR>  For HTTP: "Accept-Language: da, en-gb;q=0.8, en;q=0.7"
      * <BR>  For SMTP: "Reply-To: user@apache.org" 
      * 
      * @param pcKey Header name e.g. "Accept-Language". 
      *              Note that the key is not tested for uniqueness.
      *              One can set several values to the same key and they all will
      *              appear in the outgoing trasport header.
      *              e.g. If the method is called twise with (k,v1) and (k,v2) 
      *              both k:v1 and k:v2 will appear in trasport header as 
      *              seperate properties.
      * @param pcValue Header value e.g. "da, en-gb;q=0.8, en;q=0.7"
      */
      void AXISCALL setTransportProperty(const char *pcKey, const char *pcValue);
  
    /**
      * Iterator initiatior for trasport property keys
      *
      * This method must be called first to initiate access to the list of 
      * transport property keys.
      *
      * @return First transport property key. If there are no trasport 
      * properties set, returns NULL.
      */
      char* getFirstTrasportPropertyKey();
  
    /**
      * Iterator for trasport property keys
      *
      * getFirstTrasportPropertyKey() method must have been called at least once
      * before this method is called. If not behaviour is undefined.
      *
      * This method advances the iterator by one position.
      * Repeated calls always retuen the next value.
      *
      * @return Next transport property key. If there are no trasport 
      * properties set or if iterator is at the end of the list, returns NULL.
      */
      char* getNextTrasportPropertyKey();
  
    /**
      * Accessor for trasport property keys.
      *
      * This method gives access to the key corresponding to the trasport key
      * currently being pointed by trasport property key iterator.
      *
      * getFirstTrasportPropertyKey() method must have been called at least once
      * before this method is called. If not behaviour is undefined.
      *
      * This method does not advance the iterator.
      * Repeated calls always retuen the same key unless 
      * getNextTrasportPropertyKey() is called in between.
      *
      * @return Current transport property key. If there are no trasport 
      * properties set or if iterator is at the end of the list, returns NULL.
      */
      char* getCurrentTrasportPropertyKey();
      
    /**
      * Accessor for trasport property values.
      *
      * This method gives access to the value corresponding to the trasport key
      * currently being pointed by trasport property key iterator.
      * As keys and values are treated as paires, access to the value field is 
      * based on the access to the key field.
      *
      * getFirstTrasportPropertyKey() method must have been called at least once
      * before this method is called. If not behaviour is undefined.
      *
      * This method does not advance the iterator.
      * Repeated calls always retuen the same value unless 
      * getNextTrasportPropertyKey() is called in between.
      *
      * @return Current transport property value. If there are no trasport 
      * properties set or if iterator is at the end of the list, returns NULL.
      */
      char* getCurrentTrasportPropertyValue();
  
    /**
      * Deletes the trasport property key:value pair currently pointed to by 
      * the iterator.
      */
      void deleteCurrentTrasportProperty();
  
    /**
      * Deletes the given occerance of the trasport property key:value pair
      * corresponding to the given key.
      *
      * This method does not advance the iterator in line with the deletes done.
      * In case you want to access the trasport properties after using this
      * method, it is advisable to reinitialize the iterator using
      * getFirstTrasportPropertyKey();
      * However you can use this method despite where the iterator is 
      * pointing currently.
      *
      * @param pcKey Key of the trasport property key:value pair to be deleted
      *              If the given key is not set currently, nothing will happen.
      * @param uiOccurance Which occerance of the key to be deleted, because 
      *                    there can be multiple values for the same key. 
      *                    Default is to delete the first occurance.
      *                    Count starts from 1.
      */
      void deleteTrasportProperty(char* pcKey, unsigned int uiOccurance = 1);
  
    /**
      * Sets a property that can be accessed from a handler.
  	*
  	* @param name The name of the property
  	* @param value The value of the property
  	* @param len The length of the value
  	*/
      void setHandlerProperty(AxisChar* name, void* value, int len);
  
    /**
      * Create and add a SOAP header block to the Stub.
      * 
      * This will create a header block that would look like the following when 
      * serialized:
      * <PRE>
      *   <th:TestHeader xmlns:th="http://ws.apache.org/axisCppTest/">
      *   </th:TestHeader>
      * </PRE>
      *
      * User must use the IHeaderBlock pointer returned and fill in the header structure.
      * e.g. To make the SOAP header look like
      * <PRE>
      * <SOAP-ENV:Header>
      *   <th:TestHeader xmlns:th="http://ws.apache.org/axisCppTest/">
      *       <Credentials>
      *            <username>Test User</username>
      *            <password>Test Password</password>
      *       </Credentials>
      *   </th:TestHeader>
      * </SOAP-ENV:Header>
      * </PRE>
      * the following code segment coule be used
      * <PRE>
      *  IHeaderBlock *phb = ws.createSOAPHeaderBlock("TestHeader", "th",
      *                                   "http://ws.apache.org/axisCppTest/");
      *  //create parent node
      *  BasicNode *parentNode = phb->createChild(ELEMENT_NODE);
      *  parentNode->setLocalName("Credentials");
      *  //create child node
      *  BasicNode *childNode = phb->createChild(ELEMENT_NODE);
      *  childNode->setLocalName("username");
      *  //create char node for value
      *  BasicNode *valueNode = phb->createChild(CHARACTER_NODE);
      *  valueNode->setValue("Test User");
      *  //buld node tree
      *  childNode->addChild(valueNode);
      *  parentNode->addChild(childNode);
      *
      *  //add another node set
      *  childNode = phb->createChild(ELEMENT_NODE);
      *  childNode->setLocalName("password");
      *
      *  valueNode = phb->createChild(CHARACTER_NODE);
      *  valueNode->setValue("Test Password");
      *
      *  childNode->addChild(valueNode);
      *  parentNode->addChild(childNode);
      *
      *  phb->addChild(parentNode);
      * </PRE>
      *
      * @param pachLocalName Local tag name of the SOAP header. e.g. TestHeader
      * @param pachPrefix Prefix to be used in XML represenation of SOAP header
      *                   e.g. th
      * @param pachUri Namespace URI to be used in SOAP header.
                       e.g http://ws.apache.org/axisCppTestHeader/
      *
      * @return Pointer to the creater SOAP header block.
      */
      IHeaderBlock * AXISCALL createSOAPHeaderBlock(AxisChar * pachLocalName,
                       AxisChar * pachUri);
  
    /**
      * Iterator initiatior for SOAP header blocks
      *
      * This method must be called first to initiate access to the list of 
      * SOAP header blocks.
      *
      * @return First SOAP header block pointer. If there are no SOAP header
      * blocks set, returns NULL.
      */
      IHeaderBlock* getFirstSOAPHeaderBlock();
  
    /**
      * Iterator for SOAP header blocks
      *
      * getFirstSOAPHeaderBlock() method must have been called at least once
      * before this method is called. If not behaviour is undefined.
      *
      * This method advances the iterator by one position.
      * Repeated calls always retuen the next value.
      *
      * @return Next SOAP header block pointer. If there are no SOAP header 
      * blocks set or if iterator is at the end of the list, returns NULL.
      */
      IHeaderBlock* getNextSOAPHeaderBlock();
  
    /**
      * Accessor for SOAP header blocks
      *
      * This method gives access to the SOAP header block pointer corresponding
      * to the SOAP header block currently being pointed by SOAP header blocks
      * iterator.
      *
      * getFirstSOAPHeaderBlock() method must have been called at least once
      * before this method is called. If not behaviour is undefined.
      *
      * This method does not advance the iterator.
      * Repeated calls always retuen the same key unless 
      * getNextSOAPHeaderBlock() is called in between.
      *
      * @return Current SOAP header block pointer. If there are no SOAP header 
      * block set or if iterator is at the end of the list, returns NULL.
      */
      IHeaderBlock* getCurrentSOAPHeaderBlock();
      
    /**
      * Deletes the SOAP header block currently pointed to by 
      * the iterator.
      */
      void deleteCurrentSOAPHeaderBlock();
  
    /**
      * Deletes the given SOAP header block pointer from the current list of
      * SOAP header blocks.
      *
      * This method does a pointer comparison. It does not compare the contents
      * within objects.
      * Hence it is expected that either the pointer returned by the 
      * create method or by one of the iterator methods would be used with 
      * this method.
      *
      * This method does not advance the iterator in line with the deletes done.
      * In case you want to access the SOAP header  blocks after using this
      * method, it is advisable to reinitialize the iterator using
      * getFirstSOAPHeaderBlock();
      * However you can use this method despite where the iterator is 
      * pointing currently.
      *
      * @param pHeaderBlock Pointer of the header block to be deleted.
      */
      void deleteSOAPHeaderBlock(IHeaderBlock* pHeaderBlock);
  
    /**
      * Set proxy server and port for transport.
      *
      * @param pcProxyHost Host name of proxy server
      * @param uiProxyPort Port of proxy server
      */
      void setProxy(const char* pcProxyHost, unsigned int uiProxyPort);
  
    /**
      * Sets a 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 pValue The value of the Attribute.
      */
      void setSOAPMethodAttribute(const AxisChar *pLocalname, const AxisChar *pPrefix, const AxisChar *pValue);
  
    /**
      * Sets a 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.
      */
      void setSOAPMethodAttribute(const AxisChar *pLocalname, const AxisChar *pPrefix, const AxisChar* pUri, const AxisChar *pValue);
    
    /**
      * Iterator initiatior for SOAP method attributes
      *
      * This method must be called first to initiate access to the list of 
      * SOAP method attributes.
      *
      * @return First SOAP method attribute pointer. If there are no SOAP method 
      * attributes set, returns NULL.
      */
      Attribute* getFirstSOAPMethodAttribute();
  
    /**
      * Iterator for SOAP method attributes
      *
      * getFirstSOAPMethodAttribute() method must have been called at least once
      * before this method is called. If not behaviour is undefined.
      *
      * This method advances the iterator by one position.
      * Repeated calls always retuen the next value.
      *
      * @return Next SOAP method attribute pointer. If there are no SOAP method 
      * attributes set or if iterator is at the end of the list, returns NULL.
      */
      Attribute* getNextSOAPMethodAttribute();
  
    /**
      * Accessor for SOAP method attributes
      *
      * This method gives access to the SOAP method attribute pointer corresponding
      * to the SOAP method attribute currently being pointed by SOAP method 
      * attributes iterator.
      *
      * getFirstSOAPMethodAttribute() method must have been called at least once
      * before this method is called. If not behaviour is undefined.
      *
      * This method does not advance the iterator.
      * Repeated calls always retuen the same key unless 
      * getNextSOAPMethodAttribute() is called in between.
      *
      * @return Current SOAP method attribute pointer. If there are no SOAP method 
      * attribute set or if iterator is at the end of the list, returns NULL.
      */
      Attribute* getCurrentSOAPMethodAttribute();
      
    /**
      * Deletes the SOAP method attribute currently pointed to by 
      * the iterator.
      */
      void deleteCurrentSOAPMethodAttribute();
  
    /**
      * Deletes the given occerance of the SOAP method attribute from
      * the current list of SOAP method attributes
      *
      * This method does a pointer comparison. It does not compare the contents
      * within objects.
      * Hence it is expected that either the pointer returned by the 
      * create method or by one of the iterator methods would be used with 
      * this method.
      *
      * This method does not advance the iterator in line with the deletes done.
      * In case you want to access the SOAP method attributes after using this
      * method, it is advisable to reinitialize the iterator using
      * getFirstSOAPMethodAttribute();
      * However you can use this method despite where the iterator is 
      * pointing currently.
      *
      * @param pAttribute Pointer of Attribute to be deleted
      */
      void deleteSOAPMethodAttribute(Attribute* pAttribute);
  
    /**
      * Set transport timeout.
      *
      * @param lSeconds Timeout in seconds. 
      *                 If lSeconds is 0, then the transport will assume no 
      *                 timeout. Hence you want to reset a timeout already set
      *                 use 0.
      */
      void setTransportTimeout(const long lSeconds);
    /**
      * Get the status of the stub to see any error situation
      */
         int getStatus();
    /**
      * Get a namespace prefix for a given namespace URI
      */
      const AxisChar* AXISCALL getNamespacePrefix(const AxisChar* pNamespace);
  
    public:
      static StubFunctions ms_VFtable;
      static bool bInitialized;
      /* add static functions for all interface functions here */
      static void AXISCALL s_setEndpoint(void* pObj, const char* pchEndpoint)
      {((Stub*)pObj)->setEndPoint(pchEndpoint);};
      static void AXISCALL s_setTransportProperty(void* pObj, 
          const char *pcKey, const char *pcValue)
      {((Stub*)pObj)->setTransportProperty(pcKey, pcValue);};
      static char* AXISCALL s_getFirstTrasportPropertyKey(void* pObj)
      {return ((Stub*)pObj)->getFirstTrasportPropertyKey();};
      static char* AXISCALL s_getNextTrasportPropertyKey(void* pObj)
      {return ((Stub*)pObj)->getNextTrasportPropertyKey();};
      static char* AXISCALL s_getCurrentTrasportPropertyKey(void* pObj)
      {return ((Stub*)pObj)->getCurrentTrasportPropertyKey();};
      static char* AXISCALL s_getCurrentTrasportPropertyValue(void* pObj)
      {return ((Stub*)pObj)->getCurrentTrasportPropertyValue();};
      static void AXISCALL s_deleteCurrentTrasportProperty(void* pObj)
      {((Stub*)pObj)->deleteCurrentTrasportProperty();};
      static void AXISCALL s_deleteTrasportProperty(void* pObj, char* pcKey, 
          unsigned int uiOccurance)
      {((Stub*)pObj)->deleteTrasportProperty(pcKey, uiOccurance);};
      static void AXISCALL s_setHandlerProperty(void* pObj, AxisChar* name, 
  		void* value, int len)
      {((Stub*)pObj)->setHandlerProperty(name, value, len);};
      static HeaderBlock_C AXISCALL s_createSOAPHeaderBlock(void* pObj, 
          AxisChar * pachLocalName, AxisChar * pachUri);
      static HeaderBlock_C AXISCALL s_getFirstSOAPHeaderBlock(void* pObj);
      static HeaderBlock_C AXISCALL s_getNextSOAPHeaderBlock(void* pObj);
      static HeaderBlock_C AXISCALL s_getCurrentSOAPHeaderBlock(void* pObj);
      static void AXISCALL s_deleteCurrentSOAPHeaderBlock(void* pObj)
      {((Stub*)pObj)->deleteCurrentSOAPHeaderBlock();};
      static void AXISCALL s_deleteSOAPHeaderBlock(void* pObj,
          HeaderBlock_C hdrBlk)
      {((Stub*)pObj)->deleteSOAPHeaderBlock((IHeaderBlock*)hdrBlk._object);};
      static void AXISCALL s_setProxy(void* pObj, const char* pcProxyHost,
          unsigned int uiProxyPort)
      {((Stub*)pObj)->setProxy(pcProxyHost, uiProxyPort);};
      static void AXISCALL s_setSOAPMethodAttribute(void* pObj,
          const AxisChar *pLocalname, const AxisChar *pPrefix,
          const AxisChar* pUri, const AxisChar *pValue)
      {((Stub*)pObj)->setSOAPMethodAttribute(pLocalname, pPrefix, pUri,
                                              pValue);};
      static Attribute_C AXISCALL s_getFirstSOAPMethodAttribute(void* pObj);
      static Attribute_C AXISCALL s_getNextSOAPMethodAttribute(void* pObj);
      static Attribute_C AXISCALL s_getCurrentSOAPMethodAttribute(void* pObj);
      static void AXISCALL s_deleteCurrentSOAPMethodAttribute(void* pObj)
      {((Stub*)pObj)->deleteCurrentSOAPMethodAttribute();};
      static void AXISCALL s_deleteSOAPMethodAttribute(void* pObj,
          Attribute_C Attr)
      {((Stub*)pObj)->deleteSOAPMethodAttribute((Attribute*)Attr._object);};
      static void AXISCALL s_setTransportTimeout(void* pObj,
          const long lSeconds)
      {((Stub*)pObj)->setTransportTimeout(lSeconds);};
         static int AXISCALL s_getStatus(void* pObj)
      {return ((Stub*)pObj)->getStatus();};
      static const AxisChar* AXISCALL s_getNamespacePrefix(void* pObj,
          const AxisChar* pNamespace)
      {return ((Stub*)pObj)->getNamespacePrefix(pNamespace);};
      static void s_Initialize();
  
    protected:
    /**
      * Apply user set preferences to each call made on the Stub object.
      * This method is required because Axis engine holds only part of the state
      * with refereance to subsequent calls on the same Stub object. 
      * Foxing this approach would make the engine much more efficient.
      */
      void applyUserPreferences();
      
    /**
      * Set transport properties stored in m_vKeys and m_vValues vectors.
      * Called by applyUserPreferences for each and every method invocation. 
      */
      void setTransportProperties();
    
    /**
      * Set SOAP Headers stored in m_vSOAPHeaderBlock vector.
      * Called by applyUserPreferences for each and every method invocation. 
      */
      void setSOAPHeaders();
      
    /**
      * Set SOAP method attributes stored in m_vSOAPMethodAttributes vector.
      * Called by applyUserPreferences for each and every method invocation. 
      */
      void setSOAPMethodAttributes();
  
    /**
      * Set transport timeout stored in mm_lTimeoutSeconds
      * Called by applyUserPreferences for each and every method invocation. 
      */
      void setTransportTimeout();
  
    /**
      * Call object of the Stub. This is the point of access to the internals
      * of the Axis engine.
      */
      Call *m_pCall;
  
    /**
      * Trasport property keys
      */
      vector < char *>m_vKeys;
  
    /**
      * Trasport keys iterator
      */
      vector <char*>::iterator m_viCurrentKey;
  
    /**
      * Trasport property values 
      */
      vector < char *>m_vValues;
    
    /**
      * Trasport keys iterator
      */
      vector <char*>::iterator m_viCurrentValue;
  
    /**
      * Vector of Header Blok pointers
      */
      vector < IHeaderBlock * >m_vSOAPHeaderBlocks;
  
    /**
      * Trasport keys iterator
      */
      vector <IHeaderBlock *>::iterator m_viCurrentSOAPHeaderBlock;
  
    /**
      * List of SOAPMethod Attributes
      */
      vector <Attribute*> m_vSOAPMethodAttributes;
  
    /**
      * Trasport keys iterator
      */
      vector <Attribute*>::iterator m_viCurrentSOAPMethodAttribute;
  
    /**
      * Timeout in seconds
      */
      long m_lTimeoutSeconds;
  
  };
  
  AXIS_CPP_NAMESPACE_END
  
  #endif
  
  typedef struct { 
      void* _object; /* this will be C++ Call Object */
      CallFunctions* _functions; /* this is the static function table */
      void* _stub_object; /* the stub object */
      StubFunctions* _stub_functions; /* this is the static function table */
  } Call_C;
  
  #ifndef __cplusplus
  typedef Call_C Call; 
  #endif
  
  #endif /* !defined(_STUB_H____OF_AXIS_INCLUDED_) */