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