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)