diff mcabber/libjabber/expat.c @ 417:c3ae9251c197

Sync libjabber with upstream Sync with jabberd-1.4.4.
author Mikael Berthe <mikael@lilotux.net>
date Thu, 01 Sep 2005 23:29:21 +0200
parents bf3d6e241714
children
line wrap: on
line diff
--- 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;