Piotr Caban : msxml3: Add error handling.

Alexandre Julliard julliard at winehq.org
Mon Jul 21 08:51:38 CDT 2008


Module: wine
Branch: master
Commit: bba7eb5825ad4bc1e38052d0222869f3c49f3837
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=bba7eb5825ad4bc1e38052d0222869f3c49f3837

Author: Piotr Caban <piotr.caban at gmail.com>
Date:   Sat Jul 19 22:32:10 2008 +0200

msxml3: Add error handling.

---

 dlls/msxml3/saxreader.c |   90 +++++++++++++++++++++++++++++++++-------------
 1 files changed, 64 insertions(+), 26 deletions(-)

diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index 26ba454..9250c61 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -83,6 +83,26 @@ static inline saxlocator *impl_from_ISAXLocator( ISAXLocator *iface )
     return (saxlocator *)((char*)iface - FIELD_OFFSET(saxlocator, lpSAXLocatorVtbl));
 }
 
+static void format_error_message_from_id(saxlocator *This, HRESULT hr)
+{
+    xmlStopParser(This->pParserCtxt);
+    This->ret = hr;
+
+    if(This->saxreader->errorHandler)
+    {
+        WCHAR msg[1024];
+        if(!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM,
+                    NULL, hr, 0, msg, sizeof(msg), NULL))
+        {
+            FIXME("MSXML errors not yet supported.\n");
+            msg[0] = '\0';
+        }
+
+        ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
+                (ISAXLocator*)&This->lpSAXLocatorVtbl, msg, hr);
+    }
+}
+
 /*** LibXML callbacks ***/
 static void libxmlStartDocument(void *ctx)
 {
@@ -92,11 +112,8 @@ static void libxmlStartDocument(void *ctx)
     if(This->saxreader->contentHandler)
     {
         hr = ISAXContentHandler_startDocument(This->saxreader->contentHandler);
-        if(FAILED(hr))
-        {
-            xmlStopParser(This->pParserCtxt);
-            This->ret = hr;
-        }
+        if(hr != S_OK)
+            format_error_message_from_id(This, hr);
     }
 
     This->lastColumn = xmlSAX2GetColumnNumber(This->pParserCtxt);
@@ -116,11 +133,8 @@ static void libxmlEndDocument(void *ctx)
     if(This->saxreader->contentHandler)
     {
         hr = ISAXContentHandler_endDocument(This->saxreader->contentHandler);
-        if(FAILED(hr))
-        {
-            xmlStopParser(This->pParserCtxt);
-            This->ret = hr;
-        }
+        if(hr != S_OK)
+            format_error_message_from_id(This, hr);
     }
 }
 
@@ -161,11 +175,8 @@ static void libxmlStartElementNS(
         SysFreeString(LocalName);
         SysFreeString(QName);
 
-        if(FAILED(hr))
-        {
-            xmlStopParser(This->pParserCtxt);
-            This->ret = hr;
-        }
+        if(hr != S_OK)
+            format_error_message_from_id(This, hr);
     }
 }
 
@@ -198,11 +209,8 @@ static void libxmlEndElementNS(
         SysFreeString(LocalName);
         SysFreeString(QName);
 
-        if(FAILED(hr))
-        {
-            xmlStopParser(This->pParserCtxt);
-            This->ret = hr;
-        }
+        if(hr != S_OK)
+            format_error_message_from_id(This, hr);
     }
 }
 
@@ -242,11 +250,8 @@ static void libxmlCharacters(
         hr = ISAXContentHandler_characters(This->saxreader->contentHandler, Chars, len);
         SysFreeString(Chars);
 
-        if(FAILED(hr))
-        {
-            xmlStopParser(This->pParserCtxt);
-            This->ret = hr;
-        }
+        if(hr != S_OK)
+            format_error_message_from_id(This, hr);
     }
 }
 
@@ -261,10 +266,41 @@ static void libxmlSetDocumentLocator(
             (ISAXLocator*)&This->lpSAXLocatorVtbl);
 
     if(FAILED(hr))
+        format_error_message_from_id(This, hr);
+}
+
+void libxmlFatalError(void *ctx, const char *msg, ...)
+{
+    saxlocator *This = ctx;
+    char message[1024];
+    WCHAR *wszError;
+    DWORD len;
+    va_list args;
+
+    if(!This->saxreader->errorHandler)
     {
         xmlStopParser(This->pParserCtxt);
-        This->ret = hr;
+        This->ret = E_FAIL;
+        return;
     }
+
+    FIXME("Error handling is not compatible.\n");
+
+    va_start(args, msg);
+    vsprintf(message, msg, args);
+    va_end(args);
+
+    len = MultiByteToWideChar(CP_ACP, 0, message, -1, NULL, 0);
+    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);
+
+    HeapFree(GetProcessHeap(), 0, wszError);
+
+    xmlStopParser(This->pParserCtxt);
+    This->ret = E_FAIL;
 }
 
 /*** ISAXLocator interface ***/
@@ -1102,6 +1138,8 @@ HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
     reader->sax.endElementNs = libxmlEndElementNS;
     reader->sax.characters = libxmlCharacters;
     reader->sax.setDocumentLocator = libxmlSetDocumentLocator;
+    reader->sax.error = libxmlFatalError;
+    reader->sax.fatalError = libxmlFatalError;
 
     *ppObj = &reader->lpVtbl;
 




More information about the wine-cvs mailing list