/* after getting info or modify myself, refresh the buddy list accordingly */ static void update_buddy_info(PurpleConnection *gc, gchar **segments) { PurpleBuddy *buddy; qq_data *qd; qq_buddy_data *bd; guint32 uid; gchar *who; gchar *alias_utf8; PurpleAccount *account = purple_connection_get_account(gc); qd = (qq_data *) gc->proto_data; uid = strtoul(segments[QQ_INFO_UID], NULL, 10); who = uid_to_purple_name(uid); qq_filter_str(segments[QQ_INFO_NICK]); alias_utf8 = qq_to_utf8(segments[QQ_INFO_NICK], QQ_CHARSET_DEFAULT); if (uid == qd->uid) { /* it is me */ purple_debug_info("QQ", "Got my info\n"); qd->my_icon = strtol(segments[QQ_INFO_FACE], NULL, 10); if (alias_utf8 != NULL) { purple_account_set_alias(account, alias_utf8); } /* add me to buddy list */ buddy = qq_buddy_find_or_new(gc, uid); } else { buddy = purple_find_buddy(gc->account, who); } if (buddy == NULL || buddy->proto_data == NULL) { g_free(who); g_free(alias_utf8); return; } /* update buddy list (including myself, if myself is the buddy) */ bd = (qq_buddy_data *)buddy->proto_data; bd->age = strtol(segments[QQ_INFO_AGE], NULL, 10); bd->gender = strtol(segments[QQ_INFO_GENDER], NULL, 10); bd->face = strtol(segments[QQ_INFO_FACE], NULL, 10); if (alias_utf8 != NULL) { if (bd->nickname) g_free(bd->nickname); bd->nickname = g_strdup(alias_utf8); } bd->last_update = time(NULL); purple_blist_server_alias_buddy(buddy, bd->nickname); /* convert face num from packet (0-299) to local face (1-100) */ qq_update_buddy_icon(gc->account, who, bd->face); g_free(who); g_free(alias_utf8); }
/* process the reply to get_members_info packet */ void qq_process_room_cmd_get_members_info( guint8 *data, gint len, guint32 index, PurpleConnection *gc ) { gint bytes; gint num; guint32 id, member_uid; guint16 unknown; qq_room_data *rmd; qq_buddy_data *bd; gchar *nick; g_return_if_fail(data != NULL && len > 0); /* qq_show_packet("qq_process_room_cmd_get_members_info", data, len); */ bytes = 0; bytes += qq_get32(&id, data + bytes); g_return_if_fail(id > 0); rmd = qq_room_data_find(gc, id); g_return_if_fail(rmd != NULL); num = 0; while (bytes < len) { bytes += qq_get32(&member_uid, data + bytes); g_return_if_fail(member_uid > 0); bd = qq_room_buddy_find_or_new(gc, rmd, member_uid); g_return_if_fail(bd != NULL); num++; bytes += qq_get16(&(bd->face), data + bytes); bytes += qq_get8(&(bd->age), data + bytes); bytes += qq_get8(&(bd->gender), data + bytes); /* only here use old charset GB18030 */ bytes += qq_get_vstr(&nick, QQ_CHARSET_DEFAULT, sizeof(guint8), data + bytes); bytes += qq_get16(&unknown, data + bytes); bytes += qq_get8(&(bd->ext_flag), data + bytes); bytes += qq_get8(&(bd->comm_flag), data + bytes); qq_filter_str(nick); bd->nickname = g_strdup(nick); g_free(nick); #if 0 purple_debug_info("QQ", "member [%d]: ext_flag=0x%02x, comm_flag=0x%02x, nick=%s\n", member_uid, bd->ext_flag, bd->comm_flag, bd->nickname); #endif bd->last_update = time(NULL); } if (bytes > len) { purple_debug_error("QQ", "group_cmd_get_members_info: Dangerous error! maybe protocol changed, notify developers!"); } purple_debug_info("QQ", "Group \"%s\" got %d member info\n", rmd->name, num); if (index) { qq_request_room_get_members_info(gc, id, 0, index); return; } rmd->has_got_members_info = TRUE; qq_room_conv_set_onlines(gc, rmd); }