diff libpurple/protocols/qq/group_opt.c @ 23753:5f454b975a99

2008.08.10 - csyfek <csyfek(at)gmail.com> * Commit to Pidgin 2008.08.06 - ccpaging <ecc_hy(at)hotmail.com> * Rename names of variables, Group, to Room * Functions of group_network merged into qq_network and qq_process * Canceled managing glist of group packet, add sub_cmdd and room_id to transaction * Fixed error of demo group: If 'room list' and 'room infor' are not setup, response received from server will emits 'room_id = 0' packet. 2008.08.04 - ccpaging <ecc_hy(at)hotmail.com> * Use new crypt/decrypt functions * Rename crypt.c/h to qq_crypt.c/h * Clean code of decrypt functions * Fixed decryption failure 2008.08.04 - csyfek <csyfek(at)gmail.com> * Update AUTHORS
author SHiNE CsyFeK <csyfek@gmail.com>
date Sun, 10 Aug 2008 04:32:14 +0000
parents 9a5d140400f1
children 967344bc404d
line wrap: on
line diff
--- a/libpurple/protocols/qq/group_opt.c	Sat Aug 09 23:23:48 2008 +0000
+++ b/libpurple/protocols/qq/group_opt.c	Sun Aug 10 04:32:14 2008 +0000
@@ -34,9 +34,10 @@
 #include "group_internal.h"
 #include "group_info.h"
 #include "group_join.h"
-#include "group_network.h"
 #include "group_opt.h"
+#include "header_info.h"
 #include "packet_parse.h"
+#include "qq_network.h"
 #include "utils.h"
 
 static int _compare_guint32(const void *a,
@@ -68,13 +69,11 @@
 	data = g_newa(guint8, data_len);
 	
 	bytes = 0;
-	bytes += qq_put8(data + bytes, QQ_GROUP_CMD_MEMBER_OPT);
-	bytes += qq_put32(data + bytes, group->internal_group_id);
 	bytes += qq_put8(data + bytes, operation);
 	for (i = 0; i < count; i++)
 		bytes += qq_put32(data + bytes, members[i]);
 
-	qq_send_group_cmd(gc, group, data, bytes);
+	qq_send_room_cmd(gc, QQ_ROOM_CMD_MEMBER_OPT, group->id, data, bytes);
 }
 
 static void _qq_group_do_nothing_with_struct(group_member_opt *g)
@@ -86,8 +85,8 @@
 static void _qq_group_reject_application_real(group_member_opt *g, gchar *msg_utf8)
 {
 	qq_group *group;
-	g_return_if_fail(g != NULL && g->gc != NULL && g->internal_group_id > 0 && g->member > 0);
-	group = qq_group_find_by_id(g->gc, g->internal_group_id, QQ_INTERNAL_ID);
+	g_return_if_fail(g != NULL && g->gc != NULL && g->id > 0 && g->member > 0);
+	group = qq_room_search_id(g->gc, g->id);
 	g_return_if_fail(group != NULL);
 	qq_send_cmd_group_auth(g->gc, group, QQ_GROUP_AUTH_REQUEST_REJECT, g->member, msg_utf8);
 	g_free(g);
@@ -131,8 +130,8 @@
 void qq_group_approve_application_with_struct(group_member_opt *g)
 {
 	qq_group *group;
-	g_return_if_fail(g != NULL && g->gc != NULL && g->internal_group_id > 0 && g->member > 0);
-	group = qq_group_find_by_id(g->gc, g->internal_group_id, QQ_INTERNAL_ID);
+	g_return_if_fail(g != NULL && g->gc != NULL && g->id > 0 && g->member > 0);
+	group = qq_room_search_id(g->gc, g->id);
 	g_return_if_fail(group != NULL);
 	qq_send_cmd_group_auth(g->gc, group, QQ_GROUP_AUTH_REQUEST_APPROVE, g->member, "");
 	qq_group_find_or_add_member(g->gc, group, g->member);
@@ -198,24 +197,24 @@
 void qq_group_process_modify_members_reply(guint8 *data, gint len, PurpleConnection *gc)
 {
 	gint bytes;
-	guint32 internal_group_id;
+	guint32 id;
 	qq_group *group;
 	g_return_if_fail(data != NULL);
 
 	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);
 
 	/* we should have its info locally */
-	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);
 
-	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in modify members for Qun %d\n", group->external_group_id);
+	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in modify members for Qun %d\n", group->ext_id);
 
 	purple_notify_info(gc, _("QQ Qun Operation"), _("You have successfully modified Qun member"), NULL);
 }
 
-void qq_group_modify_info(PurpleConnection *gc, qq_group *group)
+void qq_room_change_info(PurpleConnection *gc, qq_group *group)
 {
 	guint8 *data;
 	gint data_len;
@@ -228,16 +227,9 @@
 	group_desc = group->group_desc_utf8 == NULL ? "" : utf8_to_qq(group->group_desc_utf8, QQ_CHARSET_DEFAULT);
 	notice = group->notice_utf8 == NULL ? "" : utf8_to_qq(group->notice_utf8, QQ_CHARSET_DEFAULT);
 
-	data_len = 13 + 1 + strlen(group_name)
-	    + 1 + strlen(group_desc)
-	    + 1 + strlen(notice);
-
+	data_len = 64 + strlen(group_name) + strlen(group_desc) + strlen(notice);
 	data = g_newa(guint8, data_len);
 	bytes = 0;
-	/* 000-000 */
-	bytes += qq_put8(data + bytes, QQ_GROUP_CMD_MODIFY_GROUP_INFO);
-	/* 001-004 */
-	bytes += qq_put32(data + bytes, group->internal_group_id);
 	/* 005-005 */
 	bytes += qq_put8(data + bytes, 0x01);
 	/* 006-006 */
@@ -258,54 +250,52 @@
 	bytes += qq_put8(data + bytes, strlen(group_desc));
 	bytes += qq_putdata(data + bytes, (guint8 *) group_desc, strlen(group_desc));
 
-	if (bytes != data_len)	{
+	if (bytes > data_len) {
 		purple_debug(PURPLE_DEBUG_ERROR, "QQ",
-			   "Fail to create group_modify_info packet, expect %d bytes, wrote %d bytes\n",
+			   "Overflow in qq_room_change_info, max %d bytes, now %d bytes\n",
 			   data_len, bytes);
 		return;
 	}
-
-	qq_send_group_cmd(gc, group, data, bytes);
+	qq_send_room_cmd(gc, QQ_ROOM_CMD_CHANGE_INFO, group->id, data, bytes);
 }
 
 void qq_group_process_modify_info_reply(guint8 *data, gint len, PurpleConnection *gc)
 {
 	gint bytes;
-	guint32 internal_group_id;
+	guint32 id;
 	qq_group *group;
 	g_return_if_fail(data != NULL);
 
 	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);
 
 	/* we should have its info locally */
-	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);
 
-	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in modify info for Qun %d\n", group->external_group_id);
+	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in modify info for Qun %d\n", group->ext_id);
 	qq_group_refresh(gc, group);
 
 	purple_notify_info(gc, _("QQ Qun Operation"), _("You have successfully modified Qun information"), NULL);
 }
 
 /* we create a very simple group first, and then let the user to modify */
-void qq_group_create_with_name(PurpleConnection *gc, const gchar *name)
+void qq_room_create_new(PurpleConnection *gc, const gchar *name)
 {
+	guint8 *data;
 	gint data_len;
-	guint8 *data;
 	gint bytes;
 	qq_data *qd;
 	g_return_if_fail(name != NULL);
 
 	qd = (qq_data *) gc->proto_data;
-	data_len = 7 + 1 + strlen(name) + 2 + 1 + 1 + 4;
+
+	data_len = 64 + strlen(name);
 	data = g_newa(guint8, data_len);
 
 	bytes = 0;
 	/* we create the simpleset group, only group name is given */
-	/* 000 */
-	bytes += qq_put8(data + bytes, QQ_GROUP_CMD_CREATE_GROUP);
 	/* 001 */
 	bytes += qq_put8(data + bytes, QQ_GROUP_TYPE_PERMANENT);
 	/* 002 */
@@ -322,14 +312,13 @@
 	bytes += qq_put8(data + bytes, 0x00);	/* no group desc */
 	bytes += qq_put32(data + bytes, qd->uid);	/* I am member of coz */
 
-	if (bytes != data_len) {
+	if (bytes > data_len) {
 		purple_debug(PURPLE_DEBUG_ERROR, "QQ",
-			   "Fail create create_group packet, expect %d bytes, written %d bytes\n",
+			   "Overflow in qq_room_create, max %d bytes, now %d bytes\n",
 			   data_len, bytes);
 		return;
 	}
-
-	qq_send_group_cmd(gc, NULL, data, bytes);
+	qq_send_room_cmd_noid(gc, QQ_ROOM_CMD_CREATE, data, bytes);
 }
 
 static void qq_group_setup_with_gc_and_uid(gc_and_uid *g)
@@ -337,7 +326,7 @@
 	qq_group *group;
 	g_return_if_fail(g != NULL && g->gc != NULL && g->uid > 0);
 
-	group = qq_group_find_by_id(g->gc, g->uid, QQ_INTERNAL_ID);
+	group = qq_room_search_id(g->gc, g->uid);
 	g_return_if_fail(group != NULL);
 
 	/* TODO insert UI code here */
@@ -348,7 +337,7 @@
 void qq_group_process_create_group_reply(guint8 *data, gint len, PurpleConnection *gc)
 {
 	gint bytes;
-	guint32 internal_group_id, external_group_id;
+	guint32 id, ext_id;
 	qq_group *group;
 	gc_and_uid *g;
 	qq_data *qd;
@@ -358,23 +347,23 @@
 	qd = (qq_data *) gc->proto_data;
 
 	bytes = 0;
-	bytes += qq_get32(&internal_group_id, data + bytes);
-	bytes += qq_get32(&external_group_id, data + bytes);
-	g_return_if_fail(internal_group_id > 0 && external_group_id);
+	bytes += qq_get32(&id, data + bytes);
+	bytes += qq_get32(&ext_id, data + bytes);
+	g_return_if_fail(id > 0 && ext_id);
 
-	group = qq_group_create_internal_record(gc, internal_group_id, external_group_id, NULL);
+	group = qq_group_create_internal_record(gc, id, ext_id, NULL);
 	group->my_status = QQ_GROUP_MEMBER_STATUS_IS_ADMIN;
 	group->creator_uid = qd->uid;
 	qq_group_refresh(gc, group);
 
-	qq_group_activate_group(gc, internal_group_id);
-	qq_send_cmd_group_get_group_info(gc, group);
+	qq_send_room_cmd_only(gc, QQ_ROOM_CMD_ACTIVATE, id);
+	qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_INFO, id);
 
-	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in create Qun, external ID %d\n", group->external_group_id);
+	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in create Qun, external ID %d\n", group->ext_id);
 
 	g = g_new0(gc_and_uid, 1);
 	g->gc = gc;
-	g->uid = internal_group_id;
+	g->uid = id;
 
 	purple_request_action(gc, _("QQ Qun Operation"),
 			    _("You have successfully created a Qun"),
@@ -387,54 +376,37 @@
 			    _("Cancel"), G_CALLBACK(qq_do_nothing_with_gc_and_uid));
 }
 
-/* we have to activate group after creation, otherwise the group can not be searched */
-void qq_group_activate_group(PurpleConnection *gc, guint32 internal_group_id)
-{
-	guint8 data[16] = {0};
-	gint bytes = 0;
-	g_return_if_fail(internal_group_id > 0);
-
-	bytes = 0;
-	/* we create the simplest group, only group name is given */
-	/* 000 */
-	bytes += qq_put8(data + bytes, QQ_GROUP_CMD_ACTIVATE_GROUP);
-	/* 001-005 */
-	bytes += qq_put32(data + bytes, internal_group_id);
-
-	qq_send_group_cmd(gc, NULL, data, bytes);
-}
-
 void qq_group_process_activate_group_reply(guint8 *data, gint len, PurpleConnection *gc)
 {
 	gint bytes;
-	guint32 internal_group_id;
+	guint32 id;
 	qq_group *group;
 	g_return_if_fail(data != NULL);
 
 	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);
 
 	/* we should have its info locally */
-	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);
 
-	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in activate Qun %d\n", group->external_group_id);
+	purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in activate Qun %d\n", group->ext_id);
 }
 
 void qq_group_manage_group(PurpleConnection *gc, GHashTable *data)
 {
-	gchar *internal_group_id_ptr;
-	guint32 internal_group_id;
+	gchar *id_ptr;
+	guint32 id;
 	qq_group *group;
 
 	g_return_if_fail(data != NULL);
 
-	internal_group_id_ptr = g_hash_table_lookup(data, "internal_group_id");
-	internal_group_id = strtol(internal_group_id_ptr, NULL, 10);
-	g_return_if_fail(internal_group_id > 0);
+	id_ptr = g_hash_table_lookup(data, QQ_GROUP_KEY_INTERNAL_ID);
+	id = strtol(id_ptr, NULL, 10);
+	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);
 
 	/* XXX insert UI code here */