virBufferEscapeString(buf, "<description>%s</description>\n",
def->description);
- if (def->metadata) {
- g_autoptr(xmlBuffer) xmlbuf = NULL;
- int oldIndentTreeOutput = xmlIndentTreeOutput;
-
- /* Indentation on output requires that we previously set
- * xmlKeepBlanksDefault to 0 when parsing; also, libxml does 2
- * spaces per level of indentation of intermediate elements,
- * but no leading indentation before the starting element.
- * Thankfully, libxml maps what looks like globals into
- * thread-local uses, so we are thread-safe. */
- xmlIndentTreeOutput = 1;
- xmlbuf = virXMLBufferCreate();
-
- if (xmlNodeDump(xmlbuf, def->metadata->doc, def->metadata,
- virBufferGetIndent(buf) / 2, 1) < 0) {
- xmlIndentTreeOutput = oldIndentTreeOutput;
- return -1;
- }
- virBufferAsprintf(buf, "%s\n", (char *) xmlBufferContent(xmlbuf));
- xmlIndentTreeOutput = oldIndentTreeOutput;
- }
+ if (virXMLFormatMetadata(buf, def->metadata) < 0)
+ return -1;
if (virDomainDefHasMemoryHotplug(def)) {
virBufferAsprintf(buf,
virUUIDFormat(uuid, uuidstr);
virBufferAsprintf(buf, "<uuid>%s</uuid>\n", uuidstr);
- if (def->metadata) {
- g_autoptr(xmlBuffer) xmlbuf = NULL;
- int oldIndentTreeOutput = xmlIndentTreeOutput;
-
- /* Indentation on output requires that we previously set
- * xmlKeepBlanksDefault to 0 when parsing; also, libxml does 2
- * spaces per level of indentation of intermediate elements,
- * but no leading indentation before the starting element.
- * Thankfully, libxml maps what looks like globals into
- * thread-local uses, so we are thread-safe. */
- xmlIndentTreeOutput = 1;
- xmlbuf = virXMLBufferCreate();
-
- if (xmlNodeDump(xmlbuf, def->metadata->doc, def->metadata,
- virBufferGetIndent(buf) / 2, 1) < 0) {
- xmlIndentTreeOutput = oldIndentTreeOutput;
- return -1;
- }
- virBufferAsprintf(buf, "%s\n", (char *) xmlBufferContent(xmlbuf));
- xmlIndentTreeOutput = oldIndentTreeOutput;
- }
+ if (virXMLFormatMetadata(buf, def->metadata) < 0)
+ return -1;
if (def->forward.type != VIR_NETWORK_FORWARD_NONE) {
const char *dev = NULL;
virXMLExtractNamespaceXML;
virXMLFormatElement;
virXMLFormatElementEmpty;
+virXMLFormatMetadata;
virXMLNewNode;
virXMLNodeContentString;
virXMLNodeNameEqual;
}
+/**
+ * virXMLFormatMetadata:
+ * @buf: the parent buffer where the element will be placed
+ * @metadata: pointer to metadata node
+ *
+ * Helper to format metadata element. If @metadata is NULL then
+ * this function is a NOP.
+ *
+ * Returns: 0 on success,
+ * -1 otherwise.
+ */
+int
+virXMLFormatMetadata(virBuffer *buf,
+ xmlNodePtr metadata)
+{
+ g_autoptr(xmlBuffer) xmlbuf = NULL;
+ int oldIndentTreeOutput = xmlIndentTreeOutput;
+
+ if (!metadata)
+ return 0;
+
+ /* Indentation on output requires that we previously set
+ * xmlKeepBlanksDefault to 0 when parsing; also, libxml does 2
+ * spaces per level of indentation of intermediate elements,
+ * but no leading indentation before the starting element.
+ * Thankfully, libxml maps what looks like globals into
+ * thread-local uses, so we are thread-safe. */
+ xmlIndentTreeOutput = 1;
+ xmlbuf = virXMLBufferCreate();
+
+ if (xmlNodeDump(xmlbuf, metadata->doc, metadata,
+ virBufferGetIndent(buf) / 2, 1) < 0) {
+ xmlIndentTreeOutput = oldIndentTreeOutput;
+ return -1;
+ }
+
+ virBufferAsprintf(buf, "%s\n", (char *) xmlBufferContent(xmlbuf));
+ xmlIndentTreeOutput = oldIndentTreeOutput;
+
+ return 0;
+}
+
+
void
virXPathContextNodeRestore(virXPathContextNodeSave *save)
{
virBuffer *attrBuf,
virBuffer *childBuf);
+int
+virXMLFormatMetadata(virBuffer *buf,
+ xmlNodePtr metadata);
struct _virXPathContextNodeSave {
xmlXPathContextPtr ctxt;