void
+cr_latin1_to_utf8(const unsigned char *in, unsigned char *out)
+{
+ // http://stackoverflow.com/questions/4059775/convert-iso-8859-1-strings-to-utf-8-in-c-c/4059934#4059934
+ // This function converts latin1 to utf8 in effective and thread-safe way.
+ while (*in) {
+ if (*in<128) {
+ *out++=*in++;
+ } else if (*in<192) {
+ // Found latin1 (iso-8859-1) control code.
+ // The string is probably misencoded cp-1252 and not a real latin1.
+ // Just skip this character.
+ in++;
+ continue;
+ } else {
+ *out++=0xc2+(*in>0xbf);
+ *out++=(*in++&0x3f)+0x80;
+ }
+ }
+ *out = '\0';
+}
+
+xmlNodePtr
+cr_xmlNewTextChild(xmlNodePtr parent,
+ xmlNsPtr ns,
+ const xmlChar *name,
+ const xmlChar *orig_content)
+{
+ int free_content = 0;
+ xmlChar *content;
+ xmlNodePtr child;
+
+ if (!orig_content) {
+ content = "";
+ } else if (xmlCheckUTF8(orig_content)) {
+ content = (xmlChar *) orig_content;
+ } else {
+ size_t len = strlen(orig_content);
+ content = malloc(sizeof(xmlChar)*len*2 + 1);
+ cr_latin1_to_utf8(orig_content, content);
+ free_content = 1;
+ }
+
+ child = xmlNewTextChild(parent, ns, name, content);
+
+ if (free_content)
+ free(content);
+
+ return child;
+}
+
+xmlAttrPtr
+cr_xmlNewProp(xmlNodePtr node, const xmlChar *name, const xmlChar *orig_content)
+{
+ int free_content = 0;
+ xmlChar *content;
+ xmlAttrPtr attr;
+
+ if (!orig_content) {
+ content = "";
+ } else if (xmlCheckUTF8(orig_content)) {
+ content = (xmlChar *) orig_content;
+ } else {
+ size_t len = strlen(orig_content);
+ content = malloc(sizeof(xmlChar)*len*2 + 1);
+ cr_latin1_to_utf8(orig_content, content);
+ free_content = 1;
+ }
+
+ attr = xmlNewProp(node, name, content);
+
+ if (free_content)
+ free(content);
+
+ return attr;
+}
+
+void
cr_xml_dump_files(xmlNodePtr node, cr_Package *package, int primary)
{
if (!node || !package->files) {
// ************************************
xmlNodePtr file_node;
- file_node = xmlNewTextChild(node,
- NULL,
- BAD_CAST "file",
- BAD_CAST fullname);
+ file_node = cr_xmlNewTextChild(node,
+ NULL,
+ BAD_CAST "file",
+ BAD_CAST fullname);
g_free(fullname);
// Write type (skip type if type value is empty of "file")
if (entry->type && entry->type[0] != '\0' && strcmp(entry->type, "file")) {
- xmlNewProp(file_node, BAD_CAST "type", BAD_CAST entry->type);
+ cr_xmlNewProp(file_node, BAD_CAST "type", BAD_CAST entry->type);
}
}
}
************************************/
// Add pkgid attribute
- xmlNewProp(root, BAD_CAST "pkgid",
- BAD_CAST ((package->pkgId) ? package->pkgId : ""));
+ cr_xmlNewProp(root, BAD_CAST "pkgid", BAD_CAST package->pkgId);
// Add name attribute
- xmlNewProp(root, BAD_CAST "name",
- BAD_CAST ((package->name) ? package->name : ""));
+ cr_xmlNewProp(root, BAD_CAST "name", BAD_CAST package->name);
// Add arch attribute
- xmlNewProp(root, BAD_CAST "arch",
- BAD_CAST ((package->arch) ? package->arch : ""));
+ cr_xmlNewProp(root, BAD_CAST "arch", BAD_CAST package->arch);
/***********************************
version = xmlNewChild(root, NULL, BAD_CAST "version", NULL);
// Write version attribute epoch
- xmlNewProp(version, BAD_CAST "epoch",
- BAD_CAST ((package->epoch) ? package->epoch : ""));
+ cr_xmlNewProp(version, BAD_CAST "epoch", BAD_CAST package->epoch);
// Write version attribute ver
- xmlNewProp(version, BAD_CAST "ver",
- BAD_CAST ((package->version) ? package->version : ""));
+ cr_xmlNewProp(version, BAD_CAST "ver", BAD_CAST package->version);
// Write version attribute rel
- xmlNewProp(version, BAD_CAST "rel",
- BAD_CAST ((package->release) ? package->release : ""));
+ cr_xmlNewProp(version, BAD_CAST "rel", BAD_CAST package->release);
// Files dump
#include <string.h>
#include <libxml/encoding.h>
#include <libxml/xmlwriter.h>
+#include <libxml/xmlsave.h>
#include "logging.h"
#include "package.h"
#include "xml_dump.h"
+#include "xml_dump_internal.h"
#define FORMAT_XML 1
#define FORMAT_LEVEL 0
xmlNodePtr changelog;
// Add changelog element
- changelog = xmlNewTextChild(root,
- NULL,
- BAD_CAST "changelog",
- BAD_CAST ((entry->changelog) ? entry->changelog : ""));
+ changelog = cr_xmlNewTextChild(root,
+ NULL,
+ BAD_CAST "changelog",
+ BAD_CAST entry->changelog);
// Write param author
- xmlNewProp(changelog,
- BAD_CAST "author",
- BAD_CAST ((entry->author) ? entry->author : ""));
+ cr_xmlNewProp(changelog, BAD_CAST "author", BAD_CAST entry->author);
// Write param date
char date_str[DATE_MAX_LEN];
************************************/
// Add pkgid attribute
- xmlNewProp(root, BAD_CAST "pkgid",
- BAD_CAST ((package->pkgId) ? package->pkgId : ""));
+ cr_xmlNewProp(root, BAD_CAST "pkgid", BAD_CAST package->pkgId);
// Add name attribute
- xmlNewProp(root, BAD_CAST "name",
- BAD_CAST ((package->name) ? package->name : ""));
+ cr_xmlNewProp(root, BAD_CAST "name", BAD_CAST package->name);
// Add arch attribute
- xmlNewProp(root, BAD_CAST "arch",
- BAD_CAST ((package->arch) ? package->arch : ""));
+ cr_xmlNewProp(root, BAD_CAST "arch", BAD_CAST package->arch);
/***********************************
version = xmlNewChild(root, NULL, BAD_CAST "version", NULL);
// Write version attribute epoch
- xmlNewProp(version, BAD_CAST "epoch",
- BAD_CAST ((package->epoch) ? package->epoch : ""));
+ xmlNewProp(version, BAD_CAST "epoch", BAD_CAST package->epoch);
// Write version attribute ver
- xmlNewProp(version, BAD_CAST "ver",
- BAD_CAST ((package->version) ? package->version : ""));
+ xmlNewProp(version, BAD_CAST "ver", BAD_CAST package->version);
// Write version attribute rel
- xmlNewProp(version, BAD_CAST "rel",
- BAD_CAST ((package->release) ? package->release : ""));
+ xmlNewProp(version, BAD_CAST "rel", BAD_CAST package->release);
// Changelog dump
return NULL;
}
// Seems to be little bit faster than xmlDocDumpFormatMemory
+// xmlSaveCtxtPtr savebuf = xmlSaveToBuffer(buf, NULL, XML_SAVE_FORMAT|XML_SAVE_NO_DECL);
+// xmlSaveTree(savebuf, root);
xmlNodeDump(buf, NULL, root, FORMAT_LEVEL, FORMAT_XML);
assert(buf->content);
result = g_strndup((char *) buf->content, (buf->use+1));
/***********************************
- Element: entry
+ Element: entry
************************************/
xmlNodePtr entry_node;
entry_node = xmlNewChild(pcor_node, NULL, BAD_CAST "rpm:entry", NULL);
- xmlNewProp(entry_node, BAD_CAST "name", BAD_CAST entry->name);
+ cr_xmlNewProp(entry_node, BAD_CAST "name", BAD_CAST entry->name);
if (entry->flags && entry->flags[0] != '\0') {
- xmlNewProp(entry_node, BAD_CAST "flags", BAD_CAST entry->flags);
+ cr_xmlNewProp(entry_node, BAD_CAST "flags", BAD_CAST entry->flags);
if (entry->epoch && entry->epoch[0] != '\0') {
- xmlNewProp(entry_node, BAD_CAST "epoch", BAD_CAST entry->epoch);
+ cr_xmlNewProp(entry_node, BAD_CAST "epoch", BAD_CAST entry->epoch);
}
if (entry->version && entry->version[0] != '\0') {
- xmlNewProp(entry_node, BAD_CAST "ver", BAD_CAST entry->version);
+ cr_xmlNewProp(entry_node, BAD_CAST "ver", BAD_CAST entry->version);
}
if (entry->release && entry->release[0] != '\0') {
- xmlNewProp(entry_node, BAD_CAST "rel", BAD_CAST entry->release);
+ cr_xmlNewProp(entry_node, BAD_CAST "rel", BAD_CAST entry->release);
}
}
Element: name
************************************/
- xmlNewTextChild(root, NULL, BAD_CAST "name",
- BAD_CAST ((package->name) ? package->name : ""));
+ cr_xmlNewTextChild(root, NULL, BAD_CAST "name", BAD_CAST package->name);
/***********************************
Element: arch
************************************/
- xmlNewTextChild(root, NULL, BAD_CAST "arch",
- BAD_CAST ((package->arch) ? package->arch : ""));
+ cr_xmlNewTextChild(root, NULL, BAD_CAST "arch", BAD_CAST package->arch);
/***********************************
version = xmlNewChild(root, NULL, BAD_CAST "version", NULL);
// Write version attribute epoch
- xmlNewProp(version, BAD_CAST "epoch",
- BAD_CAST ((package->epoch) ? package->epoch : ""));
+ cr_xmlNewProp(version, BAD_CAST "epoch", BAD_CAST package->epoch);
// Write version attribute ver
- xmlNewProp(version, BAD_CAST "ver",
- BAD_CAST ((package->version) ? package->version : ""));
+ cr_xmlNewProp(version, BAD_CAST "ver", BAD_CAST package->version);
// Write version attribute rel
- xmlNewProp(version, BAD_CAST "rel",
- BAD_CAST ((package->release) ? package->release : ""));
+ cr_xmlNewProp(version, BAD_CAST "rel", BAD_CAST package->release);
/***********************************
xmlNodePtr checksum;
- checksum = xmlNewTextChild(root, NULL, BAD_CAST "checksum",
- BAD_CAST ((package->pkgId) ? package->pkgId : ""));
+ checksum = cr_xmlNewTextChild(root,
+ NULL,
+ BAD_CAST "checksum",
+ BAD_CAST package->pkgId);
// Write checksum attribute checksum_type
- xmlNewProp(checksum, BAD_CAST "type",
- BAD_CAST ((package->checksum_type) ? package->checksum_type : ""));
+ cr_xmlNewProp(checksum, BAD_CAST "type", BAD_CAST package->checksum_type);
// Write checksum attribute pkgid
xmlNewProp(checksum, BAD_CAST "pkgid", BAD_CAST "YES");
Element: summary
************************************/
- xmlNewTextChild(root, NULL, BAD_CAST "summary",
- BAD_CAST ((package->summary) ? package->summary : ""));
+ cr_xmlNewTextChild(root, NULL, BAD_CAST "summary",
+ BAD_CAST package->summary);
/***********************************
Element: description
************************************/
- xmlNewTextChild(root, NULL, BAD_CAST "description",
- BAD_CAST ((package->description) ? package->description : ""));
+ cr_xmlNewTextChild(root, NULL, BAD_CAST "description",
+ BAD_CAST package->description);
/***********************************
Element: packager
************************************/
- xmlNewTextChild(root, NULL, BAD_CAST "packager",
- BAD_CAST ((package->rpm_packager) ? package->rpm_packager : ""));
+ cr_xmlNewTextChild(root, NULL, BAD_CAST "packager",
+ BAD_CAST package->rpm_packager);
/***********************************
Element: url
************************************/
- xmlNewTextChild(root, NULL, BAD_CAST "url",
- BAD_CAST ((package->url) ? package->url : ""));
+ cr_xmlNewTextChild(root, NULL, BAD_CAST "url", BAD_CAST package->url);
/***********************************
// Write location attribute base
if (package->location_base && package->location_base[0] != '\0') {
- xmlNewProp(location,
- BAD_CAST "xml:base",
- BAD_CAST package->location_base);
+ cr_xmlNewProp(location,
+ BAD_CAST "xml:base",
+ BAD_CAST package->location_base);
}
// Write location attribute href
- xmlNewProp(location, BAD_CAST "href",
- BAD_CAST ((package->location_href) ? package->location_href : ""));
+ cr_xmlNewProp(location, BAD_CAST "href", BAD_CAST package->location_href);
/***********************************
Element: license
************************************/
- xmlNewTextChild(format, NULL, BAD_CAST "rpm:license",
- BAD_CAST ((package->rpm_license) ? package->rpm_license : ""));
+ cr_xmlNewTextChild(format, NULL, BAD_CAST "rpm:license",
+ BAD_CAST package->rpm_license);
/***********************************
Element: vendor
************************************/
- xmlNewTextChild(format, NULL, BAD_CAST "rpm:vendor",
- BAD_CAST ((package->rpm_vendor) ? package->rpm_vendor : ""));
+ cr_xmlNewTextChild(format, NULL, BAD_CAST "rpm:vendor",
+ BAD_CAST package->rpm_vendor);
/***********************************
Element: group
************************************/
- xmlNewTextChild(format, NULL, BAD_CAST "rpm:group",
- BAD_CAST ((package->rpm_group) ? package->rpm_group : ""));
+ cr_xmlNewTextChild(format, NULL, BAD_CAST "rpm:group",
+ BAD_CAST package->rpm_group);
/***********************************
Element: buildhost
************************************/
- xmlNewTextChild(format, NULL, BAD_CAST "rpm:buildhost",
- BAD_CAST ((package->rpm_buildhost) ? package->rpm_buildhost : ""));
+ cr_xmlNewTextChild(format, NULL, BAD_CAST "rpm:buildhost",
+ BAD_CAST package->rpm_buildhost);
/***********************************
Element: sourcerpm
************************************/
- xmlNewTextChild(format, NULL, BAD_CAST "rpm:sourcerpm",
- BAD_CAST ((package->rpm_sourcerpm) ? package->rpm_sourcerpm : ""));
+ cr_xmlNewTextChild(format, NULL, BAD_CAST "rpm:sourcerpm",
+ BAD_CAST package->rpm_sourcerpm);
/***********************************