diff options
-rw-r--r-- | camel/ChangeLog | 13 | ||||
-rw-r--r-- | camel/camel-folder.c | 2 | ||||
-rw-r--r-- | camel/camel-mime-utils.c | 4 | ||||
-rw-r--r-- | camel/camel-vee-store.c | 7 | ||||
-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 |
9 files changed, 133 insertions, 11 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index cc37be2f76..fbc70f6db2 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,5 +1,18 @@ 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. + * camel-vee-store.c (build_info): Fix the 'is this a matching subfolder or subfolder'' logic to match camel-store get_subfolders'. diff --git a/camel/camel-folder.c b/camel/camel-folder.c index 405107e2a8..fd1fc13736 100644 --- a/camel/camel-folder.c +++ b/camel/camel-folder.c @@ -1349,7 +1349,7 @@ folder_rename (CamelFolder *folder, const char *new) g_free(folder->full_name); folder->full_name = g_strdup(new); g_free(folder->name); - tmp = strrchr(new, '/'); + tmp = strrchr(new, folder->parent_store->dir_sep); folder->name = g_strdup(tmp?tmp+1:new); } diff --git a/camel/camel-mime-utils.c b/camel/camel-mime-utils.c index 3b2d0f94f3..405939183d 100644 --- a/camel/camel-mime-utils.c +++ b/camel/camel-mime-utils.c @@ -72,7 +72,7 @@ int free_count = 0; #endif /* for all warnings ... */ -#define w(x) x +#define w(x) #define d(x) #define d2(x) @@ -2959,7 +2959,7 @@ header_param_list_format_append (GString *out, struct _header_param *p) value = header_encode_param (p->value, &encoded); if (!value) { - g_warning ("appending parameter %s=%s violates rfc2184", p->name, p->value); + w(g_warning ("appending parameter %s=%s violates rfc2184", p->name, p->value)); value = g_strdup (p->value); } diff --git a/camel/camel-vee-store.c b/camel/camel-vee-store.c index e909671e36..6fe9e31339 100644 --- a/camel/camel-vee-store.c +++ b/camel/camel-vee-store.c @@ -167,14 +167,13 @@ static void build_info(char *name, CamelVeeFolder *folder, struct _build_info *data) { CamelFolderInfo *info; - int toplen, namelen; - - namelen = strlen(name); - toplen = strlen(data->top); /* check we have to include this one */ if (data->top) { if (data->flags & CAMEL_STORE_FOLDER_INFO_RECURSIVE) { + int namelen = strlen(name); + int toplen = strlen(data->top); + if (!((namelen == toplen && strcmp(name, data->top) == 0) || ((namelen > toplen) 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 |