
On 03/14/2012 05:06 AM, Osier Yang wrote:
On 03/14/2012 01:45 PM, Laine Stump wrote:
Wire up the domain graphics event notifications for SPICE. Adapted from a RHEL-only patch written by Dan Berrange that used custom __com.redhat_SPICE events - equivalent events are now available in upstream QEMU (including a SPICE_CONNECTED event, which was missing in the __COM.redhat_SPICE version).
* src/qemu/qemu_monitor_json.c: Wire up SPICE graphics events --- src/qemu/qemu_monitor_json.c | 56 +++++++++++++++++++++++++++++++++++++++--- 1 files changed, 52 insertions(+), 4 deletions(-)
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 1a0ee94..a5ef1d4 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -59,6 +59,9 @@ static void qemuMonitorJSONHandleVNCConnect(qemuMonitorPtr mon, virJSONValuePtr static void qemuMonitorJSONHandleVNCInitialize(qemuMonitorPtr mon, virJSONValuePtr data); static void qemuMonitorJSONHandleVNCDisconnect(qemuMonitorPtr mon, virJSONValuePtr data); static void qemuMonitorJSONHandleBlockJob(qemuMonitorPtr mon, virJSONValuePtr data); +static void qemuMonitorJSONHandleSPICEConnect(qemuMonitorPtr mon, virJSONValuePtr data); +static void qemuMonitorJSONHandleSPICEInitialize(qemuMonitorPtr mon, virJSONValuePtr data); +static void qemuMonitorJSONHandleSPICEDisconnect(qemuMonitorPtr mon, virJSONValuePtr data);
static struct { const char *type; @@ -75,6 +78,9 @@ static struct { { "VNC_INITIALIZED", qemuMonitorJSONHandleVNCInitialize, }, { "VNC_DISCONNECTED", qemuMonitorJSONHandleVNCDisconnect, }, { "BLOCK_JOB_COMPLETED", qemuMonitorJSONHandleBlockJob, }, + { "SPICE_CONNECTED", qemuMonitorJSONHandleSPICEConnect, }, + { "SPICE_INITIALIZED", qemuMonitorJSONHandleSPICEInitialize, }, + { "SPICE_DISCONNECTED", qemuMonitorJSONHandleSPICEDisconnect, }, };
@@ -624,7 +630,7 @@ VIR_ENUM_IMPL(qemuMonitorGraphicsAddressFamily, VIR_DOMAIN_EVENT_GRAPHICS_ADDRESS_LAST, "ipv4", "ipv6", "unix");
-static void qemuMonitorJSONHandleVNC(qemuMonitorPtr mon, virJSONValuePtr data, int phase) +static void qemuMonitorJSONHandleGraphics(qemuMonitorPtr mon, virJSONValuePtr data, int phase) { const char *localNode, *localService, *localFamily; const char *remoteNode, *remoteService, *remoteFamily; @@ -643,14 +649,38 @@ static void qemuMonitorJSONHandleVNC(qemuMonitorPtr mon, virJSONValuePtr data, i }
authScheme = virJSONValueObjectGetString(server, "auth"); + if (!authScheme) { + VIR_WARN("missing auth scheme in graphics event"); + return; + }
localFamily = virJSONValueObjectGetString(server, "family"); + if (!authScheme) {
s/authScheme/localFamily/
Oops. That means the original patch in RHEL is also wrong. I'm resending with these fixed.
+ VIR_WARN("missing local address family in graphics event"); + return; + } localNode = virJSONValueObjectGetString(server, "host"); + if (!authScheme) {
likewise
+ VIR_WARN("missing local hostname in graphics event"); + return; + } localService = virJSONValueObjectGetString(server, "service"); + if (!localService) + localService = ""; /* Spice has multiple ports, so this isn't provided */
remoteFamily = virJSONValueObjectGetString(client, "family"); + if (!authScheme) {
likewise
+ VIR_WARN("missing remote address family in graphics event"); + return; + } remoteNode = virJSONValueObjectGetString(client, "host"); + if (!authScheme) {
likewise
+ VIR_WARN("missing remote hostname in graphics event"); + return; + } remoteService = virJSONValueObjectGetString(client, "service"); + if (!remoteService) + remoteService = ""; /* Spice has multiple ports, so this isn't provided */
Will we want to parse the specific parameters of spice events? e.g
If we do, that will be a separate patch. The intent here is to bring upstream to parity with the RHEL build.
<snip> - "port": port number (json-string) - "family": address family (json-string, "ipv4" or "ipv6") - "connection-id": spice connection id. All channels with the same id belong to the same spice session (json-int) - "channel-type": channel type. "1" is the main control channel, filter for this one if you want track spice sessions only (json-int) - "channel-id": channel id. Usually "0", might be different needed when multiple channels of the same type exist, such as multiple display channels in a multihead setup (json-int) - "tls": whevener the channel is encrypted (json-bool) </snip>