diff options
-rw-r--r-- | irc.c | 3 | ||||
-rw-r--r-- | irc.h | 1 | ||||
-rw-r--r-- | root_commands.c | 4 | ||||
-rw-r--r-- | storage.c | 34 | ||||
-rw-r--r-- | storage.h | 1 |
5 files changed, 43 insertions, 0 deletions
@@ -65,6 +65,8 @@ irc_t *irc_new(int fd) irc->iconv = (GIConv) - 1; irc->oconv = (GIConv) - 1; + irc->save_source_id = -1; + if (global.conf->hostname) { myhost = g_strdup(global.conf->hostname); } else if (getsockname(irc->fd, (struct sockaddr*) &sock, &socklen) == 0) { @@ -103,6 +105,7 @@ irc_t *irc_new(int fd) b->ui = &irc_ui_funcs; s = set_add(&b->set, "allow_takeover", "true", set_eval_bool, irc); + s = set_add(&b->set, "auto_save", "true", set_eval_bool, irc); s = set_add(&b->set, "away_devoice", "true", set_eval_bw_compat, irc); s->flags |= SET_HIDDEN; s = set_add(&b->set, "away_reply_timeout", "3600", set_eval_int, irc); @@ -124,6 +124,7 @@ typedef struct irc { gint w_watch_source_id; gint ping_source_id; gint login_source_id; /* To slightly delay some events at login time. */ + gint save_source_id; struct otr *otr; /* OTR state and book keeping, used by the OTR plugin. TODO: Some mechanism for plugindata. */ diff --git a/root_commands.c b/root_commands.c index bc11746f..79fdcd80 100644 --- a/root_commands.c +++ b/root_commands.c @@ -368,6 +368,10 @@ static int cmd_set_real(irc_t *irc, char **cmd, set_t **head, cmd_set_checkflags } else { cmd_showset(irc, head, set_name); } + + if (st /* XXX: && !(s->flags & SET_NOSAVE)*/) { + storage_setup_auto_save(irc); + } } else if (set_name) { cmd_showset(irc, head, set_name); } else { @@ -60,6 +60,40 @@ static storage_t *storage_init_single(const char *name) return st; } +static gboolean storage_auto_save(gpointer data, gint fd, b_input_condition cond) +{ + irc_t *irc = data; + if (!(irc->status & USTATUS_IDENTIFIED) || irc->save_source_id == -1) { + return FALSE; + } + + //imcb_log(irc->b->accounts->ic, "Saving config"); /* XXX: debug */ + + /*if (getenv("BITLBEE_DEBUG")) { + fprintf(stderr, "Autosave\n"); + }*/ + + if (storage_save(irc, NULL, 1) != STORAGE_OK) { + imcb_error(irc->b->accounts->ic, "Could not autosave."); + } + + b_event_remove(irc->save_source_id); + irc->save_source_id = -1; + + return FALSE; +} + +void storage_setup_auto_save(irc_t *irc) +{ + if (!set_getbool(&irc->b->set, "auto_save")) { + return; + } + + if ((irc->status & USTATUS_IDENTIFIED) && irc->save_source_id == -1) { + irc->save_source_id = b_timeout_add(30000, storage_auto_save, irc); + } +} + GList *storage_init(const char *primary, char **migrate) { GList *ret = NULL; @@ -59,6 +59,7 @@ storage_status_t storage_load(irc_t * irc, const char *password); storage_status_t storage_save(irc_t *irc, char *password, int overwrite); storage_status_t storage_remove(const char *nick); +void storage_setup_auto_save(irc_t *irc); void register_storage_backend(storage_t *); G_GNUC_MALLOC GList *storage_init(const char *primary, char **migrate); |