[libvirt PATCH 03/16] domain_conf: modernize graphics formatting

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux