Mercurial > ~mikael > mcabber > hg
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;