Commit 54f2f60b authored by Huw Davies's avatar Huw Davies Committed by Alexandre Julliard

ole32: The default handler needs to have its own implementation of IPersistStorage.

For now we forward the methods to the data cache as before.
parent e97c5be2
...@@ -75,6 +75,7 @@ struct DefaultHandler ...@@ -75,6 +75,7 @@ struct DefaultHandler
const IDataObjectVtbl* lpvtblIDataObject; const IDataObjectVtbl* lpvtblIDataObject;
const IRunnableObjectVtbl* lpvtblIRunnableObject; const IRunnableObjectVtbl* lpvtblIRunnableObject;
const IAdviseSinkVtbl *lpvtblIAdviseSink; const IAdviseSinkVtbl *lpvtblIAdviseSink;
const IPersistStorageVtbl *lpvtblIPersistStorage;
/* Reference count of this object */ /* Reference count of this object */
LONG ref; LONG ref;
...@@ -87,6 +88,8 @@ struct DefaultHandler ...@@ -87,6 +88,8 @@ struct DefaultHandler
/* IUnknown implementation of the datacache. */ /* IUnknown implementation of the datacache. */
IUnknown* dataCache; IUnknown* dataCache;
/* IPersistStorage implementation of the datacache. */
IPersistStorage* dataCache_PersistStg;
/* Client site for the embedded object. */ /* Client site for the embedded object. */
IOleClientSite* clientSite; IOleClientSite* clientSite;
...@@ -151,6 +154,11 @@ static inline DefaultHandler *impl_from_IAdviseSink( IAdviseSink *iface ) ...@@ -151,6 +154,11 @@ static inline DefaultHandler *impl_from_IAdviseSink( IAdviseSink *iface )
return (DefaultHandler *)((char*)iface - FIELD_OFFSET(DefaultHandler, lpvtblIAdviseSink)); 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 void DefaultHandler_Destroy(DefaultHandler* This);
static inline BOOL object_is_running(DefaultHandler *This) static inline BOOL object_is_running(DefaultHandler *This)
...@@ -193,8 +201,9 @@ static HRESULT WINAPI DefaultHandler_NDIUnknown_QueryInterface( ...@@ -193,8 +201,9 @@ static HRESULT WINAPI DefaultHandler_NDIUnknown_QueryInterface(
else if (IsEqualIID(&IID_IRunnableObject, riid)) else if (IsEqualIID(&IID_IRunnableObject, riid))
*ppvObject = (IRunnableObject*)&This->lpvtblIRunnableObject; *ppvObject = (IRunnableObject*)&This->lpvtblIRunnableObject;
else if (IsEqualIID(&IID_IPersist, riid) || else if (IsEqualIID(&IID_IPersist, riid) ||
IsEqualIID(&IID_IPersistStorage, riid) || IsEqualIID(&IID_IPersistStorage, riid))
IsEqualIID(&IID_IViewObject, riid) || *ppvObject = &This->lpvtblIPersistStorage;
else if (IsEqualIID(&IID_IViewObject, riid) ||
IsEqualIID(&IID_IViewObject2, riid) || IsEqualIID(&IID_IViewObject2, riid) ||
IsEqualIID(&IID_IOleCache, riid) || IsEqualIID(&IID_IOleCache, riid) ||
IsEqualIID(&IID_IOleCache2, riid)) IsEqualIID(&IID_IOleCache2, riid))
...@@ -1451,6 +1460,140 @@ static void WINAPI DefaultHandler_IAdviseSink_OnClose( ...@@ -1451,6 +1460,140 @@ static void WINAPI DefaultHandler_IAdviseSink_OnClose(
DefaultHandler_Stop(This); 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. * Virtual function tables for the DefaultHandler class.
*/ */
...@@ -1529,6 +1672,20 @@ static const IAdviseSinkVtbl DefaultHandler_IAdviseSink_VTable = ...@@ -1529,6 +1672,20 @@ static const IAdviseSinkVtbl DefaultHandler_IAdviseSink_VTable =
DefaultHandler_IAdviseSink_OnClose 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. * Methods implementation for the DefaultHandler class.
*/ */
...@@ -1537,6 +1694,7 @@ static DefaultHandler* DefaultHandler_Construct( ...@@ -1537,6 +1694,7 @@ static DefaultHandler* DefaultHandler_Construct(
LPUNKNOWN pUnkOuter) LPUNKNOWN pUnkOuter)
{ {
DefaultHandler* This = NULL; DefaultHandler* This = NULL;
HRESULT hr;
/* /*
* Allocate space for the object. * Allocate space for the object.
...@@ -1574,11 +1732,14 @@ static DefaultHandler* DefaultHandler_Construct( ...@@ -1574,11 +1732,14 @@ static DefaultHandler* DefaultHandler_Construct(
* We aggregate with the datacache. Make sure we pass our outer * We aggregate with the datacache. Make sure we pass our outer
* unknown as the datacache's outer unknown. * unknown as the datacache's outer unknown.
*/ */
CreateDataCache(This->outerUnknown, hr = CreateDataCache(This->outerUnknown,
clsid, clsid,
&IID_IUnknown, &IID_IUnknown,
(void**)&This->dataCache); (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. * Initialize the other data members of the class.
*/ */
...@@ -1612,7 +1773,9 @@ static void DefaultHandler_Destroy( ...@@ -1612,7 +1773,9 @@ static void DefaultHandler_Destroy(
/* Release our reference to the data cache. */ /* Release our reference to the data cache. */
if (This->dataCache) if (This->dataCache)
{ {
IPersistStorage_Release(This->dataCache_PersistStg);
IUnknown_Release(This->dataCache); IUnknown_Release(This->dataCache);
This->dataCache_PersistStg = NULL;
This->dataCache = NULL; This->dataCache = NULL;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment