mirror of
https://github.com/morgan9e/grd
synced 2026-04-14 00:14:18 +09:00
209 lines
6.5 KiB
C
209 lines
6.5 KiB
C
/*
|
|
* Copyright (C) 2020-2021 Pascal Nowack
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of the
|
|
* License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
* 02111-1307, USA.
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include "grd-clipboard-vnc.h"
|
|
|
|
#include "grd-session-vnc.h"
|
|
|
|
struct _GrdClipboardVnc
|
|
{
|
|
GrdClipboard parent;
|
|
|
|
GrdSessionVnc *session_vnc;
|
|
|
|
char *clipboard_utf8_string;
|
|
};
|
|
|
|
G_DEFINE_TYPE (GrdClipboardVnc, grd_clipboard_vnc, GRD_TYPE_CLIPBOARD)
|
|
|
|
static void
|
|
grd_clipboard_vnc_update_client_mime_type_list (GrdClipboard *clipboard,
|
|
GList *mime_type_list)
|
|
{
|
|
GrdClipboardVnc *clipboard_vnc = GRD_CLIPBOARD_VNC (clipboard);
|
|
gboolean found_utf8_string = FALSE;
|
|
GrdMimeType mime_type;
|
|
GList *l;
|
|
|
|
for (l = mime_type_list; l && !found_utf8_string; l = l->next)
|
|
{
|
|
mime_type = GPOINTER_TO_UINT (l->data);
|
|
switch (mime_type)
|
|
{
|
|
case GRD_MIME_TYPE_TEXT_PLAIN:
|
|
break;
|
|
case GRD_MIME_TYPE_TEXT_PLAIN_UTF8:
|
|
case GRD_MIME_TYPE_TEXT_UTF8_STRING:
|
|
found_utf8_string = TRUE;
|
|
break;
|
|
case GRD_MIME_TYPE_TEXT_HTML:
|
|
case GRD_MIME_TYPE_IMAGE_BMP:
|
|
case GRD_MIME_TYPE_IMAGE_TIFF:
|
|
case GRD_MIME_TYPE_IMAGE_GIF:
|
|
case GRD_MIME_TYPE_IMAGE_JPEG:
|
|
case GRD_MIME_TYPE_IMAGE_PNG:
|
|
case GRD_MIME_TYPE_TEXT_URILIST:
|
|
case GRD_MIME_TYPE_XS_GNOME_COPIED_FILES:
|
|
break;
|
|
default:
|
|
g_assert_not_reached ();
|
|
}
|
|
}
|
|
|
|
if (found_utf8_string)
|
|
{
|
|
g_clear_pointer (&clipboard_vnc->clipboard_utf8_string, g_free);
|
|
|
|
grd_clipboard_request_server_content_for_mime_type_async (clipboard,
|
|
mime_type);
|
|
}
|
|
|
|
g_list_free (mime_type_list);
|
|
}
|
|
|
|
static void
|
|
grd_clipboard_vnc_request_client_content_for_mime_type (GrdClipboard *clipboard,
|
|
GrdMimeTypeTable *mime_type_table,
|
|
unsigned int serial)
|
|
{
|
|
GrdClipboardVnc *clipboard_vnc = GRD_CLIPBOARD_VNC (clipboard);
|
|
uint32_t size;
|
|
|
|
size = strlen (clipboard_vnc->clipboard_utf8_string);
|
|
grd_clipboard_submit_client_content_for_mime_type (
|
|
clipboard, serial, (uint8_t *) clipboard_vnc->clipboard_utf8_string, size);
|
|
}
|
|
|
|
static void
|
|
grd_clipboard_vnc_submit_requested_server_content (GrdClipboard *clipboard,
|
|
uint8_t *src_data,
|
|
uint32_t src_size)
|
|
{
|
|
GrdClipboardVnc *clipboard_vnc = GRD_CLIPBOARD_VNC (clipboard);
|
|
g_autoptr (GError) error = NULL;
|
|
char *dst_data;
|
|
|
|
if (!src_data)
|
|
return;
|
|
|
|
dst_data = g_convert ((char *) src_data, src_size,
|
|
"iso8859-1", "utf-8",
|
|
NULL, NULL, &error);
|
|
if (!dst_data)
|
|
{
|
|
g_warning ("[VNC.Clipboard] Failed to convert clipboard content: %s",
|
|
error->message);
|
|
g_free (src_data);
|
|
return;
|
|
}
|
|
|
|
grd_session_vnc_set_client_clipboard_text (clipboard_vnc->session_vnc,
|
|
dst_data, strlen (dst_data));
|
|
|
|
g_free (src_data);
|
|
g_free (dst_data);
|
|
}
|
|
|
|
void
|
|
grd_clipboard_vnc_maybe_enable_clipboard (GrdClipboardVnc *clipboard_vnc)
|
|
{
|
|
grd_clipboard_maybe_enable_clipboard (GRD_CLIPBOARD (clipboard_vnc));
|
|
}
|
|
|
|
void
|
|
grd_clipboard_vnc_set_clipboard_text (GrdClipboardVnc *clipboard_vnc,
|
|
char *text,
|
|
int text_length)
|
|
{
|
|
GrdClipboard *clipboard = GRD_CLIPBOARD (clipboard_vnc);
|
|
g_autoptr (GError) error = NULL;
|
|
GrdMimeTypeTable *mime_type_table;
|
|
GList *mime_type_tables = NULL;
|
|
|
|
g_clear_pointer (&clipboard_vnc->clipboard_utf8_string, g_free);
|
|
|
|
clipboard_vnc->clipboard_utf8_string = g_convert (text, text_length,
|
|
"utf-8", "iso8859-1",
|
|
NULL, NULL, &error);
|
|
if (!clipboard_vnc->clipboard_utf8_string)
|
|
{
|
|
g_warning ("[VNC.Clipboard] Failed to convert clipboard content: %s",
|
|
error->message);
|
|
return;
|
|
}
|
|
|
|
mime_type_table = g_malloc0 (sizeof (GrdMimeTypeTable));
|
|
mime_type_table->mime_type = GRD_MIME_TYPE_TEXT_PLAIN_UTF8;
|
|
mime_type_tables = g_list_append (mime_type_tables, mime_type_table);
|
|
|
|
mime_type_table = g_malloc0 (sizeof (GrdMimeTypeTable));
|
|
mime_type_table->mime_type = GRD_MIME_TYPE_TEXT_UTF8_STRING;
|
|
mime_type_tables = g_list_append (mime_type_tables, mime_type_table);
|
|
|
|
grd_clipboard_update_server_mime_type_list (clipboard, mime_type_tables);
|
|
}
|
|
|
|
GrdClipboardVnc *
|
|
grd_clipboard_vnc_new (GrdSessionVnc *session_vnc)
|
|
{
|
|
GrdClipboardVnc *clipboard_vnc;
|
|
|
|
clipboard_vnc = g_object_new (GRD_TYPE_CLIPBOARD_VNC, NULL);
|
|
clipboard_vnc->session_vnc = session_vnc;
|
|
|
|
grd_clipboard_initialize (GRD_CLIPBOARD (clipboard_vnc),
|
|
GRD_SESSION (session_vnc));
|
|
|
|
return clipboard_vnc;
|
|
}
|
|
|
|
static void
|
|
grd_clipboard_vnc_dispose (GObject *object)
|
|
{
|
|
GrdClipboardVnc *clipboard_vnc = GRD_CLIPBOARD_VNC (object);
|
|
|
|
grd_clipboard_disable_clipboard (GRD_CLIPBOARD (clipboard_vnc));
|
|
g_clear_pointer (&clipboard_vnc->clipboard_utf8_string, g_free);
|
|
|
|
G_OBJECT_CLASS (grd_clipboard_vnc_parent_class)->dispose (object);
|
|
}
|
|
|
|
static void
|
|
grd_clipboard_vnc_init (GrdClipboardVnc *clipboard_vnc)
|
|
{
|
|
}
|
|
|
|
static void
|
|
grd_clipboard_vnc_class_init (GrdClipboardVncClass *klass)
|
|
{
|
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
GrdClipboardClass *clipboard_class = GRD_CLIPBOARD_CLASS (klass);
|
|
|
|
object_class->dispose = grd_clipboard_vnc_dispose;
|
|
|
|
clipboard_class->update_client_mime_type_list =
|
|
grd_clipboard_vnc_update_client_mime_type_list;
|
|
clipboard_class->request_client_content_for_mime_type =
|
|
grd_clipboard_vnc_request_client_content_for_mime_type;
|
|
clipboard_class->submit_requested_server_content =
|
|
grd_clipboard_vnc_submit_requested_server_content;
|
|
}
|