diff src/account.c @ 10740:94cc67130789

[gaim-migrate @ 12342] More big changes, yay. I combined gaim_connection_new and gaim_connection_connect. Earlier today I realized that it's dumb to have a GaimConnection that isn't connected. I'm about to combine gaim_connection_disconnect and gaim_connection_destroy, as well. I added a "password" field to GaimConnection. It holds the password used to login a specific GaimConnection. Now, when "remember password" is false, account->password is NEVER set. When the user tries to sign on and Gaim prompts for the password, it goes directly into the GaimConnection. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Sat, 26 Mar 2005 23:25:18 +0000
parents 55af3fa46329
children 4228b6d78506
line wrap: on
line diff
--- a/src/account.c	Sat Mar 26 21:22:53 2005 +0000
+++ b/src/account.c	Sat Mar 26 23:25:18 2005 +0000
@@ -741,44 +741,83 @@
 	g_free(account);
 }
 
-GaimConnection *
+void
 gaim_account_register(GaimAccount *account)
 {
-	GaimConnection *gc;
+	g_return_if_fail(account != NULL);
 
-	g_return_val_if_fail(account != NULL, NULL);
+	gaim_debug_info("account", "Registering account %s\n",
+					gaim_account_get_username(account));
 
-	if (gaim_account_get_connection(account) != NULL)
-		return NULL;
+	gaim_connection_new(account, TRUE, NULL);
+}
 
-	gc = gaim_connection_new(account);
+static void
+request_password_ok_cb(GaimAccount *account, const char *entry)
+{
+	if (!entry || !*entry)
+	{
+		gaim_notify_error(account, NULL, _("Password is required to sign on."), NULL);
+		return;
+	}
 
-	gaim_debug_info("account", "Registering account %p. gc = %p\n",
-					account, gc);
+	if (gaim_account_get_remember_password(account))
+		gaim_account_set_password(account, entry);
 
-	gaim_connection_register(gc);
-
-	return gc;
+	gaim_connection_new(account, FALSE, entry);
 }
 
-GaimConnection *
+static void
+request_password(GaimAccount *account)
+{
+	gchar *primary;
+	gchar *escaped;
+	const gchar *username;
+
+	username = gaim_account_get_username(account);
+	escaped = g_markup_escape_text(username, strlen(username));
+	primary = g_strdup_printf(_("Enter password for %s (%s)"), escaped,
+								  gaim_account_get_protocol_name(account));
+	gaim_request_input(account, _("Enter Password"), primary, NULL, NULL,
+					   FALSE, TRUE, NULL,
+					   _("OK"), G_CALLBACK(request_password_ok_cb),
+					   _("Cancel"), NULL, account);
+	g_free(primary);
+	g_free(escaped);
+}
+
+void
 gaim_account_connect(GaimAccount *account)
 {
-	GaimConnection *gc;
+	GaimPlugin *prpl;
+	GaimPluginProtocolInfo *prpl_info;
+	const char *password;
+
+	g_return_if_fail(account != NULL);
 
-	g_return_val_if_fail(account != NULL, NULL);
+	gaim_debug_info("account", "Connecting to account %s\n",
+					gaim_account_get_username(account));
 
-	if (gaim_account_get_connection(account) != NULL)
-		return NULL;
+	prpl = gaim_find_prpl(gaim_account_get_protocol_id(account));
+	if (prpl == NULL)
+	{
+		gchar *message;
 
-	gc = gaim_connection_new(account);
+		message = g_strdup_printf(_("Missing protocol plugin for %s"),
+			gaim_account_get_username(account));
+		gaim_notify_error(NULL, _("Connection Error"), message, NULL);
+		g_free(message);
+		return;
+	}
 
-	gaim_debug_info("account", "Connecting to account %p. gc = %p\n",
-					account, gc);
-
-	gaim_connection_connect(gc);
-
-	return gc;
+	prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl);
+	password = gaim_account_get_password(account);
+	if ((password == NULL) &&
+		!(prpl_info->options & OPT_PROTO_NO_PASSWORD) &&
+		!(prpl_info->options & OPT_PROTO_PASSWORD_OPTIONAL))
+		request_password(account);
+	else
+		gaim_connection_new(account, FALSE, password);
 }
 
 void
@@ -940,9 +979,7 @@
 {
 	g_return_if_fail(account != NULL);
 
-	if (account->username != NULL)
-		g_free(account->username);
-
+	g_free(account->username);
 	account->username = (username == NULL ? NULL : g_strdup(username));
 
 	schedule_accounts_save();
@@ -953,8 +990,11 @@
 {
 	g_return_if_fail(account != NULL);
 
-	if (account->password != NULL)
-		g_free(account->password);
+	g_free(account->password);
+	account->password = NULL;
+
+	if (!gaim_account_get_remember_password(account))
+		return;
 
 	account->password = (password == NULL ? NULL : g_strdup(password));
 
@@ -966,9 +1006,7 @@
 {
 	g_return_if_fail(account != NULL);
 
-	if (account->alias != NULL)
-		g_free(account->alias);
-
+	g_free(account->alias);
 	account->alias = (alias == NULL ? NULL : g_strdup(alias));
 
 	schedule_accounts_save();
@@ -979,9 +1017,7 @@
 {
 	g_return_if_fail(account != NULL);
 
-	if (account->user_info != NULL)
-		g_free(account->user_info);
-
+	g_free(account->user_info);
 	account->user_info = (user_info == NULL ? NULL : g_strdup(user_info));
 
 	schedule_accounts_save();
@@ -992,11 +1028,9 @@
 {
 	g_return_if_fail(account != NULL);
 
-	if (account->buddy_icon != NULL)
-		g_free(account->buddy_icon);
-
+	g_free(account->buddy_icon);
 	account->buddy_icon = (icon == NULL ? NULL : g_strdup(icon));
-	if (account->gc)
+	if (gaim_account_is_connected(account))
 		serv_set_buddyicon(account->gc, icon);
 
 	schedule_accounts_save();
@@ -1008,9 +1042,7 @@
 	g_return_if_fail(account     != NULL);
 	g_return_if_fail(protocol_id != NULL);
 
-	if (account->protocol_id != NULL)
-		g_free(account->protocol_id);
-
+	g_free(account->protocol_id);
 	account->protocol_id = g_strdup(protocol_id);
 
 	schedule_accounts_save();