]> xenbits.xensource.com Git - libvirt.git/commitdiff
virXMLFormatElement: Introduce virXMLFormatElementInternal
authorPeter Krempa <pkrempa@redhat.com>
Mon, 28 Mar 2022 14:00:58 +0000 (16:00 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 8 Apr 2022 07:32:47 +0000 (09:32 +0200)
The new function aggregates the internal working of virXMLFormatElement
and virXMLFormatElementEmpty and also allows skipping the newline
after the opening tag to allow using this helper also in cases where we
don't format any child elements but directly a value.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/libvirt_private.syms
src/util/virxml.c
src/util/virxml.h

index a9d7ed972fb03976dec13b562b565bef943b3075..97bfca906bdb2fb2afe72f9f046f6d07f8745494 100644 (file)
@@ -3634,6 +3634,7 @@ virXMLCheckIllegalChars;
 virXMLExtractNamespaceXML;
 virXMLFormatElement;
 virXMLFormatElementEmpty;
+virXMLFormatElementInternal;
 virXMLFormatMetadata;
 virXMLNewNode;
 virXMLNodeContentString;
index e9ccb54c4177667eb5089d2d3859cb0d0222abc8..12b2ef635a16769d3ea0be8863632d7f72dfee0e 100644 (file)
@@ -1609,21 +1609,48 @@ virXMLValidatorFree(virXMLValidator *validator)
 }
 
 
-/* same as virXMLFormatElement but outputs an empty element if @attrBuf and
- * @childBuf are both empty */
+/**
+ * virXMLFormatElementInternal
+ * @buf: the parent buffer where the element will be placed
+ * @name: the name of the element
+ * @attrBuf: buffer with attributes for element, may be NULL
+ * @childBuf: buffer with child elements, may be NULL
+ * @allowEmpty: Format empty element if @attrBuf and @childBuf are empty
+ * @childNewline: Add a newline after the opening element before formatting @childBuf
+ *
+ * Helper to format element where attributes or child elements
+ * are optional and may not be formatted.  If both @attrBuf and
+ * @childBuf are NULL or are empty buffers the element is not
+ * formatted.
+ *
+ * Passing false for @childNewline allows to format elements where we directly
+ * output a value without subelements.
+ *
+ * Both passed buffers are always consumed and freed.
+ */
 void
-virXMLFormatElementEmpty(virBuffer *buf,
-                         const char *name,
-                         virBuffer *attrBuf,
-                         virBuffer *childBuf)
+virXMLFormatElementInternal(virBuffer *buf,
+                            const char *name,
+                            virBuffer *attrBuf,
+                            virBuffer *childBuf,
+                            bool allowEmpty,
+                            bool childNewline)
 {
+    if (!allowEmpty) {
+        if ((!attrBuf || virBufferUse(attrBuf) == 0) &&
+            (!childBuf || virBufferUse(childBuf) == 0))
+            return;
+    }
+
     virBufferAsprintf(buf, "<%s", name);
 
     if (attrBuf && virBufferUse(attrBuf) > 0)
         virBufferAddBuffer(buf, attrBuf);
 
     if (childBuf && virBufferUse(childBuf) > 0) {
-        virBufferAddLit(buf, ">\n");
+        virBufferAddLit(buf, ">");
+        if (childNewline)
+            virBufferAddLit(buf, "\n");
         virBufferAddBuffer(buf, childBuf);
         virBufferAsprintf(buf, "</%s>\n", name);
     } else {
@@ -1634,6 +1661,17 @@ virXMLFormatElementEmpty(virBuffer *buf,
     virBufferFreeAndReset(childBuf);
 }
 
+/* same as virXMLFormatElement but outputs an empty element if @attrBuf and
+ * @childBuf are both empty */
+void
+virXMLFormatElementEmpty(virBuffer *buf,
+                         const char *name,
+                         virBuffer *attrBuf,
+                         virBuffer *childBuf)
+{
+    virXMLFormatElementInternal(buf, name, attrBuf, childBuf, true, true);
+}
+
 
 /**
  * virXMLFormatElement
@@ -1655,11 +1693,7 @@ virXMLFormatElement(virBuffer *buf,
                     virBuffer *attrBuf,
                     virBuffer *childBuf)
 {
-    if ((!attrBuf || virBufferUse(attrBuf) == 0) &&
-        (!childBuf || virBufferUse(childBuf) == 0))
-        return;
-
-    virXMLFormatElementEmpty(buf, name, attrBuf, childBuf);
+    virXMLFormatElementInternal(buf, name, attrBuf, childBuf, false, true);
 }
 
 
index 05016db577f13d7c0c1567299e356343850b9bff..5d49056bc75fa7ff43bba4fb9a03766eb5f92d2b 100644 (file)
@@ -322,6 +322,13 @@ void
 virXMLValidatorFree(virXMLValidator *validator);
 G_DEFINE_AUTOPTR_CLEANUP_FUNC(virXMLValidator, virXMLValidatorFree);
 
+void
+virXMLFormatElementInternal(virBuffer *buf,
+                            const char *name,
+                            virBuffer *attrBuf,
+                            virBuffer *childBuf,
+                            bool allowEmpty,
+                            bool childNewline);
 void
 virXMLFormatElement(virBuffer *buf,
                     const char *name,