dlls/shell32/shfldr_desktop.c

Ge van Geldorp gvg at reactos.com
Sat Aug 13 13:55:42 CDT 2005


Changelog:
  Michael Jung <mjung at iss.tu-darmstadt.de>
  Ge van Geldorp <gvg at reactos.com>
  - Prepend Desktop folder path for files/directories stored in
    the filesystem Desktop folder when GetDisplayNameOf is called
    with the SHGDN_FORPARSING flags
  - Add testcases

Index: dlls/shell32/shfldr_desktop.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shfldr_desktop.c,v
retrieving revision 1.45
diff -u -r1.45 shfldr_desktop.c
--- dlls/shell32/shfldr_desktop.c	11 Aug 2005 10:33:21 -0000	1.45
+++ dlls/shell32/shfldr_desktop.c	13 Aug 2005 18:49:59 -0000
@@ -665,8 +665,19 @@
         }
         else
         {
-            /* file system folder */
-            _ILSimpleGetText (pidl, strRet->u.cStr, MAX_PATH);
+            int cLen = 0;
+                
+            /* file system folder or file rooted at the desktop */
+            if ((GET_SHGDN_FOR(dwFlags) == SHGDN_FORPARSING) &&
+                (GET_SHGDN_RELATION(dwFlags) != SHGDN_INFOLDER))
+            {
+                WideCharToMultiByte(CP_ACP, 0, This->sPathTarget, -1, strRet->u.cStr, MAX_PATH,
+                                    NULL, NULL);
+                PathAddBackslashA(strRet->u.cStr);
+                cLen = lstrlenA(strRet->u.cStr);
+            }
+    
+            _ILSimpleGetText (pidl, strRet->u.cStr + cLen, MAX_PATH - cLen);
 
             if (!_ILIsFolder(pidl))
                 SHELL_FS_ProcessDisplayFilename(strRet->u.cStr, dwFlags);
Index: dlls/shell32/tests/shlfolder.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/tests/shlfolder.c,v
retrieving revision 1.29
diff -u -r1.29 shlfolder.c
--- dlls/shell32/tests/shlfolder.c	12 Aug 2005 10:33:37 -0000	1.29
+++ dlls/shell32/tests/shlfolder.c	13 Aug 2005 18:49:59 -0000
@@ -584,6 +584,12 @@
     WCHAR wszMyComputer[] = { 
         ':',':','{','2','0','D','0','4','F','E','0','-','3','A','E','A','-','1','0','6','9','-',
         'A','2','D','8','-','0','8','0','0','2','B','3','0','3','0','9','D','}',0 };
+    WCHAR wszFileName[MAX_PATH];
+    LPITEMIDLIST pidlTestFile;
+    HANDLE hTestFile;
+    STRRET strret;
+    static WCHAR wszTestFile[] = {
+        'w','i','n','e','t','e','s','t','.','f','o','o',0 };
 
     if(!pSHGetSpecialFolderPathW) return;
 
@@ -604,15 +610,67 @@
 
     hr = IShellFolder_ParseDisplayName(psfDesktop, NULL, NULL, wszMyComputer, NULL, &pidlMyComputer, NULL);
     ok (SUCCEEDED(hr), "Desktop's ParseDisplayName failed to parse MyComputer's CLSID! hr = %08lx\n", hr);
-    IShellFolder_Release(psfDesktop);
-    if (FAILED(hr)) return;
+    if (FAILED(hr)) {
+        IShellFolder_Release(psfDesktop);
+        return;
+    }
 
     SetLastError(0xdeadbeef);
     result = SHGetPathFromIDListW(pidlMyComputer, wszPath);
     ok (!result, "SHGetPathFromIDList succeeded where it shouldn't!\n");
     ok (GetLastError()==0xdeadbeef, "SHGetPathFromIDList shouldn't set last error! Last error: %08lx\n", GetLastError());
+    if (result) {
+        IShellFolder_Release(psfDesktop);
+        return;
+    }
 
     IMalloc_Free(ppM, pidlMyComputer);
+
+    result = pSHGetSpecialFolderPathW(NULL, wszFileName, CSIDL_DESKTOPDIRECTORY, FALSE);
+    ok(result, "SHGetSpecialFolderPathW failed! Last error: %08lx\n", GetLastError());
+    if (!result) {
+        IShellFolder_Release(psfDesktop);
+        return;
+    }
+    PathAddBackslashW(wszFileName);
+    lstrcatW(wszFileName, wszTestFile);
+    hTestFile = CreateFileW(wszFileName, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL);
+    ok(hTestFile != INVALID_HANDLE_VALUE, "CreateFileW failed! Last error: %08lx\n", GetLastError());
+    if (hTestFile == INVALID_HANDLE_VALUE) {
+        IShellFolder_Release(psfDesktop);
+        return;
+    }
+    CloseHandle(hTestFile);
+
+    hr = IShellFolder_ParseDisplayName(psfDesktop, NULL, NULL, wszTestFile, NULL, &pidlTestFile, NULL);
+    ok (SUCCEEDED(hr), "Desktop's ParseDisplayName failed to parse filename hr = %08lx\n", hr);
+    if (FAILED(hr)) {
+        IShellFolder_Release(psfDesktop);
+        DeleteFileW(wszFileName);
+        IMalloc_Free(ppM, pidlTestFile);
+        return;
+    }
+
+    /* This test is to show that the Desktop shellfolder prepends the CSIDL_DESKTOPDIRECTORY
+     * path for files placed on the desktop, if called with SHGDN_FORPARSING. */
+    hr = IShellFolder_GetDisplayNameOf(psfDesktop, pidlTestFile, SHGDN_FORPARSING, &strret);
+    ok (SUCCEEDED(hr), "Desktop's GetDisplayNamfOf failed! hr = %08lx\n", hr);
+    IShellFolder_Release(psfDesktop);
+    DeleteFileW(wszFileName);
+    if (FAILED(hr)) {
+        IMalloc_Free(ppM, pidlTestFile);
+        return;
+    }
+    StrRetToBufW(&strret, pidlTestFile, wszPath, MAX_PATH);
+    ok(0 == lstrcmpW(wszFileName, wszPath), 
+        "Desktop->GetDisplayNameOf(pidlTestFile, SHGDN_FORPARSING) "
+        "returned incorrect path for file placed on desktop\n");
+
+    result = SHGetPathFromIDListW(pidlTestFile, wszPath);
+    ok(result, "SHGetPathFromIDListW failed! Last error: %08lx\n", GetLastError());
+    IMalloc_Free(ppM, pidlTestFile);
+    if (!result) return;
+    ok(0 == lstrcmpW(wszFileName, wszPath), "SHGetPathFromIDListW returned incorrect path for file placed on desktop\n");
 }
 
 static void test_EnumObjects_and_CompareIDs(void)



More information about the wine-patches mailing list