diff options
-rw-r--r-- | mail/ChangeLog | 17 | ||||
-rw-r--r-- | mail/folder-browser.c | 1 | ||||
-rw-r--r-- | mail/mail-local.c | 5 | ||||
-rw-r--r-- | mail/mail-tools.c | 8 | ||||
-rw-r--r-- | mail/mail-vfolder.c | 99 | ||||
-rw-r--r-- | mail/mail-vfolder.h | 3 |
6 files changed, 121 insertions, 12 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 703f843a28..ea7844e966 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,20 @@ +2001-03-03 Not Zed <NotZed@Ximian.com> + + * mail-tools.c: Remove very old camel lock stuff. + + * mail-local.c (register_folder_registered): Add the local folder + as a potential vfolder source. + + * folder-browser.c (got_folder): When we have a new folder, + register it as a potential vfolder source. + + * mail-vfolder.c: Added the source rule to the vfolder_info. + (vfolder_refresh): Store the rule in the vfolder info, etc. + (vfolder_register_source): Function to register a newly opened + folder with us. + (vfolder_uri_to_folder): Save the folder in the vfolder_info too. + (source_finalise): Handle clenaup when the folder dies. + 2001-03-02 Not Zed <NotZed@Ximian.com> * mail-mt.c (set_stop): Check the container is not NIL before diff --git a/mail/folder-browser.c b/mail/folder-browser.c index 324599a726..726b79705d 100644 --- a/mail/folder-browser.c +++ b/mail/folder-browser.c @@ -176,6 +176,7 @@ got_folder(char *uri, CamelFolder *folder, void *data) gtk_widget_set_sensitive(GTK_WIDGET(fb->search), camel_folder_has_search_capability(folder)); message_list_set_threaded(fb->message_list, mail_config_get_thread_list()); message_list_set_folder(fb->message_list, folder); + vfolder_register_source(folder); done: gtk_object_unref((GtkObject *)fb); diff --git a/mail/mail-local.c b/mail/mail-local.c index 4d2a7e0615..b0195ff899 100644 --- a/mail/mail-local.c +++ b/mail/mail-local.c @@ -61,6 +61,8 @@ #include "folder-browser.h" #include "mail-mt.h" +#include "mail-vfolder.h" + #define d(x) @@ -519,6 +521,9 @@ register_folder_registered(struct _mail_msg *mm) camel_vee_folder_add_folder (CAMEL_VEE_FOLDER (store->vtrash), local_folder->folder); + /* add the folder to the vfolder lists FIXME: merge stuff above with this */ + vfolder_register_source(local_folder->folder); + unread = local_folder->last_unread; local_folder->last_unread = 0; local_folder_changed (CAMEL_OBJECT (local_folder->folder), GINT_TO_POINTER (unread), diff --git a/mail/mail-tools.c b/mail/mail-tools.c index 73d024f8ff..0c623916ac 100644 --- a/mail/mail-tools.c +++ b/mail/mail-tools.c @@ -42,14 +42,6 @@ /* **************************************** */ -G_LOCK_DEFINE_STATIC (camel); -G_LOCK_DEFINE_STATIC (camel_locklevel); -static GPrivate *camel_locklevel = NULL; - -#define LOCK_VAL (GPOINTER_TO_INT (g_private_get (camel_locklevel))) -#define LOCK_SET(val) g_private_set (camel_locklevel, (GINT_TO_POINTER (val))) - - CamelFolder * mail_tool_get_folder_from_urlname (const gchar *url, const gchar *name, guint32 flags, CamelException *ex) diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c index 706f259b85..488de8687e 100644 --- a/mail/mail-vfolder.c +++ b/mail/mail-vfolder.c @@ -24,6 +24,8 @@ #include "mail.h" #include "camel/camel.h" +#include "camel/camel-remote-store.h" +#include "camel/camel-vee-folder.h" #include "filter/vfolder-context.h" #include "filter/vfolder-editor.h" @@ -33,11 +35,14 @@ struct _vfolder_info { char *name; char *query; + FilterRule *rule; + CamelVeeFolder *folder; }; /* list of vfolders available */ static GList *available_vfolders = NULL; static VfolderContext *context; +static GList *source_folders; /* list of source folders */ /* Ditto below */ EvolutionStorage *vfolder_storage; @@ -64,6 +69,67 @@ vfolder_find(const char *name) return NULL; } +static void +register_new_source(struct _vfolder_info *info, CamelFolder *folder) +{ + FilterRule *rule = info->rule; + + if (rule && info->folder && rule->source) { + int remote = (((CamelService *)folder->parent_store)->provider->flags & CAMEL_PROVIDER_IS_REMOTE) != 0; + + if (!strcmp(rule->source, "local")) { + if (!remote) { + printf("adding local folder to vfolder %s\n", rule->name); + camel_vee_folder_add_folder(info->folder, folder); + } + } else if (!strcmp(rule->source, "remote_active")) { + if (remote) { + printf("adding remote folder to vfolder %s\n", rule->name); + camel_vee_folder_add_folder(info->folder, folder); + } + } else if (!strcmp(rule->source, "local_remote_active")) { + printf("adding local or remote folder to vfolder %s\n", rule->name); + camel_vee_folder_add_folder(info->folder, folder); + } + } +} + +static void source_finalise(CamelFolder *sub, gpointer type, CamelFolder *vf) +{ + GList *l = available_vfolders; + + while (l) { + struct _vfolder_info *info = l->data; + + if (info->folder) + camel_vee_folder_remove_folder(info->folder, sub); + + l = l->next; + } +} + +/* for registering potential vfolder sources */ +void vfolder_register_source(CamelFolder *folder) +{ + GList *l; + + if (CAMEL_IS_VEE_FOLDER(folder)) + return; + + if (g_list_find(source_folders, folder)) + return; + + /* FIXME: Hook to destroy event */ + camel_object_hook_event((CamelObject *)folder, "finalize", (CamelObjectEventHookFunc)source_finalise, folder); + + source_folders = g_list_append(source_folders, folder); + l = available_vfolders; + while (l) { + register_new_source(l->data, folder); + l = l->next; + } +} + /* go through the list of what we have, what we want, and make them match, deleting/reconfiguring as required */ static void @@ -82,6 +148,11 @@ vfolder_refresh(void) g_string_truncate(expr, 0); filter_rule_build_code(rule, expr); if (info) { + gtk_object_ref((GtkObject *)rule); + if (info->rule) + gtk_object_unref((GtkObject *)info->rule); + info->rule = rule; + available_vfolders = g_list_remove(available_vfolders, info); /* check if the rule has changed ... otherwise, leave it */ @@ -102,6 +173,9 @@ vfolder_refresh(void) info = g_malloc(sizeof(*info)); info->name = g_strdup(rule->name); info->query = g_strdup(expr->str); + gtk_object_ref((GtkObject *)rule); + info->rule = rule; + info->folder = NULL; d(printf("Adding new vfolder: %s %s\n", rule->name, expr->str)); uri = g_strdup_printf("vfolder:%s", info->name); @@ -123,6 +197,8 @@ vfolder_refresh(void) g_free(path); g_free(info->name); g_free(info->query); + gtk_object_unref((GtkObject *)info->rule); + g_free(info); l = g_list_next(l); } @@ -134,6 +210,8 @@ vfolder_refresh(void) info = g_malloc(sizeof(*info)); info->name = g_strdup("UNMATCHED"); info->query = g_strdup("UNMATCHED"); + info->rule = NULL; + info->folder = NULL; d(printf("Adding new vfolder: %s %s\n", info->name, info->query)); uri = g_strdup_printf("vfolder:%s", info->name); @@ -192,14 +270,13 @@ vfolder_create_storage(EvolutionShellComponent *shell_component) CamelFolder * vfolder_uri_to_folder(const char *uri, CamelException *ex) { - void camel_vee_folder_add_folder(CamelFolder *, CamelFolder *); - struct _vfolder_info *info; char *storeuri, *foldername; VfolderRule *rule; CamelFolder *folder = NULL, *sourcefolder; const char *sourceuri; int sources; + GList *l; if (strncmp (uri, "vfolder:", 8)) return NULL; @@ -210,6 +287,11 @@ vfolder_uri_to_folder(const char *uri, CamelException *ex) return NULL; } + if (info->folder) { + camel_object_ref((CamelObject *)info->folder); + return (CamelFolder *)info->folder; + } + d(printf("Opening vfolder: %s\n", uri)); rule = (VfolderRule *)rule_context_find_rule((RuleContext *)context, info->name, NULL); @@ -219,6 +301,7 @@ vfolder_uri_to_folder(const char *uri, CamelException *ex) /* we dont have indexing on vfolders */ folder = mail_tool_get_folder_from_urlname (storeuri, foldername, CAMEL_STORE_FOLDER_CREATE, ex); + info->folder = (CamelVeeFolder *)folder; bonobo_object_ref (BONOBO_OBJECT (vfolder_storage)); mail_hash_storage ((CamelService *)folder->parent_store, vfolder_storage); @@ -232,12 +315,19 @@ vfolder_uri_to_folder(const char *uri, CamelException *ex) printf("source folder = %p\n", sourcefolder); if (sourcefolder) { sources++; - camel_vee_folder_add_folder(folder, sourcefolder); + camel_vee_folder_add_folder((CamelVeeFolder *)folder, sourcefolder); } else { /* we'll just silently ignore now-missing sources */ camel_exception_clear(ex); } } + + l = source_folders; + while (l) { + register_new_source(info, l->data); + l = l->next; + } +#if 0 /* if we didn't have any sources, just use Inbox as the default */ if (sources == 0) { char *defaulturi; @@ -250,6 +340,7 @@ vfolder_uri_to_folder(const char *uri, CamelException *ex) camel_vee_folder_add_folder(folder, sourcefolder); } } +#endif } g_free(foldername); @@ -313,7 +404,7 @@ vfolder_create_part(const char *name) FilterRule * vfolder_clone_rule(FilterRule *in) { - FilterRule *rule = vfolder_rule_new(); + FilterRule *rule = (FilterRule *)vfolder_rule_new(); xmlNodePtr xml; xml = filter_rule_xml_encode(in); diff --git a/mail/mail-vfolder.h b/mail/mail-vfolder.h index b8b409b1e7..aa53fbbe60 100644 --- a/mail/mail-vfolder.h +++ b/mail/mail-vfolder.h @@ -23,6 +23,9 @@ void vfolder_gui_add_rule(VfolderRule *rule); void vfolder_gui_add_from_message(CamelMimeMessage *msg, int flags, const char *source); void vfolder_gui_add_from_mlist(CamelMimeMessage *msg, const char *mlist, const char *source); +/* for registering all open folders as potential vfolder sources */ +void vfolder_register_source(CamelFolder *folder); + EvolutionStorage *mail_vfolder_get_vfolder_storage (void); #endif |