From a721e2fd30e33f533792b78db503f951ae3115e4 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Thu, 21 May 2009 13:18:26 -0500 Subject: [PATCH] shell32: implement IShellItem_GetParent --- dlls/shell32/shellitem.c | 36 +++++++++++++++++++++++++++++++++--- dlls/shell32/tests/shlfolder.c | 23 ++++++++++++++++++++++- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/dlls/shell32/shellitem.c b/dlls/shell32/shellitem.c index 50f0327..ffd528b 100644 --- a/dlls/shell32/shellitem.c +++ b/dlls/shell32/shellitem.c @@ -105,6 +105,27 @@ static ULONG WINAPI ShellItem_Release(IShellItem *iface) return ref; } +static HRESULT ShellItem_get_parent_pidl(ShellItem *This, LPITEMIDLIST *parent_pidl) +{ + *parent_pidl = ILClone(This->pidl); + if (*parent_pidl) + { + if (ILRemoveLastID(*parent_pidl)) + return S_OK; + else + { + ILFree(*parent_pidl); + *parent_pidl = NULL; + return E_INVALIDARG; + } + } + else + { + *parent_pidl = NULL; + return E_OUTOFMEMORY; + } +} + static HRESULT WINAPI ShellItem_BindToHandler(IShellItem *iface, IBindCtx *pbc, REFGUID rbhid, REFIID riid, void **ppvOut) { @@ -117,11 +138,20 @@ static HRESULT WINAPI ShellItem_BindToHandler(IShellItem *iface, IBindCtx *pbc, static HRESULT WINAPI ShellItem_GetParent(IShellItem *iface, IShellItem **ppsi) { - FIXME("(%p,%p)\n", iface, ppsi); + ShellItem *This = (ShellItem*)iface; + LPITEMIDLIST parent_pidl; + HRESULT ret; - *ppsi = NULL; + TRACE("(%p,%p)\n", iface, ppsi); - return E_NOTIMPL; + ret = ShellItem_get_parent_pidl(This, &parent_pidl); + if (SUCCEEDED(ret)) + { + ret = SHCreateShellItem(NULL, NULL, parent_pidl, ppsi); + ILFree(parent_pidl); + } + + return ret; } static HRESULT WINAPI ShellItem_GetDisplayName(IShellItem *iface, SIGDN sigdnName, diff --git a/dlls/shell32/tests/shlfolder.c b/dlls/shell32/tests/shlfolder.c index 7433f4a..ce2c2ba 100644 --- a/dlls/shell32/tests/shlfolder.c +++ b/dlls/shell32/tests/shlfolder.c @@ -1747,7 +1747,7 @@ cleanup: static void test_SHCreateShellItem(void) { - IShellItem *shellitem; + IShellItem *shellitem, *shellitem2; IPersistIDList *persistidl; LPITEMIDLIST pidl_cwd=NULL, pidl_testfile, pidl_abstestfile, pidl_test; HRESULT ret; @@ -1830,6 +1830,27 @@ static void test_SHCreateShellItem(void) } IPersistIDList_Release(persistidl); } + + ret = IShellItem_GetParent(shellitem, &shellitem2); + ok(SUCCEEDED(ret), "GetParent returned %x\n", ret); + if (SUCCEEDED(ret)) + { + ret = IShellItem_QueryInterface(shellitem2, &IID_IPersistIDList, (void**)&persistidl); + ok(SUCCEEDED(ret), "QueryInterface returned %x\n", ret); + if (SUCCEEDED(ret)) + { + ret = IPersistIDList_GetIDList(persistidl, &pidl_test); + ok(SUCCEEDED(ret), "GetIDList returned %x\n", ret); + if (SUCCEEDED(ret)) + { + ok(ILIsEqual(pidl_cwd, pidl_test), "id lists are not equal\n"); + pILFree(pidl_test); + } + IPersistIDList_Release(persistidl); + } + IShellItem_Release(shellitem2); + } + IShellItem_Release(shellitem); } -- 1.5.4.3