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