scrrun: Store collection pointer directly in IEnumVARIANT data.

oldstable
Nikolay Sivov 2014-01-08 12:36:54 +04:00 committed by Alexandre Julliard
parent 64c93f6070
commit c1b7a075ca
1 changed files with 33 additions and 51 deletions

View File

@ -38,31 +38,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(scrrun);
static const WCHAR bsW[] = {'\\',0};
struct enumdata {
union
{
struct
{
IFolderCollection *coll;
HANDLE find;
BSTR path;
} foldercoll;
struct
{
IFileCollection *coll;
HANDLE find;
BSTR path;
} filecoll;
} u;
};
struct enumvariant {
IEnumVARIANT IEnumVARIANT_iface;
LONG ref;
struct enumdata data;
};
struct foldercollection {
IFolderCollection IFolderCollection_iface;
LONG ref;
@ -75,6 +50,29 @@ struct filecollection {
BSTR path;
};
struct enumdata {
union
{
struct
{
struct foldercollection *coll;
HANDLE find;
} foldercoll;
struct
{
struct filecollection *coll;
HANDLE find;
} filecoll;
} u;
};
struct enumvariant {
IEnumVARIANT IEnumVARIANT_iface;
LONG ref;
struct enumdata data;
};
struct folder {
IFolder IFolder_iface;
LONG ref;
@ -459,8 +457,7 @@ static ULONG WINAPI foldercoll_enumvariant_Release(IEnumVARIANT *iface)
if (!ref)
{
IFolderCollection_Release(This->data.u.foldercoll.coll);
SysFreeString(This->data.u.foldercoll.path);
IFolderCollection_Release(&This->data.u.foldercoll.coll->IFolderCollection_iface);
FindClose(This->data.u.foldercoll.find);
heap_free(This);
}
@ -484,7 +481,7 @@ static HRESULT WINAPI foldercoll_enumvariant_Next(IEnumVARIANT *iface, ULONG cel
{
static const WCHAR allW[] = {'*',0};
WCHAR pathW[MAX_PATH];
BSTR parent = This->data.u.foldercoll.path;
BSTR parent = This->data.u.foldercoll.coll->path;
int len;
strcpyW(pathW, parent);
@ -522,7 +519,7 @@ static HRESULT WINAPI foldercoll_enumvariant_Next(IEnumVARIANT *iface, ULONG cel
HRESULT hr;
BSTR str;
str = get_full_path(This->data.u.foldercoll.path, &data);
str = get_full_path(This->data.u.foldercoll.coll->path, &data);
hr = create_folder(str, &folder);
SysFreeString(str);
if (FAILED(hr)) return hr;
@ -598,15 +595,8 @@ static HRESULT create_foldercoll_enum(struct foldercollection *collection, IUnkn
This->IEnumVARIANT_iface.lpVtbl = &foldercollenumvariantvtbl;
This->ref = 1;
This->data.u.foldercoll.find = NULL;
This->data.u.foldercoll.path = SysAllocString(collection->path);
if (!This->data.u.foldercoll.path)
{
heap_free(This);
return E_OUTOFMEMORY;
}
This->data.u.foldercoll.coll = &collection->IFolderCollection_iface;
IFolderCollection_AddRef(This->data.u.foldercoll.coll);
This->data.u.foldercoll.coll = collection;
IFolderCollection_AddRef(&collection->IFolderCollection_iface);
*newenum = (IUnknown*)&This->IEnumVARIANT_iface;
@ -622,8 +612,7 @@ static ULONG WINAPI filecoll_enumvariant_Release(IEnumVARIANT *iface)
if (!ref)
{
IFileCollection_Release(This->data.u.filecoll.coll);
SysFreeString(This->data.u.filecoll.path);
IFileCollection_Release(&This->data.u.filecoll.coll->IFileCollection_iface);
heap_free(This);
}
@ -646,7 +635,7 @@ static HRESULT WINAPI filecoll_enumvariant_Next(IEnumVARIANT *iface, ULONG celt,
{
static const WCHAR allW[] = {'*',0};
WCHAR pathW[MAX_PATH];
BSTR parent = This->data.u.filecoll.path;
BSTR parent = This->data.u.filecoll.coll->path;
int len;
strcpyW(pathW, parent);
@ -683,7 +672,7 @@ static HRESULT WINAPI filecoll_enumvariant_Next(IEnumVARIANT *iface, ULONG celt,
HRESULT hr;
BSTR str;
str = get_full_path(This->data.u.filecoll.path, &data);
str = get_full_path(This->data.u.filecoll.coll->path, &data);
hr = create_file(str, &file);
SysFreeString(str);
if (FAILED(hr)) return hr;
@ -758,15 +747,8 @@ static HRESULT create_filecoll_enum(struct filecollection *collection, IUnknown
This->IEnumVARIANT_iface.lpVtbl = &filecollenumvariantvtbl;
This->ref = 1;
This->data.u.filecoll.path = SysAllocString(collection->path);
if (!This->data.u.filecoll.path)
{
heap_free(This);
return E_OUTOFMEMORY;
}
This->data.u.filecoll.coll = &collection->IFileCollection_iface;
IFileCollection_AddRef(This->data.u.filecoll.coll);
This->data.u.filecoll.coll = collection;
IFileCollection_AddRef(&collection->IFileCollection_iface);
*newenum = (IUnknown*)&This->IEnumVARIANT_iface;