[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