# HG changeset patch # User Mark Doliner # Date 1047611394 0 # Node ID 1762496d502ac4c38ecaadce18c244a55a1841f7 # Parent 2202f056a1c9ed9507125a7bb063fa4580359ceb [gaim-migrate @ 5076] This caches ICQ remote nicks in your local blist.xml file. It's really not a great thing to do, but it's better than what we do currently. I want to make Gaim request the remote nick every now and then to see if it's changed. Anyhow, like all things I've done recently, it's slightly ugly. And I can't test the get-alias-when-adding-icq-buddy thing until Sean commits his buddy list editing stuff later tonight, but it should work like a charm. committer: Tailor Script diff -r 2202f056a1c9 -r 1762496d502a src/protocols/oscar/aim.h --- a/src/protocols/oscar/aim.h Fri Mar 14 02:28:49 2003 +0000 +++ b/src/protocols/oscar/aim.h Fri Mar 14 03:09:54 2003 +0000 @@ -1306,6 +1306,7 @@ faim_export int aim_icq_hideip(aim_session_t *sess); faim_export int aim_icq_changepasswd(aim_session_t *sess, const char *passwd); faim_export int aim_icq_getsimpleinfo(aim_session_t *sess, const char *uin); +faim_export int aim_icq_getalias(aim_session_t *sess, const char *uin); faim_export int aim_icq_getallinfo(aim_session_t *sess, const char *uin); diff -r 2202f056a1c9 -r 1762496d502a src/protocols/oscar/aim_cbtypes.h --- a/src/protocols/oscar/aim_cbtypes.h Fri Mar 14 02:28:49 2003 +0000 +++ b/src/protocols/oscar/aim_cbtypes.h Fri Mar 14 03:09:54 2003 +0000 @@ -195,6 +195,7 @@ #define AIM_CB_ICQ_OFFLINEMSG 0x00f0 #define AIM_CB_ICQ_OFFLINEMSGCOMPLETE 0x00f1 #define AIM_CB_ICQ_INFO 0x00f2 +#define AIM_CB_ICQ_ALIAS 0x00f3 #define AIM_CB_ICQ_DEFAULT 0xffff /* diff -r 2202f056a1c9 -r 1762496d502a src/protocols/oscar/icq.c --- a/src/protocols/oscar/icq.c Fri Mar 14 02:28:49 2003 +0000 +++ b/src/protocols/oscar/icq.c Fri Mar 14 03:09:54 2003 +0000 @@ -189,6 +189,43 @@ return 0; } +faim_export int aim_icq_getalias(aim_session_t *sess, const char *uin) +{ + aim_conn_t *conn; + aim_frame_t *fr; + aim_snacid_t snacid; + int bslen; + + if (!uin || uin[0] < '0' || uin[0] > '9') + return -EINVAL; + + if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0015))) + return -EINVAL; + + bslen = 2 + 4 + 2 + 2 + 2 + 4; + + if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10 + 4 + bslen))) + return -ENOMEM; + + snacid = aim_cachesnac(sess, 0x0015, 0x0002, 0x0000, NULL, 0); + aim_putsnac(&fr->data, 0x0015, 0x0002, 0x0000, snacid); + + /* For simplicity, don't bother using a tlvlist */ + aimbs_put16(&fr->data, 0x0001); + aimbs_put16(&fr->data, bslen); + + aimbs_putle16(&fr->data, bslen - 2); + aimbs_putle32(&fr->data, atoi(sess->sn)); + aimbs_putle16(&fr->data, 0x07d0); /* I command thee. */ + aimbs_putle16(&fr->data, snacid); /* eh. */ + aimbs_putle16(&fr->data, 0x04ba); /* shrug. */ + aimbs_putle32(&fr->data, atoi(uin)); + + aim_tx_enqueue(sess, fr); + + return 0; +} + faim_export int aim_icq_getsimpleinfo(aim_session_t *sess, const char *uin) { aim_conn_t *conn; @@ -448,6 +485,14 @@ case 0x00fa: { /* past background and current organizations */ } break; + case 0x0104: { /* alias info */ + info->nick = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); + info->first = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); + info->last = aimbs_getstr(&qbs, aimbs_getle16(&qbs)); + aim_bstream_advance(&qbs, aimbs_getle16(&qbs)); /* email address? */ + /* Then 0x00 02 00 */ + } break; + case 0x010e: { /* unknown */ /* 0x00 00 */ } break; @@ -464,8 +509,13 @@ } /* End switch statement */ if (!(snac->flags & 0x0001)) { - if ((userfunc = aim_callhandler(sess, rx->conn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_INFO))) - ret = userfunc(sess, rx, info); + if (cmd != 0x104) + if ((userfunc = aim_callhandler(sess, rx->conn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_INFO))) + ret = userfunc(sess, rx, info); + + if (info->uin && info->nick) + if ((userfunc = aim_callhandler(sess, rx->conn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_ALIAS))) + ret = userfunc(sess, rx, info); if (sess->icq_info == info) { sess->icq_info = info->next; diff -r 2202f056a1c9 -r 1762496d502a src/protocols/oscar/oscar.c --- a/src/protocols/oscar/oscar.c Fri Mar 14 02:28:49 2003 +0000 +++ b/src/protocols/oscar/oscar.c Fri Mar 14 03:09:54 2003 +0000 @@ -313,6 +313,7 @@ static int gaim_selfinfo (aim_session_t *, aim_frame_t *, ...); static int gaim_offlinemsg (aim_session_t *, aim_frame_t *, ...); static int gaim_offlinemsgdone (aim_session_t *, aim_frame_t *, ...); +static int gaim_icqalias (aim_session_t *, aim_frame_t *, ...); static int gaim_icqinfo (aim_session_t *, aim_frame_t *, ...); static int gaim_popup (aim_session_t *, aim_frame_t *, ...); #ifndef NOSSI @@ -1069,6 +1070,7 @@ aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_OFFLINEMSG, gaim_offlinemsg, 0); aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_OFFLINEMSGCOMPLETE, gaim_offlinemsgdone, 0); aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_POP, 0x0002, gaim_popup, 0); + aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_ALIAS, gaim_icqalias, 0); aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_INFO, gaim_icqinfo, 0); #ifndef NOSSI aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_SSI, AIM_CB_SSI_ERROR, gaim_ssi_parseerr, 0); @@ -3555,7 +3557,6 @@ buf = g_strdup_printf("UIN: %s", who); if (info->nick && info->nick[0]) { tmp = buf; buf = g_strconcat(tmp, "\n
Nick: ", info->nick, NULL); g_free(tmp); - serv_got_alias(gc, who, info->nick); } if (info->first && info->first[0]) { tmp = buf; buf = g_strconcat(tmp, "\n
First Name: ", info->first, NULL); g_free(tmp); @@ -3656,6 +3657,30 @@ return 1; } +static int gaim_icqalias(aim_session_t *sess, aim_frame_t *fr, ...) +{ + struct gaim_connection *gc = sess->aux_data; + gchar who[16]; + struct buddy *b; + va_list ap; + struct aim_icq_info *info; + + va_start(ap, fr); + info = va_arg(ap, struct aim_icq_info *); + va_end(ap); + + if (info->uin && info->nick && info->nick[0]) { + g_snprintf(who, sizeof(who), "%lu", info->uin); + serv_got_alias(gc, who, info->nick); + if ((b = gaim_find_buddy(gc->account, who))) { + gaim_buddy_set_setting(b, "servernick", info->nick); + gaim_blist_save(); + } + } + + return 1; +} + static int gaim_popup(aim_session_t *sess, aim_frame_t *fr, ...) { char *msg, *url; @@ -4175,6 +4200,8 @@ } } #endif + if (od->icq) + aim_icq_getalias(od->sess, name); } static void oscar_add_buddies(struct gaim_connection *gc, GList *buddies) { @@ -4437,30 +4464,38 @@ if (tmp) gaim_blist_save(); - /* Add from local list to server list */ - if (gc) { + { /* Add from local list to server list */ + GaimBlistNode *gnode, *bnode; + struct group *group; + struct buddy *buddy; + struct gaim_buddy_list *blist; GSList *cur; /* Buddies */ - for (cur=groups; cur; cur=g_slist_next(cur)) { - GSList *curb; - struct group *group = cur->data; - for (curb=group->members; curb; curb=curb->next) { - struct buddy *buddy = curb->data; - if(buddy->account == gc->account) { - if (aim_ssi_itemlist_exists(sess->ssi.local, buddy->name)) { - /* Store local alias on server */ - char *alias = aim_ssi_getalias(sess->ssi.local, group->name, buddy->name); - if (!alias && buddy->alias[0]) - aim_ssi_aliasbuddy(sess, od->conn, group->name, buddy->name, buddy->alias); - free(alias); - } else { - debug_printf("ssi: adding buddy %s from local list to server list\n", buddy->name); - aim_ssi_addbuddy(sess, od->conn, buddy->name, group->name, gaim_get_buddy_alias_only(buddy), NULL, NULL, 0); + if ((blist = gaim_get_blist())) + for (gnode = blist->root; gnode; gnode = gnode->next) { + group = (struct group *)gnode; + for (bnode = gnode->child; bnode; bnode = bnode->next) { + buddy = (struct buddy *)bnode; + if (buddy->account == gc->account) { + gchar *servernick = gaim_buddy_get_setting(buddy, "servernick"); + if (servernick) { + serv_got_alias(gc, buddy->name, servernick); + g_free(servernick); + } + if (aim_ssi_itemlist_exists(sess->ssi.local, buddy->name)) { + /* Store local alias on server */ + char *alias = aim_ssi_getalias(sess->ssi.local, group->name, buddy->name); + if (!alias && buddy->alias) + aim_ssi_aliasbuddy(sess, od->conn, group->name, buddy->name, buddy->alias); + free(alias); + } else { + debug_printf("ssi: adding buddy %s from local list to server list\n", buddy->name); + aim_ssi_addbuddy(sess, od->conn, buddy->name, group->name, gaim_get_buddy_alias_only(buddy), NULL, NULL, 0); + } } } } - } /* Permit list */ if (gc->account->permit) { @@ -4504,7 +4539,7 @@ g_free(dialog_msg); } - } /* end if (gc) */ + } /* end adding buddies from local list to server list */ /* Activate SSI */ /* Sending the enable causes other people to be able to see you, and you to see them */