Mercurial > pidgin
comparison libpurple/protocols/myspace/myspace.c @ 32819:2c6510167895 default tip
propagate from branch 'im.pidgin.pidgin.2.x.y' (head 3315c5dfbd0ad16511bdcf865e5b07c02d07df24)
to branch 'im.pidgin.pidgin' (head cbd1eda6bcbf0565ae7766396bb8f6f419cb6a9a)
| author | Elliott Sales de Andrade <qulogic@pidgin.im> |
|---|---|
| date | Sat, 02 Jun 2012 02:30:49 +0000 |
| parents | a5f50581b7c0 |
| children |
comparison
equal
deleted
inserted
replaced
| 32818:01ff09d4a463 | 32819:2c6510167895 |
|---|---|
| 252 const gchar *from_username; | 252 const gchar *from_username; |
| 253 | 253 |
| 254 g_return_val_if_fail(who != NULL, FALSE); | 254 g_return_val_if_fail(who != NULL, FALSE); |
| 255 g_return_val_if_fail(text != NULL, FALSE); | 255 g_return_val_if_fail(text != NULL, FALSE); |
| 256 | 256 |
| 257 from_username = session->account->username; | 257 from_username = purple_account_get_username(session->account); |
| 258 | 258 |
| 259 g_return_val_if_fail(from_username != NULL, FALSE); | 259 g_return_val_if_fail(from_username != NULL, FALSE); |
| 260 | 260 |
| 261 purple_debug_info("msim", "sending %d message from %s to %s: %s\n", | 261 purple_debug_info("msim", "sending %d message from %s to %s: %s\n", |
| 262 type, from_username, who, text); | 262 type, from_username, who, text); |
| 427 g_return_if_fail(user_info != NULL); | 427 g_return_if_fail(user_info != NULL); |
| 428 | 428 |
| 429 user = msim_get_user_from_buddy(buddy, TRUE); | 429 user = msim_get_user_from_buddy(buddy, TRUE); |
| 430 | 430 |
| 431 if (PURPLE_BUDDY_IS_ONLINE(buddy)) { | 431 if (PURPLE_BUDDY_IS_ONLINE(buddy)) { |
| 432 MsimSession *session; | |
| 433 PurpleAccount *account = purple_buddy_get_account(buddy); | 432 PurpleAccount *account = purple_buddy_get_account(buddy); |
| 434 PurpleConnection *gc = purple_account_get_connection(account); | 433 PurpleConnection *gc = purple_account_get_connection(account); |
| 435 | 434 MsimSession *session = purple_connection_get_protocol_data(gc); |
| 436 session = (MsimSession *)gc->proto_data; | |
| 437 | 435 |
| 438 /* TODO: if (full), do something different? */ | 436 /* TODO: if (full), do something different? */ |
| 439 | 437 |
| 440 /* TODO: request information? have to figure out how to do | 438 /* TODO: request information? have to figure out how to do |
| 441 * the asynchronous lookup like oscar does (tooltip shows | 439 * the asynchronous lookup like oscar does (tooltip shows |
| 696 " bytes, decoded\n", nc_len); | 694 " bytes, decoded\n", nc_len); |
| 697 | 695 |
| 698 if (nc_len != MSIM_AUTH_CHALLENGE_LENGTH) { | 696 if (nc_len != MSIM_AUTH_CHALLENGE_LENGTH) { |
| 699 purple_debug_info("msim", "bad nc length: %" G_GSIZE_MODIFIER | 697 purple_debug_info("msim", "bad nc length: %" G_GSIZE_MODIFIER |
| 700 "x != 0x%x\n", nc_len, MSIM_AUTH_CHALLENGE_LENGTH); | 698 "x != 0x%x\n", nc_len, MSIM_AUTH_CHALLENGE_LENGTH); |
| 701 purple_connection_error_reason (session->gc, | 699 purple_connection_error (session->gc, |
| 702 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | 700 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
| 703 _("Unexpected challenge length from server")); | 701 _("Unexpected challenge length from server")); |
| 704 return FALSE; | 702 return FALSE; |
| 705 } | 703 } |
| 706 | 704 |
| 707 purple_connection_update_progress(session->gc, _("Logging in"), 2, 4); | 705 purple_connection_update_progress(session->gc, _("Logging in"), 2, 4); |
| 708 | 706 |
| 709 response_len = 0; | 707 response_len = 0; |
| 710 response = msim_compute_login_response(nc, account->username, account->password, &response_len); | 708 response = msim_compute_login_response(nc, purple_account_get_username(account), purple_account_get_password(account), &response_len); |
| 711 | 709 |
| 712 g_free(nc); | 710 g_free(nc); |
| 713 | 711 |
| 714 ret = msim_send(session, | 712 ret = msim_send(session, |
| 715 "login2", MSIM_TYPE_INTEGER, MSIM_AUTH_ALGORITHM, | 713 "login2", MSIM_TYPE_INTEGER, MSIM_AUTH_ALGORITHM, |
| 716 /* This is actually user's email address. */ | 714 /* This is actually user's email address. */ |
| 717 "username", MSIM_TYPE_STRING, g_strdup(account->username), | 715 "username", MSIM_TYPE_STRING, g_strdup(purple_account_get_username(account)), |
| 718 /* GString will be freed in msim_msg_free() in msim_send(). */ | 716 /* GString will be freed in msim_msg_free() in msim_send(). */ |
| 719 "response", MSIM_TYPE_BINARY, g_string_new_len(response, response_len), | 717 "response", MSIM_TYPE_BINARY, g_string_new_len(response, response_len), |
| 720 "clientver", MSIM_TYPE_INTEGER, MSIM_CLIENT_VERSION, | 718 "clientver", MSIM_TYPE_INTEGER, MSIM_CLIENT_VERSION, |
| 721 "langid", MSIM_TYPE_INTEGER, MSIM_LANGUAGE_ID_ENGLISH, | 719 "langid", MSIM_TYPE_INTEGER, MSIM_LANGUAGE_ID_ENGLISH, |
| 722 "imlang", MSIM_TYPE_STRING, g_strdup(MSIM_LANGUAGE_NAME_ENGLISH), | 720 "imlang", MSIM_TYPE_STRING, g_strdup(MSIM_LANGUAGE_NAME_ENGLISH), |
| 752 * | 750 * |
| 753 * Filed enhancement ticket for libpurple as #4688. | 751 * Filed enhancement ticket for libpurple as #4688. |
| 754 */ | 752 */ |
| 755 | 753 |
| 756 purple_debug_info("msim", "Unrecognized data on account for %s\n", | 754 purple_debug_info("msim", "Unrecognized data on account for %s\n", |
| 757 (session && session->account && session->account->username) ? | 755 (session && session->account && purple_account_get_username(session->account)) ? |
| 758 session->account->username : "(NULL)"); | 756 purple_account_get_username(session->account) : "(NULL)"); |
| 759 if (note) { | 757 if (note) { |
| 760 purple_debug_info("msim", "(Note: %s)\n", note); | 758 purple_debug_info("msim", "(Note: %s)\n", note); |
| 761 } | 759 } |
| 762 | 760 |
| 763 if (msg) { | 761 if (msg) { |
| 833 /* purple_debug_info("msim", "msim_check_alive: delta=%d\n", delta); */ | 831 /* purple_debug_info("msim", "msim_check_alive: delta=%d\n", delta); */ |
| 834 if (delta >= MSIM_KEEPALIVE_INTERVAL) { | 832 if (delta >= MSIM_KEEPALIVE_INTERVAL) { |
| 835 purple_debug_info("msim", | 833 purple_debug_info("msim", |
| 836 "msim_check_alive: %zu > interval of %d, presumed dead\n", | 834 "msim_check_alive: %zu > interval of %d, presumed dead\n", |
| 837 delta, MSIM_KEEPALIVE_INTERVAL); | 835 delta, MSIM_KEEPALIVE_INTERVAL); |
| 838 purple_connection_error_reason(session->gc, | 836 purple_connection_error(session->gc, |
| 839 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | 837 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
| 840 _("Lost connection with server")); | 838 _("Lost connection with server")); |
| 841 | 839 |
| 842 return FALSE; | 840 return FALSE; |
| 843 } | 841 } |
| 1838 case MSIM_ERROR_INCORRECT_PASSWORD: /* Incorrect password */ | 1836 case MSIM_ERROR_INCORRECT_PASSWORD: /* Incorrect password */ |
| 1839 reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; | 1837 reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; |
| 1840 if (!purple_account_get_remember_password(session->account)) | 1838 if (!purple_account_get_remember_password(session->account)) |
| 1841 purple_account_set_password(session->account, NULL); | 1839 purple_account_set_password(session->account, NULL); |
| 1842 #ifdef MSIM_MAX_PASSWORD_LENGTH | 1840 #ifdef MSIM_MAX_PASSWORD_LENGTH |
| 1843 if (session->account->password && (strlen(session->account->password) > MSIM_MAX_PASSWORD_LENGTH)) { | 1841 if (purple_account_get_password(session->account) && (strlen(purple_account_get_password(session->account)) > MSIM_MAX_PASSWORD_LENGTH)) { |
| 1844 gchar *suggestion; | 1842 gchar *suggestion; |
| 1845 | 1843 |
| 1846 suggestion = g_strdup_printf(_("%s Your password is " | 1844 suggestion = g_strdup_printf(_("%s Your password is " |
| 1847 "%zu characters, which is longer than the " | 1845 "%zu characters, which is longer than the " |
| 1848 "maximum length of %d. Please shorten your " | 1846 "maximum length of %d. Please shorten your " |
| 1849 "password at http://profileedit.myspace.com/index.cfm?fuseaction=accountSettings.changePassword and try again."), | 1847 "password at http://profileedit.myspace.com/index.cfm?fuseaction=accountSettings.changePassword and try again."), |
| 1850 full_errmsg, | 1848 full_errmsg, |
| 1851 strlen(session->account->password), | 1849 strlen(purple_account_get_password(session->account)), |
| 1852 MSIM_MAX_PASSWORD_LENGTH); | 1850 MSIM_MAX_PASSWORD_LENGTH); |
| 1853 | 1851 |
| 1854 /* Replace full_errmsg. */ | 1852 /* Replace full_errmsg. */ |
| 1855 g_free(full_errmsg); | 1853 g_free(full_errmsg); |
| 1856 full_errmsg = suggestion; | 1854 full_errmsg = suggestion; |
| 1864 reason = PURPLE_CONNECTION_ERROR_NAME_IN_USE; | 1862 reason = PURPLE_CONNECTION_ERROR_NAME_IN_USE; |
| 1865 if (!purple_account_get_remember_password(session->account)) | 1863 if (!purple_account_get_remember_password(session->account)) |
| 1866 purple_account_set_password(session->account, NULL); | 1864 purple_account_set_password(session->account, NULL); |
| 1867 break; | 1865 break; |
| 1868 } | 1866 } |
| 1869 purple_connection_error_reason(session->gc, reason, full_errmsg); | 1867 purple_connection_error(session->gc, reason, full_errmsg); |
| 1870 } else { | 1868 } else { |
| 1871 purple_notify_error(session->account, _("MySpaceIM Error"), full_errmsg, NULL); | 1869 purple_notify_error(session->account, _("MySpaceIM Error"), full_errmsg, NULL); |
| 1872 } | 1870 } |
| 1873 | 1871 |
| 1874 g_free(full_errmsg); | 1872 g_free(full_errmsg); |
| 2020 | 2018 |
| 2021 g_return_if_fail(gc_uncasted != NULL); | 2019 g_return_if_fail(gc_uncasted != NULL); |
| 2022 g_return_if_fail(source >= 0); /* Note: 0 is a valid fd */ | 2020 g_return_if_fail(source >= 0); /* Note: 0 is a valid fd */ |
| 2023 | 2021 |
| 2024 gc = (PurpleConnection *)(gc_uncasted); | 2022 gc = (PurpleConnection *)(gc_uncasted); |
| 2025 session = gc->proto_data; | 2023 session = purple_connection_get_protocol_data(gc); |
| 2026 | 2024 |
| 2027 /* libpurple/eventloop.h only defines these two */ | 2025 /* libpurple/eventloop.h only defines these two */ |
| 2028 if (cond != PURPLE_INPUT_READ && cond != PURPLE_INPUT_WRITE) { | 2026 if (cond != PURPLE_INPUT_READ && cond != PURPLE_INPUT_WRITE) { |
| 2029 purple_debug_info("msim_input_cb", "unknown condition=%d\n", cond); | 2027 purple_debug_info("msim_input_cb", "unknown condition=%d\n", cond); |
| 2030 purple_connection_error_reason (gc, | 2028 purple_connection_error (gc, |
| 2031 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | 2029 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
| 2032 _("Invalid input condition")); | 2030 _("Invalid input condition")); |
| 2033 return; | 2031 return; |
| 2034 } | 2032 } |
| 2035 | 2033 |
| 2067 /* No worries */ | 2065 /* No worries */ |
| 2068 return; | 2066 return; |
| 2069 | 2067 |
| 2070 tmp = g_strdup_printf(_("Lost connection with server: %s"), | 2068 tmp = g_strdup_printf(_("Lost connection with server: %s"), |
| 2071 g_strerror(errno)); | 2069 g_strerror(errno)); |
| 2072 purple_connection_error_reason(gc, | 2070 purple_connection_error(gc, |
| 2073 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); | 2071 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); |
| 2074 g_free(tmp); | 2072 g_free(tmp); |
| 2075 return; | 2073 return; |
| 2076 } else if (n == 0) { | 2074 } else if (n == 0) { |
| 2077 purple_connection_error_reason(gc, | 2075 purple_connection_error(gc, |
| 2078 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | 2076 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
| 2079 _("Server closed the connection")); | 2077 _("Server closed the connection")); |
| 2080 return; | 2078 return; |
| 2081 } | 2079 } |
| 2082 | 2080 |
| 2090 if (strlen(session->rxbuf + session->rxoff) != n) { | 2088 if (strlen(session->rxbuf + session->rxoff) != n) { |
| 2091 /* Occurs after login, but it is not a null byte. */ | 2089 /* Occurs after login, but it is not a null byte. */ |
| 2092 purple_debug_info("msim", "msim_input_cb: strlen=%d, but read %d bytes" | 2090 purple_debug_info("msim", "msim_input_cb: strlen=%d, but read %d bytes" |
| 2093 "--null byte encountered?\n", | 2091 "--null byte encountered?\n", |
| 2094 strlen(session->rxbuf + session->rxoff), n); | 2092 strlen(session->rxbuf + session->rxoff), n); |
| 2095 /*purple_connection_error_reason (gc, | 2093 /*purple_connection_error (gc, |
| 2096 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | 2094 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
| 2097 "Invalid message - null byte on input"); */ | 2095 "Invalid message - null byte on input"); */ |
| 2098 return; | 2096 return; |
| 2099 } | 2097 } |
| 2100 #endif | 2098 #endif |
| 2115 #endif | 2113 #endif |
| 2116 *end = 0; | 2114 *end = 0; |
| 2117 msg = msim_parse(session->rxbuf); | 2115 msg = msim_parse(session->rxbuf); |
| 2118 if (!msg) { | 2116 if (!msg) { |
| 2119 purple_debug_info("msim", "msim_input_cb: couldn't parse rxbuf\n"); | 2117 purple_debug_info("msim", "msim_input_cb: couldn't parse rxbuf\n"); |
| 2120 purple_connection_error_reason (gc, | 2118 purple_connection_error (gc, |
| 2121 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | 2119 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
| 2122 _("Unable to parse message")); | 2120 _("Unable to parse message")); |
| 2123 break; | 2121 break; |
| 2124 } else { | 2122 } else { |
| 2125 /* Process message and then free it (processing function should | 2123 /* Process message and then free it (processing function should |
| 2155 MsimSession *session; | 2153 MsimSession *session; |
| 2156 | 2154 |
| 2157 g_return_if_fail(data != NULL); | 2155 g_return_if_fail(data != NULL); |
| 2158 | 2156 |
| 2159 gc = (PurpleConnection *)data; | 2157 gc = (PurpleConnection *)data; |
| 2160 session = (MsimSession *)gc->proto_data; | 2158 session = purple_connection_get_protocol_data(gc); |
| 2161 | 2159 |
| 2162 if (source < 0) { | 2160 if (source < 0) { |
| 2163 gchar *tmp = g_strdup_printf(_("Unable to connect: %s"), | 2161 gchar *tmp = g_strdup_printf(_("Unable to connect: %s"), |
| 2164 error_message); | 2162 error_message); |
| 2165 purple_connection_error_reason (gc, | 2163 purple_connection_error (gc, |
| 2166 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); | 2164 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); |
| 2167 g_free(tmp); | 2165 g_free(tmp); |
| 2168 return; | 2166 return; |
| 2169 } | 2167 } |
| 2170 | 2168 |
| 2171 session->fd = source; | 2169 session->fd = source; |
| 2172 | 2170 session->inpa = purple_input_add(source, PURPLE_INPUT_READ, msim_input_cb, gc); |
| 2173 gc->inpa = purple_input_add(source, PURPLE_INPUT_READ, msim_input_cb, gc); | |
| 2174 } | 2171 } |
| 2175 | 2172 |
| 2176 /** | 2173 /** |
| 2177 * Start logging in to the MSIM servers. | 2174 * Start logging in to the MSIM servers. |
| 2178 * | 2175 * |
| 2184 PurpleConnection *gc; | 2181 PurpleConnection *gc; |
| 2185 const gchar *host; | 2182 const gchar *host; |
| 2186 int port; | 2183 int port; |
| 2187 | 2184 |
| 2188 g_return_if_fail(acct != NULL); | 2185 g_return_if_fail(acct != NULL); |
| 2189 g_return_if_fail(acct->username != NULL); | 2186 g_return_if_fail(purple_account_get_username(acct) != NULL); |
| 2190 | 2187 |
| 2191 purple_debug_info("msim", "logging in %s\n", acct->username); | 2188 purple_debug_info("msim", "logging in %s\n", purple_account_get_username(acct)); |
| 2192 | 2189 |
| 2193 gc = purple_account_get_connection(acct); | 2190 gc = purple_account_get_connection(acct); |
| 2194 gc->proto_data = msim_session_new(acct); | 2191 purple_connection_set_protocol_data(gc, msim_session_new(acct)); |
| 2195 gc->flags |= PURPLE_CONNECTION_HTML | PURPLE_CONNECTION_NO_URLDESC; | 2192 purple_connection_set_flags(gc, PURPLE_CONNECTION_HTML | PURPLE_CONNECTION_NO_URLDESC); |
| 2196 | 2193 |
| 2197 /* | 2194 /* |
| 2198 * Lets wipe out our local list of blocked buddies. We'll get a | 2195 * Lets wipe out our local list of blocked buddies. We'll get a |
| 2199 * list of all blocked buddies from the server, and we shouldn't | 2196 * list of all blocked buddies from the server, and we shouldn't |
| 2200 * have stuff in the local list that isn't on the server list. | 2197 * have stuff in the local list that isn't on the server list. |
| 2217 | 2214 |
| 2218 /* Calls msim_connect_cb when connected. */ | 2215 /* Calls msim_connect_cb when connected. */ |
| 2219 if (!purple_proxy_connect(gc, acct, host, port, msim_connect_cb, gc)) { | 2216 if (!purple_proxy_connect(gc, acct, host, port, msim_connect_cb, gc)) { |
| 2220 /* TODO: try other ports if in auto mode, then save | 2217 /* TODO: try other ports if in auto mode, then save |
| 2221 * working port and try that first next time. */ | 2218 * working port and try that first next time. */ |
| 2222 purple_connection_error_reason (gc, | 2219 purple_connection_error (gc, |
| 2223 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, | 2220 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, |
| 2224 _("Unable to connect")); | 2221 _("Unable to connect")); |
| 2225 return; | 2222 return; |
| 2226 } | 2223 } |
| 2227 } | 2224 } |
| 2257 while (buddies != NULL) { | 2254 while (buddies != NULL) { |
| 2258 msim_buddy_free(buddies->data); | 2255 msim_buddy_free(buddies->data); |
| 2259 buddies = g_slist_delete_link(buddies, buddies); | 2256 buddies = g_slist_delete_link(buddies, buddies); |
| 2260 } | 2257 } |
| 2261 | 2258 |
| 2262 session = (MsimSession *)gc->proto_data; | 2259 session = purple_connection_get_protocol_data(gc); |
| 2263 if (session == NULL) | 2260 if (session == NULL) |
| 2264 return; | 2261 return; |
| 2265 | 2262 |
| 2266 gc->proto_data = NULL; | 2263 purple_connection_set_protocol_data(gc, NULL); |
| 2267 | 2264 |
| 2268 if (session->gc->inpa) { | 2265 if (session->inpa) { |
| 2269 purple_input_remove(session->gc->inpa); | 2266 purple_input_remove(session->inpa); |
| 2267 session->inpa = 0; | |
| 2270 } | 2268 } |
| 2271 if (session->fd >= 0) { | 2269 if (session->fd >= 0) { |
| 2272 close(session->fd); | 2270 close(session->fd); |
| 2273 session->fd = -1; | 2271 session->fd = -1; |
| 2274 } | 2272 } |
| 2302 g_return_val_if_fail(who != NULL, -1); | 2300 g_return_val_if_fail(who != NULL, -1); |
| 2303 g_return_val_if_fail(message != NULL, -1); | 2301 g_return_val_if_fail(message != NULL, -1); |
| 2304 | 2302 |
| 2305 /* 'flags' has many options, not used here. */ | 2303 /* 'flags' has many options, not used here. */ |
| 2306 | 2304 |
| 2307 session = (MsimSession *)gc->proto_data; | 2305 session = purple_connection_get_protocol_data(gc); |
| 2308 | 2306 |
| 2309 message_msim = html_to_msim_markup(session, message); | 2307 message_msim = html_to_msim_markup(session, message); |
| 2310 | 2308 |
| 2311 if (msim_send_bm(session, who, message_msim, MSIM_BM_ACTION_OR_IM_DELAYABLE)) { | 2309 if (msim_send_bm(session, who, message_msim, MSIM_BM_ACTION_OR_IM_DELAYABLE)) { |
| 2312 /* Return 1 to have Purple show this IM as being sent, 0 to not. I always | 2310 /* Return 1 to have Purple show this IM as being sent, 0 to not. I always |
| 2342 MsimSession *session; | 2340 MsimSession *session; |
| 2343 | 2341 |
| 2344 g_return_val_if_fail(gc != NULL, 0); | 2342 g_return_val_if_fail(gc != NULL, 0); |
| 2345 g_return_val_if_fail(name != NULL, 0); | 2343 g_return_val_if_fail(name != NULL, 0); |
| 2346 | 2344 |
| 2347 session = (MsimSession *)gc->proto_data; | 2345 session = purple_connection_get_protocol_data(gc); |
| 2348 | 2346 |
| 2349 switch (state) { | 2347 switch (state) { |
| 2350 case PURPLE_TYPING: | 2348 case PURPLE_TYPING: |
| 2351 typing_str = "%typing%"; | 2349 typing_str = "%typing%"; |
| 2352 break; | 2350 break; |
| 2428 MsimMessage *user_msg; | 2426 MsimMessage *user_msg; |
| 2429 | 2427 |
| 2430 g_return_if_fail(gc != NULL); | 2428 g_return_if_fail(gc != NULL); |
| 2431 g_return_if_fail(username != NULL); | 2429 g_return_if_fail(username != NULL); |
| 2432 | 2430 |
| 2433 session = (MsimSession *)gc->proto_data; | 2431 session = purple_connection_get_protocol_data(gc); |
| 2434 | 2432 |
| 2435 /* Obtain uid of buddy. */ | 2433 /* Obtain uid of buddy. */ |
| 2436 user = msim_find_user(session, username); | 2434 user = msim_find_user(session, username); |
| 2437 | 2435 |
| 2438 /* If is on buddy list, lookup by uid since it is faster. */ | 2436 /* If is on buddy list, lookup by uid since it is faster. */ |
| 2485 * Set your status - callback for when user manually sets it. | 2483 * Set your status - callback for when user manually sets it. |
| 2486 */ | 2484 */ |
| 2487 static void | 2485 static void |
| 2488 msim_set_status(PurpleAccount *account, PurpleStatus *status) | 2486 msim_set_status(PurpleAccount *account, PurpleStatus *status) |
| 2489 { | 2487 { |
| 2488 PurpleConnection *gc = purple_account_get_connection(account); | |
| 2490 PurpleStatusType *type; | 2489 PurpleStatusType *type; |
| 2491 PurplePresence *pres; | 2490 PurplePresence *pres; |
| 2492 MsimSession *session; | 2491 MsimSession *session; |
| 2493 guint status_code; | 2492 guint status_code; |
| 2494 const gchar *message; | 2493 const gchar *message; |
| 2495 gchar *stripped; | 2494 gchar *stripped; |
| 2496 gchar *unrecognized_msg; | 2495 gchar *unrecognized_msg; |
| 2497 | 2496 |
| 2498 session = (MsimSession *)account->gc->proto_data; | 2497 session = purple_connection_get_protocol_data(gc); |
| 2499 | 2498 |
| 2500 type = purple_status_get_type(status); | 2499 type = purple_status_get_type(status); |
| 2501 pres = purple_status_get_presence(status); | 2500 pres = purple_status_get_presence(status); |
| 2502 | 2501 |
| 2503 switch (purple_status_type_get_primitive(type)) { | 2502 switch (purple_status_type_get_primitive(type)) { |
| 2542 | 2541 |
| 2543 msim_set_status_code(session, status_code, stripped); | 2542 msim_set_status_code(session, status_code, stripped); |
| 2544 | 2543 |
| 2545 /* If we should be idle, set that status. Time is irrelevant here. */ | 2544 /* If we should be idle, set that status. Time is irrelevant here. */ |
| 2546 if (purple_presence_is_idle(pres) && status_code != MSIM_STATUS_CODE_OFFLINE_OR_HIDDEN) | 2545 if (purple_presence_is_idle(pres) && status_code != MSIM_STATUS_CODE_OFFLINE_OR_HIDDEN) |
| 2547 msim_set_idle(account->gc, 1); | 2546 msim_set_idle(purple_account_get_connection(account), 1); |
| 2548 } | 2547 } |
| 2549 | 2548 |
| 2550 /** | 2549 /** |
| 2551 * Go idle. | 2550 * Go idle. |
| 2552 */ | 2551 */ |
| 2556 MsimSession *session; | 2555 MsimSession *session; |
| 2557 PurpleStatus *status; | 2556 PurpleStatus *status; |
| 2558 | 2557 |
| 2559 g_return_if_fail(gc != NULL); | 2558 g_return_if_fail(gc != NULL); |
| 2560 | 2559 |
| 2561 session = (MsimSession *)gc->proto_data; | 2560 session = purple_connection_get_protocol_data(gc); |
| 2562 | 2561 |
| 2563 status = purple_account_get_active_status(session->account); | 2562 status = purple_account_get_active_status(session->account); |
| 2564 | 2563 |
| 2565 if (time == 0) { | 2564 if (time == 0) { |
| 2566 /* Going back from idle. In msim, idle is mutually exclusive | 2565 /* Going back from idle. In msim, idle is mutually exclusive |
| 2626 | 2625 |
| 2627 /** | 2626 /** |
| 2628 * Add a buddy to user's buddy list. | 2627 * Add a buddy to user's buddy list. |
| 2629 */ | 2628 */ |
| 2630 static void | 2629 static void |
| 2631 msim_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) | 2630 msim_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group, const char *message) |
| 2632 { | 2631 { |
| 2633 MsimSession *session; | 2632 MsimSession *session; |
| 2634 MsimMessage *msg; | 2633 MsimMessage *msg; |
| 2635 MsimMessage *msg_persist; | 2634 MsimMessage *msg_persist; |
| 2636 MsimMessage *body; | 2635 MsimMessage *body; |
| 2637 const char *name, *gname; | 2636 const char *name, *gname; |
| 2638 | 2637 |
| 2639 session = (MsimSession *)gc->proto_data; | 2638 session = purple_connection_get_protocol_data(gc); |
| 2640 name = purple_buddy_get_name(buddy); | 2639 name = purple_buddy_get_name(buddy); |
| 2641 gname = group ? purple_group_get_name(group) : NULL; | 2640 gname = group ? purple_group_get_name(group) : NULL; |
| 2642 | 2641 |
| 2643 if (msim_get_user_from_buddy(buddy, FALSE) != NULL) | 2642 if (msim_get_user_from_buddy(buddy, FALSE) != NULL) |
| 2644 return; | 2643 return; |
| 2707 MsimSession *session; | 2706 MsimSession *session; |
| 2708 MsimMessage *delbuddy_msg; | 2707 MsimMessage *delbuddy_msg; |
| 2709 MsimMessage *persist_msg; | 2708 MsimMessage *persist_msg; |
| 2710 const char *name; | 2709 const char *name; |
| 2711 | 2710 |
| 2712 session = (MsimSession *)gc->proto_data; | 2711 session = purple_connection_get_protocol_data(gc); |
| 2713 name = purple_buddy_get_name(buddy); | 2712 name = purple_buddy_get_name(buddy); |
| 2714 | 2713 |
| 2715 delbuddy_msg = msim_msg_new( | 2714 delbuddy_msg = msim_msg_new( |
| 2716 "delbuddy", MSIM_TYPE_BOOLEAN, TRUE, | 2715 "delbuddy", MSIM_TYPE_BOOLEAN, TRUE, |
| 2717 "sesskey", MSIM_TYPE_INTEGER, session->sesskey, | 2716 "sesskey", MSIM_TYPE_INTEGER, session->sesskey, |
| 2764 msim_add_deny(PurpleConnection *gc, const char *name) | 2763 msim_add_deny(PurpleConnection *gc, const char *name) |
| 2765 { | 2764 { |
| 2766 MsimSession *session; | 2765 MsimSession *session; |
| 2767 MsimMessage *msg, *body; | 2766 MsimMessage *msg, *body; |
| 2768 | 2767 |
| 2769 session = (MsimSession *)gc->proto_data; | 2768 session = purple_connection_get_protocol_data(gc); |
| 2770 | 2769 |
| 2771 /* Remove from buddy list */ | 2770 /* Remove from buddy list */ |
| 2772 msg = msim_msg_new( | 2771 msg = msim_msg_new( |
| 2773 "delbuddy", MSIM_TYPE_BOOLEAN, TRUE, | 2772 "delbuddy", MSIM_TYPE_BOOLEAN, TRUE, |
| 2774 "sesskey", MSIM_TYPE_INTEGER, session->sesskey, | 2773 "sesskey", MSIM_TYPE_INTEGER, session->sesskey, |
| 2816 msim_rem_deny(PurpleConnection *gc, const char *name) | 2815 msim_rem_deny(PurpleConnection *gc, const char *name) |
| 2817 { | 2816 { |
| 2818 MsimSession *session; | 2817 MsimSession *session; |
| 2819 MsimMessage *msg, *body; | 2818 MsimMessage *msg, *body; |
| 2820 | 2819 |
| 2821 session = (MsimSession *)gc->proto_data; | 2820 session = purple_connection_get_protocol_data(gc); |
| 2822 | 2821 |
| 2823 /* | 2822 /* |
| 2824 * Remove from our list of blocked contacts, so we know they | 2823 * Remove from our list of blocked contacts, so we know they |
| 2825 * are no longer blocked if we log in with another client | 2824 * are no longer blocked if we log in with another client |
| 2826 */ | 2825 */ |
| 2863 if (msim_is_userid(str)) { | 2862 if (msim_is_userid(str)) { |
| 2864 /* Have user ID, we need to get their username first :) */ | 2863 /* Have user ID, we need to get their username first :) */ |
| 2865 const char *username; | 2864 const char *username; |
| 2866 | 2865 |
| 2867 /* If the account does not exist, we can't look up the user. */ | 2866 /* If the account does not exist, we can't look up the user. */ |
| 2868 if (!account || !account->gc) | 2867 if (!account || !purple_account_get_connection(account)) |
| 2869 return str; | 2868 return str; |
| 2870 | 2869 |
| 2871 id = atol(str); | 2870 id = atol(str); |
| 2872 username = msim_uid2username_from_blist((PurpleAccount *)account, id); | 2871 username = msim_uid2username_from_blist((PurpleAccount *)account, id); |
| 2873 if (!username) { | 2872 if (!username) { |
| 2946 | 2945 |
| 2947 g_return_val_if_fail(gc != NULL, -1); | 2946 g_return_val_if_fail(gc != NULL, -1); |
| 2948 g_return_val_if_fail(buf != NULL, -1); | 2947 g_return_val_if_fail(buf != NULL, -1); |
| 2949 g_return_val_if_fail(total_bytes >= 0, -1); | 2948 g_return_val_if_fail(total_bytes >= 0, -1); |
| 2950 | 2949 |
| 2951 session = (MsimSession *)gc->proto_data; | 2950 session = purple_connection_get_protocol_data(gc); |
| 2952 | 2951 |
| 2953 /* Loop until all data is sent, or a failure occurs. */ | 2952 /* Loop until all data is sent, or a failure occurs. */ |
| 2954 total_bytes_sent = 0; | 2953 total_bytes_sent = 0; |
| 2955 do { | 2954 do { |
| 2956 int bytes_sent; | 2955 int bytes_sent; |
| 3006 | 3005 |
| 3007 /** | 3006 /** |
| 3008 * Callbacks called by Purple, to access this plugin. | 3007 * Callbacks called by Purple, to access this plugin. |
| 3009 */ | 3008 */ |
| 3010 static PurplePluginProtocolInfo prpl_info = { | 3009 static PurplePluginProtocolInfo prpl_info = { |
| 3010 sizeof(PurplePluginProtocolInfo), /* struct_size */ | |
| 3011 /* options */ | 3011 /* options */ |
| 3012 OPT_PROTO_USE_POINTSIZE /* specify font size in sane point size */ | 3012 OPT_PROTO_USE_POINTSIZE /* specify font size in sane point size */ |
| 3013 | OPT_PROTO_MAIL_CHECK, | 3013 | OPT_PROTO_MAIL_CHECK, |
| 3014 | 3014 |
| 3015 /* | OPT_PROTO_IM_IMAGE - TODO: direct images. */ | 3015 /* | OPT_PROTO_IM_IMAGE - TODO: direct images. */ |
| 3050 NULL, /* chat_whisper */ | 3050 NULL, /* chat_whisper */ |
| 3051 NULL, /* chat_send */ | 3051 NULL, /* chat_send */ |
| 3052 NULL, /* keepalive */ | 3052 NULL, /* keepalive */ |
| 3053 NULL, /* register_user */ | 3053 NULL, /* register_user */ |
| 3054 NULL, /* get_cb_info */ | 3054 NULL, /* get_cb_info */ |
| 3055 NULL, /* get_cb_away */ | |
| 3056 NULL, /* alias_buddy */ | 3055 NULL, /* alias_buddy */ |
| 3057 NULL, /* group_buddy */ | 3056 NULL, /* group_buddy */ |
| 3058 NULL, /* rename_group */ | 3057 NULL, /* rename_group */ |
| 3059 msim_buddy_free, /* buddy_free */ | 3058 msim_buddy_free, /* buddy_free */ |
| 3060 NULL, /* convo_closed */ | 3059 NULL, /* convo_closed */ |
| 3075 msim_send_really_raw, /* send_raw */ | 3074 msim_send_really_raw, /* send_raw */ |
| 3076 NULL, /* roomlist_room_serialize */ | 3075 NULL, /* roomlist_room_serialize */ |
| 3077 NULL, /* unregister_user */ | 3076 NULL, /* unregister_user */ |
| 3078 msim_send_attention, /* send_attention */ | 3077 msim_send_attention, /* send_attention */ |
| 3079 msim_attention_types, /* attention_types */ | 3078 msim_attention_types, /* attention_types */ |
| 3080 sizeof(PurplePluginProtocolInfo), /* struct_size */ | |
| 3081 msim_get_account_text_table, /* get_account_text_table */ | 3079 msim_get_account_text_table, /* get_account_text_table */ |
| 3082 NULL, /* initiate_media */ | 3080 NULL, /* initiate_media */ |
| 3083 NULL, /* get_media_caps */ | 3081 NULL, /* get_media_caps */ |
| 3084 NULL, /* get_moods */ | 3082 NULL, /* get_moods */ |
| 3085 NULL, /* set_public_alias */ | 3083 NULL, /* set_public_alias */ |
| 3086 NULL, /* get_public_alias */ | 3084 NULL /* get_public_alias */ |
| 3087 NULL, /* add_buddy_with_invite */ | |
| 3088 NULL /* add_buddies_with_invite */ | |
| 3089 }; | 3085 }; |
| 3090 | 3086 |
| 3091 /** | 3087 /** |
| 3092 * Load the plugin. | 3088 * Load the plugin. |
| 3093 */ | 3089 */ |
| 3149 PurpleConnection *gc; | 3145 PurpleConnection *gc; |
| 3150 MsimSession *session; | 3146 MsimSession *session; |
| 3151 gchar *group_name; | 3147 gchar *group_name; |
| 3152 | 3148 |
| 3153 gc = (PurpleConnection *)action->context; | 3149 gc = (PurpleConnection *)action->context; |
| 3154 session = (MsimSession *)gc->proto_data; | 3150 session = purple_connection_get_protocol_data(gc); |
| 3155 | 3151 |
| 3156 group_name = "MySpace Friends"; | 3152 group_name = "MySpace Friends"; |
| 3157 | 3153 |
| 3158 g_return_if_fail(msim_send(session, | 3154 g_return_if_fail(msim_send(session, |
| 3159 "persist", MSIM_TYPE_INTEGER, 1, | 3155 "persist", MSIM_TYPE_INTEGER, 1, |
| 3528 | 3524 |
| 3529 static gboolean | 3525 static gboolean |
| 3530 msim_uri_handler(const gchar *proto, const gchar *cmd, GHashTable *params) | 3526 msim_uri_handler(const gchar *proto, const gchar *cmd, GHashTable *params) |
| 3531 { | 3527 { |
| 3532 PurpleAccount *account; | 3528 PurpleAccount *account; |
| 3529 PurpleConnection *gc; | |
| 3533 MsimSession *session; | 3530 MsimSession *session; |
| 3534 GList *l; | 3531 GList *l; |
| 3535 gchar *uid_str, *cid_str; | 3532 gchar *uid_str, *cid_str; |
| 3536 guint uid, cid; | 3533 guint uid, cid; |
| 3537 | 3534 |
| 3576 _("Enable the proper MySpaceIM account and try again.")); | 3573 _("Enable the proper MySpaceIM account and try again.")); |
| 3577 g_free(cid_str); | 3574 g_free(cid_str); |
| 3578 return FALSE; | 3575 return FALSE; |
| 3579 } | 3576 } |
| 3580 | 3577 |
| 3581 session = (MsimSession *)account->gc->proto_data; | 3578 gc = purple_account_get_connection(account); |
| 3579 session = purple_connection_get_protocol_data(gc); | |
| 3582 g_return_val_if_fail(session != NULL, FALSE); | 3580 g_return_val_if_fail(session != NULL, FALSE); |
| 3583 | 3581 |
| 3584 /* Lookup userid to username. TODO: push this down, to IM sending/contact | 3582 /* Lookup userid to username. TODO: push this down, to IM sending/contact |
| 3585 * adding functions. */ | 3583 * adding functions. */ |
| 3586 | 3584 |
