comparison libpurple/protocols/qq/qq_process.c @ 24020:2f5a7edd8f68

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
author SHiNE CsyFeK <csyfek@gmail.com>
date Thu, 11 Sep 2008 13:29:26 +0000
parents 147ada94a1d8
children 6408be948d56 5f964757f517
comparison
equal deleted inserted replaced
24019:147ada94a1d8 24020:2f5a7edd8f68
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;
556 qq_process_remove_self_reply(data, data_len, gc); 561 qq_process_remove_self_reply(data, data_len, gc);
557 break; 562 break;
558 case QQ_CMD_BUDDY_AUTH: 563 case QQ_CMD_BUDDY_AUTH:
559 qq_process_add_buddy_auth_reply(data, data_len, gc); 564 qq_process_add_buddy_auth_reply(data, data_len, gc);
560 break; 565 break;
561 case QQ_CMD_GET_USER_INFO: 566 case QQ_CMD_GET_BUDDY_INFO:
562 qq_process_get_info_reply(data, data_len, gc); 567 qq_process_get_buddy_info(data, data_len, gc);
563 break; 568 break;
564 case QQ_CMD_CHANGE_STATUS: 569 case QQ_CMD_CHANGE_STATUS:
565 qq_process_change_status_reply(data, data_len, gc); 570 qq_process_change_status_reply(data, data_len, gc);
566 break; 571 break;
567 case QQ_CMD_SEND_IM: 572 case QQ_CMD_SEND_IM:
600 return; 605 return;
601 } 606 }
602 purple_debug_info("QQ", "All buddies and groups received\n"); 607 purple_debug_info("QQ", "All buddies and groups received\n");
603 break; 608 break;
604 default: 609 default:
605 process_cmd_unknow(gc, "Unknow reply CMD", data, data_len, cmd, seq); 610 process_cmd_unknow(gc, _("Unknow reply CMD"), data, data_len, cmd, seq);
606 is_unknow = TRUE; 611 is_unknow = TRUE;
607 break; 612 break;
608 } 613 }
609 if (is_unknow) 614 if (is_unknow)
610 return; 615 return;