Vincent Povirk : shell32: Handle parent folders in SHCreateShellItem.
Alexandre Julliard
julliard at winehq.org
Fri May 22 08:25:33 CDT 2009
Module: wine
Branch: master
Commit: 5b95a43d5e16ee7ae9674ffac1a5d794bc89b3e6
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5b95a43d5e16ee7ae9674ffac1a5d794bc89b3e6
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Thu May 21 13:13:11 2009 -0500
shell32: Handle parent folders in SHCreateShellItem.
---
dlls/shell32/shellitem.c | 33 +++++++++++++++++++++++++++++----
dlls/shell32/tests/shlfolder.c | 6 +++---
2 files changed, 32 insertions(+), 7 deletions(-)
diff --git a/dlls/shell32/shellitem.c b/dlls/shell32/shellitem.c
index 08b2e24..50f0327 100644
--- a/dlls/shell32/shellitem.c
+++ b/dlls/shell32/shellitem.c
@@ -280,16 +280,41 @@ HRESULT WINAPI SHCreateShellItem(LPCITEMIDLIST pidlParent,
{
return E_INVALIDARG;
}
- else if (!pidlParent && !psfParent)
+ else if (pidlParent || psfParent)
{
- new_pidl = ILClone(pidl);
+ LPITEMIDLIST temp_parent=NULL;
+ if (!pidlParent)
+ {
+ IPersistFolder2* ppf2Parent;
+
+ if (!SUCCEEDED(IPersistFolder2_QueryInterface(psfParent, &IID_IPersistFolder2, (void**)&ppf2Parent)))
+ {
+ FIXME("couldn't get IPersistFolder2 interface of parent\n");
+ return E_NOINTERFACE;
+ }
+
+ if (!SUCCEEDED(IPersistFolder2_GetCurFolder(ppf2Parent, &temp_parent)))
+ {
+ FIXME("couldn't get parent PIDL\n");
+ IPersistFolder2_Release(ppf2Parent);
+ return E_NOINTERFACE;
+ }
+
+ pidlParent = temp_parent;
+ IPersistFolder2_Release(ppf2Parent);
+ }
+
+ new_pidl = ILCombine(pidlParent, pidl);
+ ILFree(temp_parent);
+
if (!new_pidl)
return E_OUTOFMEMORY;
}
else
{
- FIXME("(%p,%p,%p) not implemented\n", pidlParent, psfParent, pidl);
- return E_NOINTERFACE;
+ new_pidl = ILClone(pidl);
+ if (!new_pidl)
+ return E_OUTOFMEMORY;
}
ret = IShellItem_Constructor(NULL, &IID_IShellItem, (void**)&This);
diff --git a/dlls/shell32/tests/shlfolder.c b/dlls/shell32/tests/shlfolder.c
index 9c0c9a0..aed9f0e 100644
--- a/dlls/shell32/tests/shlfolder.c
+++ b/dlls/shell32/tests/shlfolder.c
@@ -1814,7 +1814,7 @@ static void test_SHCreateShellItem(void)
}
ret = pSHCreateShellItem(pidl_cwd, NULL, pidl_testfile, &shellitem);
- todo_wine ok(SUCCEEDED(ret), "SHCreateShellItem returned %x\n", ret);
+ ok(SUCCEEDED(ret), "SHCreateShellItem returned %x\n", ret);
if (SUCCEEDED(ret))
{
ret = IShellItem_QueryInterface(shellitem, &IID_IPersistIDList, (void**)&persistidl);
@@ -1834,7 +1834,7 @@ static void test_SHCreateShellItem(void)
}
ret = pSHCreateShellItem(NULL, currentfolder, pidl_testfile, &shellitem);
- todo_wine ok(SUCCEEDED(ret), "SHCreateShellItem returned %x\n", ret);
+ ok(SUCCEEDED(ret), "SHCreateShellItem returned %x\n", ret);
if (SUCCEEDED(ret))
{
ret = IShellItem_QueryInterface(shellitem, &IID_IPersistIDList, (void**)&persistidl);
@@ -1855,7 +1855,7 @@ static void test_SHCreateShellItem(void)
/* if a parent pidl and shellfolder are specified, the shellfolder is ignored */
ret = pSHCreateShellItem(pidl_cwd, desktopfolder, pidl_testfile, &shellitem);
- todo_wine ok(SUCCEEDED(ret), "SHCreateShellItem returned %x\n", ret);
+ ok(SUCCEEDED(ret), "SHCreateShellItem returned %x\n", ret);
if (SUCCEEDED(ret))
{
ret = IShellItem_QueryInterface(shellitem, &IID_IPersistIDList, (void**)&persistidl);
More information about the wine-cvs
mailing list