Huw Davies : ole32:
The default handler needs to have its own implementation of
IPersistStorage .
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Aug 9 08:23:01 CDT 2007
Module: wine
Branch: master
Commit: 54f2f60b5489c31188eae8d25871ed19ffe96b31
URL: http://source.winehq.org/git/wine.git/?a=commit;h=54f2f60b5489c31188eae8d25871ed19ffe96b31
Author: Huw Davies <huw at codeweavers.com>
Date: Wed Aug 8 12:36:37 2007 +0100
ole32: The default handler needs to have its own implementation of IPersistStorage.
For now we forward the methods to the data cache as before.
---
dlls/ole32/defaulthandler.c | 177 +++++++++++++++++++++++++++++++++++++++++--
1 files changed, 170 insertions(+), 7 deletions(-)
diff --git a/dlls/ole32/defaulthandler.c b/dlls/ole32/defaulthandler.c
index 4513727..ba70e0f 100644
--- a/dlls/ole32/defaulthandler.c
+++ b/dlls/ole32/defaulthandler.c
@@ -75,6 +75,7 @@ struct DefaultHandler
const IDataObjectVtbl* lpvtblIDataObject;
const IRunnableObjectVtbl* lpvtblIRunnableObject;
const IAdviseSinkVtbl *lpvtblIAdviseSink;
+ const IPersistStorageVtbl *lpvtblIPersistStorage;
/* Reference count of this object */
LONG ref;
@@ -87,6 +88,8 @@ struct DefaultHandler
/* IUnknown implementation of the datacache. */
IUnknown* dataCache;
+ /* IPersistStorage implementation of the datacache. */
+ IPersistStorage* dataCache_PersistStg;
/* Client site for the embedded object. */
IOleClientSite* clientSite;
@@ -151,6 +154,11 @@ static inline DefaultHandler *impl_from_IAdviseSink( IAdviseSink *iface )
return (DefaultHandler *)((char*)iface - FIELD_OFFSET(DefaultHandler, lpvtblIAdviseSink));
}
+static inline DefaultHandler *impl_from_IPersistStorage( IPersistStorage *iface )
+{
+ return (DefaultHandler *)((char*)iface - FIELD_OFFSET(DefaultHandler, lpvtblIPersistStorage));
+}
+
static void DefaultHandler_Destroy(DefaultHandler* This);
static inline BOOL object_is_running(DefaultHandler *This)
@@ -193,8 +201,9 @@ static HRESULT WINAPI DefaultHandler_NDIUnknown_QueryInterface(
else if (IsEqualIID(&IID_IRunnableObject, riid))
*ppvObject = (IRunnableObject*)&This->lpvtblIRunnableObject;
else if (IsEqualIID(&IID_IPersist, riid) ||
- IsEqualIID(&IID_IPersistStorage, riid) ||
- IsEqualIID(&IID_IViewObject, riid) ||
+ IsEqualIID(&IID_IPersistStorage, riid))
+ *ppvObject = &This->lpvtblIPersistStorage;
+ else if (IsEqualIID(&IID_IViewObject, riid) ||
IsEqualIID(&IID_IViewObject2, riid) ||
IsEqualIID(&IID_IOleCache, riid) ||
IsEqualIID(&IID_IOleCache2, riid))
@@ -1451,6 +1460,140 @@ static void WINAPI DefaultHandler_IAdviseSink_OnClose(
DefaultHandler_Stop(This);
}
+
+/************************************************************************
+ * DefaultHandler_IPersistStorage_QueryInterface
+ *
+ */
+static HRESULT WINAPI DefaultHandler_IPersistStorage_QueryInterface(
+ IPersistStorage* iface,
+ REFIID riid,
+ void** ppvObject)
+{
+ DefaultHandler *This = impl_from_IPersistStorage(iface);
+
+ return IUnknown_QueryInterface(This->outerUnknown, riid, ppvObject);
+}
+
+/************************************************************************
+ * DefaultHandler_IPersistStorage_AddRef
+ *
+ */
+static ULONG WINAPI DefaultHandler_IPersistStorage_AddRef(
+ IPersistStorage* iface)
+{
+ DefaultHandler *This = impl_from_IPersistStorage(iface);
+
+ return IUnknown_AddRef(This->outerUnknown);
+}
+
+/************************************************************************
+ * DefaultHandler_IPersistStorage_Release
+ *
+ */
+static ULONG WINAPI DefaultHandler_IPersistStorage_Release(
+ IPersistStorage* iface)
+{
+ DefaultHandler *This = impl_from_IPersistStorage(iface);
+
+ return IUnknown_Release(This->outerUnknown);
+}
+
+/************************************************************************
+ * DefaultHandler_IPersistStorage_GetClassID
+ *
+ */
+static HRESULT WINAPI DefaultHandler_IPersistStorage_GetClassID(
+ IPersistStorage* iface,
+ CLSID* clsid)
+{
+ DefaultHandler *This = impl_from_IPersistStorage(iface);
+
+ return IPersistStorage_GetClassID(This->dataCache_PersistStg, clsid);
+}
+
+/************************************************************************
+ * DefaultHandler_IPersistStorage_IsDirty
+ *
+ */
+static HRESULT WINAPI DefaultHandler_IPersistStorage_IsDirty(
+ IPersistStorage* iface)
+{
+ DefaultHandler *This = impl_from_IPersistStorage(iface);
+
+ return IPersistStorage_IsDirty(This->dataCache_PersistStg);
+}
+
+/************************************************************************
+ * DefaultHandler_IPersistStorage_InitNew
+ *
+ */
+static HRESULT WINAPI DefaultHandler_IPersistStorage_InitNew(
+ IPersistStorage* iface,
+ IStorage* pStg)
+{
+ DefaultHandler *This = impl_from_IPersistStorage(iface);
+
+ return IPersistStorage_InitNew(This->dataCache_PersistStg, pStg);
+}
+
+
+/************************************************************************
+ * DefaultHandler_IPersistStorage_Load
+ *
+ */
+static HRESULT WINAPI DefaultHandler_IPersistStorage_Load(
+ IPersistStorage* iface,
+ IStorage* pStg)
+{
+ DefaultHandler *This = impl_from_IPersistStorage(iface);
+
+ return IPersistStorage_Load(This->dataCache_PersistStg, pStg);
+}
+
+
+/************************************************************************
+ * DefaultHandler_IPersistStorage_Save
+ *
+ */
+static HRESULT WINAPI DefaultHandler_IPersistStorage_Save(
+ IPersistStorage* iface,
+ IStorage* pStgSave,
+ BOOL fSaveAsLoad)
+{
+ DefaultHandler *This = impl_from_IPersistStorage(iface);
+
+ return IPersistStorage_Save(This->dataCache_PersistStg, pStgSave, fSaveAsLoad);
+}
+
+
+/************************************************************************
+ * DefaultHandler_IPersistStorage_SaveCompleted
+ *
+ */
+static HRESULT WINAPI DefaultHandler_IPersistStorage_SaveCompleted(
+ IPersistStorage* iface,
+ IStorage* pStgNew)
+{
+ DefaultHandler *This = impl_from_IPersistStorage(iface);
+
+ return IPersistStorage_SaveCompleted(This->dataCache_PersistStg, pStgNew);
+}
+
+
+/************************************************************************
+ * DefaultHandler_IPersistStorage_HandsOffStorage
+ *
+ */
+static HRESULT WINAPI DefaultHandler_IPersistStorage_HandsOffStorage(
+ IPersistStorage* iface)
+{
+ DefaultHandler *This = impl_from_IPersistStorage(iface);
+
+ return IPersistStorage_HandsOffStorage(This->dataCache_PersistStg);
+}
+
+
/*
* Virtual function tables for the DefaultHandler class.
*/
@@ -1529,6 +1672,20 @@ static const IAdviseSinkVtbl DefaultHandler_IAdviseSink_VTable =
DefaultHandler_IAdviseSink_OnClose
};
+static const IPersistStorageVtbl DefaultHander_IPersistStorage_VTable =
+{
+ DefaultHandler_IPersistStorage_QueryInterface,
+ DefaultHandler_IPersistStorage_AddRef,
+ DefaultHandler_IPersistStorage_Release,
+ DefaultHandler_IPersistStorage_GetClassID,
+ DefaultHandler_IPersistStorage_IsDirty,
+ DefaultHandler_IPersistStorage_InitNew,
+ DefaultHandler_IPersistStorage_Load,
+ DefaultHandler_IPersistStorage_Save,
+ DefaultHandler_IPersistStorage_SaveCompleted,
+ DefaultHandler_IPersistStorage_HandsOffStorage
+};
+
/*********************************************************
* Methods implementation for the DefaultHandler class.
*/
@@ -1537,6 +1694,7 @@ static DefaultHandler* DefaultHandler_Construct(
LPUNKNOWN pUnkOuter)
{
DefaultHandler* This = NULL;
+ HRESULT hr;
/*
* Allocate space for the object.
@@ -1574,11 +1732,14 @@ static DefaultHandler* DefaultHandler_Construct(
* We aggregate with the datacache. Make sure we pass our outer
* unknown as the datacache's outer unknown.
*/
- CreateDataCache(This->outerUnknown,
- clsid,
- &IID_IUnknown,
- (void**)&This->dataCache);
-
+ hr = CreateDataCache(This->outerUnknown,
+ clsid,
+ &IID_IUnknown,
+ (void**)&This->dataCache);
+ if(SUCCEEDED(hr))
+ hr = IUnknown_QueryInterface(This->dataCache, &IID_IPersistStorage, (void**)&This->dataCache_PersistStg);
+ if(FAILED(hr))
+ ERR("Unexpected error creating data cache\n");
/*
* Initialize the other data members of the class.
*/
@@ -1612,7 +1773,9 @@ static void DefaultHandler_Destroy(
/* Release our reference to the data cache. */
if (This->dataCache)
{
+ IPersistStorage_Release(This->dataCache_PersistStg);
IUnknown_Release(This->dataCache);
+ This->dataCache_PersistStg = NULL;
This->dataCache = NULL;
}
More information about the wine-cvs
mailing list