Module: wine Branch: master Commit: d35176d52ab798ab013583ca20192556c6630a4e URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=d35176d52ab798ab013583ca...
Author: Mike McCormack mike@codeweavers.com Date: Tue Jul 11 16:13:29 2006 +0900
ole32: Use enumx to implement IPropertySetStorage::Enum.
---
dlls/ole32/stg_prop.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 120 insertions(+), 2 deletions(-)
diff --git a/dlls/ole32/stg_prop.c b/dlls/ole32/stg_prop.c index 1773224..441457b 100644 --- a/dlls/ole32/stg_prop.c +++ b/dlls/ole32/stg_prop.c @@ -60,6 +60,7 @@ #include "wine/unicode.h" #include "wine/debug.h" #include "dictionary.h" #include "storage32.h" +#include "enumx.h"
WINE_DEFAULT_DEBUG_CHANNEL(storage);
@@ -154,6 +155,8 @@ static HRESULT PropertyStorage_StringCop LCID targetCP);
static const IPropertyStorageVtbl IPropertyStorage_Vtbl; +static const IEnumSTATPROPSETSTGVtbl IEnumSTATPROPSETSTG_Vtbl; +static HRESULT create_EnumSTATPROPSETSTG(StorageImpl *, IEnumSTATPROPSETSTG**);
/*********************************************************************** * Implementation of IPropertyStorage @@ -2222,10 +2225,114 @@ static HRESULT WINAPI IPropertySetStorag IEnumSTATPROPSETSTG** ppenum) { StorageImpl *This = impl_from_IPropertySetStorage(ppstg); - FIXME("%p\n", This); - return E_NOTIMPL; + return create_EnumSTATPROPSETSTG(This, ppenum); +} + +/************************************************************************ + * Implement IEnumSTATPROPSETSTG using enumx + */ +static HRESULT WINAPI IEnumSTATPROPSETSTG_fnQueryInterface( + IEnumSTATPROPSETSTG *iface, + REFIID riid, + void** ppvObject) +{ + return enumx_QueryInterface((enumx_impl*)iface, riid, ppvObject); +} + +static ULONG WINAPI IEnumSTATPROPSETSTG_fnAddRef( + IEnumSTATPROPSETSTG *iface) +{ + return enumx_AddRef((enumx_impl*)iface); +} + +static ULONG WINAPI IEnumSTATPROPSETSTG_fnRelease( + IEnumSTATPROPSETSTG *iface) +{ + return enumx_Release((enumx_impl*)iface); +} + +static HRESULT WINAPI IEnumSTATPROPSETSTG_fnNext( + IEnumSTATPROPSETSTG *iface, + ULONG celt, + STATPROPSETSTG *rgelt, + ULONG *pceltFetched) +{ + return enumx_Next((enumx_impl*)iface, celt, rgelt, pceltFetched); +} + +static HRESULT WINAPI IEnumSTATPROPSETSTG_fnSkip( + IEnumSTATPROPSETSTG *iface, + ULONG celt) +{ + return enumx_Skip((enumx_impl*)iface, celt); }
+static HRESULT WINAPI IEnumSTATPROPSETSTG_fnReset( + IEnumSTATPROPSETSTG *iface) +{ + return enumx_Reset((enumx_impl*)iface); +} + +static HRESULT WINAPI IEnumSTATPROPSETSTG_fnClone( + IEnumSTATPROPSETSTG *iface, + IEnumSTATPROPSETSTG **ppenum) +{ + return enumx_Clone((enumx_impl*)iface, (enumx_impl**)ppenum); +} + +static HRESULT create_EnumSTATPROPSETSTG( + StorageImpl *This, + IEnumSTATPROPSETSTG** ppenum) +{ + IStorage *stg = (IStorage*) &This->base.lpVtbl; + IEnumSTATSTG *penum = NULL; + STATSTG stat; + ULONG count; + HRESULT r; + STATPROPSETSTG statpss; + enumx_impl *enumx; + + TRACE("%p %p\n", This, ppenum); + + enumx = enumx_allocate(&IID_IEnumSTATPROPSETSTG, + &IEnumSTATPROPSETSTG_Vtbl, + sizeof (STATPROPSETSTG)); + + /* add all the property set elements into a list */ + r = IStorage_EnumElements(stg, 0, NULL, 0, &penum); + if (FAILED(r)) + return E_OUTOFMEMORY; + + while (1) + { + count = 0; + r = IEnumSTATSTG_Next(penum, 1, &stat, &count); + if (FAILED(r)) + break; + if (!count) + break; + if (!stat.pwcsName) + continue; + if (stat.pwcsName[0] == 5 && stat.type == STGTY_STREAM) + { + PropStgNameToFmtId(stat.pwcsName, &statpss.fmtid); + TRACE("adding %s (%s)\n", debugstr_w(stat.pwcsName), + debugstr_guid(&statpss.fmtid)); + statpss.mtime = stat.mtime; + statpss.atime = stat.atime; + statpss.ctime = stat.ctime; + statpss.grfFlags = stat.grfMode; + memcpy(&statpss.clsid, &stat.clsid, sizeof stat.clsid); + enumx_add_element(enumx, &statpss); + } + CoTaskMemFree(stat.pwcsName); + } + IEnumSTATSTG_Release(penum); + + *ppenum = (IEnumSTATPROPSETSTG*) enumx; + + return S_OK; +}
/*********************************************************************** * vtables @@ -2260,6 +2367,17 @@ static const IPropertyStorageVtbl IPrope IPropertyStorage_fnStat, };
+static const IEnumSTATPROPSETSTGVtbl IEnumSTATPROPSETSTG_Vtbl = +{ + IEnumSTATPROPSETSTG_fnQueryInterface, + IEnumSTATPROPSETSTG_fnAddRef, + IEnumSTATPROPSETSTG_fnRelease, + IEnumSTATPROPSETSTG_fnNext, + IEnumSTATPROPSETSTG_fnSkip, + IEnumSTATPROPSETSTG_fnReset, + IEnumSTATPROPSETSTG_fnClone, +}; + /*********************************************************************** * Format ID <-> name conversion */