Vincent Povirk : shell32: Implement IShellItem_GetParent.

Alexandre Julliard julliard at winehq.org
Fri May 22 08:25:33 CDT 2009


Module: wine
Branch: master
Commit: 9eed85f0321c8ffc3142e5926a77eaaadcd4e381
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9eed85f0321c8ffc3142e5926a77eaaadcd4e381

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Thu May 21 13:18:26 2009 -0500

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 aed9f0e..7900966 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);
     }
 




More information about the wine-cvs mailing list