comparison libpurple/protocols/msn/msn.c @ 31823:d72d728226dc

propagate from branch 'im.pidgin.pidgin' (head fb4d2b014576462db99d919dea15fbed03f1f48a) to branch 'im.pidgin.pidgin.next.minor' (head 4a5878f91c824f207ed343b57b36ae74e1baa438)
author John Bailey <rekkanoryo@rekkanoryo.org>
date Sun, 13 Mar 2011 18:14:04 +0000
parents ea2a155b4439 f3d11c84cc03
children 7281d151e492 7c33eaed54e5
comparison
equal deleted inserted replaced
31822:6c660dc7cb6a 31823:d72d728226dc
108 static char buf[BUF_LEN]; 108 static char buf[BUF_LEN];
109 char *tmp; 109 char *tmp;
110 110
111 g_return_val_if_fail(str != NULL, NULL); 111 g_return_val_if_fail(str != NULL, NULL);
112 112
113 g_snprintf(buf, sizeof(buf), "%s%s", str, 113 tmp = g_strchomp(g_utf8_strdown(str, -1));
114 (strchr(str, '@') ? "" : "@hotmail.com")); 114 g_snprintf(buf, sizeof(buf), "%s%s", tmp,
115 115 (strchr(tmp, '@') ? "" : "@hotmail.com"));
116 tmp = g_utf8_strdown(buf, -1);
117 strncpy(buf, tmp, sizeof(buf));
118 g_free(tmp); 116 g_free(tmp);
119 117
120 return buf; 118 return buf;
121 } 119 }
122 120
929 if (ret) { 927 if (ret) {
930 MsnSession *session = gc->proto_data; 928 MsnSession *session = gc->proto_data;
931 if (session) { 929 if (session) {
932 MsnUser *user = msn_userlist_find_user(session->userlist, who); 930 MsnUser *user = msn_userlist_find_user(session->userlist, who);
933 if (user) { 931 if (user) {
934 /* Include these too: MSN_CLIENT_CAP_MSNMOBILE|MSN_CLIENT_CAP_MSNDIRECT ? */ 932 /* Include these too: MSN_CAP_MOBILE_ON|MSN_CAP_WEB_WATCH ? */
935 if ((user->clientid & MSN_CLIENT_CAP_WEBMSGR) || 933 if ((user->clientid & MSN_CAP_VIA_WEBIM) ||
936 user->networkid == MSN_NETWORK_YAHOO) 934 user->networkid == MSN_NETWORK_YAHOO)
937 ret = FALSE; 935 ret = FALSE;
938 else 936 else
939 ret = TRUE; 937 ret = TRUE;
940 } 938 }
959 msn_list_emblems(PurpleBuddy *b) 957 msn_list_emblems(PurpleBuddy *b)
960 { 958 {
961 MsnUser *user = purple_buddy_get_protocol_data(b); 959 MsnUser *user = purple_buddy_get_protocol_data(b);
962 960
963 if (user != NULL) { 961 if (user != NULL) {
964 if (user->clientid & MSN_CLIENT_CAP_BOT) 962 if (user->clientid & MSN_CAP_BOT)
965 return "bot"; 963 return "bot";
966 if (user->clientid & MSN_CLIENT_CAP_WIN_MOBILE) 964 if (user->clientid & MSN_CAP_VIA_MOBILE)
967 return "mobile"; 965 return "mobile";
968 #if 0 966 #if 0
969 /* XXX: Since we don't support this, there's no point in showing it just yet */ 967 /* XXX: Since we don't support this, there's no point in showing it just yet */
970 if (user->clientid & MSN_CLIENT_CAP_SCHANNEL) 968 if (user->clientid & MSN_CAP_SCHANNEL)
971 return "secure"; 969 return "secure";
972 #endif 970 #endif
973 if (user->clientid & MSN_CLIENT_CAP_WEBMSGR) 971 if (user->clientid & MSN_CAP_VIA_WEBIM)
974 return "external"; 972 return "external";
975 if (user->networkid == MSN_NETWORK_YAHOO) 973 if (user->networkid == MSN_NETWORK_YAHOO)
976 return "yahoo"; 974 return "yahoo";
977 } 975 }
978 976
1744 const char *who, 1742 const char *who,
1745 MsnNetwork network, 1743 MsnNetwork network,
1746 MsnUser *user) 1744 MsnUser *user)
1747 { 1745 {
1748 char *group; 1746 char *group;
1747 MsnUserList *userlist;
1748 MsnUser *user2;
1749 1749
1750 g_return_if_fail(user != NULL); 1750 g_return_if_fail(user != NULL);
1751 1751
1752 if (network == MSN_NETWORK_UNKNOWN) {
1753 purple_debug_error("msn", "Network in FQY response was unknown. "
1754 "Assuming %s is a passport user and adding anyway.\n", who);
1755 network = MSN_NETWORK_PASSPORT;
1756 }
1757
1752 group = msn_user_remove_pending_group(user); 1758 group = msn_user_remove_pending_group(user);
1753 1759
1754 if (network != MSN_NETWORK_UNKNOWN) { 1760 userlist = session->userlist;
1755 MsnUserList *userlist = session->userlist; 1761 user2 = msn_userlist_find_user(userlist, who);
1756 MsnUser *user2 = msn_userlist_find_user(userlist, who); 1762 if (user2 != NULL) {
1757 if (user2 != NULL) { 1763 /* User already in userlist, so just update it. */
1758 /* User already in userlist, so just update it. */
1759 msn_user_unref(user);
1760 user = user2;
1761 } else {
1762 msn_userlist_add_user(userlist, user);
1763 }
1764
1765 msn_user_set_network(user, network);
1766 msn_userlist_add_buddy(userlist, who, group);
1767 }
1768 else
1769 {
1770 PurpleBuddy * buddy = purple_find_buddy(session->account, who);
1771 gchar *buf;
1772 buf = g_strdup_printf(_("Unable to add the buddy %s because the username is invalid. Usernames must be valid email addresses."), who);
1773 if (!purple_conv_present_error(who, session->account, buf))
1774 purple_notify_error(purple_account_get_connection(session->account), NULL, _("Unable to Add"), buf);
1775 g_free(buf);
1776
1777 /* Remove from local list */
1778 purple_blist_remove_buddy(buddy);
1779 msn_user_unref(user); 1764 msn_user_unref(user);
1780 } 1765 user = user2;
1766 } else {
1767 msn_userlist_add_user(userlist, user);
1768 msn_user_unref(user);
1769 }
1770
1771 msn_user_set_network(user, network);
1772 msn_userlist_add_buddy(userlist, who, group);
1773
1781 g_free(group); 1774 g_free(group);
1782 } 1775 }
1783 1776
1784 static void 1777 static void
1785 finish_auth_request(MsnAddReqData *data, char *msg) 1778 finish_auth_request(MsnAddReqData *data, char *msg)
1812 return; 1805 return;
1813 } 1806 }
1814 1807
1815 /* XXX - Would group ever be NULL here? I don't think so... 1808 /* XXX - Would group ever be NULL here? I don't think so...
1816 * shx: Yes it should; MSN handles non-grouped buddies, and this is only 1809 * shx: Yes it should; MSN handles non-grouped buddies, and this is only
1817 * internal. */ 1810 * internal.
1811 * KingAnt: But PurpleBuddys must always exist inside PurpleGroups, so
1812 * won't group always be non-NULL here?
1813 */
1818 user = msn_userlist_find_user(userlist, who); 1814 user = msn_userlist_find_user(userlist, who);
1819 if ((user != NULL) && (user->networkid != MSN_NETWORK_UNKNOWN)) { 1815 if ((user != NULL) && (user->networkid != MSN_NETWORK_UNKNOWN)) {
1820 /* We already know this buddy and their network. This function knows 1816 /* We already know this buddy and their network. This function knows
1821 what to do with users already in the list and stuff... */ 1817 what to do with users already in the list and stuff... */
1822 msn_user_set_invite_message(user, msg); 1818 msn_user_set_invite_message(user, msg);
1827 /* We need to check the network for this buddy first */ 1823 /* We need to check the network for this buddy first */
1828 user = msn_user_new(userlist, who, NULL); 1824 user = msn_user_new(userlist, who, NULL);
1829 msn_user_set_invite_message(user, msg); 1825 msn_user_set_invite_message(user, msg);
1830 msn_user_set_pending_group(user, gname); 1826 msn_user_set_pending_group(user, gname);
1831 msn_user_set_network(user, MSN_NETWORK_UNKNOWN); 1827 msn_user_set_network(user, MSN_NETWORK_UNKNOWN);
1828 /* Should probably re-use the msn_add_contact_xml function here */
1832 tokens = g_strsplit(who, "@", 2); 1829 tokens = g_strsplit(who, "@", 2);
1833 fqy = g_strdup_printf("<ml><d n=\"%s\"><c n=\"%s\"/></d></ml>", 1830 fqy = g_strdup_printf("<ml><d n=\"%s\"><c n=\"%s\"/></d></ml>",
1834 tokens[1], 1831 tokens[1],
1835 tokens[0]); 1832 tokens[0]);
1833 /* TODO: I think user will leak if we disconnect before receiving
1834 a response to this FQY request */
1836 msn_notification_send_fqy(session, fqy, strlen(fqy), 1835 msn_notification_send_fqy(session, fqy, strlen(fqy),
1837 (MsnFqyCb)add_pending_buddy, user); 1836 (MsnFqyCb)add_pending_buddy, user);
1838 g_free(fqy); 1837 g_free(fqy);
1839 g_strfreev(tokens); 1838 g_strfreev(tokens);
1840 } 1839 }