[PATCH 06/15] winemac: Don't export/import CF_TEXT or CF_OEMTEXT to/from Mac-native data types.

Ken Thomases ken at codeweavers.com
Sun Oct 23 13:03:25 CDT 2016


The relevant Mac-native types, public.utf16-plain-text and public.utf8-plain-text,
are handled by CF_UNICODETEXT and user32 handles the synthesis of CF_TEXT and
CF_OEMTEXT from that.

CF_TEXT and CF_OEMTEXT are still exported and imported with a Wine-specific
type to preserve cross-prefix copy/paste fidelity.

Signed-off-by: Ken Thomases <ken at codeweavers.com>
---
 dlls/winemac.drv/clipboard.c | 281 +++++++++----------------------------------
 1 file changed, 58 insertions(+), 223 deletions(-)

diff --git a/dlls/winemac.drv/clipboard.c b/dlls/winemac.drv/clipboard.c
index b0c1e49..15f0992 100644
--- a/dlls/winemac.drv/clipboard.c
+++ b/dlls/winemac.drv/clipboard.c
@@ -76,11 +76,8 @@ static HANDLE import_bmp_to_dib(CFDataRef data);
 static HANDLE import_enhmetafile(CFDataRef data);
 static HANDLE import_metafilepict(CFDataRef data);
 static HANDLE import_nsfilenames_to_hdrop(CFDataRef data);
-static HANDLE import_utf8_to_oemtext(CFDataRef data);
 static HANDLE import_utf8_to_text(CFDataRef data);
 static HANDLE import_utf8_to_unicodetext(CFDataRef data);
-static HANDLE import_utf16_to_oemtext(CFDataRef data);
-static HANDLE import_utf16_to_text(CFDataRef data);
 static HANDLE import_utf16_to_unicodetext(CFDataRef data);
 
 static CFDataRef export_clipboard_data(HANDLE data);
@@ -89,10 +86,7 @@ static CFDataRef export_dib_to_bmp(HANDLE data);
 static CFDataRef export_enhmetafile(HANDLE data);
 static CFDataRef export_hdrop_to_filenames(HANDLE data);
 static CFDataRef export_metafilepict(HANDLE data);
-static CFDataRef export_oemtext_to_utf8(HANDLE data);
-static CFDataRef export_oemtext_to_utf16(HANDLE data);
 static CFDataRef export_text_to_utf8(HANDLE data);
-static CFDataRef export_text_to_utf16(HANDLE data);
 static CFDataRef export_unicodetext_to_utf8(HANDLE data);
 static CFDataRef export_unicodetext_to_utf16(HANDLE data);
 
@@ -156,10 +150,12 @@ static const struct
     { CF_ENHMETAFILE,       CFSTR("org.winehq.builtin.enhmetafile"),        import_enhmetafile,             export_enhmetafile,         FALSE },
     { CF_LOCALE,            CFSTR("org.winehq.builtin.locale"),             import_clipboard_data,          export_clipboard_data,      FALSE },
     { CF_METAFILEPICT,      CFSTR("org.winehq.builtin.metafilepict"),       import_metafilepict,            export_metafilepict,        FALSE },
+    { CF_OEMTEXT,           CFSTR("org.winehq.builtin.oemtext"),            import_clipboard_data,          export_clipboard_data,      FALSE },
     { CF_PALETTE,           CFSTR("org.winehq.builtin.palette"),            import_clipboard_data,          export_clipboard_data,      FALSE },
     { CF_PENDATA,           CFSTR("org.winehq.builtin.pendata"),            import_clipboard_data,          export_clipboard_data,      FALSE },
     { CF_RIFF,              CFSTR("org.winehq.builtin.riff"),               import_clipboard_data,          export_clipboard_data,      FALSE },
     { CF_SYLK,              CFSTR("org.winehq.builtin.sylk"),               import_clipboard_data,          export_clipboard_data,      FALSE },
+    { CF_TEXT,              CFSTR("org.winehq.builtin.text"),               import_clipboard_data,          export_clipboard_data,      FALSE },
     { CF_TIFF,              CFSTR("public.tiff"),                           import_clipboard_data,          export_clipboard_data,      FALSE },
     { CF_WAVE,              CFSTR("com.microsoft.waveform-audio"),          import_clipboard_data,          export_clipboard_data,      FALSE },
 
@@ -169,14 +165,6 @@ static const struct
     { CF_HDROP,             CFSTR("org.winehq.builtin.hdrop"),              import_clipboard_data,          export_clipboard_data,      FALSE },
     { CF_HDROP,             CFSTR("NSFilenamesPboardType"),                 import_nsfilenames_to_hdrop,    export_hdrop_to_filenames,  TRUE },
 
-    { CF_OEMTEXT,           CFSTR("org.winehq.builtin.oemtext"),            import_clipboard_data,          export_clipboard_data,      FALSE },
-    { CF_OEMTEXT,           CFSTR("public.utf16-plain-text"),               import_utf16_to_oemtext,        export_oemtext_to_utf16,    TRUE },
-    { CF_OEMTEXT,           CFSTR("public.utf8-plain-text"),                import_utf8_to_oemtext,         export_oemtext_to_utf8,     TRUE },
-
-    { CF_TEXT,              CFSTR("org.winehq.builtin.text"),               import_clipboard_data,          export_clipboard_data,      FALSE },
-    { CF_TEXT,              CFSTR("public.utf16-plain-text"),               import_utf16_to_text,           export_text_to_utf16,       TRUE },
-    { CF_TEXT,              CFSTR("public.utf8-plain-text"),                import_utf8_to_text,            export_text_to_utf8,        TRUE },
-
     { CF_UNICODETEXT,       CFSTR("org.winehq.builtin.unicodetext"),        import_clipboard_data,          export_clipboard_data,      FALSE },
     { CF_UNICODETEXT,       CFSTR("public.utf16-plain-text"),               import_utf16_to_unicodetext,    export_unicodetext_to_utf16,TRUE },
     { CF_UNICODETEXT,       CFSTR("public.utf8-plain-text"),                import_utf8_to_unicodetext,     export_unicodetext_to_utf8, TRUE },
@@ -389,87 +377,6 @@ static WINE_CLIPFORMAT* natural_format_for_format(UINT format_id)
 }
 
 
-/**************************************************************************
- *              convert_text
- *
- *  Convert string data between code pages or to/from wide characters.  The
- *  special value of (UINT)-1 for a code page indicates to use wide
- *  characters.
- */
-static HANDLE convert_text(const void *src, int src_len, UINT src_cp, UINT dest_cp)
-{
-    HANDLE ret = NULL;
-    const WCHAR *wstr;
-    int wstr_len;
-    HANDLE handle;
-    char *p;
-
-    if (src_cp == (UINT)-1)
-    {
-        wstr = src;
-        wstr_len = src_len / sizeof(WCHAR);
-    }
-    else
-    {
-        WCHAR *temp;
-
-        wstr_len = MultiByteToWideChar(src_cp, 0, src, src_len, NULL, 0);
-        if (!src_len || ((const char*)src)[src_len - 1]) wstr_len += 1;
-        temp = HeapAlloc(GetProcessHeap(), 0, wstr_len * sizeof(WCHAR));
-        MultiByteToWideChar(src_cp, 0, src, src_len, temp, wstr_len);
-        temp[wstr_len - 1] = 0;
-        wstr = temp;
-    }
-
-    if (dest_cp == (UINT)-1)
-    {
-        handle = GlobalAlloc(GMEM_FIXED, wstr_len * sizeof(WCHAR));
-        if (handle && (p = GlobalLock(handle)))
-        {
-            memcpy(p, wstr, wstr_len * sizeof(WCHAR));
-            GlobalUnlock(handle);
-            ret = handle;
-        }
-    }
-    else
-    {
-        INT len;
-
-        len = WideCharToMultiByte(dest_cp, 0, wstr, wstr_len, NULL, 0, NULL, NULL);
-        if (!wstr_len || wstr[wstr_len - 1]) len += 1;
-        handle = GlobalAlloc(GMEM_FIXED, len);
-
-        if (handle && (p = GlobalLock(handle)))
-        {
-            WideCharToMultiByte(dest_cp, 0, wstr, wstr_len, p, len, NULL, NULL);
-            p[len - 1] = 0;
-            GlobalUnlock(handle);
-            ret = handle;
-        }
-    }
-
-    return ret;
-}
-
-
-/**************************************************************************
- *              convert_unicodetext_to_codepage
- */
-static HANDLE convert_unicodetext_to_codepage(HANDLE unicode_handle, UINT cp)
-{
-    LPWSTR unicode_string = GlobalLock(unicode_handle);
-    HANDLE ret = NULL;
-
-    if (unicode_string)
-    {
-        ret = convert_text(unicode_string, GlobalSize(unicode_handle), -1, cp);
-        GlobalUnlock(unicode_handle);
-    }
-
-    return ret;
-}
-
-
 /***********************************************************************
  *              bitmap_info_size
  *
@@ -858,29 +765,38 @@ done:
 
 
 /**************************************************************************
- *              import_utf8_to_oemtext
- *
- *  Import a UTF-8 string, converting the string to CF_OEMTEXT.
- */
-static HANDLE import_utf8_to_oemtext(CFDataRef data)
-{
-    HANDLE unicode_handle = import_utf8_to_unicodetext(data);
-    HANDLE ret = convert_unicodetext_to_codepage(unicode_handle, CP_OEMCP);
-
-    GlobalFree(unicode_handle);
-    return ret;
-}
-
-
-/**************************************************************************
  *              import_utf8_to_text
  *
  *  Import a UTF-8 string, converting the string to CF_TEXT.
  */
 static HANDLE import_utf8_to_text(CFDataRef data)
 {
+    HANDLE ret = NULL;
     HANDLE unicode_handle = import_utf8_to_unicodetext(data);
-    HANDLE ret = convert_unicodetext_to_codepage(unicode_handle, CP_ACP);
+    LPWSTR unicode_string = GlobalLock(unicode_handle);
+
+    if (unicode_string)
+    {
+        int unicode_len;
+        HANDLE handle;
+        char *p;
+        INT len;
+
+        unicode_len = GlobalSize(unicode_handle) / sizeof(WCHAR);
+
+        len = WideCharToMultiByte(CP_ACP, 0, unicode_string, unicode_len, NULL, 0, NULL, NULL);
+        if (!unicode_len || unicode_string[unicode_len - 1]) len += 1;
+        handle = GlobalAlloc(GMEM_FIXED, len);
+
+        if (handle && (p = GlobalLock(handle)))
+        {
+            WideCharToMultiByte(CP_ACP, 0, unicode_string, unicode_len, p, len, NULL, NULL);
+            p[len - 1] = 0;
+            GlobalUnlock(handle);
+            ret = handle;
+        }
+        GlobalUnlock(unicode_handle);
+    }
 
     GlobalFree(unicode_handle);
     return ret;
@@ -940,36 +856,6 @@ static HANDLE import_utf8_to_unicodetext(CFDataRef data)
 
 
 /**************************************************************************
- *              import_utf16_to_oemtext
- *
- *  Import a UTF-16 string, converting the string to CF_OEMTEXT.
- */
-static HANDLE import_utf16_to_oemtext(CFDataRef data)
-{
-    HANDLE unicode_handle = import_utf16_to_unicodetext(data);
-    HANDLE ret = convert_unicodetext_to_codepage(unicode_handle, CP_OEMCP);
-
-    GlobalFree(unicode_handle);
-    return ret;
-}
-
-
-/**************************************************************************
- *              import_utf16_to_text
- *
- *  Import a UTF-16 string, converting the string to CF_TEXT.
- */
-static HANDLE import_utf16_to_text(CFDataRef data)
-{
-    HANDLE unicode_handle = import_utf16_to_unicodetext(data);
-    HANDLE ret = convert_unicodetext_to_codepage(unicode_handle, CP_ACP);
-
-    GlobalFree(unicode_handle);
-    return ret;
-}
-
-
-/**************************************************************************
  *              import_utf16_to_unicodetext
  *
  *  Import a UTF-8 string, converting the string to CF_UNICODETEXT.
@@ -1060,54 +946,6 @@ static CFDataRef export_bitmap_to_bmp(HANDLE data)
 
 
 /**************************************************************************
- *              export_codepage_to_utf8
- *
- *  Export string data in a specified codepage to UTF-8.
- */
-static CFDataRef export_codepage_to_utf8(HANDLE data, UINT cp)
-{
-    CFDataRef ret = NULL;
-    const char* str;
-
-    if ((str = GlobalLock(data)))
-    {
-        HANDLE unicode = convert_text(str, GlobalSize(data), cp, -1);
-
-        ret = export_unicodetext_to_utf8(unicode);
-
-        GlobalFree(unicode);
-        GlobalUnlock(data);
-    }
-
-    return ret;
-}
-
-
-/**************************************************************************
- *              export_codepage_to_utf16
- *
- *  Export string data in a specified codepage to UTF-16.
- */
-static CFDataRef export_codepage_to_utf16(HANDLE data, UINT cp)
-{
-    CFDataRef ret = NULL;
-    const char* str;
-
-    if ((str = GlobalLock(data)))
-    {
-        HANDLE unicode = convert_text(str, GlobalSize(data), cp, -1);
-
-        ret = export_unicodetext_to_utf16(unicode);
-
-        GlobalFree(unicode);
-        GlobalUnlock(data);
-    }
-
-    return ret;
-}
-
-
-/**************************************************************************
  *              export_dib_to_bmp
  *
  *  Export CF_DIB or CF_DIBV5 to BMP file format.  This just entails
@@ -1290,46 +1128,43 @@ static CFDataRef export_metafilepict(HANDLE data)
 
 
 /**************************************************************************
- *              export_oemtext_to_utf8
- *
- *  Export CF_OEMTEXT to UTF-8.
- */
-static CFDataRef export_oemtext_to_utf8(HANDLE data)
-{
-    return export_codepage_to_utf8(data, CP_OEMCP);
-}
-
-
-/**************************************************************************
- *              export_oemtext_to_utf16
- *
- *  Export CF_OEMTEXT to UTF-16.
- */
-static CFDataRef export_oemtext_to_utf16(HANDLE data)
-{
-    return export_codepage_to_utf16(data, CP_OEMCP);
-}
-
-
-/**************************************************************************
  *              export_text_to_utf8
  *
  *  Export CF_TEXT to UTF-8.
  */
 static CFDataRef export_text_to_utf8(HANDLE data)
 {
-    return export_codepage_to_utf8(data, CP_ACP);
-}
-
-
-/**************************************************************************
- *              export_text_to_utf16
- *
- *  Export CF_TEXT to UTF-16.
- */
-static CFDataRef export_text_to_utf16(HANDLE data)
-{
-    return export_codepage_to_utf16(data, CP_ACP);
+    CFDataRef ret = NULL;
+    const char* str;
+
+    if ((str = GlobalLock(data)))
+    {
+        int str_len = GlobalSize(data);
+        int wstr_len;
+        WCHAR *wstr;
+        HANDLE unicode;
+        char *p;
+
+        wstr_len = MultiByteToWideChar(CP_ACP, 0, str, str_len, NULL, 0);
+        if (!str_len || str[str_len - 1]) wstr_len += 1;
+        wstr = HeapAlloc(GetProcessHeap(), 0, wstr_len * sizeof(WCHAR));
+        MultiByteToWideChar(CP_ACP, 0, str, str_len, wstr, wstr_len);
+        wstr[wstr_len - 1] = 0;
+
+        unicode = GlobalAlloc(GMEM_FIXED, wstr_len * sizeof(WCHAR));
+        if (unicode && (p = GlobalLock(unicode)))
+        {
+            memcpy(p, wstr, wstr_len * sizeof(WCHAR));
+            GlobalUnlock(unicode);
+        }
+
+        ret = export_unicodetext_to_utf8(unicode);
+
+        GlobalFree(unicode);
+        GlobalUnlock(data);
+    }
+
+    return ret;
 }
 
 
-- 
2.8.2




More information about the wine-patches mailing list