This helper allows you to better structurize the code if some element
may or may not contains attributes and/or child elements.
Signed-off-by: Pavel Hrdina <phrdina(a)redhat.com>
---
src/libvirt_private.syms | 1 +
src/util/virxml.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
src/util/virxml.h | 6 ++++++
3 files changed, 54 insertions(+)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 2149b11b74..12adf27285 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2955,6 +2955,7 @@ virVHBAPathExists;
virXMLCheckIllegalChars;
virXMLChildElementCount;
virXMLExtractNamespaceXML;
+virXMLFormatElement;
virXMLNodeContentString;
virXMLNodeNameEqual;
virXMLNodeSanitizeNamespaces;
diff --git a/src/util/virxml.c b/src/util/virxml.c
index 562a4bf3ba..885f59bceb 100644
--- a/src/util/virxml.c
+++ b/src/util/virxml.c
@@ -1354,3 +1354,50 @@ virXMLValidatorFree(virXMLValidatorPtr validator)
xmlRelaxNGFree(validator->rng);
VIR_FREE(validator);
}
+
+
+/**
+ * virXMLFormatElement
+ * @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
+ *
+ * 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.
+ *
+ * Returns 0 on success, -1 on error.
+ */
+int
+virXMLFormatElement(virBufferPtr buf,
+ const char *name,
+ virBufferPtr attrBuf,
+ virBufferPtr childBuf)
+{
+ if ((!attrBuf || virBufferUse(attrBuf) == 0) &&
+ (!childBuf || virBufferUse(childBuf) == 0)) {
+ return 0;
+ }
+
+ if ((attrBuf && virBufferCheckError(attrBuf) < 0) ||
+ (childBuf && virBufferCheckError(childBuf) < 0)) {
+ return -1;
+ }
+
+ virBufferAsprintf(buf, "<%s", name);
+
+ if (attrBuf && virBufferUse(attrBuf) > 0)
+ virBufferAddBuffer(buf, attrBuf);
+
+ if (childBuf && virBufferUse(childBuf) > 0) {
+ virBufferAddLit(buf, ">\n");
+ virBufferAddBuffer(buf, childBuf);
+ virBufferAsprintf(buf, "</%s>\n", name);
+ } else {
+ virBufferAddLit(buf, "/>\n");
+ }
+
+ return 0;
+}
diff --git a/src/util/virxml.h b/src/util/virxml.h
index 86baeb37a7..1a7d61a8bc 100644
--- a/src/util/virxml.h
+++ b/src/util/virxml.h
@@ -215,4 +215,10 @@ virXMLValidateAgainstSchema(const char *schemafile,
void
virXMLValidatorFree(virXMLValidatorPtr validator);
+int
+virXMLFormatElement(virBufferPtr buf,
+ const char *name,
+ virBufferPtr attrBuf,
+ virBufferPtr childBuf);
+
#endif /* __VIR_XML_H__ */
--
2.13.5