diff options
Diffstat (limited to 'src/rexmpp_roster.c')
-rw-r--r-- | src/rexmpp_roster.c | 76 |
1 files changed, 36 insertions, 40 deletions
diff --git a/src/rexmpp_roster.c b/src/rexmpp_roster.c index 63a52b9..db09ff0 100644 --- a/src/rexmpp_roster.c +++ b/src/rexmpp_roster.c @@ -7,24 +7,25 @@ */ #include "rexmpp.h" +#include "rexmpp_xml.h" #include <syslog.h> #include <string.h> #include <libxml/tree.h> #include <libxml/xmlsave.h> -xmlNodePtr rexmpp_roster_find_item (rexmpp_t *s, - const char *jid, - xmlNodePtr *prev_item) +rexmpp_xml_t * +rexmpp_roster_find_item (rexmpp_t *s, + const char *jid, + rexmpp_xml_t **prev_item) { - xmlNodePtr prev = NULL, cur = s->roster_items; + rexmpp_xml_t *prev = NULL, *cur = s->roster_items; while (cur != NULL) { - char *cur_jid = xmlGetProp(cur, "jid"); + const char *cur_jid = rexmpp_xml_find_attr_val(cur, "jid"); if (cur_jid == NULL) { rexmpp_log(s, LOG_ALERT, "No jid found in a roster item."); return NULL; } int match = (strcmp(cur_jid, jid) == 0); - free(cur_jid); if (match) { if (prev_item != NULL) { *prev_item = prev; @@ -37,17 +38,17 @@ xmlNodePtr rexmpp_roster_find_item (rexmpp_t *s, return NULL; } -rexmpp_err_t rexmpp_modify_roster (rexmpp_t *s, xmlNodePtr item) { +rexmpp_err_t rexmpp_modify_roster (rexmpp_t *s, rexmpp_xml_t *item) { rexmpp_err_t ret = REXMPP_SUCCESS; if (! rexmpp_xml_match(item, "jabber:iq:roster", "item")) { rexmpp_log(s, LOG_ERR, "No roster item."); return REXMPP_E_PARAM; } - char *subscription = xmlGetProp(item, "subscription"); - char *jid = xmlGetProp(item, "jid"); + const char *subscription = rexmpp_xml_find_attr_val(item, "subscription"); + const char *jid = rexmpp_xml_find_attr_val(item, "jid"); if (subscription != NULL && strcmp(subscription, "remove") == 0) { /* Delete the item. */ - xmlNodePtr prev, cur; + rexmpp_xml_t *prev, *cur; cur = rexmpp_roster_find_item(s, jid, &prev); if (cur != NULL) { if (prev != NULL) { @@ -55,13 +56,13 @@ rexmpp_err_t rexmpp_modify_roster (rexmpp_t *s, xmlNodePtr item) { } else { s->roster_items = cur->next; } - xmlFreeNode(cur); + rexmpp_xml_free(cur); } else { ret = REXMPP_E_ROSTER_ITEM_NOT_FOUND; } } else { /* Add or modify the item. */ - xmlNodePtr cur, prev; + rexmpp_xml_t *cur, *prev; cur = rexmpp_roster_find_item(s, jid, &prev); /* Remove the item if it was in the roster before. */ if (cur != NULL) { @@ -70,37 +71,33 @@ rexmpp_err_t rexmpp_modify_roster (rexmpp_t *s, xmlNodePtr item) { } else { s->roster_items = cur->next; } - xmlFreeNode(cur); + rexmpp_xml_free(cur); } /* Add the new item. */ - xmlNodePtr new_item = xmlCopyNode(item, 1); + rexmpp_xml_t *new_item = rexmpp_xml_clone(item); new_item->next = s->roster_items; s->roster_items = new_item; } - free(jid); - if (subscription != NULL) { - free(subscription); - } if (s->roster_modify_cb != NULL) { s->roster_modify_cb(s, item); } return ret; } -void rexmpp_roster_set (rexmpp_t *s, xmlNodePtr query) { +void rexmpp_roster_set (rexmpp_t *s, rexmpp_xml_t *query) { if (s->roster_items != NULL) { - xmlFreeNodeList(s->roster_items); + rexmpp_xml_free_list(s->roster_items); } if (s->roster_ver != NULL) { free(s->roster_ver); } - s->roster_ver = xmlGetProp(query, "ver"); - s->roster_items = xmlCopyNodeList(xmlFirstElementChild(query)); + s->roster_ver = strdup(rexmpp_xml_find_attr_val(query, "ver")); + s->roster_items = rexmpp_xml_clone_list(query->alt.elem.children); if (s->roster_modify_cb != NULL) { - xmlNodePtr item; - for (item = xmlFirstElementChild(query); + rexmpp_xml_t *item; + for (item = query->alt.elem.children; item != NULL; - item = xmlNextElementSibling(item)) + item = item->next) { s->roster_modify_cb(s, item); } @@ -112,10 +109,11 @@ void rexmpp_roster_cache_read (rexmpp_t *s) { rexmpp_log(s, LOG_WARNING, "No roster cache file path is set."); return; } - xmlDocPtr doc = xmlReadFile(s->roster_cache_file, "utf-8", XML_PARSE_NONET); - xmlNodePtr query = xmlDocGetRootElement(doc); - rexmpp_roster_set(s, query); - xmlFreeDoc(doc); + rexmpp_xml_t *query = rexmpp_xml_read_file(s->roster_cache_file); + if (query != NULL) { + rexmpp_roster_set(s, query); + rexmpp_xml_free(query); + } } void rexmpp_roster_cache_write (rexmpp_t *s) { @@ -123,24 +121,22 @@ void rexmpp_roster_cache_write (rexmpp_t *s) { rexmpp_log(s, LOG_WARNING, "No roster cache file path is set."); return; } - xmlDocPtr doc = xmlNewDoc("1.0"); - xmlNodePtr query = xmlNewDocNode(doc, NULL, "query", NULL); - xmlDocSetRootElement(doc, query); - xmlNewNs(query, "jabber:iq:roster", NULL); + + rexmpp_xml_t *query = rexmpp_xml_new_elem("query", "jabber:iq:roster"); if (s->roster_ver != NULL) { - xmlNewProp(query, "ver", s->roster_ver); + rexmpp_xml_add_attr(query, "ver", s->roster_ver); } if (s->roster_items != NULL) { - xmlAddChild(query, xmlDocCopyNodeList(doc, s->roster_items)); + rexmpp_xml_add_child(query, rexmpp_xml_clone_list(s->roster_items)); } - xmlSaveFileEnc(s->roster_cache_file, doc, "utf-8"); - xmlFreeDoc(doc); + rexmpp_xml_write_file(s->roster_cache_file, query); + rexmpp_xml_free(query); } void rexmpp_iq_roster_get (rexmpp_t *s, void *ptr, - xmlNodePtr req, - xmlNodePtr response, + rexmpp_xml_t *req, + rexmpp_xml_t *response, int success) { (void)ptr; @@ -149,7 +145,7 @@ void rexmpp_iq_roster_get (rexmpp_t *s, rexmpp_log(s, LOG_ERR, "Roster loading failed."); return; } - xmlNodePtr query = xmlFirstElementChild(response); + rexmpp_xml_t *query = response->alt.elem.children; if (! rexmpp_xml_match(query, "jabber:iq:roster", "query")) { rexmpp_log(s, LOG_DEBUG, "No roster query in reply."); return; |