aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers
diff options
context:
space:
mode:
author9 <NotZed@Ximian.com>2001-10-29 16:24:00 +0800
committerMichael Zucci <zucchi@src.gnome.org>2001-10-29 16:24:00 +0800
commitc43aa966cbac71c6e5dbceb55bb172dcc3687bbf (patch)
tree12a9b86802e1a65afc9049e6d5d81e114b26182e /camel/providers
parentfa9505a288ebeab16883eb940bd1418f176fc426 (diff)
downloadgsoc2013-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.c26
-rw-r--r--camel/providers/imap/camel-imap-message-cache.c14
-rw-r--r--camel/providers/imap/camel-imap-message-cache.h3
-rw-r--r--camel/providers/imap/camel-imap-store.c74
-rw-r--r--camel/providers/imap/camel-imap-store.h1
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