# HG changeset patch # User Eric Warmenhoven # Date 1006042909 0 # Node ID 6f527cbd899d423f5158b106221d4b4c3dc94ee0 # Parent 38cb5fa48bec49527fe88c2870166d5f6700d125 [gaim-migrate @ 2755] i'll commit it later. committer: Tailor Script diff -r 38cb5fa48bec -r 6f527cbd899d src/protocols/oscar/aim.h --- a/src/protocols/oscar/aim.h Sat Nov 17 22:50:08 2001 +0000 +++ b/src/protocols/oscar/aim.h Sun Nov 18 00:21:49 2001 +0000 @@ -978,8 +978,17 @@ char *msg; }; +struct aim_icq_simpleinfo { + fu32_t uin; + char *nick; + char *first; + char *last; + char *email; +}; + faim_export int aim_icq_reqofflinemsgs(aim_session_t *sess); faim_export int aim_icq_ackofflinemsgs(aim_session_t *sess); +faim_export int aim_icq_getsimpleinfo(aim_session_t *sess, const char *uin); /* aim_util.c */ /* diff -r 38cb5fa48bec -r 6f527cbd899d src/protocols/oscar/aim_cbtypes.h --- a/src/protocols/oscar/aim_cbtypes.h Sat Nov 17 22:50:08 2001 +0000 +++ b/src/protocols/oscar/aim_cbtypes.h Sun Nov 18 00:21:49 2001 +0000 @@ -180,6 +180,7 @@ #define AIM_CB_ICQ_ERROR 0x0001 #define AIM_CB_ICQ_OFFLINEMSG 0x00f0 #define AIM_CB_ICQ_OFFLINEMSGCOMPLETE 0x00f1 +#define AIM_CB_ICQ_SIMPLEINFO 0x00f2 #define AIM_CB_ICQ_DEFAULT 0xffff /* diff -r 38cb5fa48bec -r 6f527cbd899d src/protocols/oscar/icq.c --- a/src/protocols/oscar/icq.c Sat Nov 17 22:50:08 2001 +0000 +++ b/src/protocols/oscar/icq.c Sun Nov 18 00:21:49 2001 +0000 @@ -108,6 +108,43 @@ return 0; } +faim_export int aim_icq_getsimpleinfo(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, 0x051f); /* shrug. */ + aimbs_putle32(&fr->data, atoi(uin)); + + aim_tx_enqueue(sess, fr); + + return 0; +} + /* * Response to 15/2, contains an ICQ packet. */ @@ -162,6 +199,40 @@ if ((userfunc = aim_callhandler(sess, rx->conn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_OFFLINEMSGCOMPLETE))) ret = userfunc(sess, rx); + } else if (cmd == 0x07da) { + fu16_t subtype; + + subtype = aimbs_getle16(&qbs); + + if (subtype == 0x019a) { + fu16_t tlen; + struct aim_icq_simpleinfo info; + aim_rxcallback_t userfunc; + + memset(&info, 0, sizeof(info)); + + aimbs_getle8(&qbs); /* no clue */ + aimbs_getle16(&qbs); /* no clue */ + info.uin = aimbs_getle32(&qbs); + tlen = aimbs_getle16(&qbs); + info.nick = aimbs_getstr(&qbs, tlen); + tlen = aimbs_getle16(&qbs); + info.first = aimbs_getstr(&qbs, tlen); + tlen = aimbs_getle16(&qbs); + info.last = aimbs_getstr(&qbs, tlen); + tlen = aimbs_getle16(&qbs); + info.email = aimbs_getstr(&qbs, tlen); + /* no clue what the rest of it is */ + + if ((userfunc = aim_callhandler(sess, rx->conn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_SIMPLEINFO))) + ret = userfunc(sess, rx, &info); + + free(info.nick); + free(info.first); + free(info.last); + free(info.email); + } + } aim_freetlvchain(&tl); diff -r 38cb5fa48bec -r 6f527cbd899d src/protocols/oscar/oscar.c --- a/src/protocols/oscar/oscar.c Sat Nov 17 22:50:08 2001 +0000 +++ b/src/protocols/oscar/oscar.c Sun Nov 18 00:21:49 2001 +0000 @@ -229,23 +229,24 @@ static int gaim_parse_searcherror(aim_session_t *, aim_frame_t *, ...); static int gaim_parse_searchreply(aim_session_t *, aim_frame_t *, ...); static int gaim_bosrights (aim_session_t *, aim_frame_t *, ...); -static int conninitdone_bos (aim_session_t *sess, aim_frame_t *fr, ...); -static int conninitdone_admin (aim_session_t *sess, aim_frame_t *fr, ...); -static int conninitdone_chat (aim_session_t *sess, aim_frame_t *fr, ...); -static int conninitdone_chatnav (aim_session_t *sess, aim_frame_t *fr, ...); +static int conninitdone_bos (aim_session_t *, aim_frame_t *, ...); +static int conninitdone_admin (aim_session_t *, aim_frame_t *, ...); +static int conninitdone_chat (aim_session_t *, aim_frame_t *, ...); +static int conninitdone_chatnav (aim_session_t *, aim_frame_t *, ...); static int gaim_parse_msgerr (aim_session_t *, aim_frame_t *, ...); static int gaim_parse_buddyrights(aim_session_t *, aim_frame_t *, ...); static int gaim_parse_locerr (aim_session_t *, aim_frame_t *, ...); static int gaim_icbm_param_info (aim_session_t *, aim_frame_t *, ...); static int gaim_parse_genericerr (aim_session_t *, aim_frame_t *, ...); -static int gaim_memrequest (aim_session_t *, aim_frame_t*, ...); -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_directim_initiate (aim_session_t *, aim_frame_t *, ...); -static int gaim_directim_incoming (aim_session_t *, aim_frame_t *, ...); -static int gaim_directim_typing (aim_session_t *, aim_frame_t *, ...); +static int gaim_memrequest (aim_session_t *, aim_frame_t *, ...); +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_simpleinfo (aim_session_t *, aim_frame_t *, ...); + +static int gaim_directim_initiate(aim_session_t *, aim_frame_t *, ...); +static int gaim_directim_incoming(aim_session_t *, aim_frame_t *, ...); +static int gaim_directim_typing (aim_session_t *, aim_frame_t *, ...); static char *msgerrreason[] = { "Invalid error", @@ -652,6 +653,7 @@ aim_conn_addhandler(sess, bosconn, 0x0001, 0x000f, gaim_selfinfo, 0); 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_ICQ, AIM_CB_ICQ_SIMPLEINFO, gaim_simpleinfo, 0); ((struct oscar_data *)gc->proto_data)->conn = bosconn; for (i = 0; i < (int)strlen(info->bosip); i++) { @@ -2025,6 +2027,31 @@ return 1; } +static int gaim_simpleinfo(aim_session_t *sess, aim_frame_t *fr, ...) +{ + va_list ap; + struct aim_icq_simpleinfo *info; + char buf[16 * 1024]; + + va_start(ap, fr); + info = va_arg(ap, struct aim_icq_simpleinfo *); + va_end(ap); + + g_snprintf(buf, sizeof buf, + "UIN: %lu
" + "Nick: %s
" + "Name: %s %s
" + "Email: %s\n", + info->uin, + info->nick, + info->first, info->last, + info->email); + + g_show_info_text(buf, NULL); + + return 1; +} + static int gaim_parse_searchreply(aim_session_t *sess, aim_frame_t *fr, ...) { va_list ap; char *address, *SNs; @@ -2189,7 +2216,10 @@ static void oscar_get_info(struct gaim_connection *g, char *name) { struct oscar_data *odata = (struct oscar_data *)g->proto_data; - aim_getinfo(odata->sess, odata->conn, name, AIM_GETINFO_GENERALINFO); + if (odata->icq) + aim_icq_getsimpleinfo(odata->sess, name); + else + aim_getinfo(odata->sess, odata->conn, name, AIM_GETINFO_GENERALINFO); } static void oscar_get_away_msg(struct gaim_connection *g, char *name) {