comparison libpurple/protocols/msn/notification.c @ 20414:76e736b59aa4

fixes #971, we can only ADL 150 contacts at a time or the notification server will kill us
author Ka-Hing Cheung <khc@hxbc.us>
date Mon, 14 May 2007 00:40:29 +0000
parents 522ade544156
children 0f6747c5dcc2
comparison
equal deleted inserted replaced
20413:fd7b501cc9c8 20414:76e736b59aa4
37 /**************************************************************************** 37 /****************************************************************************
38 * Local Function Prototype 38 * Local Function Prototype
39 ****************************************************************************/ 39 ****************************************************************************/
40 40
41 static void msn_notification_fqy_yahoo(MsnSession *session, const char *passport); 41 static void msn_notification_fqy_yahoo(MsnSession *session, const char *passport);
42 static void msn_notification_post_adl(MsnCmdProc *cmdproc, char *payload, int payload_len); 42 static void msn_notification_post_adl(MsnCmdProc *cmdproc, const char *payload, int payload_len);
43 static void msn_add_contact_xml(xmlnode *mlNode, const char *passport, int list_op, int type); 43 static void msn_add_contact_xml(xmlnode *mlNode, const char *passport, int list_op, int type);
44 44
45 /************************************************************************** 45 /**************************************************************************
46 * Main 46 * Main
47 **************************************************************************/ 47 **************************************************************************/
629 629
630 g_free(tokens); 630 g_free(tokens);
631 } 631 }
632 632
633 static void 633 static void
634 msn_notification_post_adl(MsnCmdProc *cmdproc, char *payload, int payload_len) 634 msn_notification_post_adl(MsnCmdProc *cmdproc, const char *payload, int payload_len)
635 { 635 {
636 MsnTransaction *trans; 636 MsnTransaction *trans;
637 637
638 purple_debug_info("MaYuan","Send ADL{%s}\n",payload); 638 purple_debug_info("MaYuan","Send ADL{%s}\n",payload);
639 trans = msn_transaction_new(cmdproc, "ADL","%d",strlen(payload)); 639 trans = msn_transaction_new(cmdproc, "ADL","%d",strlen(payload));
643 643
644 /*dump contact info to NS*/ 644 /*dump contact info to NS*/
645 void 645 void
646 msn_notification_dump_contact(MsnSession *session) 646 msn_notification_dump_contact(MsnSession *session)
647 { 647 {
648 MsnUserList *userlist;
649 MsnUser *user; 648 MsnUser *user;
650 GList *l; 649 GList *l;
651 xmlnode *adl_node; 650 xmlnode *adl_node;
652 char *payload; 651 char *payload;
653 int payload_len; 652 int payload_len;
653 int adl_count = 0;
654 const char *display_name; 654 const char *display_name;
655 655
656 userlist = session->userlist;
657 adl_node = xmlnode_new("ml"); 656 adl_node = xmlnode_new("ml");
658 adl_node->child = NULL; 657 adl_node->child = NULL;
659 xmlnode_set_attrib(adl_node, "l", "1"); 658 xmlnode_set_attrib(adl_node, "l", "1");
660 659
661 /*get the userlist*/ 660 /*get the userlist*/
662 for (l = userlist->users; l != NULL; l = l->next){ 661 for (l = session->userlist->users; l != NULL; l = l->next){
663 user = l->data; 662 user = l->data;
664 msn_add_contact_xml(adl_node,user->passport,user->list_op&MSN_LIST_OP_MASK,user->type); 663 msn_add_contact_xml(adl_node, user->passport,
665 } 664 user->list_op & MSN_LIST_OP_MASK, user->type);
666 665
667 payload = xmlnode_to_str(adl_node,&payload_len); 666 /* each ADL command may contain up to 150 contacts */
668 xmlnode_free(adl_node); 667 if (++adl_count % 150 == 0 || l->next == NULL) {
669 668 payload = xmlnode_to_str(adl_node,&payload_len);
670 msn_notification_post_adl(session->notification->cmdproc,payload,payload_len); 669
670 msn_notification_post_adl(session->notification->cmdproc,
671 payload, payload_len);
672
673 g_free(payload);
674 xmlnode_free(adl_node);
675
676 if (l->next) {
677 adl_node = xmlnode_new("ml");
678 adl_node->child = NULL;
679 xmlnode_set_attrib(adl_node, "l", "1");
680 }
681 }
682 }
683
671 684
672 display_name = purple_connection_get_display_name(session->account->gc); 685 display_name = purple_connection_get_display_name(session->account->gc);
673 if (display_name && strcmp(display_name, 686 if (display_name && strcmp(display_name,
674 purple_account_get_username(session->account))) { 687 purple_account_get_username(session->account))) {
675 msn_act_id(session->account->gc, display_name); 688 msn_act_id(session->account->gc, display_name);