Mercurial > pidgin
view plugins/autorecon.c @ 7727:72c0d2c66f45
[gaim-migrate @ 8372]
(10:49:40) faceprint: no no no no no
(10:49:51) LSchiere2: what did i get wrong faceprint?
(10:50:05) faceprint: server aliases
(10:50:11) LSchiere2: what about them?
(10:50:18) Paco-Paco: they don't belong in blist.xml
(10:50:24) faceprint: bingo
(10:50:25) LSchiere2: i asked sean
(10:50:36) SeanEgan: He did
(10:50:38) Paco-Paco: yeah that bugged me but I wasn't going to get involved
(10:51:04) SeanEgan: but I'd listen to faceprint.
(10:51:08) LSchiere2: it makes sense, both winicq and winaim use them even after the person goes offline
(10:51:20) faceprint: and so does the oscar prpl
(10:51:28) faceprint: but the core didn't
(10:51:33) faceprint: and everyone was happy
(10:51:37) datallah: whats wrong w/ saving them as long as they are refreshed when appropriate?
(10:51:58) faceprint: datallah: doing it in the core assumes certain things about how they're handled in all prpls
(10:51:58) LSchiere2: so the correct fix would be to change the protocols instead of the blist?
(10:52:22) faceprint: right. the prpls know what's going on, so they should store it as a setting like oscar does
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Wed, 03 Dec 2003 15:53:54 +0000 |
parents | 4ce6952d7908 |
children | 217643616a74 |
line wrap: on
line source
#include "internal.h" #include "connection.h" #include "debug.h" #include "prpl.h" #include "signals.h" #define AUTORECON_PLUGIN_ID "core-autorecon" #define INITIAL 8000 #define MAXTIME 2048000 typedef struct { int delay; guint timeout; } GaimAutoRecon; static GHashTable *hash = NULL; static gboolean do_signon(gpointer data) { GaimAccount *account = data; GaimAutoRecon *info; gaim_debug(GAIM_DEBUG_INFO, "autorecon", "do_signon called\n"); g_return_val_if_fail(account != NULL, FALSE); info = g_hash_table_lookup(hash, account); if (g_list_index(gaim_accounts_get_all(), account) < 0) return FALSE; if(info) info->timeout = 0; gaim_debug(GAIM_DEBUG_INFO, "autorecon", "calling gaim_account_connect\n"); gaim_account_connect(account); gaim_debug(GAIM_DEBUG_INFO, "autorecon", "done calling gaim_account_connect\n"); return FALSE; } static void reconnect(GaimConnection *gc, void *m) { GaimAccount *account; GaimAutoRecon *info; g_return_if_fail(gc != NULL); account = gaim_connection_get_account(gc); info = g_hash_table_lookup(hash, account); if (!gc->wants_to_die) { if (info == NULL) { info = g_new0(GaimAutoRecon, 1); g_hash_table_insert(hash, account, info); info->delay = INITIAL; } else info->delay = MIN(2 * info->delay, MAXTIME); info->timeout = g_timeout_add(info->delay, do_signon, account); } else if (info != NULL) { g_hash_table_remove(hash, account); } } static void free_auto_recon(gpointer data) { GaimAutoRecon *info = data; if (info->timeout != 0) g_source_remove(info->timeout); g_free(info); } static gboolean plugin_load(GaimPlugin *plugin) { hash = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, free_auto_recon); gaim_signal_connect(gaim_connections_get_handle(), "signed-off", plugin, GAIM_CALLBACK(reconnect), NULL); return TRUE; } static gboolean plugin_unload(GaimPlugin *plugin) { g_hash_table_destroy(hash); hash = NULL; return TRUE; } static GaimPluginInfo info = { 2, /**< api_version */ GAIM_PLUGIN_STANDARD, /**< type */ NULL, /**< ui_requirement */ 0, /**< flags */ NULL, /**< dependencies */ GAIM_PRIORITY_DEFAULT, /**< priority */ AUTORECON_PLUGIN_ID, /**< id */ N_("Auto-Reconnect"), /**< name */ VERSION, /**< version */ /** summary */ N_("When you are kicked offline, this reconnects you."), /** description */ N_("When you are kicked offline, this reconnects you."), "Eric Warmenhoven <eric@warmenhoven.org>", /**< author */ GAIM_WEBSITE, /**< homepage */ plugin_load, /**< load */ plugin_unload, /**< unload */ NULL, /**< destroy */ NULL, /**< ui_info */ NULL /**< extra_info */ }; static void init_plugin(GaimPlugin *plugin) { } GAIM_INIT_PLUGIN(autorecon, init_plugin, info)