Mercurial > pidgin.yaz
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); |