diff options
author | defanor <defanor@uberspace.net> | 2020-03-27 21:07:10 +0300 |
---|---|---|
committer | defanor <defanor@uberspace.net> | 2020-03-27 21:07:10 +0300 |
commit | 8c621b46145e07e3eb3515a58f44ae6cd62caf0d (patch) | |
tree | 212fc6c884fc395df03580ff7e52c2b4cde23d4d /src/rexmpp.c | |
parent | 0b7ee1e683b55610379d7d4ee8da8ddfd0b49ffe (diff) |
Move roster functions into a separate file
Diffstat (limited to 'src/rexmpp.c')
-rw-r--r-- | src/rexmpp.c | 135 |
1 files changed, 1 insertions, 134 deletions
diff --git a/src/rexmpp.c b/src/rexmpp.c index 51229b7..fe04481 100644 --- a/src/rexmpp.c +++ b/src/rexmpp.c @@ -23,7 +23,7 @@ #include "rexmpp.h" #include "rexmpp_tcp.h" #include "rexmpp_socks.h" - +#include "rexmpp_roster.h" void rexmpp_sax_start_elem_ns (rexmpp_t *s, const char *localname, @@ -1082,139 +1082,6 @@ void rexmpp_iq_discovery_info (rexmpp_t *s, } } -xmlNodePtr rexmpp_roster_find_item (rexmpp_t *s, - const char *jid, - xmlNodePtr *prev_item) -{ - xmlNodePtr prev = NULL, cur = s->roster_items; - while (cur != NULL) { - char *cur_jid = xmlGetProp(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; - } - return cur; - } - prev = cur; - cur = cur->next; - } - return NULL; -} - -rexmpp_err_t rexmpp_modify_roster (rexmpp_t *s, xmlNodePtr 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"); - if (subscription != NULL && strcmp(subscription, "remove") == 0) { - /* Delete the item. */ - xmlNodePtr prev, cur; - cur = rexmpp_roster_find_item(s, jid, &prev); - if (cur != NULL) { - if (prev != NULL) { - prev->next = cur->next; - } else { - s->roster_items = cur->next; - } - xmlFreeNode(cur); - } else { - ret = REXMPP_E_ROSTER_ITEM_NOT_FOUND; - } - } else { - /* Add or modify the item. */ - xmlNodePtr cur, prev; - cur = rexmpp_roster_find_item(s, jid, &prev); - /* Remove the item if it was in the roster before. */ - if (cur != NULL) { - if (prev != NULL) { - prev->next = cur->next; - } else { - s->roster_items = cur->next; - } - xmlFreeNode(cur); - } - /* Add the new item. */ - xmlNodePtr new_item = xmlCopyNode(item, 1); - new_item->next = s->roster_items; - s->roster_items = new_item; - } - free(jid); - if (subscription != NULL) { - free(subscription); - } - return ret; -} - -void rexmpp_roster_set (rexmpp_t *s, xmlNodePtr query) { - if (s->roster_items != NULL) { - xmlFreeNodeList(s->roster_items); - } - if (s->roster_ver != NULL) { - free(s->roster_ver); - } - s->roster_ver = xmlGetProp(query, "ver"); - s->roster_items = xmlCopyNodeList(xmlFirstElementChild(query)); -} - -void rexmpp_roster_cache_read (rexmpp_t *s) { - if (s->roster_cache_file == NULL) { - 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); -} - -void rexmpp_roster_cache_write (rexmpp_t *s) { - if (s->roster_cache_file == NULL) { - 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); - if (s->roster_ver != NULL) { - xmlNewProp(query, "ver", s->roster_ver); - } - if (s->roster_items != NULL) { - xmlAddChild(query, xmlDocCopyNodeList(doc, s->roster_items)); - } - xmlSaveFileEnc(s->roster_cache_file, doc, "utf-8"); - xmlFreeDoc(doc); -} - -void rexmpp_iq_roster_get (rexmpp_t *s, - xmlNodePtr req, - xmlNodePtr response, - int success) -{ - if (! success) { - rexmpp_log(s, LOG_ERR, "Roster loading failed."); - return; - } - xmlNodePtr query = xmlFirstElementChild(response); - if (! rexmpp_xml_match(query, "jabber:iq:roster", "query")) { - rexmpp_log(s, LOG_DEBUG, "No roster query in reply."); - return; - } - rexmpp_roster_set(s, query); - if (s->roster_cache_file != NULL) { - rexmpp_roster_cache_write(s); - } -} - void rexmpp_stream_is_ready(rexmpp_t *s) { s->stream_state = REXMPP_STREAM_READY; rexmpp_resend_stanzas(s); |