diff options
author | 9 <NotZed@Ximian.com> | 2001-10-29 16:24:00 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2001-10-29 16:24:00 +0800 |
commit | c43aa966cbac71c6e5dbceb55bb172dcc3687bbf (patch) | |
tree | 12a9b86802e1a65afc9049e6d5d81e114b26182e /camel/providers | |
parent | fa9505a288ebeab16883eb940bd1418f176fc426 (diff) | |
download | gsoc2013-evolution-c43aa966cbac71c6e5dbceb55bb172dcc3687bbf.tar gsoc2013-evolution-c43aa966cbac71c6e5dbceb55bb172dcc3687bbf.tar.gz gsoc2013-evolution-c43aa966cbac71c6e5dbceb55bb172dcc3687bbf.tar.bz2 gsoc2013-evolution-c43aa966cbac71c6e5dbceb55bb172dcc3687bbf.tar.lz gsoc2013-evolution-c43aa966cbac71c6e5dbceb55bb172dcc3687bbf.tar.xz gsoc2013-evolution-c43aa966cbac71c6e5dbceb55bb172dcc3687bbf.tar.zst gsoc2013-evolution-c43aa966cbac71c6e5dbceb55bb172dcc3687bbf.zip |
Turn off w() -> warnings.
2001-10-29 <NotZed@Ximian.com>
* camel-mime-utils.c: Turn off w() -> warnings.
* providers/imap/camel-imap-store.c (rename_folder): Also rename
the message cache.
(rename_folder): Fix subscribed folders table with rename(s).
* providers/imap/camel-imap-folder.c (imap_rename): Implement,
rename the cache dir pointer.
* providers/imap/camel-imap-message-cache.c
(camel_imap_message_cache_set_path): New method to set the path
used by a message cache.
svn path=/trunk/; revision=14327
Diffstat (limited to 'camel/providers')
-rw-r--r-- | camel/providers/imap/camel-imap-folder.c | 26 | ||||
-rw-r--r-- | camel/providers/imap/camel-imap-message-cache.c | 14 | ||||
-rw-r--r-- | camel/providers/imap/camel-imap-message-cache.h | 3 | ||||
-rw-r--r-- | camel/providers/imap/camel-imap-store.c | 74 | ||||
-rw-r--r-- | camel/providers/imap/camel-imap-store.h | 1 |
5 files changed, 114 insertions, 4 deletions
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c index e1bd4bc101..adc43514a0 100644 --- a/camel/providers/imap/camel-imap-folder.c +++ b/camel/providers/imap/camel-imap-folder.c @@ -37,6 +37,8 @@ #include <fcntl.h> #include <ctype.h> +#include "e-util/e-path.h" + #include "camel-imap-folder.h" #include "camel-imap-command.h" #include "camel-imap-message-cache.h" @@ -74,6 +76,7 @@ static void imap_expunge_uids_online (CamelFolder *folder, GPtrArray *uids, Came static void imap_expunge_uids_offline (CamelFolder *folder, GPtrArray *uids, CamelException *ex); static void imap_expunge_uids_resyncing (CamelFolder *folder, GPtrArray *uids, CamelException *ex); static void imap_cache_message (CamelDiscoFolder *disco_folder, const char *uid, CamelException *ex); +static void imap_rename (CamelFolder *folder, const char *new); /* message manipulation */ static CamelMimeMessage *imap_get_message (CamelFolder *folder, const gchar *uid, @@ -114,6 +117,7 @@ camel_imap_folder_class_init (CamelImapFolderClass *camel_imap_folder_class) /* virtual method overload */ camel_folder_class->get_message = imap_get_message; camel_folder_class->move_messages_to = imap_move_messages_to; + camel_folder_class->rename = imap_rename; camel_folder_class->search_by_expression = imap_search_by_expression; camel_folder_class->search_by_uids = imap_search_by_uids; camel_folder_class->search_free = imap_search_free; @@ -368,6 +372,28 @@ imap_finalize (CamelObject *object) } static void +imap_rename(CamelFolder *folder, const char *new) +{ + CamelImapFolder *imap_folder = (CamelImapFolder *)folder; + CamelImapStore *imap_store = (CamelImapStore *)folder->parent_store; + char *folder_dir, *summary_path; + + folder_dir = e_path_to_physical (imap_store->storage_path, new); + summary_path = g_strdup_printf("%s/summary", folder_dir); + + CAMEL_IMAP_FOLDER_LOCK (folder, cache_lock); + camel_imap_message_cache_set_path(imap_folder->cache, folder_dir); + CAMEL_IMAP_FOLDER_UNLOCK (folder, cache_lock); + + camel_folder_summary_set_filename(folder->summary, summary_path); + + g_free(summary_path); + g_free(folder_dir); + + ((CamelFolderClass *)disco_folder_class)->rename(folder, new); +} + +static void imap_refresh_info (CamelFolder *folder, CamelException *ex) { CamelImapStore *imap_store = CAMEL_IMAP_STORE (folder->parent_store); diff --git a/camel/providers/imap/camel-imap-message-cache.c b/camel/providers/imap/camel-imap-message-cache.c index ab5d125d6e..e5cddf9bae 100644 --- a/camel/providers/imap/camel-imap-message-cache.c +++ b/camel/providers/imap/camel-imap-message-cache.c @@ -209,6 +209,20 @@ camel_imap_message_cache_max_uid (CamelImapMessageCache *cache) return cache->max_uid; } +/** + * camel_imap_message_cache_set_path: + * @cache: + * @path: + * + * Set the path used for the message cache. + **/ +void +camel_imap_message_cache_set_path (CamelImapMessageCache *cache, const char *path) +{ + g_free(cache->path); + cache->path = g_strdup(path); +} + static void stream_finalize (CamelObject *stream, gpointer event_data, gpointer user_data) { diff --git a/camel/providers/imap/camel-imap-message-cache.h b/camel/providers/imap/camel-imap-message-cache.h index efdc832694..eb3f056b44 100644 --- a/camel/providers/imap/camel-imap-message-cache.h +++ b/camel/providers/imap/camel-imap-message-cache.h @@ -63,6 +63,9 @@ CamelImapMessageCache *camel_imap_message_cache_new (const char *path, CamelFolderSummary *summ, CamelException *ex); +void camel_imap_message_cache_set_path (CamelImapMessageCache *cache, + const char *path); + guint32 camel_imap_message_cache_max_uid (CamelImapMessageCache *cache); CamelStream *camel_imap_message_cache_insert (CamelImapMessageCache *cache, diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c index aa7fc5fb17..f429ef6a76 100644 --- a/camel/providers/imap/camel-imap-store.c +++ b/camel/providers/imap/camel-imap-store.c @@ -79,8 +79,7 @@ static CamelFolder *get_folder_online (CamelStore *store, const char *folder_nam static CamelFolder *get_folder_offline (CamelStore *store, const char *folder_name, guint32 flags, CamelException *ex); static CamelFolderInfo *create_folder (CamelStore *store, const char *parent_name, const char *folder_name, CamelException *ex); static void delete_folder (CamelStore *store, const char *folder_name, CamelException *ex); -static void rename_folder (CamelStore *store, const char *old_name, - const char *new_name, CamelException *ex); +static void rename_folder (CamelStore *store, const char *old_name, const char *new_name, CamelException *ex); static CamelFolderInfo *get_folder_info_online (CamelStore *store, const char *top, guint32 flags, @@ -1103,11 +1102,41 @@ delete_folder (CamelStore *store, const char *folder_name, CamelException *ex) } } +struct _fix_subscribe { + char dir_sep; + + const char *old_name; + const char *new_name; + + GPtrArray *old; + GPtrArray *new; +}; + +/* Fixes subscribed names to take into account a rename */ +static void +fix_subscribed(char *key, void *val, struct _fix_subscribe *data) +{ + int oldlen, namelen; + + namelen = strlen(key); + oldlen = strlen(data->old_name); + + if ((namelen == oldlen && + strcmp(data->old_name, key) == 0) + || ((namelen > oldlen) + && strncmp(data->old_name, key, oldlen) == 0 + && key[oldlen] == data->dir_sep)) { + g_ptr_array_add(data->old, key); + g_ptr_array_add(data->new, g_strdup_printf("%s%s", data->new_name, key+oldlen)); + } +} + static void rename_folder (CamelStore *store, const char *old_name, const char *new_name, CamelException *ex) { CamelImapStore *imap_store = CAMEL_IMAP_STORE (store); CamelImapResponse *response; + char *oldpath, *newpath; if (!camel_disco_store_check_online (CAMEL_DISCO_STORE (store), ex)) return; @@ -1130,6 +1159,43 @@ rename_folder (CamelStore *store, const char *old_name, const char *new_name, Ca if (response) camel_imap_response_free (imap_store, response); + + if (camel_exception_is_set(ex)) + return; + + /* Fix up the subscriptions table */ + if (store->flags & CAMEL_STORE_SUBSCRIPTIONS) { + struct _fix_subscribe data; + int i; + + data.dir_sep = imap_store->dir_sep; + data.old_name = old_name; + data.new_name = new_name; + data.old = g_ptr_array_new(); + data.new = g_ptr_array_new(); + g_hash_table_foreach(imap_store->subscribed_folders, (GHFunc)fix_subscribed, &data); + + for (i=0;i<data.old->len;i++) { + printf("moving subscribed folder from '%s' to '%s'\n", (char *)data.old->pdata[i], (char *)data.new->pdata[i]); + g_hash_table_remove(imap_store->subscribed_folders, data.old->pdata[i]); + g_free(data.old->pdata[i]); + g_hash_table_insert(imap_store->subscribed_folders, data.new->pdata[i], (void *)1); + } + + g_ptr_array_free(data.old, TRUE); + g_ptr_array_free(data.new, TRUE); + } + + oldpath = e_path_to_physical (imap_store->storage_path, old_name); + newpath = e_path_to_physical (imap_store->storage_path, new_name); + + /* So do we care if this didn't work? Its just a cache? */ + if (rename(oldpath, newpath) == -1) { + g_warning("Could not rename message cache '%s' to '%s': %s: cache reset", oldpath, newpath, strerror(errno)); + } + + g_free(oldpath); + g_free(newpath); } static CamelFolderInfo * @@ -1646,7 +1712,7 @@ subscribe_folder (CamelStore *store, const char *folder_name, g_hash_table_insert (imap_store->subscribed_folders, g_strdup (folder_name), GUINT_TO_POINTER (1)); - + name = strrchr (folder_name, imap_store->dir_sep); if (name) name++; @@ -1695,7 +1761,7 @@ unsubscribe_folder (CamelStore *store, const char *folder_name, folder_name, &key, &value); g_hash_table_remove (imap_store->subscribed_folders, folder_name); g_free (key); - + name = strrchr (folder_name, imap_store->dir_sep); if (name) name++; diff --git a/camel/providers/imap/camel-imap-store.h b/camel/providers/imap/camel-imap-store.h index 66ebe13f1d..25c416385e 100644 --- a/camel/providers/imap/camel-imap-store.h +++ b/camel/providers/imap/camel-imap-store.h @@ -91,6 +91,7 @@ struct _CamelImapStore { guint32 capabilities, parameters; char *namespace, dir_sep, *base_url, *storage_path; GHashTable *authtypes, *subscribed_folders; + #ifdef ENABLE_THREADS EThread *async_thread; #endif |