Mercurial > pidgin
comparison libpurple/protocols/qq/qq_process.c @ 24157:1ee91ff0d5fe
2008.10.09 - ccpaging <ccpaging(at)gmail.com>
* Update 'group' protocol
* Functions of group_find, group_free, group_search merged into group_join and group_internal
* Removed group_find.c/h, group_free.c/h, group_search.c/h
author | SHiNE CsyFeK <csyfek@gmail.com> |
---|---|
date | Tue, 28 Oct 2008 16:38:16 +0000 |
parents | 3c52353b83ae |
children | 9be95f0b9472 |
comparison
equal
deleted
inserted
replaced
24156:147f1b17b6ce | 24157:1ee91ff0d5fe |
---|---|
31 #include "buddy_opt.h" | 31 #include "buddy_opt.h" |
32 #include "group_info.h" | 32 #include "group_info.h" |
33 #include "char_conv.h" | 33 #include "char_conv.h" |
34 #include "qq_crypt.h" | 34 #include "qq_crypt.h" |
35 | 35 |
36 #include "group_search.h" | |
37 #include "group_find.h" | |
38 #include "group_internal.h" | 36 #include "group_internal.h" |
39 #include "group_im.h" | 37 #include "group_im.h" |
40 #include "group_info.h" | 38 #include "group_info.h" |
41 #include "group_join.h" | 39 #include "group_join.h" |
42 #include "group_opt.h" | 40 #include "group_opt.h" |
527 } | 525 } |
528 | 526 |
529 void qq_update_room(PurpleConnection *gc, guint8 room_cmd, guint32 room_id) | 527 void qq_update_room(PurpleConnection *gc, guint8 room_cmd, guint32 room_id) |
530 { | 528 { |
531 qq_data *qd; | 529 qq_data *qd; |
532 qq_group *group; | |
533 gint ret; | 530 gint ret; |
534 | 531 |
535 g_return_if_fail (gc != NULL && gc->proto_data != NULL); | 532 g_return_if_fail (gc != NULL && gc->proto_data != NULL); |
536 qd = (qq_data *) gc->proto_data; | 533 qd = (qq_data *) gc->proto_data; |
537 | |
538 group = qq_room_search_id(gc, room_id); | |
539 if (group == NULL && room_id <= 0) { | |
540 purple_debug_info("QQ", "No room, nothing update\n"); | |
541 return; | |
542 } | |
543 if (group == NULL ) { | |
544 purple_debug_warning("QQ", "Failed search room id [%d]\n", room_id); | |
545 return; | |
546 } | |
547 | 534 |
548 switch (room_cmd) { | 535 switch (room_cmd) { |
549 case 0: | 536 case 0: |
550 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_INFO, group->id, NULL, 0, | 537 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_INFO, room_id, NULL, 0, |
551 QQ_CMD_CLASS_UPDATE_ROOM, 0); | 538 QQ_CMD_CLASS_UPDATE_ROOM, 0); |
552 break; | 539 break; |
553 case QQ_ROOM_CMD_GET_INFO: | 540 case QQ_ROOM_CMD_GET_INFO: |
554 ret = qq_request_room_get_buddies(gc, group, QQ_CMD_CLASS_UPDATE_ROOM); | 541 ret = qq_request_room_get_buddies(gc, room_id, QQ_CMD_CLASS_UPDATE_ROOM); |
555 if (ret <= 0) { | 542 if (ret <= 0) { |
556 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_ONLINES, group->id, NULL, 0, | 543 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_ONLINES, room_id, NULL, 0, |
557 QQ_CMD_CLASS_UPDATE_ROOM, 0); | 544 QQ_CMD_CLASS_UPDATE_ROOM, 0); |
558 } | 545 } |
559 break; | 546 break; |
560 case QQ_ROOM_CMD_GET_BUDDIES: | 547 case QQ_ROOM_CMD_GET_BUDDIES: |
561 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_ONLINES, group->id, NULL, 0, | 548 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_ONLINES, room_id, NULL, 0, |
562 QQ_CMD_CLASS_UPDATE_ROOM, 0); | 549 QQ_CMD_CLASS_UPDATE_ROOM, 0); |
563 break; | 550 break; |
564 case QQ_ROOM_CMD_GET_ONLINES: | 551 case QQ_ROOM_CMD_GET_ONLINES: |
565 /* last command */ | 552 /* last command */ |
566 default: | 553 default: |
570 | 557 |
571 void qq_update_all_rooms(PurpleConnection *gc, guint8 room_cmd, guint32 room_id) | 558 void qq_update_all_rooms(PurpleConnection *gc, guint8 room_cmd, guint32 room_id) |
572 { | 559 { |
573 qq_data *qd; | 560 qq_data *qd; |
574 gboolean is_new_turn = FALSE; | 561 gboolean is_new_turn = FALSE; |
575 qq_group *next_group; | 562 guint32 next_id; |
576 | 563 |
577 g_return_if_fail (gc != NULL && gc->proto_data != NULL); | 564 g_return_if_fail (gc != NULL && gc->proto_data != NULL); |
578 qd = (qq_data *) gc->proto_data; | 565 qd = (qq_data *) gc->proto_data; |
579 | 566 |
580 next_group = qq_room_get_next(gc, room_id); | 567 next_id = qq_room_get_next(gc, room_id); |
581 if (next_group == NULL && room_id <= 0) { | 568 purple_debug_info("QQ", "Update rooms, next id %d, prev id %d\n", next_id, room_id); |
582 purple_debug_info("QQ", "No room. Finished update\n"); | 569 |
583 return; | 570 if (next_id <= 0) { |
584 } | 571 if (room_id > 0) { |
585 if (next_group == NULL ) { | 572 is_new_turn = TRUE; |
586 is_new_turn = TRUE; | 573 next_id = qq_room_get_next(gc, 0); |
587 next_group = qq_room_get_next(gc, 0); | 574 purple_debug_info("QQ", "new turn, id %d\n", next_id); |
588 g_return_if_fail(next_group != NULL); | 575 } else { |
576 purple_debug_info("QQ", "No room. Finished update\n"); | |
577 return; | |
578 } | |
589 } | 579 } |
590 | 580 |
591 switch (room_cmd) { | 581 switch (room_cmd) { |
592 case 0: | 582 case 0: |
593 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_INFO, next_group->id, NULL, 0, | 583 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_INFO, next_id, NULL, 0, |
594 QQ_CMD_CLASS_UPDATE_ALL, 0); | 584 QQ_CMD_CLASS_UPDATE_ALL, 0); |
595 break; | 585 break; |
596 case QQ_ROOM_CMD_GET_INFO: | 586 case QQ_ROOM_CMD_GET_INFO: |
597 if (!is_new_turn) { | 587 if (!is_new_turn) { |
598 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_INFO, next_group->id, NULL, 0, | 588 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_INFO, next_id, NULL, 0, |
599 QQ_CMD_CLASS_UPDATE_ALL, 0); | 589 QQ_CMD_CLASS_UPDATE_ALL, 0); |
600 } else { | 590 } else { |
601 qq_request_room_get_buddies(gc, next_group, QQ_CMD_CLASS_UPDATE_ALL); | 591 qq_request_room_get_buddies(gc, next_id, QQ_CMD_CLASS_UPDATE_ALL); |
602 } | 592 } |
603 break; | 593 break; |
604 case QQ_ROOM_CMD_GET_BUDDIES: | 594 case QQ_ROOM_CMD_GET_BUDDIES: |
605 /* last command */ | 595 /* last command */ |
606 if (!is_new_turn) { | 596 if (!is_new_turn) { |
607 qq_request_room_get_buddies(gc, next_group, QQ_CMD_CLASS_UPDATE_ALL); | 597 qq_request_room_get_buddies(gc, next_id, QQ_CMD_CLASS_UPDATE_ALL); |
608 } else { | 598 } else { |
609 purple_debug_info("QQ", "Finished update\n"); | 599 purple_debug_info("QQ", "Finished update\n"); |
610 } | 600 } |
611 break; | 601 break; |
612 default: | 602 default: |
656 } | 646 } |
657 | 647 |
658 static void update_all_rooms_online(PurpleConnection *gc, guint8 room_cmd, guint32 room_id) | 648 static void update_all_rooms_online(PurpleConnection *gc, guint8 room_cmd, guint32 room_id) |
659 { | 649 { |
660 qq_data *qd; | 650 qq_data *qd; |
661 qq_group *next_group; | 651 guint32 next_id; |
662 | 652 |
663 g_return_if_fail (gc != NULL && gc->proto_data != NULL); | 653 g_return_if_fail (gc != NULL && gc->proto_data != NULL); |
664 qd = (qq_data *) gc->proto_data; | 654 qd = (qq_data *) gc->proto_data; |
665 | 655 |
666 next_group = qq_room_get_next_conv(gc, room_id); | 656 next_id = qq_room_get_next_conv(gc, room_id); |
667 if (next_group == NULL && room_id <= 0) { | 657 if (next_id <= 0 && room_id <= 0) { |
668 purple_debug_info("QQ", "No room in conversation, no update online buddies\n"); | 658 purple_debug_info("QQ", "No room in conversation, no update online buddies\n"); |
669 return; | 659 return; |
670 } | 660 } |
671 if (next_group == NULL ) { | 661 if (next_id <= 0 ) { |
672 purple_debug_info("QQ", "finished update rooms' online buddies\n"); | 662 purple_debug_info("QQ", "finished update rooms' online buddies\n"); |
673 return; | 663 return; |
674 } | 664 } |
675 | 665 |
676 switch (room_cmd) { | 666 switch (room_cmd) { |
677 case 0: | 667 case 0: |
678 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_ONLINES, next_group->id, NULL, 0, | 668 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_ONLINES, next_id, NULL, 0, |
679 QQ_CMD_CLASS_UPDATE_ALL, 0); | 669 QQ_CMD_CLASS_UPDATE_ALL, 0); |
680 break; | 670 break; |
681 case QQ_ROOM_CMD_GET_ONLINES: | 671 case QQ_ROOM_CMD_GET_ONLINES: |
682 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_ONLINES, next_group->id, NULL, 0, | 672 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_ONLINES, next_id, NULL, 0, |
683 QQ_CMD_CLASS_UPDATE_ALL, 0); | 673 QQ_CMD_CLASS_UPDATE_ALL, 0); |
684 break; | 674 break; |
685 default: | 675 default: |
686 break; | 676 break; |
687 } | 677 } |
712 gint update_class, guint32 ship32) | 702 gint update_class, guint32 ship32) |
713 { | 703 { |
714 qq_data *qd; | 704 qq_data *qd; |
715 guint8 *data; | 705 guint8 *data; |
716 gint data_len; | 706 gint data_len; |
717 qq_group *group; | 707 qq_room_data *rmd; |
718 gint bytes; | 708 gint bytes; |
719 guint8 reply_cmd, reply; | 709 guint8 reply_cmd, reply; |
720 | 710 |
721 g_return_if_fail (gc != NULL && gc->proto_data != NULL); | 711 g_return_if_fail (gc != NULL && gc->proto_data != NULL); |
722 qd = (qq_data *) gc->proto_data; | 712 qd = (qq_data *) gc->proto_data; |
758 | 748 |
759 /* now process the packet */ | 749 /* now process the packet */ |
760 if (reply != QQ_ROOM_CMD_REPLY_OK) { | 750 if (reply != QQ_ROOM_CMD_REPLY_OK) { |
761 switch (reply) { /* this should be all errors */ | 751 switch (reply) { /* this should be all errors */ |
762 case QQ_ROOM_CMD_REPLY_NOT_MEMBER: | 752 case QQ_ROOM_CMD_REPLY_NOT_MEMBER: |
763 group = qq_room_search_id(gc, room_id); | 753 rmd = qq_room_data_find(gc, room_id); |
764 if (group == NULL) { | 754 if (rmd == NULL) { |
765 purple_debug_warning("QQ", | 755 purple_debug_warning("QQ", |
766 "Missing room id in [%05d], 0x%02X %s for %d, len %d\n", | 756 "Missing room id in [%05d], 0x%02X %s for %d, len %d\n", |
767 seq, room_cmd, qq_get_room_cmd_desc(room_cmd), room_id, rcved_len); | 757 seq, room_cmd, qq_get_room_cmd_desc(room_cmd), room_id, rcved_len); |
768 } else { | 758 } else { |
769 purple_debug_warning("QQ", | 759 purple_debug_warning("QQ", |
770 _("You are not a member of QQ Qun \"%s\"\n"), group->title_utf8); | 760 _("Not a member of room \"%s\"\n"), rmd->title_utf8); |
771 group->my_role = QQ_ROOM_ROLE_NO; | 761 rmd->my_role = QQ_ROOM_ROLE_NO; |
772 qq_group_refresh(gc, group); | |
773 } | 762 } |
774 break; | 763 break; |
775 case QQ_ROOM_CMD_REPLY_SEARCH_ERROR: | 764 case QQ_ROOM_CMD_REPLY_SEARCH_ERROR: |
776 if (qd->roomlist != NULL) { | 765 if (qd->roomlist != NULL) { |
777 if (purple_roomlist_get_in_progress(qd->roomlist)) | 766 if (purple_roomlist_get_in_progress(qd->roomlist)) |
970 purple_debug_info("QQ", "Login repliess OK; everything is fine\n"); | 959 purple_debug_info("QQ", "Login repliess OK; everything is fine\n"); |
971 purple_connection_set_state(gc, PURPLE_CONNECTED); | 960 purple_connection_set_state(gc, PURPLE_CONNECTED); |
972 qd->is_login = TRUE; /* must be defined after sev_finish_login */ | 961 qd->is_login = TRUE; /* must be defined after sev_finish_login */ |
973 | 962 |
974 /* now initiate QQ Qun, do it first as it may take longer to finish */ | 963 /* now initiate QQ Qun, do it first as it may take longer to finish */ |
975 qq_group_init(gc); | 964 qq_room_data_initial(gc); |
976 | 965 |
977 /* is_login, but we have packets before login */ | 966 /* is_login, but we have packets before login */ |
978 qq_trans_process_remained(gc); | 967 qq_trans_process_remained(gc); |
979 | 968 |
980 qq_update_all(gc, 0); | 969 qq_update_all(gc, 0); |