--- a/mcabber/libjabber/expat.c Thu Sep 01 21:18:19 2005 +0200
+++ b/mcabber/libjabber/expat.c Thu Sep 01 23:29:21 2005 +0200
@@ -19,6 +19,17 @@
#include <libxode.h>
+/**
+ * callback function used for start elements
+ *
+ * This function is used internally by expat.c as a callback function
+ * given to expat. It will create a new xmlnode and add it to the
+ * already created xmlnode tree.
+ *
+ * @param userdata pointer to the parent xmlnode instance (NULL if this function is called for the root note)
+ * @param name name of the starting element
+ * @param atts attributes that are contained in the start element
+ */
void expat_startElement(void* userdata, const char* name, const char** atts)
{
/* get the xmlnode pointed to by the userdata */
@@ -39,6 +50,16 @@
}
}
+/**
+ * callback function used for end elements
+ *
+ * This function is used internally by expat.c as a callback function
+ * given to expat. It will complete an xmlnode and update the userdata pointer
+ * to point to the node that is parent of the next starting element.
+ *
+ * @param userdata pointer to the current xmlnode
+ * @param name name of the ending element (ignored by this function)
+ */
void expat_endElement(void* userdata, const char* name)
{
xmlnode *x = userdata;
@@ -52,6 +73,15 @@
*x = current;
}
+/**
+ * callback function for CDATA nodes
+ *
+ * This function will insert CDATA in an xmlnode
+ *
+ * @param userdata pointer to the current xmlnode
+ * @param s pointer to the CDATA string (not zero terminated!)
+ * @param len length of the CDATA string
+ */
void expat_charData(void* userdata, const char* s, int len)
{
xmlnode *x = userdata;
@@ -60,7 +90,15 @@
xmlnode_insert_cdata(current, s, len);
}
-
+/**
+ * create an xmlnode instance (possibly including other xmlnode instances) by parsing a string
+ *
+ * This function will parse a string containing an XML document and create an xmlnode graph
+ *
+ * @param str the string containing the XML document (not necessarily zero terminated)
+ * @param len the length of the string (without the zero byte, if present)
+ * @return the graph of xmlnodes that represent the parsed document, NULL on failure
+ */
xmlnode xmlnode_str(char *str, int len)
{
XML_Parser p;
@@ -88,6 +126,14 @@
return node; /* return the xmlnode x points to */
}
+/**
+ * create an xmlnode instance (possibly including other xmlnode instances) by parsing a file
+ *
+ * This function will parse a file containing an XML document and create an xmlnode graph
+ *
+ * @param file the filename
+ * @return the graph of xmlnodes that represent the parsed document, NULL on failure
+ */
xmlnode xmlnode_file(char *file)
{
XML_Parser p;
@@ -128,27 +174,69 @@
return node; /* return the xmlnode x points to */
}
+/**
+ * write an xmlnode to a file (without a size limit)
+ *
+ * @param file the target file
+ * @param node the xmlnode that should be written
+ * @return 1 on success, -1 on failure
+ */
int xmlnode2file(char *file, xmlnode node)
{
- char *doc;
+ return xmlnode2file_limited(file, node, 0);
+}
+
+/**
+ * write an xmlnode to a file, limited by size
+ *
+ * @param file the target file
+ * @param node the xmlnode that should be written
+ * @param sizelimit the maximum length of the file to be written
+ * @return 1 on success, 0 if failed due to size limit, -1 on failure
+ */
+int xmlnode2file_limited(char *file, xmlnode node, size_t sizelimit)
+{
+ char *doc, *ftmp;
int fd, i;
+ size_t doclen;
if(file == NULL || node == NULL)
return -1;
- fd = open(file, O_CREAT | O_WRONLY | O_TRUNC, 0600);
+ ftmp = spools(xmlnode_pool(node),file,".t.m.p",xmlnode_pool(node));
+ fd = open(ftmp, O_CREAT | O_WRONLY | O_TRUNC, 0600);
if(fd < 0)
return -1;
doc = xmlnode2str(node);
- i = write(fd,doc,strlen(doc));
+ doclen = strlen(doc);
+
+ if (sizelimit > 0 && doclen > sizelimit)
+ {
+ close(fd);
+ return 0;
+ }
+
+ i = write(fd,doc,doclen);
if(i < 0)
return -1;
close(fd);
+
+ if(rename(ftmp,file) < 0)
+ {
+ unlink(ftmp);
+ return -1;
+ }
return 1;
}
+/**
+ * append attributes in the expat format to an existing xmlnode
+ *
+ * @param owner where to add the attributes
+ * @param atts the attributes in expat format (even indexes are the attribute names, odd indexes the values)
+ */
void xmlnode_put_expat_attribs(xmlnode owner, const char** atts)
{
int i = 0;