diff libpurple/protocols/qq/group_join.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_join.c	Sat Aug 09 23:23:48 2008 +0000
+++ b/libpurple/protocols/qq/group_join.c	Sun Aug 10 04:32:14 2008 +0000
@@ -38,8 +38,10 @@
 #include "group_info.h"
 #include "group_join.h"
 #include "group_opt.h"
-#include "group_network.h"
 #include "group_search.h"
+#include "header_info.h"
+#include "packet_parse.h"
+#include "qq_network.h"
 
 enum {
 	QQ_GROUP_JOIN_OK = 0x01,
@@ -49,24 +51,21 @@
 static void _qq_group_exit_with_gc_and_id(gc_and_uid *g)
 {
 	PurpleConnection *gc;
-	guint32 internal_group_id;
+	guint32 id;
 	qq_group *group;
 
 	gc = g->gc;
-	internal_group_id = g->uid;
+	id = g->uid;
 
-	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);
 
-	qq_send_cmd_group_exit_group(gc, group);
+	qq_send_room_cmd_only(gc, QQ_ROOM_CMD_QUIT, group->id);
 }
 
 /* send packet to join a group without auth */
 void qq_send_cmd_group_join_group(PurpleConnection *gc, qq_group *group)
 {
-	guint8 raw_data[16] = {0};
-	gint bytes = 0;
-
 	g_return_if_fail(group != NULL);
 
 	if (group->my_status == QQ_GROUP_MEMBER_STATUS_NOT_MEMBER) {
@@ -86,25 +85,21 @@
 		break;
 	}
 
-	bytes = 0;
-	bytes += qq_put8(raw_data + bytes, QQ_GROUP_CMD_JOIN_GROUP);
-	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_JOIN, group->id);
 }
 
 static void _qq_group_join_auth_with_gc_and_id(gc_and_uid *g, const gchar *reason_utf8)
 {
 	PurpleConnection *gc;
 	qq_group *group;
-	guint32 internal_group_id;
+	guint32 id;
 
 	gc = g->gc;
-	internal_group_id = g->uid;
+	id = g->uid;
 
-	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", "Can not find qq_group by internal_id: %d\n", internal_group_id);
+		purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Can not find qq_group by internal_id: %d\n", id);
 		return;
 	} else {		/* everything is OK */
 		qq_send_cmd_group_auth(gc, group, QQ_GROUP_AUTH_REQUEST_APPLY, 0, reason_utf8);
@@ -118,12 +113,12 @@
 	g_return_if_fail(group != NULL);
 
 	purple_debug(PURPLE_DEBUG_INFO, "QQ", 
-			"Group (internal id: %d) needs authentication\n", group->internal_group_id);
+			"Group (internal id: %d) needs authentication\n", group->id);
 
 	msg = g_strdup_printf("Group \"%s\" needs authentication\n", group->group_name_utf8);
 	g = g_new0(gc_and_uid, 1);
 	g->gc = gc;
-	g->uid = group->internal_group_id;
+	g->uid = group->id;
 	purple_request_input(gc, NULL, msg,
 			   _("Input request here"),
 			   _("Would you be my friend?"), TRUE, FALSE, NULL,
@@ -139,7 +134,7 @@
 {
 	guint8 *raw_data;
 	gchar *reason_qq;
-	gint bytes, data_len;
+	gint bytes;
 
 	g_return_if_fail(group != NULL);
 
@@ -154,45 +149,22 @@
 		uid = 0;
 	}
 
-	data_len = 10 + strlen(reason_qq) + 1;
-	raw_data = g_newa(guint8, data_len);
+	raw_data = g_newa(guint8, 6 + strlen(reason_qq));
 
 	bytes = 0;
-	bytes += qq_put8(raw_data + bytes, QQ_GROUP_CMD_JOIN_GROUP_AUTH);
-	bytes += qq_put32(raw_data + bytes, group->internal_group_id);
 	bytes += qq_put8(raw_data + bytes, opt);
 	bytes += qq_put32(raw_data + bytes, uid);
 	bytes += qq_put8(raw_data + bytes, strlen(reason_qq));
 	bytes += qq_putdata(raw_data + bytes, (guint8 *) reason_qq, strlen(reason_qq));
 
-	if (bytes != data_len) {
-		purple_debug(PURPLE_DEBUG_ERROR, "QQ",
-			   "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_JOIN_GROUP_AUTH));
-		return;
-	}
-
-	qq_send_group_cmd(gc, group, raw_data, data_len);
-}
-
-/* send a packet to exit a group */
-void qq_send_cmd_group_exit_group(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_EXIT_GROUP);
-	bytes += qq_put32(raw_data + bytes, group->internal_group_id);
-
-	qq_send_group_cmd(gc, group, raw_data, bytes);
+	qq_send_room_cmd(gc, QQ_ROOM_CMD_AUTH, group->id, raw_data, bytes);
 }
 
 /* If comes here, cmd is OK already */
 void qq_process_group_cmd_exit_group(guint8 *data, gint len, PurpleConnection *gc)
 {
 	gint bytes;
-	guint32 internal_group_id;
+	guint32 id;
 	PurpleChat *chat;
 	qq_group *group;
 	qq_data *qd;
@@ -207,15 +179,15 @@
 	}
 
 	bytes = 0;
-	bytes += qq_get32(&internal_group_id, data + bytes);
+	bytes += qq_get32(&id, data + bytes);
 
-	group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID);
+	group = qq_room_search_id(gc, id);
 	if (group != NULL) {
 		chat = purple_blist_find_chat
-			    (purple_connection_get_account(gc), g_strdup_printf("%d", group->external_group_id));
+			    (purple_connection_get_account(gc), g_strdup_printf("%d", group->ext_id));
 		if (chat != NULL)
 			purple_blist_remove_chat(chat);
-		qq_group_delete_internal_record(qd, internal_group_id);
+		qq_group_delete_internal_record(qd, id);
 	}
 	purple_notify_info(gc, _("QQ Qun Operation"), _("You have successfully left the group"), NULL);
 }
@@ -224,7 +196,7 @@
 void qq_process_group_cmd_join_group_auth(guint8 *data, gint len, PurpleConnection *gc)
 {
 	gint bytes;
-	guint32 internal_group_id;
+	guint32 id;
 	qq_data *qd;
 
 	g_return_if_fail(data != NULL && len > 0);
@@ -236,8 +208,8 @@
 		return;
 	}
 	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);
 
 	purple_notify_info(gc, _("QQ Group Auth"),
 		     _("Your authorization request has been accepted by the QQ server"), NULL);
@@ -247,7 +219,7 @@
 void qq_process_group_cmd_join_group(guint8 *data, gint len, PurpleConnection *gc)
 {
 	gint bytes;
-	guint32 internal_group_id;
+	guint32 id;
 	guint8 reply;
 	qq_group *group;
 
@@ -260,11 +232,11 @@
 	}
 	
 	bytes = 0;
-	bytes += qq_get32(&internal_group_id, data + bytes);
+	bytes += qq_get32(&id, data + bytes);
 	bytes += qq_get8(&reply, data + bytes);
 
 	/* join group OK */
-	group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID);
+	group = qq_room_search_id(gc, id);
 	/* need to check if group is NULL or not. */
 	g_return_if_fail(group != NULL);
 	switch (reply) {
@@ -274,12 +246,12 @@
 		qq_group_refresh(gc, group);
 		/* this must be shown before getting online members */
 		qq_group_conv_show_window(gc, group);
-		qq_send_cmd_group_get_group_info(gc, group);
+		qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_INFO, group->id);
 		break;
 	case QQ_GROUP_JOIN_NEED_AUTH:
 		purple_debug(PURPLE_DEBUG_INFO, "QQ",
 			   "Fail joining group [%d] %s, needs authentication\n",
-			   group->external_group_id, group->group_name_utf8);
+			   group->ext_id, group->group_name_utf8);
 		group->my_status = QQ_GROUP_MEMBER_STATUS_NOT_MEMBER;
 		qq_group_refresh(gc, group);
 		_qq_group_join_auth(gc, group);
@@ -287,7 +259,7 @@
 	default:
 		purple_debug(PURPLE_DEBUG_INFO, "QQ",
 			   "Error joining group [%d] %s, unknown reply: 0x%02x\n",
-			   group->external_group_id, group->group_name_utf8, reply);
+			   group->ext_id, group->group_name_utf8, reply);
 	}
 }
 
@@ -295,48 +267,48 @@
 void qq_group_join(PurpleConnection *gc, GHashTable *data)
 {
 	qq_data *qd;
-	gchar *external_group_id_ptr;
-	guint32 external_group_id;
+	gchar *ext_id_ptr;
+	guint32 ext_id;
 	qq_group *group;
 
 	g_return_if_fail(data != NULL);
 	qd = (qq_data *) gc->proto_data;
 
-	external_group_id_ptr = g_hash_table_lookup(data, QQ_GROUP_KEY_EXTERNAL_ID);
-	g_return_if_fail(external_group_id_ptr != NULL);
+	ext_id_ptr = g_hash_table_lookup(data, QQ_GROUP_KEY_EXTERNAL_ID);
+	g_return_if_fail(ext_id_ptr != NULL);
 	errno = 0;
-	external_group_id = strtol(external_group_id_ptr, NULL, 10);
+	ext_id = strtol(ext_id_ptr, NULL, 10);
 	if (errno != 0) {
 		purple_notify_error(gc, _("Error"),
 				_("You entered a group ID outside the acceptable range"), NULL);
 		return;
 	}
 
-	group = qq_group_find_by_id(gc, external_group_id, QQ_EXTERNAL_ID);
+	group = qq_room_search_ext_id(gc, ext_id);
 	if (group) {
 		qq_send_cmd_group_join_group(gc, group);
 	} else {
-		qq_set_pending_id(&qd->joining_groups, external_group_id, TRUE);
-		qq_send_cmd_group_search_group(gc, external_group_id);
+		qq_set_pending_id(&qd->joining_groups, ext_id, TRUE);
+		qq_send_cmd_group_search_group(gc, ext_id);
 	}
 }
 
 void qq_group_exit(PurpleConnection *gc, GHashTable *data)
 {
-	gchar *internal_group_id_ptr;
-	guint32 internal_group_id;
+	gchar *id_ptr;
+	guint32 id;
 	gc_and_uid *g;
 
 	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);
+	id_ptr = g_hash_table_lookup(data, QQ_GROUP_KEY_INTERNAL_ID);
+	id = strtol(id_ptr, NULL, 10);
 
-	g_return_if_fail(internal_group_id > 0);
+	g_return_if_fail(id > 0);
 
 	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"),
 			    _("Are you sure you want to leave this Qun?"),