[PATCH] Add IPersistMoniker interface support

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Tue Feb 3 21:24:58 CST 2009


---
 dlls/msxml3/domdoc.c       |  120 ++++++++++++++++++++++++++++++++++++++++++++
 dlls/msxml3/tests/domdoc.c |   16 ++++++
 2 files changed, 136 insertions(+), 0 deletions(-)

diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index a50b4e9..405cc0f 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -37,6 +37,7 @@
 #include "ocidl.h"
 #include "objsafe.h"
 #include "dispex.h"
+#include "urlmon.h"
 
 #include "wine/debug.h"
 #include "wine/list.h"
@@ -58,6 +59,7 @@ typedef struct _domdoc
     const struct IObjectWithSiteVtbl  *lpvtblIObjectWithSite;
     const struct IObjectSafetyVtbl    *lpvtblIObjectSafety;
     const struct ISupportErrorInfoVtbl *lpvtblISupportErrorInfo;
+    const struct IPersistMonikerVtbl  *lpvblIPersistMoniker;
     LONG ref;
     VARIANT_BOOL async;
     VARIANT_BOOL validating;
@@ -254,6 +256,11 @@ static inline domdoc *impl_from_ISupportErrorInfo(ISupportErrorInfo *iface)
     return (domdoc *)((char*)iface - FIELD_OFFSET(domdoc, lpvtblISupportErrorInfo));
 }
 
+static inline domdoc *impl_from_IPersistMoniker(IPersistMoniker *iface)
+{
+    return (domdoc *)((char*)iface - FIELD_OFFSET(domdoc, lpvblIPersistMoniker));
+}
+
 /************************************************************************
  * xmldoc implementation of IPersistStream.
  */
@@ -469,6 +476,10 @@ static HRESULT WINAPI domdoc_QueryInterface( IXMLDOMDocument2 *iface, REFIID rii
     {
         *ppvObject = &This->lpvtblISupportErrorInfo;
     }
+    else if( IsEqualGUID( riid, &IID_IPersistMoniker ))
+    {
+        *ppvObject = &This->lpvblIPersistMoniker;
+    }
     else if(dispex_query_interface(&This->dispex, riid, ppvObject))
     {
         return *ppvObject ? S_OK : E_NOINTERFACE;
@@ -2181,6 +2192,114 @@ static const IObjectSafetyVtbl domdocObjectSafetyVtbl = {
     xmldoc_Safety_SetInterfaceSafetyOptions
 };
 
+/* IPersistMoniker */
+static HRESULT WINAPI xmldoc_IPersistMoniker_QueryInterface(IPersistMoniker *iface, REFIID riid, void **ppvObject)
+{
+    domdoc *This = impl_from_IPersistMoniker(iface);
+
+    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
+
+    *ppvObject = NULL;
+
+    if ( IsEqualGUID( riid, &IID_IUnknown ) ||
+         IsEqualGUID( riid, &IID_IPersistMoniker ) )
+    {
+        *ppvObject = iface;
+    }
+    else if ( IsEqualGUID( riid, &IID_IMonikerProp ) )
+    {
+        TRACE("IID_IMonikerProp not supported, returning NULL\n");
+        return E_NOINTERFACE;
+    }
+    else
+    {
+        FIXME("interface %s not implemented\n", debugstr_guid(riid));
+        return E_NOINTERFACE;
+    }
+
+    return S_OK;
+}
+
+static ULONG WINAPI xmldoc_IPersistMoniker_AddRef(IPersistMoniker *iface)
+{
+    domdoc *This = impl_from_IPersistMoniker(iface);
+    return IXMLDocument_AddRef((IXMLDocument *)This);
+};
+
+static ULONG WINAPI xmldoc_IPersistMoniker_Release(IPersistMoniker *iface)
+{
+    domdoc *This = impl_from_IPersistMoniker(iface);
+    return IXMLDocument_Release((IXMLDocument *)This);
+}
+
+static HRESULT WINAPI xmldoc_IPersistMoniker_GetClassID(IPersistMoniker *iface, CLSID *pClassID)
+{
+    domdoc *This = impl_from_IPersistMoniker(iface);
+
+    FIXME("(%p)->(%s)\n", This, debugstr_guid(pClassID));
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xmldoc_IPersistMoniker_IsDirty(IPersistMoniker *iface)
+{
+    domdoc *This = impl_from_IPersistMoniker(iface);
+
+    FIXME("(%p)\n", This);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xmldoc_IPersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAvailable,
+    IMoniker *pimkName, LPBC pibc, DWORD grfMode)
+{
+    domdoc *This = impl_from_IPersistMoniker(iface);
+
+    FIXME("(%p)->(%d %p %p %d)\n", This, fFullyAvailable, pimkName,  pibc, grfMode);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xmldoc_IPersistMoniker_Save(IPersistMoniker *iface, IMoniker *pimkName,
+    LPBC pbc, BOOL fRemember)
+{
+    domdoc *This = impl_from_IPersistMoniker(iface);
+
+    FIXME("(%p)->(%p %p %d)\n", This, pimkName, pbc, fRemember);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xmldoc_IPersistMoniker_SaveCompleted(IPersistMoniker *iface, IMoniker *pimkName,
+    LPBC pibc)
+{
+    domdoc *This = impl_from_IPersistMoniker(iface);
+
+    FIXME("(%p)->(%p %p)\n", This, pimkName, pibc);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI xmldoc_IPersistMoniker_GetCurMoniker(IPersistMoniker *iface, IMoniker **ppimkName)
+{
+    domdoc *This = impl_from_IPersistMoniker(iface);
+
+    FIXME("(%p)->(%p)\n", This, ppimkName);
+
+    return E_NOTIMPL;
+}
+
+static const IPersistMonikerVtbl domdocPersistMonikerVtbl = {
+    xmldoc_IPersistMoniker_QueryInterface,
+    xmldoc_IPersistMoniker_AddRef,
+    xmldoc_IPersistMoniker_Release,
+    xmldoc_IPersistMoniker_GetClassID,
+    xmldoc_IPersistMoniker_IsDirty,
+    xmldoc_IPersistMoniker_Load,
+    xmldoc_IPersistMoniker_Save,
+    xmldoc_IPersistMoniker_SaveCompleted,
+    xmldoc_IPersistMoniker_GetCurMoniker
+};
 
 static const tid_t domdoc_iface_tids[] = {
     IXMLDOMNode_tid,
@@ -2209,6 +2328,7 @@ HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 **docu
     doc->lpvtblIObjectWithSite = &domdocObjectSite;
     doc->lpvtblIObjectSafety = &domdocObjectSafetyVtbl;
     doc->lpvtblISupportErrorInfo = &support_error_vtbl;
+    doc->lpvblIPersistMoniker = &domdocPersistMonikerVtbl;
     doc->ref = 1;
     doc->async = VARIANT_TRUE;
     doc->validating = 0;
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 584eab3..12371ae 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -415,6 +415,7 @@ static void test_domdoc( void )
     IXMLDOMNode *nodeChild = NULL;
     IXMLDOMProcessingInstruction *nodePI = NULL;
     ISupportErrorInfo *support_error = NULL;
+    IPersistMoniker *persist_mok = NULL;
     VARIANT_BOOL b;
     VARIANT var;
     BSTR str;
@@ -890,6 +891,21 @@ static void test_domdoc( void )
         ISupportErrorInfo_Release( support_error );
     }
 
+    r = IXMLDOMDocument_QueryInterface( doc, &IID_IPersistMoniker, (LPVOID*)&persist_mok );
+    ok( r == S_OK, "ret %08x\n", r );
+    if(r == S_OK)
+    {
+        IMonikerProp *prop;
+
+        r = IPersistMoniker_QueryInterface(persist_mok, &IID_IMonikerProp, (void**)&prop);
+        ok( r == E_NOINTERFACE, "ret %08x\n", r );
+        if(SUCCEEDED(r)) {
+            IMonikerProp_Release(prop);
+        }
+
+        IPersistMoniker_Release(persist_mok);
+    }
+
     r = IXMLDOMDocument_Release( doc );
     ok( r == 0, "document ref count incorrect\n");
 
-- 
1.5.4.3


--------------060601050006000504070404--



More information about the wine-patches mailing list