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