ole32: Allow the EnumSTATDATA constructor to take a sparse array.

oldstable
Huw Davies 2010-12-17 14:07:19 +00:00 committed by Alexandre Julliard
parent 892796a9a6
commit 4151b49fad
1 changed files with 13 additions and 7 deletions

View File

@ -80,7 +80,7 @@ typedef struct OleAdviseHolderImpl
} OleAdviseHolderImpl;
static HRESULT EnumSTATDATA_Construct(IUnknown *holder, ULONG index, DWORD num, STATDATA *data, IEnumSTATDATA **ppenum);
static HRESULT EnumSTATDATA_Construct(IUnknown *holder, ULONG index, DWORD array_len, STATDATA *data, IEnumSTATDATA **ppenum);
typedef struct
{
@ -207,11 +207,11 @@ static const IEnumSTATDATAVtbl EnumSTATDATA_VTable =
EnumSTATDATA_Clone
};
static HRESULT EnumSTATDATA_Construct(IUnknown *holder, ULONG index, DWORD num, STATDATA *data,
static HRESULT EnumSTATDATA_Construct(IUnknown *holder, ULONG index, DWORD array_len, STATDATA *data,
IEnumSTATDATA **ppenum)
{
EnumSTATDATA *This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
DWORD i;
DWORD i, count;
if (!This) return E_OUTOFMEMORY;
@ -219,17 +219,23 @@ static HRESULT EnumSTATDATA_Construct(IUnknown *holder, ULONG index, DWORD num,
This->ref = 1;
This->index = index;
This->statdata = HeapAlloc(GetProcessHeap(), 0, num * sizeof(*This->statdata));
This->statdata = HeapAlloc(GetProcessHeap(), 0, array_len * sizeof(*This->statdata));
if(!This->statdata)
{
HeapFree(GetProcessHeap(), 0, This);
return E_OUTOFMEMORY;
}
for(i = 0; i < num; i++)
copy_statdata(This->statdata + i, data + i);
for(i = 0, count = 0; i < array_len; i++)
{
if(data[i].pAdvSink)
{
copy_statdata(This->statdata + count, data + i);
count++;
}
}
This->num_of_elems = num;
This->num_of_elems = count;
This->holder = holder;
IUnknown_AddRef(holder);
*ppenum = &This->IEnumSTATDATA_iface;