diff options
-rw-r--r-- | QMP/qmp-events.txt | 7 | ||||
-rw-r--r-- | monitor.c | 3 | ||||
-rw-r--r-- | monitor.h | 1 | ||||
-rw-r--r-- | vnc.c | 25 |
4 files changed, 36 insertions, 0 deletions
diff --git a/QMP/qmp-events.txt b/QMP/qmp-events.txt index 682a5e53a..d36da468a 100644 --- a/QMP/qmp-events.txt +++ b/QMP/qmp-events.txt @@ -24,3 +24,10 @@ Data: None. Description: Issued when the Virtual Machine enters debug mode. Data: None. + +4 VNC_CONNECTED +--------------- + +Description: Issued when a VNC client establishes a connection. +Data: 'server' and 'client' keys with the same keys as 'query-vnc', +except that authentication ID is not provided. @@ -357,6 +357,9 @@ void monitor_protocol_event(MonitorEvent event, QObject *data) case QEVENT_STOP: event_name = "STOP"; break; + case QEVENT_VNC_CONNECTED: + event_name = "VNC_CONNECTED"; + break; default: abort(); break; @@ -20,6 +20,7 @@ typedef enum MonitorEvent { QEVENT_RESET, QEVENT_POWERDOWN, QEVENT_STOP, + QEVENT_VNC_CONNECTED, QEVENT_MAX, } MonitorEvent; @@ -269,6 +269,30 @@ static void vnc_client_cache_addr(VncState *client) client->info = QOBJECT(qdict); } +static void vnc_qmp_event(VncState *vs, MonitorEvent event) +{ + QDict *server; + QObject *data; + + if (!vs->info) { + return; + } + + server = qdict_new(); + if (vnc_server_info_put(server) < 0) { + QDECREF(server); + return; + } + + data = qobject_from_jsonf("{ 'client': %p, 'server': %p }", + vs->info, QOBJECT(server)); + + monitor_protocol_event(event, data); + + qobject_incref(vs->info); + qobject_decref(data); +} + static void info_vnc_iter(QObject *obj, void *opaque) { QDict *client; @@ -2396,6 +2420,7 @@ static void vnc_connect(VncDisplay *vd, int csock) qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, NULL, vs); vnc_client_cache_addr(vs); + vnc_qmp_event(vs, QEVENT_VNC_CONNECTED); vs->vd = vd; vs->ds = vd->ds; |