Mercurial > pidgin.yaz
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 } |