blob: 4b4a04a7a05545ad9c293003004877f430c76685 [file] [log] [blame]
/*
* 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.
*/
#if !defined(_SOAPSERIALIZER_H____OF_AXIS_INCLUDED_)
#define _SOAPSERIALIZER_H____OF_AXIS_INCLUDED_
#include <axis/IHandlerSoapSerializer.hpp>
#include "../transport/SOAPTransport.h"
#include "../common/BasicTypeSerializer.h"
#include <axis/WSDDDefines.hpp>
#include <axis/IAttribute.hpp>
#include "SoapAttachment.hpp"
#include <stdarg.h>
#include <cctype>
AXIS_CPP_NAMESPACE_START
class SoapEnvelope;
class SoapHeader;
class SoapMethod;
class SoapBody;
class SoapFault;
class HeaderBlock;
class ArrayBean;
class Attribute;
class ISoapAttachment;
class SoapAttachmentReference;
/**
* @class SoapSerializer
* @brief interface for the SoapSerializer class.
*/
class SoapSerializer : public IHandlerSoapSerializer
{
private:
map<AxisString, ISoapAttachment*> m_SoapAttachments;
list<SoapAttachmentReference*> m_attachmentRefs;
int m_nCounter;
AxisChar m_Buf[BTS_BUFFSIZE];
SoapEnvelope* m_pSoapEnvelope;
int m_iSoapVersion;
AXIS_BINDING_STYLE m_nStyle;
/* Overall status of Serializer. If anything goes wrong this is not AXIS_SUCCESS */
int m_nStatus;
/* Map that contains pairs of currently available namespaces and prefixes */
map<AxisXMLString, AxisXMLString> m_NsStack;
/* Provider type of current service that uses this Serializer object */
PROVIDERTYPE m_ProviderType;
/* the local namespace for this serializer */
AxisChar* m_pNamespace;
ContentIdSet *m_pContentIdSet;
/**
* Following is for C-binding support. The stub that the serializer object belongs to.
*/
void * m_pStub;
public:
/**
* Set C-binding stub pointer associated with object.
* This function was added in support of the c-Binding implementation.
*
* @param pStub - pointer to C binding stub object.
*/
void setCStub(void *pStub) { m_pStub = pStub; }
/**
* Get C-binding stub pointer.
* This function was added in support of the c-Binding implementation.
*
* @return Pointer to C binding stub object.
*/
void *getCStub() { return m_pStub; }
inline const AxisChar* AXISCALL getNamespace() const {return m_pNamespace;};
inline void AXISCALL setNamespace(const AxisChar* pNamespace) {m_pNamespace = (const_cast<AxisChar*>(pNamespace));};
#ifdef UNIT_TESTING_ON
int setOutputStreamForTesting(SOAPTransport* pStream);
#endif
int AXISCALL createSoapMethod(const AxisChar* sLocalName, const AxisChar* sURI);
int AXISCALL createSoapMethod(const AxisChar* sLocalName, const AxisChar* sURI, bool bIsWrapperStyle);
int AXISCALL createSoapFault(const AxisChar* sLocalName,
const AxisChar* sURI, const AxisChar* sFaultCode,
const AxisChar* sFaultString);
IWrapperSoapSerializer& operator<<(const AxisChar* cSerialized);
/**
* Returns the corrosponding namespace prefix.
* @param pNamespace The namespace.
* @return The corrosponding prefix.
*/
const AxisChar* AXISCALL getNamespacePrefix(const AxisChar* pNamespace);
/**
* Returns the corrosponding namespace prefix. This method is
* called when the caller also wants to know whether this is a new
* namespace or not as appose to its overloaded other member.
* @param pNamespace The namespace.
* @param blnIsNewPrefix The boolean which behaves as
* a out parameter to indicate whether this is a new namespace or not.
* @return The corrosponding prefix.
*/
const AxisChar* AXISCALL getNamespacePrefix(const AxisChar* pNamespace, bool& blnIsNewPrefix);
void AXISCALL removeNamespacePrefix(const AxisChar* pNamespace);
int setSoapVersion(SOAP_VERSION);
int init();
int setOutputStream(SOAPTransport* pStream);
void markEndOfStream();
int setSoapMethod(SoapMethod* pSoapMethod);
int setSoapFault(SoapFault* pSoapFault);
int setSoapBody(SoapBody* pSoapBody);
int setSoapEnvelope(SoapEnvelope* pSoapEnvelope);
SoapSerializer();
virtual ~SoapSerializer();
/* for arrays of basic types */
int AXISCALL addOutputBasicArrayParam(const Axis_Array* pArray,
XSDTYPE nType, const AxisChar* pName);
/* for arrays of complex types */
int AXISCALL addOutputCmplxArrayParam(const Axis_Array* pArray,
void* pSZFunct, void* pDelFunct,
const AxisChar* pName, const AxisChar* pNamespace);
/* for complex types */
int AXISCALL addOutputCmplxParam(void* pObject, void* pSZFunct,
void* pDelFunct, const AxisChar* pName, const AxisChar* pNamespace);
int AXISCALL addFaultDetail(void* pObject, void* pSZFunct,
void* pDelFunct, const AxisChar* pName, const AxisChar* pNamespace );
int AXISCALL addFaultDetail( const AxisChar * pDetail);
int AXISCALL serializeCmplxArray(const Axis_Array* pArray, void* pSZFunct,
void* pDelFunct, const AxisChar* pName,
const AxisChar* pNamespace);
int AXISCALL serializeBasicArray(const Axis_Array* pArray, XSDTYPE nType,
const AxisChar* pName);
int AXISCALL serializeBasicArray(const Axis_Array* pArray, const AxisChar* pNamespace,
XSDTYPE nType, const AxisChar* pName);
/* following two functions are needed by serializer functions of complex
* types for RPC style web services
*/
void AXISCALL serializeStartElementOfType(const AxisChar* pName,
const AxisChar* pNamespace, const AxisChar* pPrefix);
void AXISCALL serializeEndElementOfType(const AxisChar* pName);
PROVIDERTYPE getCurrentProviderType() { return m_ProviderType;};
void setCurrentProviderType(PROVIDERTYPE nType) { m_ProviderType = nType;};
private:
ArrayBean* makeArrayBean(XSDTYPE nType, void** pArray);
ArrayBean* makeArrayBean(void** pObject, void* pSZFunct, void* pDelFunct);
int setSoapHeader(SoapHeader* pSoapHeader);
public: /* Basic Type Serializing methods */
int removeSoapHeader();
int setHeaderBlock(HeaderBlock* pHeaderBlock);
IHeaderBlock* createHeaderBlock();
private:
bool checkAttachmentAvailability();
void serializeAttachments(SoapSerializer &pSZ);
BasicTypeSerializer m_BTSZ;
SOAPTransport* m_pOutputStream;
public:
IHeaderBlock* getCurrentHeaderBlock();
ISoapAttachment* createSoapAttachment();
void addNamespaceToNamespaceList(const AxisChar *pachNamespaceURI, const AxisChar* pachPrefix);
void addNamespaceToEnvelope(AxisChar *pachNamespaceURI, AxisChar* pachPrefix);
void addAttachmentBody(const AxisChar* achId, xsd__base64Binary* pAttchBody);
void addAttachmentHeader(const AxisChar* achId, const AxisChar* achHeaderName, const AxisChar* achHeaderValue);
void addAttachment(const AxisChar* achId, ISoapAttachment* pAttach);
void addAttachments(ISoapAttachment** pAttach, int iAttchArraySize);
void setContentIdSet(ContentIdSet *pContentIdSet);
void addAttachmentParameter(ISoapAttachment* att, const char* pName, IAttribute **attributes, int nAttributes);
IHeaderBlock* getHeaderBlock(const AxisChar* pcName, const AxisChar* pcNamespace);
IHeaderBlock* getFirstHeaderBlock();
IHeaderBlock* getNextHeaderBlock();
int setSOAPMethodAttribute(Attribute* pAttribute);
void clearSOAPMethodAttributes();
SoapMethod* getSOAPMethod();
IHeaderBlock* createHeaderBlock(const AxisChar *pachLocalName, const AxisChar *pachUri);
int AXISCALL addHeaderBlock(IHeaderBlock* pBlk);
int AXISCALL addOutputParam(const AxisChar* pchName, void* pValue, XSDTYPE type);
int AXISCALL serializeAsElement(const AxisChar* pchName,
void* pValue,
XSDTYPE type);
int AXISCALL serializeAsElement(const AxisChar* pchName,
const AxisChar* pNamespace,
void* pValue,
XSDTYPE type);
int AXISCALL serializeAsElement(const AxisChar* pchName,
IAnySimpleType* pSimpleType);
int AXISCALL serializeAsElement(const AxisChar* pchName,
const AxisChar* pNamespace,
IAnySimpleType* pSimpleType);
int AXISCALL serializeAsAttribute(const AxisChar* pName,
const AxisChar* pNamespace,
void* pValue,
XSDTYPE type);
int AXISCALL serializeAsAttribute(const AxisChar* pName,
const AxisChar* pNamespace,
IAnySimpleType* pSimpleType);
void AXISCALL serializeVargs(const char * pFirst, va_list vList);
void AXISCALL serialize(const char* pFirst, ...);
void setStyle(AXIS_BINDING_STYLE nStyle) { m_nStyle = nStyle; m_BTSZ.setStyle(nStyle);};
AXIS_BINDING_STYLE getStyle(){return m_nStyle;};
int AXISCALL setBodyAsHexBinary(xsd__hexBinary body);
int AXISCALL setBodyAsBase64Binary(xsd__base64Binary body);
const AxisChar* AXISCALL getBodyAsString();
int addOutputAnyObject(AnyType* pAnyObject);
int serializeAnyObject(AnyType* pAnyObject);
int serializeAsChardata(void* pValue, XSDTYPE type);
AxisXMLString getNamespaceURL( string sNameSpace);
int deleteHeaderBlock(const AxisChar* pName, const AxisChar* pNamespace);
/**
* This method will clear up all the current out parameters in preparation of a
* new method call
*/
void reset();
/**
* Add namespace to SOAP header.
*/
void addNamespaceToSOAPHeader(const AxisChar *pachNamespaceURI, const AxisChar* pachPrefix);
/**
* Clear SOAP header namespaces.
*/
void clearSOAPHeaderNamespaces();
/**
* Add attribute to SOAP header.
*/
void addAttributeToSOAPHeader(const AxisChar *pLocalname, const AxisChar *pPrefix, const AxisChar *pValue);
/**
* Clear SOAP header attributes.
*/
void clearSOAPHeaderAttributes();
/**
* Add namespace to SOAP body.
*/
void addNamespaceToSOAPBody(const AxisChar *pachNamespaceURI, const AxisChar* pachPrefix);
/**
* Clear SOAP body namespaces.
*/
void clearSOAPBodyNamespaces();
/**
* Add attribute to SOAP body.
*/
void addAttributeToSOAPBody(const AxisChar *pLocalname, const AxisChar *pPrefix, const AxisChar *pValue);
/**
* Clear SOAP body attributes.
*/
void clearSOAPBodyAttributes();
};
AXIS_CPP_NAMESPACE_END
#endif