comparison libpurple/protocols/msn/notification.c @ 25886:1a1765a87336

More MSN fixes to go along with f0df27a299120baecf9ea88a9fb24ffe1dbe72fd: Add an FQY error handler so we don't disconnect if something incorrect was sent (unless the server kicked us itself). Decrement the ADL/FQY count when we receive an error about a FQY for a user so that we can continue to login even with bogus email addresses. applied changes from 54f9b89abccda90d90bcd15d12fd091279a7f54e through a1d92d07631246e44303c044d75179ba68158e8b
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Sat, 02 May 2009 23:08:46 +0000
parents 7ea04b53f553
children 14abfec55b1d
comparison
equal deleted inserted replaced
25884:b9a90f34b780 25886:1a1765a87336
610 } 610 }
611 611
612 static void 612 static void
613 update_contact_network(MsnSession *session, const char *passport, MsnNetwork network) 613 update_contact_network(MsnSession *session, const char *passport, MsnNetwork network)
614 { 614 {
615 MsnUser *user = msn_userlist_find_user(session->userlist, passport); 615 MsnUser *user;
616
617 if (network == MSN_NETWORK_UNKNOWN)
618 {
619 purple_debug_warning("msn",
620 "Ignoring user %s about which server knows nothing.\n",
621 passport);
622 session->adl_fqy--;
623 return;
624 }
625
616 /* TODO: Also figure out how to update membership lists */ 626 /* TODO: Also figure out how to update membership lists */
627 user = msn_userlist_find_user(session->userlist, passport);
617 if (user) { 628 if (user) {
618 xmlnode *adl_node; 629 xmlnode *adl_node;
619 char *payload; 630 char *payload;
620 int payload_len; 631 int payload_len;
621 632
772 783
773 if (root == NULL) { 784 if (root == NULL) {
774 purple_debug_info("msn", "Invalid XML in ADL!\n"); 785 purple_debug_info("msn", "Invalid XML in ADL!\n");
775 return; 786 return;
776 } 787 }
777 for (domain_node = xmlnode_get_child(root, "d"); domain_node; domain_node = xmlnode_get_next_twin(domain_node)) { 788 for (domain_node = xmlnode_get_child(root, "d");
789 domain_node;
790 domain_node = xmlnode_get_next_twin(domain_node)) {
778 const gchar * domain = NULL; 791 const gchar * domain = NULL;
779 xmlnode *contact_node = NULL; 792 xmlnode *contact_node = NULL;
780 793
781 domain = xmlnode_get_attrib(domain_node, "n"); 794 domain = xmlnode_get_attrib(domain_node, "n");
782 795
783 for (contact_node = xmlnode_get_child(domain_node, "c"); contact_node; contact_node = xmlnode_get_next_twin(contact_node)) { 796 for (contact_node = xmlnode_get_child(domain_node, "c");
797 contact_node;
798 contact_node = xmlnode_get_next_twin(contact_node)) {
784 const gchar *list; 799 const gchar *list;
785 gint list_op = 0; 800 gint list_op = 0;
786 801
787 list = xmlnode_get_attrib(contact_node, "l"); 802 list = xmlnode_get_attrib(contact_node, "l");
788 if (list != NULL) { 803 if (list != NULL) {
940 local = xmlnode_get_attrib(c, "n"); 955 local = xmlnode_get_attrib(c, "n");
941 type = xmlnode_get_attrib(c, "t"); 956 type = xmlnode_get_attrib(c, "t");
942 957
943 passport = g_strdup_printf("%s@%s", local, domain); 958 passport = g_strdup_printf("%s@%s", local, domain);
944 959
945 if (type != NULL) 960 if (!g_ascii_isdigit(cmd->command[0]) && type != NULL)
946 network = (MsnNetwork)strtoul(type, NULL, 10); 961 network = (MsnNetwork)strtoul(type, NULL, 10);
947 else 962 else
948 network = MSN_NETWORK_PASSPORT; 963 network = MSN_NETWORK_UNKNOWN;
949 964
950 purple_debug_info("msn", "FQY response says %s is from network %d\n", 965 purple_debug_info("msn", "FQY response says %s is from network %d\n",
951 passport, network); 966 passport, network);
952 if (cmd->trans->data) 967 if (cmd->trans->data)
953 ((MsnFqyCb)cmd->trans->data)(session, passport, network); 968 ((MsnFqyCb)cmd->trans->data)(session, passport, network);
955 g_free(passport); 970 g_free(passport);
956 } 971 }
957 } 972 }
958 973
959 xmlnode_free(ml); 974 xmlnode_free(ml);
975 }
976
977 static void
978 fqy_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
979 {
980 MsnCommand *cmd = cmdproc->last_cmd;
981
982 purple_debug_warning("msn", "FQY error %d\n", error);
983 if (cmd->param_count > 1) {
984 cmd->payload_cb = fqy_cmd_post;
985 cmd->payload_len = atoi(cmd->params[1]);
986 cmd->payload_cbdata = GINT_TO_POINTER(error);
987 }
988 #if 0
989 /* If the server didn't send us a corresponding email address for this
990 FQY error, it's probably going to disconnect us. So it isn't necessary
991 to tell the handler about it. */
992 else if (trans->data)
993 ((MsnFqyCb)trans->data)(session, NULL, MSN_NETWORK_UNKNOWN); */
994 #endif
960 } 995 }
961 996
962 static void 997 static void
963 fqy_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) 998 fqy_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
964 { 999 {
2151 2186
2152 msn_table_add_cmd(cbs_table, NULL, "241", adl_241_error_cmd); 2187 msn_table_add_cmd(cbs_table, NULL, "241", adl_241_error_cmd);
2153 2188
2154 msn_table_add_error(cbs_table, "ADD", add_error); 2189 msn_table_add_error(cbs_table, "ADD", add_error);
2155 msn_table_add_error(cbs_table, "ADL", adl_error); 2190 msn_table_add_error(cbs_table, "ADL", adl_error);
2191 msn_table_add_error(cbs_table, "FQY", fqy_error);
2156 msn_table_add_error(cbs_table, "REG", reg_error); 2192 msn_table_add_error(cbs_table, "REG", reg_error);
2157 msn_table_add_error(cbs_table, "RMG", rmg_error); 2193 msn_table_add_error(cbs_table, "RMG", rmg_error);
2158 msn_table_add_error(cbs_table, "USR", usr_error); 2194 msn_table_add_error(cbs_table, "USR", usr_error);
2159 2195
2160 msn_table_add_msg_type(cbs_table, 2196 msn_table_add_msg_type(cbs_table,