diff options
Diffstat (limited to 'mail/mail-local.c')
-rw-r--r-- | mail/mail-local.c | 104 |
1 files changed, 80 insertions, 24 deletions
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); |