| 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, |
| 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); |
| 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: |