From 131f5592347929c3d28a4a9406e242e2cfdd5db9 Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Wed, 19 Aug 2009 17:55:03 +0200 Subject: Write data to an XML file. File path for the XML file is read per channel from the 'xmlpath' option. --- export_xml.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 export_xml.c (limited to 'export_xml.c') diff --git a/export_xml.c b/export_xml.c new file mode 100644 index 0000000..f66381e --- /dev/null +++ b/export_xml.c @@ -0,0 +1,68 @@ +#include +#include + +#include "export_xml.h" + +#if !defined(LIBXML_TREE_ENABLED) +#error "libxml must be compiled with tree support" +#endif + + +int export_xml(struct channel_t *channel, struct user_t *users) { + /* Create document and set root node. */ + xmlDocPtr doc = xmlNewDoc("1.0"); + xmlNodePtr root_node = xmlNewNode(NULL, "channel"); + xmlDocSetRootElement(doc, root_node); + + /* Set the channel name. */ + xmlNewChild(root_node, NULL, "name", channel->name); + + /* Add lines. */ + xmlNodePtr lines_node = xmlNewChild(root_node, NULL, "lines", NULL); + for(int h = 0; h < 24; h++) { + xmlNodePtr hour_node = xmlNewChild(lines_node, NULL, "hour", NULL); + for(int q = 0; q < 4; q++) { + char s[0xf]; + sprintf(s, "%d", channel->hours[h*4 + q]); + xmlNewChild(hour_node, NULL, "quarter", s); + } + } + + /* Add users. */ + xmlNodePtr users_node = xmlNewChild(root_node, NULL, "users", NULL); + for(int u = 0; u < USERS_MAX; u++) { + struct user_t *user = &users[u]; + /* Iterate while we have a user (nick is non-NULL). */ + while(user && user->nick) { + char s[0xf]; + xmlNodePtr user_node = xmlNewChild(users_node, NULL, "user", NULL); + + xmlNewChild(user_node, NULL, "nick", user->nick); + sprintf(s, "%d", user->words); + xmlNewChild(user_node, NULL, "words", s); + + /* Add lines for this user. */ + xmlNodePtr lines_node = xmlNewChild(users_node, NULL, "lines", NULL); + for(int h = 0; h < 24; h++) { + xmlNodePtr hour_node = xmlNewChild(lines_node, NULL, "hour", NULL); + for(int q = 0; q < 4; q++) { + sprintf(s, "%d", user->lines[h*4 + q]); + xmlNewChild(hour_node, NULL, "quarter", s); + } + } + user = user->next; + } + } + + xmlSaveCtxtPtr save_context = xmlSaveToFilename(channel->xmlpath, "UTF-8", 0); + if(!save_context) { + xmlErrorPtr error = xmlGetLastError(); + fprintf(stderr, "Failed to save XML data: %s\n", (error ? error->message : "unknown error")); + xmlFreeDoc(doc); + return 0; + } + xmlSaveDoc(save_context, doc); + xmlSaveClose(save_context); + xmlFreeDoc(doc); + return 1; +} -- cgit v1.2.3