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@xxxxxxxxxx> --- src/conf/domain_conf.c | 235 ++++++++++++++++------------------------- 1 file changed, 92 insertions(+), 143 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index a0e68d6046..8de39e7767 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -26287,13 +26287,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 && @@ -26302,28 +26303,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); } @@ -26361,28 +26362,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 @@ -26390,9 +26390,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) { @@ -26401,7 +26402,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: @@ -26420,7 +26421,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; @@ -26428,90 +26429,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; @@ -26526,22 +26521,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: @@ -26553,7 +26548,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; @@ -26561,48 +26556,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: @@ -26635,83 +26613,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)); + + virXMLFormatElement(&childBuf, "channel", &spiceBuf, NULL); } - 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); - } +#define FORMAT_SPICE_FEATURE(name, attr, value, toStringFunc) \ + if (value) { \ + virBufferAsprintf(&spiceBuf, " " attr "='%s'", toStringFunc(value)); \ + } \ + virXMLFormatElement(&childBuf, name, &spiceBuf, NULL); - if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) { - if (!children) { - virBufferAddLit(buf, ">\n"); - virBufferAdjustIndent(buf, 2); - children = true; - } + 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); - virDomainGraphicsDefFormatAudio(buf, def->data.vnc.audioId); + 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; } -- 2.48.1