[PATCH] winemac.drv: Support the public UTF-16 type for Unicode text.
Charles Davis
cdavis5x at gmail.com
Wed Aug 21 21:42:16 CDT 2013
---
dlls/winemac.drv/clipboard.c | 169 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 169 insertions(+), 0 deletions(-)
diff --git a/dlls/winemac.drv/clipboard.c b/dlls/winemac.drv/clipboard.c
index 53b1448..b889d42 100644
--- a/dlls/winemac.drv/clipboard.c
+++ b/dlls/winemac.drv/clipboard.c
@@ -82,6 +82,9 @@ static HANDLE import_unicodetext_to_text(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);
static CFDataRef export_bitmap_to_bmp(HANDLE data);
@@ -90,6 +93,9 @@ static CFDataRef export_hdrop_to_filenames(HANDLE data);
static CFDataRef export_oemtext_to_utf8(HANDLE data);
static CFDataRef export_text_to_utf8(HANDLE data);
static CFDataRef export_unicodetext_to_utf8(HANDLE data);
+static CFDataRef export_oemtext_to_utf16(HANDLE data);
+static CFDataRef export_text_to_utf16(HANDLE data);
+static CFDataRef export_unicodetext_to_utf16(HANDLE data);
/**************************************************************************
@@ -180,6 +186,10 @@ static const struct
{ CF_TEXT, CFSTR("public.utf8-plain-text"), import_utf8_to_text, export_text_to_utf8, TRUE },
{ CF_OEMTEXT, CFSTR("public.utf8-plain-text"), import_utf8_to_oemtext, export_oemtext_to_utf8, TRUE },
+ { CF_UNICODETEXT, CFSTR("public.utf16-plain-text"), import_utf16_to_unicodetext, export_unicodetext_to_utf16,TRUE },
+ { CF_TEXT, CFSTR("public.utf16-plain-text"), import_utf16_to_text, export_text_to_utf16, TRUE },
+ { CF_OEMTEXT, CFSTR("public.utf16-plain-text"), import_utf16_to_oemtext, export_oemtext_to_utf16, TRUE },
+
{ CF_DIB, CFSTR("org.winehq.builtin.dib"), import_clipboard_data, export_clipboard_data, FALSE },
{ CF_DIB, CFSTR("com.microsoft.bmp"), import_bmp_to_dib, export_dib_to_bmp, TRUE },
@@ -953,6 +963,78 @@ 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.
+ */
+static HANDLE import_utf16_to_unicodetext(CFDataRef data)
+{
+ const WCHAR *src;
+ unsigned long data_len;
+ unsigned long new_lines = 0;
+ LPWSTR dst;
+ unsigned long i, j;
+ HANDLE unicode_handle = NULL;
+
+ src = (const WCHAR *)CFDataGetBytePtr(data);
+ data_len = CFDataGetLength(data);
+ for (i = 0; i < data_len; i++)
+ {
+ if (src[i] == '\n')
+ new_lines++;
+ }
+
+ if ((unicode_handle = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, (data_len + new_lines + 1) * sizeof(WCHAR))))
+ {
+ dst = GlobalLock(unicode_handle);
+
+ for (i = 0, j = 0; i < data_len; i++)
+ {
+ if (src[i] == '\n')
+ dst[j++] = '\r';
+
+ dst[j++] = src[i];
+ }
+ dst[j] = 0;
+
+ GlobalUnlock(unicode_handle);
+ }
+
+ return unicode_handle;
+}
+
+
+/**************************************************************************
* export_clipboard_data
*
* Generic export clipboard data routine.
@@ -1020,6 +1102,30 @@ static CFDataRef export_codepage_to_utf8(HANDLE data, UINT cp)
/**************************************************************************
+ * 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 to BMP file format. This just entails prepending a BMP
@@ -1215,6 +1321,69 @@ static CFDataRef export_unicodetext_to_utf8(HANDLE data)
/**************************************************************************
+ * 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_utf16
+ *
+ * Export CF_TEXT to UTF-16.
+ */
+static CFDataRef export_text_to_utf16(HANDLE data)
+{
+ return export_codepage_to_utf16(data, CP_ACP);
+}
+
+
+/**************************************************************************
+ * export_unicodetext_to_utf16
+ *
+ * Export CF_UNICODETEXT to UTF-16.
+ */
+static CFDataRef export_unicodetext_to_utf16(HANDLE data)
+{
+ CFMutableDataRef ret;
+ const WCHAR *src;
+ INT dst_len;
+
+ src = GlobalLock(data);
+ if (!src) return NULL;
+
+ dst_len = GlobalSize(data) / sizeof(WCHAR);
+ if (dst_len) dst_len--; /* Leave off null terminator. */
+ ret = CFDataCreateMutable(NULL, dst_len);
+ if (ret)
+ {
+ LPWSTR dst;
+ int i, j;
+
+ CFDataSetLength(ret, dst_len);
+ dst = (LPWSTR)CFDataGetMutableBytePtr(ret);
+
+ /* Remove carriage returns */
+ for (i = 0, j = 0; i < dst_len; i++)
+ {
+ if (src[i] == '\r' &&
+ (i + 1 >= dst_len || src[i + 1] == '\n' || src[i + 1] == '\0'))
+ continue;
+ dst[j++] = src[i];
+ }
+ CFDataSetLength(ret, j);
+ }
+ GlobalUnlock(data);
+
+ return ret;
+}
+
+
+/**************************************************************************
* get_clipboard_info
*/
static BOOL get_clipboard_info(LPCLIPBOARDINFO cbinfo)
--
1.7.5.4
More information about the wine-patches
mailing list