diff libpurple/protocols/qq/qq_trans.c @ 23756:1a0caf9983fa

applied changes from 92d52eef2994d2697999177804e3665989cfa352 through 5688199e261449d33b5803dafff50d860896ebcb Reapplied 5688199e261449d33b5803dafff50d860896ebcb. 2008.09.04 - ccpaging <ccpaging(at)gmail.com> * minor code cleaned committer: Daniel Atallah <daniel.atallah@gmail.com>
author SHiNE CsyFeK <csyfek@gmail.com>
date Mon, 15 Sep 2008 03:02:06 +0000
parents 23cec4360d4a
children 69c218fd5d54 b67eb6f3f026
line wrap: on
line diff
--- a/libpurple/protocols/qq/qq_trans.c	Mon Sep 15 03:01:03 2008 +0000
+++ b/libpurple/protocols/qq/qq_trans.c	Mon Sep 15 03:02:06 2008 +0000
@@ -35,12 +35,13 @@
 #include "qq_process.h"
 #include "qq_trans.h"
 
-#define QQ_RESEND_MAX               3	/* max resend per packet */
+#define QQ_RESEND_MAX               4	/* max resend per packet */
 
 enum {
 	QQ_TRANS_IS_SERVER = 0x01,			/* Is server command or client command */
 	QQ_TRANS_IS_IMPORT = 0x02,			/* Only notice if not get reply; or resend, disconn if reties get 0*/
-	QQ_TRANS_REMAINED = 0x04,		/* server command before login*/
+	QQ_TRANS_REMAINED = 0x04,				/* server command before login*/
+	QQ_TRANS_IS_REPLY = 0x08,				/* server command before login*/
 };
 
 struct _qq_transaction {
@@ -63,42 +64,6 @@
 	guint32 ship32;
 };
 
-qq_transaction *qq_trans_find_rcved(PurpleConnection *gc, guint16 cmd, guint16 seq)
-{
-	qq_data *qd = (qq_data *)gc->proto_data;
-	GList *curr;
-	GList *next;
-	qq_transaction *trans;
-
-	if (qd->transactions == NULL) {
-		return NULL;
-	}
-
-	next = qd->transactions;
-	while( (curr = next) ) {
-		next = curr->next;
-
-		trans = (qq_transaction *) (curr->data);
-		if(trans->cmd == cmd && trans->seq == seq) {
-			if (trans->rcved_times == 0) {
-				trans->scan_times = 0;
-			}
-			trans->rcved_times++;
-			/* server may not get our confirm reply before, send reply again*/
-			/* only rcved buffer stored in transaction
-			if (qq_trans_is_server(trans) && qq_trans_is_dup(trans)) {
-				if (trans->data != NULL && trans->data_len > 0) {
-					qq_send_cmd_encrypted(gc, trans->cmd, trans->seq, trans->data, trans->data_len, FALSE);
-				}
-			}
-			*/
-			return trans;
-		}
-	}
-
-	return NULL;
-}
-
 gboolean qq_trans_is_server(qq_transaction *trans)
 {
 	g_return_val_if_fail(trans != NULL, FALSE);
@@ -175,8 +140,11 @@
 static void trans_remove(PurpleConnection *gc, qq_transaction *trans)
 {
 	qq_data *qd = (qq_data *)gc->proto_data;
-	g_return_if_fail(qd != NULL && trans != NULL);
 
+	g_return_if_fail(gc != NULL && gc->proto_data != NULL);
+	qd = (qq_data *) gc->proto_data;
+
+	g_return_if_fail(trans != NULL);
 #if 0
 	purple_debug_info("QQ_TRANS",
 				"Remove [%s%05d] retry %d rcved %d scan %d %s\n",
@@ -190,6 +158,27 @@
 	g_free(trans);
 }
 
+static qq_transaction *trans_find(PurpleConnection *gc, guint16 cmd, guint16 seq)
+{
+	qq_data *qd;
+	GList *list;
+	qq_transaction *trans;
+
+	g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL);
+	qd = (qq_data *) gc->proto_data;
+
+	list = qd->transactions;
+	while (list != NULL) {
+		trans = (qq_transaction *) list->data;
+		if(trans->cmd == cmd && trans->seq == seq) {
+			return trans;
+		}
+		list = list->next;
+	}
+
+	return NULL;
+}
+
 void qq_trans_add_client_cmd(PurpleConnection *gc,
 	guint16 cmd, guint16 seq, guint8 *data, gint data_len, gint update_class, guint32 ship32)
 {
@@ -207,6 +196,28 @@
 	qd->transactions = g_list_append(qd->transactions, trans);
 }
 
+qq_transaction *qq_trans_find_rcved(PurpleConnection *gc, guint16 cmd, guint16 seq)
+{
+	qq_transaction *trans;
+
+	trans = trans_find(gc, cmd, seq);
+	if (trans == NULL) {
+		return NULL;
+	}
+
+	if (trans->rcved_times == 0) {
+		trans->scan_times = 0;
+	}
+	trans->rcved_times++;
+	/* server may not get our confirm reply before, send reply again*/
+	if (qq_trans_is_server(trans) && (trans->flag & QQ_TRANS_IS_REPLY)) {
+		if (trans->data != NULL && trans->data_len > 0) {
+			qq_send_cmd_encrypted(gc, trans->cmd, trans->seq, trans->data, trans->data_len, FALSE);
+		}
+	}
+	return trans;
+}
+
 void qq_trans_add_room_cmd(PurpleConnection *gc,
 		guint16 seq, guint8 room_cmd, guint32 room_id, guint8 *data, gint data_len,
 		gint update_class, guint32 ship32)
@@ -226,10 +237,10 @@
 }
 
 void qq_trans_add_server_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq,
-		guint8 *data, gint data_len)
+		guint8 *rcved, gint rcved_len)
 {
 	qq_data *qd = (qq_data *)gc->proto_data;
-	qq_transaction *trans = trans_create(gc, qd->fd, cmd, seq, data, data_len, QQ_CMD_CLASS_NONE, 0);
+	qq_transaction *trans = trans_create(gc, qd->fd, cmd, seq, rcved, rcved_len, QQ_CMD_CLASS_NONE, 0);
 
 	trans->flag = QQ_TRANS_IS_SERVER;
 	trans->send_retries = 0;
@@ -241,6 +252,27 @@
 	qd->transactions = g_list_append(qd->transactions, trans);
 }
 
+void qq_trans_add_server_reply(PurpleConnection *gc, guint16 cmd, guint16 seq,
+		guint8 *reply, gint reply_len)
+{
+	qq_transaction *trans;
+
+	g_return_if_fail(reply != NULL && reply_len > 0);
+
+	trans = trans_find(gc, cmd, seq);
+	if (trans == NULL) {
+		return;
+	}
+
+	g_return_if_fail(trans->flag & QQ_TRANS_IS_SERVER);
+	trans->flag |= QQ_TRANS_IS_REPLY;
+
+	if (trans->data)	g_free(trans->data);
+
+	trans->data = g_memdup(reply, reply_len);
+	trans->data_len = reply_len;
+}
+
 void qq_trans_add_remain(PurpleConnection *gc, guint16 cmd, guint16 seq,
 		guint8 *data, gint data_len)
 {
@@ -349,7 +381,7 @@
 			continue;
 		}
 
-		purple_debug_error("QQ_TRANS",
+		purple_debug_warning("QQ_TRANS",
 				"Resend [%d] %s data %p, len %d, send_retries %d\n",
 				trans->seq, qq_get_cmd_desc(trans->cmd),
 				trans->data, trans->data_len, trans->send_retries);