Rob Shearman : ole32: Implement Cache and Uncache for the data cache.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Dec 4 07:16:51 CST 2006


Module: wine
Branch: master
Commit: 4232d31c577b9f342bbe874e5182929d0bbbaee4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4232d31c577b9f342bbe874e5182929d0bbbaee4

Author: Rob Shearman <rob at codeweavers.com>
Date:   Fri Dec  1 15:01:50 2006 +0000

ole32: Implement Cache and Uncache for the data cache.

---

 dlls/ole32/datacache.c |   59 ++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 50 insertions(+), 9 deletions(-)

diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c
index 5ae22da..341e39a 100644
--- a/dlls/ole32/datacache.c
+++ b/dlls/ole32/datacache.c
@@ -98,6 +98,8 @@ typedef struct DataCacheEntry
    * representation of the object is stored.
    */
   IStorage *storage;
+
+  DWORD id;
 } DataCacheEntry;
 
 /****************************************************************************
@@ -136,6 +138,9 @@ struct DataCache
   IStorage *presentationStorage;
 
   struct list cache_list;
+
+  /* last id assigned to an object */
+  DWORD last_cache_id;
 };
 
 typedef struct DataCache DataCache;
@@ -186,6 +191,15 @@ static DataCache* DataCache_Construct(RE
 static HRESULT    DataCacheEntry_OpenPresStream(DataCacheEntry *This,
 					   IStream  **pStm);
 
+static void DataCacheEntry_Destroy(DataCacheEntry *This)
+{
+    list_remove(&This->entry);
+    if (This->storage)
+        IStorage_Release(This->storage);
+    HeapFree(GetProcessHeap(), 0, This->fmtetc.ptd);
+    HeapFree(GetProcessHeap(), 0, This);
+}
+
 static void DataCache_Destroy(
   DataCache* ptrToDestroy)
 {
@@ -200,11 +214,7 @@ static void DataCache_Destroy(
   }
 
   LIST_FOR_EACH_ENTRY_SAFE(cache_entry, next_cache_entry, &ptrToDestroy->cache_list, DataCacheEntry, entry)
-  {
-    IStorage_Release(cache_entry->storage);
-    HeapFree(GetProcessHeap(), 0, cache_entry->fmtetc.ptd);
-    HeapFree(GetProcessHeap(), 0, cache_entry);
-  }
+    DataCacheEntry_Destroy(cache_entry);
 
   /*
    * Free the datacache pointer.
@@ -237,6 +247,7 @@ static HRESULT DataCache_CreateEntry(Dat
         memcpy((*cache_entry)->fmtetc.ptd, formatetc->ptd, formatetc->ptd->tdSize);
     }
     (*cache_entry)->storage = NULL;
+    (*cache_entry)->id = This->last_cache_id++;
     list_add_tail(&This->cache_list, &(*cache_entry)->entry);
     return S_OK;
 }
@@ -1646,16 +1657,46 @@ static HRESULT WINAPI DataCache_Cache(
 	    DWORD           advf,
 	    DWORD*          pdwConnection)
 {
-  FIXME("stub\n");
-  return E_NOTIMPL;
+    DataCache *This = impl_from_IOleCache2(iface);
+    DataCacheEntry *cache_entry;
+    HRESULT hr;
+
+    TRACE("(%p, 0x%x, %p)\n", pformatetc, advf, pdwConnection);
+
+    *pdwConnection = 0;
+
+    cache_entry = DataCache_GetEntryForFormatEtc(This, pformatetc);
+    if (cache_entry)
+    {
+        *pdwConnection = cache_entry->id;
+        return CACHE_S_SAMECACHE;
+    }
+
+    hr = DataCache_CreateEntry(This, pformatetc, &cache_entry);
+
+    if (SUCCEEDED(hr))
+        *pdwConnection = cache_entry->id;
+
+    return hr;
 }
 
 static HRESULT WINAPI DataCache_Uncache(
 	    IOleCache2*     iface,
 	    DWORD           dwConnection)
 {
-  FIXME("stub\n");
-  return E_NOTIMPL;
+    DataCache *This = impl_from_IOleCache2(iface);
+    DataCacheEntry *cache_entry;
+
+    TRACE("(%d)\n", dwConnection);
+
+    LIST_FOR_EACH_ENTRY(cache_entry, &This->cache_list, DataCacheEntry, entry)
+        if (cache_entry->id == dwConnection)
+        {
+            DataCacheEntry_Destroy(cache_entry);
+            return S_OK;
+        }
+
+    return OLE_E_NOCONNECTION;
 }
 
 static HRESULT WINAPI DataCache_EnumCache(




More information about the wine-cvs mailing list