Module: wine Branch: master Commit: b84e4789afba7394fd0a925c19ebdd6904ecaa8c URL: http://source.winehq.org/git/wine.git/?a=commit;h=b84e4789afba7394fd0a925c19...
Author: Piotr Caban piotr.caban@gmail.com Date: Tue Oct 7 22:11:11 2008 +0200
msxml: Added CDATA related events handling.
---
dlls/msxml3/saxreader.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 77 insertions(+), 0 deletions(-)
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index 3e7e332..4a98b4b 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, "<![CDATA[", sizeof(char[9]))) beg--; + update_position(This, beg); + + if(This->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-beg<realLen && *end!='\r') end++; + if(end-beg==realLen) + { + end--; + lastEvent = TRUE; + } + else if(end-beg==realLen-1 && *end=='\r' && *(end+1)=='\n') + lastEvent = TRUE; + + if(*end == '\r') change = TRUE; + else change = FALSE; + + if(change) *end = '\n'; + + if((This->vbInterface && 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;