[2/3] msxml3: Implement put/get for DTD handler callback interface

Nikolay Sivov nsivov at codeweavers.com
Mon Jul 16 04:10:59 CDT 2012


Implement put/get for DTD handler callback interface
-------------- next part --------------
>From 2c325c419fcbac290e823252f333a738d597b90c Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sat, 14 Jul 2012 23:05:34 +0400
Subject: [PATCH 5/5] Implement put/get for DTD handler callback interface

---
 dlls/msxml3/saxreader.c |   61 +++++++++++++++++++++++++++++++++++++---------
 1 files changed, 49 insertions(+), 12 deletions(-)

diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c
index 485644a..1125d1c 100644
--- a/dlls/msxml3/saxreader.c
+++ b/dlls/msxml3/saxreader.c
@@ -177,6 +177,8 @@ typedef struct
     IVBSAXLexicalHandler *vblexicalHandler;
     ISAXDeclHandler *declHandler;
     IVBSAXDeclHandler *vbdeclHandler;
+    ISAXDTDHandler *dtdHandler;
+    IVBSAXDTDHandler *vbdtdHandler;
     xmlSAXHandler sax;
     BOOL isParsing;
     struct bstrpool pool;
@@ -2358,22 +2360,49 @@ static HRESULT internal_putContentHandler(
     return S_OK;
 }
 
-static HRESULT internal_getDTDHandler(
-        saxreader* This,
-        void *pDTDHandler,
-        BOOL vbInterface)
+static HRESULT internal_getDTDHandler(saxreader* This, void *dtdHandler, BOOL vbInterface)
 {
-    FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
-    return E_NOTIMPL;
+    TRACE("(%p)->(%p)\n", This, dtdHandler);
+
+    if (!dtdHandler) return E_POINTER;
+
+    if ((vbInterface && This->vbdtdHandler) || (!vbInterface && This->dtdHandler))
+    {
+        if (vbInterface)
+            IVBSAXContentHandler_AddRef(This->vbdtdHandler);
+        else
+            ISAXContentHandler_AddRef(This->dtdHandler);
+    }
+    if (vbInterface) *(IVBSAXDTDHandler**)dtdHandler = This->vbdtdHandler;
+    else *(ISAXDTDHandler**)dtdHandler = This->dtdHandler;
+
+    return S_OK;
 }
 
-static HRESULT internal_putDTDHandler(
-        saxreader* This,
-        void *pDTDHandler,
-        BOOL vbInterface)
+static HRESULT internal_putDTDHandler(saxreader* This, void *dtdHandler, BOOL vbInterface)
 {
-    FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
-    return E_NOTIMPL;
+    TRACE("(%p)->(%p)\n", This, dtdHandler);
+
+    if (dtdHandler)
+    {
+        if (vbInterface)
+            IVBSAXDTDHandler_AddRef((IVBSAXDTDHandler*)dtdHandler);
+        else
+            ISAXDTDHandler_AddRef((ISAXDTDHandler*)dtdHandler);
+    }
+    if ((vbInterface && This->vbdtdHandler) || (!vbInterface && This->dtdHandler))
+    {
+        if (vbInterface)
+            IVBSAXDTDHandler_Release(This->vbdtdHandler);
+        else
+            ISAXDTDHandler_Release(This->dtdHandler);
+    }
+    if (vbInterface)
+        This->vbdtdHandler = dtdHandler;
+    else
+        This->dtdHandler = dtdHandler;
+
+    return S_OK;
 }
 
 static HRESULT internal_getErrorHandler(
@@ -2809,6 +2838,12 @@ static ULONG WINAPI saxxmlreader_Release(
         if(This->vbdeclHandler)
             IVBSAXDeclHandler_Release(This->vbdeclHandler);
 
+        if(This->dtdHandler)
+            ISAXDTDHandler_Release(This->dtdHandler);
+
+        if(This->vbdtdHandler)
+            IVBSAXDTDHandler_Release(This->vbdtdHandler);
+
         free_bstr_pool(&This->pool);
 
         release_dispex(&This->dispex);
@@ -3306,6 +3341,8 @@ HRESULT SAXXMLReader_create(MSXML_VERSION version, IUnknown *outer, LPVOID *ppOb
     reader->vblexicalHandler = NULL;
     reader->declHandler = NULL;
     reader->vbdeclHandler = NULL;
+    reader->dtdHandler = NULL;
+    reader->vbdtdHandler = NULL;
     reader->isParsing = FALSE;
     reader->pool.pool = NULL;
     reader->pool.index = 0;
-- 
1.5.6.5




More information about the wine-patches mailing list