libpurple/protocols/qq/group_info.c

changeset 24018
91f0294f2377
parent 23950
a974649cdb89
child 24019
c0801ae3c886
--- 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 + <str content> */
 	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);
 }
+

mercurial