Mercurial > pidgin
diff plugins/autorecon.c @ 10020:c06c4a697b31
[gaim-migrate @ 10944]
autorecon can give you an even less dialog-ful reconnection
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Sun, 12 Sep 2004 21:37:59 +0000 |
parents | ab5db2c5da79 |
children | 2e01c503aa4f |
line wrap: on
line diff
--- a/plugins/autorecon.c Sat Sep 11 21:56:18 2004 +0000 +++ b/plugins/autorecon.c Sun Sep 12 21:37:59 2004 +0000 @@ -20,16 +20,82 @@ static GHashTable *hash = NULL; +static GSList *accountReconnecting = NULL; + #define AUTORECON_OPT "/plugins/core/autorecon" -#define OPT_HIDE_CONNECTED AUTORECON_OPT "/hide_connected_error" -#define OPT_HIDE_CONNECTING AUTORECON_OPT "/hide_connecting_error" -#define OPT_RESTORE_STATE AUTORECON_OPT "/restore_state" +#define OPT_HIDE_CONNECTED AUTORECON_OPT "/hide_connected_error" +#define OPT_HIDE_CONNECTING AUTORECON_OPT "/hide_connecting_error" +#define OPT_RESTORE_STATE AUTORECON_OPT "/restore_state" +#define OPT_HIDE_RECONNECTING_DIALOG AUTORECON_OPT "/hide_reconnecting_dialog" /* storage of original (old_ops) and modified (new_ops) ui ops to allow us to intercept calls to report_disconnect */ static GaimConnectionUiOps *old_ops = NULL; static GaimConnectionUiOps *new_ops = NULL; +static void connect_progress(GaimConnection *gc, const char *text, + size_t step, size_t step_count) { + if(old_ops == NULL || old_ops->connect_progress == NULL) { + /* there's nothing to call through to, so don't bother + checking prefs */ + return; + } else if(gaim_prefs_get_bool(OPT_HIDE_RECONNECTING_DIALOG) && accountReconnecting && + g_slist_find(accountReconnecting, gc->account)) { + /* this is a reconnecting, and we're hiding those */ + gaim_debug(GAIM_DEBUG_INFO, "autorecon", + "hide connecting dialog while reconnecting\n"); + return; + } + + old_ops->connect_progress(gc, text, step, step_count); +} + +static void connected(GaimConnection *gc) { + if(old_ops == NULL || old_ops->connected == NULL) { + /* there's nothing to call through to, so don't bother + checking prefs */ + return; + } else if(gaim_prefs_get_bool(OPT_HIDE_RECONNECTING_DIALOG) && accountReconnecting && + g_slist_find(accountReconnecting, gc->account)) { + /* this is a reconnecting, and we're hiding those */ + gaim_debug(GAIM_DEBUG_INFO, "autorecon", + "hide connecting dialog while reconnecting\n"); + return; + } + + old_ops->connected(gc); +} + +static void disconnected(GaimConnection *gc) { + if(old_ops == NULL || old_ops->disconnected == NULL) { + /* there's nothing to call through to, so don't bother + checking prefs */ + return; + } else if(gaim_prefs_get_bool(OPT_HIDE_RECONNECTING_DIALOG) && accountReconnecting && + g_slist_find(accountReconnecting, gc->account)) { + /* this is a reconnecting, and we're hiding those */ + gaim_debug(GAIM_DEBUG_INFO, "autorecon", + "hide connecting dialog while reconnecting\n"); + return; + } + + old_ops->disconnected(gc); +} + +static void notice(GaimConnection *gc, const char *text) { + if(old_ops == NULL || old_ops->notice == NULL) { + /* there's nothing to call through to, so don't bother + checking prefs */ + return; + } else if(gaim_prefs_get_bool(OPT_HIDE_RECONNECTING_DIALOG) && accountReconnecting && + g_slist_find(accountReconnecting, gc->account)) { + /* this is a reconnecting, and we're hiding those */ + gaim_debug(GAIM_DEBUG_INFO, "autorecon", + "hide connecting dialog while reconnecting\n"); + } + + old_ops->notice(gc, text); +} static void report_disconnect(GaimConnection *gc, const char *text) { @@ -84,10 +150,15 @@ static void reconnect(GaimConnection *gc, void *m) { GaimAccount *account; GaimAutoRecon *info; + GSList* listAccount; g_return_if_fail(gc != NULL); account = gaim_connection_get_account(gc); info = g_hash_table_lookup(hash, account); + if (accountReconnecting) + listAccount = g_slist_find(accountReconnecting, account); + else + listAccount = NULL; if (!gc->wants_to_die) { if (info == NULL) { @@ -100,12 +171,28 @@ g_source_remove(info->timeout); } info->timeout = g_timeout_add(info->delay, do_signon, account); + + if (!listAccount) + accountReconnecting = g_slist_prepend(accountReconnecting, account); } else if (info != NULL) { g_hash_table_remove(hash, account); + + if (listAccount) + accountReconnecting = g_slist_delete_link(accountReconnecting, listAccount); } } static void +reconnected(GaimConnection *gc, void *m) { + GaimAccount *account; + + g_return_if_fail(gc != NULL && accountReconnecting != NULL); + account = gaim_connection_get_account(gc); + + accountReconnecting = g_slist_remove(accountReconnecting, account); +} + +static void free_auto_recon(gpointer data) { GaimAutoRecon *info = data; @@ -135,15 +222,24 @@ old_ops = gaim_connections_get_ui_ops(); new_ops = (GaimConnectionUiOps *) g_memdup(old_ops, sizeof(GaimConnectionUiOps)); + new_ops->connect_progress = connect_progress; + new_ops->connected = connected; + new_ops->disconnected = disconnected; + new_ops->notice = notice; new_ops->report_disconnect = report_disconnect; gaim_connections_set_ui_ops(new_ops); hash = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, free_auto_recon); + + accountReconnecting = NULL; gaim_signal_connect(gaim_connections_get_handle(), "signed-off", plugin, GAIM_CALLBACK(reconnect), NULL); + gaim_signal_connect(gaim_connections_get_handle(), "signed-on", + plugin, GAIM_CALLBACK(reconnected), NULL); + return TRUE; } @@ -154,8 +250,16 @@ gaim_signal_disconnect(gaim_connections_get_handle(), "signed-off", plugin, GAIM_CALLBACK(reconnect)); + gaim_signal_disconnect(gaim_connections_get_handle(), "signed-on", + plugin, GAIM_CALLBACK(reconnected)); + g_hash_table_destroy(hash); hash = NULL; + + if (accountReconnecting) { + g_slist_free(accountReconnecting); + accountReconnecting = NULL; + } gaim_connections_set_ui_ops(old_ops); g_free(new_ops); @@ -180,6 +284,10 @@ _("Hide Login Errors")); gaim_plugin_pref_frame_add(frame, pref); + pref = gaim_plugin_pref_new_with_name_and_label(OPT_HIDE_RECONNECTING_DIALOG, + _("Hide Reconnecting Dialog")); + gaim_plugin_pref_frame_add(frame, pref); + return frame; } @@ -227,6 +335,7 @@ gaim_prefs_add_none(AUTORECON_OPT); gaim_prefs_add_bool(OPT_HIDE_CONNECTED, FALSE); gaim_prefs_add_bool(OPT_HIDE_CONNECTING, FALSE); + gaim_prefs_add_bool(OPT_HIDE_RECONNECTING_DIALOG, FALSE); gaim_prefs_remove(OPT_RESTORE_STATE); }