From fbc69473e45c2d80584e748eb638491845390676 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Tue, 2 Dec 2008 16:12:08 -0600 Subject: [PATCH] shell32: add test for localized filenames in desktop.ini --- dlls/shell32/tests/Makefile.in | 2 + dlls/shell32/tests/rsrc.rc | 29 ++++++++++ dlls/shell32/tests/shlfolder.c | 118 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+), 0 deletions(-) create mode 100644 dlls/shell32/tests/rsrc.rc diff --git a/dlls/shell32/tests/Makefile.in b/dlls/shell32/tests/Makefile.in index 0fc8d74..dd0587c 100644 --- a/dlls/shell32/tests/Makefile.in +++ b/dlls/shell32/tests/Makefile.in @@ -18,6 +18,8 @@ CTESTS = \ string.c \ systray.c +RC_SRCS = rsrc.rc + @MAKE_TEST_RULES@ @DEPENDENCIES@ # everything below this line is overwritten by make depend diff --git a/dlls/shell32/tests/rsrc.rc b/dlls/shell32/tests/rsrc.rc new file mode 100644 index 0000000..19a27a9 --- /dev/null +++ b/dlls/shell32/tests/rsrc.rc @@ -0,0 +1,29 @@ +/* String resource for shlfolder test. + * + * Copyright 2008 Vincent Povirk for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "windef.h" +#include "winuser.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +STRINGTABLE +{ + 1 "Folder Name Resource" +} + diff --git a/dlls/shell32/tests/shlfolder.c b/dlls/shell32/tests/shlfolder.c index 30768b0..9cb531f 100644 --- a/dlls/shell32/tests/shlfolder.c +++ b/dlls/shell32/tests/shlfolder.c @@ -1488,6 +1488,123 @@ static void testSHGetFolderPathAndSubDirA(void) RemoveDirectoryA(testpath); } +static const char *wine_dbgstr_w(LPCWSTR str) +{ + static char buf[512]; + if (!str) + return "(null)"; + WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL); + return buf; +} + +static void test_LocalizedNames(void) +{ + static char cCurrDirA[MAX_PATH]; + WCHAR cCurrDirW[MAX_PATH], tempbufW[25]; + IShellFolder *IDesktopFolder, *testIShellFolder; + ITEMIDLIST *newPIDL; + int len; + HRESULT hr; + static char resourcefile[MAX_PATH]; + DWORD res; + HANDLE file; + STRRET strret; + + static const char desktopini_contents1[] = + "[.ShellClassInfo]\r\n" + "LocalizedResourceName=@"; + static const char desktopini_contents2[] = + ",-1\r\n"; + static WCHAR foldernameW[] = {'t','e','s','t','f','o','l','d','e','r',0}; + static const WCHAR folderdisplayW[] = {'F','o','l','d','e','r',' ','N','a','m','e',' ','R','e','s','o','u','r','c','e',0}; + + /* create folder with desktop.ini and localized name in GetModuleFileNameA(NULL) */ + CreateDirectoryA(".\\testfolder", NULL); + + SetFileAttributesA(".\\testfolder", GetFileAttributesA(".\\testfolder")|FILE_ATTRIBUTE_SYSTEM); + + GetModuleFileNameA(NULL, resourcefile, MAX_PATH); + + file = CreateFileA(".\\testfolder\\desktop.ini", GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + ok(file != INVALID_HANDLE_VALUE, "CreateFileA failed %i\n", GetLastError()); + ok(WriteFile(file, desktopini_contents1, strlen(desktopini_contents1), &res, NULL) && + WriteFile(file, resourcefile, strlen(resourcefile), &res, NULL) && + WriteFile(file, desktopini_contents2, strlen(desktopini_contents2), &res, NULL), + "WriteFile failed %i\n", GetLastError()); + CloseHandle(file); + + /* get IShellFolder for parent */ + GetCurrentDirectoryA(MAX_PATH, cCurrDirA); + len = lstrlenA(cCurrDirA); + + if (len == 0) { + trace("GetCurrentDirectoryA returned empty string. Skipping test_LocalizedNames\n"); + goto cleanup; + } + if(cCurrDirA[len-1] == '\\') + cCurrDirA[len-1] = 0; + + MultiByteToWideChar(CP_ACP, 0, cCurrDirA, -1, cCurrDirW, MAX_PATH); + + hr = SHGetDesktopFolder(&IDesktopFolder); + ok(hr == S_OK, "SHGetDesktopfolder failed %08x\n", hr); + + hr = IShellFolder_ParseDisplayName(IDesktopFolder, NULL, NULL, cCurrDirW, NULL, &newPIDL, 0); + ok(hr == S_OK, "ParseDisplayName failed %08x\n", hr); + + hr = IShellFolder_BindToObject(IDesktopFolder, newPIDL, NULL, (REFIID)&IID_IShellFolder, (LPVOID *)&testIShellFolder); + ok(hr == S_OK, "BindToObject failed %08x\n", hr); + + IMalloc_Free(ppM, newPIDL); + + /* windows reads the display name from the resource */ + hr = IShellFolder_ParseDisplayName(testIShellFolder, NULL, NULL, foldernameW, NULL, &newPIDL, 0); + ok(hr == S_OK, "ParseDisplayName failed %08x\n", hr); + + hr = IShellFolder_GetDisplayNameOf(testIShellFolder, newPIDL, SHGDN_INFOLDER, &strret); + ok(hr == S_OK, "ParseDisplayName failed %08x\n", hr); + + if (SUCCEEDED(hr) && pStrRetToBufW) + { + hr = pStrRetToBufW(&strret, newPIDL, tempbufW, sizeof(tempbufW)/sizeof(WCHAR)); + ok (SUCCEEDED(hr), "StrRetToBufW failed! hr = %08x\n", hr); + todo_wine ok (!lstrcmpiW(tempbufW, folderdisplayW), "GetDisplayNameOf returned %s\n", wine_dbgstr_w(tempbufW)); + } + + /* editing name is also read from the resource */ + hr = IShellFolder_GetDisplayNameOf(testIShellFolder, newPIDL, SHGDN_INFOLDER|SHGDN_FOREDITING, &strret); + ok(hr == S_OK, "ParseDisplayName failed %08x\n", hr); + + if (SUCCEEDED(hr) && pStrRetToBufW) + { + hr = pStrRetToBufW(&strret, newPIDL, tempbufW, sizeof(tempbufW)/sizeof(WCHAR)); + ok (SUCCEEDED(hr), "StrRetToBufW failed! hr = %08x\n", hr); + todo_wine ok (!lstrcmpiW(tempbufW, folderdisplayW), "GetDisplayNameOf returned %s\n", wine_dbgstr_w(tempbufW)); + } + + /* parsing name is unchanged */ + hr = IShellFolder_GetDisplayNameOf(testIShellFolder, newPIDL, SHGDN_INFOLDER|SHGDN_FORPARSING, &strret); + ok(hr == S_OK, "ParseDisplayName failed %08x\n", hr); + + if (SUCCEEDED(hr) && pStrRetToBufW) + { + hr = pStrRetToBufW(&strret, newPIDL, tempbufW, sizeof(tempbufW)/sizeof(WCHAR)); + ok (SUCCEEDED(hr), "StrRetToBufW failed! hr = %08x\n", hr); + ok (!lstrcmpiW(tempbufW, foldernameW), "GetDisplayNameOf returned %s\n", wine_dbgstr_w(tempbufW)); + } + + IShellFolder_Release(IDesktopFolder); + IShellFolder_Release(testIShellFolder); + + IMalloc_Free(ppM, newPIDL); + +cleanup: + DeleteFileA(".\\testfolder\\desktop.ini"); + SetFileAttributesA(".\\testfolder", GetFileAttributesA(".\\testfolder")&~FILE_ATTRIBUTE_SYSTEM); + RemoveDirectoryA(".\\testfolder"); +} + START_TEST(shlfolder) { @@ -1509,6 +1626,7 @@ START_TEST(shlfolder) testSHGetFolderPathAndSubDirA(); else skip("SHGetFolderPathAndSubDirA not present\n"); + test_LocalizedNames(); OleUninitialize(); } -- 1.5.6.3