[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 08/12] ui/vdagent: split clipboard recv message handling
From: |
marcandre . lureau |
Subject: |
[PATCH 08/12] ui/vdagent: split clipboard recv message handling |
Date: |
Mon, 19 Jul 2021 11:26:50 +0400 |
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
ui/vdagent.c | 157 +++++++++++++++++++++++++++++----------------------
1 file changed, 89 insertions(+), 68 deletions(-)
diff --git a/ui/vdagent.c b/ui/vdagent.c
index bce9f44b7b..f716f2d8c3 100644
--- a/ui/vdagent.c
+++ b/ui/vdagent.c
@@ -433,13 +433,94 @@ static void vdagent_clipboard_request(QemuClipboardInfo
*info,
vdagent_send_msg(vd, msg);
}
+static void vdagent_clipboard_recv_grab(VDAgentChardev *vd, uint8_t s,
uint32_t size, void *data)
+{
+ g_autoptr(QemuClipboardInfo) info = NULL;
+
+ trace_vdagent_cb_grab_selection(GET_NAME(sel_name, s));
+ info = qemu_clipboard_info_new(&vd->cbpeer, s);
+ if (size > sizeof(uint32_t) * 10) {
+ /*
+ * spice has 6 types as of 2021. Limiting to 10 entries
+ * so we we have some wiggle room.
+ */
+ return;
+ }
+ while (size >= sizeof(uint32_t)) {
+ trace_vdagent_cb_grab_type(GET_NAME(type_name, *(uint32_t *)data));
+ switch (*(uint32_t *)data) {
+ case VD_AGENT_CLIPBOARD_UTF8_TEXT:
+ info->types[QEMU_CLIPBOARD_TYPE_TEXT].available = true;
+ break;
+ default:
+ break;
+ }
+ data += sizeof(uint32_t);
+ size -= sizeof(uint32_t);
+ }
+ qemu_clipboard_update(info);
+}
+
+static void vdagent_clipboard_recv_request(VDAgentChardev *vd, uint8_t s,
uint32_t size, void *data)
+{
+ QemuClipboardType type;
+
+ if (size < sizeof(uint32_t)) {
+ return;
+ }
+ switch (*(uint32_t *)data) {
+ case VD_AGENT_CLIPBOARD_UTF8_TEXT:
+ type = QEMU_CLIPBOARD_TYPE_TEXT;
+ break;
+ default:
+ return;
+ }
+ if (vd->cbinfo[s] && vd->cbinfo[s]->types[type].available &&
+ vd->cbinfo[s]->owner != &vd->cbpeer) {
+ if (vd->cbinfo[s]->types[type].data) {
+ vdagent_send_clipboard_data(vd, vd->cbinfo[s], type);
+ } else {
+ vd->cbpending[s] |= (1 << type);
+ qemu_clipboard_request(vd->cbinfo[s], type);
+ }
+ }
+}
+
+static void vdagent_clipboard_recv_data(VDAgentChardev *vd, uint8_t s,
uint32_t size, void *data)
+{
+ QemuClipboardType type;
+
+ if (size < sizeof(uint32_t)) {
+ return;
+ }
+ switch (*(uint32_t *)data) {
+ case VD_AGENT_CLIPBOARD_UTF8_TEXT:
+ type = QEMU_CLIPBOARD_TYPE_TEXT;
+ break;
+ default:
+ return;
+ }
+ data += 4;
+ size -= 4;
+ qemu_clipboard_set_data(&vd->cbpeer, vd->cbinfo[s], type, size, data,
true);
+}
+
+static void vdagent_clipboard_recv_release(VDAgentChardev *vd, uint8_t s)
+{
+ g_autoptr(QemuClipboardInfo) info = NULL;
+
+ if (vd->cbinfo[s] && vd->cbinfo[s]->owner == &vd->cbpeer) {
+ /* set empty clipboard info */
+ info = qemu_clipboard_info_new(NULL, s);
+ qemu_clipboard_update(info);
+ }
+}
+
static void vdagent_chr_recv_clipboard(VDAgentChardev *vd, VDAgentMessage *msg)
{
uint8_t s = VD_AGENT_CLIPBOARD_SELECTION_CLIPBOARD;
uint32_t size = msg->size;
void *data = msg->data;
- g_autoptr(QemuClipboardInfo) info = NULL;
- QemuClipboardType type;
if (have_selection(vd)) {
if (size < 4) {
@@ -455,75 +536,15 @@ static void vdagent_chr_recv_clipboard(VDAgentChardev
*vd, VDAgentMessage *msg)
switch (msg->type) {
case VD_AGENT_CLIPBOARD_GRAB:
- trace_vdagent_cb_grab_selection(GET_NAME(sel_name, s));
- info = qemu_clipboard_info_new(&vd->cbpeer, s);
- if (size > sizeof(uint32_t) * 10) {
- /*
- * spice has 6 types as of 2021. Limiting to 10 entries
- * so we we have some wiggle room.
- */
- return;
- }
- while (size >= sizeof(uint32_t)) {
- trace_vdagent_cb_grab_type(GET_NAME(type_name, *(uint32_t *)data));
- switch (*(uint32_t *)data) {
- case VD_AGENT_CLIPBOARD_UTF8_TEXT:
- info->types[QEMU_CLIPBOARD_TYPE_TEXT].available = true;
- break;
- default:
- break;
- }
- data += sizeof(uint32_t);
- size -= sizeof(uint32_t);
- }
- qemu_clipboard_update(info);
- break;
+ return vdagent_clipboard_recv_grab(vd, s, size, data);
case VD_AGENT_CLIPBOARD_REQUEST:
- if (size < sizeof(uint32_t)) {
- return;
- }
- switch (*(uint32_t *)data) {
- case VD_AGENT_CLIPBOARD_UTF8_TEXT:
- type = QEMU_CLIPBOARD_TYPE_TEXT;
- break;
- default:
- return;
- }
- if (vd->cbinfo[s] &&
- vd->cbinfo[s]->types[type].available &&
- vd->cbinfo[s]->owner != &vd->cbpeer) {
- if (vd->cbinfo[s]->types[type].data) {
- vdagent_send_clipboard_data(vd, vd->cbinfo[s], type);
- } else {
- vd->cbpending[s] |= (1 << type);
- qemu_clipboard_request(vd->cbinfo[s], type);
- }
- }
- break;
+ return vdagent_clipboard_recv_request(vd, s, size, data);
case VD_AGENT_CLIPBOARD: /* data */
- if (size < sizeof(uint32_t)) {
- return;
- }
- switch (*(uint32_t *)data) {
- case VD_AGENT_CLIPBOARD_UTF8_TEXT:
- type = QEMU_CLIPBOARD_TYPE_TEXT;
- break;
- default:
- return;
- }
- data += 4;
- size -= 4;
- qemu_clipboard_set_data(&vd->cbpeer, vd->cbinfo[s], type,
- size, data, true);
- break;
+ return vdagent_clipboard_recv_data(vd, s, size, data);
case VD_AGENT_CLIPBOARD_RELEASE:
- if (vd->cbinfo[s] &&
- vd->cbinfo[s]->owner == &vd->cbpeer) {
- /* set empty clipboard info */
- info = qemu_clipboard_info_new(NULL, s);
- qemu_clipboard_update(info);
- }
- break;
+ return vdagent_clipboard_recv_release(vd, s);
+ default:
+ g_assert_not_reached();
}
}
--
2.32.0.93.g670b81a890
- [PATCH 00/12] Clipboard fixes (for 6.1?), marcandre . lureau, 2021/07/19
- [PATCH 01/12] ui/vdagent: fix leak on error path, marcandre . lureau, 2021/07/19
- [PATCH 02/12] ui/vdagent: remove copy-pasta comment, marcandre . lureau, 2021/07/19
- [PATCH 03/12] ui/gtk-clipboard: use existing macros, marcandre . lureau, 2021/07/19
- [PATCH 04/12] ui/gtk-clipboard: fix clipboard enum typo, marcandre . lureau, 2021/07/19
- [PATCH 05/12] ui/clipboard: add helper to retrieve current clipboard, marcandre . lureau, 2021/07/19
- [PATCH 06/12] ui/clipboard: release owned grabs on unregister, marcandre . lureau, 2021/07/19
- [PATCH 07/12] ui/vdagent: unregister clipboard peer on finalize, marcandre . lureau, 2021/07/19
- [PATCH 08/12] ui/vdagent: split clipboard recv message handling,
marcandre . lureau <=
- [PATCH 09/12] ui/vdagent: use qemu_clipboard_info helper, marcandre . lureau, 2021/07/19
- [PATCH 10/12] ui/gtk-clipboard: use qemu_clipboard_info helper, marcandre . lureau, 2021/07/19
- [PATCH 11/12] ui/vdagent: send release when no clipboard owner, marcandre . lureau, 2021/07/19
- [PATCH 12/12] ui/gtk-clipboard: emit release clipboard events, marcandre . lureau, 2021/07/19