Module: wine Branch: master Commit: 36e2d7e9583d3d9db9613be89cfbe158d7fec8ac URL: https://source.winehq.org/git/wine.git/?a=commit;h=36e2d7e9583d3d9db9613be89...
Author: Jacek Caban jacek@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@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) {