diff options
author | Not Zed <NotZed@HelixCode.com> | 2000-07-31 23:07:49 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2000-07-31 23:07:49 +0800 |
commit | 72092414aa9b150b03b69b26e216d2d057110f92 (patch) | |
tree | 7689661ce4288047e4bac43dc84d610a044eeacd /mail/mail-vfolder.c | |
parent | 9ddabfee03542411d02851a1b1f144707ce32b82 (diff) | |
download | gsoc2013-evolution-72092414aa9b150b03b69b26e216d2d057110f92.tar gsoc2013-evolution-72092414aa9b150b03b69b26e216d2d057110f92.tar.gz gsoc2013-evolution-72092414aa9b150b03b69b26e216d2d057110f92.tar.bz2 gsoc2013-evolution-72092414aa9b150b03b69b26e216d2d057110f92.tar.lz gsoc2013-evolution-72092414aa9b150b03b69b26e216d2d057110f92.tar.xz gsoc2013-evolution-72092414aa9b150b03b69b26e216d2d057110f92.tar.zst gsoc2013-evolution-72092414aa9b150b03b69b26e216d2d057110f92.zip |
Configurable vfolder sources, and a button to save a search
as a new vfolder.
2000-07-31 Not Zed <NotZed@HelixCode.com>
* mail-vfolder.h: Header for vfolder functions.
* folder-browser.c (mail_uri_to_folder): Use new scheme to open
vfolders.
(search_save): New button/function to save a search as a vfolder.
* mail-vfolder.c (vfolder_edit): Made asynchronous.
(vfolder_uri_to_folder): New function for loading vfolders and
setting up their source folders.
(vfolder_refresh): Change shell vfolder uri's to indirect
references rather than the real vfolder uri.
(vfolder_gui_add_rule): Add a rule with user confirmation.
(vfolder_create_part): Get a new part by name, for creating rules
in code.
* message-thread.c (thread_messages): Check for uid lookup
failure, which indicates an error in the folder or calling code.
svn path=/trunk/; revision=4422
Diffstat (limited to 'mail/mail-vfolder.c')
-rw-r--r-- | mail/mail-vfolder.c | 152 |
1 files changed, 141 insertions, 11 deletions
diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c index cef814082a..cd613040b1 100644 --- a/mail/mail-vfolder.c +++ b/mail/mail-vfolder.c @@ -18,11 +18,16 @@ #include "evolution-shell-component.h" #include "folder-browser.h" +#include "mail-vfolder.h" + +#include "camel/camel.h" #include "filter/vfolder-context.h" -#include "filter/filter-rule.h" +#include "filter/vfolder-rule.h" #include "filter/vfolder-editor.h" +#define d(x) x + struct _vfolder_info { char *name; char *query; @@ -35,10 +40,13 @@ static EvolutionStorage *vfolder_storage; /* GROSS HACK: for passing to other parts of the program */ EvolutionShellClient *global_shell_client = NULL; + +/* more globals ... */ extern char *evolution_dir; +extern CamelSession *session; static struct _vfolder_info * -vfolder_find(char *name) +vfolder_find(const char *name) { GList *l = available_vfolders; struct _vfolder_info *info; @@ -74,11 +82,12 @@ vfolder_refresh(void) /* check if the rule has changed ... otherwise, leave it */ if (strcmp(expr->str, info->query)) { - printf("Must reconfigure vfolder with new rule?\n"); + d(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); + /*uri = g_strdup_printf("vfolder:%s/vfolder/%s?%s", evolution_dir, info->name, info->query);*/ + uri = g_strdup_printf("vfolder:%s", info->name); path = g_strdup_printf("/%s", info->name); evolution_storage_removed_folder(vfolder_storage, path); evolution_storage_new_folder (vfolder_storage, path, @@ -92,9 +101,10 @@ vfolder_refresh(void) 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); + d(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); + /*uri = g_strdup_printf("vfolder:%s/vfolder/%s?%s", evolution_dir, info->name, info->query);*/ + uri = g_strdup_printf("vfolder:%s", info->name); path = g_strdup_printf("/%s", info->name); evolution_storage_new_folder (vfolder_storage, path, "mail", @@ -109,7 +119,7 @@ vfolder_refresh(void) l = available_vfolders; while (l) { info = l->data; - printf("removing vfolders %s %s\n", info->name, info->query); + d(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); @@ -160,17 +170,137 @@ vfolder_create_storage(EvolutionShellComponent *shell_component) vfolder_refresh(); } +/* maps the shell's uri to the real vfolder uri and open the folder */ +CamelFolder * +vfolder_uri_to_folder(const char *uri) +{ + CamelFolder *mail_uri_to_folder(const char *); + void camel_vee_folder_add_folder(CamelFolder *, CamelFolder *); + + struct _vfolder_info *info; + char *storeuri, *foldername; + VfolderRule *rule; + CamelStore *store = NULL; + CamelFolder *folder = NULL, *sourcefolder; + CamelException *ex; + const char *sourceuri; + int sources; + + if (strncmp (uri, "vfolder:", 8)) + return NULL; + + info = vfolder_find(uri+8); + if (info == NULL) { + g_warning("Shell trying to open unknown vFolder: %s", uri); + return NULL; + } + + d(printf("Opening vfolder: %s\n", uri)); + + rule = (VfolderRule *)rule_context_find_rule((RuleContext *)context, info->name); + + storeuri = g_strdup_printf("vfolder:%s/vfolder/%s", evolution_dir, info->name); + foldername = g_strdup_printf("mbox?%s", info->query); + ex = camel_exception_new (); + store = camel_session_get_store (session, storeuri, ex); + if (store == NULL) + goto cleanup; + + folder = camel_store_get_folder (store, foldername, TRUE, ex); + if (folder == NULL) + goto cleanup; + + sourceuri = NULL; + sources = 0; + while ( (sourceuri = vfolder_rule_next_source(rule, sourceuri)) ) { + d(printf("adding vfolder source: %s\n", sourceuri)); + sourcefolder = mail_uri_to_folder(sourceuri); + if (sourcefolder) { + sources++; + camel_vee_folder_add_folder(folder, sourcefolder); + } + } + /* if we didn't have any sources, just use Inbox as the default */ + if (sources == 0) { + char *defaulturi; + + defaulturi = g_strdup_printf("file://%s/local/Inbox", evolution_dir); + d(printf("No sources configured/found, using default: %s\n", defaulturi)); + sourcefolder = mail_uri_to_folder(defaulturi); + g_free(defaulturi); + if (sourcefolder) + camel_vee_folder_add_folder(folder, sourcefolder); + } +cleanup: + g_free(foldername); + g_free(storeuri); + + return folder; +} + +static void +vfolder_editor_clicked(GtkWidget *w, int button, void *data) +{ + if (button == 0) { + char *user; + + user = g_strdup_printf("%s/vfolders.xml", evolution_dir); + rule_context_save((RuleContext *)context, user); + g_free(user); + vfolder_refresh(); + } + if (button != -1) { + gnome_dialog_close((GnomeDialog *)w); + } +} + 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); + gtk_signal_connect((GtkObject *)w, "clicked", vfolder_editor_clicked, NULL); + gtk_widget_show(w); +} + +static void +new_rule_clicked(GtkWidget *w, int button, void *data) +{ + if (button == 0) { + char *user; + FilterRule *rule = gtk_object_get_data((GtkObject *)w, "rule"); + + gtk_object_ref((GtkObject *)rule); + rule_context_add_rule((RuleContext *)context, rule); + user = g_strdup_printf("%s/vfolders.xml", evolution_dir); + rule_context_save((RuleContext *)context, user); g_free(user); vfolder_refresh(); } + if (button != -1) { + gnome_dialog_close((GnomeDialog *)w); + } +} + +FilterPart * +vfolder_create_part(const char *name) +{ + return rule_context_create_part((RuleContext *)context, name); +} + +/* adds a rule with a gui */ +void +vfolder_gui_add_rule(VfolderRule *rule) +{ + GtkWidget *w; + GnomeDialog *gd; + + w = filter_rule_get_widget((FilterRule *)rule, (RuleContext *)context); + gd = (GnomeDialog *)gnome_dialog_new("New VFolder", "Ok", "Cancel", NULL); + gtk_box_pack_start((GtkBox *)gd->vbox, w, FALSE, TRUE, 0); + gtk_widget_show((GtkWidget *)gd); + gtk_object_set_data_full((GtkObject *)gd, "rule", rule, (GtkDestroyNotify)gtk_object_unref); + gtk_signal_connect((GtkObject *)gd, "clicked", new_rule_clicked, NULL); + gtk_widget_show((GtkWidget *)gd); } |