# HG changeset patch # User Nathan Walp # Date 1075597570 0 # Node ID 22b3974dc1af3c263788572e0610fff6240f3490 # Parent e0a70b7638725df41bbcb3fde24ef86746637f7a [gaim-migrate @ 8916] a bunch of tweaks to jabber roster handling, and a fix for a segfault when you delete the priority buddy in a contact committer: Tailor Script diff -r e0a70b763872 -r 22b3974dc1af src/blist.c --- a/src/blist.c Sat Jan 31 22:30:29 2004 +0000 +++ b/src/blist.c Sun Feb 01 01:06:10 2004 +0000 @@ -1090,6 +1090,10 @@ cnode->child = node->next; } + if(((GaimContact*)cnode)->priority == buddy) { + gaim_contact_compute_priority_buddy((GaimContact*)cnode); + ops->update(gaimbuddylist, cnode); + } hb.name = g_strdup(gaim_normalize(buddy->account, buddy->name)); hb.account = buddy->account; diff -r e0a70b763872 -r 22b3974dc1af src/protocols/jabber/buddy.h --- a/src/protocols/jabber/buddy.h Sat Jan 31 22:30:29 2004 +0000 +++ b/src/protocols/jabber/buddy.h Sun Feb 01 01:06:10 2004 +0000 @@ -37,7 +37,8 @@ JABBER_SUB_PENDING = 1 << 1, JABBER_SUB_TO = 1 << 2, JABBER_SUB_FROM = 1 << 3, - JABBER_SUB_BOTH = (JABBER_SUB_TO | JABBER_SUB_FROM) + JABBER_SUB_BOTH = (JABBER_SUB_TO | JABBER_SUB_FROM), + JABBER_SUB_REMOVE = 1 << 4 } subscription; } JabberBuddy; diff -r e0a70b763872 -r 22b3974dc1af src/protocols/jabber/jabber.c --- a/src/protocols/jabber/jabber.c Sat Jan 31 22:30:29 2004 +0000 +++ b/src/protocols/jabber/jabber.c Sun Feb 01 01:06:10 2004 +0000 @@ -917,36 +917,60 @@ { JabberBuddy *jb = jabber_buddy_find(b->account->gc->proto_data, b->name, FALSE); - JabberBuddyResource *jbr = jabber_buddy_find_resource(jb, NULL); - char *ret = NULL; - - if(jbr) { - char *text = NULL; - if(jbr->status) { - char *stripped; - stripped = gaim_markup_strip_html(jbr->status); - text = g_markup_escape_text(stripped, -1); - g_free(stripped); - } + GString *ret = g_string_new(""); + char *r = NULL; - ret = g_strdup_printf("%s: %s%s%s", - _("Status"), - jabber_get_state_string(jbr->state), - text ? ": " : "", - text ? text : ""); - if(text) - g_free(text); - } else if(jb && !GAIM_BUDDY_IS_ONLINE(b) && jb->error_msg) { - ret = g_strdup_printf("%s: %s", - _("Error"), jb->error_msg); - } else if(jb && !GAIM_BUDDY_IS_ONLINE(b) && - (jb->subscription & JABBER_SUB_PENDING || - !(jb->subscription & JABBER_SUB_TO))) { - ret = g_strdup_printf("%s: %s", - _("Status"), _("Not Authorized")); + if(jb) { + JabberBuddyResource *jbr = jabber_buddy_find_resource(jb, NULL); + const char *sub; + if(jb->subscription & JABBER_SUB_FROM) { + if(jb->subscription & JABBER_SUB_TO) + sub = _("Both"); + else if(jb->subscription & JABBER_SUB_PENDING) + sub = _("From (To pending)"); + else + sub = _("From"); + } else { + if(jb->subscription & JABBER_SUB_TO) + sub = _("To"); + else if(jb->subscription & JABBER_SUB_PENDING) + sub = _("None (To pending)"); + else + sub = _("None"); + } + g_string_append_printf(ret, "%s: %s\n", _("Subscription"), sub); + + if(jbr) { + char *text = NULL; + if(jbr->status) { + char *stripped; + stripped = gaim_markup_strip_html(jbr->status); + text = g_markup_escape_text(stripped, -1); + g_free(stripped); + } + + g_string_append_printf(ret, "%s: %s%s%s\n", + _("Status"), + jabber_get_state_string(jbr->state), + text ? ": " : "", + text ? text : ""); + if(text) + g_free(text); + } else if(!GAIM_BUDDY_IS_ONLINE(b) && jb->error_msg) { + g_string_append_printf(ret, "%s: %s\n", + _("Error"), jb->error_msg); + } } - return ret; + if(ret->len > 0) { + g_string_truncate(ret, ret->len-1); + r = ret->str; + g_string_free(ret, FALSE); + } else { + g_string_free(ret, TRUE); + } + + return r; } static GList *jabber_away_states(GaimConnection *gc) diff -r e0a70b763872 -r 22b3974dc1af src/protocols/jabber/roster.c --- a/src/protocols/jabber/roster.c Sat Jan 31 22:30:29 2004 +0000 +++ b/src/protocols/jabber/roster.c Sun Feb 01 01:06:10 2004 +0000 @@ -167,6 +167,8 @@ jb->subscription = JABBER_SUB_FROM; else if(!strcmp(subscription, "both")) jb->subscription = JABBER_SUB_BOTH; + else if(!strcmp(subscription, "remove")) + jb->subscription = JABBER_SUB_REMOVE; else jb->subscription = JABBER_SUB_NONE; @@ -175,11 +177,10 @@ else jb->subscription &= ~JABBER_SUB_PENDING; - if(jb->subscription == JABBER_SUB_NONE) { + if(jb->subscription == JABBER_SUB_REMOVE) { remove_gaim_buddies(js, jid); } else { GSList *groups = NULL; - for(group = xmlnode_get_child(item, "group"); group; group = xmlnode_get_next_twin(group)) { char *group_name; @@ -188,14 +189,6 @@ groups = g_slist_append(groups, group_name); } add_gaim_buddies_in_groups(js, jid, name, groups); - - if(jb->subscription == JABBER_SUB_BOTH) { - char *my_bare_jid = g_strdup_printf("%s@%s", js->user->node, js->user->domain); - if(!strcmp(jid, my_bare_jid)) { - jabber_presence_fake_to_self(js, js->gc->away_state, js->gc->away); - } - g_free(my_bare_jid); - } } } @@ -257,6 +250,7 @@ GSList *groups = NULL; JabberBuddy *jb; JabberBuddyResource *jbr; + char *my_bare_jid; if(!js->roster_parsed) return; @@ -272,11 +266,15 @@ jabber_roster_update(js, who, groups); - if(!jb || !(jb->subscription & JABBER_SUB_TO)) + my_bare_jid = g_strdup_printf("%s@%s", js->user->node, js->user->domain); + if(!strcmp(who, my_bare_jid)) + jabber_presence_fake_to_self(js, js->gc->away_state, js->gc->away); + else if(!jb || !(jb->subscription & JABBER_SUB_TO)) jabber_presence_subscription_set(js, who, "subscribe"); else if((jbr =jabber_buddy_find_resource(jb, NULL))) serv_got_update(gc, who, 1, 0, 0, 0, jbr->state); + g_free(my_bare_jid); g_free(who); }