# HG changeset patch # User Richard Laager # Date 1190994642 0 # Node ID e01a6dc25900ea410b6c221a185d5bc776d17341 # Parent 0bf3907e62fdd0980337efc04283a907f307b9d2 applied changes from 02a707bbb0cf1cab4c65c4977bed39c67c5b2452 through 4bf967409db36d8f3cc8671f6633ea448165dd99 diff -r 0bf3907e62fd -r e01a6dc25900 libpurple/protocols/oscar/AUTHORS --- a/libpurple/protocols/oscar/AUTHORS Fri Sep 28 15:50:22 2007 +0000 +++ b/libpurple/protocols/oscar/AUTHORS Fri Sep 28 15:50:42 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 0bf3907e62fd -r e01a6dc25900 libpurple/protocols/oscar/family_feedbag.c --- a/libpurple/protocols/oscar/family_feedbag.c Fri Sep 28 15:50:22 2007 +0000 +++ b/libpurple/protocols/oscar/family_feedbag.c Fri Sep 28 15:50:42 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 0bf3907e62fd -r e01a6dc25900 libpurple/protocols/oscar/oscar.c --- a/libpurple/protocols/oscar/oscar.c Fri Sep 28 15:50:22 2007 +0000 +++ b/libpurple/protocols/oscar/oscar.c Fri Sep 28 15:50:42 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);