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 ro...@apache.org on 2004/02/03 06:19:10 UTC

cvs commit: ws-axis/c/src/soap SoapSerializer.cpp SoapHeader.cpp SoapDeSerializer.cpp HeaderBlock.cpp ComplexElement.cpp Attribute.cpp

roshan      2004/02/02 21:19:10

  Modified:    c/src/soap SoapSerializer.cpp SoapHeader.cpp
                        SoapDeSerializer.cpp HeaderBlock.cpp
                        ComplexElement.cpp Attribute.cpp
  Log:
  changes for header support
  
  Revision  Changes    Path
  1.36      +23 -2     ws-axis/c/src/soap/SoapSerializer.cpp
  
  Index: SoapSerializer.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/soap/SoapSerializer.cpp,v
  retrieving revision 1.35
  retrieving revision 1.36
  diff -u -r1.35 -r1.36
  --- SoapSerializer.cpp	19 Jan 2004 07:44:12 -0000	1.35
  +++ SoapSerializer.cpp	3 Feb 2004 05:19:10 -0000	1.36
  @@ -296,6 +296,10 @@
   	m_pSoapEnvelope->addStandardNamespaceDecl(SoapKeywordMapping::Map(nSoapVersion).pEnv);
   	m_pSoapEnvelope->addStandardNamespaceDecl(SoapKeywordMapping::Map(nSoapVersion).pXsd);
   	m_pSoapEnvelope->addStandardNamespaceDecl(SoapKeywordMapping::Map(nSoapVersion).pXsi);
  +
  +	/* Adding the standard SOAP namespace to the namespace stack */
  +	m_NsStack[SoapKeywordMapping::Map(nSoapVersion).pchNamespaceUri] = SoapKeywordMapping::Map(nSoapVersion).pchPrefix;
  +
   	return AXIS_SUCCESS;
   }
   void SoapSerializer::RemoveNamespacePrefix(const AxisChar* pNamespace)
  @@ -317,6 +321,18 @@
   	return m_NsStack[pNamespace].c_str();
   }
   
  +const AxisChar* SoapSerializer::GetNamespacePrefix(const AxisChar* pNamespace, bool& blnIsNewPrefix)
  +{
  +	if (m_NsStack.find(pNamespace) == m_NsStack.end())
  +	{
  +		m_nCounter++;
  +		AxisSprintf(m_Buf, 8, "ns%d", m_nCounter);
  +		m_NsStack[pNamespace] = m_Buf;
  +		blnIsNewPrefix = true;
  +	}
  +	return m_NsStack[pNamespace].c_str();
  +}
  +
   IWrapperSoapSerializer& SoapSerializer::operator <<(const AxisChar* cSerialized)
   {
   	if (AXIS_SUCCESS != m_nStatus) 
  @@ -545,6 +561,13 @@
   	return AXIS_SUCCESS;
   }
   
  +int SoapSerializer::setOutputStreamForTesting(const Ax_soapstream* pStream)
  +{
  +	m_pOutputStream = pStream;
  +
  +	return AXIS_SUCCESS;
  +}
  +
   /**
    * Basic output parameter going to be serialized as an Element later
    */
  @@ -739,5 +762,3 @@
   	char *pChar = const_cast<char*>(buffer);
   	pChar[0] = '\0'; /* set nul */ 
   }
  -
  -
  
  
  
  1.11      +12 -7     ws-axis/c/src/soap/SoapHeader.cpp
  
  Index: SoapHeader.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/soap/SoapHeader.cpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- SoapHeader.cpp	12 Jan 2004 12:20:54 -0000	1.10
  +++ SoapHeader.cpp	3 Feb 2004 05:19:10 -0000	1.11
  @@ -187,17 +187,22 @@
   
   IHeaderBlock* SoapHeader::getHeaderBlock()
   {
  +	HeaderBlock* tmpHeaderBlock = NULL;
  +
   	list<HeaderBlock*>::iterator itCurrHeaderBlock= m_headerBlocks.begin();
   
   	if(itCurrHeaderBlock != m_headerBlocks.end()) {			
  -
  -		/*
  -		 *Actually a dynamic cast is not needed here. But it
  -		 * is done for safe side.
  -		 */
  -		return dynamic_cast<IHeaderBlock*>(*itCurrHeaderBlock);
  +		tmpHeaderBlock = (*itCurrHeaderBlock);
  +		m_headerBlocks.pop_front();
   	}
   
  -	return NULL;
  +	return tmpHeaderBlock;
  +
  +}
  +
  +int SoapHeader::setPrefix(const char* pcPrefix)
  +{
  +	m_pcPrefix = pcPrefix;
   
  +	return AXIS_SUCCESS;
   }
  
  
  
  1.25      +72 -5     ws-axis/c/src/soap/SoapDeSerializer.cpp
  
  Index: SoapDeSerializer.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/soap/SoapDeSerializer.cpp,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- SoapDeSerializer.cpp	20 Jan 2004 14:05:16 -0000	1.24
  +++ SoapDeSerializer.cpp	3 Feb 2004 05:19:10 -0000	1.25
  @@ -72,6 +72,8 @@
   #include <axis/soap/SoapMethod.h>
   #include <axis/soap/SoapBody.h>
   #include <axis/soap/SoapFault.h>
  +#include <axis/soap/ComplexElement.h>
  +#include <axis/soap/CharacterElement.h>
   #include <axis/common/GDefine.h>
   #include <axis/common/Packet.h>
   #include <axis/common/AxisTrace.h>
  @@ -184,13 +186,78 @@
   		m_nStatus = AXIS_FAIL;
   		return m_nStatus;
   	}
  -	if ((START_ELEMENT != m_pNode->m_type) && (0 == strcmp(m_pNode->m_pchNameOrValue, SoapKeywordMapping::Map(m_nSoapVersion).pchWords[SKW_HEADER])))
  +
  +	if ((START_ELEMENT == m_pNode->m_type) && (0 == strcmp(m_pNode->m_pchNameOrValue, SoapKeywordMapping::Map(m_nSoapVersion).pchWords[SKW_HEADER])))
   	{
   		m_pHeader = new SoapHeader();
   		/* Set any attributes/namspaces to the SoapHeader object */
  -		m_pNode = NULL; /*This is to indicate that node is identified and used */
  -		return m_nStatus;
  +
  +		bool blnConStatus = true;
  +		int iLevel = HEADER_LEVEL;
  +		int iHeaderBlockStackLevel = 0;
  +		HeaderBlock* pHeaderBlock;
  +		ComplexElement* pComplexElement;
  +		CharacterElement* pCharacterElement;
  +
  +		while (blnConStatus) {
  +			m_pNode = m_pParser->Next();
  +
  +			if ((END_ELEMENT == m_pNode->m_type) && (0 == strcmp(m_pNode->m_pchNameOrValue, SoapKeywordMapping::Map(m_nSoapVersion).pchWords[SKW_HEADER]))) {
  +				m_pNode = NULL; /*This is to indicate that node is identified and used */
  +				return m_nStatus;
  +			} else {
  +				if (START_ELEMENT == m_pNode->m_type) {
  +					if (iLevel == HEADER_LEVEL) {
  +						pHeaderBlock = new HeaderBlock();
  +		
  +						pHeaderBlock->setUri(m_pNode->m_pchNamespace);
  +						pHeaderBlock->setLocalName(m_pNode->m_pchNameOrValue);
  +
  +						if ((m_pNode->m_pchAttributes) != NULL) {
  +							int iAttributeArrayIndex = 0;
  +							while (true) {
  +								Attribute* pAttribute = new Attribute();
  +								pAttribute->setLocalName(m_pNode->m_pchAttributes[iAttributeArrayIndex++]);
  +								pAttribute->setUri(m_pNode->m_pchAttributes[iAttributeArrayIndex++]);
  +								pAttribute->setValue(m_pNode->m_pchAttributes[iAttributeArrayIndex++]);
  +
  +								pHeaderBlock->addAttribute(pAttribute);
  +								
  +								if (m_pNode->m_pchAttributes[iAttributeArrayIndex] == '\0') {
  +									break;
  +								}
  +							}
  +						}
  +
  +						iLevel = HEADER_BLOCK_LEVEL;
  +					} else if (iLevel == HEADER_BLOCK_LEVEL) {
  +						iHeaderBlockStackLevel++;
  +
  +						pComplexElement = new ComplexElement();
  +						
  +						pComplexElement->setURI(m_pNode->m_pchNamespace);
  +						pComplexElement->setLocalName(m_pNode->m_pchNameOrValue);
  +
  +						iLevel = HEADER_BLOCK_INSIDE_LEVEL;
  +					}
  +				} else if (END_ELEMENT == m_pNode->m_type) {
  +					if ((iLevel == HEADER_BLOCK_LEVEL) && (iHeaderBlockStackLevel==0)) {
  +						m_pHeader->addHeaderBlock(pHeaderBlock);
  +						iLevel = HEADER_LEVEL;
  +					} else if ((iLevel == HEADER_BLOCK_INSIDE_LEVEL) && (iHeaderBlockStackLevel>0)) {
  +						pHeaderBlock->addChild(pComplexElement);
  +						iHeaderBlockStackLevel--;
  +						iLevel = HEADER_BLOCK_LEVEL;
  +					}
  +				} else if (CHARACTER_ELEMENT == m_pNode->m_type) {
  +					pCharacterElement = new CharacterElement(m_pNode->m_pchNameOrValue);
  +
  +					pComplexElement->addChild(pCharacterElement);
  +				}
  +			}
  +		}
   	}
  +
   	return m_nStatus;
   }
   
  @@ -2090,8 +2157,8 @@
   HeaderBlock* SoapDeSerializer::GetHeaderBlock()
   {
   	if (!m_pHeader) return NULL;
  -	/*TODO : get a header block left in the m_pHeader (remove it from there) and return */
  -	return NULL;
  +
  +	return (HeaderBlock*)m_pHeader->getHeaderBlock();
   }
   /**
    * Used probably by a handler to add a header block to the Deserializer. Probably to be 
  
  
  
  1.9       +98 -29    ws-axis/c/src/soap/HeaderBlock.cpp
  
  Index: HeaderBlock.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/soap/HeaderBlock.cpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- HeaderBlock.cpp	12 Jan 2004 12:20:54 -0000	1.8
  +++ HeaderBlock.cpp	3 Feb 2004 05:19:10 -0000	1.9
  @@ -69,6 +69,7 @@
   #include <axis/soap/SoapSerializer.h>
   #include <axis/common/GDefine.h>
   #include <axis/soap/BasicNode.h>
  +#include <axis/soap/ComplexElement.h>
   #include <axis/soap/CharacterElement.h>
   
   //////////////////////////////////////////////////////////////////////
  @@ -129,40 +130,60 @@
   
   	int iStatus= AXIS_SUCCESS;
   
  +	list<AxisChar*> lstTmpNameSpaceStack;
  +	bool blnIsNewNamespace = false;
  +
   	do {
  -		if(isSerializable()) {
  +		/*
  +		TO DO: ReWrite the following logic to deal with name spaces
  +		*/
   
  -			pSZ.Serialize("<", m_prefix.c_str(), ":", m_localname.c_str(),
  -				" xmlns:", m_prefix.c_str(), "=\"", m_uri.c_str(), "\"", NULL);
  +		pSZ.Serialize("<", NULL);
   
  -			iStatus= attrSerialize(pSZ);
  -			if(iStatus==AXIS_FAIL) {
  -				break;
  +		if(m_prefix.length() == 0) {
  +			m_prefix = pSZ.GetNamespacePrefix(m_uri.c_str(), blnIsNewNamespace);
  +			if (blnIsNewNamespace) {
  +				lstTmpNameSpaceStack.push_back((AxisChar*)m_uri.c_str());
   			}
  +		}
   
  -			iStatus= serializeNamespaceDecl(pSZ);
  -			if(iStatus==AXIS_FAIL) {
  -				break;
  -			}
  -			
  -			pSZ.Serialize(">", NULL);
  +		pSZ.Serialize(m_prefix.c_str(), ":", m_localname.c_str(),
  +			" xmlns:", m_prefix.c_str(), "=\"", m_uri.c_str(), "\"", NULL);
   
  -			iStatus= serializeChildren(pSZ);
  -			if(iStatus==AXIS_FAIL) {
  -				break;
  -			}
  +		iStatus= attrSerialize(pSZ, lstTmpNameSpaceStack);
  +		if(iStatus==AXIS_FAIL) {
  +			break;
  +		}
   
  -			pSZ.Serialize("</", m_prefix.c_str(), ":", m_localname.c_str(), ">", NULL);
  -			
  -		} else {
  -			iStatus= AXIS_FAIL;
  +		iStatus= serializeNamespaceDecl(pSZ);
  +		if(iStatus==AXIS_FAIL) {
  +			break;
  +		}
  +		
  +		pSZ.Serialize(">", NULL);
  +
  +		iStatus= serializeChildren(pSZ, lstTmpNameSpaceStack);
  +		if(iStatus==AXIS_FAIL) {
  +			break;
   		}
  +
  +		pSZ.Serialize("</", m_prefix.c_str(), ":", m_localname.c_str(), ">", NULL);
  +
  +		/*
  +		 *Removing the namespace list of this headerblock from the stack.
  +		 */
  +		list<AxisChar*>::iterator itCurrentNamespace = lstTmpNameSpaceStack.begin();
  +		while (itCurrentNamespace != lstTmpNameSpaceStack.end()) {
  +			pSZ.RemoveNamespacePrefix(*itCurrentNamespace);
  +			itCurrentNamespace++;
  +		}
  +			
   	} while(0);
   
   	return iStatus;
   }
   
  -int HeaderBlock::attrSerialize(SoapSerializer& pSZ)
  +int HeaderBlock::attrSerialize(SoapSerializer& pSZ, list<AxisChar*>& lstTmpNameSpaceStack)
   {
   	int iStatus= AXIS_SUCCESS;
   
  @@ -170,12 +191,12 @@
   
   	while(itCurrAttribute != m_attributes.end()) {		
   
  -		iStatus= (*itCurrAttribute)->serialize(pSZ);
  +		iStatus= (*itCurrAttribute)->serialize(pSZ, lstTmpNameSpaceStack);
   		if(iStatus==AXIS_FAIL) {
   			break;
   		}
  -		itCurrAttribute++;		
  -	}	
  +		itCurrAttribute++;
  +	}
   
   	return iStatus;
   }
  @@ -233,14 +254,19 @@
   	return AXIS_SUCCESS;
   }
   
  -int HeaderBlock::serializeChildren(SoapSerializer& pSZ)
  +int HeaderBlock::serializeChildren(SoapSerializer& pSZ, list<AxisChar*>& lstTmpNameSpaceStack)
   {
   	list<BasicNode*>::iterator itCurrBasicNode= m_children.begin();
   
  -	while(itCurrBasicNode != m_children.end()) {		
  -		(*itCurrBasicNode)->serialize(pSZ);
  -		itCurrBasicNode++;		
  -	}	
  +	while(itCurrBasicNode != m_children.end()) {
  +		if ((*itCurrBasicNode)->getNodeType() == ELEMENT_NODE) {
  +			(*itCurrBasicNode)->serialize(pSZ, lstTmpNameSpaceStack);
  +		} else {
  +			/* for CHARACTER_NODE types */
  +			(*itCurrBasicNode)->serialize(pSZ);
  +		}
  +		itCurrBasicNode++;
  +	}
   
   	return AXIS_SUCCESS;
   }
  @@ -302,3 +328,46 @@
   
   	return pBasicNode;
   }
  +
  +int HeaderBlock::initializeForTesting()
  +{
  +	setPrefix("m");
  +	setLocalName("reservation");
  +	setUri("http://travelcompany.example.org/reservation");
  +
  +	Attribute* pAttribute2 = new Attribute();
  +	pAttribute2->setPrefix("SOAP-ENV");
  +	pAttribute2->setLocalName("role");
  +	pAttribute2->setValue("http://www.w3.org/2003/05/soap-envelope/role/next");
  +
  +	Attribute* pAttribute3 = new Attribute();
  +	pAttribute3->setPrefix("SOAP-ENV");
  +	pAttribute3->setLocalName("mustUnderstand");
  +	pAttribute3->setValue("true");
  +
  +	addAttribute(pAttribute2);
  +	addAttribute(pAttribute3);
  +
  +	ComplexElement* pComplexElement = new ComplexElement();
  +	pComplexElement->setPrefix("m");
  +	pComplexElement->setLocalName("reference");
  +	pComplexElement->addChild(new CharacterElement("abcdefgh"));
  +
  +	ComplexElement* pComplexElement2 = new ComplexElement();
  +	pComplexElement2->setPrefix("m");
  +	pComplexElement2->setLocalName("dateAndTime");
  +	pComplexElement2->addChild(new CharacterElement("2001-11-29T13:20:00.000-05:00"));
  +
  +	addChild(pComplexElement);
  +	addChild(pComplexElement2);
  +
  +	return AXIS_SUCCESS;	
  +}
  +
  +bool HeaderBlock::operator ==( const HeaderBlock &objHeaderBlock)
  +{
  +	/*
  +	 *TODO : the logic
  +	 */
  +	return true;
  +}
  \ No newline at end of file
  
  
  
  1.8       +65 -9     ws-axis/c/src/soap/ComplexElement.cpp
  
  Index: ComplexElement.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/soap/ComplexElement.cpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- ComplexElement.cpp	12 Jan 2004 12:20:54 -0000	1.7
  +++ ComplexElement.cpp	3 Feb 2004 05:19:10 -0000	1.8
  @@ -135,6 +135,51 @@
   	return iStatus;
   }
   
  +int ComplexElement::serialize(SoapSerializer& pSZ, list<AxisChar*>& lstTmpNameSpaceStack)
  +{
  +	int iStatus= AXIS_SUCCESS;
  +	do {
  +		if(isSerializable()) 
  +		{	
  +			bool blnIsNewNamespace = false;
  +
  +			pSZ.Serialize("<", NULL);	
  +			if(m_sPrefix.length() != 0) {				
  +				pSZ.Serialize(m_sPrefix.c_str(), ":", NULL);
  +			} else if (m_sURI.length() != 0) {
  +				m_sPrefix = pSZ.GetNamespacePrefix(m_sURI.c_str(), blnIsNewNamespace);
  +				if (blnIsNewNamespace) {
  +					lstTmpNameSpaceStack.push_back((AxisChar*)m_sURI.c_str());
  +				}
  +				pSZ.Serialize(m_sPrefix.c_str(), ":", NULL);
  +			}
  +
  +			pSZ.Serialize(m_sLocalName.c_str(), NULL);
  +
  +			if((m_sPrefix.length() != 0) && (m_sURI.length() != 0) && (blnIsNewNamespace)) {
  +				pSZ.Serialize(" xmlns:", m_sPrefix.c_str(), "=\"", m_sURI.c_str(), "\"", NULL);
  +			}
  +			pSZ.Serialize(">", NULL);
  +
  +			iStatus= serializeChildren(pSZ, lstTmpNameSpaceStack);
  +			if(iStatus==AXIS_FAIL) {
  +				break;
  +			}
  +			pSZ.Serialize("</", NULL);
  +			if(m_sPrefix.length() != 0) {				
  +				pSZ.Serialize(m_sPrefix.c_str(), ":", NULL);
  +			}
  +			pSZ.Serialize(m_sLocalName.c_str(), ">", NULL);
  +			iStatus= AXIS_SUCCESS;
  +		} 
  +		else
  +		{
  +			iStatus= AXIS_FAIL;
  +		}
  +	} while(0);	
  +	return iStatus;
  +}
  +
   /*
   comm on 10/7/2003 6.20pm
   int ComplexElement::serialize(string &sSerialized)
  @@ -186,13 +231,6 @@
   	bool bStatus= true;
   
   	do {
  -		if(m_sURI.length()!=0) {
  -			if(m_sPrefix.length()==0) {
  -				bStatus= false;
  -				break;
  -			}
  -		}
  -
   		if(m_sLocalName.length()==0) {
   			bStatus= false;
   			break;
  @@ -210,11 +248,29 @@
   
   int ComplexElement::serializeChildren(SoapSerializer& pSZ)
   {
  -
   	list<BasicNode*>::iterator itCurrBasicNode= m_children.begin();
   
  -	while(itCurrBasicNode != m_children.end()) {		
  +	while(itCurrBasicNode != m_children.end()) {
  +		
   		(*itCurrBasicNode)->serialize(pSZ);
  +		
  +		itCurrBasicNode++;		
  +	}	
  +
  +	return AXIS_SUCCESS;
  +}
  +
  +int ComplexElement::serializeChildren(SoapSerializer& pSZ, list<AxisChar*>& lstTmpNameSpaceStack)
  +{
  +	list<BasicNode*>::iterator itCurrBasicNode= m_children.begin();
  +
  +	while(itCurrBasicNode != m_children.end()) {
  +		if ((*itCurrBasicNode)->getNodeType() == ELEMENT_NODE) {
  +			(*itCurrBasicNode)->serialize(pSZ, lstTmpNameSpaceStack);	
  +		} else {
  +			/* for CHARACTER_NODE */
  +			(*itCurrBasicNode)->serialize(pSZ);
  +		}
   		itCurrBasicNode++;		
   	}	
   
  
  
  
  1.10      +37 -0     ws-axis/c/src/soap/Attribute.cpp
  
  Index: Attribute.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/soap/Attribute.cpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- Attribute.cpp	12 Jan 2004 12:20:54 -0000	1.9
  +++ Attribute.cpp	3 Feb 2004 05:19:10 -0000	1.10
  @@ -133,6 +133,33 @@
   	return intStatus;	
   }
   
  +int Attribute::serialize(SoapSerializer& pSZ, list<AxisChar*>& lstTmpNameSpaceStack)
  +{	
  +	int intStatus= AXIS_FAIL;
  +
  +	if (isSerializable()) {		
  +		pSZ.Serialize(" ", NULL);
  +
  +		if(!m_prefix.empty()) {			
  +			pSZ.Serialize(m_prefix.c_str(), ":", NULL);
  +		} else if (!m_uri.empty()) {
  +			bool blnIsNewNamespace = false;
  +			m_prefix = pSZ.GetNamespacePrefix(m_uri.c_str(), blnIsNewNamespace);
  +			if (blnIsNewNamespace) {
  +				lstTmpNameSpaceStack.push_back((AxisChar*)m_uri.c_str());
  +			}
  +
  +			pSZ.Serialize(m_prefix.c_str(), ":", NULL);
  +		}
  +
  +		pSZ.Serialize(m_localname.c_str(), "=\"", m_value.c_str(), "\"", NULL);
  +
  +		intStatus= AXIS_SUCCESS;
  +	}
  +
  +	return intStatus;	
  +}
  +
   /*
   commented on 10Jul2003 3.30 pm
   int Attribute::serialize(string& sSerialized)
  @@ -165,4 +192,14 @@
   	}
   
   	return bStatus;
  +}
  +
  +int Attribute::initializeForTesting()
  +{
  +	m_prefix = "pr";
  +	m_localname = "age";
  +	m_uri = "http://myurl.com";
  +	m_value = "25";
  +
  +	return AXIS_SUCCESS;
   }