Module: wine Branch: master Commit: 2bff764df07e7c9830299f0e0b1d14f4d334f8bb URL: http://source.winehq.org/git/wine.git/?a=commit;h=2bff764df07e7c9830299f0e0b...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sat Jul 14 23:05:34 2012 +0400
msxml3: 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;