aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-vfolder.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/mail-vfolder.c')
-rw-r--r--mail/mail-vfolder.c176
1 files changed, 176 insertions, 0 deletions
diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c
new file mode 100644
index 0000000000..cef814082a
--- /dev/null
+++ b/mail/mail-vfolder.c
@@ -0,0 +1,176 @@
+/*
+ Copyright 2000 Helix Code Inc.
+
+ Author: Michael Zucchi <notzed@helixcode.com>
+
+ code for managing vfolders
+
+ NOTE: dont run this through fucking indent.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <bonobo.h>
+
+#include "Evolution.h"
+#include "evolution-storage.h"
+
+#include "evolution-shell-component.h"
+#include "folder-browser.h"
+
+#include "filter/vfolder-context.h"
+#include "filter/filter-rule.h"
+#include "filter/vfolder-editor.h"
+
+struct _vfolder_info {
+ char *name;
+ char *query;
+};
+
+/* list of vfolders available */
+static GList *available_vfolders = NULL;
+static VfolderContext *context;
+static EvolutionStorage *vfolder_storage;
+
+/* GROSS HACK: for passing to other parts of the program */
+EvolutionShellClient *global_shell_client = NULL;
+extern char *evolution_dir;
+
+static struct _vfolder_info *
+vfolder_find(char *name)
+{
+ GList *l = available_vfolders;
+ struct _vfolder_info *info;
+
+ while (l) {
+ info = l->data;
+ if (!strcmp(info->name, name))
+ return info;
+ l = g_list_next(l);
+ }
+ return NULL;
+}
+
+/* go through the list of what we have, what we want, and make
+ them match, deleting/reconfiguring as required */
+static void
+vfolder_refresh(void)
+{
+ GList *l;
+ GList *head = NULL; /* processed list */
+ struct _vfolder_info *info;
+ FilterRule *rule;
+ GString *expr = g_string_new("");
+ char *uri, *path;
+
+ rule = NULL;
+ while ( (rule = rule_context_next_rule((RuleContext *)context, rule)) ) {
+ info = vfolder_find(rule->name);
+ g_string_truncate(expr, 0);
+ filter_rule_build_code(rule, expr);
+ if (info) {
+ available_vfolders = g_list_remove(available_vfolders, info);
+
+ /* check if the rule has changed ... otherwise, leave it */
+ if (strcmp(expr->str, info->query)) {
+ printf("Must reconfigure vfolder with new rule?\n");
+ g_free(info->query);
+ info->query = g_strdup(expr->str);
+
+ uri = g_strdup_printf("vfolder:%s/vfolder/%s?%s", evolution_dir, info->name, info->query);
+ path = g_strdup_printf("/%s", info->name);
+ evolution_storage_removed_folder(vfolder_storage, path);
+ evolution_storage_new_folder (vfolder_storage, path,
+ "mail",
+ uri,
+ info->name);
+ g_free(uri);
+ g_free(path);
+ }
+ } else {
+ info = g_malloc(sizeof(*info));
+ info->name = g_strdup(rule->name);
+ info->query = g_strdup(expr->str);
+ printf("Adding new vfolder: %s %s\n", rule->name, expr->str);
+
+ uri = g_strdup_printf("vfolder:%s/vfolder/%s?%s", evolution_dir, info->name, info->query);
+ path = g_strdup_printf("/%s", info->name);
+ evolution_storage_new_folder (vfolder_storage, path,
+ "mail",
+ uri,
+ info->name);
+ g_free(uri);
+ g_free(path);
+ }
+ head = g_list_append(head, info);
+ }
+ /* everything in available_vfolders are to be removed ... */
+ l = available_vfolders;
+ while (l) {
+ info = l->data;
+ printf("removing vfolders %s %s\n", info->name, info->query);
+ path = g_strdup_printf("/%s", info->name);
+ evolution_storage_removed_folder(vfolder_storage, path);
+ g_free(path);
+ g_free(info->name);
+ g_free(info->query);
+ l = g_list_next(l);
+ }
+ g_list_free(available_vfolders);
+ available_vfolders = head;
+ g_string_free(expr, TRUE);
+}
+
+void
+vfolder_create_storage(EvolutionShellComponent *shell_component)
+{
+ EvolutionShellClient *shell_client;
+ Evolution_Shell corba_shell;
+ EvolutionStorage *storage;
+ char *user, *system;
+
+ shell_client = evolution_shell_component_get_owner (shell_component);
+ if (shell_client == NULL) {
+ g_warning ("We have no shell!?");
+ return;
+ }
+ global_shell_client = shell_client;
+
+ corba_shell = bonobo_object_corba_objref (BONOBO_OBJECT (shell_client));
+
+ storage = evolution_storage_new ("VFolders");
+ if (evolution_storage_register_on_shell (storage, corba_shell) != EVOLUTION_STORAGE_OK) {
+ g_warning ("Cannot register storage");
+ return;
+ }
+
+ vfolder_storage = storage;
+
+ user = g_strdup_printf ("%s/vfolders.xml", evolution_dir);
+ system = g_strdup_printf("%s/evolution/vfoldertypes.xml", EVOLUTION_DATADIR);
+
+ context = vfolder_context_new();
+ printf("loading rules %s %s\n", system, user);
+ if (rule_context_load((RuleContext *)context, system, user) != 0) {
+ g_warning("cannot load vfolders: %s\n", ((RuleContext *)context)->error);
+ }
+ g_free(user);
+ g_free(system);
+ vfolder_refresh();
+}
+
+void
+vfolder_edit(void)
+{
+ GtkWidget *w;
+ char *user;
+
+ w = vfolder_editor_construct(context);
+ if (gnome_dialog_run_and_close((GnomeDialog *)w) == 0) {
+ user = g_strdup_printf ("%s/vfolders.xml", evolution_dir);
+ rule_context_save(context, user);
+ g_free(user);
+ vfolder_refresh();
+ }
+}