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 sa...@apache.org on 2004/04/01 15:56:42 UTC

cvs commit: ws-axis/c/src/soap SoapBinInputStream.cpp SoapParserXerces.cpp SoapParserXerces.h XercesHandler.cpp XercesHandler.h

sanjaya     2004/04/01 05:56:42

  Modified:    c/src/server/apache mod_axis.c
               c/src/server/apache2 mod_axis2.c
               c/src/soap SoapBinInputStream.cpp SoapParserXerces.cpp
                        SoapParserXerces.h XercesHandler.cpp
                        XercesHandler.h
  Log:
  -changes to the apache modules to accomodate the xerces parser
  -changes to xerces parsing of deserialization
  
  Revision  Changes    Path
  1.24      +28 -2     ws-axis/c/src/server/apache/mod_axis.c
  
  Index: mod_axis.c
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/server/apache/mod_axis.c,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- mod_axis.c	24 Mar 2004 06:57:32 -0000	1.23
  +++ mod_axis.c	1 Apr 2004 13:56:42 -0000	1.24
  @@ -27,8 +27,8 @@
   /*extern int process(soapstream *);*/
   extern unsigned char chEBuf[1024];
   
  -#define SIZEOFMODULEBUFFER 4096
  -
  +//#define SIZEOFMODULEBUFFER 4096
  +#define SIZEOFMODULEBUFFER 32
   
   /**
    * This method adds the http header to the Ax_soapstream. These headers will be dispatched later
  @@ -118,6 +118,23 @@
    */
   static AXIS_TRANSPORT_STATUS AXISCALL get_request_bytes(const char** req, int* retsize, const Ax_soapstream* stream)
   {
  +#ifdef USE_XERCES_PARSER
  +	int nBufSize = *retsize;
  +	int len_read;
  +	char* pBuffer = *req;
  +	if (!(*req)) return TRANSPORT_FAILED;
  +	ap_hard_timeout("util_read", (request_rec*)stream->str.ip_stream);
  +	len_read = ap_get_client_block((request_rec*)stream->str.ip_stream, *req, nBufSize);
  +	ap_reset_timeout((request_rec*)stream->str.ip_stream);
  +	*retsize =  len_read;
  +	if (len_read < nBufSize)
  +	{
  +		pBuffer[len_read] = '\0';
  +		return TRANSPORT_FINISHED;
  +	}
  +	else
  +		return TRANSPORT_IN_PROGRESS;
  +#else
   	 /*How can I detect an error when reading stream ? Sanjaya ?
   	 In case of an error set buffer to null, size 0 and return TRANSPORT_FAILED*/
   	int len_read;
  @@ -135,6 +152,7 @@
   	}
   	else
   		return TRANSPORT_IN_PROGRESS;
  +#endif
   }
   
   static void AXISCALL release_receive_buffer(const char* buffer, const Ax_soapstream* stream)
  @@ -211,14 +229,18 @@
   	sstr->reserved2 = NULL;
   #else
   	sstr->reserved1 = calloc(NO_OF_SERIALIZE_BUFFERS, sizeof(sendbuffers));
  +#ifdef USE_EXPAT_PARSER
   	sstr->reserved2 = malloc(SIZEOFMODULEBUFFER);
   #endif
  +#endif
   	req_rec->content_type = "text/xml"; /*for SOAP 1.2 this this should be "application/soap+xml" but keep this for the moment*/
   	/*set up the read policy from the client.*/
   	if ((rc = ap_setup_client_block(req_rec, REQUEST_CHUNKED_ERROR)) != OK)
   	{
   		if (sstr->reserved1) free(sstr->reserved1);
  +#ifdef USE_EXPAT_PARSER
   		if (sstr->reserved2) free(sstr->reserved2);
  +#endif
   		free(sstr->so.http);
   		free(sstr);
   		return rc;
  @@ -258,7 +280,9 @@
   	if(0 != process_request(sstr))
   	{
   		if (sstr->reserved1) free(sstr->reserved1);
  +#ifdef USE_EXPAT_PARSER
   		if (sstr->reserved2) free(sstr->reserved2);
  +#endif
   		free(sstr->so.http);
   		free(sstr);
   		return OK;
  @@ -292,7 +316,9 @@
   	}
   	/*Free the array */
   	if (sstr->reserved1) free(sstr->reserved1);
  +#ifdef USE_EXPAT_PARSER
   	if (sstr->reserved2) free(sstr->reserved2);
  +#endif
   
   #endif
   	free(sstr->so.http);
  
  
  
  1.8       +30 -2     ws-axis/c/src/server/apache2/mod_axis2.c
  
  Index: mod_axis2.c
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/server/apache2/mod_axis2.c,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- mod_axis2.c	24 Mar 2004 06:57:32 -0000	1.7
  +++ mod_axis2.c	1 Apr 2004 13:56:42 -0000	1.8
  @@ -182,14 +182,31 @@
    */
   static AXIS_TRANSPORT_STATUS AXISCALL get_request_bytes(const char** req, int* retsize, const Ax_soapstream* stream)
   {
  +#ifdef USE_XERCES_PARSER
  +	int nBufSize = *retsize;
  +	int len_read;
  +	char* pBuffer = *req;
  +	if (!(*req)) return TRANSPORT_FAILED;
  +	/* ap_hard_timeout("util_read", (request_rec*)stream->str.ip_stream); */
  +	len_read = ap_get_client_block((request_rec*)stream->str.ip_stream, *req, nBufSize);
  +	/* ap_reset_timeout((request_rec*)stream->str.ip_stream); */
  +	*retsize =  len_read;
  +	if (len_read < nBufSize)
  +	{
  +		pBuffer[len_read] = '\0';
  +		return TRANSPORT_FINISHED;
  +	}
  +	else
  +		return TRANSPORT_IN_PROGRESS;
  +#else
   	 /*How can I detect an error when reading stream ? Sanjaya ?
   	 In case of an error set buffer to null, size 0 and return TRANSPORT_FAILED*/
   	int len_read;
   	char* pBuffer = stream->reserved2;
   	if (!pBuffer) return TRANSPORT_FAILED;
  -	/* ap_hard_timeout("util_read", (request_rec*)stream->str.ip_stream);*/
  +	/* ap_hard_timeout("util_read", (request_rec*)stream->str.ip_stream); */
   	len_read = ap_get_client_block((request_rec*)stream->str.ip_stream, pBuffer, SIZEOFMODULEBUFFER);
  -	/*ap_reset_timeout((request_rec*)stream->str.ip_stream);*/
  +	/* ap_reset_timeout((request_rec*)stream->str.ip_stream); */
   	*req = pBuffer;
   	*retsize =  len_read;
   	if (len_read < SIZEOFMODULEBUFFER)
  @@ -199,6 +216,7 @@
   	}
   	else
   		return TRANSPORT_IN_PROGRESS;
  +#endif
   }
   
   static void AXISCALL release_receive_buffer(const char* buffer, const Ax_soapstream* stream)
  @@ -286,14 +304,18 @@
   	sstr->reserved2 = NULL;
   #else
   	sstr->reserved1 = calloc(NO_OF_SERIALIZE_BUFFERS, sizeof(sendbuffers));
  +#ifdef USE_EXPAT_PARSER
   	sstr->reserved2 = malloc(SIZEOFMODULEBUFFER);
   #endif
  +#endif
   
   	/*set up the read policy from the client.*/
   	if ((rc = ap_setup_client_block(req_rec, REQUEST_CHUNKED_ERROR)) != OK)
   	{
   		if (sstr->reserved1) free(sstr->reserved1); 
  +#ifdef USE_EXPAT_PARSER
           if (sstr->reserved2) free(sstr->reserved2); 
  +#endif
           free(sstr->so.http); 
           free(sstr); 
   
  @@ -346,7 +368,9 @@
   	if(0 != process_request(sstr))
   	{
   		if (sstr->reserved1) free(sstr->reserved1); 
  +#ifdef USE_EXPAT_PARSER
           if (sstr->reserved2) free(sstr->reserved2); 
  +#endif
           free(sstr->so.http); 
           free(sstr); 
   
  @@ -383,7 +407,11 @@
   	}
   	/*Free the array */
   	if (sstr->reserved1) free(sstr->reserved1);
  +
  +#ifdef USE_EXPAT_PARSER
   	if (sstr->reserved2) free(sstr->reserved2);
  +#endif
  +
   #endif
   
   	free(sstr);
  
  
  
  1.3       +2 -3      ws-axis/c/src/soap/SoapBinInputStream.cpp
  
  Index: SoapBinInputStream.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/soap/SoapBinInputStream.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- SoapBinInputStream.cpp	31 Mar 2004 12:20:03 -0000	1.2
  +++ SoapBinInputStream.cpp	1 Apr 2004 13:56:42 -0000	1.3
  @@ -47,8 +47,7 @@
   
   unsigned int SoapBinInputStream::readBytes(XMLByte* const toFill, const unsigned int maxToRead)
   {
  -	int nRead = 0;
  -	m_pReadFunct((const char**)toFill, (int*)&maxToRead, m_pContext);
  -    
  +	int nRead = maxToRead;
  +	m_pReadFunct((const char**)&toFill, (int*)&nRead, m_pContext);
   	return nRead;
   }
  
  
  
  1.2       +9 -6      ws-axis/c/src/soap/SoapParserXerces.cpp
  
  Index: SoapParserXerces.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/soap/SoapParserXerces.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SoapParserXerces.cpp	31 Mar 2004 12:20:02 -0000	1.1
  +++ SoapParserXerces.cpp	1 Apr 2004 13:56:42 -0000	1.2
  @@ -43,7 +43,7 @@
   int SoapParserXerces::SetInputStream(const Ax_soapstream* pInputStream)
   {
   	m_pInputStream = pInputStream;
  -	is = new SoapInputSource(m_pInputStream->transport.pGetFunct, m_pInputStream->str.ip_stream);
  +	is = new SoapInputSource(m_pInputStream->transport.pGetFunct, m_pInputStream);
   	//SoapInputSource is(m_pInputStream->transport.pGetFunct, m_pInputStream->str.ip_stream);
   	m_pParser->setContentHandler(&Xhandler);
   	//return m_pHandler->Success();
  @@ -75,9 +75,12 @@
   		firstParsed = true;
   	}
   
  -	m_pParser->parseNext(token);
  -
  -	return Xhandler.getAnyElement();
  -	//handler
  -	//return NULL;
  +	Xhandler.freeElement();
  +	while (true)
  +	{
  +		m_pParser->parseNext(token);
  +		AnyElement* elem = Xhandler.getAnyElement();
  +		if (elem) return elem;
  +		else if (AXIS_FAIL == Xhandler.GetStatus()) return NULL; 
  +	}
   }
  
  
  
  1.2       +1 -2      ws-axis/c/src/soap/SoapParserXerces.h
  
  Index: SoapParserXerces.h
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/soap/SoapParserXerces.h,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SoapParserXerces.h	31 Mar 2004 12:20:02 -0000	1.1
  +++ SoapParserXerces.h	1 Apr 2004 13:56:42 -0000	1.2
  @@ -58,13 +58,12 @@
   	void SetTransportStatus(AXIS_TRANSPORT_STATUS nStatus){ m_nTransportStatus = nStatus;};
   
   
  -
  +	const Ax_soapstream* m_pInputStream;
   
   private:
   	int m_nStatus;
   	SAX2XMLReader* m_pParser;
   	//SAXParser* m_pParser;
  -	const Ax_soapstream* m_pInputStream;
   	AXIS_TRANSPORT_STATUS m_nTransportStatus;
       XMLPScanToken token;
   	XercesHandler Xhandler;
  
  
  
  1.2       +22 -8     ws-axis/c/src/soap/XercesHandler.cpp
  
  Index: XercesHandler.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/soap/XercesHandler.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesHandler.cpp	31 Mar 2004 12:20:02 -0000	1.1
  +++ XercesHandler.cpp	1 Apr 2004 13:56:42 -0000	1.2
  @@ -18,6 +18,9 @@
   /*
    *	@author sanjaya singharage (sanjayas@opensource.lk)
    */
  +#ifdef WIN32
  +#pragma warning (disable : 4786)
  +#endif
   
   #include "XercesHandler.h"
   #include <xercesc/sax2/Attributes.hpp>
  @@ -26,7 +29,7 @@
   
   XercesHandler::XercesHandler()
   {
  -	test = 0;
  +	m_nStatus = AXIS_SUCCESS;
   	Nelement = (AnyElement*)malloc(sizeof (AnyElement));
   }
   
  @@ -36,8 +39,7 @@
   
   void XercesHandler::startElement(const XMLCh *const uri,const XMLCh *const localname,const XMLCh *const qname,const Attributes &attrs)
   {
  -	printf("%s", "in start element");
  -	test++;
  +	m_pCurrElement = Nelement;
   	Nelement->m_type = START_ELEMENT;
   	Nelement->m_pchNameOrValue = XMLString::transcode(localname);
   	Nelement->m_pchNamespace = XMLString::transcode(uri);
  @@ -51,7 +53,6 @@
   		nextattrindex += 3;
   	}
   	Nelement->m_pchAttributes[len*3]=NULL;
  -
   }
   
   const XML_Ch* XercesHandler::NS4Prefix(const XML_Ch* prefix)
  @@ -65,8 +66,7 @@
   
   void XercesHandler::characters(const XMLCh* const chars, const unsigned int length)
   {
  -	printf("%s", XMLString::transcode(chars));
  -	test++;
  +	m_pCurrElement = Nelement;
   	Nelement->m_type = CHARACTER_ELEMENT;
   	Nelement->m_pchNameOrValue = XMLString::transcode(chars);
   }
  @@ -79,12 +79,17 @@
   void XercesHandler::warning(const SAXParseException& exception)
   {}
   void XercesHandler::error(const SAXParseException& exception)
  -{}
  +{
  +	m_nStatus = AXIS_FAIL;
  +}
   void XercesHandler::fatalError(const SAXParseException& exception)
  -{}
  +{
  +	m_nStatus = AXIS_FAIL;
  +}
   
   void XercesHandler::endElement (const XMLCh *const uri,const XMLCh *const localname,const XMLCh *const qname)
   {
  +	m_pCurrElement = Nelement;
   	Nelement->m_type = END_ELEMENT;
   	Nelement->m_pchNameOrValue = XMLString::transcode(localname);
   	Nelement->m_pchNamespace = XMLString::transcode(uri);
  @@ -104,4 +109,13 @@
   	Nelement->m_type = END_PREFIX;
   	Nelement->m_pchNameOrValue = XMLString::transcode(prefix);
   	m_NsStack.erase(XMLString::transcode(prefix));
  +}
  +
  +void XercesHandler::freeElement()
  +{
  +	if (m_pCurrElement)
  +	{
  +		//free inner variables
  +		m_pCurrElement = 0;
  +	}
   }
  
  
  
  1.2       +14 -14    ws-axis/c/src/soap/XercesHandler.h
  
  Index: XercesHandler.h
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/soap/XercesHandler.h,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesHandler.h	31 Mar 2004 12:20:02 -0000	1.1
  +++ XercesHandler.h	1 Apr 2004 13:56:42 -0000	1.2
  @@ -34,6 +34,8 @@
   class XercesHandler : public XERCES_CPP_NAMESPACE::DefaultHandler
   {
   public :
  +	void freeElement();
  +	int GetStatus(){return m_nStatus;};
       // -----------------------------------------------------------------------
       //  Constructors
       // -----------------------------------------------------------------------
  @@ -41,6 +43,15 @@
       ~XercesHandler();
   
   
  +
  +	const XML_Ch* XercesHandler::NS4Prefix(const XML_Ch* prefix);
  +
  +	AnyElement* getAnyElement()
  +	{
  +		return m_pCurrElement;
  +	}
  +
  +private:
       // -----------------------------------------------------------------------
       //  Handlers for the SAX DocumentHandler interface
       // -----------------------------------------------------------------------
  @@ -60,21 +71,10 @@
       void error(const SAXParseException& exception);
       void fatalError(const SAXParseException& exception);
   
  -	const XML_Ch* XercesHandler::NS4Prefix(const XML_Ch* prefix);
  -
  -	int getTest()
  -	{
  -		return test;
  -	}
  -
  -	AnyElement* getAnyElement()
  -	{
  -		return Nelement;
  -	}
  -
  -private:
  -	int test;
  +	int m_nStatus;
   	AnyElement * Nelement;
  +	AnyElement * m_pCurrElement;
  +
   	map<AxisXMLString, AxisXMLString> m_NsStack;
   	void initAnyElement()
   	{