Vincent Povirk : shell32: Add test for localized filenames in desktop.ini.

Alexandre Julliard julliard at winehq.org
Fri Dec 5 07:42:48 CST 2008


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Tue Dec  2 16:12:08 2008 -0600

shell32: Add test for localized filenames in desktop.ini.

---

 dlls/shell32/tests/Makefile.in |    2 +
 dlls/shell32/tests/rsrc.rc     |   28 ++++++++++
 dlls/shell32/tests/shlfolder.c |  118 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 148 insertions(+), 0 deletions(-)

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..00c949b
--- /dev/null
+++ b/dlls/shell32/tests/rsrc.rc
@@ -0,0 +1,28 @@
+/* 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..f374070 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();
 }




More information about the wine-cvs mailing list