Files
grd/grd-clipboard-vnc.c
2026-02-13 13:06:50 +09:00

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;
}