1
0
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:
Pavel Hrdina 2025-03-06 11:03:06 +01:00
parent 8d055b7d61
commit 227bf2c9de

View File

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