expatprs.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:21k
源码类别:

Symbian

开发平台:

C/C++

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