diff -r c413ed3e4bdb -r 91f0294f2377 libpurple/protocols/qq/group_info.c --- a/libpurple/protocols/qq/group_info.c Sat Aug 09 23:23:48 2008 +0000 +++ b/libpurple/protocols/qq/group_info.c Sun Aug 10 04:32:14 2008 +0000 @@ -32,7 +32,10 @@ #include "group_internal.h" #include "group_info.h" #include "buddy_list.h" -#include "group_network.h" +#include "header_info.h" +#include "packet_parse.h" +#include "qq_network.h" +#include "utils.h" /* we check who needs to update member info every minutes * this interval determines if their member info is outdated */ @@ -61,20 +64,6 @@ } } -/* send packet to get detailed information of one group */ -void qq_send_cmd_group_get_group_info(PurpleConnection *gc, qq_group *group) -{ - guint8 raw_data[16] = {0}; - gint bytes = 0; - - g_return_if_fail(group != NULL); - - bytes += qq_put8(raw_data + bytes, QQ_GROUP_CMD_GET_GROUP_INFO); - bytes += qq_put32(raw_data + bytes, group->internal_group_id); - - qq_send_group_cmd(gc, group, raw_data, bytes); -} - /* send packet to get online group member, called by keep_alive */ void qq_send_cmd_group_all_get_online_members(PurpleConnection *gc) { @@ -99,9 +88,6 @@ void qq_send_cmd_group_get_online_members(PurpleConnection *gc, qq_group *group) { - guint8 raw_data[16] = {0}; - gint bytes = 0; - g_return_if_fail(group != NULL); /* only get online members when conversation window is on */ @@ -111,17 +97,14 @@ return; } - bytes += qq_put8(raw_data + bytes, QQ_GROUP_CMD_GET_ONLINE_MEMBER); - bytes += qq_put32(raw_data + bytes, group->internal_group_id); - - qq_send_group_cmd(gc, group, raw_data, bytes); + qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_ONLINES, group->id); } /* send packet to get info for each group member */ void qq_send_cmd_group_get_members_info(PurpleConnection *gc, qq_group *group) { guint8 *raw_data; - gint bytes, num, data_len; + gint bytes, num; GList *list; qq_buddy *member; @@ -137,12 +120,9 @@ return; } - data_len = 5 + 4 * num; - raw_data = g_newa(guint8, data_len); + raw_data = g_newa(guint8, 4 * num); bytes = 0; - bytes += qq_put8(raw_data + bytes, QQ_GROUP_CMD_GET_MEMBER_INFO); - bytes += qq_put32(raw_data + bytes, group->internal_group_id); list = group->members; while (list != NULL) { @@ -152,16 +132,10 @@ list = list->next; } - if (bytes != data_len) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", - "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_GET_MEMBER_INFO)); - return; - } - - qq_send_group_cmd(gc, group, raw_data, bytes); + qq_send_room_cmd(gc, QQ_ROOM_CMD_GET_MEMBER_INFO, group->id, raw_data, bytes); } -void qq_process_group_cmd_get_group_info(guint8 *data, gint len, PurpleConnection *gc) +void qq_process_room_cmd_get_info(guint8 *data, gint data_len, PurpleConnection *gc) { qq_group *group; qq_buddy *member; @@ -169,33 +143,33 @@ PurpleConversation *purple_conv; guint8 organization, role; guint16 unknown, max_members; - guint32 member_uid, internal_group_id, external_group_id; + guint32 member_uid, id, ext_id; GSList *pending_id; guint32 unknown4; guint8 unknown1; gint bytes, num; gchar *notice; - g_return_if_fail(data != NULL && len > 0); + g_return_if_fail(data != NULL && data_len > 0); qd = (qq_data *) gc->proto_data; bytes = 0; - bytes += qq_get32(&(internal_group_id), data + bytes); - g_return_if_fail(internal_group_id > 0); + bytes += qq_get32(&id, data + bytes); + g_return_if_fail(id > 0); - bytes += qq_get32(&(external_group_id), data + bytes); - g_return_if_fail(external_group_id > 0); + bytes += qq_get32(&ext_id, data + bytes); + g_return_if_fail(ext_id > 0); - pending_id = qq_get_pending_id(qd->adding_groups_from_server, internal_group_id); + pending_id = qq_get_pending_id(qd->adding_groups_from_server, id); if (pending_id != NULL) { - qq_set_pending_id(&qd->adding_groups_from_server, internal_group_id, FALSE); - qq_group_create_internal_record(gc, internal_group_id, external_group_id, NULL); + qq_set_pending_id(&qd->adding_groups_from_server, id, FALSE); + qq_group_create_internal_record(gc, id, ext_id, NULL); } - group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); + group = qq_room_search_id(gc, id); g_return_if_fail(group != NULL); - bytes += qq_get8(&(group->group_type), data + bytes); + bytes += qq_get8(&(group->type8), data + bytes); bytes += qq_get32(&unknown4, data + bytes); /* unknown 4 bytes */ bytes += qq_get32(&(group->creator_uid), data + bytes); bytes += qq_get8(&(group->auth_type), data + bytes); @@ -210,7 +184,7 @@ * qunDestLen(qunDestcontent)) */ bytes += qq_get8(&unknown1, data + bytes); purple_debug(PURPLE_DEBUG_INFO, "QQ", "type=%u creatorid=%u category=%u maxmembers=%u\n", - group->group_type, group->creator_uid, group->group_category, max_members); + group->type8, group->creator_uid, group->group_category, max_members); /* strlen + */ bytes += convert_as_pascal_string(data + bytes, &(group->group_name_utf8), QQ_CHARSET_DEFAULT); @@ -223,23 +197,25 @@ num = 0; /* now comes the member list separated by 0x00 */ - while (bytes < len) { + while (bytes < data_len) { bytes += qq_get32(&member_uid, data + bytes); num++; bytes += qq_get8(&organization, data + bytes); bytes += qq_get8(&role, data + bytes); - /* +#if 0 if(organization != 0 || role != 0) { purple_debug(PURPLE_DEBUG_INFO, "QQ_GRP", "%d, organization=%d, role=%d\n", member_uid, organization, role); } - */ +#endif + member = qq_group_find_or_add_member(gc, group, member_uid); if (member != NULL) member->role = role; } - if(bytes > len) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "group_cmd_get_group_info: Dangerous error! maybe protocol changed, notify me!"); + if(bytes > data_len) { + purple_debug(PURPLE_DEBUG_ERROR, "QQ", + "group_cmd_get_group_info: Dangerous error! maybe protocol changed, notify me!"); } purple_debug(PURPLE_DEBUG_INFO, "QQ", "group \"%s\" has %d members\n", group->group_name_utf8, num); @@ -265,9 +241,9 @@ purple_conv_chat_set_topic(PURPLE_CONV_CHAT(purple_conv), NULL, group->notice_utf8); } -void qq_process_group_cmd_get_online_members(guint8 *data, gint len, PurpleConnection *gc) +void qq_process_room_cmd_get_onlines(guint8 *data, gint len, PurpleConnection *gc) { - guint32 internal_group_id, member_uid; + guint32 id, member_uid; guint8 unknown; gint bytes, num; qq_group *group; @@ -281,14 +257,14 @@ } bytes = 0; - bytes += qq_get32(&internal_group_id, data + bytes); + bytes += qq_get32(&id, data + bytes); bytes += qq_get8(&unknown, data + bytes); /* 0x3c ?? */ - g_return_if_fail(internal_group_id > 0); + g_return_if_fail(id > 0); - group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); + group = qq_room_search_id(gc, id); if (group == NULL) { purple_debug(PURPLE_DEBUG_ERROR, "QQ", - "We have no group info for internal id [%d]\n", internal_group_id); + "We have no group info for internal id [%d]\n", id); return; } @@ -311,11 +287,11 @@ } /* process the reply to get_members_info packet */ -void qq_process_group_cmd_get_members_info(guint8 *data, gint len, PurpleConnection *gc) +void qq_process_room_cmd_get_members(guint8 *data, gint len, PurpleConnection *gc) { gint bytes; gint num; - guint32 internal_group_id, member_uid; + guint32 id, member_uid; guint16 unknown; qq_group *group; qq_buddy *member; @@ -323,11 +299,15 @@ g_return_if_fail(data != NULL && len > 0); +#if 0 + qq_show_packet("qq_process_room_cmd_get_members", data, len); +#endif + bytes = 0; - bytes += qq_get32(&internal_group_id, data + bytes); - g_return_if_fail(internal_group_id > 0); + bytes += qq_get32(&id, data + bytes); + g_return_if_fail(id > 0); - group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); + group = qq_room_search_id(gc, id); g_return_if_fail(group != NULL); num = 0; @@ -352,19 +332,18 @@ member->nickname = g_strdup(nick); g_free(nick); - /* - if (QQ_DEBUG) { - purple_debug(PURPLE_DEBUG_INFO, "QQ", - "member [%09d]: ext_flag=0x%02x, comm_flag=0x%02x, nick=%s\n", - member_uid, member->ext_flag, member->comm_flag, member->nickname); - } - */ +#if 0 + purple_debug(PURPLE_DEBUG_INFO, "QQ", + "member [%09d]: ext_flag=0x%02x, comm_flag=0x%02x, nick=%s\n", + member_uid, member->ext_flag, member->comm_flag, member->nickname); +#endif member->last_refresh = time(NULL); } - if(bytes > len) { + if (bytes > len) { purple_debug(PURPLE_DEBUG_ERROR, "QQ", "group_cmd_get_members_info: Dangerous error! maybe protocol changed, notify developers!"); } purple_debug(PURPLE_DEBUG_INFO, "QQ", "Group \"%s\" obtained %d member info\n", group->group_name_utf8, num); } +