aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--filter/ChangeLog9
-rw-r--r--filter/rule-context.c27
2 files changed, 31 insertions, 5 deletions
diff --git a/filter/ChangeLog b/filter/ChangeLog
index c260cb8fb8..bce28d210e 100644
--- a/filter/ChangeLog
+++ b/filter/ChangeLog
@@ -1,3 +1,12 @@
+2001-10-04 <NotZed@Ximian.com>
+
+ * rule-context.c (save): "safe" save code, first save to .#name,
+ then rename to name if it worked, also create backups to name~.
+ Means filters/etc wont get reset/lost if disk fills up, although
+ relies on libxml failing properly.
+ (new_rule_clicked): Removed warning, we do now have changed
+ signals!
+
2001-09-28 <NotZed@Ximian.com>
* vfolder-rule.c (vfolder_rule_add_source): Emit changed events
diff --git a/filter/rule-context.c b/filter/rule-context.c
index 389ef7296a..f77f77b9d0 100644
--- a/filter/rule-context.c
+++ b/filter/rule-context.c
@@ -22,6 +22,10 @@
#include <config.h>
#endif
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#endif
+
#include <errno.h>
#include <string.h>
#include <gtk/gtksignal.h>
@@ -356,6 +360,8 @@ save (RuleContext *f, const char *user)
GList *l;
FilterRule *rule;
struct _rule_set_map *map;
+ char *usersav, *userbak, *slash;
+ int ret;
doc = xmlNewDoc ("1.0");
root = xmlNewDocNode (doc, NULL, "filteroptions", NULL);
@@ -373,9 +379,23 @@ save (RuleContext *f, const char *user)
}
l = g_list_next (l);
}
- xmlSaveFile (user, doc);
+
+ usersav = alloca(strlen(user)+5);
+ userbak = alloca(strlen(user)+5);
+ slash = strrchr(user, '/');
+ if (slash)
+ sprintf(usersav, "%.*s.#%s", slash-user+1, user, slash+1);
+ else
+ sprintf(usersav, ".#%s", user);
+ sprintf(userbak, "%s~", user);
+ printf("saving rules to '%s' then backup '%s'\n", usersav, userbak);
+ ret = xmlSaveFile(usersav, doc);
+ if (ret != -1) {
+ rename(user, userbak);
+ ret = rename(usersav, user);
+ }
xmlFreeDoc (doc);
- return 0;
+ return ret;
}
FilterPart *
@@ -432,9 +452,6 @@ rule_context_add_rule (RuleContext *f, FilterRule *new)
static void
new_rule_clicked (GtkWidget *dialog, int button, RuleContext *context)
{
-#ifndef NO_WARNINGS
-#warning "Need a changed signal for this to work best"
-#endif
if (button == 0) {
FilterRule *rule = gtk_object_get_data (GTK_OBJECT (dialog), "rule");
char *user = gtk_object_get_data (GTK_OBJECT (dialog), "path");