expatprs.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:22k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: expatprs.cpp,v 1.6.22.1 2004/07/19 21:04:07 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. //  $Id: expatprs.cpp,v 1.6.22.1 2004/07/19 21:04:07 hubbe Exp $
  50. #include "hlxclib/string.h"
  51. #include "hxtypes.h"
  52. #include "hxresult.h"
  53. #include "hxassert.h"
  54. #include "hxheap.h"
  55. #include "hxcom.h"
  56. #include "hxcomm.h"
  57. #include "hxfiles.h"
  58. #include "ihxpckts.h"
  59. #include "hxxml.h"
  60. #include "hxplugn.h"
  61. #include "xmlreslt.h"
  62. #include "hxxres.h"
  63. #include "hxxrsmg.h"
  64. #include "hxxml.ver"
  65. #include "xmlparse.h"
  66. #include "expatprs.h"
  67. #include "expatapi.h"
  68. #include "ctype.h"
  69. #include "hxperf.h"
  70. #ifdef _DEBUG
  71. #undef HX_THIS_FILE
  72. static const char HX_THIS_FILE[] = __FILE__;
  73. #endif
  74. #define MAX_ATTRIBUTE_SIZE 255
  75. HXExpatXMLParser::HXExpatXMLParser(IUnknown* pContext)
  76. : m_lRefCount(0)
  77. , m_pParser(NULL)
  78. , m_pResponse(NULL)
  79. , m_pContext(pContext)
  80. , m_pClassFactory(NULL)
  81. , m_pCurrentBuffer(NULL)
  82. , m_ulCurrentOffset(0)
  83. , m_pNSResp(NULL)
  84. , m_bInited(FALSE)
  85. {
  86.     m_pContext->AddRef();
  87.     m_pContext->QueryInterface(IID_IHXCommonClassFactory, 
  88. (void**)&m_pClassFactory);
  89. }
  90. HXExpatXMLParser::~HXExpatXMLParser()
  91. {
  92.     Close();
  93.     HX_RELEASE(m_pContext);
  94.     HX_RELEASE(m_pClassFactory);
  95. }
  96. /************************************************************************
  97.  *  IUnknown COM Interface Methods                          ref:  hxcom.h
  98.  */
  99. STDMETHODIMP 
  100. HXExpatXMLParser::QueryInterface(REFIID riid, void** ppvObj)
  101. {
  102.     if (IsEqualIID(riid, IID_IUnknown))
  103.     {
  104. AddRef();
  105. *ppvObj = this;
  106. return HXR_OK;
  107.     }
  108.     else if (IsEqualIID(riid, IID_IHXXMLParser))
  109.     {
  110. AddRef();
  111. *ppvObj = (IHXXMLParser*)this;
  112. return HXR_OK;
  113.     }
  114.     else if (IsEqualIID(riid, IID_IHXXMLNamespaceParser))
  115.     {
  116. AddRef();
  117. *ppvObj = (IHXXMLNamespaceParser*)this;
  118. return HXR_OK;
  119.     }
  120.     *ppvObj = NULL;
  121.     return HXR_NOINTERFACE;
  122. }
  123. STDMETHODIMP_(UINT32)
  124. HXExpatXMLParser::AddRef()
  125. {
  126.     return InterlockedIncrement(&m_lRefCount);
  127. }
  128. STDMETHODIMP_(UINT32)
  129. HXExpatXMLParser::Release()
  130. {
  131.     if (InterlockedDecrement(&m_lRefCount) > 0)
  132.     {
  133. return m_lRefCount;
  134.     }
  135.     delete this;
  136.     return 0;
  137. }
  138. /*
  139.  * IHXXMLNamespaceParser methods
  140.  */
  141. STDMETHODIMP
  142. HXExpatXMLParser::InitNamespaceParser(
  143.        IHXXMLParserResponse* /*IN*/  pResponse,
  144.        IHXXMLNamespaceResponse*      pNSResp,
  145.        const char*     /*IN*/    pEncoding,
  146.        const char       sepChar)
  147. {
  148.     HX_LOG_BLOCK( "HXExpatXMLParser::InitNamespaceParser" );
  149.     if (m_bInited)
  150.     {
  151. return HXR_UNEXPECTED;
  152.     }
  153.     HX_RESULT rc = HXR_OK;
  154.     if (pResponse)
  155.     {
  156. m_pResponse = pResponse;
  157. m_pResponse->AddRef();
  158.     }
  159.     if (pNSResp)
  160.     {
  161. m_pNSResp = pNSResp;
  162. m_pNSResp->AddRef();
  163.     }
  164.     m_cSepChar = sepChar;
  165.     if (pEncoding)
  166.     {
  167. m_pParser = XML_ParserCreateNS(pEncoding, sepChar);
  168.     }
  169.     else
  170.     {
  171. /* use iso-8859-1 by default */
  172. m_pParser = XML_ParserCreateNS("iso-8859-1", sepChar);
  173.     }
  174.     if (m_pParser == NULL)
  175.     {
  176. rc = HXR_OUTOFMEMORY;
  177.     }
  178.     if (SUCCEEDED(rc))
  179.     {
  180. XML_SetUserData(m_pParser, this);
  181. XML_SetElementHandler(m_pParser, ::handleStartElement, 
  182.     ::handleEndElement);
  183. XML_SetCharacterDataHandler(m_pParser, ::handleCharacterData);
  184. XML_SetProcessingInstructionHandler(m_pParser, 
  185.     ::handleProcessingInstruction);
  186. XML_SetCommentHandler(m_pParser, ::handleComment);
  187.     
  188. //XML_SetCdataSectionHandler(m_pParser, ::handleStartCdataSection,  
  189. //    ::handleEndCdataSection);
  190.     
  191. XML_SetCharacterDataHandler(m_pParser, ::handleCharacterData);
  192. XML_SetUnparsedEntityDeclHandler(m_pParser, ::handleUnparsedEntityDecl);
  193. XML_SetNotationDeclHandler(m_pParser, ::handleNotationDecl);
  194. XML_SetDefaultHandler(m_pParser, ::handleDefault);
  195. XML_SetNamespaceDeclHandler(m_pParser, ::handleStartNamespaceDecl,
  196. ::handleEndNamespaceDecl);
  197.     }
  198.     m_bInited = TRUE;
  199.     return rc;
  200. }
  201. STDMETHODIMP_(char)
  202. HXExpatXMLParser::GetSepChar()
  203. {
  204.     return m_cSepChar;
  205. }
  206. /*
  207.  * IHXXMLParser methods
  208.  */
  209. STDMETHODIMP
  210. HXExpatXMLParser::Init(IHXXMLParserResponse* /*IN*/  pResponse,
  211.        const char*     /*IN*/ pEncoding,
  212.        BOOL     /*IN*/ bStrict)
  213. {
  214.     HX_LOG_BLOCK( "HXExpatXMLParser::Init" );
  215.     if (m_bInited)
  216.     {
  217. return HXR_UNEXPECTED;
  218.     }
  219.     HX_RESULT rc = HXR_OK;
  220.     if (pResponse)
  221.     {
  222. m_pResponse = pResponse;
  223. m_pResponse->AddRef();
  224.     }
  225.     if (pEncoding)
  226.     {
  227. m_pParser = XML_ParserCreate(pEncoding);
  228.     }
  229.     else
  230.     {
  231. /* use iso-8859-1 by default */
  232. m_pParser = XML_ParserCreate("iso-8859-1");
  233.     }
  234.     if (m_pParser == NULL)
  235.     {
  236. rc = HXR_OUTOFMEMORY;
  237.     }
  238.     if (SUCCEEDED(rc))
  239.     {
  240. XML_SetUserData(m_pParser, this);
  241. XML_SetElementHandler(m_pParser, ::handleStartElement, 
  242.     ::handleEndElement);
  243. XML_SetCharacterDataHandler(m_pParser, ::handleCharacterData);
  244. XML_SetProcessingInstructionHandler(m_pParser, 
  245.     ::handleProcessingInstruction);
  246. XML_SetCommentHandler(m_pParser, ::handleComment);
  247.     
  248. //XML_SetCdataSectionHandler(m_pParser, ::handleStartCdataSection,  
  249. //    ::handleEndCdataSection);
  250.     
  251. XML_SetCharacterDataHandler(m_pParser, ::handleCharacterData);
  252. XML_SetUnparsedEntityDeclHandler(m_pParser, ::handleUnparsedEntityDecl);
  253. XML_SetNotationDeclHandler(m_pParser, ::handleNotationDecl);
  254. XML_SetDefaultHandler(m_pParser, ::handleDefault);
  255.     }
  256.     m_bInited = TRUE;
  257.     return rc;
  258. }
  259. STDMETHODIMP
  260. HXExpatXMLParser::Close()
  261. {
  262.     HX_RELEASE(m_pResponse);
  263.     HX_RELEASE(m_pNSResp);
  264.     HX_RELEASE(m_pCurrentBuffer);
  265.     m_ulCurrentOffset = 0;
  266.     m_bInited = FALSE;
  267.     if (m_pParser)
  268.     {
  269. XML_ParserFree(m_pParser);
  270. m_pParser = NULL;
  271.     }
  272.     return HXR_OK;
  273. }
  274. STDMETHODIMP
  275. HXExpatXMLParser::Parse(IHXBuffer* /*IN*/     pBuffer,
  276.  BOOL /*IN*/     bIsFinal)
  277. {
  278.     HX_LOG_BLOCK( "HXExpatXMLParser::Parse" );
  279.     if (m_pParser)
  280.     {
  281. if (m_pCurrentBuffer)
  282. {
  283.     m_ulCurrentOffset += m_pCurrentBuffer->GetSize();
  284.     HX_RELEASE(m_pCurrentBuffer);
  285. }
  286. m_pCurrentBuffer = pBuffer;
  287. m_pCurrentBuffer->AddRef();
  288. if (!XML_Parse(m_pParser, (const XML_Char*)m_pCurrentBuffer->GetBuffer(), 
  289. m_pCurrentBuffer->GetSize(), bIsFinal))
  290. {
  291.     XML_Error code = XML_GetErrorCode(m_pParser);
  292.     switch (code)
  293.     {
  294.     case XML_ERROR_NONE:
  295. return HXR_FAIL;
  296.     case XML_ERROR_NO_MEMORY:
  297. return HXR_OUTOFMEMORY;
  298.     case XML_ERROR_SYNTAX:
  299. return HXR_XML_SYNTAX;
  300.     case XML_ERROR_NO_ELEMENTS:
  301. return HXR_XML_NO_ELEMENTS;
  302. // we removed this error in favor of more specific errors
  303. //     case XML_ERROR_INVALID_TOKEN:
  304. // return HXR_XML_INVALID_TOKEN;
  305.     case XML_ERROR_UNCLOSED_TOKEN:
  306. return HXR_XML_UNCLOSED_TOKEN;
  307.     case XML_ERROR_PARTIAL_CHAR:
  308. return HXR_XML_PARTIAL_CHAR;
  309.     case XML_ERROR_TAG_MISMATCH:
  310. return HXR_XML_TAG_MISMATCH;
  311.     case XML_ERROR_DUPLICATE_ATTRIBUTE:
  312. // HXR_XML_DUPLICATE_ATTRIBUTE;
  313. return HXR_XML_DUPATTRIBUTE;
  314.     case XML_ERROR_JUNK_AFTER_DOC_ELEMENT:
  315. return HXR_XML_JUNK_AFTER_DOC_ELEMENT;
  316.     case XML_ERROR_PARAM_ENTITY_REF:
  317. return HXR_XML_PARAM_ENTITY_REF;
  318.     case XML_ERROR_UNDEFINED_ENTITY:
  319. return HXR_XML_UNDEFINED_ENTITY;
  320.     case XML_ERROR_RECURSIVE_ENTITY_REF:
  321. return HXR_XML_RECURSIVE_ENTITY_REF;
  322.     case XML_ERROR_ASYNC_ENTITY:
  323. return HXR_XML_ASYNC_ENTITY;
  324.     case XML_ERROR_BAD_CHAR_REF:
  325. return HXR_XML_BAD_CHAR_REF;
  326.     case XML_ERROR_BINARY_ENTITY_REF:
  327. return HXR_XML_BINARY_ENTITY_REF;
  328.     case XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF:
  329. return PNR_XML_ATTRIBUTE_EXTEHXAL_ENTITY_REF;
  330.     case XML_ERROR_MISPLACED_XML_PI:
  331. return HXR_XML_MISPLACED_XML_PI;
  332.     case XML_ERROR_UNKNOWN_ENCODING:
  333. return HXR_XML_UNKNOWN_ENCODING;
  334.     case XML_ERROR_INCORRECT_ENCODING:
  335. return HXR_XML_INCORRECT_ENCODING;
  336.     case XML_ERROR_UNCLOSED_CDATA_SECTION:
  337. return HXR_XML_UNCLOSED_CDATA_SECTION;
  338.     case XML_ERROR_EXTERNAL_ENTITY_HANDLING:
  339. return PNR_XML_EXTEHXAL_ENTITY_HANDLING;
  340.     case XML_ERROR_NOT_STANDALONE:
  341. return HXR_XML_NOT_STANDALONE;
  342.             case XML_ERROR_INVALID_NAME:
  343. return HXR_XML_INVALID_NAME;
  344.             case XML_ERROR_INVALID_CHAR_IN_DOC:
  345. return HXR_XML_INVALID_CHAR_IN_DOC;
  346.             case XML_ERROR_TWO_DASHES_NOT_ALLOWED_IN_COMMENT:
  347. return HXR_XML_TWO_DASHES_NOT_ALLOWED_IN_COMMENT;
  348.             case XML_ERROR_INVALID_DECL:
  349. return HXR_XML_INVALID_DECL;
  350.             case XML_ERROR_INVALID_PI: 
  351. return HXR_XML_INVALID_PI;
  352.             case XML_ERROR_INVALID_PI_TARGET: 
  353. return HXR_XML_INVALID_PI_TARGET;
  354.             case XML_ERROR_INVALID_CDATA: 
  355. return HXR_XML_INVALID_CDATA;
  356.             case XML_ERROR_NO_CLOSING_GT: 
  357. return HXR_XML_NO_CLOSING_GT;
  358.             case XML_ERROR_INVALID_HEX_CHAR_REF: 
  359. return HXR_XML_INVALID_HEX_CHAR_REF;
  360.             case XML_ERROR_INVALID_CHAR_REF: 
  361. return HXR_XML_INVALID_CHAR_REF;
  362.             case XML_ERROR_INVALID_REF: 
  363. return HXR_XML_INVALID_REF;
  364.             case XML_ERROR_MISSING_EQUALS: 
  365. return HXR_XML_MISSING_EQUALS;
  366.             case XML_ERROR_MISSING_QUOT_APOS: 
  367. // HXR_XML_MISSING_QUOT_APOS;
  368. return HXR_XML_MISSINGQUOTE;
  369.             case XML_ERROR_MISSING_REQ_SPACE: 
  370. return HXR_XML_MISSING_REQ_SPACE;
  371.             case XML_ERROR_LT_NOT_ALLOWED: 
  372. return HXR_XML_LT_NOT_ALLOWED;
  373.             case XML_ERROR_EXPECTED_GT: 
  374. return HXR_XML_EXPECTED_GT;
  375.             case XML_ERROR_INVALID_GT_AFFT_2_RSQB_IN_CONTENT: 
  376. return HXR_XML_INVALID_GT_AFFT_2_RSQB_IN_CONTENT;
  377.             case XML_ERROR_INVALID_COMMENT: 
  378. return HXR_XML_INVALID_COMMENT;
  379.     default:
  380. return HXR_XML_GENERALERROR;
  381.     }
  382. }
  383.     }
  384.     else
  385.     {
  386. return HXR_NOT_INITIALIZED;
  387.     }
  388.     return HXR_OK;
  389. }
  390. STDMETHODIMP
  391. HXExpatXMLParser::GetCurrentLineNumber(REF(ULONG32) /*OUT*/ ulLineNumber)
  392. {
  393.     if ( m_pParser )
  394.     {
  395. ulLineNumber = XML_GetCurrentLineNumber(m_pParser);
  396. return HXR_OK;
  397.     }
  398.     else
  399.     {
  400. return HXR_NOT_INITIALIZED;
  401.     }
  402. }
  403. STDMETHODIMP
  404. HXExpatXMLParser::GetCurrentColumnNumber(REF(ULONG32) /*OUT*/ ulColumnNumber)
  405. {
  406.     if ( m_pParser )
  407.     {
  408. ulColumnNumber = XML_GetCurrentLineNumber(m_pParser);
  409. return HXR_OK;
  410.     }
  411.     else
  412.     {
  413. return HXR_NOT_INITIALIZED;
  414.     }
  415. }
  416. STDMETHODIMP
  417. HXExpatXMLParser::GetCurrentByteIndex(REF(ULONG32) /*OUT*/ ulByteIndex)
  418. {
  419.     if ( m_pParser )
  420.     {
  421. ulByteIndex = XML_GetCurrentByteIndex(m_pParser);
  422. return HXR_OK;
  423.     }
  424.     else
  425.     {
  426. return HXR_NOT_INITIALIZED;
  427.     }
  428. }
  429. STDMETHODIMP
  430. HXExpatXMLParser::GetCurrentErrorText(REF(IHXBuffer*) /*OUT*/ pBuffer)
  431. {
  432.     XML_Error code = XML_GetErrorCode(m_pParser);
  433.     /* Returns a string describing the error. */
  434.     UINT32 ulByteIndex = XML_GetCurrentByteIndex(m_pParser);
  435.     UINT32 ulColumnNumber = XML_GetCurrentLineNumber(m_pParser);
  436.     
  437.     const UCHAR* pPos = m_pCurrentBuffer->GetBuffer();
  438.     if ( SUCCEEDED(m_pClassFactory->CreateInstance(CLSID_IHXBuffer, (void**)&pBuffer)) )
  439.     {
  440. const char p[] = "No error context";
  441. if (m_pCurrentBuffer)
  442. {
  443.     if (ulByteIndex >= m_ulCurrentOffset && 
  444. ulByteIndex < m_ulCurrentOffset + m_pCurrentBuffer->GetSize())
  445.     {
  446. int i;
  447. int offset = ulByteIndex - m_ulCurrentOffset;
  448. int startPos = offset;
  449. // first we will back the startPos up to the begining of the 
  450. // line or 0
  451. for (; startPos > 0 && pPos[startPos-1] != 'n' &&
  452.     pPos[startPos-1] != 'r'; --startPos);
  453. // if the beginning of the line number is > 40 characters 
  454. // ahead, we want to jump ahead so the error text is not too long.
  455. if (offset - startPos >= 40)
  456. {
  457.     startPos = offset - 40;
  458. }
  459. // now we will find the end of the line.
  460. for (i=startPos;  pPos[i] && pPos[i] != 'n' && 
  461. pPos[i] != 'r'; ++i);
  462. if (SUCCEEDED(pBuffer->Set(&pPos[startPos], i-startPos+1)))
  463. {
  464.     pBuffer->GetBuffer()[i-startPos] = '';
  465.     return HXR_OK;
  466. }
  467. else
  468. {
  469.     return HXR_OUTOFMEMORY;
  470. }
  471.     }
  472.     else
  473.     {
  474. return pBuffer->Set((const UCHAR*)p, sizeof(p));
  475.     }
  476. }
  477. else
  478. {
  479.     return pBuffer->Set((const UCHAR*)p, sizeof(p));
  480. }
  481.     }
  482.     else
  483.     {
  484. return HXR_FAIL;
  485.     }
  486. }
  487. void HXExpatXMLParser::handleStartElement(const XML_Char *name, const XML_Char **atts)
  488. {
  489.     HX_LOG_BLOCK( "HXExpatXMLParser::handleStartElement" );
  490.     
  491.     if (m_pResponse)
  492.     {
  493. IHXValues* pAtt = NULL;
  494. {
  495.     HX_LOG_BLOCK( "HXExpatXMLParser::handleStartElement::createIHXValues" );
  496.     IUnknown* pUnkAtt = NULL;
  497.     m_pClassFactory->CreateInstance(CLSID_IHXValues, (void**)&pUnkAtt);
  498.     pUnkAtt->QueryInterface(IID_IHXValues, (void**)&pAtt);
  499.     HX_RELEASE(pUnkAtt);
  500. }
  501. if (*atts && **atts) 
  502. {
  503.     HX_LOG_BLOCK( "HXExpatXMLParser::handleStartElement::createIHXBuffer" );
  504.     do
  505.     {
  506. IHXBuffer* pBuf = NULL;
  507. m_pClassFactory->CreateInstance(CLSID_IHXBuffer, (void**)&pBuf);
  508. pBuf->Set((const UCHAR*)atts[1], strlen(atts[1])+1);
  509. pAtt->SetPropertyCString(atts[0], pBuf);
  510. HX_RELEASE(pBuf);
  511.     }
  512.     while (*(atts+=2));
  513. }
  514. {
  515.     int ulLine;
  516.     int ulCol;
  517.     {
  518.         HX_LOG_BLOCK( "HXExpatXMLParser::handleStartElement::XML_GetCurrentLineNumber" );
  519. ulLine = XML_GetCurrentLineNumber(m_pParser);
  520.     }
  521.     {
  522.         HX_LOG_BLOCK( "HXExpatXMLParser::handleStartElement::XML_GetCurrentColumnNumber" );
  523. ulCol = XML_GetCurrentColumnNumber(m_pParser);
  524.     }
  525.     m_pResponse->HandleStartElement((const char*)name, pAtt, ulLine,ulCol);
  526. }
  527. HX_RELEASE(pAtt);
  528.     }
  529. }
  530. void HXExpatXMLParser::handleEndElement(const XML_Char *name)
  531. {
  532.     HX_LOG_BLOCK( "HXExpatXMLParser::handleEndElement" );
  533.     
  534.     if (m_pResponse)
  535.     {
  536. int ulLine = XML_GetCurrentLineNumber(m_pParser);
  537. int ulCol = XML_GetCurrentColumnNumber(m_pParser);
  538. m_pResponse->HandleEndElement((const char*)name, ulLine,ulCol);
  539.     }
  540. }
  541. void HXExpatXMLParser::handleCharacterData(const XML_Char *s, int len)
  542. {
  543.     if (m_pResponse)
  544.     {
  545. IHXBuffer* pBuf = NULL;
  546. m_pClassFactory->CreateInstance(CLSID_IHXBuffer, (void**)&pBuf);
  547. pBuf->Set((UCHAR*)s, len);
  548. int ulLine = XML_GetCurrentLineNumber(m_pParser);
  549. int ulCol = XML_GetCurrentColumnNumber(m_pParser);
  550. m_pResponse->HandleCharacterData(pBuf, ulLine,ulCol);
  551. HX_RELEASE(pBuf);
  552.     }
  553. }
  554. void HXExpatXMLParser::handleProcessingInstruction(
  555. const XML_Char *target, const XML_Char *data)
  556. {
  557.     if (m_pResponse)
  558.     {
  559. IHXValues* pAtt = NULL;
  560. IUnknown* pUnkAtt = NULL;
  561. m_pClassFactory->CreateInstance(CLSID_IHXValues, (void**)&pUnkAtt);
  562. pUnkAtt->QueryInterface(IID_IHXValues, (void**)&pAtt);
  563. HX_RELEASE(pUnkAtt);
  564. const char* pos = data;
  565. const char* pStartName = NULL;
  566. const char* pEndName = NULL;
  567. const char* pStartAtt = NULL;
  568. char cQuote = '"';
  569. const char* pEndAtt = NULL;
  570. for (;;)
  571. {
  572.     // eat white space
  573.     for(;*pos && isspace(*pos); ++pos);
  574.             // if we've reached the end, break out
  575.             if (*pos == '') break;
  576.     // get attribute name
  577.     for(pStartName = pos; *pos && !isspace(*pos) && 
  578.      *pos != '='; ++pos);
  579.     
  580.     // eat white space
  581.     for(pEndName = pos;*pos && isspace(*pos); ++pos);
  582.     // require equals sign
  583.     if (*pos++ != '=')
  584.      break;
  585.     // eat white space
  586.     for(;*pos && isspace(*pos); ++pos);
  587.     // get attribute value
  588.     if (*pos == ''' || *pos == '"')
  589.     {
  590.      cQuote = *pos++;
  591.     }
  592.     else
  593.     {
  594. break;
  595.     }
  596.     
  597.     for(pStartAtt = pos; *pos && *pos != cQuote;++pos);
  598.     pEndAtt = pos;
  599.             // Advance past the quote
  600.             ++pos;
  601.     // require a single whitespace or termination...
  602.     if (*pos != '' && !isspace(*pos))
  603.     {
  604.      break;
  605.     }
  606.     char* name = new char[pEndName-pStartName+1];
  607.     if (!name)
  608.     {
  609. break;
  610.     }
  611.     strncpy(name, pStartName, pEndName - pStartName); /* Flawfinder: ignore */
  612.     name[pEndName-pStartName] = '';
  613.     IHXBuffer* pBuf = NULL;
  614.     m_pClassFactory->CreateInstance(CLSID_IHXBuffer, 
  615.      (void**)&pBuf);
  616.     
  617.     if (!pBuf)
  618.     {
  619.      HX_VECTOR_DELETE(name);
  620. break;
  621.     }
  622.     if (FAILED(pBuf->Set((UCHAR*)pStartAtt,
  623.      pEndAtt-pStartAtt+1)))
  624.     {
  625.      HX_VECTOR_DELETE(name);
  626. HX_RELEASE(pBuf);
  627. break;
  628.     }
  629.     
  630.     pBuf->GetBuffer()[pEndAtt-pStartAtt] = '';
  631.     
  632.     if (FAILED(pAtt->SetPropertyCString(name, pBuf)))
  633.     {
  634.      HX_VECTOR_DELETE(name);
  635. HX_RELEASE(pBuf);
  636. break;
  637.     }
  638.     HX_RELEASE(pBuf);
  639.     HX_VECTOR_DELETE(name);
  640. }
  641. int ulLine = XML_GetCurrentLineNumber(m_pParser);
  642. int ulCol = XML_GetCurrentColumnNumber(m_pParser);
  643. m_pResponse->HandleProcessingInstruction(target, pAtt, ulLine,ulCol);
  644.         HX_RELEASE(pAtt);
  645.     }
  646. }
  647. void HXExpatXMLParser::handleComment(const XML_Char *data)
  648. {
  649.     if (m_pResponse)
  650.     {
  651. int ulLine = XML_GetCurrentLineNumber(m_pParser);
  652. int ulCol = XML_GetCurrentColumnNumber(m_pParser);
  653. m_pResponse->HandleComment((const char*) data, ulLine, ulCol);
  654.     }
  655. }
  656. void HXExpatXMLParser::handleStartCDataSection()
  657. {
  658. }
  659. void HXExpatXMLParser::handleEndCDataSection()
  660. {
  661. }
  662. void HXExpatXMLParser::handleDefault(const XML_Char *s, int len)
  663. {
  664.     if (m_pResponse)
  665.     {
  666. IHXBuffer* pBuf = NULL;
  667. m_pClassFactory->CreateInstance(CLSID_IHXBuffer, (void**)&pBuf);
  668. pBuf->Set((UCHAR*)s, len);
  669. int ulLine = XML_GetCurrentLineNumber(m_pParser);
  670. int ulCol = XML_GetCurrentColumnNumber(m_pParser);
  671. m_pResponse->HandleDefault(pBuf, ulLine, ulCol);
  672. HX_RELEASE (pBuf);
  673.     }
  674. }
  675. void HXExpatXMLParser::handleUnparsedEntityDecl(
  676.     const XML_Char *entityName,
  677.     const XML_Char *base,
  678.     const XML_Char *systemId,
  679.     const XML_Char *publicId,
  680.     const XML_Char *notationName)
  681. {
  682.     if (m_pResponse)
  683.     {
  684. // note ... call back interface missing *base
  685. int ulLine = XML_GetCurrentLineNumber(m_pParser);
  686. int ulCol = XML_GetCurrentColumnNumber(m_pParser);
  687. m_pResponse->HandleUnparsedEntityDecl(entityName,systemId, publicId,
  688.     notationName, ulLine, ulCol);
  689.     }
  690. }
  691. void HXExpatXMLParser::handleNotationDecl(
  692.       const XML_Char *notationName,
  693.       const XML_Char *base,
  694.       const XML_Char *systemId,
  695.       const XML_Char *publicId)
  696. {
  697.     if (m_pResponse)
  698.     {
  699. // note ... call back interface missing *base
  700. int ulLine = XML_GetCurrentLineNumber(m_pParser);
  701. int ulCol = XML_GetCurrentColumnNumber(m_pParser);
  702. m_pResponse->HandleNotationDecl(notationName, systemId, publicId,
  703.     ulLine, ulCol);
  704.     }
  705. }
  706. void HXExpatXMLParser::handleStartNamespaceDecl(
  707.       const XML_Char *prefix,
  708.       const XML_Char *uri)
  709. {
  710.     if (m_pNSResp)
  711.     {
  712. m_pNSResp->HandleStartNamespaceDecl(prefix, uri);
  713.     }
  714. }
  715. void HXExpatXMLParser::handleEndNamespaceDecl(const XML_Char *prefix)
  716. {
  717.     if (m_pNSResp)
  718.     {
  719. m_pNSResp->HandleEndNamespaceDecl(prefix);
  720.     }
  721. }
  722. int HXExpatXMLParser::handleNotStandalone()
  723. {
  724.     /* This is called if the document is not standalone (it has an
  725.      * external subset or a reference to a parameter entity, but does not
  726.      * have standalone="yes"). If this handler returns 0, then processing
  727.      * will not continue, and the parser will return a
  728.      * XML_ERROR_NOT_STANDALONE error.
  729.      */
  730.     return 1;
  731. }
  732. void HXExpatXMLParser::handleStartDoctypeDecl(const XML_Char *doctypeName)
  733. {
  734.     // note... no DTD callbacks...
  735. }
  736. void HXExpatXMLParser::handleEndDoctypeDecl()
  737. {
  738.     // note... no DTD callbacks...
  739. }