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 =