Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/ole32/Makefile.in | 1 - dlls/ole32/enumx.c | 205 ------------------------------ dlls/ole32/enumx.h | 34 ----- dlls/ole32/stg_prop.c | 281 +++++++++++++++++++++++++---------------- 4 files changed, 175 insertions(+), 346 deletions(-) delete mode 100644 dlls/ole32/enumx.c delete mode 100644 dlls/ole32/enumx.h
diff --git a/dlls/ole32/Makefile.in b/dlls/ole32/Makefile.in index 32de987a8c..310f6fc119 100644 --- a/dlls/ole32/Makefile.in +++ b/dlls/ole32/Makefile.in @@ -17,7 +17,6 @@ C_SRCS = \ datacache.c \ defaulthandler.c \ dictionary.c \ - enumx.c \ errorinfo.c \ filelockbytes.c \ filemoniker.c \ diff --git a/dlls/ole32/enumx.c b/dlls/ole32/enumx.c deleted file mode 100644 index 4279ca81fa..0000000000 --- a/dlls/ole32/enumx.c +++ /dev/null @@ -1,205 +0,0 @@ -/* - * IEnum* implementation - * - * Copyright 2006 Mike McCormack - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#define COBJMACROS - -#include <stdarg.h> - -#include "windef.h" -#include "winbase.h" -#include "objbase.h" - -#include "enumx.h" - -#include "wine/list.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(ole); - -struct tagEnumSTATPROPSETSTG_impl -{ - const void *vtbl; - LONG ref; - struct list elements; - struct list *current; - ULONG elem_size; - GUID riid; -}; - -/************************************************************************ - * enumx_QueryInterface - */ -HRESULT WINAPI enumx_QueryInterface( - enumx_impl *This, - REFIID riid, - void** ppvObject) -{ - if ( ppvObject==0 ) - return E_INVALIDARG; - - *ppvObject = 0; - - if (IsEqualGUID(&IID_IUnknown, riid) || - IsEqualGUID(&This->riid, riid)) - { - IUnknown_AddRef(((IUnknown*)This)); - *ppvObject = This; - return S_OK; - } - - return E_NOINTERFACE; -} - -/************************************************************************ - * enumx_AddRef - */ -ULONG WINAPI enumx_AddRef(enumx_impl *This) -{ - return InterlockedIncrement(&This->ref); -} - -/************************************************************************ - * enumx_Release - */ -ULONG WINAPI enumx_Release(enumx_impl *This) -{ - ULONG ref; - - ref = InterlockedDecrement(&This->ref); - if (ref == 0) - { - while (!list_empty(&This->elements)) - { - struct list *x = list_head(&This->elements); - list_remove(x); - HeapFree(GetProcessHeap(), 0, x); - } - HeapFree(GetProcessHeap(), 0, This); - } - return ref; -} - -/************************************************************************ - * enumx_Next - */ -HRESULT WINAPI enumx_Next(enumx_impl *This, ULONG celt, - void *rgelt, ULONG *pceltFetched) -{ - unsigned char *p; - ULONG count = 0; - - TRACE("%p %u %p\n", This, celt, pceltFetched); - - if (This->current == NULL) - This->current = list_head(&This->elements); - p = rgelt; - while (count < celt && This->current && This->current != &This->elements) - { - memcpy(p, &This->current[1], This->elem_size); - p += This->elem_size; - This->current = This->current->next; - count++; - } - if (pceltFetched) - *pceltFetched = count; - if (count < celt) - return S_FALSE; - return S_OK; -} - -/************************************************************************ - * enumx_Skip - */ -HRESULT WINAPI enumx_Skip(enumx_impl *This, ULONG celt) -{ - ULONG count = 0; - - TRACE("%p %u\n", This, celt); - - if (This->current == NULL) - This->current = list_head(&This->elements); - - while (count < celt && This->current && This->current != &This->elements) - count++; - - return S_OK; -} - -/************************************************************************ - * enumx_Reset - */ -HRESULT WINAPI enumx_Reset(enumx_impl *This) -{ - TRACE("\n"); - - This->current = NULL; - return S_OK; -} - -/************************************************************************ - * enumx_fnClone - */ -HRESULT WINAPI enumx_Clone( - enumx_impl *iface, - enumx_impl **ppenum) -{ - FIXME("\n"); - return E_NOTIMPL; -} - -/************************************************************************ - * enumx_allocate - * - * Allocate a generic enumerator - */ -enumx_impl *enumx_allocate(REFIID riid, const void *vtbl, ULONG elem_size) -{ - enumx_impl *enumx; - - enumx = HeapAlloc(GetProcessHeap(), 0, sizeof *enumx); - if (enumx) - { - enumx->vtbl = vtbl; - enumx->ref = 1; - enumx->current = NULL; - enumx->elem_size = elem_size; - enumx->riid = *riid; - list_init(&enumx->elements); - } - - return enumx; -} - -/************************************************************************ - * enumx_add_element - * - * Add an element to the enumeration. - */ -void *enumx_add_element(enumx_impl *enumx, const void *data) -{ - struct list *element; - - element = HeapAlloc(GetProcessHeap(), 0, sizeof *element + enumx->elem_size); - if (!element) - return NULL; - memcpy(&element[1], data, enumx->elem_size); - list_add_tail(&enumx->elements, element); - return &element[1]; -} diff --git a/dlls/ole32/enumx.h b/dlls/ole32/enumx.h deleted file mode 100644 index da76e13769..0000000000 --- a/dlls/ole32/enumx.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2006 Mike McCormack - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#ifndef __OLE_ENUM_H__ -#define __OLE_ENUM_H__ - -typedef struct tagEnumSTATPROPSETSTG_impl enumx_impl; - -extern HRESULT WINAPI enumx_QueryInterface(enumx_impl *, REFIID, void**) DECLSPEC_HIDDEN; -extern ULONG WINAPI enumx_AddRef(enumx_impl *) DECLSPEC_HIDDEN; -extern ULONG WINAPI enumx_Release(enumx_impl *) DECLSPEC_HIDDEN; -extern HRESULT WINAPI enumx_Next(enumx_impl *, ULONG, void *, ULONG *) DECLSPEC_HIDDEN; -extern HRESULT WINAPI enumx_Skip(enumx_impl *, ULONG) DECLSPEC_HIDDEN; -extern HRESULT WINAPI enumx_Reset(enumx_impl *) DECLSPEC_HIDDEN; -extern HRESULT WINAPI enumx_Clone(enumx_impl *, enumx_impl **) DECLSPEC_HIDDEN; -extern enumx_impl *enumx_allocate(REFIID, const void *, ULONG) DECLSPEC_HIDDEN; -extern void *enumx_add_element(enumx_impl *, const void *) DECLSPEC_HIDDEN; - -#endif diff --git a/dlls/ole32/stg_prop.c b/dlls/ole32/stg_prop.c index 2e43d16b35..70b8cd3b0e 100644 --- a/dlls/ole32/stg_prop.c +++ b/dlls/ole32/stg_prop.c @@ -10,6 +10,7 @@ * Copyright 1999 Thuy Nguyen * Copyright 2005 Mike McCormack * Copyright 2005 Juan Lang + * Copyright 2006 Mike McCormack * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -54,7 +55,6 @@ #include "wine/heap.h" #include "dictionary.h" #include "storage32.h" -#include "enumx.h" #include "oleauto.h"
WINE_DEFAULT_DEBUG_CHANNEL(storage); @@ -143,8 +143,6 @@ static HRESULT PropertyStorage_StringCopy(LPCSTR src, LCID srcCP, LPSTR *dst, LCID targetCP);
static const IPropertyStorageVtbl IPropertyStorage_Vtbl; -static const IEnumSTATPROPSTGVtbl IEnumSTATPROPSTG_Vtbl; -static HRESULT create_EnumSTATPROPSTG(PropertyStorage_impl *, IEnumSTATPROPSTG**);
/*********************************************************************** * Implementation of IPropertyStorage @@ -175,6 +173,174 @@ static inline PropertyStorage_impl *impl_from_IPropertyStorage(IPropertyStorage return CONTAINING_RECORD(iface, PropertyStorage_impl, IPropertyStorage_iface); }
+struct enum_stat_prop_stg +{ + IEnumSTATPROPSTG IEnumSTATPROPSTG_iface; + LONG refcount; + STATPROPSTG *stats; + size_t current; + size_t count; +}; + +static struct enum_stat_prop_stg *impl_from_IEnumSTATPROPSTG(IEnumSTATPROPSTG *iface) +{ + return CONTAINING_RECORD(iface, struct enum_stat_prop_stg, IEnumSTATPROPSTG_iface); +} + +static HRESULT WINAPI enum_stat_prop_stg_QueryInterface(IEnumSTATPROPSTG *iface, REFIID riid, void **obj) +{ + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj); + + if (IsEqualIID(riid, &IID_IEnumSTATPROPSTG) || + IsEqualIID(riid, &IID_IUnknown)) + { + *obj = iface; + IEnumSTATPROPSTG_AddRef(iface); + return S_OK; + } + + WARN("Unsupported interface %s.\n", debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI enum_stat_prop_stg_AddRef(IEnumSTATPROPSTG *iface) +{ + struct enum_stat_prop_stg *penum = impl_from_IEnumSTATPROPSTG(iface); + LONG refcount = InterlockedIncrement(&penum->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + return refcount; +} + +static ULONG WINAPI enum_stat_prop_stg_Release(IEnumSTATPROPSTG *iface) +{ + struct enum_stat_prop_stg *penum = impl_from_IEnumSTATPROPSTG(iface); + LONG refcount = InterlockedDecrement(&penum->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + if (!refcount) + { + heap_free(penum->stats); + heap_free(penum); + } + + return refcount; +} + +static HRESULT WINAPI enum_stat_prop_stg_Next(IEnumSTATPROPSTG *iface, ULONG celt, STATPROPSTG *ret, ULONG *fetched) +{ + struct enum_stat_prop_stg *penum = impl_from_IEnumSTATPROPSTG(iface); + ULONG count = 0; + + TRACE("%p, %u, %p, %p.\n", iface, celt, ret, fetched); + + if (penum->current == ~0u) + penum->current = 0; + + while (count < celt && penum->current < penum->count) + ret[count++] = penum->stats[penum->current++]; + + if (fetched) + *fetched = count; + + return count < celt ? S_FALSE : S_OK; +} + +static HRESULT WINAPI enum_stat_prop_stg_Skip(IEnumSTATPROPSTG *iface, ULONG celt) +{ + FIXME("%p, %u.\n", iface, celt); + + return S_OK; +} + +static HRESULT WINAPI enum_stat_prop_stg_Reset(IEnumSTATPROPSTG *iface) +{ + struct enum_stat_prop_stg *penum = impl_from_IEnumSTATPROPSTG(iface); + + TRACE("%p.\n", iface); + + penum->current = ~0u; + + return S_OK; +} + +static HRESULT WINAPI enum_stat_prop_stg_Clone(IEnumSTATPROPSTG *iface, IEnumSTATPROPSTG **ppenum) +{ + FIXME("%p, %p.\n", iface, ppenum); + + return E_NOTIMPL; +} + +static const IEnumSTATPROPSTGVtbl enum_stat_prop_stg_vtbl = +{ + enum_stat_prop_stg_QueryInterface, + enum_stat_prop_stg_AddRef, + enum_stat_prop_stg_Release, + enum_stat_prop_stg_Next, + enum_stat_prop_stg_Skip, + enum_stat_prop_stg_Reset, + enum_stat_prop_stg_Clone, +}; + +static BOOL prop_enum_stat(const void *k, const void *v, void *extra, void *arg) +{ + struct enum_stat_prop_stg *stg = arg; + PROPID propid = PtrToUlong(k); + const PROPVARIANT *prop = v; + STATPROPSTG *dest; + + dest = &stg->stats[stg->count]; + + dest->lpwstrName = NULL; + dest->propid = propid; + dest->vt = prop->vt; + stg->count++; + + return TRUE; +} + +static BOOL prop_enum_stat_count(const void *k, const void *v, void *extra, void *arg) +{ + DWORD *count = arg; + + *count += 1; + + return TRUE; +} + +static HRESULT create_enum_stat_prop_stg(PropertyStorage_impl *storage, IEnumSTATPROPSTG **ret) +{ + struct enum_stat_prop_stg *enum_obj; + DWORD count; + + enum_obj = heap_alloc_zero(sizeof(*enum_obj)); + if (!enum_obj) + return E_OUTOFMEMORY; + + enum_obj->IEnumSTATPROPSTG_iface.lpVtbl = &enum_stat_prop_stg_vtbl; + enum_obj->refcount = 1; + + count = 0; + dictionary_enumerate(storage->propid_to_prop, prop_enum_stat_count, &count); + + if (count) + { + if (!(enum_obj->stats = heap_alloc(sizeof(*enum_obj->stats) * count))) + { + IEnumSTATPROPSTG_Release(&enum_obj->IEnumSTATPROPSTG_iface); + return E_OUTOFMEMORY; + } + + dictionary_enumerate(storage->propid_to_prop, prop_enum_stat, enum_obj); + } + + *ret = &enum_obj->IEnumSTATPROPSTG_iface; + + return S_OK; +} + /************************************************************************ * IPropertyStorage_fnQueryInterface (IPropertyStorage) */ @@ -853,12 +1019,13 @@ static HRESULT WINAPI IPropertyStorage_fnRevert( /************************************************************************ * IPropertyStorage_fnEnum (IPropertyStorage) */ -static HRESULT WINAPI IPropertyStorage_fnEnum( - IPropertyStorage* iface, - IEnumSTATPROPSTG** ppenum) +static HRESULT WINAPI IPropertyStorage_fnEnum(IPropertyStorage *iface, IEnumSTATPROPSTG **ppenum) { - PropertyStorage_impl *This = impl_from_IPropertyStorage(iface); - return create_EnumSTATPROPSTG(This, ppenum); + PropertyStorage_impl *storage = impl_from_IPropertyStorage(iface); + + TRACE("%p, %p.\n", iface, ppenum); + + return create_enum_stat_prop_stg(storage, ppenum); }
/************************************************************************ @@ -2516,93 +2683,6 @@ static HRESULT WINAPI IPropertySetStorage_fnEnum(IPropertySetStorage *iface, IEn return create_enum_stat_propset_stg(storage, enum_obj); }
-/************************************************************************ - * Implement IEnumSTATPROPSTG using enumx - */ -static HRESULT WINAPI IEnumSTATPROPSTG_fnQueryInterface( - IEnumSTATPROPSTG *iface, - REFIID riid, - void** ppvObject) -{ - return enumx_QueryInterface((enumx_impl*)iface, riid, ppvObject); -} - -static ULONG WINAPI IEnumSTATPROPSTG_fnAddRef( - IEnumSTATPROPSTG *iface) -{ - return enumx_AddRef((enumx_impl*)iface); -} - -static ULONG WINAPI IEnumSTATPROPSTG_fnRelease( - IEnumSTATPROPSTG *iface) -{ - return enumx_Release((enumx_impl*)iface); -} - -static HRESULT WINAPI IEnumSTATPROPSTG_fnNext( - IEnumSTATPROPSTG *iface, - ULONG celt, - STATPROPSTG *rgelt, - ULONG *pceltFetched) -{ - return enumx_Next((enumx_impl*)iface, celt, rgelt, pceltFetched); -} - -static HRESULT WINAPI IEnumSTATPROPSTG_fnSkip( - IEnumSTATPROPSTG *iface, - ULONG celt) -{ - return enumx_Skip((enumx_impl*)iface, celt); -} - -static HRESULT WINAPI IEnumSTATPROPSTG_fnReset( - IEnumSTATPROPSTG *iface) -{ - return enumx_Reset((enumx_impl*)iface); -} - -static HRESULT WINAPI IEnumSTATPROPSTG_fnClone( - IEnumSTATPROPSTG *iface, - IEnumSTATPROPSTG **ppenum) -{ - return enumx_Clone((enumx_impl*)iface, (enumx_impl**)ppenum); -} - -static BOOL prop_enum_stat(const void *k, const void *v, void *extra, void *arg) -{ - enumx_impl *enumx = arg; - PROPID propid = PtrToUlong(k); - const PROPVARIANT *prop = v; - STATPROPSTG stat; - - stat.lpwstrName = NULL; - stat.propid = propid; - stat.vt = prop->vt; - - enumx_add_element(enumx, &stat); - - return TRUE; -} - -static HRESULT create_EnumSTATPROPSTG( - PropertyStorage_impl *This, - IEnumSTATPROPSTG** ppenum) -{ - enumx_impl *enumx; - - TRACE("%p %p\n", This, ppenum); - - enumx = enumx_allocate(&IID_IEnumSTATPROPSTG, - &IEnumSTATPROPSTG_Vtbl, - sizeof (STATPROPSTG)); - - dictionary_enumerate(This->propid_to_prop, prop_enum_stat, enumx); - - *ppenum = (IEnumSTATPROPSTG*) enumx; - - return S_OK; -} - /*********************************************************************** * vtables */ @@ -2636,17 +2716,6 @@ static const IPropertyStorageVtbl IPropertyStorage_Vtbl = IPropertyStorage_fnStat, };
-static const IEnumSTATPROPSTGVtbl IEnumSTATPROPSTG_Vtbl = -{ - IEnumSTATPROPSTG_fnQueryInterface, - IEnumSTATPROPSTG_fnAddRef, - IEnumSTATPROPSTG_fnRelease, - IEnumSTATPROPSTG_fnNext, - IEnumSTATPROPSTG_fnSkip, - IEnumSTATPROPSTG_fnReset, - IEnumSTATPROPSTG_fnClone, -}; - /*********************************************************************** * Format ID <-> name conversion */