comparison 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
comparison
equal deleted inserted replaced
23755:23cec4360d4a 23756:1a0caf9983fa
33 #include "header_info.h" 33 #include "header_info.h"
34 #include "qq_network.h" 34 #include "qq_network.h"
35 #include "qq_process.h" 35 #include "qq_process.h"
36 #include "qq_trans.h" 36 #include "qq_trans.h"
37 37
38 #define QQ_RESEND_MAX 3 /* max resend per packet */ 38 #define QQ_RESEND_MAX 4 /* max resend per packet */
39 39
40 enum { 40 enum {
41 QQ_TRANS_IS_SERVER = 0x01, /* Is server command or client command */ 41 QQ_TRANS_IS_SERVER = 0x01, /* Is server command or client command */
42 QQ_TRANS_IS_IMPORT = 0x02, /* Only notice if not get reply; or resend, disconn if reties get 0*/ 42 QQ_TRANS_IS_IMPORT = 0x02, /* Only notice if not get reply; or resend, disconn if reties get 0*/
43 QQ_TRANS_REMAINED = 0x04, /* server command before login*/ 43 QQ_TRANS_REMAINED = 0x04, /* server command before login*/
44 QQ_TRANS_IS_REPLY = 0x08, /* server command before login*/
44 }; 45 };
45 46
46 struct _qq_transaction { 47 struct _qq_transaction {
47 guint8 flag; 48 guint8 flag;
48 guint16 seq; 49 guint16 seq;
60 gint scan_times; 61 gint scan_times;
61 62
62 gint update_class; 63 gint update_class;
63 guint32 ship32; 64 guint32 ship32;
64 }; 65 };
65
66 qq_transaction *qq_trans_find_rcved(PurpleConnection *gc, guint16 cmd, guint16 seq)
67 {
68 qq_data *qd = (qq_data *)gc->proto_data;
69 GList *curr;
70 GList *next;
71 qq_transaction *trans;
72
73 if (qd->transactions == NULL) {
74 return NULL;
75 }
76
77 next = qd->transactions;
78 while( (curr = next) ) {
79 next = curr->next;
80
81 trans = (qq_transaction *) (curr->data);
82 if(trans->cmd == cmd && trans->seq == seq) {
83 if (trans->rcved_times == 0) {
84 trans->scan_times = 0;
85 }
86 trans->rcved_times++;
87 /* server may not get our confirm reply before, send reply again*/
88 /* only rcved buffer stored in transaction
89 if (qq_trans_is_server(trans) && qq_trans_is_dup(trans)) {
90 if (trans->data != NULL && trans->data_len > 0) {
91 qq_send_cmd_encrypted(gc, trans->cmd, trans->seq, trans->data, trans->data_len, FALSE);
92 }
93 }
94 */
95 return trans;
96 }
97 }
98
99 return NULL;
100 }
101 66
102 gboolean qq_trans_is_server(qq_transaction *trans) 67 gboolean qq_trans_is_server(qq_transaction *trans)
103 { 68 {
104 g_return_val_if_fail(trans != NULL, FALSE); 69 g_return_val_if_fail(trans != NULL, FALSE);
105 70
173 138
174 /* Remove a packet with seq from send trans */ 139 /* Remove a packet with seq from send trans */
175 static void trans_remove(PurpleConnection *gc, qq_transaction *trans) 140 static void trans_remove(PurpleConnection *gc, qq_transaction *trans)
176 { 141 {
177 qq_data *qd = (qq_data *)gc->proto_data; 142 qq_data *qd = (qq_data *)gc->proto_data;
178 g_return_if_fail(qd != NULL && trans != NULL); 143
179 144 g_return_if_fail(gc != NULL && gc->proto_data != NULL);
145 qd = (qq_data *) gc->proto_data;
146
147 g_return_if_fail(trans != NULL);
180 #if 0 148 #if 0
181 purple_debug_info("QQ_TRANS", 149 purple_debug_info("QQ_TRANS",
182 "Remove [%s%05d] retry %d rcved %d scan %d %s\n", 150 "Remove [%s%05d] retry %d rcved %d scan %d %s\n",
183 (trans->flag & QQ_TRANS_IS_SERVER) ? "SRV-" : "", 151 (trans->flag & QQ_TRANS_IS_SERVER) ? "SRV-" : "",
184 trans->seq, 152 trans->seq,
188 if (trans->data) g_free(trans->data); 156 if (trans->data) g_free(trans->data);
189 qd->transactions = g_list_remove(qd->transactions, trans); 157 qd->transactions = g_list_remove(qd->transactions, trans);
190 g_free(trans); 158 g_free(trans);
191 } 159 }
192 160
161 static qq_transaction *trans_find(PurpleConnection *gc, guint16 cmd, guint16 seq)
162 {
163 qq_data *qd;
164 GList *list;
165 qq_transaction *trans;
166
167 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL);
168 qd = (qq_data *) gc->proto_data;
169
170 list = qd->transactions;
171 while (list != NULL) {
172 trans = (qq_transaction *) list->data;
173 if(trans->cmd == cmd && trans->seq == seq) {
174 return trans;
175 }
176 list = list->next;
177 }
178
179 return NULL;
180 }
181
193 void qq_trans_add_client_cmd(PurpleConnection *gc, 182 void qq_trans_add_client_cmd(PurpleConnection *gc,
194 guint16 cmd, guint16 seq, guint8 *data, gint data_len, gint update_class, guint32 ship32) 183 guint16 cmd, guint16 seq, guint8 *data, gint data_len, gint update_class, guint32 ship32)
195 { 184 {
196 qq_data *qd = (qq_data *)gc->proto_data; 185 qq_data *qd = (qq_data *)gc->proto_data;
197 qq_transaction *trans = trans_create(gc, qd->fd, cmd, seq, data, data_len, update_class, ship32); 186 qq_transaction *trans = trans_create(gc, qd->fd, cmd, seq, data, data_len, update_class, ship32);
203 #if 0 192 #if 0
204 purple_debug_info("QQ_TRANS", "Add client cmd, seq %d, data %p, len %d\n", 193 purple_debug_info("QQ_TRANS", "Add client cmd, seq %d, data %p, len %d\n",
205 trans->seq, trans->data, trans->data_len); 194 trans->seq, trans->data, trans->data_len);
206 #endif 195 #endif
207 qd->transactions = g_list_append(qd->transactions, trans); 196 qd->transactions = g_list_append(qd->transactions, trans);
197 }
198
199 qq_transaction *qq_trans_find_rcved(PurpleConnection *gc, guint16 cmd, guint16 seq)
200 {
201 qq_transaction *trans;
202
203 trans = trans_find(gc, cmd, seq);
204 if (trans == NULL) {
205 return NULL;
206 }
207
208 if (trans->rcved_times == 0) {
209 trans->scan_times = 0;
210 }
211 trans->rcved_times++;
212 /* server may not get our confirm reply before, send reply again*/
213 if (qq_trans_is_server(trans) && (trans->flag & QQ_TRANS_IS_REPLY)) {
214 if (trans->data != NULL && trans->data_len > 0) {
215 qq_send_cmd_encrypted(gc, trans->cmd, trans->seq, trans->data, trans->data_len, FALSE);
216 }
217 }
218 return trans;
208 } 219 }
209 220
210 void qq_trans_add_room_cmd(PurpleConnection *gc, 221 void qq_trans_add_room_cmd(PurpleConnection *gc,
211 guint16 seq, guint8 room_cmd, guint32 room_id, guint8 *data, gint data_len, 222 guint16 seq, guint8 room_cmd, guint32 room_id, guint8 *data, gint data_len,
212 gint update_class, guint32 ship32) 223 gint update_class, guint32 ship32)
224 #endif 235 #endif
225 qd->transactions = g_list_append(qd->transactions, trans); 236 qd->transactions = g_list_append(qd->transactions, trans);
226 } 237 }
227 238
228 void qq_trans_add_server_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq, 239 void qq_trans_add_server_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq,
229 guint8 *data, gint data_len) 240 guint8 *rcved, gint rcved_len)
230 { 241 {
231 qq_data *qd = (qq_data *)gc->proto_data; 242 qq_data *qd = (qq_data *)gc->proto_data;
232 qq_transaction *trans = trans_create(gc, qd->fd, cmd, seq, data, data_len, QQ_CMD_CLASS_NONE, 0); 243 qq_transaction *trans = trans_create(gc, qd->fd, cmd, seq, rcved, rcved_len, QQ_CMD_CLASS_NONE, 0);
233 244
234 trans->flag = QQ_TRANS_IS_SERVER; 245 trans->flag = QQ_TRANS_IS_SERVER;
235 trans->send_retries = 0; 246 trans->send_retries = 0;
236 trans->rcved_times = 1; 247 trans->rcved_times = 1;
237 #if 0 248 #if 0
238 purple_debug_info("QQ_TRANS", "Add server cmd, seq %d, data %p, len %d\n", 249 purple_debug_info("QQ_TRANS", "Add server cmd, seq %d, data %p, len %d\n",
239 trans->seq, trans->data, trans->data_len); 250 trans->seq, trans->data, trans->data_len);
240 #endif 251 #endif
241 qd->transactions = g_list_append(qd->transactions, trans); 252 qd->transactions = g_list_append(qd->transactions, trans);
253 }
254
255 void qq_trans_add_server_reply(PurpleConnection *gc, guint16 cmd, guint16 seq,
256 guint8 *reply, gint reply_len)
257 {
258 qq_transaction *trans;
259
260 g_return_if_fail(reply != NULL && reply_len > 0);
261
262 trans = trans_find(gc, cmd, seq);
263 if (trans == NULL) {
264 return;
265 }
266
267 g_return_if_fail(trans->flag & QQ_TRANS_IS_SERVER);
268 trans->flag |= QQ_TRANS_IS_REPLY;
269
270 if (trans->data) g_free(trans->data);
271
272 trans->data = g_memdup(reply, reply_len);
273 trans->data_len = reply_len;
242 } 274 }
243 275
244 void qq_trans_add_remain(PurpleConnection *gc, guint16 cmd, guint16 seq, 276 void qq_trans_add_remain(PurpleConnection *gc, guint16 cmd, guint16 seq,
245 guint8 *data, gint data_len) 277 guint8 *data, gint data_len)
246 { 278 {
347 trans->data, trans->data_len, trans->send_retries); 379 trans->data, trans->data_len, trans->send_retries);
348 trans_remove(gc, trans); 380 trans_remove(gc, trans);
349 continue; 381 continue;
350 } 382 }
351 383
352 purple_debug_error("QQ_TRANS", 384 purple_debug_warning("QQ_TRANS",
353 "Resend [%d] %s data %p, len %d, send_retries %d\n", 385 "Resend [%d] %s data %p, len %d, send_retries %d\n",
354 trans->seq, qq_get_cmd_desc(trans->cmd), 386 trans->seq, qq_get_cmd_desc(trans->cmd),
355 trans->data, trans->data_len, trans->send_retries); 387 trans->data, trans->data_len, trans->send_retries);
356 qq_send_cmd_encrypted(gc, trans->cmd, trans->seq, trans->data, trans->data_len, FALSE); 388 qq_send_cmd_encrypted(gc, trans->cmd, trans->seq, trans->data, trans->data_len, FALSE);
357 } 389 }