Mercurial > pidgin.yaz
diff libpurple/protocols/msn/msn.c @ 30361:46275cca345e
merged from im.pidgin.pidgin
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Fri, 14 May 2010 17:24:16 +0900 |
parents | 77aba27f64da ec89b1d8571a |
children | 9623db527d1e |
line wrap: on
line diff
--- a/libpurple/protocols/msn/msn.c Mon May 10 16:36:58 2010 +0900 +++ b/libpurple/protocols/msn/msn.c Fri May 14 17:24:16 2010 +0900 @@ -195,43 +195,166 @@ return PURPLE_CMD_RET_OK; } +struct public_alias_closure +{ + PurpleAccount *account; + gpointer success_cb; + gpointer failure_cb; +}; + +static gboolean +set_public_alias_length_error(gpointer data) +{ + struct public_alias_closure *closure = data; + PurpleSetPublicAliasFailureCallback failure_cb = closure->failure_cb; + + failure_cb(closure->account, _("Your new MSN friendly name is too long.")); + g_free(closure); + + return FALSE; +} + +static void +prp_success_cb(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + const char *type, *friendlyname; + struct public_alias_closure *closure; + + g_return_if_fail(cmd->param_count >= 3); + type = cmd->params[1]; + g_return_if_fail(!strcmp(type, "MFN")); + + closure = cmd->trans->data; + friendlyname = purple_url_decode(cmd->params[2]); + + msn_update_contact(cmdproc->session, "Me", MSN_UPDATE_DISPLAY, friendlyname); + + purple_connection_set_display_name( + purple_account_get_connection(closure->account), + friendlyname); + purple_account_set_string(closure->account, "display-name", friendlyname); + + if (closure->success_cb) { + PurpleSetPublicAliasSuccessCallback success_cb = closure->success_cb; + success_cb(closure->account, friendlyname); + } +} + +static void +prp_error_cb(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) +{ + struct public_alias_closure *closure = trans->data; + PurpleSetPublicAliasFailureCallback failure_cb = closure->failure_cb; + gboolean debug; + const char *error_text; + + error_text = msn_error_get_text(error, &debug); + failure_cb(closure->account, error_text); +} + +static void +prp_timeout_cb(MsnCmdProc *cmdproc, MsnTransaction *trans) +{ + struct public_alias_closure *closure = trans->data; + PurpleSetPublicAliasFailureCallback failure_cb = closure->failure_cb; + failure_cb(closure->account, _("Connection Timeout")); +} + void -msn_act_id(PurpleConnection *gc, const char *entry) +msn_set_public_alias(PurpleConnection *pc, const char *alias, + PurpleSetPublicAliasSuccessCallback success_cb, + PurpleSetPublicAliasFailureCallback failure_cb) { MsnCmdProc *cmdproc; MsnSession *session; PurpleAccount *account; - const char *alias; + const char *real_alias; + MsnTransaction *trans; + struct public_alias_closure *closure; gchar *tmp; gsize dummy; - session = gc->proto_data; + session = purple_connection_get_protocol_data(pc); cmdproc = session->notification->cmdproc; - account = purple_connection_get_account(gc); - - if(entry && *entry) { - tmp = botch_utf(entry, strlen(entry), &dummy); - alias = purple_url_encode(g_strstrip(tmp)); + account = purple_connection_get_account(pc); + + if (alias && *alias) + { + char *tmp = botch_utf(alias, strlen(alias), &dummy); + real_alias = purple_url_encode(g_strstrip(tmp)); g_free(tmp); } else - alias = ""; - - if (strlen(alias) > BUDDY_ALIAS_MAXLEN) + real_alias = ""; + + if (strlen(real_alias) > BUDDY_ALIAS_MAXLEN) { - purple_notify_error(gc, NULL, - _("Your new MSN friendly name is too long."), NULL); + if (failure_cb) { + struct public_alias_closure *closure = + g_new0(struct public_alias_closure, 1); + closure->account = account; + closure->failure_cb = failure_cb; + purple_timeout_add(0, set_public_alias_length_error, closure); + } else { + purple_notify_error(pc, NULL, + _("Your new MSN friendly name is too long."), + NULL); + } return; } - if (*alias == '\0') { - alias = purple_url_encode(purple_account_get_username(account)); + if (*real_alias == '\0') { + real_alias = purple_url_encode(purple_account_get_username(account)); + } + + closure = g_new0(struct public_alias_closure, 1); + closure->account = account; + closure->success_cb = success_cb; + closure->failure_cb = failure_cb; + + trans = msn_transaction_new(cmdproc, "PRP", "MFN %s", real_alias); + msn_transaction_set_data(trans, closure); + msn_transaction_set_data_free(trans, g_free); + msn_transaction_add_cb(trans, "PRP", prp_success_cb); + if (failure_cb) { + msn_transaction_set_error_cb(trans, prp_error_cb); + msn_transaction_set_timeout_cb(trans, prp_timeout_cb); } - - msn_cmdproc_send(cmdproc, "PRP", "MFN %s", alias); - // propagate change on server side to local --yaz - purple_account_set_alias(account, entry); //oct16 <-- XXX questionable. Sep19. - + msn_cmdproc_send_trans(cmdproc, trans); +} + +static gboolean +get_public_alias_cb(gpointer data) +{ + struct public_alias_closure *closure = data; + PurpleGetPublicAliasSuccessCallback success_cb = closure->success_cb; + const char *alias; + + alias = purple_account_get_string(closure->account, "display-name", + purple_account_get_username(closure->account)); + success_cb(closure->account, alias); + g_free(closure); + + return FALSE; +} + +static void +msn_get_public_alias(PurpleConnection *pc, + PurpleGetPublicAliasSuccessCallback success_cb, + PurpleGetPublicAliasFailureCallback failure_cb) +{ + struct public_alias_closure *closure = g_new0(struct public_alias_closure, 1); + PurpleAccount *account = purple_connection_get_account(pc); + + closure->account = account; + closure->success_cb = success_cb; + purple_timeout_add(0, get_public_alias_cb, closure); +} + +static void +msn_act_id(PurpleConnection *gc, const char *entry) +{ + msn_set_public_alias(gc, entry, NULL, NULL); } static void @@ -2706,77 +2829,77 @@ static PurplePluginProtocolInfo prpl_info = { OPT_PROTO_MAIL_CHECK, - NULL, /* user_splits */ - NULL, /* protocol_options */ - {"png,gif", 0, 0, 96, 96, 0, PURPLE_ICON_SCALE_SEND}, /* icon_spec */ - msn_list_icon, /* list_icon */ - msn_list_emblems, /* list_emblems */ - msn_status_text, /* status_text */ - msn_tooltip_text, /* tooltip_text */ - msn_status_types, /* away_states */ - msn_blist_node_menu, /* blist_node_menu */ - NULL, /* chat_info */ - NULL, /* chat_info_defaults */ - msn_login, /* login */ - msn_close, /* close */ - msn_send_im, /* send_im */ - NULL, /* set_info */ - msn_send_typing, /* send_typing */ - msn_get_info, /* get_info */ - msn_set_status, /* set_away */ - msn_set_idle, /* set_idle */ - NULL, /* change_passwd */ - msn_add_buddy, /* add_buddy */ - NULL, /* add_buddies */ - msn_rem_buddy, /* remove_buddy */ - NULL, /* remove_buddies */ - msn_add_permit, /* add_permit */ - msn_add_deny, /* add_deny */ - msn_rem_permit, /* rem_permit */ - msn_rem_deny, /* rem_deny */ - msn_set_permit_deny, /* set_permit_deny */ - NULL, /* join_chat */ - NULL, /* reject chat invite */ - NULL, /* get_chat_name */ - msn_chat_invite, /* chat_invite */ - msn_chat_leave, /* chat_leave */ - NULL, /* chat_whisper */ - msn_chat_send, /* chat_send */ - msn_keepalive, /* keepalive */ - NULL, /* register_user */ - NULL, /* get_cb_info */ - NULL, /* get_cb_away */ - msn_alias_buddy, /* alias_buddy */ - msn_group_buddy, /* group_buddy */ - msn_rename_group, /* rename_group */ - NULL, /* buddy_free */ - msn_convo_closed, /* convo_closed */ - msn_normalize, /* normalize */ - msn_set_buddy_icon, /* set_buddy_icon */ - msn_remove_group, /* remove_group */ - NULL, /* get_cb_real_name */ - NULL, /* set_chat_topic */ - NULL, /* find_blist_chat */ - NULL, /* roomlist_get_list */ - NULL, /* roomlist_cancel */ - NULL, /* roomlist_expand_category */ - msn_can_receive_file, /* can_receive_file */ - msn_send_file, /* send_file */ - msn_new_xfer, /* new_xfer */ - msn_offline_message, /* offline_message */ - NULL, /* whiteboard_prpl_ops */ - NULL, /* send_raw */ - NULL, /* roomlist_room_serialize */ - NULL, /* unregister_user */ - msn_send_attention, /* send_attention */ - msn_attention_types, /* attention_types */ - sizeof(PurplePluginProtocolInfo), /* struct_size */ - msn_get_account_text_table, /* get_account_text_table */ - NULL, /* initiate_media */ - NULL, /* get_media_caps */ - NULL, /* get_moods */ - NULL, /* set_public_alias */ - NULL /* get_public_alias */ + NULL, /* user_splits */ + NULL, /* protocol_options */ + {"png,gif", 0, 0, 96, 96, 0, PURPLE_ICON_SCALE_SEND}, /* icon_spec */ + msn_list_icon, /* list_icon */ + msn_list_emblems, /* list_emblems */ + msn_status_text, /* status_text */ + msn_tooltip_text, /* tooltip_text */ + msn_status_types, /* away_states */ + msn_blist_node_menu, /* blist_node_menu */ + NULL, /* chat_info */ + NULL, /* chat_info_defaults */ + msn_login, /* login */ + msn_close, /* close */ + msn_send_im, /* send_im */ + NULL, /* set_info */ + msn_send_typing, /* send_typing */ + msn_get_info, /* get_info */ + msn_set_status, /* set_away */ + msn_set_idle, /* set_idle */ + NULL, /* change_passwd */ + msn_add_buddy, /* add_buddy */ + NULL, /* add_buddies */ + msn_rem_buddy, /* remove_buddy */ + NULL, /* remove_buddies */ + msn_add_permit, /* add_permit */ + msn_add_deny, /* add_deny */ + msn_rem_permit, /* rem_permit */ + msn_rem_deny, /* rem_deny */ + msn_set_permit_deny, /* set_permit_deny */ + NULL, /* join_chat */ + NULL, /* reject chat invite */ + NULL, /* get_chat_name */ + msn_chat_invite, /* chat_invite */ + msn_chat_leave, /* chat_leave */ + NULL, /* chat_whisper */ + msn_chat_send, /* chat_send */ + msn_keepalive, /* keepalive */ + NULL, /* register_user */ + NULL, /* get_cb_info */ + NULL, /* get_cb_away */ + msn_alias_buddy, /* alias_buddy */ + msn_group_buddy, /* group_buddy */ + msn_rename_group, /* rename_group */ + NULL, /* buddy_free */ + msn_convo_closed, /* convo_closed */ + msn_normalize, /* normalize */ + msn_set_buddy_icon, /* set_buddy_icon */ + msn_remove_group, /* remove_group */ + NULL, /* get_cb_real_name */ + NULL, /* set_chat_topic */ + NULL, /* find_blist_chat */ + NULL, /* roomlist_get_list */ + NULL, /* roomlist_cancel */ + NULL, /* roomlist_expand_category */ + msn_can_receive_file, /* can_receive_file */ + msn_send_file, /* send_file */ + msn_new_xfer, /* new_xfer */ + msn_offline_message, /* offline_message */ + NULL, /* whiteboard_prpl_ops */ + NULL, /* send_raw */ + NULL, /* roomlist_room_serialize */ + NULL, /* unregister_user */ + msn_send_attention, /* send_attention */ + msn_attention_types, /* attention_types */ + sizeof(PurplePluginProtocolInfo), /* struct_size */ + msn_get_account_text_table, /* get_account_text_table */ + NULL, /* initiate_media */ + NULL, /* get_media_caps */ + NULL, /* get_moods */ + msn_set_public_alias, /* set_public_alias */ + msn_get_public_alias /* get_public_alias */ }; static PurplePluginInfo info =