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