libpurple/protocols/qq/qq_process.c

changeset 24311
73d95441cd4c
parent 24301
af1ac5f7ced8
child 24312
9b07d084baff
equal deleted inserted replaced
24301:af1ac5f7ced8 24311:73d95441cd4c
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,const gchar *title, guint8 *data, gint data_len, guint16 cmd, guint16 seq) 63 static void process_cmd_unknow(PurpleConnection *gc,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 != NULL) { 80 if (msg_utf8) {
81 purple_notify_info(gc, title, msg_utf8, NULL); 81 purple_notify_info(gc, NULL, msg_utf8, NULL);
82 g_free(msg_utf8); 82 g_free(msg_utf8);
83 } 83 }
84 } 84 }
85 85
86 void qq_proc_server_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *rcved, gint rcved_len) 86 void qq_proc_cmd_server(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_update_room(PurpleConnection *gc, guint8 room_cmd, guint32 room_id) 148 void qq_room_update(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. Finished update\n"); 201 purple_debug_info("QQ", "No room, nothing update\n");
202 qd->is_finish_update = TRUE;
202 return; 203 return;
203 } 204 }
204 if (next_group == NULL ) { 205 if (next_group == NULL ) {
205 is_new_turn = TRUE; 206 is_new_turn = TRUE;
206 next_group = qq_room_get_next(gc, 0); 207 next_group = qq_room_get_next(gc, 0);
223 case QQ_ROOM_CMD_GET_BUDDIES: 224 case QQ_ROOM_CMD_GET_BUDDIES:
224 /* last command */ 225 /* last command */
225 if (!is_new_turn) { 226 if (!is_new_turn) {
226 qq_request_room_get_buddies(gc, next_group, QQ_CMD_CLASS_UPDATE_ALL); 227 qq_request_room_get_buddies(gc, next_group, QQ_CMD_CLASS_UPDATE_ALL);
227 } else { 228 } else {
228 purple_debug_info("QQ", "Finished update\n"); 229 qd->is_finish_update = TRUE;
229 } 230 }
230 break; 231 break;
231 default: 232 default:
232 break; 233 break;
233 } 234 }
242 243
243 switch (cmd) { 244 switch (cmd) {
244 case 0: 245 case 0:
245 qq_request_buddy_info(gc, qd->uid, QQ_CMD_CLASS_UPDATE_ALL, QQ_BUDDY_INFO_UPDATE_ONLY); 246 qq_request_buddy_info(gc, qd->uid, QQ_CMD_CLASS_UPDATE_ALL, QQ_BUDDY_INFO_UPDATE_ONLY);
246 break; 247 break;
247 case QQ_CMD_GET_BUDDY_INFO: 248 case QQ_CMD_GET_USER_INFO:
248 qq_request_change_status(gc, QQ_CMD_CLASS_UPDATE_ALL); 249 qq_request_change_status(gc, QQ_CMD_CLASS_UPDATE_ALL);
249 break; 250 break;
250 case QQ_CMD_CHANGE_STATUS: 251 case QQ_CMD_CHANGE_STATUS:
251 qq_request_get_buddies_list(gc, 0, QQ_CMD_CLASS_UPDATE_ALL); 252 qq_request_get_buddies_list(gc, 0, QQ_CMD_CLASS_UPDATE_ALL);
252 break; 253 break;
253 case QQ_CMD_GET_BUDDIES_LIST: 254 case QQ_CMD_GET_BUDDIES_LIST:
254 qq_request_get_buddies_and_rooms(gc, 0, QQ_CMD_CLASS_UPDATE_ALL); 255 qq_request_get_buddies_and_rooms(gc, 0, QQ_CMD_CLASS_UPDATE_ALL);
255 break; 256 break;
256 case QQ_CMD_GET_BUDDIES_AND_ROOMS: 257 case QQ_CMD_GET_BUDDIES_AND_ROOMS:
257 qq_request_get_buddies_level(gc, QQ_CMD_CLASS_UPDATE_ALL); 258 qq_request_get_buddies_levels(gc, QQ_CMD_CLASS_UPDATE_ALL);
258 break; 259 break;
259 case QQ_CMD_GET_LEVEL: 260 case QQ_CMD_GET_LEVEL:
260 qq_request_get_buddies_online(gc, 0, QQ_CMD_CLASS_UPDATE_ALL); 261 qq_request_get_buddies_online(gc, 0, QQ_CMD_CLASS_UPDATE_ALL);
261 break; 262 break;
262 case QQ_CMD_GET_BUDDIES_ONLINE: 263 case QQ_CMD_GET_BUDDIES_ONLINE:
276 g_return_if_fail (gc != NULL && gc->proto_data != NULL); 277 g_return_if_fail (gc != NULL && gc->proto_data != NULL);
277 qd = (qq_data *) gc->proto_data; 278 qd = (qq_data *) gc->proto_data;
278 279
279 next_group = qq_room_get_next_conv(gc, room_id); 280 next_group = qq_room_get_next_conv(gc, room_id);
280 if (next_group == NULL && room_id <= 0) { 281 if (next_group == NULL && room_id <= 0) {
281 purple_debug_info("QQ", "No room in conversation, no update online buddies\n"); 282 purple_debug_info("QQ", "No room, no update online buddies\n");
282 return; 283 return;
283 } 284 }
284 if (next_group == NULL ) { 285 if (next_group == NULL ) {
285 purple_debug_info("QQ", "finished update rooms' online buddies\n"); 286 purple_debug_info("QQ", "finished update online buddies\n");
286 return; 287 return;
287 } 288 }
288 289
289 switch (room_cmd) { 290 switch (room_cmd) {
290 case 0: 291 case 0:
313 default: 314 default:
314 break; 315 break;
315 } 316 }
316 } 317 }
317 318
318 void qq_proc_room_cmd(PurpleConnection *gc, guint16 seq, 319 void qq_proc_room_cmd_reply(PurpleConnection *gc, guint16 seq,
319 guint8 room_cmd, guint32 room_id, guint8 *rcved, gint rcved_len, 320 guint8 room_cmd, guint32 room_id, guint8 *rcved, gint rcved_len,
320 gint update_class, guint32 ship32) 321 gint update_class, guint32 ship32)
321 { 322 {
322 qq_data *qd; 323 qq_data *qd;
323 guint8 *data; 324 guint8 *data;
442 default: 443 default:
443 purple_debug_warning("QQ", "Unknow room cmd 0x%02X %s\n", 444 purple_debug_warning("QQ", "Unknow room cmd 0x%02X %s\n",
444 reply_cmd, qq_get_room_cmd_desc(reply_cmd)); 445 reply_cmd, qq_get_room_cmd_desc(reply_cmd));
445 } 446 }
446 447
447 if (update_class == QQ_CMD_CLASS_NONE)
448 return;
449
450 purple_debug_info("QQ", "Update class %d\n", update_class); 448 purple_debug_info("QQ", "Update class %d\n", update_class);
451 if (update_class == QQ_CMD_CLASS_UPDATE_ALL) { 449 if (update_class == QQ_CMD_CLASS_UPDATE_ALL) {
452 update_all_rooms(gc, room_cmd, room_id); 450 update_all_rooms(gc, room_cmd, room_id);
453 return; 451 return;
454 } 452 }
455 if (update_class == QQ_CMD_CLASS_UPDATE_ONLINE) { 453 if (update_class == QQ_CMD_CLASS_UPDATE_ONLINE) {
456 update_all_rooms_online(gc, room_cmd, room_id); 454 update_all_rooms_online(gc, room_cmd, room_id);
457 return; 455 return;
458 } 456 }
459 if (update_class == QQ_CMD_CLASS_UPDATE_ROOM) { 457 if (update_class == QQ_CMD_CLASS_UPDATE_ROOM) {
460 qq_update_room(gc, room_cmd, room_id); 458 qq_room_update(gc, room_cmd, room_id);
461 } 459 }
462 } 460 }
463 461
464 void qq_proc_login_cmd(PurpleConnection *gc, guint8 *rcved, gint rcved_len) 462 void qq_proc_cmd_login(PurpleConnection *gc, guint8 *rcved, gint rcved_len)
465 { 463 {
466 qq_data *qd; 464 qq_data *qd;
467 guint8 *data; 465 guint8 *data;
468 gint data_len; 466 gint data_len;
469 guint ret_8; 467 guint ret_8;
503 qq_group_init(gc); 501 qq_group_init(gc);
504 502
505 /* Now goes on updating my icon/nickname, not showing info_window */ 503 /* Now goes on updating my icon/nickname, not showing info_window */
506 qd->modifying_face = FALSE; 504 qd->modifying_face = FALSE;
507 505
508 /* is_login, but we have packets before login */
509 qq_trans_process_remained(gc);
510
511 qq_update_all(gc, 0); 506 qq_update_all(gc, 0);
512 return; 507 return;
513 } 508 }
514 509
515 void qq_proc_client_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq, 510 void qq_proc_cmd_reply(PurpleConnection *gc, guint16 cmd, guint16 seq,
516 guint8 *rcved, gint rcved_len, gint update_class, guint32 ship32) 511 guint8 *rcved, gint rcved_len, gint update_class, guint32 ship32)
517 { 512 {
518 qq_data *qd; 513 qq_data *qd;
519 514
520 guint8 *data; 515 guint8 *data;
561 qq_process_remove_self_reply(data, data_len, gc); 556 qq_process_remove_self_reply(data, data_len, gc);
562 break; 557 break;
563 case QQ_CMD_BUDDY_AUTH: 558 case QQ_CMD_BUDDY_AUTH:
564 qq_process_add_buddy_auth_reply(data, data_len, gc); 559 qq_process_add_buddy_auth_reply(data, data_len, gc);
565 break; 560 break;
566 case QQ_CMD_GET_BUDDY_INFO: 561 case QQ_CMD_GET_USER_INFO:
567 qq_process_get_buddy_info(data, data_len, gc); 562 qq_process_get_info_reply(data, data_len, gc);
568 break; 563 break;
569 case QQ_CMD_CHANGE_STATUS: 564 case QQ_CMD_CHANGE_STATUS:
570 qq_process_change_status_reply(data, data_len, gc); 565 qq_process_change_status_reply(data, data_len, gc);
571 break; 566 break;
572 case QQ_CMD_SEND_IM: 567 case QQ_CMD_SEND_IM:
605 return; 600 return;
606 } 601 }
607 purple_debug_info("QQ", "All buddies and groups received\n"); 602 purple_debug_info("QQ", "All buddies and groups received\n");
608 break; 603 break;
609 default: 604 default:
610 process_cmd_unknow(gc, _("Unknow reply CMD"), data, data_len, cmd, seq); 605 process_cmd_unknow(gc, "Unknow reply CMD", data, data_len, cmd, seq);
611 is_unknow = TRUE; 606 is_unknow = TRUE;
612 break; 607 break;
613 } 608 }
614 if (is_unknow) 609 if (is_unknow)
615 return; 610 return;

mercurial