Huw Davies : ole32: Implement IOleCache_EnumCache().
Alexandre Julliard
julliard at winehq.org
Tue May 23 18:01:27 CDT 2017
Module: wine
Branch: master
Commit: 20a8f1adf4d2f9a43632670ff9368cf42432e157
URL: http://source.winehq.org/git/wine.git/?a=commit;h=20a8f1adf4d2f9a43632670ff9368cf42432e157
Author: Huw Davies <huw at codeweavers.com>
Date: Tue May 23 13:11:40 2017 +0100
ole32: Implement IOleCache_EnumCache().
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ole32/compobj_private.h | 3 +++
dlls/ole32/datacache.c | 36 ++++++++++++++++++++++++++++++-----
dlls/ole32/oleobj.c | 45 +++++++++++++++++++++++++-------------------
3 files changed, 60 insertions(+), 24 deletions(-)
diff --git a/dlls/ole32/compobj_private.h b/dlls/ole32/compobj_private.h
index 8bab819..64b6782 100644
--- a/dlls/ole32/compobj_private.h
+++ b/dlls/ole32/compobj_private.h
@@ -346,4 +346,7 @@ static inline HRESULT copy_formatetc(FORMATETC *dst, const FORMATETC *src)
return S_OK;
}
+extern HRESULT EnumSTATDATA_Construct(IUnknown *holder, ULONG index, DWORD array_len, STATDATA *data,
+ BOOL copy, IEnumSTATDATA **ppenum) DECLSPEC_HIDDEN;
+
#endif /* __WINE_OLE_COMPOBJ_H */
diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c
index a50c4fe..5055c3f 100644
--- a/dlls/ole32/datacache.c
+++ b/dlls/ole32/datacache.c
@@ -2129,12 +2129,38 @@ static HRESULT WINAPI DataCache_Uncache(
return OLE_E_NOCONNECTION;
}
-static HRESULT WINAPI DataCache_EnumCache(
- IOleCache2* iface,
- IEnumSTATDATA** ppenumSTATDATA)
+static HRESULT WINAPI DataCache_EnumCache(IOleCache2 *iface,
+ IEnumSTATDATA **enum_stat)
{
- FIXME("stub\n");
- return E_NOTIMPL;
+ DataCache *This = impl_from_IOleCache2( iface );
+ DataCacheEntry *cache_entry;
+ int i = 0, count = list_count( &This->cache_list );
+ STATDATA *data;
+ HRESULT hr;
+
+ TRACE( "(%p, %p)\n", This, enum_stat );
+
+ data = CoTaskMemAlloc( count * sizeof(*data) );
+ if (!data) return E_OUTOFMEMORY;
+
+ LIST_FOR_EACH_ENTRY( cache_entry, &This->cache_list, DataCacheEntry, entry )
+ {
+ if (i == count) break;
+ hr = copy_formatetc( &data[i].formatetc, &cache_entry->fmtetc );
+ if (FAILED(hr)) goto fail;
+ data[i].advf = cache_entry->advise_flags;
+ data[i].pAdvSink = NULL;
+ data[i].dwConnection = cache_entry->id;
+ i++;
+ }
+
+ hr = EnumSTATDATA_Construct( NULL, 0, i, data, FALSE, enum_stat );
+ if (SUCCEEDED(hr)) return hr;
+
+fail:
+ while (i--) CoTaskMemFree( data[i].formatetc.ptd );
+ CoTaskMemFree( data );
+ return hr;
}
static HRESULT WINAPI DataCache_InitCache(
diff --git a/dlls/ole32/oleobj.c b/dlls/ole32/oleobj.c
index 17ab8d0..44e15e5 100644
--- a/dlls/ole32/oleobj.c
+++ b/dlls/ole32/oleobj.c
@@ -71,8 +71,6 @@ static HRESULT copy_statdata(STATDATA *dst, const STATDATA *src)
* EnumSTATDATA Implementation
*/
-static HRESULT EnumSTATDATA_Construct(IUnknown *holder, ULONG index, DWORD array_len, STATDATA *data, IEnumSTATDATA **ppenum);
-
typedef struct
{
IEnumSTATDATA IEnumSTATDATA_iface;
@@ -120,7 +118,7 @@ static ULONG WINAPI EnumSTATDATA_Release(IEnumSTATDATA *iface)
for(i = 0; i < This->num_of_elems; i++)
release_statdata(This->statdata + i);
HeapFree(GetProcessHeap(), 0, This->statdata);
- IUnknown_Release(This->holder);
+ if (This->holder) IUnknown_Release(This->holder);
HeapFree(GetProcessHeap(), 0, This);
}
return refs;
@@ -184,7 +182,8 @@ static HRESULT WINAPI EnumSTATDATA_Clone(IEnumSTATDATA *iface, IEnumSTATDATA **p
{
EnumSTATDATA *This = impl_from_IEnumSTATDATA(iface);
- return EnumSTATDATA_Construct(This->holder, This->index, This->num_of_elems, This->statdata, ppenum);
+ return EnumSTATDATA_Construct(This->holder, This->index, This->num_of_elems, This->statdata,
+ TRUE, ppenum);
}
static const IEnumSTATDATAVtbl EnumSTATDATA_VTable =
@@ -198,8 +197,8 @@ static const IEnumSTATDATAVtbl EnumSTATDATA_VTable =
EnumSTATDATA_Clone
};
-static HRESULT EnumSTATDATA_Construct(IUnknown *holder, ULONG index, DWORD array_len, STATDATA *data,
- IEnumSTATDATA **ppenum)
+HRESULT EnumSTATDATA_Construct(IUnknown *holder, ULONG index, DWORD array_len, STATDATA *data,
+ BOOL copy, IEnumSTATDATA **ppenum)
{
EnumSTATDATA *This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
DWORD i, count;
@@ -210,25 +209,33 @@ static HRESULT EnumSTATDATA_Construct(IUnknown *holder, ULONG index, DWORD array
This->ref = 1;
This->index = index;
- This->statdata = HeapAlloc(GetProcessHeap(), 0, array_len * sizeof(*This->statdata));
- if(!This->statdata)
+ if (copy)
{
- HeapFree(GetProcessHeap(), 0, This);
- return E_OUTOFMEMORY;
- }
+ This->statdata = HeapAlloc(GetProcessHeap(), 0, array_len * sizeof(*This->statdata));
+ if(!This->statdata)
+ {
+ HeapFree(GetProcessHeap(), 0, This);
+ return E_OUTOFMEMORY;
+ }
- for(i = 0, count = 0; i < array_len; i++)
- {
- if(data[i].pAdvSink)
+ for(i = 0, count = 0; i < array_len; i++)
{
- copy_statdata(This->statdata + count, data + i);
- count++;
+ if(data[i].pAdvSink)
+ {
+ copy_statdata(This->statdata + count, data + i);
+ count++;
+ }
}
}
+ else
+ {
+ This->statdata = data;
+ count = array_len;
+ }
This->num_of_elems = count;
This->holder = holder;
- IUnknown_AddRef(holder);
+ if (holder) IUnknown_AddRef(holder);
*ppenum = &This->IEnumSTATDATA_iface;
return S_OK;
}
@@ -403,7 +410,7 @@ static HRESULT WINAPI OleAdviseHolderImpl_EnumAdvise(IOleAdviseHolder *iface, IE
TRACE("(%p)->(%p)\n", This, enum_advise);
IOleAdviseHolder_QueryInterface(iface, &IID_IUnknown, (void**)&unk);
- hr = EnumSTATDATA_Construct(unk, 0, This->max_cons, This->connections, enum_advise);
+ hr = EnumSTATDATA_Construct(unk, 0, This->max_cons, This->connections, TRUE, enum_advise);
IUnknown_Release(unk);
return hr;
}
@@ -737,7 +744,7 @@ static HRESULT WINAPI DataAdviseHolder_EnumAdvise(IDataAdviseHolder *iface,
TRACE("(%p)->(%p)\n", This, enum_advise);
IDataAdviseHolder_QueryInterface(iface, &IID_IUnknown, (void**)&unk);
- hr = EnumSTATDATA_Construct(unk, 0, This->maxCons, This->connections, enum_advise);
+ hr = EnumSTATDATA_Construct(unk, 0, This->maxCons, This->connections, TRUE, enum_advise);
IUnknown_Release(unk);
return hr;
}
More information about the wine-cvs
mailing list