[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