Module: wine Branch: master Commit: 6235ac9f583ffa778d91d5e3189ba4e8a12c862d URL: http://source.winehq.org/git/wine.git/?a=commit;h=6235ac9f583ffa778d91d5e318...
Author: Rob Shearman rob@codeweavers.com Date: Mon Dec 4 15:51:05 2006 +0000
ole32: Implement the DiscardCache function in the data cache.
---
dlls/ole32/datacache.c | 31 +++++++++++++++++++++++++++---- dlls/ole32/tests/ole2.c | 4 +--- 2 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c index 5dd6bd6..54d25ea 100644 --- a/dlls/ole32/datacache.c +++ b/dlls/ole32/datacache.c @@ -732,6 +732,13 @@ static HRESULT DataCacheEntry_SetData(Da &This->stgmedium, stgmedium); }
+static inline HRESULT DataCacheEntry_DiscardData(DataCacheEntry *This) +{ + ReleaseStgMedium(&This->stgmedium); + This->data_cf = This->fmtetc.cfFormat; + return S_OK; +} + /********************************************************* * Method implementation for the non delegating IUnknown * part of the DataCache class. @@ -1327,7 +1334,7 @@ static HRESULT WINAPI DataCache_Load( hr = DataCache_CreateEntry(This, &fmtetc, &cache_entry); if (SUCCEEDED(hr)) { - ReleaseStgMedium(&cache_entry->stgmedium); + DataCacheEntry_DiscardData(cache_entry); if (cache_entry->storage) IStorage_Release(cache_entry->storage); cache_entry->storage = pStg; IStorage_AddRef(pStg); @@ -2016,7 +2023,7 @@ static HRESULT WINAPI DataCache_UpdateCa DWORD grfUpdf, LPVOID pReserved) { - FIXME("stub\n"); + FIXME("(%p, 0x%x, %p): stub\n", pDataObject, grfUpdf, pReserved); return E_NOTIMPL; }
@@ -2024,8 +2031,24 @@ static HRESULT WINAPI DataCache_DiscardC IOleCache2* iface, DWORD dwDiscardOptions) { - FIXME("stub\n"); - return E_NOTIMPL; + DataCache *This = impl_from_IOleCache2(iface); + DataCacheEntry *cache_entry; + HRESULT hr = S_OK; + + TRACE("(%d)\n", dwDiscardOptions); + + if (dwDiscardOptions == DISCARDCACHE_SAVEIFDIRTY) + hr = DataCache_Save((IPersistStorage *)&This->lpvtblIPersistStorage, + This->presentationStorage, TRUE); + + LIST_FOR_EACH_ENTRY(cache_entry, &This->cache_list, DataCacheEntry, entry) + { + hr = DataCacheEntry_DiscardData(cache_entry); + if (FAILED(hr)) + break; + } + + return hr; }
diff --git a/dlls/ole32/tests/ole2.c b/dlls/ole32/tests/ole2.c index 36341d5..24e981a 100644 --- a/dlls/ole32/tests/ole2.c +++ b/dlls/ole32/tests/ole2.c @@ -1261,9 +1261,7 @@ static void test_data_cache(void)
/* unload the cached storage object, causing it to be reloaded */ hr = IOleCache2_DiscardCache(pOleCache, DISCARDCACHE_NOSAVE); - todo_wine { ok_ole_success(hr, "IOleCache2_DiscardCache"); - } hr = IViewObject_Draw(pViewObject, DVASPECT_ICON, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue, 0xdeadbeef); ok_ole_success(hr, "IViewObject_Draw");
@@ -1272,10 +1270,10 @@ static void test_data_cache(void) ok_ole_success(hr, "IPersistStorage_HandsOffStorage"); hr = IViewObject_Draw(pViewObject, DVASPECT_ICON, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue, 0xdeadbeef); ok_ole_success(hr, "IViewObject_Draw"); - todo_wine { hr = IOleCache2_DiscardCache(pOleCache, DISCARDCACHE_NOSAVE); ok_ole_success(hr, "IOleCache2_DiscardCache"); hr = IViewObject_Draw(pViewObject, DVASPECT_ICON, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue, 0xdeadbeef); + todo_wine { ok(hr == OLE_E_BLANK, "IViewObject_Draw with uncached aspect should have returned OLE_E_BLANK instead of 0x%08x\n", hr); }