Piotr Caban : msxml3: Prepare libxml2 callbacks for IVBSAX... interfaces implementation.
Alexandre Julliard
julliard at winehq.org
Fri Aug 1 05:33:49 CDT 2008
Module: wine
Branch: master
Commit: c52e0919fb6e2f6809346e82d2f6a49c7f5daeeb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c52e0919fb6e2f6809346e82d2f6a49c7f5daeeb
Author: Piotr Caban <piotr.caban at gmail.com>
Date: Thu Jul 31 16:48:03 2008 +0200
msxml3: Prepare libxml2 callbacks for IVBSAX... interfaces implementation.
---
dlls/msxml3/saxreader.c | 94 ++++++++++++++++++++++++++++++++++++-----------
1 files changed, 72 insertions(+), 22 deletions(-)
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index facd962..cfee18d 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -52,7 +52,9 @@ typedef struct _saxreader
const struct ISAXXMLReaderVtbl *lpSAXXMLReaderVtbl;
LONG ref;
struct ISAXContentHandler *contentHandler;
+ struct IVBSAXContentHandler *vbcontentHandler;
struct ISAXErrorHandler *errorHandler;
+ struct IVBSAXErrorHandler *vberrorHandler;
xmlSAXHandler sax;
} saxreader;
@@ -69,6 +71,7 @@ typedef struct _saxlocator
xmlChar *lastCur;
int line;
int column;
+ BOOL vbInterface;
} saxlocator;
typedef struct _saxattributes
@@ -152,8 +155,15 @@ static void format_error_message_from_id(saxlocator *This, HRESULT hr)
msg[0] = '\0';
}
- ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
- (ISAXLocator*)&This->lpSAXLocatorVtbl, msg, hr);
+ if(This->vbInterface)
+ {
+ BSTR bstrMsg = SysAllocString(msg);
+ IVBSAXErrorHandler_fatalError(This->saxreader->vberrorHandler,
+ (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl, &bstrMsg, hr);
+ }
+ else
+ ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
+ (ISAXLocator*)&This->lpSAXLocatorVtbl, msg, hr);
}
}
@@ -848,7 +858,11 @@ static void libxmlStartDocument(void *ctx)
if(This->saxreader->contentHandler)
{
- hr = ISAXContentHandler_startDocument(This->saxreader->contentHandler);
+ if(This->vbInterface)
+ hr = IVBSAXContentHandler_startDocument(This->saxreader->vbcontentHandler);
+ else
+ hr = ISAXContentHandler_startDocument(This->saxreader->contentHandler);
+
if(hr != S_OK)
format_error_message_from_id(This, hr);
}
@@ -868,7 +882,11 @@ static void libxmlEndDocument(void *ctx)
if(This->saxreader->contentHandler)
{
- hr = ISAXContentHandler_endDocument(This->saxreader->contentHandler);
+ if(This->vbInterface)
+ hr = IVBSAXContentHandler_endDocument(This->saxreader->vbcontentHandler);
+ else
+ hr = ISAXContentHandler_endDocument(This->saxreader->contentHandler);
+
if(hr != S_OK)
format_error_message_from_id(This, hr);
}
@@ -901,12 +919,18 @@ static void libxmlStartElementNS(
hr = SAXAttributes_create(&attr, nb_attributes, attributes);
if(hr == S_OK)
{
- hr = ISAXContentHandler_startElement(
- This->saxreader->contentHandler,
- NamespaceUri, SysStringLen(NamespaceUri),
- LocalName, SysStringLen(LocalName),
- QName, SysStringLen(QName),
- (ISAXAttributes*)&attr->lpSAXAttributesVtbl);
+ if(This->vbInterface)
+ hr = IVBSAXContentHandler_startElement(
+ This->saxreader->vbcontentHandler,
+ &NamespaceUri, &LocalName, &QName,
+ (IVBSAXAttributes*)&attr->lpVBSAXAttributesVtbl);
+ else
+ hr = ISAXContentHandler_startElement(
+ This->saxreader->contentHandler,
+ NamespaceUri, SysStringLen(NamespaceUri),
+ LocalName, SysStringLen(LocalName),
+ QName, SysStringLen(QName),
+ (ISAXAttributes*)&attr->lpSAXAttributesVtbl);
ISAXAttributes_Release((ISAXAttributes*)&attr->lpSAXAttributesVtbl);
}
@@ -941,11 +965,16 @@ static void libxmlEndElementNS(
LocalName = bstr_from_xmlChar(localname);
QName = bstr_from_xmlChar(localname);
- hr = ISAXContentHandler_endElement(
- This->saxreader->contentHandler,
- NamespaceUri, SysStringLen(NamespaceUri),
- LocalName, SysStringLen(LocalName),
- QName, SysStringLen(QName));
+ if(This->vbInterface)
+ hr = IVBSAXContentHandler_endElement(
+ This->saxreader->vbcontentHandler,
+ &NamespaceUri, &LocalName, &QName);
+ else
+ hr = ISAXContentHandler_endElement(
+ This->saxreader->contentHandler,
+ NamespaceUri, SysStringLen(NamespaceUri),
+ LocalName, SysStringLen(LocalName),
+ QName, SysStringLen(QName));
SysFreeString(NamespaceUri);
SysFreeString(LocalName);
@@ -1011,7 +1040,14 @@ static void libxmlCharacters(
}
else if(*end == '\r') Chars[end-This->lastCur] = '\n';
- hr = ISAXContentHandler_characters(This->saxreader->contentHandler, Chars, end-This->lastCur+1);
+ if(This->vbInterface)
+ hr = IVBSAXContentHandler_characters(
+ This->saxreader->vbcontentHandler, &Chars);
+ else
+ hr = ISAXContentHandler_characters(
+ This->saxreader->contentHandler,
+ Chars, end-This->lastCur+1);
+
SysFreeString(Chars);
if(hr != S_OK)
{
@@ -1040,8 +1076,14 @@ static void libxmlSetDocumentLocator(
saxlocator *This = ctx;
HRESULT hr;
- hr = ISAXContentHandler_putDocumentLocator(This->saxreader->contentHandler,
- (ISAXLocator*)&This->lpSAXLocatorVtbl);
+ if(This->vbInterface)
+ hr = IVBSAXContentHandler_putref_documentLocator(
+ This->saxreader->vbcontentHandler,
+ (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl);
+ else
+ hr = ISAXContentHandler_putDocumentLocator(
+ This->saxreader->contentHandler,
+ (ISAXLocator*)&This->lpSAXLocatorVtbl);
if(FAILED(hr))
format_error_message_from_id(This, hr);
@@ -1072,8 +1114,15 @@ void libxmlFatalError(void *ctx, const char *msg, ...)
wszError = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*len);
MultiByteToWideChar(CP_ACP, 0, message, -1, (LPWSTR)wszError, len);
- ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
- (ISAXLocator*)&This->lpSAXLocatorVtbl, wszError, E_FAIL);
+ if(This->vbInterface)
+ {
+ BSTR bstrError = SysAllocString(wszError);
+ IVBSAXErrorHandler_fatalError(This->saxreader->vberrorHandler,
+ (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl, &bstrError, E_FAIL);
+ }
+ else
+ ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
+ (ISAXLocator*)&This->lpSAXLocatorVtbl, wszError, E_FAIL);
HeapFree(GetProcessHeap(), 0, wszError);
@@ -1213,7 +1262,7 @@ static const struct ISAXLocatorVtbl isaxlocator_vtbl =
isaxlocator_getSystemId
};
-static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator)
+static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator, BOOL vbInterface)
{
saxlocator *locator;
@@ -1223,6 +1272,7 @@ static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator)
locator->lpSAXLocatorVtbl = &isaxlocator_vtbl;
locator->ref = 1;
+ locator->vbInterface = vbInterface;
locator->saxreader = reader;
ISAXXMLReader_AddRef((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
@@ -1814,7 +1864,7 @@ static HRESULT parse_buffer(saxreader *This, const char *buffer, int size)
saxlocator *locator;
HRESULT hr;
- hr = SAXLocator_create(This, &locator);
+ hr = SAXLocator_create(This, &locator, FALSE);
if(FAILED(hr))
return E_FAIL;
More information about the wine-cvs
mailing list