comparison libpurple/protocols/msn/msn.c @ 30730:f8ec889c5bce

propagate from branch 'im.pidgin.pidgin' (head f6cdf8776559775f9a4a72563e69741e139518bd) to branch 'im.pidgin.cpw.qulogic.msnp16' (head ee6655c65ffae7f61734aa5a05267a3f5a4fc0de)
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Mon, 10 May 2010 23:21:44 +0000
parents 2a5dbea6ab6b ec89b1d8571a
children 66e7fe9f7810
comparison
equal deleted inserted replaced
30729:edb7c80bf930 30730:f8ec889c5bce
192 purple_prpl_send_attention(gc, username, MSN_NUDGE); 192 purple_prpl_send_attention(gc, username, MSN_NUDGE);
193 193
194 return PURPLE_CMD_RET_OK; 194 return PURPLE_CMD_RET_OK;
195 } 195 }
196 196
197 struct public_alias_closure
198 {
199 PurpleAccount *account;
200 gpointer success_cb;
201 gpointer failure_cb;
202 };
203
204 static gboolean
205 set_public_alias_length_error(gpointer data)
206 {
207 struct public_alias_closure *closure = data;
208 PurpleSetPublicAliasFailureCallback failure_cb = closure->failure_cb;
209
210 failure_cb(closure->account, _("Your new MSN friendly name is too long."));
211 g_free(closure);
212
213 return FALSE;
214 }
215
216 static void
217 prp_success_cb(MsnCmdProc *cmdproc, MsnCommand *cmd)
218 {
219 const char *type, *friendlyname;
220 struct public_alias_closure *closure;
221
222 g_return_if_fail(cmd->param_count >= 3);
223 type = cmd->params[1];
224 g_return_if_fail(!strcmp(type, "MFN"));
225
226 closure = cmd->trans->data;
227 friendlyname = purple_url_decode(cmd->params[2]);
228
229 msn_update_contact(cmdproc->session, "Me", MSN_UPDATE_DISPLAY, friendlyname);
230
231 purple_connection_set_display_name(
232 purple_account_get_connection(closure->account),
233 friendlyname);
234 purple_account_set_string(closure->account, "display-name", friendlyname);
235
236 if (closure->success_cb) {
237 PurpleSetPublicAliasSuccessCallback success_cb = closure->success_cb;
238 success_cb(closure->account, friendlyname);
239 }
240 }
241
242 static void
243 prp_error_cb(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
244 {
245 struct public_alias_closure *closure = trans->data;
246 PurpleSetPublicAliasFailureCallback failure_cb = closure->failure_cb;
247 gboolean debug;
248 const char *error_text;
249
250 error_text = msn_error_get_text(error, &debug);
251 failure_cb(closure->account, error_text);
252 }
253
254 static void
255 prp_timeout_cb(MsnCmdProc *cmdproc, MsnTransaction *trans)
256 {
257 struct public_alias_closure *closure = trans->data;
258 PurpleSetPublicAliasFailureCallback failure_cb = closure->failure_cb;
259 failure_cb(closure->account, _("Connection Timeout"));
260 }
261
197 void 262 void
198 msn_act_id(PurpleConnection *gc, const char *entry) 263 msn_set_public_alias(PurpleConnection *pc, const char *alias,
264 PurpleSetPublicAliasSuccessCallback success_cb,
265 PurpleSetPublicAliasFailureCallback failure_cb)
199 { 266 {
200 MsnCmdProc *cmdproc; 267 MsnCmdProc *cmdproc;
201 MsnSession *session; 268 MsnSession *session;
202 MsnTransaction *trans; 269 MsnTransaction *trans;
203 PurpleAccount *account; 270 PurpleAccount *account;
271 const char *real_alias;
272 struct public_alias_closure *closure;
273
274 session = purple_connection_get_protocol_data(pc);
275 cmdproc = session->notification->cmdproc;
276 account = purple_connection_get_account(pc);
277
278 if (alias && *alias)
279 {
280 char *tmp = g_strdup(alias);
281 real_alias = purple_url_encode(g_strstrip(tmp));
282 g_free(tmp);
283 }
284 else
285 real_alias = "";
286
287 if (strlen(real_alias) > BUDDY_ALIAS_MAXLEN)
288 {
289 if (failure_cb) {
290 struct public_alias_closure *closure =
291 g_new0(struct public_alias_closure, 1);
292 closure->account = account;
293 closure->failure_cb = failure_cb;
294 purple_timeout_add(0, set_public_alias_length_error, closure);
295 } else {
296 purple_notify_error(pc, NULL,
297 _("Your new MSN friendly name is too long."),
298 NULL);
299 }
300 return;
301 }
302
303 if (*real_alias == '\0') {
304 real_alias = purple_url_encode(purple_account_get_username(account));
305 }
306
307 closure = g_new0(struct public_alias_closure, 1);
308 closure->account = account;
309 closure->success_cb = success_cb;
310 closure->failure_cb = failure_cb;
311
312 trans = msn_transaction_new(cmdproc, "PRP", "MFN %s", real_alias);
313 msn_transaction_set_data(trans, closure);
314 msn_transaction_set_data_free(trans, g_free);
315 msn_transaction_add_cb(trans, "PRP", prp_success_cb);
316 if (failure_cb) {
317 msn_transaction_set_error_cb(trans, prp_error_cb);
318 msn_transaction_set_timeout_cb(trans, prp_timeout_cb);
319 }
320 msn_cmdproc_send_trans(cmdproc, trans);
321 }
322
323 static gboolean
324 get_public_alias_cb(gpointer data)
325 {
326 struct public_alias_closure *closure = data;
327 PurpleGetPublicAliasSuccessCallback success_cb = closure->success_cb;
204 const char *alias; 328 const char *alias;
205 329
206 session = gc->proto_data; 330 alias = purple_account_get_string(closure->account, "display-name",
207 cmdproc = session->notification->cmdproc; 331 purple_account_get_username(closure->account));
208 account = purple_connection_get_account(gc); 332 success_cb(closure->account, alias);
209 333 g_free(closure);
210 if (entry && *entry) 334
211 { 335 return FALSE;
212 char *tmp = g_strdup(entry); 336 }
213 alias = purple_url_encode(g_strstrip(tmp)); 337
214 g_free(tmp); 338 static void
215 } 339 msn_get_public_alias(PurpleConnection *pc,
216 else 340 PurpleGetPublicAliasSuccessCallback success_cb,
217 alias = ""; 341 PurpleGetPublicAliasFailureCallback failure_cb)
218 342 {
219 if (strlen(alias) > BUDDY_ALIAS_MAXLEN) 343 struct public_alias_closure *closure = g_new0(struct public_alias_closure, 1);
220 { 344 PurpleAccount *account = purple_connection_get_account(pc);
221 purple_notify_error(gc, NULL, 345
222 _("Your new MSN friendly name is too long."), NULL); 346 closure->account = account;
223 return; 347 closure->success_cb = success_cb;
224 } 348 purple_timeout_add(0, get_public_alias_cb, closure);
225 349 }
226 if (*alias == '\0') { 350
227 alias = purple_url_encode(purple_account_get_username(account)); 351 static void
228 } 352 msn_act_id(PurpleConnection *gc, const char *entry)
229 353 {
230 trans = msn_transaction_new(cmdproc, "PRP", "MFN %s", alias); 354 msn_set_public_alias(gc, entry, NULL, NULL);
231
232 msn_cmdproc_send_trans(cmdproc, trans);
233 } 355 }
234 356
235 static void 357 static void
236 msn_set_prp(PurpleConnection *gc, const char *type, const char *entry) 358 msn_set_prp(PurpleConnection *gc, const char *type, const char *entry)
237 { 359 {
2797 2919
2798 2920
2799 static PurplePluginProtocolInfo prpl_info = 2921 static PurplePluginProtocolInfo prpl_info =
2800 { 2922 {
2801 OPT_PROTO_MAIL_CHECK, 2923 OPT_PROTO_MAIL_CHECK,
2802 NULL, /* user_splits */ 2924 NULL, /* user_splits */
2803 NULL, /* protocol_options */ 2925 NULL, /* protocol_options */
2804 {"png,gif", 0, 0, 96, 96, 0, PURPLE_ICON_SCALE_SEND}, /* icon_spec */ 2926 {"png,gif", 0, 0, 96, 96, 0, PURPLE_ICON_SCALE_SEND}, /* icon_spec */
2805 msn_list_icon, /* list_icon */ 2927 msn_list_icon, /* list_icon */
2806 msn_list_emblems, /* list_emblems */ 2928 msn_list_emblems, /* list_emblems */
2807 msn_status_text, /* status_text */ 2929 msn_status_text, /* status_text */
2808 msn_tooltip_text, /* tooltip_text */ 2930 msn_tooltip_text, /* tooltip_text */
2809 msn_status_types, /* away_states */ 2931 msn_status_types, /* away_states */
2810 msn_blist_node_menu, /* blist_node_menu */ 2932 msn_blist_node_menu, /* blist_node_menu */
2811 NULL, /* chat_info */ 2933 NULL, /* chat_info */
2812 NULL, /* chat_info_defaults */ 2934 NULL, /* chat_info_defaults */
2813 msn_login, /* login */ 2935 msn_login, /* login */
2814 msn_close, /* close */ 2936 msn_close, /* close */
2815 msn_send_im, /* send_im */ 2937 msn_send_im, /* send_im */
2816 NULL, /* set_info */ 2938 NULL, /* set_info */
2817 msn_send_typing, /* send_typing */ 2939 msn_send_typing, /* send_typing */
2818 msn_get_info, /* get_info */ 2940 msn_get_info, /* get_info */
2819 msn_set_status, /* set_away */ 2941 msn_set_status, /* set_away */
2820 msn_set_idle, /* set_idle */ 2942 msn_set_idle, /* set_idle */
2821 NULL, /* change_passwd */ 2943 NULL, /* change_passwd */
2822 msn_add_buddy, /* add_buddy */ 2944 msn_add_buddy, /* add_buddy */
2823 NULL, /* add_buddies */ 2945 NULL, /* add_buddies */
2824 msn_rem_buddy, /* remove_buddy */ 2946 msn_rem_buddy, /* remove_buddy */
2825 NULL, /* remove_buddies */ 2947 NULL, /* remove_buddies */
2826 msn_add_permit, /* add_permit */ 2948 msn_add_permit, /* add_permit */
2827 msn_add_deny, /* add_deny */ 2949 msn_add_deny, /* add_deny */
2828 msn_rem_permit, /* rem_permit */ 2950 msn_rem_permit, /* rem_permit */
2829 msn_rem_deny, /* rem_deny */ 2951 msn_rem_deny, /* rem_deny */
2830 msn_set_permit_deny, /* set_permit_deny */ 2952 msn_set_permit_deny, /* set_permit_deny */
2831 NULL, /* join_chat */ 2953 NULL, /* join_chat */
2832 NULL, /* reject chat invite */ 2954 NULL, /* reject chat invite */
2833 NULL, /* get_chat_name */ 2955 NULL, /* get_chat_name */
2834 msn_chat_invite, /* chat_invite */ 2956 msn_chat_invite, /* chat_invite */
2835 msn_chat_leave, /* chat_leave */ 2957 msn_chat_leave, /* chat_leave */
2836 NULL, /* chat_whisper */ 2958 NULL, /* chat_whisper */
2837 msn_chat_send, /* chat_send */ 2959 msn_chat_send, /* chat_send */
2838 msn_keepalive, /* keepalive */ 2960 msn_keepalive, /* keepalive */
2839 NULL, /* register_user */ 2961 NULL, /* register_user */
2840 NULL, /* get_cb_info */ 2962 NULL, /* get_cb_info */
2841 NULL, /* get_cb_away */ 2963 NULL, /* get_cb_away */
2842 msn_alias_buddy, /* alias_buddy */ 2964 msn_alias_buddy, /* alias_buddy */
2843 msn_group_buddy, /* group_buddy */ 2965 msn_group_buddy, /* group_buddy */
2844 msn_rename_group, /* rename_group */ 2966 msn_rename_group, /* rename_group */
2845 NULL, /* buddy_free */ 2967 NULL, /* buddy_free */
2846 msn_convo_closed, /* convo_closed */ 2968 msn_convo_closed, /* convo_closed */
2847 msn_normalize, /* normalize */ 2969 msn_normalize, /* normalize */
2848 msn_set_buddy_icon, /* set_buddy_icon */ 2970 msn_set_buddy_icon, /* set_buddy_icon */
2849 msn_remove_group, /* remove_group */ 2971 msn_remove_group, /* remove_group */
2850 NULL, /* get_cb_real_name */ 2972 NULL, /* get_cb_real_name */
2851 NULL, /* set_chat_topic */ 2973 NULL, /* set_chat_topic */
2852 NULL, /* find_blist_chat */ 2974 NULL, /* find_blist_chat */
2853 NULL, /* roomlist_get_list */ 2975 NULL, /* roomlist_get_list */
2854 NULL, /* roomlist_cancel */ 2976 NULL, /* roomlist_cancel */
2855 NULL, /* roomlist_expand_category */ 2977 NULL, /* roomlist_expand_category */
2856 msn_can_receive_file, /* can_receive_file */ 2978 msn_can_receive_file, /* can_receive_file */
2857 msn_send_file, /* send_file */ 2979 msn_send_file, /* send_file */
2858 msn_new_xfer, /* new_xfer */ 2980 msn_new_xfer, /* new_xfer */
2859 msn_offline_message, /* offline_message */ 2981 msn_offline_message, /* offline_message */
2860 NULL, /* whiteboard_prpl_ops */ 2982 NULL, /* whiteboard_prpl_ops */
2861 NULL, /* send_raw */ 2983 NULL, /* send_raw */
2862 NULL, /* roomlist_room_serialize */ 2984 NULL, /* roomlist_room_serialize */
2863 NULL, /* unregister_user */ 2985 NULL, /* unregister_user */
2864 msn_send_attention, /* send_attention */ 2986 msn_send_attention, /* send_attention */
2865 msn_attention_types, /* attention_types */ 2987 msn_attention_types, /* attention_types */
2866 sizeof(PurplePluginProtocolInfo), /* struct_size */ 2988 sizeof(PurplePluginProtocolInfo), /* struct_size */
2867 msn_get_account_text_table, /* get_account_text_table */ 2989 msn_get_account_text_table, /* get_account_text_table */
2868 NULL, /* initiate_media */ 2990 NULL, /* initiate_media */
2869 NULL, /* get_media_caps */ 2991 NULL, /* get_media_caps */
2870 NULL /* get_moods */ 2992 NULL, /* get_moods */
2993 msn_set_public_alias, /* set_public_alias */
2994 msn_get_public_alias /* get_public_alias */
2871 }; 2995 };
2872 2996
2873 static PurplePluginInfo info = 2997 static PurplePluginInfo info =
2874 { 2998 {
2875 PURPLE_PLUGIN_MAGIC, 2999 PURPLE_PLUGIN_MAGIC,