Ken Thomases : winemac: Export HTML Format clipboard data to the public.html pasteboard type.

Alexandre Julliard julliard at winehq.org
Fri Jan 13 14:12:55 CST 2017


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

Author: Ken Thomases <ken at codeweavers.com>
Date:   Fri Jan 13 13:36:21 2017 -0600

winemac: Export HTML Format clipboard data to the public.html pasteboard type.

Signed-off-by: Ken Thomases <ken at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winemac.drv/clipboard.c | 68 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 67 insertions(+), 1 deletion(-)

diff --git a/dlls/winemac.drv/clipboard.c b/dlls/winemac.drv/clipboard.c
index fdd1110..49a3ed3 100644
--- a/dlls/winemac.drv/clipboard.c
+++ b/dlls/winemac.drv/clipboard.c
@@ -82,6 +82,7 @@ static CFDataRef export_bitmap_to_bmp(HANDLE data);
 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_html(HANDLE data);
 static CFDataRef export_metafilepict(HANDLE data);
 static CFDataRef export_text_to_utf8(HANDLE data);
 static CFDataRef export_unicodetext_to_utf8(HANDLE data);
@@ -186,7 +187,7 @@ static const struct
     { wszJFIF,              CFSTR("public.jpeg"),                           import_clipboard_data,          export_clipboard_data },
     { wszPNG,               CFSTR("public.png"),                            import_clipboard_data,          export_clipboard_data },
     { wszHTMLFormat,        NULL,                                           import_clipboard_data,          export_clipboard_data },
-    { wszHTMLFormat,        CFSTR("public.html"),                           import_html,                    NULL,                   TRUE },
+    { wszHTMLFormat,        CFSTR("public.html"),                           import_html,                    export_html,            TRUE },
     { CFSTR_SHELLURLW,      CFSTR("public.url"),                            import_utf8_to_text,            export_text_to_utf8 },
 };
 
@@ -522,6 +523,28 @@ static HANDLE create_bitmap_from_dib(HANDLE dib)
 
 
 /**************************************************************************
+ *		get_html_description_field
+ *
+ *  Find the value of a field in an HTML Format description.
+ */
+static const char* get_html_description_field(const char* data, const char* keyword)
+{
+    const char* pos = data;
+
+    while (pos && *pos && *pos != '<')
+    {
+        if (memcmp(pos, keyword, strlen(keyword)) == 0)
+            return pos + strlen(keyword);
+
+        pos = strchr(pos, '\n');
+        if (pos) pos++;
+    }
+
+    return NULL;
+}
+
+
+/**************************************************************************
  *              import_clipboard_data
  *
  *  Generic import clipboard data routine.
@@ -1141,6 +1164,49 @@ done:
 
 
 /**************************************************************************
+ *              export_html
+ *
+ *  Export HTML Format to public.html data.
+ *
+ * FIXME: We should attempt to add an <a base> tag and convert windows paths.
+ */
+static CFDataRef export_html(HANDLE handle)
+{
+    CFDataRef ret;
+    const char *data, *field_value;
+    int fragmentstart, fragmentend;
+
+    data = GlobalLock(handle);
+
+    /* read the important fields */
+    field_value = get_html_description_field(data, "StartFragment:");
+    if (!field_value)
+    {
+        ERR("Couldn't find StartFragment value\n");
+        goto failed;
+    }
+    fragmentstart = atoi(field_value);
+
+    field_value = get_html_description_field(data, "EndFragment:");
+    if (!field_value)
+    {
+        ERR("Couldn't find EndFragment value\n");
+        goto failed;
+    }
+    fragmentend = atoi(field_value);
+
+    /* export only the fragment */
+    ret = CFDataCreate(NULL, (const UInt8*)&data[fragmentstart], fragmentend - fragmentstart);
+    GlobalUnlock(handle);
+    return ret;
+
+failed:
+    GlobalUnlock(handle);
+    return NULL;
+}
+
+
+/**************************************************************************
  *              export_metafilepict
  *
  *  Export a metafile to data.




More information about the wine-cvs mailing list