Mike McCormack : ole32: Use enumx to implement
IPropertySetStorage::Enum.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jul 12 06:53:42 CDT 2006
Module: wine
Branch: master
Commit: d35176d52ab798ab013583ca20192556c6630a4e
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=d35176d52ab798ab013583ca20192556c6630a4e
Author: Mike McCormack <mike at 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
*/
More information about the wine-cvs
mailing list