Jacek Caban : winemac: Use ntdll for Unicode conversion in export_hdrop_to_filenames.

Alexandre Julliard julliard at winehq.org
Fri May 27 16:35:29 CDT 2022


Module: wine
Branch: master
Commit: 36e2d7e9583d3d9db9613be89cfbe158d7fec8ac
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=36e2d7e9583d3d9db9613be89cfbe158d7fec8ac

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu May 26 01:19:40 2022 +0200

winemac: Use ntdll for Unicode conversion in export_hdrop_to_filenames.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>

---

 dlls/winemac.drv/clipboard.c | 40 ++++++++++++++++++++++++++++------------
 1 file changed, 28 insertions(+), 12 deletions(-)

diff --git a/dlls/winemac.drv/clipboard.c b/dlls/winemac.drv/clipboard.c
index eefc915d6e2..1b637123e0f 100644
--- a/dlls/winemac.drv/clipboard.c
+++ b/dlls/winemac.drv/clipboard.c
@@ -567,6 +567,21 @@ static void *import_html(CFDataRef data, size_t *ret_size)
 }
 
 
+static CPTABLEINFO *get_ansi_cp(void)
+{
+    USHORT utf8_hdr[2] = { 0, CP_UTF8 };
+    static CPTABLEINFO cp;
+    if (!cp.CodePage)
+    {
+        if (NtCurrentTeb()->Peb->AnsiCodePageData)
+            RtlInitCodePageTable(NtCurrentTeb()->Peb->AnsiCodePageData, &cp);
+        else
+            RtlInitCodePageTable(utf8_hdr, &cp);
+    }
+    return &cp;
+}
+
+
 /* based on wine_get_dos_file_name */
 static WCHAR *get_dos_file_name(const char *path)
 {
@@ -942,21 +957,22 @@ static CFDataRef export_hdrop_to_filenames(void *data, size_t size)
             unixname = get_unix_file_name(p);
         else
         {
-            int len = MultiByteToWideChar(CP_ACP, 0, p, -1, NULL, 0);
-            if (len)
-            {
-                if (len > buffer_len)
-                {
-                    free(buffer);
-                    buffer_len = len * 2;
-                    buffer = malloc(buffer_len * sizeof(*buffer));
-                }
+            CPTABLEINFO *cp = get_ansi_cp();
+            DWORD len = strlen(p) + 1;
 
-                MultiByteToWideChar(CP_ACP, 0, p, -1, buffer, buffer_len);
-                unixname = get_unix_file_name(buffer);
+            if (len * 3 > buffer_len)
+            {
+                free(buffer);
+                buffer_len = len * 3;
+                buffer = malloc(buffer_len * sizeof(*buffer));
             }
+
+            if (cp->CodePage == CP_UTF8)
+                RtlUTF8ToUnicodeN(buffer, buffer_len * sizeof(WCHAR), &len, p, len);
             else
-                unixname = NULL;
+                RtlCustomCPToUnicodeN(cp, buffer, buffer_len * sizeof(WCHAR), &len, p, len);
+
+            unixname = get_unix_file_name(buffer);
         }
         if (!unixname)
         {




More information about the wine-cvs mailing list