Mercurial > pidgin
comparison libpurple/protocols/qq/qq_process.c @ 23879:23cec4360d4a
applied changes from 8cebefbc6cd5d84acb69c74e69e8821f11dd225d
through 92d52eef2994d2697999177804e3665989cfa352
Reapplied 92d52eef2994d2697999177804e3665989cfa352 at the right time.
2008.09.02 - ccpaging <ccpaging(at)gmail.com>
* Bugfix: can not send message to the QUN blocked adding
* Tickets:
Fixes #6957
Fixes #6990
2008.09.02 - ccpaging <ccpaging(at)gmail.com>
* Use new tactics of information update:
1. send next package till the previous package received
2. fix duplicated get_room_info and get_room_buddies command
committer: Daniel Atallah <daniel.atallah@gmail.com>
author | SHiNE CsyFeK <csyfek@gmail.com> |
---|---|
date | Mon, 15 Sep 2008 03:01:03 +0000 |
parents | 967344bc404d |
children | 1a0caf9983fa |
comparison
equal
deleted
inserted
replaced
23878:967344bc404d | 23879:23cec4360d4a |
---|---|
58 QQ_ROOM_CMD_REPLY_SEARCH_ERROR = 0x02, | 58 QQ_ROOM_CMD_REPLY_SEARCH_ERROR = 0x02, |
59 QQ_ROOM_CMD_REPLY_NOT_MEMBER = 0x0a | 59 QQ_ROOM_CMD_REPLY_NOT_MEMBER = 0x0a |
60 }; | 60 }; |
61 | 61 |
62 /* default process, decrypt and dump */ | 62 /* default process, decrypt and dump */ |
63 static void process_cmd_unknow(PurpleConnection *gc,gchar *title, guint8 *data, gint data_len, guint16 cmd, guint16 seq) | 63 static void process_cmd_unknow(PurpleConnection *gc,const gchar *title, guint8 *data, gint data_len, guint16 cmd, guint16 seq) |
64 { | 64 { |
65 qq_data *qd; | 65 qq_data *qd; |
66 gchar *msg_utf8 = NULL; | 66 gchar *msg_utf8 = NULL; |
67 | 67 |
68 g_return_if_fail(data != NULL && data_len != 0); | 68 g_return_if_fail(data != NULL && data_len != 0); |
75 data, data_len, | 75 data, data_len, |
76 ">>> [%d] %s -> [default] decrypt and dump", | 76 ">>> [%d] %s -> [default] decrypt and dump", |
77 seq, qq_get_cmd_desc(cmd)); | 77 seq, qq_get_cmd_desc(cmd)); |
78 | 78 |
79 msg_utf8 = try_dump_as_gbk(data, data_len); | 79 msg_utf8 = try_dump_as_gbk(data, data_len); |
80 if (msg_utf8) { | 80 if (msg_utf8 != NULL) { |
81 purple_notify_info(gc, NULL, msg_utf8, NULL); | 81 purple_notify_info(gc, title, msg_utf8, NULL); |
82 g_free(msg_utf8); | 82 g_free(msg_utf8); |
83 } | 83 } |
84 } | 84 } |
85 | 85 |
86 void qq_proc_cmd_server(PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *rcved, gint rcved_len) | 86 void qq_proc_server_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *rcved, gint rcved_len) |
87 { | 87 { |
88 qq_data *qd; | 88 qq_data *qd; |
89 | 89 |
90 guint8 *data; | 90 guint8 *data; |
91 gint data_len; | 91 gint data_len; |
120 break; | 120 break; |
121 case QQ_CMD_BUDDY_CHANGE_STATUS: | 121 case QQ_CMD_BUDDY_CHANGE_STATUS: |
122 qq_process_buddy_change_status(data, data_len, gc); | 122 qq_process_buddy_change_status(data, data_len, gc); |
123 break; | 123 break; |
124 default: | 124 default: |
125 process_cmd_unknow(gc, "Unknow SERVER CMD", data, data_len, cmd, seq); | 125 process_cmd_unknow(gc, _("Unknow SERVER CMD"), data, data_len, cmd, seq); |
126 break; | 126 break; |
127 } | 127 } |
128 } | 128 } |
129 | 129 |
130 static void process_room_cmd_notify(PurpleConnection *gc, | 130 static void process_room_cmd_notify(PurpleConnection *gc, |
143 purple_notify_error(gc, NULL, _("Invalid QQ Qun reply"), msg); | 143 purple_notify_error(gc, NULL, _("Invalid QQ Qun reply"), msg); |
144 g_free(msg); | 144 g_free(msg); |
145 g_free(msg_utf8); | 145 g_free(msg_utf8); |
146 } | 146 } |
147 | 147 |
148 void qq_room_update(PurpleConnection *gc, guint8 room_cmd, guint32 room_id) | 148 void qq_update_room(PurpleConnection *gc, guint8 room_cmd, guint32 room_id) |
149 { | 149 { |
150 qq_data *qd; | 150 qq_data *qd; |
151 qq_group *group; | 151 qq_group *group; |
152 gint ret; | 152 gint ret; |
153 | 153 |
196 g_return_if_fail (gc != NULL && gc->proto_data != NULL); | 196 g_return_if_fail (gc != NULL && gc->proto_data != NULL); |
197 qd = (qq_data *) gc->proto_data; | 197 qd = (qq_data *) gc->proto_data; |
198 | 198 |
199 next_group = qq_room_get_next(gc, room_id); | 199 next_group = qq_room_get_next(gc, room_id); |
200 if (next_group == NULL && room_id <= 0) { | 200 if (next_group == NULL && room_id <= 0) { |
201 purple_debug_info("QQ", "No room, nothing update\n"); | 201 purple_debug_info("QQ", "No room. Finished update\n"); |
202 qd->is_finish_update = TRUE; | |
203 return; | 202 return; |
204 } | 203 } |
205 if (next_group == NULL ) { | 204 if (next_group == NULL ) { |
206 is_new_turn = TRUE; | 205 is_new_turn = TRUE; |
207 next_group = qq_room_get_next(gc, 0); | 206 next_group = qq_room_get_next(gc, 0); |
224 case QQ_ROOM_CMD_GET_BUDDIES: | 223 case QQ_ROOM_CMD_GET_BUDDIES: |
225 /* last command */ | 224 /* last command */ |
226 if (!is_new_turn) { | 225 if (!is_new_turn) { |
227 qq_request_room_get_buddies(gc, next_group, QQ_CMD_CLASS_UPDATE_ALL); | 226 qq_request_room_get_buddies(gc, next_group, QQ_CMD_CLASS_UPDATE_ALL); |
228 } else { | 227 } else { |
229 qd->is_finish_update = TRUE; | 228 purple_debug_info("QQ", "Finished update\n"); |
230 } | 229 } |
231 break; | 230 break; |
232 default: | 231 default: |
233 break; | 232 break; |
234 } | 233 } |
243 | 242 |
244 switch (cmd) { | 243 switch (cmd) { |
245 case 0: | 244 case 0: |
246 qq_request_buddy_info(gc, qd->uid, QQ_CMD_CLASS_UPDATE_ALL, QQ_BUDDY_INFO_UPDATE_ONLY); | 245 qq_request_buddy_info(gc, qd->uid, QQ_CMD_CLASS_UPDATE_ALL, QQ_BUDDY_INFO_UPDATE_ONLY); |
247 break; | 246 break; |
248 case QQ_CMD_GET_USER_INFO: | 247 case QQ_CMD_GET_BUDDY_INFO: |
249 qq_request_change_status(gc, QQ_CMD_CLASS_UPDATE_ALL); | 248 qq_request_change_status(gc, QQ_CMD_CLASS_UPDATE_ALL); |
250 break; | 249 break; |
251 case QQ_CMD_CHANGE_STATUS: | 250 case QQ_CMD_CHANGE_STATUS: |
252 qq_request_get_buddies_list(gc, 0, QQ_CMD_CLASS_UPDATE_ALL); | 251 qq_request_get_buddies_list(gc, 0, QQ_CMD_CLASS_UPDATE_ALL); |
253 break; | 252 break; |
254 case QQ_CMD_GET_BUDDIES_LIST: | 253 case QQ_CMD_GET_BUDDIES_LIST: |
255 qq_request_get_buddies_and_rooms(gc, 0, QQ_CMD_CLASS_UPDATE_ALL); | 254 qq_request_get_buddies_and_rooms(gc, 0, QQ_CMD_CLASS_UPDATE_ALL); |
256 break; | 255 break; |
257 case QQ_CMD_GET_BUDDIES_AND_ROOMS: | 256 case QQ_CMD_GET_BUDDIES_AND_ROOMS: |
258 qq_request_get_buddies_levels(gc, QQ_CMD_CLASS_UPDATE_ALL); | 257 qq_request_get_buddies_level(gc, QQ_CMD_CLASS_UPDATE_ALL); |
259 break; | 258 break; |
260 case QQ_CMD_GET_LEVEL: | 259 case QQ_CMD_GET_LEVEL: |
261 qq_request_get_buddies_online(gc, 0, QQ_CMD_CLASS_UPDATE_ALL); | 260 qq_request_get_buddies_online(gc, 0, QQ_CMD_CLASS_UPDATE_ALL); |
262 break; | 261 break; |
263 case QQ_CMD_GET_BUDDIES_ONLINE: | 262 case QQ_CMD_GET_BUDDIES_ONLINE: |
277 g_return_if_fail (gc != NULL && gc->proto_data != NULL); | 276 g_return_if_fail (gc != NULL && gc->proto_data != NULL); |
278 qd = (qq_data *) gc->proto_data; | 277 qd = (qq_data *) gc->proto_data; |
279 | 278 |
280 next_group = qq_room_get_next_conv(gc, room_id); | 279 next_group = qq_room_get_next_conv(gc, room_id); |
281 if (next_group == NULL && room_id <= 0) { | 280 if (next_group == NULL && room_id <= 0) { |
282 purple_debug_info("QQ", "No room, no update online buddies\n"); | 281 purple_debug_info("QQ", "No room in conversation, no update online buddies\n"); |
283 return; | 282 return; |
284 } | 283 } |
285 if (next_group == NULL ) { | 284 if (next_group == NULL ) { |
286 purple_debug_info("QQ", "finished update online buddies\n"); | 285 purple_debug_info("QQ", "finished update rooms' online buddies\n"); |
287 return; | 286 return; |
288 } | 287 } |
289 | 288 |
290 switch (room_cmd) { | 289 switch (room_cmd) { |
291 case 0: | 290 case 0: |
314 default: | 313 default: |
315 break; | 314 break; |
316 } | 315 } |
317 } | 316 } |
318 | 317 |
319 void qq_proc_room_cmd_reply(PurpleConnection *gc, guint16 seq, | 318 void qq_proc_room_cmd(PurpleConnection *gc, guint16 seq, |
320 guint8 room_cmd, guint32 room_id, guint8 *rcved, gint rcved_len, | 319 guint8 room_cmd, guint32 room_id, guint8 *rcved, gint rcved_len, |
321 gint update_class, guint32 ship32) | 320 gint update_class, guint32 ship32) |
322 { | 321 { |
323 qq_data *qd; | 322 qq_data *qd; |
324 guint8 *data; | 323 guint8 *data; |
443 default: | 442 default: |
444 purple_debug_warning("QQ", "Unknow room cmd 0x%02X %s\n", | 443 purple_debug_warning("QQ", "Unknow room cmd 0x%02X %s\n", |
445 reply_cmd, qq_get_room_cmd_desc(reply_cmd)); | 444 reply_cmd, qq_get_room_cmd_desc(reply_cmd)); |
446 } | 445 } |
447 | 446 |
447 if (update_class == QQ_CMD_CLASS_NONE) | |
448 return; | |
449 | |
448 purple_debug_info("QQ", "Update class %d\n", update_class); | 450 purple_debug_info("QQ", "Update class %d\n", update_class); |
449 if (update_class == QQ_CMD_CLASS_UPDATE_ALL) { | 451 if (update_class == QQ_CMD_CLASS_UPDATE_ALL) { |
450 update_all_rooms(gc, room_cmd, room_id); | 452 update_all_rooms(gc, room_cmd, room_id); |
451 return; | 453 return; |
452 } | 454 } |
453 if (update_class == QQ_CMD_CLASS_UPDATE_ONLINE) { | 455 if (update_class == QQ_CMD_CLASS_UPDATE_ONLINE) { |
454 update_all_rooms_online(gc, room_cmd, room_id); | 456 update_all_rooms_online(gc, room_cmd, room_id); |
455 return; | 457 return; |
456 } | 458 } |
457 if (update_class == QQ_CMD_CLASS_UPDATE_ROOM) { | 459 if (update_class == QQ_CMD_CLASS_UPDATE_ROOM) { |
458 qq_room_update(gc, room_cmd, room_id); | 460 qq_update_room(gc, room_cmd, room_id); |
459 } | 461 } |
460 } | 462 } |
461 | 463 |
462 void qq_proc_cmd_login(PurpleConnection *gc, guint8 *rcved, gint rcved_len) | 464 void qq_proc_login_cmd(PurpleConnection *gc, guint8 *rcved, gint rcved_len) |
463 { | 465 { |
464 qq_data *qd; | 466 qq_data *qd; |
465 guint8 *data; | 467 guint8 *data; |
466 gint data_len; | 468 gint data_len; |
467 guint ret_8; | 469 guint ret_8; |
501 qq_group_init(gc); | 503 qq_group_init(gc); |
502 | 504 |
503 /* Now goes on updating my icon/nickname, not showing info_window */ | 505 /* Now goes on updating my icon/nickname, not showing info_window */ |
504 qd->modifying_face = FALSE; | 506 qd->modifying_face = FALSE; |
505 | 507 |
508 /* is_login, but we have packets before login */ | |
509 qq_trans_process_remained(gc); | |
510 | |
506 qq_update_all(gc, 0); | 511 qq_update_all(gc, 0); |
507 return; | 512 return; |
508 } | 513 } |
509 | 514 |
510 void qq_proc_cmd_reply(PurpleConnection *gc, guint16 cmd, guint16 seq, | 515 void qq_proc_client_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq, |
511 guint8 *rcved, gint rcved_len, gint update_class, guint32 ship32) | 516 guint8 *rcved, gint rcved_len, gint update_class, guint32 ship32) |
512 { | 517 { |
513 qq_data *qd; | 518 qq_data *qd; |
514 | 519 |
515 guint8 *data; | 520 guint8 *data; |
557 qq_process_remove_self_reply(data, data_len, gc); | 562 qq_process_remove_self_reply(data, data_len, gc); |
558 break; | 563 break; |
559 case QQ_CMD_BUDDY_AUTH: | 564 case QQ_CMD_BUDDY_AUTH: |
560 qq_process_add_buddy_auth_reply(data, data_len, gc); | 565 qq_process_add_buddy_auth_reply(data, data_len, gc); |
561 break; | 566 break; |
562 case QQ_CMD_GET_USER_INFO: | 567 case QQ_CMD_GET_BUDDY_INFO: |
563 qq_process_get_info_reply(data, data_len, gc); | 568 qq_process_get_buddy_info(data, data_len, gc); |
564 break; | 569 break; |
565 case QQ_CMD_CHANGE_STATUS: | 570 case QQ_CMD_CHANGE_STATUS: |
566 qq_process_change_status_reply(data, data_len, gc); | 571 qq_process_change_status_reply(data, data_len, gc); |
567 break; | 572 break; |
568 case QQ_CMD_SEND_IM: | 573 case QQ_CMD_SEND_IM: |
601 return; | 606 return; |
602 } | 607 } |
603 purple_debug_info("QQ", "All buddies and groups received\n"); | 608 purple_debug_info("QQ", "All buddies and groups received\n"); |
604 break; | 609 break; |
605 default: | 610 default: |
606 process_cmd_unknow(gc, "Unknow reply CMD", data, data_len, cmd, seq); | 611 process_cmd_unknow(gc, _("Unknow reply CMD"), data, data_len, cmd, seq); |
607 is_unknow = TRUE; | 612 is_unknow = TRUE; |
608 break; | 613 break; |
609 } | 614 } |
610 if (is_unknow) | 615 if (is_unknow) |
611 return; | 616 return; |