comparison libpurple/protocols/qq/qq_trans.c @ 24094:b67eb6f3f026

disapproval of revision '5688199e261449d33b5803dafff50d860896ebcb'
author Daniel Atallah <daniel.atallah@gmail.com>
date Mon, 15 Sep 2008 03:03:49 +0000
parents 5f964757f517
children fb8204e956a1
comparison
equal deleted inserted replaced
24091:5f964757f517 24094:b67eb6f3f026
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 4 /* max resend per packet */ 38 #define QQ_RESEND_MAX 3 /* 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*/
45 }; 44 };
46 45
47 struct _qq_transaction { 46 struct _qq_transaction {
48 guint8 flag; 47 guint8 flag;
49 guint16 seq; 48 guint16 seq;
61 gint scan_times; 60 gint scan_times;
62 61
63 gint update_class; 62 gint update_class;
64 guint32 ship32; 63 guint32 ship32;
65 }; 64 };
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 }
66 101
67 gboolean qq_trans_is_server(qq_transaction *trans) 102 gboolean qq_trans_is_server(qq_transaction *trans)
68 { 103 {
69 g_return_val_if_fail(trans != NULL, FALSE); 104 g_return_val_if_fail(trans != NULL, FALSE);
70 105
138 173
139 /* Remove a packet with seq from send trans */ 174 /* Remove a packet with seq from send trans */
140 static void trans_remove(PurpleConnection *gc, qq_transaction *trans) 175 static void trans_remove(PurpleConnection *gc, qq_transaction *trans)
141 { 176 {
142 qq_data *qd = (qq_data *)gc->proto_data; 177 qq_data *qd = (qq_data *)gc->proto_data;
143 178 g_return_if_fail(qd != NULL && trans != NULL);
144 g_return_if_fail(gc != NULL && gc->proto_data != NULL); 179
145 qd = (qq_data *) gc->proto_data;
146
147 g_return_if_fail(trans != NULL);
148 #if 0 180 #if 0
149 purple_debug_info("QQ_TRANS", 181 purple_debug_info("QQ_TRANS",
150 "Remove [%s%05d] retry %d rcved %d scan %d %s\n", 182 "Remove [%s%05d] retry %d rcved %d scan %d %s\n",
151 (trans->flag & QQ_TRANS_IS_SERVER) ? "SRV-" : "", 183 (trans->flag & QQ_TRANS_IS_SERVER) ? "SRV-" : "",
152 trans->seq, 184 trans->seq,
156 if (trans->data) g_free(trans->data); 188 if (trans->data) g_free(trans->data);
157 qd->transactions = g_list_remove(qd->transactions, trans); 189 qd->transactions = g_list_remove(qd->transactions, trans);
158 g_free(trans); 190 g_free(trans);
159 } 191 }
160 192
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
182 void qq_trans_add_client_cmd(PurpleConnection *gc, 193 void qq_trans_add_client_cmd(PurpleConnection *gc,
183 guint16 cmd, guint16 seq, guint8 *data, gint data_len, gint update_class, guint32 ship32) 194 guint16 cmd, guint16 seq, guint8 *data, gint data_len, gint update_class, guint32 ship32)
184 { 195 {
185 qq_data *qd = (qq_data *)gc->proto_data; 196 qq_data *qd = (qq_data *)gc->proto_data;
186 qq_transaction *trans = trans_create(gc, qd->fd, cmd, seq, data, data_len, update_class, ship32); 197 qq_transaction *trans = trans_create(gc, qd->fd, cmd, seq, data, data_len, update_class, ship32);
192 #if 0 203 #if 0
193 purple_debug_info("QQ_TRANS", "Add client cmd, seq %d, data %p, len %d\n", 204 purple_debug_info("QQ_TRANS", "Add client cmd, seq %d, data %p, len %d\n",
194 trans->seq, trans->data, trans->data_len); 205 trans->seq, trans->data, trans->data_len);
195 #endif 206 #endif
196 qd->transactions = g_list_append(qd->transactions, trans); 207 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;
219 } 208 }
220 209
221 void qq_trans_add_room_cmd(PurpleConnection *gc, 210 void qq_trans_add_room_cmd(PurpleConnection *gc,
222 guint16 seq, guint8 room_cmd, guint32 room_id, guint8 *data, gint data_len, 211 guint16 seq, guint8 room_cmd, guint32 room_id, guint8 *data, gint data_len,
223 gint update_class, guint32 ship32) 212 gint update_class, guint32 ship32)
235 #endif 224 #endif
236 qd->transactions = g_list_append(qd->transactions, trans); 225 qd->transactions = g_list_append(qd->transactions, trans);
237 } 226 }
238 227
239 void qq_trans_add_server_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq, 228 void qq_trans_add_server_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq,
240 guint8 *rcved, gint rcved_len) 229 guint8 *data, gint data_len)
241 { 230 {
242 qq_data *qd = (qq_data *)gc->proto_data; 231 qq_data *qd = (qq_data *)gc->proto_data;
243 qq_transaction *trans = trans_create(gc, qd->fd, cmd, seq, rcved, rcved_len, QQ_CMD_CLASS_NONE, 0); 232 qq_transaction *trans = trans_create(gc, qd->fd, cmd, seq, data, data_len, QQ_CMD_CLASS_NONE, 0);
244 233
245 trans->flag = QQ_TRANS_IS_SERVER; 234 trans->flag = QQ_TRANS_IS_SERVER;
246 trans->send_retries = 0; 235 trans->send_retries = 0;
247 trans->rcved_times = 1; 236 trans->rcved_times = 1;
248 #if 0 237 #if 0
249 purple_debug_info("QQ_TRANS", "Add server cmd, seq %d, data %p, len %d\n", 238 purple_debug_info("QQ_TRANS", "Add server cmd, seq %d, data %p, len %d\n",
250 trans->seq, trans->data, trans->data_len); 239 trans->seq, trans->data, trans->data_len);
251 #endif 240 #endif
252 qd->transactions = g_list_append(qd->transactions, trans); 241 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;
274 } 242 }
275 243
276 void qq_trans_add_remain(PurpleConnection *gc, guint16 cmd, guint16 seq, 244 void qq_trans_add_remain(PurpleConnection *gc, guint16 cmd, guint16 seq,
277 guint8 *data, gint data_len) 245 guint8 *data, gint data_len)
278 { 246 {
379 trans->data, trans->data_len, trans->send_retries); 347 trans->data, trans->data_len, trans->send_retries);
380 trans_remove(gc, trans); 348 trans_remove(gc, trans);
381 continue; 349 continue;
382 } 350 }
383 351
384 purple_debug_warning("QQ_TRANS", 352 purple_debug_error("QQ_TRANS",
385 "Resend [%d] %s data %p, len %d, send_retries %d\n", 353 "Resend [%d] %s data %p, len %d, send_retries %d\n",
386 trans->seq, qq_get_cmd_desc(trans->cmd), 354 trans->seq, qq_get_cmd_desc(trans->cmd),
387 trans->data, trans->data_len, trans->send_retries); 355 trans->data, trans->data_len, trans->send_retries);
388 qq_send_cmd_encrypted(gc, trans->cmd, trans->seq, trans->data, trans->data_len, FALSE); 356 qq_send_cmd_encrypted(gc, trans->cmd, trans->seq, trans->data, trans->data_len, FALSE);
389 } 357 }