virxml: Introduce and use virXMLFormatMetadata()

So far, we have to places where we format <metadata/> into XMLs:
domain and network. Bot places share the same code. Move it into
a helper function and just call it from those places.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
Michal Privoznik 2021-05-25 11:21:02 +02:00
parent f772c1fd2a
commit c380ae220e
5 changed files with 51 additions and 42 deletions

View File

@ -27806,27 +27806,8 @@ virDomainDefFormatInternalSetRootName(virDomainDef *def,
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,

View File

@ -2486,27 +2486,8 @@ virNetworkDefFormatBuf(virBuffer *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;

View File

@ -3555,6 +3555,7 @@ virXMLCheckIllegalChars;
virXMLExtractNamespaceXML;
virXMLFormatElement;
virXMLFormatElementEmpty;
virXMLFormatMetadata;
virXMLNewNode;
virXMLNodeContentString;
virXMLNodeNameEqual;

View File

@ -1707,6 +1707,49 @@ virXMLFormatElement(virBuffer *buf,
}
/**
* 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)
{

View File

@ -333,6 +333,9 @@ virXMLFormatElementEmpty(virBuffer *buf,
virBuffer *attrBuf,
virBuffer *childBuf);
int
virXMLFormatMetadata(virBuffer *buf,
xmlNodePtr metadata);
struct _virXPathContextNodeSave {
xmlXPathContextPtr ctxt;