From 9d85a3992615775f471d23f1111215ccf3623853 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Thu, 21 May 2009 13:13:11 -0500 Subject: [PATCH] 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 6f8e41b..7433f4a 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); -- 1.5.4.3