From b84e4789afba7394fd0a925c19ebdd6904ecaa8c Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Tue, 7 Oct 2008 22:11:11 +0200 Subject: [PATCH] msxml: Added CDATA related events handling. --- dlls/msxml3/saxreader.c | 77 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index 3e7e3326a23..4a98b4b95d8 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -1334,6 +1334,82 @@ static void libxmlFatalError(void *ctx, const char *msg, ...) This->ret = E_FAIL; } +static void libxmlCDataBlock(void *ctx, const xmlChar *value, int len) +{ + saxlocator *This = ctx; + HRESULT hr = S_OK; + xmlChar *beg = (xmlChar*)This->pParserCtxt->input->cur-len; + xmlChar *cur, *end; + int realLen; + BSTR Chars; + BOOL lastEvent = FALSE, change; + + while(memcmp(beg-9, "vbInterface && This->saxreader->vblexicalHandler) + hr = IVBSAXLexicalHandler_startCDATA(This->saxreader->vblexicalHandler); + if(!This->vbInterface && This->saxreader->lexicalHandler) + hr = ISAXLexicalHandler_startCDATA(This->saxreader->lexicalHandler); + + if(FAILED(hr)) + return format_error_message_from_id(This, hr); + + realLen = This->pParserCtxt->input->cur-beg-3; + cur = beg; + end = beg; + + while(1) + { + while(end-begvbInterface && This->saxreader->vbcontentHandler) || + (!This->vbInterface && This->saxreader->contentHandler)) + { + Chars = bstr_from_xmlCharN(cur, end-cur+1); + if(This->vbInterface) + hr = IVBSAXContentHandler_characters( + This->saxreader->vbcontentHandler, &Chars); + else + hr = ISAXContentHandler_characters( + This->saxreader->contentHandler, + Chars, SysStringLen(Chars)); + SysFreeString(Chars); + } + + if(change) *end = '\r'; + + if(lastEvent) + break; + + This->column += end-cur+2; + end += 2; + cur = end; + } + + if(This->vbInterface && This->saxreader->vblexicalHandler) + hr = IVBSAXLexicalHandler_endCDATA(This->saxreader->vblexicalHandler); + if(!This->vbInterface && This->saxreader->lexicalHandler) + hr = ISAXLexicalHandler_endCDATA(This->saxreader->lexicalHandler); + + if(FAILED(hr)) + format_error_message_from_id(This, hr); + + This->column += 4+end-cur; +} + /*** IVBSAXLocator interface ***/ /*** IUnknown methods ***/ static HRESULT WINAPI ivbsaxlocator_QueryInterface(IVBSAXLocator* iface, REFIID riid, void **ppvObject) @@ -2753,6 +2829,7 @@ HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj) reader->sax.comment = libxmlComment; reader->sax.error = libxmlFatalError; reader->sax.fatalError = libxmlFatalError; + reader->sax.cdataBlock = libxmlCDataBlock; *ppObj = &reader->lpVBSAXXMLReaderVtbl;