#undef MODULE
#define MODULE "xml_dump_other: "
+#define FORMAT_XML 1
-#define PROVIDES 0
-#define CONFLICTS 1
-#define OBSOLETES 2
-#define REQUIRES 3
+#define DATE_MAX_LEN 32
-void dump_changelog(xmlTextWriterPtr writer, Package *package)
+void dump_changelog(xmlNodePtr root, Package *package)
{
- int rc;
-
if (!package->changelogs) {
return;
}
// Element: Changelog
// ************************************
- // Open changelog element
- rc = xmlTextWriterStartElement(writer, BAD_CAST "changelog");
- if (rc < 0) {
- g_critical(MODULE"dump_changelog: Error at xmlTextWriterWriteElement");
- return;
- }
+ xmlNodePtr changelog;
+
+ // Add changelog element
+ changelog = xmlNewTextChild(root, NULL, BAD_CAST "changelog", BAD_CAST ((entry->changelog) ? entry->changelog : ""));
// Write param author
- rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "author", "%s", (entry->author) ? entry->author : "");
- if (rc < 0) {
- g_critical(MODULE"dump_changelog: Error at xmlTextWriterWriteAttribute");
- return;
- }
+ xmlNewProp(changelog, BAD_CAST "author", BAD_CAST ((entry->author) ? entry->author : ""));
// Write param date
- rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "date", "%lld", (long long int) entry->date);
- if (rc < 0) {
- g_critical(MODULE"dump_changelog: Error at xmlTextWriterWriteFormatAttribute");
- return;
- }
-
- // Write changelog text
- rc = xmlTextWriterWriteFormatString(writer, "%s", (entry->changelog) ? entry->changelog : "");
- if (rc < 0) {
- g_critical(MODULE"dump_changelog: Error at xmlTextWriterWriteFormatString");
- return;
- }
-
- // Close changelog element
- rc = xmlTextWriterEndElement(writer);
- if (rc < 0) {
- g_critical(MODULE"dump_changelog: Error at xmlTextWriterEndElement");
- return;
- }
+ char date_str[DATE_MAX_LEN];
+ g_snprintf(date_str, DATE_MAX_LEN, "%lld", (long long int) entry->date);
+ xmlNewProp(changelog, BAD_CAST "date", BAD_CAST date_str);
}
}
-void dump_other_items(xmlTextWriterPtr writer, Package *package)
+void dump_other_items(xmlNodePtr root, Package *package)
{
- int rc;
-
- rc = xmlTextWriterStartDocument(writer, NULL, NULL, NULL);
- if (rc < 0) {
- g_critical(MODULE"dump_other_items: Error at xmlTextWriterStartDocument");
- return;
- }
-
-
/***********************************
- Element: package
+ Element: package
************************************/
- // Open package element
- rc = xmlTextWriterStartElement(writer, BAD_CAST "package");
- if (rc < 0) {
- g_critical(MODULE"dump_other_items: Error at xmlTextWriterStartElement");
- return;
- }
-
// Add pkgid attribute
- rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "pkgid", "%s", (package->pkgId) ? package->pkgId : "");
- if (rc < 0) {
- g_critical(MODULE"dump_other_items: Error at xmlTextWriterWriteFormatAttribute");
- return;
- }
+ xmlNewProp(root, BAD_CAST "pkgid", BAD_CAST ((package->pkgId) ? package->pkgId : ""));
// Add name attribute
- rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "name", "%s", (package->name) ? package->name : "");
- if (rc < 0) {
- g_critical(MODULE"dump_other_items: Error at xmlTextWriterWriteFormatAttribute");
- return;
- }
+ xmlNewProp(root, BAD_CAST "name", BAD_CAST ((package->name) ? package->name : ""));
// Add arch attribute
- rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "arch", "%s", (package->arch) ? package->arch : "");
- if (rc < 0) {
- g_critical(MODULE"dump_other_items: Error at xmlTextWriterWriteFormatAttribute");
- return;
- }
+ xmlNewProp(root, BAD_CAST "arch", BAD_CAST ((package->arch) ? package->arch : ""));
/***********************************
- Element: version
+ Element: version
************************************/
- // Open version element
- rc = xmlTextWriterStartElement(writer, BAD_CAST "version");
- if (rc < 0) {
- g_critical(MODULE"dump_other_items: Error at xmlTextWriterStartElement");
- return;
- }
+ xmlNodePtr version;
+
+ // Add version element
+ version = xmlNewChild(root, NULL, BAD_CAST "version", NULL);
// Write version attribute epoch
- rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "epoch", "%s", (package->epoch) ? package->epoch : "0");
- if (rc < 0) {
- g_critical(MODULE"dump_other_items: Error at xmlTextWriterWrite(Format)Attribute");
- return;
- }
+ xmlNewProp(version, BAD_CAST "epoch", BAD_CAST ((package->epoch) ? package->epoch : ""));
// Write version attribute ver
- rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "ver", "%s", (package->version) ? package->version : "");
- if (rc < 0) {
- g_critical(MODULE"dump_other_items: Error at xmlTextWriterWriteFormatAttribute");
- return;
- }
+ xmlNewProp(version, BAD_CAST "ver", BAD_CAST ((package->version) ? package->version : ""));
// Write version attribute rel
- rc = xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "rel", "%s", (package->release) ? package->release : "");
- if (rc < 0) {
- g_critical(MODULE"dump_other_items: Error at xmlTextWriterWriteFormatAttribute");
- return;
- }
+ xmlNewProp(version, BAD_CAST "rel", BAD_CAST ((package->release) ? package->release : ""));
- // Close version element
- rc = xmlTextWriterEndElement(writer);
- if (rc < 0) {
- g_critical(MODULE"dump_other_items: Error at xmlTextWriterEndElement");
- return;
- }
+ // Changelog dump
- // Files dump
+ dump_changelog(root, package);
+}
- dump_changelog(writer, package);
+char *xml_dump_other(Package *package)
+{
+ xmlNodePtr root = NULL;
+ root = xmlNewNode(NULL, BAD_CAST "package");
- // Close package element
- rc = xmlTextWriterEndElement(writer);
- if (rc < 0) {
- g_critical(MODULE"dump_other_items: Error at xmlTextWriterEndElement");
- return;
- }
- // Close document (and every still opened tags)
- rc = xmlTextWriterEndDocument(writer);
- if (rc < 0) {
- g_critical(MODULE"dump_other_items: Error at xmlTextWriterEndDocument");
- return;
- }
-}
+ // Dump IT!
+ dump_other_items(root, package);
-char *xml_dump_other(Package *package)
-{
+ char *result;
xmlBufferPtr buf = xmlBufferCreate();
if (buf == NULL) {
g_critical(MODULE"xml_dump_other: Error creating the xml buffer");
return NULL;
}
-
- xmlTextWriterPtr writer = xmlNewTextWriterMemory(buf, 0);
- if (writer == NULL) {
- g_critical(MODULE"xml_dump_other: Error creating the xml writer");
- return NULL;
- }
-
-
- // Dump IT!
-
- dump_other_items(writer, package);
-
-
- xmlFreeTextWriter(writer);
-
-
- // Get XML from xmlBuffer without <?xml ...?> header
-
+ // Seems to be little bit faster than xmlDocDumpFormatMemory
+ xmlNodeDump(buf, NULL, root, 1, FORMAT_XML);
assert(buf->content);
+ result = g_strdup((char *) buf->content);
+ xmlBufferFree(buf);
- char *pkg_str = strstr((const char*) buf->content, "<package");
- if (!pkg_str) {
- pkg_str = (char*) buf->content;
- }
- char *result = g_strdup(pkg_str);
+ // Cleanup
- xmlBufferFree(buf);
+ xmlFreeNode(root);
return result;
}