changeset 17778:5ba545dfe2d6

propagate from branch 'im.pidgin.pidgin' (head 667956be4f81c42d9061470e5111d09a1516db33) to branch 'im.pidgin.soc.2007.certmgr' (head 4ed26aa0a5a9d2ba90ba39db45c423a1d5c1489c)
author William Ehlhardt <williamehlhardt@gmail.com>
date Sun, 27 May 2007 23:56:14 +0000
parents 34bf1a607d51 (current diff) 0f65c1856f55 (diff)
children 8b322c8afeb6
files
diffstat 10 files changed, 163 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri May 25 22:34:16 2007 +0000
+++ b/ChangeLog	Sun May 27 23:56:14 2007 +0000
@@ -1,5 +1,10 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
+version 2.0.2 (??/??/????):
+
+	Finch:
+	* Auto account reconnecting
+
 version 2.0.1 (05/24/2007):
 	* Buddy list update speedups when buddy icons are not being
 	  displayed.  (Scott Wolchok)
--- a/finch/gntaccount.c	Fri May 25 22:34:16 2007 +0000
+++ b/finch/gntaccount.c	Sun May 27 23:56:14 2007 +0000
@@ -717,6 +717,15 @@
 	gnt_tree_remove(GNT_TREE(accounts.tree), account);
 }
 
+static void
+account_abled_cb(PurpleAccount *account, gpointer user_data)
+{
+	if (accounts.window == NULL)
+		return;
+	gnt_tree_set_choice(GNT_TREE(accounts.tree), account,
+			GPOINTER_TO_INT(user_data));
+}
+
 void finch_accounts_init()
 {
 	GList *iter;
@@ -727,7 +736,13 @@
 	purple_signal_connect(purple_accounts_get_handle(), "account-removed",
 			finch_accounts_get_handle(), PURPLE_CALLBACK(account_removed_callback),
 			NULL);
-	
+	purple_signal_connect(purple_accounts_get_handle(), "account-disabled",
+			finch_accounts_get_handle(),
+			PURPLE_CALLBACK(account_abled_cb), GINT_TO_POINTER(FALSE));
+	purple_signal_connect(purple_accounts_get_handle(), "account-enabled",
+			finch_accounts_get_handle(),
+			PURPLE_CALLBACK(account_abled_cb), GINT_TO_POINTER(TRUE));
+
 	for (iter = purple_accounts_get_all(); iter; iter = iter->next) {
 		if (purple_account_get_enabled(iter->data, FINCH_UI))
 			break;
--- a/finch/gntconn.c	Fri May 25 22:34:16 2007 +0000
+++ b/finch/gntconn.c	Sun May 27 23:56:14 2007 +0000
@@ -24,34 +24,116 @@
  */
 #include "account.h"
 #include "core.h"
+#include "connection.c"
+#include "debug.h"
 #include "request.h"
 
 #include "gntconn.h"
 #include "finch.h"
 
+#define INITIAL_RECON_DELAY_MIN  8000
+#define INITIAL_RECON_DELAY_MAX 60000
+
+#define MAX_RECON_DELAY 600000
+
+typedef struct {
+	int delay;
+	guint timeout;
+} FinchAutoRecon;
+
+/**
+ * Contains accounts that are auto-reconnecting.
+ * The key is a pointer to the PurpleAccount and the
+ * value is a pointer to a FinchAutoRecon.
+ */
+static GHashTable *hash = NULL;
+
+static void
+free_auto_recon(gpointer data)
+{
+	FinchAutoRecon *info = data;
+
+	if (info->timeout != 0)
+		g_source_remove(info->timeout);
+
+	g_free(info);
+}
+
+
+static gboolean
+do_signon(gpointer data)
+{
+	PurpleAccount *account = data;
+	FinchAutoRecon *info;
+	PurpleStatus *status;
+
+	purple_debug_info("autorecon", "do_signon called\n");
+	g_return_val_if_fail(account != NULL, FALSE);
+	info = g_hash_table_lookup(hash, account);
+
+	if (info)
+		info->timeout = 0;
+
+	status = purple_account_get_active_status(account);
+	if (purple_status_is_online(status))
+	{
+		purple_debug_info("autorecon", "calling purple_account_connect\n");
+		purple_account_connect(account);
+		purple_debug_info("autorecon", "done calling purple_account_connect\n");
+	}
+
+	return FALSE;
+}
+
 static void
 finch_connection_report_disconnect(PurpleConnection *gc, const char *text)
 {
-	char *act, *primary, *secondary;
+	FinchAutoRecon *info;
 	PurpleAccount *account = purple_connection_get_account(gc);
 
-	act = g_strdup_printf(_("%s (%s)"), purple_account_get_username(account),
-			purple_account_get_protocol_name(account));
+	info = g_hash_table_lookup(hash, account);
 
-	primary = g_strdup_printf(_("%s disconnected."), act);
-	secondary = g_strdup_printf(_("%s was disconnected due to the following error:\n%s"),
-			act, text);
+	if (!gc->wants_to_die) {
+		if (info == NULL) {
+			info = g_new0(FinchAutoRecon, 1);
+			g_hash_table_insert(hash, account, info);
+			info->delay = g_random_int_range(INITIAL_RECON_DELAY_MIN, INITIAL_RECON_DELAY_MAX);
+		} else {
+			info->delay = MIN(2 * info->delay, MAX_RECON_DELAY);
+			if (info->timeout != 0)
+				g_source_remove(info->timeout);
+		}
+		info->timeout = g_timeout_add(info->delay, do_signon, account);
+	} else {
+		char *act, *primary, *secondary;
+		act = g_strdup_printf(_("%s (%s)"), purple_account_get_username(account),
+				purple_account_get_protocol_name(account));
 
-	purple_request_action(account, _("Connection Error"), primary, secondary, 1,
-						account, NULL, NULL,
-						account, 2,
-						_("OK"), NULL,
-						_("Connect"),
-						PURPLE_CALLBACK(purple_account_connect));
+		primary = g_strdup_printf(_("%s disconnected."), act);
+		secondary = g_strdup_printf(_("%s\n\n"
+				"Finch will not attempt to reconnect the account until you "
+				"correct the error and re-enable the account."), text);
+		purple_notify_error(NULL, NULL, primary, secondary);
+
+		g_free(act);
+		g_free(primary);
+		g_free(secondary);
+		purple_account_set_enabled(account, FINCH_UI, FALSE);
+	}
+}
 
-	g_free(act);
-	g_free(primary);
-	g_free(secondary);
+static void
+account_removed_cb(PurpleAccount *account, gpointer user_data)
+{
+	g_hash_table_remove(hash, account);
+}
+
+static void *
+finch_connection_get_handle(void)
+{
+	static int handle;
+
+	return &handle;
 }
 
 static PurpleConnectionUiOps ops = 
@@ -75,8 +157,18 @@
 }
 
 void finch_connections_init()
-{}
+{
+	hash = g_hash_table_new_full(
+							g_direct_hash, g_direct_equal,
+							NULL, free_auto_recon);
+
+	purple_signal_connect(purple_accounts_get_handle(), "account-removed",
+						finch_connection_get_handle(),
+						PURPLE_CALLBACK(account_removed_cb), NULL);
+}
 
 void finch_connections_uninit()
-{}
-
+{
+	purple_signals_disconnect_by_handle(finch_connection_get_handle());
+	g_hash_table_destroy(hash);
+}
--- a/libpurple/protocols/msn/notification.c	Fri May 25 22:34:16 2007 +0000
+++ b/libpurple/protocols/msn/notification.c	Sun May 27 23:56:14 2007 +0000
@@ -901,6 +901,7 @@
 syn_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
 {
 	MsnSession *session;
+	MsnSync *sync;
 	int total_users;
 
 	session = cmdproc->session;
@@ -919,22 +920,12 @@
 
 	total_users  = atoi(cmd->params[2]);
 
-	if (total_users == 0)
-	{
-		msn_session_finish_login(session);
-	}
-	else
-	{
-		/* syn_table */
-		MsnSync *sync;
+	sync = msn_sync_new(session);
+	sync->total_users = total_users;
+	sync->old_cbs_table = cmdproc->cbs_table;
 
-		sync = msn_sync_new(session);
-		sync->total_users = total_users;
-		sync->old_cbs_table = cmdproc->cbs_table;
-
-		session->sync = sync;
-		cmdproc->cbs_table = sync->cbs_table;
-	}
+	session->sync = sync;
+	cmdproc->cbs_table = sync->cbs_table;
 }
 
 /**************************************************************************
--- a/libpurple/protocols/msn/sync.c	Fri May 25 22:34:16 2007 +0000
+++ b/libpurple/protocols/msn/sync.c	Sun May 27 23:56:14 2007 +0000
@@ -99,8 +99,19 @@
 
 	/* HACK */
 	if (group_id == 0)
+	{
 		/* Group of ungroupped buddies */
+		if (session->sync->total_users == 0)
+		{
+			cmdproc->cbs_table = session->sync->old_cbs_table;
+
+			msn_session_finish_login(session);
+
+			msn_sync_destroy(session->sync);
+			session->sync = NULL;
+		}
 		return;
+	}
 
 	if ((purple_find_group(name)) == NULL)
 	{
--- a/libpurple/purple-remote	Fri May 25 22:34:16 2007 +0000
+++ b/libpurple/purple-remote	Sun May 27 23:56:14 2007 +0000
@@ -94,7 +94,7 @@
 def execute(uri):
     match = re.match(urlregexp, uri)
     protocol = match.group(2)
-    if protocol == "xmpp"
+    if protocol == "xmpp":
         protocol = "jabber"
     if protocol == "aim" or protocol == "icq":
         protocol = "oscar"
--- a/pidgin/gtkblist.c	Fri May 25 22:34:16 2007 +0000
+++ b/pidgin/gtkblist.c	Sun May 27 23:56:14 2007 +0000
@@ -5781,6 +5781,8 @@
 	gtk_box_pack_end(GTK_BOX(rowbox), data->alias_entry, TRUE, TRUE, 0);
 	gtk_entry_set_activates_default(GTK_ENTRY(data->alias_entry), TRUE);
 	pidgin_set_accessible_label (data->alias_entry, label);
+	if (name != NULL)
+		gtk_widget_grab_focus(data->alias_entry);
 
 	rowbox = gtk_hbox_new(FALSE, 5);
 	gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0);
--- a/pidgin/gtkconv.c	Fri May 25 22:34:16 2007 +0000
+++ b/pidgin/gtkconv.c	Sun May 27 23:56:14 2007 +0000
@@ -7919,7 +7919,9 @@
 	entry = gtk_entry_new();
 	gtk_entry_set_has_frame(GTK_ENTRY(entry), FALSE);
 	gtk_entry_set_width_chars(GTK_ENTRY(entry), 10);
+#if GTK_CHECK_VERSION(2,4,0)
 	gtk_entry_set_alignment(GTK_ENTRY(entry), 0.5);
+#endif
 
 	gtk_box_pack_start(GTK_BOX(gtkconv->tabby), entry, TRUE, TRUE, 0);
 	/* after the tab label */
@@ -8326,7 +8328,9 @@
 	}
 
 	ebox = gtk_event_box_new();
+#if GTK_CHECK_VERSION(2,4,0)
 	gtk_event_box_set_visible_window(GTK_EVENT_BOX(ebox), FALSE);
+#endif
 	gtk_container_add(GTK_CONTAINER(ebox), gtkconv->tabby);
 	g_signal_connect(G_OBJECT(ebox), "button-press-event",
 					G_CALLBACK(alias_double_click_cb), gtkconv);
--- a/pidgin/gtkimhtml.c	Fri May 25 22:34:16 2007 +0000
+++ b/pidgin/gtkimhtml.c	Sun May 27 23:56:14 2007 +0000
@@ -4432,7 +4432,9 @@
 
 	if (imhtml_smiley && imhtml_smiley->flags & GTK_IMHTML_SMILEY_CUSTOM) {
 		ebox = gtk_event_box_new();
+#if GTK_CHECK_VERSION(2,4,0)
 		gtk_event_box_set_visible_window(GTK_EVENT_BOX(ebox), FALSE);
+#endif
 		gtk_widget_show(ebox);
 	}
 
--- a/pidgin/gtkimhtmltoolbar.c	Fri May 25 22:34:16 2007 +0000
+++ b/pidgin/gtkimhtmltoolbar.c	Sun May 27 23:56:14 2007 +0000
@@ -71,7 +71,9 @@
 do_small(GtkWidget *smalltb, GtkIMHtmlToolbar *toolbar)
 {
 	g_return_if_fail(toolbar != NULL);
-	gtk_imhtml_font_shrink(GTK_IMHTML(toolbar->imhtml));
+	/* Only shrink the font on activation, not deactivation as well */
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(smalltb)))
+		gtk_imhtml_font_shrink(GTK_IMHTML(toolbar->imhtml));
 	gtk_widget_grab_focus(toolbar->imhtml);
 }
 
@@ -79,7 +81,9 @@
 do_big(GtkWidget *large, GtkIMHtmlToolbar *toolbar)
 {
 	g_return_if_fail(toolbar);
-	gtk_imhtml_font_grow(GTK_IMHTML(toolbar->imhtml));
+	/* Only grow the font on activation, not deactivation as well */
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(large)))
+		gtk_imhtml_font_grow(GTK_IMHTML(toolbar->imhtml));
 	gtk_widget_grab_focus(toolbar->imhtml);
 }