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'.
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);
}
#endif
/* for all warnings ... */
-#define w(x) x
+#define w(x)
#define d(x)
#define d2(x)
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);
}
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)
#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"
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,
/* 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;
}
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);
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)
{
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,
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,
}
}
+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;
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 *
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++;
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++;
guint32 capabilities, parameters;
char *namespace, dir_sep, *base_url, *storage_path;
GHashTable *authtypes, *subscribed_folders;
+
#ifdef ENABLE_THREADS
EThread *async_thread;
#endif