# HG changeset patch # User Mark Doliner # Date 1190594420 0 # Node ID 41dd71aa79d6dd2dd37df88d6da53e23756acd5d # Parent 77fda34d42899fbd2c152168dc6c33faddd748d6 Another patch from Collin from ComBOTS Product GmbH. Now, if you change the alias for one of your buddies while signed in at another location it should update the alias in this location, as well. Fixes #3205. diff -r 77fda34d4289 -r 41dd71aa79d6 libpurple/protocols/oscar/AUTHORS --- a/libpurple/protocols/oscar/AUTHORS Sun Sep 23 22:17:15 2007 +0000 +++ b/libpurple/protocols/oscar/AUTHORS Mon Sep 24 00:40:20 2007 +0000 @@ -1,3 +1,7 @@ + +N: ComBOTS Product GmbH (htfv) +T: 2007 +E: foss@combots.com N: Jonathan Clark T: 2005-2006 diff -r 77fda34d4289 -r 41dd71aa79d6 libpurple/protocols/oscar/family_feedbag.c --- a/libpurple/protocols/oscar/family_feedbag.c Sun Sep 23 22:17:15 2007 +0000 +++ b/libpurple/protocols/oscar/family_feedbag.c Mon Sep 24 00:40:20 2007 +0000 @@ -1424,7 +1424,7 @@ aim_tlvlist_free(data); if ((userfunc = aim_callhandler(od, snac->family, snac->subtype))) - ret = userfunc(od, conn, frame, type, name); + ret = userfunc(od, conn, frame, snac->subtype, type, name); g_free(name); } @@ -1434,8 +1434,6 @@ /* * Subtype 0x0009 - Incoming SSI mod. - * - * XXX - It would probably be good for the client to actually do something when it gets this. */ static int parsemod(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, ByteStream *bs) { @@ -1485,7 +1483,7 @@ } if ((userfunc = aim_callhandler(od, snac->family, snac->subtype))) - ret = userfunc(od, conn, frame); + ret = userfunc(od, conn, frame, snac->subtype, type, name); g_free(name); aim_tlvlist_free(data); diff -r 77fda34d4289 -r 41dd71aa79d6 libpurple/protocols/oscar/oscar.c --- a/libpurple/protocols/oscar/oscar.c Sun Sep 23 22:17:15 2007 +0000 +++ b/libpurple/protocols/oscar/oscar.c Mon Sep 24 00:40:20 2007 +0000 @@ -189,7 +189,7 @@ static int purple_ssi_parserights (OscarData *, FlapConnection *, FlapFrame *, ...); static int purple_ssi_parselist (OscarData *, FlapConnection *, FlapFrame *, ...); static int purple_ssi_parseack (OscarData *, FlapConnection *, FlapFrame *, ...); -static int purple_ssi_parseadd (OscarData *, FlapConnection *, FlapFrame *, ...); +static int purple_ssi_parseaddmod (OscarData *, FlapConnection *, FlapFrame *, ...); static int purple_ssi_authgiven (OscarData *, FlapConnection *, FlapFrame *, ...); static int purple_ssi_authrequest (OscarData *, FlapConnection *, FlapFrame *, ...); static int purple_ssi_authreply (OscarData *, FlapConnection *, FlapFrame *, ...); @@ -1220,7 +1220,7 @@ oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_RIGHTSINFO, purple_ssi_parserights, 0); oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_LIST, purple_ssi_parselist, 0); oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_SRVACK, purple_ssi_parseack, 0); - oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_ADD, purple_ssi_parseadd, 0); + oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_ADD, purple_ssi_parseaddmod, 0); oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_RECVAUTH, purple_ssi_authgiven, 0); oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_RECVAUTHREQ, purple_ssi_authrequest, 0); oscar_data_addhandler(od, SNAC_FAMILY_FEEDBAG, SNAC_SUBTYPE_FEEDBAG_RECVAUTHREP, purple_ssi_authreply, 0); @@ -4934,10 +4934,7 @@ b = purple_find_buddy_in_group(gc->account, curitem->name, g); if (b) { /* Get server stored alias */ - if (alias_utf8) { - g_free(b->alias); - b->alias = g_strdup(alias_utf8); - } + purple_blist_alias_buddy(b, alias_utf8); } else { b = purple_buddy_new(gc->account, curitem->name, alias_utf8); @@ -5081,16 +5078,23 @@ return 1; } -static int purple_ssi_parseadd(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) { - PurpleConnection *gc = od->gc; +static int +purple_ssi_parseaddmod(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) +{ + PurpleConnection *gc; + PurpleAccount *account; char *gname, *gname_utf8, *alias, *alias_utf8; PurpleBuddy *b; PurpleGroup *g; va_list ap; - guint16 type; + guint16 snac_subtype, type; const char *name; + gc = od->gc; + account = purple_connection_get_account(gc); + va_start(ap, fr); + snac_subtype = (guint16)va_arg(ap, int); type = (guint16)va_arg(ap, int); name = va_arg(ap, char *); va_end(ap); @@ -5099,7 +5103,7 @@ return 1; gname = aim_ssi_itemlist_findparentname(od->ssi.local, name); - gname_utf8 = gname ? oscar_utf8_try_convert(gc->account, gname) : NULL; + gname_utf8 = gname ? oscar_utf8_try_convert(account, gname) : NULL; alias = aim_ssi_getalias(od->ssi.local, gname, name); if (alias != NULL) @@ -5107,22 +5111,26 @@ if (g_utf8_validate(alias, -1, NULL)) alias_utf8 = g_strdup(alias); else - alias_utf8 = oscar_utf8_try_convert(purple_connection_get_account(gc), alias); + alias_utf8 = oscar_utf8_try_convert(account, alias); } else alias_utf8 = NULL; - - b = purple_find_buddy(gc->account, name); g_free(alias); + b = purple_find_buddy(account, name); if (b) { - /* Get server stored alias */ - if (alias_utf8) { - g_free(b->alias); - b->alias = g_strdup(alias_utf8); - } - } else { - b = purple_buddy_new(gc->account, name, alias_utf8); + /* + * You're logged in somewhere else and you aliased one + * of your buddies, so update our local buddy list with + * the person's new alias. + */ + purple_blist_alias_buddy(b, alias_utf8); + } else if (snac_subtype == 0x0008) { + /* + * You're logged in somewhere else and you added a buddy to + * your server list, so add them to your local buddy list. + */ + b = purple_buddy_new(account, name, alias_utf8); if (!(g = purple_find_group(gname_utf8 ? gname_utf8 : _("Orphans")))) { g = purple_group_new(gname_utf8 ? gname_utf8 : _("Orphans")); @@ -5133,6 +5141,7 @@ "ssi: adding buddy %s to group %s to local list\n", name, gname_utf8 ? gname_utf8 : _("Orphans")); purple_blist_add_buddy(b, NULL, g, NULL); } + g_free(gname_utf8); g_free(alias_utf8);