diff options
-rw-r--r-- | mail/ChangeLog | 17 | ||||
-rw-r--r-- | mail/component-factory.c | 7 | ||||
-rw-r--r-- | mail/folder-browser-ui.c | 1 | ||||
-rw-r--r-- | mail/mail-autofilter.c | 48 | ||||
-rw-r--r-- | mail/mail-autofilter.h | 9 | ||||
-rw-r--r-- | mail/mail-folder-cache.c | 22 | ||||
-rw-r--r-- | mail/mail-local.c | 104 | ||||
-rw-r--r-- | mail/mail-vfolder.c | 10 |
8 files changed, 174 insertions, 44 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 4a111df44f..8cd958683a 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,13 @@ +2001-10-28 <NotZed@Ximian.com> + + * folder-browser-ui.c (fbui_sensitize_timeout): Remove uic, kill + dumb warning. + + * mail-autofilter.c (mail_filter_rename_uri): Implement function + for filters to keep track of uri's being renamed. + (mail_filter_delete_uri): Similarly for deleting uri's. Note that + these functions are just noops though. + 2001-10-28 Jeffrey Stedfast <fejj@ximian.com> * folder-browser.c: Deactivate the Print right-click menu option @@ -13,12 +23,16 @@ * mail-folder-cache.c (real_flush_updates): Pass the rename event to vfolder rename uri. + (real_flush_updates): Also rename and delete uri's from filters. * mail-local.c (mail_local_folder_reconfigure): Change the store path to be same as parent + mbox to be full path. (mls_delete_folder): Change store path to be parent path, and mbox to be full path. (mail_local_folder_reconfigure): Fix a leak of tmpname. + (mls_delete_folder): Unref the store when done. + (mls_rename_folder): Fix implementation, shell already created + destination folder, so we can't just rename :( * component-factory.c (xfer_folder): Only do a rename if we have remove set, cleaned up logic a bit. @@ -26,6 +40,9 @@ all. (storage_create_folder): IF we have a fragment, use that as part part for parent. + (xfer_folder): Manually call rename code, since the shell will do + a remove/add later on, AND there's no way we can determine the new + path from the crock of an api we have to work with. 2001-10-27 Jeffrey Stedfast <fejj@ximian.com> diff --git a/mail/component-factory.c b/mail/component-factory.c index 92dfddb79b..0139cb43e7 100644 --- a/mail/component-factory.c +++ b/mail/component-factory.c @@ -384,6 +384,13 @@ xfer_folder (EvolutionShellComponent *shell_component, if (camel_exception_is_set(&ex)) GNOME_Evolution_ShellComponentListener_notifyResult (listener, GNOME_Evolution_ShellComponentListener_INVALID_URI, &ev); + else { + /* Since the shell doesn't play nice with local folders, we have to do this manually */ + mail_vfolder_rename_uri(store, source_physical_uri, destination_physical_uri); + mail_filter_rename_uri(store, source_physical_uri, destination_physical_uri); + GNOME_Evolution_ShellComponentListener_notifyResult (listener, GNOME_Evolution_ShellComponentListener_OK, &ev); + } + camel_object_unref((CamelObject *)store); } else { source = mail_tool_uri_to_folder (source_physical_uri, 0, &ex); diff --git a/mail/folder-browser-ui.c b/mail/folder-browser-ui.c index b5b4e853a8..d11b6a473e 100644 --- a/mail/folder-browser-ui.c +++ b/mail/folder-browser-ui.c @@ -455,7 +455,6 @@ static gboolean fbui_sensitize_timeout (gpointer data) { FolderBrowser *fb = FOLDER_BROWSER (data); - BonoboUIComponent *uic = fb->uicomp; GSList *iter; struct sensitize_data *sd; int i; diff --git a/mail/mail-autofilter.c b/mail/mail-autofilter.c index 2eeafccf1d..43bba61c57 100644 --- a/mail/mail-autofilter.c +++ b/mail/mail-autofilter.c @@ -48,6 +48,8 @@ #include "filter/filter-editor.h" #include "filter/filter-option.h" +extern char *evolution_dir; + static void rule_match_recipients (RuleContext *context, FilterRule *rule, CamelInternetAddress *iaddr) { @@ -319,7 +321,6 @@ filter_gui_add_from_message (CamelMimeMessage *msg, int flags) FilterContext *fc; char *user, *system; FilterRule *rule; - extern char *evolution_dir; g_return_if_fail (msg != NULL); @@ -342,7 +343,6 @@ filter_gui_add_from_mlist (const char *mlist) FilterContext *fc; char *user, *system; FilterRule *rule; - extern char *evolution_dir; fc = filter_context_new (); user = g_strdup_printf ("%s/filters.xml", evolution_dir); @@ -356,3 +356,47 @@ filter_gui_add_from_mlist (const char *mlist) g_free (user); gtk_object_unref (GTK_OBJECT (fc)); } + +void +mail_filter_rename_uri(CamelStore *store, const char *olduri, const char *newuri) +{ + GCompareFunc uri_cmp = CAMEL_STORE_CLASS(CAMEL_OBJECT_GET_CLASS(store))->compare_folder_name; + FilterContext *fc; + char *user, *system; + + fc = filter_context_new (); + user = g_strdup_printf ("%s/filters.xml", evolution_dir); + system = EVOLUTION_DATADIR "/evolution/filtertypes.xml"; + rule_context_load ((RuleContext *)fc, system, user); + + if (rule_context_rename_uri((RuleContext *)fc, olduri, newuri, uri_cmp) > 0) { + printf("Folder rename '%s' -> '%s' changed filters, resaving\n", olduri, newuri); + if (rule_context_save((RuleContext *)fc, user) == -1) + g_warning("Could not write out changed filter rules\n"); + } + + g_free(user); + gtk_object_unref (GTK_OBJECT (fc)); +} + +void +mail_filter_delete_uri(CamelStore *store, const char *uri) +{ + GCompareFunc uri_cmp = CAMEL_STORE_CLASS(CAMEL_OBJECT_GET_CLASS(store))->compare_folder_name; + FilterContext *fc; + char *user, *system; + + fc = filter_context_new (); + user = g_strdup_printf ("%s/filters.xml", evolution_dir); + system = EVOLUTION_DATADIR "/evolution/filtertypes.xml"; + rule_context_load ((RuleContext *)fc, system, user); + + if (rule_context_delete_uri((RuleContext *)fc, uri, uri_cmp) > 0) { + printf("Folder deleterename '%s' changed filters, resaving\n", uri); + if (rule_context_save((RuleContext *)fc, user) == -1) + g_warning("Could not write out changed filter rules\n"); + } + + g_free(user); + gtk_object_unref (GTK_OBJECT (fc)); +} diff --git a/mail/mail-autofilter.h b/mail/mail-autofilter.h index 2c3e2c119c..5a2dbe52e5 100644 --- a/mail/mail-autofilter.h +++ b/mail/mail-autofilter.h @@ -43,8 +43,11 @@ FilterRule *filter_rule_from_mlist(FilterContext *context, const char *mlist); /* easiest place to put this */ -void filter_gui_add_from_message (CamelMimeMessage *msg, - int flags); -void filter_gui_add_from_mlist (const char *mlist); +void filter_gui_add_from_message(CamelMimeMessage *msg, int flags); +void filter_gui_add_from_mlist(const char *mlist); + +/* Also easiest place for these, we should really share a global rule context for this stuff ... */ +void mail_filter_rename_uri(CamelStore *store, const char *olduri, const char *newuri); +void mail_filter_delete_uri(CamelStore *store, const char *uri); #endif diff --git a/mail/mail-folder-cache.c b/mail/mail-folder-cache.c index 7e6c3bca26..3ef602eda0 100644 --- a/mail/mail-folder-cache.c +++ b/mail/mail-folder-cache.c @@ -42,7 +42,10 @@ #include "mail-mt.h" #include "mail-folder-cache.h" #include "mail-ops.h" + +/* For notifications of changes */ #include "mail-vfolder.h" +#include "mail-autofilter.h" #define d(x) @@ -150,9 +153,10 @@ real_flush_updates(void *o, void *event_data, void *data) UNLOCK(info_lock); if (up->remove) { - if (up->delete) + if (up->delete) { mail_vfolder_delete_uri(up->store, up->uri); - else + mail_filter_delete_uri(up->store, up->uri); + } else mail_vfolder_add_uri(up->store, up->uri, TRUE); } else { /* Its really a rename, but we have no way of telling the shell that, so remove it */ @@ -163,8 +167,10 @@ real_flush_updates(void *o, void *event_data, void *data) } /* We can tell the vfolder code though */ - if (up->olduri && up->add) + if (up->olduri && up->add) { mail_vfolder_rename_uri(up->store, up->olduri, up->uri); + mail_filter_rename_uri(up->store, up->olduri, up->uri); + } if (up->name == NULL) { if (storage != NULL) { @@ -394,7 +400,7 @@ folder_renamed(CamelObject *o, gpointer event_data, gpointer user_data) CamelFolder *folder = (CamelFolder *)o; char *old = event_data; - printf("Folder renamed from '%s' to '%s'\n", old, folder->full_name); + d(printf("Folder renamed from '%s' to '%s'\n", old, folder->full_name)); mfi = mfi; /* Dont do anything, do it from the store rename event? */ } @@ -450,7 +456,7 @@ store_folder_subscribed(CamelObject *o, void *event_data, void *data) struct _store_info *si; CamelFolderInfo *fi = event_data; - printf("Store folder subscribed '%s' store '%s' \n", fi->full_name, camel_url_to_string(((CamelService *)o)->url, 0)); + d(printf("Store folder subscribed '%s' store '%s' \n", fi->full_name, camel_url_to_string(((CamelService *)o)->url, 0))); LOCK(info_lock); si = g_hash_table_lookup(stores, o); @@ -462,8 +468,6 @@ store_folder_subscribed(CamelObject *o, void *event_data, void *data) static void store_folder_created(CamelObject *o, void *event_data, void *data) { - printf("Store folder created\n"); - /* we only want created events to do more work if we dont support subscriptions */ if (!camel_store_supports_subscriptions(CAMEL_STORE(o))) store_folder_subscribed(o, event_data, data); @@ -514,7 +518,7 @@ rename_folders(struct _store_info *si, const char *oldbase, const char *newbase, old = g_strdup_printf("%s%s", oldbase, fi->full_name + strlen(newbase)); mfi = g_hash_table_lookup(si->folders, old); if (mfi) { - printf("Found old folder '%s' renaming to '%s'\n", mfi->full_name, fi->full_name); + d(printf("Found old folder '%s' renaming to '%s'\n", mfi->full_name, fi->full_name)); up->oldpath = mfi->path; up->olduri = mfi->uri; @@ -529,7 +533,7 @@ rename_folders(struct _store_info *si, const char *oldbase, const char *newbase, g_hash_table_insert(si->folders, mfi->full_name, mfi); g_hash_table_insert(si->folders_uri, mfi->uri, mfi); } else { - printf("Rename found a new folder? old '%s' new '%s'\n", old, fi->full_name); + d(printf("Rename found a new folder? old '%s' new '%s'\n", old, fi->full_name)); /* Its a new op */ mfi = g_malloc0(sizeof(*mfi)); mfi->path = g_strdup(fi->path); diff --git a/mail/mail-local.c b/mail/mail-local.c index 8f43497ce4..3b601005b2 100644 --- a/mail/mail-local.c +++ b/mail/mail-local.c @@ -473,7 +473,6 @@ mlf_set_folder(MailLocalFolder *mlf, guint32 flags, CamelException *ex) g_assert(mlf->real_folder == NULL); - /*uri = g_strdup_printf("%s:%s%s", mlf->meta->format, ((CamelService *)folder->parent_store)->url->path, mlf->real_path);*/ uri = g_strdup_printf("%s:%s", mlf->meta->format, ((CamelService *)folder->parent_store)->url->path); d(printf("opening real store: %s\n", uri)); @@ -786,6 +785,7 @@ mls_delete_folder(CamelStore *store, const char *folder_name, CamelException *ex if (real_store == NULL) { g_free(metapath); free_metainfo(meta); + camel_object_unref((CamelObject *)real_store); return; } @@ -796,9 +796,12 @@ mls_delete_folder(CamelStore *store, const char *folder_name, CamelException *ex camel_exception_xfer(ex, &local_ex); g_free(metapath); free_metainfo(meta); + camel_object_unref((CamelObject *)real_store); return; } + camel_object_unref((CamelObject *)real_store); + free_metainfo(meta); if (unlink(metapath) == -1) { @@ -813,46 +816,97 @@ mls_delete_folder(CamelStore *store, const char *folder_name, CamelException *ex static void mls_rename_folder(CamelStore *store, const char *old_name, const char *new_name, CamelException *ex) { + CamelStore *real_store; + MailLocalStore *mls = (MailLocalStore *)store; + char *uri; + /*CamelException local_ex;*/ + struct _local_meta *meta; char *oldname, *newname; + char *oldmeta, *newmeta; + struct stat st; /* folder:rename() updates all our in-memory data to match */ /* FIXME: Need to lock the subfolder that matches this if its open Then rename it and unlock it when done */ - printf("Renaming folder from '%s' to '%s'\n", old_name, new_name); + d(printf("Renaming folder from '%s' to '%s'\n", old_name, new_name)); - oldname = g_strdup_printf("%s%s", ((CamelService *)store)->url->path, old_name); - newname = g_strdup_printf("%s%s", ((CamelService *)store)->url->path, new_name); + oldmeta = g_strdup_printf("%s%s/local-metadata.xml", ((CamelService *)store)->url->path, old_name); + newmeta = g_strdup_printf("%s%s/local-metadata.xml", ((CamelService *)store)->url->path, new_name); - if (rename(oldname, newname) == -1) { - printf("Rename failed!\n"); - camel_exception_setv(ex, 1, "Rename failed: %s", strerror(errno)); - } - - g_free(oldname); - g_free(newname); -#if 0 - /* find the real store for this folder, and proxy the call */ - metapath = g_strdup_printf("%s%s/local-metadata.xml", ((CamelService *)store)->url->path, old_name); - meta = load_metainfo(metapath); - uri = g_strdup_printf("%s:%s%s", meta->format, ((CamelService *)store)->url->path); + meta = load_metainfo(oldmeta); + uri = g_strdup_printf("%s:%s", meta->format, ((CamelService *)store)->url->path); real_store = (CamelStore *)camel_session_get_service(session, uri, CAMEL_PROVIDER_STORE, ex); g_free(uri); if (real_store == NULL) { - g_free(metapath); + g_free(newmeta); + g_free(oldmeta); free_metainfo(meta); return; } - oldname = g_strdup_printf("%s/%s", old_name, mlf->meta->name); - newname = g_strdup_printf("%s/%s", new_name, mlf->meta->name); - camel_store_rename_folder(real_store, old_name, new_name, &local_ex); + oldname = g_strdup_printf("%s%s/%s", ((CamelService *)store)->url->path, old_name, meta->name); + newname = g_strdup_printf("%s%s/%s", ((CamelService *)store)->url->path, new_name, meta->name); + + camel_store_rename_folder(real_store, oldname, newname, ex); + if (!camel_exception_is_set(ex)) { + /* If this fails? Well, doesn't really matter but 'fail' anyway */ + if (stat(oldmeta, &st) == 0 + && rename(oldmeta, newmeta) == -1) { + camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, + _("Could not rename folder %s to %s: %s"), + old_name, new_name, strerror(errno)); + } else { + /* So .. .the shell does a remove/add now the rename worked, so we dont + have to do this. However totally broken that idea might be */ +#if 0 + CamelFolderInfo *info; + const char *tmp; + char *olduri, *newuri; + + olduri = g_strdup_printf("%s:%s%s", ((CamelService *)store)->url->protocol, ((CamelService *)store)->url->path, old_name); + newuri = g_strdup_printf("%s:%s%s", ((CamelService *)store)->url->protocol, ((CamelService *)store)->url->path, new_name); + info = g_hash_table_lookup(mls->folder_infos, olduri); + if (info) { + CamelRenameInfo reninfo; + + g_free(info->url); + g_free(info->full_name); + g_free(info->name); + g_free(info->path); + info->url = newuri; + info->full_name = g_strdup(new_name); + info->path = g_strdup_printf("/%s", new_name); + tmp = strchr(new_name, '/'); + if (tmp == NULL) + tmp = new_name; + info->name = g_strdup(tmp); + g_hash_table_insert(mls->folder_infos, info->url, info); + + reninfo.new = info; + reninfo.old_base = (char *)old_name; + + camel_object_trigger_event((CamelObject *)store, "folder_renamed", &reninfo); + } else { + g_free(newuri); + g_warning("Cannot find existing folder '%s' in table?\n", olduri); + } + + g_free(olduri); +#endif + } + } - + g_free(newname); + g_free(oldname); - camel_exception_setv(ex, 1, "Not supported"); -#endif + camel_object_unref((CamelObject *)real_store); + + free_metainfo(meta); + + g_free(newmeta); + g_free(oldmeta); } static char * @@ -926,7 +980,7 @@ static void mail_local_store_add_folder(MailLocalStore *mls, const char *uri, co CamelFolderInfo *info = NULL; CamelURL *url; - d(printf("Shell adding folder: '%s' path = '%s'\n", uri, path)); + (printf("Shell adding folder: '%s' path = '%s'\n", uri, path)); url = camel_url_new(uri, NULL); if (url == NULL) { @@ -983,6 +1037,8 @@ static void mail_local_store_remove_folder(MailLocalStore *mls, const char *path { struct _search_info data = { path, NULL }; + printf("shell removing folder? '%s'\n", path); + /* we're keyed on uri, not path, so have to search for it manually */ LOCAL_STORE_LOCK(mls); diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c index 5db432a3b6..216337b4b0 100644 --- a/mail/mail-vfolder.c +++ b/mail/mail-vfolder.c @@ -440,7 +440,7 @@ mail_vfolder_rename_uri(CamelStore *store, const char *from, const char *to) CamelVeeFolder *vf; int changed = 0; - printf("vfolder rename uri: %s to %s\n", from, to); + d(printf("vfolder rename uri: %s to %s\n", from, to)); if (context == NULL || !strncmp(from, "vtrash:", 7) || !strncmp(to, "vtrash:", 7)) return; @@ -457,7 +457,7 @@ mail_vfolder_rename_uri(CamelStore *store, const char *from, const char *to) /* Remove all sources that match, ignore changed events though because the adduri call above does the work async */ if (uri_cmp(from, source)) { - printf("Vfolder '%s' used '%s' ('%s') now uses '%s'\n", rule->name, source, from, to); + d(printf("Vfolder '%s' used '%s' ('%s') now uses '%s'\n", rule->name, source, from, to)); vf = g_hash_table_lookup(vfolder_hash, rule->name); g_assert(vf); gtk_signal_disconnect_by_func((GtkObject *)rule, rule_changed, vf); @@ -502,7 +502,7 @@ rule_changed(FilterRule *rule, CamelFolder *folder) CamelFolder *old; LOCK(); - printf("Changing folder name in hash table to '%s'\n", rule->name); + d(printf("Changing folder name in hash table to '%s'\n", rule->name)); if (g_hash_table_lookup_extended(vfolder_hash, folder->full_name, (void **)&key, (void **)&old)) { g_hash_table_remove(vfolder_hash, key); g_free(key); @@ -666,11 +666,11 @@ store_folder_renamed(CamelObject *o, void *event_data, void *data) /* This should be more-or-less thread-safe */ - printf("Folder renamed to '%s' from '%s'\n", info->new->full_name, info->old_base); + d(printf("Folder renamed to '%s' from '%s'\n", info->new->full_name, info->old_base)); /* Folder is already renamed? */ LOCK(); - printf("Changing folder name in hash table to '%s'\n", info->new->full_name); + d(printf("Changing folder name in hash table to '%s'\n", info->new->full_name)); if (g_hash_table_lookup_extended(vfolder_hash, info->old_base, (void **)&key, (void **)&folder)) { g_hash_table_remove(vfolder_hash, key); g_free(key); |