aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Halden <marius.h@lden.org>2016-08-02 13:29:42 +0200
committerMarius Halden <marius.h@lden.org>2016-08-02 13:29:42 +0200
commit53aa23d5867ef008cfcf82dccf81146630be27f8 (patch)
tree1ee116a7c76ed2bd7f8b7b5f0573dd0bbb9660ad
parenta18f767c1f71f9884ff7f23752db025748713d9e (diff)
Add autosave after 30 sec
-rw-r--r--irc.c3
-rw-r--r--irc.h1
-rw-r--r--root_commands.c4
-rw-r--r--storage.c34
-rw-r--r--storage.h1
5 files changed, 43 insertions, 0 deletions
diff --git a/irc.c b/irc.c
index bdd3b42d..1d5a5e6a 100644
--- a/irc.c
+++ b/irc.c
@@ -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);
diff --git a/irc.h b/irc.h
index deb11edf..73430042 100644
--- a/irc.h
+++ b/irc.h
@@ -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 {
diff --git a/storage.c b/storage.c
index 7b684ac7..c60cd224 100644
--- a/storage.c
+++ b/storage.c
@@ -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;
diff --git a/storage.h b/storage.h
index 6e6387ed..8f452ea2 100644
--- a/storage.h
+++ b/storage.h
@@ -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);