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