Nigel Liang : shell32: Conformance tests for unicode filenames and fix a bug for file deletion.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jun 11 08:46:10 CDT 2007


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

Author: Nigel Liang <ncliang at gmail.com>
Date:   Fri Jun  8 14:25:24 2007 -0700

shell32: Conformance tests for unicode filenames and fix a bug for file deletion.

---

 dlls/shell32/tests/shlfileop.c |   88 ++++++++++++++++++++++++++++++++++++++++
 dlls/shell32/xdg.c             |    4 +-
 2 files changed, 90 insertions(+), 2 deletions(-)

diff --git a/dlls/shell32/tests/shlfileop.c b/dlls/shell32/tests/shlfileop.c
index 1f2f0f7..7c5354b 100644
--- a/dlls/shell32/tests/shlfileop.c
+++ b/dlls/shell32/tests/shlfileop.c
@@ -33,14 +33,19 @@
 #endif
 
 static CHAR CURR_DIR[MAX_PATH];
+static const WCHAR UNICODE_PATH[] = {'c',':','\\',0x00c4,'\0','\0'};
+    /* "c:\Ä", or "c:\A" with diaeresis */
+    /* Double-null termination needed for pFrom field of SHFILEOPSTRUCT */
 
 static HMODULE hshell32;
 static int (WINAPI *pSHCreateDirectoryExA)(HWND, LPCSTR, LPSECURITY_ATTRIBUTES);
+static int (WINAPI *pSHCreateDirectoryExW)(HWND, LPCWSTR, LPSECURITY_ATTRIBUTES);
 
 static void InitFunctionPointers(void)
 {
     hshell32 = GetModuleHandleA("shell32.dll");
     pSHCreateDirectoryExA = (void*)GetProcAddress(hshell32, "SHCreateDirectoryExA");
+    pSHCreateDirectoryExW = (void*)GetProcAddress(hshell32, "SHCreateDirectoryExW");
 }
 
 /* creates a file with the specified name for tests */
@@ -56,11 +61,25 @@ static void createTestFile(const CHAR *name)
     CloseHandle(file);
 }
 
+static void createTestFileW(const WCHAR *name)
+{
+    HANDLE file;
+
+    file = CreateFileW(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
+    ok(file != INVALID_HANDLE_VALUE, "Failure to open file\n");
+    CloseHandle(file);
+}
+
 static BOOL file_exists(const CHAR *name)
 {
     return GetFileAttributesA(name) != INVALID_FILE_ATTRIBUTES;
 }
 
+static BOOL file_existsW(LPCWSTR name)
+{
+  return GetFileAttributesW(name) != INVALID_FILE_ATTRIBUTES;
+}
+
 static BOOL file_has_content(const CHAR *name, const CHAR *content)
 {
     CHAR buf[MAX_PATH];
@@ -983,6 +1002,73 @@ static void test_sh_create_dir(void)
     ok(file_exists("c:\\testdir3"), "The directory is not created\n");
 }
 
+static void test_unicode(void)
+{
+    SHFILEOPSTRUCTW shfoW;
+    int ret;
+    HANDLE file;
+
+    shfoW.hwnd = NULL;
+    shfoW.wFunc = FO_DELETE;
+    shfoW.pFrom = UNICODE_PATH;
+    shfoW.pTo = '\0';
+    shfoW.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_NOERRORUI;
+    shfoW.hNameMappings = NULL;
+    shfoW.lpszProgressTitle = NULL;
+
+    /* Clean up before start test */
+    DeleteFileW(UNICODE_PATH);
+    RemoveDirectoryW(UNICODE_PATH);
+
+    /* Make sure we are on a system that supports unicode */
+    SetLastError(0xdeadbeef);
+    file = CreateFileW(UNICODE_PATH, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
+    if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
+    {
+        skip("Unicode tests skipped on non-unicode system\n");
+        return;
+    }
+    CloseHandle(file);
+
+    /* Try to delete a file with unicode filename */
+    ok(file_existsW(UNICODE_PATH), "The file does not exist\n");
+    ret = SHFileOperationW(&shfoW);
+    ok(!ret, "File is not removed, ErrorCode: %d\n", ret);
+    ok(!file_existsW(UNICODE_PATH), "The file should have been removed\n");
+
+    /* Try to trash a file with unicode filename */
+    createTestFileW(UNICODE_PATH);
+    shfoW.fFlags |= FOF_ALLOWUNDO;
+    ok(file_existsW(UNICODE_PATH), "The file does not exist\n");
+    ret = SHFileOperationW(&shfoW);
+    ok(!ret, "File is not removed, ErrorCode: %d\n", ret);
+    ok(!file_existsW(UNICODE_PATH), "The file should have been removed\n");
+
+    if(!pSHCreateDirectoryExW)
+    {
+        skip("Skipping SHCreateDirectoryExW tests\n");
+        return;
+    }
+
+    /* Try to delete a directory with unicode filename */
+    ret = pSHCreateDirectoryExW(NULL, UNICODE_PATH, NULL);
+    ok(!ret, "SHCreateDirectoryExW returned %d\n", ret);
+    ok(file_existsW(UNICODE_PATH), "The directory is not created\n");
+    shfoW.fFlags &= ~FOF_ALLOWUNDO;
+    ret = SHFileOperationW(&shfoW);
+    ok(!ret, "Directory is not removed, ErrorCode: %d\n", ret);
+    ok(!file_existsW(UNICODE_PATH), "The directory should have been removed\n");
+
+    /* Try to trash a directory with unicode filename */
+    ret = pSHCreateDirectoryExW(NULL, UNICODE_PATH, NULL);
+    ok(!ret, "SHCreateDirectoryExW returned %d\n", ret);
+    ok(file_existsW(UNICODE_PATH), "The directory was not created\n");
+    shfoW.fFlags |= FOF_ALLOWUNDO;
+    ret = SHFileOperationW(&shfoW);
+    ok(!ret, "Directory is not removed, ErrorCode: %d\n", ret);
+    ok(!file_existsW(UNICODE_PATH), "The directory should have been removed\n");
+}
+
 START_TEST(shlfileop)
 {
     InitFunctionPointers();
@@ -1011,4 +1097,6 @@ START_TEST(shlfileop)
 
     test_sh_create_dir();
     clean_after_shfo_tests();
+
+    test_unicode();
 }
diff --git a/dlls/shell32/xdg.c b/dlls/shell32/xdg.c
index a3d6010..6521232 100644
--- a/dlls/shell32/xdg.c
+++ b/dlls/shell32/xdg.c
@@ -376,8 +376,8 @@ static int url_encode(const char *value, char *output)
             if (output)
             {
                 *(output++) = '%';
-                *(output++) = hexchars[(unsigned)(*c)/16];
-                *(output++) = hexchars[(unsigned)(*c)%16];
+                *(output++) = hexchars[(unsigned char)*c / 16];
+                *(output++) = hexchars[(unsigned char)*c % 16];
             }
             num_written += 3;
         }




More information about the wine-cvs mailing list