Mercurial > ~mikael > mcabber > hg
diff mcabber/src/jab_iq.c @ 603:9516db839e08
Store subscription data
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Thu, 15 Dec 2005 12:52:37 +0100 |
parents | 96831b222903 |
children | 2a4fefb98511 |
line wrap: on
line diff
--- a/mcabber/src/jab_iq.c Thu Dec 15 00:14:56 2005 +0100 +++ b/mcabber/src/jab_iq.c Thu Dec 15 12:52:37 2005 +0100 @@ -21,11 +21,13 @@ * USA */ +#include <glib.h> + #include "jabglue.h" #include "jab_priv.h" #include "roster.h" #include "utils.h" -#include "logprint.h" +#include "screen.h" int s_id; // XXX @@ -47,9 +49,11 @@ static void gotroster(xmlnode x) { xmlnode y; - const char *jid, *name, *group; + const char *jid, *name, *group, *sub; char *buddyname; char *cleanalias; + enum subscr esub; + int need_refresh = FALSE; for (y = xmlnode_get_tag(x, "item"); y; y = xmlnode_get_nextsibling(y)) { gchar *name_noutf8 = NULL; @@ -57,7 +61,7 @@ jid = xmlnode_get_attrib(y, "jid"); name = xmlnode_get_attrib(y, "name"); - //sub = xmlnode_get_attrib(y, "subscription"); // TODO Not used + sub = xmlnode_get_attrib(y, "subscription"); group = xmlnode_get_tag_data(y, "group"); @@ -66,6 +70,23 @@ buddyname = cleanalias = jidtodisp(jid); + esub = sub_none; + if (sub) { + if (!strcmp(sub, "to")) esub = sub_to; + else if (!strcmp(sub, "from")) esub = sub_from; + else if (!strcmp(sub, "both")) esub = sub_both; + else if (!strcmp(sub, "remove")) esub = sub_remove; + } + + if (esub == sub_remove) { + roster_del_user(cleanalias); + scr_LogPrint(LPRINT_LOGNORM, "Buddy <%s> has been removed " + "from the roster", cleanalias); + g_free(cleanalias); + need_refresh = TRUE; + continue; + } + if (name) { name_noutf8 = from_utf8(name); if (name_noutf8) @@ -82,15 +103,18 @@ group); } - roster_add_user(cleanalias, buddyname, group_noutf8, ROSTER_TYPE_USER); + roster_add_user(cleanalias, buddyname, group_noutf8, ROSTER_TYPE_USER, + esub); + if (name_noutf8) g_free(name_noutf8); if (group_noutf8) g_free(group_noutf8); g_free(cleanalias); } - // Post-login stuff - jb_setstatus(available, NULL, NULL); buddylist_build(); + update_roster = TRUE; + if (need_refresh) + scr_ShowBuddyWindow(); } static void gotagents(jconn conn, xmlnode x) @@ -120,7 +144,7 @@ if (atype == transport) { char *cleanjid = jidtodisp(alias); roster_add_user(cleanjid, NULL, JABBER_AGENT_GROUP, - ROSTER_TYPE_AGENT); + ROSTER_TYPE_AGENT, sub_none); g_free(cleanjid); } if (alias && name && desc) { @@ -193,6 +217,9 @@ if (!strcmp(ns, NS_ROSTER)) { gotroster(x); + + // Post-login stuff FIXME shouldn't be there + jb_setstatus(available, NULL, NULL); } else if (!strcmp(ns, NS_AGENTS)) { gotagents(conn, x); } else if (!strcmp(ns, NS_SEARCH) || !strcmp(ns, NS_REGISTER)) {