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 di...@apache.org on 2004/10/12 12:48:31 UTC

cvs commit: ws-axis/c/src/xml/xml4c ParserLoader.cpp SoapBinInputStream.cpp SoapBinInputStream.h SoapInputSource.cpp SoapInputSource.h XMLParserXerces.cpp XMLParserXerces.h XercesHandler.cpp XercesHandler.h

dicka       2004/10/12 03:48:31

  Added:       c/src/xml/xml4c ParserLoader.cpp SoapBinInputStream.cpp
                        SoapBinInputStream.h SoapInputSource.cpp
                        SoapInputSource.h XMLParserXerces.cpp
                        XMLParserXerces.h XercesHandler.cpp XercesHandler.h
  Log:
  Provision of XML4C XMLParser - This is basically the Xerces Parser abstraction layer
  
  Submitted by: Adrian Dick
  
  Revision  Changes    Path
  1.1                  ws-axis/c/src/xml/xml4c/ParserLoader.cpp
  
  Index: ParserLoader.cpp
  ===================================================================
  /*
   *   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.
   */
  
  /*
   * @author Susantha Kumara (skumara@virtusa.com)
   *
   */
  
  #include "XMLParserXerces.h"
  #include <xercesc/util/PlatformUtils.hpp>
  
  extern "C" {
  STORAGE_CLASS_INFO
  int CreateInstance(XMLParser **inst)
  {
  	/* TODO : Following initialization should be done within a function
  	          called by the library loader at loading time */
      XMLPlatformUtils::Initialize();
  	*inst = new XMLParserXerces();
  	if (*inst)
  	{
  		return AXIS_SUCCESS;
  	}
  	return AXIS_FAIL;
  }
  STORAGE_CLASS_INFO 
  int DestroyInstance(XMLParser *inst)
  {
  	if (inst)
  	{
  		delete inst;
  	/* TODO : Following uninitialization should be done within a function
  	          called by the library loader at unloading time */
  		XMLPlatformUtils::Terminate ();
  		return AXIS_SUCCESS;
  	}
  	return AXIS_FAIL;
  }
  }
  
  
  
  1.1                  ws-axis/c/src/xml/xml4c/SoapBinInputStream.cpp
  
  Index: SoapBinInputStream.cpp
  ===================================================================
  /*
   *   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.
   */
  
  /* SoapBinInputStream.cpp: implementation of the SoapBinInputStream class. */
  
  
  #include "SoapBinInputStream.h"
  
  SoapBinInputStream::SoapBinInputStream(AxisIOStream* pInputStream)
  {
      m_pInputStream = pInputStream;
      m_nByteCount = 0;
  }
  
  SoapBinInputStream::~SoapBinInputStream()
  {
  
  }
  
  /*
   * I dont really understand the use of this function
   */
  unsigned int SoapBinInputStream::curPos() const
  {
      return m_nByteCount;
  }
  
  unsigned int SoapBinInputStream::readBytes(XMLByte* const pcToFill,
                                             const unsigned int iMaxToRead)
  {
      int iRead = iMaxToRead;
  	m_pInputStream->getBytes((char*)pcToFill, &iRead);
  	m_nByteCount += iRead;
      return iRead;
  }
  
  
  
  1.1                  ws-axis/c/src/xml/xml4c/SoapBinInputStream.h
  
  Index: SoapBinInputStream.h
  ===================================================================
  /*
   *   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.
   */
  
  /* SoapBinInputStream.h: interface for the SoapBinInputStream class. */
  
  #if !defined(AXIS_SOAPBININPUTSTREAM_H__OF_AXIS_INCLUDED_)
  #define AXIS_SOAPBININPUTSTREAM_H__OF_AXIS_INCLUDED_
  
  #include <xercesc/util/BinInputStream.hpp>
  #include <axis/server/Packet.h>
  #include "../../transport/SOAPTransport.h"
  
  XERCES_CPP_NAMESPACE_USE
  AXIS_CPP_NAMESPACE_USE
  
  class SoapBinInputStream : public BinInputStream
  {
  public:
      SoapBinInputStream(AxisIOStream* pInputStream);
      virtual ~SoapBinInputStream();
      unsigned int curPos() const;
      unsigned int readBytes(XMLByte* const pcToFill, const unsigned int iMaxToRead);
  private:
      unsigned int m_nByteCount;
      AxisIOStream* m_pInputStream;
  };
  
  #endif
  
  
  
  1.1                  ws-axis/c/src/xml/xml4c/SoapInputSource.cpp
  
  Index: SoapInputSource.cpp
  ===================================================================
  /*
   *   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.
   */
  
  /* SoapInputSource.cpp: implementation of the SoapInputSource class. */
  
  #include "SoapInputSource.h"
  
  SoapInputSource::SoapInputSource(AxisIOStream* pInputStream)
  {
      m_pInputStream = new SoapBinInputStream(pInputStream);
  }
  
  SoapInputSource::~SoapInputSource()
  {
  	/* do not delete the m_pInputStream. See Xerces documentation */
  }
  
  BinInputStream* SoapInputSource::makeStream() const
  {
      return m_pInputStream;
  }
  
  
  
  1.1                  ws-axis/c/src/xml/xml4c/SoapInputSource.h
  
  Index: SoapInputSource.h
  ===================================================================
  /*
   *   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.
   */
  
  /*
   *    @author sanjaya singharage (sanjayas@opensource.lk)
   */
  
  #if !defined(AXIS_SOAPINPUTSOURCE_H__OF_AXIS_INCLUDED_)
  #define AXIS_SOAPINPUTSOURCE_H__OF_AXIS_INCLUDED_
  
  #include <xercesc/sax/InputSource.hpp>
  #include "SoapBinInputStream.h"
  
  XERCES_CPP_NAMESPACE_USE
  
  class SoapInputSource : public InputSource  
  {
  private:
      SoapBinInputStream* m_pInputStream;
  public:
      SoapInputSource(AxisIOStream* pInputStream);
      virtual ~SoapInputSource();
      BinInputStream* makeStream() const;
  };
  
  #endif
  
  
  
  1.1                  ws-axis/c/src/xml/xml4c/XMLParserXerces.cpp
  
  Index: XMLParserXerces.cpp
  ===================================================================
  /*
   *   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.
   */
  
  /*
   * @author sanjaya singharage (sanjayas@opensource.lk)
   */
  
  
  #ifdef WIN32
  #pragma warning (disable : 4786)
  #pragma warning (disable : 4101)
  #endif
  
  #include "XMLParserXerces.h"
  #include <xercesc/sax2/XMLReaderFactory.hpp>
  
  XERCES_CPP_NAMESPACE_USE
  
  XMLParserXerces::XMLParserXerces()
  {
      m_bFirstParsed = false;
      m_pParser = XMLReaderFactory::createXMLReader();
      m_pInputSource = NULL;
  }
  
  XMLParserXerces::~XMLParserXerces()
  {
      //Samisa - Parser has memory allocated with the last AnyElement parsed; clean that
      m_Xhandler.freeElement();
  
      if(m_pInputSource)
          delete m_pInputSource;
      delete m_pParser;
      
  }
  
  int XMLParserXerces::setInputStream(AxisIOStream* pInputStream)
  {
      m_pInputStream = pInputStream;
      //check if memeory is already allocated for is
      if(m_pInputSource)
          delete m_pInputSource;
      
      m_pInputSource = new SoapInputSource(pInputStream);
  	m_Xhandler.reset();
      m_pParser->setContentHandler(&m_Xhandler);
       if (m_bFirstParsed)
      {
          m_pParser->parseReset(m_ScanToken);
          m_bFirstParsed = false;
      }
     /* return m_pHandler->Success(); */
      return AXIS_SUCCESS;
  }
  
  const XML_Ch* XMLParserXerces::getNS4Prefix(const XML_Ch* prefix)
  {
      return m_Xhandler.ns4Prefix(prefix);
  }
  
  int XMLParserXerces::getStatus()
  {
      return m_Xhandler.getStatus();
  }
  
  const AnyElement* XMLParserXerces::next(bool isCharData)
  {
      bool bCanParseMore = false;
          if(!m_bFirstParsed)
          {
              m_pParser->parseFirst(*m_pInputSource, m_ScanToken);
              m_bFirstParsed = true;
          }
  
          m_Xhandler.freeElement();
          while (true)
          {
              AnyElement* elem = m_Xhandler.getAnyElement();
              if (!elem)
              {
                  bCanParseMore = m_pParser->parseNext(m_ScanToken);
                  elem = m_Xhandler.getAnyElement();
              }
              if (elem)
              {
                  if (!isCharData && (CHARACTER_ELEMENT == elem->m_type))
                  { /* ignorable white space */
                      m_Xhandler.freeElement();
                      continue;
                  }
                  return elem;
              }
              else if (AXIS_FAIL == m_Xhandler.getStatus()) return NULL;
              else if (!bCanParseMore) return NULL;
          }
  }
  
  const AnyElement* XMLParserXerces::anyNext()
  {
      bool bCanParseMore = false;
  		/* 
  		 * Say the SAX event handler to record prefix mappings too 
  		 * By default the event handler do not record them.
  		 */
  		m_Xhandler.setGetPrefixMappings(true);
          if(!m_bFirstParsed)
          {
              m_pParser->parseFirst(*m_pInputSource, m_ScanToken);
              m_bFirstParsed = true;
          }
  
          m_Xhandler.freeElement();
          while (true)
          {
              AnyElement* elem = m_Xhandler.getAnyElement();
              if (!elem)
              {
                  bCanParseMore = m_pParser->parseNext(m_ScanToken);
                  elem = m_Xhandler.getAnyElement();
              }
              if (elem)
              {
  				m_Xhandler.setGetPrefixMappings(false);
                  return elem;
              }
              else if (AXIS_FAIL == m_Xhandler.getStatus()) return NULL;
              else if (!bCanParseMore) return NULL;
          }
  }
  
  const XML_Ch* XMLParserXerces::getPrefix4NS(const XML_Ch* pcNS)
  {
      return m_Xhandler.prefix4NS(pcNS);
  }
  
  
  
  
  1.1                  ws-axis/c/src/xml/xml4c/XMLParserXerces.h
  
  Index: XMLParserXerces.h
  ===================================================================
  /*
   *   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.
   */
  
  /*
   *    @author sanjaya singharage (sanjayas@opensource.lk)
   */
  
  
  #ifdef WIN32
  #pragma warning (disable : 4786)
  #endif
  
  #if !defined(__XMLPARSERXERCES_H_OF_AXIS_INCLUDED__)
  #define __XMLPARSERXERCES_H_OF_AXIS_INCLUDED__
  
  #include <axis/server/Packet.h>
  #include "../QName.h"
  #include "../Event.h"
  #include "../XMLParser.h"
  #include "XercesHandler.h"
  
  #include <xercesc/sax2/SAX2XMLReader.hpp>
  #include <xercesc/parsers/SAXParser.hpp>
  #include <xercesc/framework/XMLPScanToken.hpp>
  #include "SoapInputSource.h"
  #include "../AxisParseException.h"
  
  XERCES_CPP_NAMESPACE_USE
  
  class XMLParserXerces: public XMLParser
  {
  
  public:
      XMLParserXerces();
      ~XMLParserXerces();
  
      int setInputStream(AxisIOStream* pInputStream);
      const XML_Ch* getNS4Prefix(const XML_Ch* pcPrefix);
      int getStatus();
      const AnyElement* next(bool bIsCharData=false);
      const AnyElement* anyNext();
      const XML_Ch* getPrefix4NS(const XML_Ch* pcNS);
  
  private:
      SAX2XMLReader* m_pParser;
      XMLPScanToken m_ScanToken;
      XercesHandler m_Xhandler;
      bool m_bFirstParsed;
      SoapInputSource* m_pInputSource;
  
  
  };
  
  #endif
  
  
  
  1.1                  ws-axis/c/src/xml/xml4c/XercesHandler.cpp
  
  Index: XercesHandler.cpp
  ===================================================================
  /*
   *   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.
   */
  
  /*
   * @author sanjaya singharage (sanjayas@opensource.lk)
   * @author Susantha Kumara (susantha@opensource.lk, skumara@virtusa.com)
   */
  #ifdef WIN32
  #pragma warning (disable : 4786)
  #endif
  
  #include "XercesHandler.h"
  #include <xercesc/sax2/Attributes.hpp>
  #include <stdio.h>
  
  
  XercesHandler::XercesHandler()
  {
      m_nStatus = AXIS_SUCCESS;
  	m_pCurrElement = 0;
      m_pNextElement = (AnyElement*)malloc(sizeof (AnyElement));
  	m_pPrefixMappingElement = (AnyElement*)malloc(sizeof (AnyElement));
      m_bEndElementFollows = false;
      m_pNextElement->m_pchNameOrValue = 0;
      m_pNextElement->m_pchNamespace = 0;
  	m_pNextElement->m_pchAttributes[0] = 0;
      m_pPrefixMappingElement->m_pchNameOrValue = 0;
      m_pPrefixMappingElement->m_pchNamespace = 0;
  	m_pPrefixMappingElement->m_pchAttributes[0] = 0;
  	m_bGetPrefixMappings = false;
  	m_bStartElementWaiting = false;
  }
  
  XercesHandler::~XercesHandler()
  {
  	delete m_pNextElement;
  	delete m_pPrefixMappingElement;
  }
  
  void XercesHandler::startElement(const XMLCh *const uri,const XMLCh *const 
                                   localname,const XMLCh *const qname,
                                   const Attributes &attrs)
  {
      m_pCurrElement = m_pNextElement;
      m_pNextElement->m_type = START_ELEMENT;
      m_pNextElement->m_pchNameOrValue = XMLString::transcode(localname);
      m_pNextElement->m_pchNamespace = XMLString::transcode(uri);
      
      unsigned int len = attrs.getLength();
      unsigned int index;
      unsigned int i = 0;
      for (index = 0; index < len*3; index+=3)
      {    
          m_pNextElement->m_pchAttributes[index] = 
              XMLString::transcode(attrs.getLocalName(i));
          m_pNextElement->m_pchAttributes[index+1] = 
              XMLString::transcode(attrs.getURI(i));
          m_pNextElement->m_pchAttributes[index+2] = 
              XMLString::transcode(attrs.getValue(i));
          i++;
      }
      m_pNextElement->m_pchAttributes[len*3]=NULL;
  }
  
  const XML_Ch* XercesHandler::ns4Prefix(const XML_Ch* prefix)
  {
      if (m_NsStack.find(prefix) != m_NsStack.end())
      {
          return m_NsStack[prefix].c_str();
      }
      return NULL;
  }
  
  const XML_Ch* XercesHandler::prefix4NS(const XML_Ch* pcNS)
  {
      for (map<AxisXMLString, AxisXMLString>::iterator it=m_NsStack.begin();
           it!=m_NsStack.end(); it++)
      {
          if ((*it).second == pcNS)
          {
              return (*it).first.c_str();
          }
      }
      return 0;
  }
      
  void XercesHandler::characters(const XMLCh* const chars, 
                                 const unsigned int length)
  {
      m_pCurrElement = m_pNextElement;
      m_pNextElement->m_type = CHARACTER_ELEMENT;
      m_pNextElement->m_pchNameOrValue = XMLString::transcode(chars);
  }
  void XercesHandler::ignorableWhitespace(const XMLCh* const chars, 
                                          const unsigned int length)
  {}
  void XercesHandler::resetDocument()
  {}
  
  
  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)
  {
      if (m_pCurrElement && (START_ELEMENT == m_pCurrElement->m_type))
      /* it seems that both startElement and endElemen events fired within a
      single parseNext call */
      {
          m_bEndElementFollows = true;
          return;
      }
      m_pCurrElement = m_pNextElement;
      m_pNextElement->m_type = END_ELEMENT;
      m_pNextElement->m_pchNameOrValue = XMLString::transcode(localname);
      m_pNextElement->m_pchNamespace = XMLString::transcode(uri);
      m_pNextElement->m_pchAttributes[0] = NULL;
  }
  
  void XercesHandler::startPrefixMapping(const XMLCh* const prefix,
                                         const XMLCh* const uri)
  {
  	char* pchPrefix = XMLString::transcode(prefix);
  	char* pchUri = XMLString::transcode(uri);
      m_NsStack[pchPrefix] = pchUri;
  	/* Store only if interested in prefix mappings */
  	if (m_bGetPrefixMappings)
  	{
  		m_CurrPrefixMappings[pchPrefix] = pchUri;
  	}
  	else
  	{
  		XMLString::release(&pchPrefix);
  		XMLString::release(&pchUri);
  	}
  }
  
  void XercesHandler::endPrefixMapping(const XMLCh* const prefix)
  {
  	/* we are not interested in end prefix mapping events in any case */
      char* pchPrefix = XMLString::transcode(prefix);
      m_NsStack.erase(pchPrefix);
  	XMLString::release(&pchPrefix);
  }
  
  void XercesHandler::freeElement()
  {
      if (m_pCurrElement)
      {
          if (m_bEndElementFollows)
          /* free only attributes list if available. Next time 
  		 * the same m_pNextElement is freed.
  		 */
          {
              m_bEndElementFollows = false;
              m_pCurrElement->m_type = END_ELEMENT;
  			freeAttributes();
              m_pCurrElement->m_pchAttributes[0] = NULL;
          }
          else
          /* free all inner strings */
          {
  			if (m_pCurrElement->m_pchNameOrValue)
  			{
  				XMLString::release(const_cast<char**>(&(m_pCurrElement->
  					m_pchNameOrValue)));
  				m_pCurrElement->m_pchNameOrValue = 0;
  			}
  			if (m_pCurrElement->m_pchNamespace)
  			{
  				XMLString::release(const_cast<char**>(&(m_pCurrElement->
  					m_pchNamespace)));
  				m_pCurrElement->m_pchNamespace = 0;
  			}
  			freeAttributes();
              m_pCurrElement = 0;
          }
      }
  }
  
  void XercesHandler::freeAttributes()
  {
  	for (int x=0; m_pCurrElement->m_pchAttributes[x]; x+=3)
  	{
  		if (m_pCurrElement->m_pchAttributes[x])
  		{
  			XMLString::release(const_cast<char**>(&(m_pCurrElement->
  				m_pchAttributes[x])));
  			m_pCurrElement->m_pchAttributes[x] = 0;
  			if (m_pCurrElement->m_pchAttributes[x+1])
  				XMLString::release(const_cast<char**>(&(m_pCurrElement->
  				m_pchAttributes[x+1])));
  			if (m_pCurrElement->m_pchAttributes[x+2])
  				XMLString::release(const_cast<char**>(&(m_pCurrElement->
  				m_pchAttributes[x+2])));
  		}
  	}
  }
  
  AnyElement* XercesHandler::getAnyElement()
  {
  	if (m_bGetPrefixMappings)
  	{
  		if (m_CurrPrefixMappings.size() > 0)
  		{
  			map<const AxisChar*, const AxisChar*>::iterator it = 
  				m_CurrPrefixMappings.begin();
  			m_pPrefixMappingElement->m_pchNameOrValue = (*it).first;
  			m_pPrefixMappingElement->m_pchNamespace = (*it).second;
  			m_pPrefixMappingElement->m_type = START_PREFIX;
  			m_CurrPrefixMappings.erase(it);
  			m_pCurrElement = m_pPrefixMappingElement;
  			m_bStartElementWaiting = true;
  		}
  		else if (m_bStartElementWaiting)
  		{
  			m_pCurrElement = m_pNextElement;
  			m_bStartElementWaiting = false;
  		}
  	}
  	return m_pCurrElement;
  }
  
  void XercesHandler::setGetPrefixMappings(bool bValue)
  {
  	m_bGetPrefixMappings = bValue;
  }
  
  
  void XercesHandler::reset()
  {
      m_nStatus = AXIS_SUCCESS;
      m_bEndElementFollows = false;
      m_pCurrElement = m_pNextElement;
  	freeElement();
  	m_pCurrElement = m_pPrefixMappingElement;
  	freeElement();
  	m_bGetPrefixMappings = false;
  	m_bStartElementWaiting = false;	
  	m_pCurrElement = 0;
  	if (m_CurrPrefixMappings.size() > 0)
  	{
  		map<const AxisChar*, const AxisChar*>::iterator it = 
  			m_CurrPrefixMappings.begin();
  		XMLString::release(const_cast<char**>(&((*it).first)));
  		XMLString::release(const_cast<char**>(&((*it).second)));
  		m_CurrPrefixMappings.erase(it);
  	}
  }
  
  
  
  
  
  1.1                  ws-axis/c/src/xml/xml4c/XercesHandler.h
  
  Index: XercesHandler.h
  ===================================================================
  /*
   *   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.
   */
  
  /*
   *    @author sanjaya singharage (sanjayas@opensource.lk)
   */
  
  #include <xercesc/sax/HandlerBase.hpp>
  #include <xercesc/sax2/DefaultHandler.hpp>
  #include "../AnyElement.h"
  #include <stdlib.h>
  #include <map>
  #include <string>
  #include <axis/server/GDefine.h>
  
  XERCES_CPP_NAMESPACE_USE
  
  using namespace std;
  
  class XercesHandler : public XERCES_CPP_NAMESPACE::DefaultHandler
  {
  public :
      void freeElement();
      inline int getStatus(){return m_nStatus;};
      XercesHandler();
      ~XercesHandler();
      const XML_Ch* ns4Prefix(const XML_Ch* prefix);
      const XML_Ch* prefix4NS(const XML_Ch* pcNS);
      AnyElement* getAnyElement();
  	void setGetPrefixMappings(bool bValue);
  	void reset();
  
  private:
      /* -----------------------------------------------------------------------
       *  Handlers for the SAX DocumentHandler interface
       * -----------------------------------------------------------------------
       */
      void startElement(const XMLCh *const uri,const XMLCh *const localname,
          const XMLCh *const qname,const Attributes &attrs);
      void endElement (const XMLCh *const uri,const XMLCh *const localname,
          const XMLCh *const qname);
      void characters(const XMLCh* const chars, const unsigned int length);
      void startPrefixMapping(const XMLCh* const prefix, const XMLCh* const uri);
      void endPrefixMapping(const XMLCh* const prefix);
      void ignorableWhitespace(const XMLCh* const chars, 
          const unsigned int length);
      void resetDocument();
  
  
      /* -----------------------------------------------------------------------
       *  Implementations of the SAX ErrorHandler interface
       * -----------------------------------------------------------------------
       */
      void warning(const SAXParseException& exception);
      void error(const SAXParseException& exception);
      void fatalError(const SAXParseException& exception);
  
      int m_nStatus;
  	bool m_bEndElementFollows;
      AnyElement* m_pNextElement;
      AnyElement* m_pPrefixMappingElement;
      AnyElement* m_pCurrElement;
      map<AxisXMLString, AxisXMLString> m_NsStack;
  	map<const AxisChar*, const AxisChar*> m_CurrPrefixMappings;
  	bool m_bGetPrefixMappings;
  	bool m_bStartElementWaiting;
  	void freeAttributes();
  };