mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-20 06:50:22 +03:00
domain_conf: modernize graphics formatting
Use separate buffers for attributes and children elements to make the code cleaner and to use the virXMLFormatElement() function. Signed-off-by: Pavel Hrdina <phrdina@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
8d055b7d61
commit
227bf2c9de
@ -26324,13 +26324,14 @@ virDomainGraphicsListenDefFormat(virBuffer *buf,
|
||||
virDomainGraphicsListenDef *def,
|
||||
unsigned int flags)
|
||||
{
|
||||
g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
|
||||
|
||||
/* If generating migratable XML, skip listen address
|
||||
* dragged in from config file */
|
||||
if ((flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE) && def->fromConfig)
|
||||
return;
|
||||
|
||||
virBufferAddLit(buf, "<listen");
|
||||
virBufferAsprintf(buf, " type='%s'",
|
||||
virBufferAsprintf(&attrBuf, " type='%s'",
|
||||
virDomainGraphicsListenTypeToString(def->type));
|
||||
|
||||
if (def->address &&
|
||||
@ -26339,28 +26340,28 @@ virDomainGraphicsListenDefFormat(virBuffer *buf,
|
||||
!(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE)))) {
|
||||
/* address may also be set to show current status when type='network',
|
||||
* but we don't want to print that if INACTIVE data is requested. */
|
||||
virBufferAsprintf(buf, " address='%s'", def->address);
|
||||
virBufferAsprintf(&attrBuf, " address='%s'", def->address);
|
||||
}
|
||||
|
||||
if (def->network &&
|
||||
(def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK)) {
|
||||
virBufferEscapeString(buf, " network='%s'", def->network);
|
||||
virBufferEscapeString(&attrBuf, " network='%s'", def->network);
|
||||
}
|
||||
|
||||
if (def->socket &&
|
||||
def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET &&
|
||||
!(def->autoGenerated &&
|
||||
(flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE))) {
|
||||
virBufferEscapeString(buf, " socket='%s'", def->socket);
|
||||
virBufferEscapeString(&attrBuf, " socket='%s'", def->socket);
|
||||
}
|
||||
|
||||
if (flags & VIR_DOMAIN_DEF_FORMAT_STATUS) {
|
||||
virBufferAsprintf(buf, " fromConfig='%d'", def->fromConfig);
|
||||
virBufferAsprintf(buf, " autoGenerated='%s'",
|
||||
virBufferAsprintf(&attrBuf, " fromConfig='%d'", def->fromConfig);
|
||||
virBufferAsprintf(&attrBuf, " autoGenerated='%s'",
|
||||
def->autoGenerated ? "yes" : "no");
|
||||
}
|
||||
|
||||
virBufferAddLit(buf, "/>\n");
|
||||
virXMLFormatElement(buf, "listen", &attrBuf, NULL);
|
||||
}
|
||||
|
||||
|
||||
@ -26398,28 +26399,27 @@ virDomainGraphicsDefFormatGL(virBuffer *buf,
|
||||
virTristateBool gl,
|
||||
char *rendernode)
|
||||
{
|
||||
if (gl == VIR_TRISTATE_BOOL_ABSENT && !rendernode)
|
||||
return;
|
||||
|
||||
virBufferAddLit(buf, "<gl");
|
||||
g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
|
||||
|
||||
if (gl != VIR_TRISTATE_BOOL_ABSENT)
|
||||
virBufferAsprintf(buf, " enable='%s'", virTristateBoolTypeToString(gl));
|
||||
virBufferAsprintf(&attrBuf, " enable='%s'", virTristateBoolTypeToString(gl));
|
||||
|
||||
if (rendernode)
|
||||
virBufferEscapeString(buf, " rendernode='%s'", rendernode);
|
||||
virBufferEscapeString(&attrBuf, " rendernode='%s'", rendernode);
|
||||
|
||||
virBufferAddLit(buf, "/>\n");
|
||||
virXMLFormatElement(buf, "gl", &attrBuf, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
virDomainGraphicsDefFormatAudio(virBuffer *buf,
|
||||
unsigned int audioId)
|
||||
{
|
||||
if (audioId <= 0)
|
||||
return;
|
||||
g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
|
||||
|
||||
virBufferAsprintf(buf, "<audio id='%d'/>\n", audioId);
|
||||
if (audioId > 0)
|
||||
virBufferAsprintf(&attrBuf, " id='%d'", audioId);
|
||||
|
||||
virXMLFormatElement(buf, "audio", &attrBuf, NULL);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -26427,9 +26427,10 @@ virDomainGraphicsDefFormat(virBuffer *buf,
|
||||
virDomainGraphicsDef *def,
|
||||
unsigned int flags)
|
||||
{
|
||||
g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
|
||||
g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf);
|
||||
virDomainGraphicsListenDef *glisten = virDomainGraphicsGetListen(def, 0);
|
||||
const char *type = virDomainGraphicsTypeToString(def->type);
|
||||
bool children = false;
|
||||
size_t i;
|
||||
|
||||
if (!type) {
|
||||
@ -26438,7 +26439,7 @@ virDomainGraphicsDefFormat(virBuffer *buf,
|
||||
return -1;
|
||||
}
|
||||
|
||||
virBufferAsprintf(buf, "<graphics type='%s'", type);
|
||||
virBufferAsprintf(&attrBuf, " type='%s'", type);
|
||||
|
||||
switch (def->type) {
|
||||
case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
|
||||
@ -26457,7 +26458,7 @@ virDomainGraphicsDefFormat(virBuffer *buf,
|
||||
if (glisten->socket &&
|
||||
!((glisten->autoGenerated || glisten->fromConfig) &&
|
||||
(flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE))) {
|
||||
virBufferEscapeString(buf, " socket='%s'", glisten->socket);
|
||||
virBufferEscapeString(&attrBuf, " socket='%s'", glisten->socket);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -26465,90 +26466,84 @@ virDomainGraphicsDefFormat(virBuffer *buf,
|
||||
case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK:
|
||||
if (def->data.vnc.port &&
|
||||
(!def->data.vnc.autoport || !(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE)))
|
||||
virBufferAsprintf(buf, " port='%d'",
|
||||
virBufferAsprintf(&attrBuf, " port='%d'",
|
||||
def->data.vnc.port);
|
||||
else if (def->data.vnc.autoport)
|
||||
virBufferAddLit(buf, " port='-1'");
|
||||
virBufferAddLit(&attrBuf, " port='-1'");
|
||||
|
||||
virBufferAsprintf(buf, " autoport='%s'",
|
||||
virBufferAsprintf(&attrBuf, " autoport='%s'",
|
||||
def->data.vnc.autoport ? "yes" : "no");
|
||||
|
||||
if (def->data.vnc.websocketGenerated &&
|
||||
(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE))
|
||||
virBufferAddLit(buf, " websocket='-1'");
|
||||
virBufferAddLit(&attrBuf, " websocket='-1'");
|
||||
else if (def->data.vnc.websocket)
|
||||
virBufferAsprintf(buf, " websocket='%d'", def->data.vnc.websocket);
|
||||
virBufferAsprintf(&attrBuf, " websocket='%d'", def->data.vnc.websocket);
|
||||
|
||||
if (flags & VIR_DOMAIN_DEF_FORMAT_STATUS)
|
||||
virBufferAsprintf(buf, " websocketGenerated='%s'",
|
||||
virBufferAsprintf(&attrBuf, " websocketGenerated='%s'",
|
||||
def->data.vnc.websocketGenerated ? "yes" : "no");
|
||||
|
||||
virDomainGraphicsListenDefFormatAddr(buf, glisten, flags);
|
||||
virDomainGraphicsListenDefFormatAddr(&attrBuf, glisten, flags);
|
||||
break;
|
||||
case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE:
|
||||
case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST:
|
||||
break;
|
||||
}
|
||||
|
||||
virBufferEscapeString(buf, " keymap='%s'",
|
||||
virBufferEscapeString(&attrBuf, " keymap='%s'",
|
||||
def->data.vnc.keymap);
|
||||
|
||||
if (def->data.vnc.sharePolicy)
|
||||
virBufferAsprintf(buf, " sharePolicy='%s'",
|
||||
virBufferAsprintf(&attrBuf, " sharePolicy='%s'",
|
||||
virDomainGraphicsVNCSharePolicyTypeToString(
|
||||
def->data.vnc.sharePolicy));
|
||||
|
||||
if (def->data.vnc.powerControl)
|
||||
virBufferAsprintf(buf, " powerControl='%s'",
|
||||
virBufferAsprintf(&attrBuf, " powerControl='%s'",
|
||||
virTristateBoolTypeToString(def->data.vnc.powerControl));
|
||||
|
||||
virDomainGraphicsAuthDefFormatAttr(buf, &def->data.vnc.auth, flags);
|
||||
virDomainGraphicsAuthDefFormatAttr(&attrBuf, &def->data.vnc.auth, flags);
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
|
||||
virBufferEscapeString(buf, " display='%s'",
|
||||
virBufferEscapeString(&attrBuf, " display='%s'",
|
||||
def->data.sdl.display);
|
||||
|
||||
virBufferEscapeString(buf, " xauth='%s'",
|
||||
virBufferEscapeString(&attrBuf, " xauth='%s'",
|
||||
def->data.sdl.xauth);
|
||||
if (def->data.sdl.fullscreen)
|
||||
virBufferAddLit(buf, " fullscreen='yes'");
|
||||
virBufferAddLit(&attrBuf, " fullscreen='yes'");
|
||||
|
||||
if (!children && def->data.sdl.gl != VIR_TRISTATE_BOOL_ABSENT) {
|
||||
virBufferAddLit(buf, ">\n");
|
||||
virBufferAdjustIndent(buf, 2);
|
||||
children = true;
|
||||
}
|
||||
|
||||
virDomainGraphicsDefFormatGL(buf, def->data.sdl.gl, NULL);
|
||||
virDomainGraphicsDefFormatGL(&childBuf, def->data.sdl.gl, NULL);
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
|
||||
if (def->data.rdp.port)
|
||||
virBufferAsprintf(buf, " port='%d'",
|
||||
virBufferAsprintf(&attrBuf, " port='%d'",
|
||||
def->data.rdp.port);
|
||||
else if (def->data.rdp.autoport)
|
||||
virBufferAddLit(buf, " port='0'");
|
||||
virBufferAddLit(&attrBuf, " port='0'");
|
||||
|
||||
if (def->data.rdp.autoport)
|
||||
virBufferAddLit(buf, " autoport='yes'");
|
||||
virBufferAddLit(&attrBuf, " autoport='yes'");
|
||||
|
||||
if (def->data.rdp.replaceUser)
|
||||
virBufferAddLit(buf, " replaceUser='yes'");
|
||||
virBufferAddLit(&attrBuf, " replaceUser='yes'");
|
||||
|
||||
if (def->data.rdp.multiUser)
|
||||
virBufferAddLit(buf, " multiUser='yes'");
|
||||
virBufferAddLit(&attrBuf, " multiUser='yes'");
|
||||
|
||||
virDomainGraphicsListenDefFormatAddr(buf, glisten, flags);
|
||||
virDomainGraphicsListenDefFormatAddr(&attrBuf, glisten, flags);
|
||||
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
|
||||
virBufferEscapeString(buf, " display='%s'",
|
||||
virBufferEscapeString(&attrBuf, " display='%s'",
|
||||
def->data.desktop.display);
|
||||
|
||||
if (def->data.desktop.fullscreen)
|
||||
virBufferAddLit(buf, " fullscreen='yes'");
|
||||
virBufferAddLit(&attrBuf, " fullscreen='yes'");
|
||||
|
||||
break;
|
||||
|
||||
@ -26563,22 +26558,22 @@ virDomainGraphicsDefFormat(virBuffer *buf,
|
||||
case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS:
|
||||
case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK:
|
||||
if (def->data.spice.port)
|
||||
virBufferAsprintf(buf, " port='%d'",
|
||||
virBufferAsprintf(&attrBuf, " port='%d'",
|
||||
def->data.spice.port);
|
||||
|
||||
if (def->data.spice.tlsPort)
|
||||
virBufferAsprintf(buf, " tlsPort='%d'",
|
||||
virBufferAsprintf(&attrBuf, " tlsPort='%d'",
|
||||
def->data.spice.tlsPort);
|
||||
|
||||
virBufferAsprintf(buf, " autoport='%s'",
|
||||
virBufferAsprintf(&attrBuf, " autoport='%s'",
|
||||
def->data.spice.autoport ? "yes" : "no");
|
||||
|
||||
virDomainGraphicsListenDefFormatAddr(buf, glisten, flags);
|
||||
virDomainGraphicsListenDefFormatAddr(&attrBuf, glisten, flags);
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE:
|
||||
if (flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE)
|
||||
virBufferAddLit(buf, " autoport='no'");
|
||||
virBufferAddLit(&attrBuf, " autoport='no'");
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET:
|
||||
@ -26590,7 +26585,7 @@ virDomainGraphicsDefFormat(virBuffer *buf,
|
||||
* parsed as listen type "none". */
|
||||
if ((flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE) &&
|
||||
glisten->fromConfig) {
|
||||
virBufferAddLit(buf, " autoport='yes'");
|
||||
virBufferAddLit(&attrBuf, " autoport='yes'");
|
||||
}
|
||||
break;
|
||||
|
||||
@ -26598,48 +26593,31 @@ virDomainGraphicsDefFormat(virBuffer *buf,
|
||||
break;
|
||||
}
|
||||
|
||||
virBufferEscapeString(buf, " keymap='%s'",
|
||||
virBufferEscapeString(&attrBuf, " keymap='%s'",
|
||||
def->data.spice.keymap);
|
||||
|
||||
if (def->data.spice.defaultMode != VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_ANY)
|
||||
virBufferAsprintf(buf, " defaultMode='%s'",
|
||||
virBufferAsprintf(&attrBuf, " defaultMode='%s'",
|
||||
virDomainGraphicsSpiceChannelModeTypeToString(def->data.spice.defaultMode));
|
||||
|
||||
virDomainGraphicsAuthDefFormatAttr(buf, &def->data.spice.auth, flags);
|
||||
virDomainGraphicsAuthDefFormatAttr(&attrBuf, &def->data.spice.auth, flags);
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
|
||||
if (!def->data.egl_headless.rendernode)
|
||||
break;
|
||||
|
||||
if (!children) {
|
||||
virBufferAddLit(buf, ">\n");
|
||||
virBufferAdjustIndent(buf, 2);
|
||||
children = true;
|
||||
}
|
||||
|
||||
virDomainGraphicsDefFormatGL(buf, VIR_TRISTATE_BOOL_ABSENT,
|
||||
virDomainGraphicsDefFormatGL(&childBuf, VIR_TRISTATE_BOOL_ABSENT,
|
||||
def->data.egl_headless.rendernode);
|
||||
break;
|
||||
case VIR_DOMAIN_GRAPHICS_TYPE_DBUS:
|
||||
if (def->data.dbus.p2p)
|
||||
virBufferAddLit(buf, " p2p='yes'");
|
||||
virBufferAddLit(&attrBuf, " p2p='yes'");
|
||||
if (def->data.dbus.address)
|
||||
virBufferAsprintf(buf, " address='%s'",
|
||||
virBufferAsprintf(&attrBuf, " address='%s'",
|
||||
def->data.dbus.address);
|
||||
|
||||
if (!def->data.dbus.gl && def->data.dbus.audioId <= 0)
|
||||
break;
|
||||
virDomainGraphicsDefFormatGL(&childBuf, def->data.dbus.gl,
|
||||
def->data.dbus.rendernode);
|
||||
|
||||
if (!children) {
|
||||
virBufferAddLit(buf, ">\n");
|
||||
virBufferAdjustIndent(buf, 2);
|
||||
children = true;
|
||||
}
|
||||
|
||||
virDomainGraphicsDefFormatGL(buf, def->data.dbus.gl, def->data.dbus.rendernode);
|
||||
|
||||
virDomainGraphicsDefFormatAudio(buf, def->data.dbus.audioId);
|
||||
virDomainGraphicsDefFormatAudio(&childBuf, def->data.dbus.audioId);
|
||||
|
||||
break;
|
||||
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
|
||||
@ -26672,83 +26650,54 @@ virDomainGraphicsDefFormat(virBuffer *buf,
|
||||
def->listens[i].type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE)
|
||||
continue;
|
||||
}
|
||||
if (!children) {
|
||||
virBufferAddLit(buf, ">\n");
|
||||
virBufferAdjustIndent(buf, 2);
|
||||
children = true;
|
||||
}
|
||||
virDomainGraphicsListenDefFormat(buf, &def->listens[i], flags);
|
||||
virDomainGraphicsListenDefFormat(&childBuf, &def->listens[i], flags);
|
||||
}
|
||||
|
||||
if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
|
||||
g_auto(virBuffer) spiceBuf = VIR_BUFFER_INITIALIZER;
|
||||
|
||||
for (i = 0; i < VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_LAST; i++) {
|
||||
int mode = def->data.spice.channels[i];
|
||||
if (mode == VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_ANY)
|
||||
continue;
|
||||
|
||||
if (!children) {
|
||||
virBufferAddLit(buf, ">\n");
|
||||
virBufferAdjustIndent(buf, 2);
|
||||
children = true;
|
||||
}
|
||||
|
||||
virBufferAsprintf(buf, "<channel name='%s' mode='%s'/>\n",
|
||||
virBufferAsprintf(&spiceBuf, " name='%s' mode='%s'",
|
||||
virDomainGraphicsSpiceChannelNameTypeToString(i),
|
||||
virDomainGraphicsSpiceChannelModeTypeToString(mode));
|
||||
}
|
||||
if (!children && (def->data.spice.image || def->data.spice.jpeg ||
|
||||
def->data.spice.zlib || def->data.spice.playback ||
|
||||
def->data.spice.streaming || def->data.spice.copypaste ||
|
||||
def->data.spice.mousemode || def->data.spice.filetransfer ||
|
||||
def->data.spice.gl)) {
|
||||
virBufferAddLit(buf, ">\n");
|
||||
virBufferAdjustIndent(buf, 2);
|
||||
children = true;
|
||||
}
|
||||
if (def->data.spice.image)
|
||||
virBufferAsprintf(buf, "<image compression='%s'/>\n",
|
||||
virDomainGraphicsSpiceImageCompressionTypeToString(def->data.spice.image));
|
||||
if (def->data.spice.jpeg)
|
||||
virBufferAsprintf(buf, "<jpeg compression='%s'/>\n",
|
||||
virDomainGraphicsSpiceJpegCompressionTypeToString(def->data.spice.jpeg));
|
||||
if (def->data.spice.zlib)
|
||||
virBufferAsprintf(buf, "<zlib compression='%s'/>\n",
|
||||
virDomainGraphicsSpiceZlibCompressionTypeToString(def->data.spice.zlib));
|
||||
if (def->data.spice.playback)
|
||||
virBufferAsprintf(buf, "<playback compression='%s'/>\n",
|
||||
virTristateSwitchTypeToString(def->data.spice.playback));
|
||||
if (def->data.spice.streaming)
|
||||
virBufferAsprintf(buf, "<streaming mode='%s'/>\n",
|
||||
virDomainGraphicsSpiceStreamingModeTypeToString(def->data.spice.streaming));
|
||||
if (def->data.spice.mousemode)
|
||||
virBufferAsprintf(buf, "<mouse mode='%s'/>\n",
|
||||
virDomainMouseModeTypeToString(def->data.spice.mousemode));
|
||||
if (def->data.spice.copypaste)
|
||||
virBufferAsprintf(buf, "<clipboard copypaste='%s'/>\n",
|
||||
virTristateBoolTypeToString(def->data.spice.copypaste));
|
||||
if (def->data.spice.filetransfer)
|
||||
virBufferAsprintf(buf, "<filetransfer enable='%s'/>\n",
|
||||
virTristateBoolTypeToString(def->data.spice.filetransfer));
|
||||
|
||||
virDomainGraphicsDefFormatGL(buf, def->data.spice.gl, def->data.spice.rendernode);
|
||||
}
|
||||
|
||||
if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
|
||||
if (!children) {
|
||||
virBufferAddLit(buf, ">\n");
|
||||
virBufferAdjustIndent(buf, 2);
|
||||
children = true;
|
||||
virXMLFormatElement(&childBuf, "channel", &spiceBuf, NULL);
|
||||
}
|
||||
|
||||
virDomainGraphicsDefFormatAudio(buf, def->data.vnc.audioId);
|
||||
#define FORMAT_SPICE_FEATURE(name, attr, value, toStringFunc) \
|
||||
if (value) { \
|
||||
virBufferAsprintf(&spiceBuf, " " attr "='%s'", toStringFunc(value)); \
|
||||
} \
|
||||
virXMLFormatElement(&childBuf, name, &spiceBuf, NULL);
|
||||
|
||||
FORMAT_SPICE_FEATURE("image", "compression", def->data.spice.image,
|
||||
virDomainGraphicsSpiceImageCompressionTypeToString);
|
||||
FORMAT_SPICE_FEATURE("jpeg", "compression", def->data.spice.jpeg,
|
||||
virDomainGraphicsSpiceJpegCompressionTypeToString);
|
||||
FORMAT_SPICE_FEATURE("zlib", "compression", def->data.spice.zlib,
|
||||
virDomainGraphicsSpiceZlibCompressionTypeToString);
|
||||
FORMAT_SPICE_FEATURE("playback", "compression", def->data.spice.playback,
|
||||
virTristateSwitchTypeToString);
|
||||
FORMAT_SPICE_FEATURE("streaming", "mode", def->data.spice.streaming,
|
||||
virDomainGraphicsSpiceStreamingModeTypeToString);
|
||||
FORMAT_SPICE_FEATURE("mouse", "mode", def->data.spice.mousemode,
|
||||
virDomainMouseModeTypeToString);
|
||||
FORMAT_SPICE_FEATURE("clipboard", "copypaste", def->data.spice.copypaste,
|
||||
virTristateBoolTypeToString);
|
||||
FORMAT_SPICE_FEATURE("filetransfer", "enable", def->data.spice.filetransfer,
|
||||
virTristateBoolTypeToString);
|
||||
|
||||
virDomainGraphicsDefFormatGL(&childBuf, def->data.spice.gl, def->data.spice.rendernode);
|
||||
}
|
||||
|
||||
if (children) {
|
||||
virBufferAdjustIndent(buf, -2);
|
||||
virBufferAddLit(buf, "</graphics>\n");
|
||||
} else {
|
||||
virBufferAddLit(buf, "/>\n");
|
||||
}
|
||||
if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC)
|
||||
virDomainGraphicsDefFormatAudio(&childBuf, def->data.vnc.audioId);
|
||||
|
||||
virXMLFormatElement(buf, "graphics", &attrBuf, &childBuf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user