Mercurial > pidgin
diff libpurple/protocols/qq/buddy_info.c @ 24144:a95c7e71064c
2008.10.05 - ccpaging <ccpagint(at)gmail.com>
* Add my uid into buddy list
* Fixed a minor bug in qq_create_buddy. Not get new buddy's info.
* There are 38 fields in protocol 2008, one more than 2005/2007.
* The packet of Modifing buddy info is changed. Need sample to fix it.
author | SHiNE CsyFeK <csyfek@gmail.com> |
---|---|
date | Wed, 22 Oct 2008 14:48:46 +0000 |
parents | c2253c485728 |
children | ec3f7d3e0445 |
line wrap: on
line diff
--- a/libpurple/protocols/qq/buddy_info.c Wed Oct 22 14:47:39 2008 +0000 +++ b/libpurple/protocols/qq/buddy_info.c Wed Oct 22 14:48:46 2008 +0000 @@ -85,7 +85,7 @@ QQ_INFO_UNKNOW3, QQ_INFO_UNKNOW4, QQ_INFO_UNKNOW5, QQ_INFO_IS_PUB_MOBILE, QQ_INFO_IS_PUB_CONTACT, QQ_INFO_COLLEGE, QQ_INFO_HOROSCOPE, QQ_INFO_ZODIAC, QQ_INFO_BLOOD, QQ_INFO_SHOW, QQ_INFO_UNKNOW6, - QQ_INFO_LAST, + QQ_INFO_LAST_2007, QQ_INFO_LAST, }; enum { @@ -142,7 +142,8 @@ { QQ_FIELD_EXT, QQ_FIELD_CHOICE, "zodiac", N_("Zodiac"), zodiac_names, QQ_ZODIAC_SIZE }, { QQ_FIELD_EXT, QQ_FIELD_CHOICE, "blood", N_("Blood"), blood_types, QQ_BLOOD_SIZE }, { QQ_FIELD_UNUSED, QQ_FIELD_STRING, "qq_show", "QQ Show", NULL, 0 }, - { QQ_FIELD_UNUSED, QQ_FIELD_STRING, "unknow6", "Unknow6", NULL, 0 } + { QQ_FIELD_UNUSED, QQ_FIELD_STRING, "unknow6", "Unknow6", NULL, 0 }, + { QQ_FIELD_UNUSED, QQ_FIELD_STRING, "LAST_2005", "LAST_2005", NULL, 0 } }; typedef struct _modify_info_request { @@ -568,35 +569,53 @@ } /* after getting info or modify myself, refresh the buddy list accordingly */ -static void qq_refresh_buddy_and_myself(gchar **segments, PurpleConnection *gc) +static void qq_set_buddy_info(gchar **segments, PurpleConnection *gc) { - PurpleBuddy *b; + PurpleBuddy *purple_buddy; qq_data *qd; - qq_buddy *q_bud; + guint32 uid; + qq_buddy *buddy; gchar *alias_utf8; gchar *purple_name; PurpleAccount *account = purple_connection_get_account(gc); qd = (qq_data *) gc->proto_data; - purple_name = uid_to_purple_name(strtol(segments[QQ_INFO_UID], NULL, 10)); + + uid = strtol(segments[QQ_INFO_UID], NULL, 10); + purple_name = uid_to_purple_name(uid); alias_utf8 = qq_to_utf8(segments[QQ_INFO_NICK], QQ_CHARSET_DEFAULT); if (qd->uid == strtol(segments[QQ_INFO_UID], NULL, 10)) { /* 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 */ + purple_buddy = purple_find_buddy(gc->account, purple_name); + if ( purple_buddy == NULL) { + purple_buddy = qq_create_buddy(gc, uid, TRUE, FALSE); + } + buddy = g_new0(qq_buddy, 1); + buddy->uid = uid; + buddy->status = QQ_BUDDY_ONLINE_NORMAL; + purple_buddy->proto_data = buddy; + qd->buddies = g_list_append(qd->buddies, buddy); } + /* update buddy list (including myself, if myself is the buddy) */ - b = purple_find_buddy(gc->account, purple_name); - q_bud = (b == NULL) ? NULL : (qq_buddy *) b->proto_data; - if (q_bud != NULL) { /* I have this buddy */ - q_bud->age = strtol(segments[QQ_INFO_AGE], NULL, 10); - q_bud->gender = strtol(segments[QQ_INFO_GENDER], NULL, 10); - q_bud->face = strtol(segments[QQ_INFO_FACE], NULL, 10); + purple_buddy = purple_find_buddy(gc->account, purple_name); + buddy = (purple_buddy == NULL) ? NULL : (qq_buddy *) purple_buddy->proto_data; + if (buddy != NULL) { /* I have this buddy */ + buddy->age = strtol(segments[QQ_INFO_AGE], NULL, 10); + buddy->gender = strtol(segments[QQ_INFO_GENDER], NULL, 10); + buddy->face = strtol(segments[QQ_INFO_FACE], NULL, 10); if (alias_utf8 != NULL) - q_bud->nickname = g_strdup(alias_utf8); - qq_update_buddy_contact(gc, q_bud); - buddy_local_icon_upate(gc->account, purple_name, q_bud->face); + buddy->nickname = g_strdup(alias_utf8); + qq_update_buddy_contact(gc, buddy); + buddy_local_icon_upate(gc->account, purple_name, buddy->face); + } else { + purple_debug_info("QQ", "Can not find buddy data of %s\n", purple_name); } g_free(purple_name); g_free(alias_utf8); @@ -607,12 +626,18 @@ { qq_data *qd; gchar **segments; + gint field_count; g_return_if_fail(data != NULL && data_len != 0); qd = (qq_data *) gc->proto_data; - if (NULL == (segments = split_data(data, data_len, "\x1e", QQ_INFO_LAST))) + if (qd->client_version >= 2008) { + field_count = QQ_INFO_LAST; + } else { + field_count = QQ_INFO_LAST_2007; + } + if (NULL == (segments = split_data(data, data_len, "\x1e", field_count))) return; #ifdef DEBUG @@ -627,13 +652,13 @@ segments[QQ_INFO_FACE] = icon; request_modify_info(gc, segments); - qq_refresh_buddy_and_myself(segments, gc); + qq_set_buddy_info(segments, gc); } g_strfreev(segments); return; } - qq_refresh_buddy_and_myself(segments, gc); + qq_set_buddy_info(segments, gc); switch (action) { case QQ_BUDDY_INFO_DISPLAY: info_display_only(gc, segments); @@ -697,7 +722,7 @@ if ( qd->buddies == NULL) { return; } - + /* server only reply levels for online buddies */ size = 4 * g_list_length(qd->buddies) + 1 + 4; buf = g_newa(guint8, size); @@ -721,7 +746,7 @@ guint32 uid, onlineTime; guint16 level, timeRemainder; qq_buddy *buddy; - + while (data_len - bytes >= 12) { bytes += qq_get32(&uid, data + bytes); bytes += qq_get32(&onlineTime, data + bytes); @@ -784,11 +809,11 @@ buddy->onlineTime = onlineTime; buddy->level = level; buddy->timeRemainder = timeRemainder; - + /* extend bytes in qq2007*/ bytes += 4; /* skip 8 bytes */ /* qq_show_packet("Buddies level", data + bytes, data_len - bytes); */ - + do { bytes += qq_get16(&str_len, data + bytes); if (str_len <= 0 || bytes + str_len > data_len) {