Turn off w() -> warnings.
author9 <NotZed@Ximian.com>
Mon, 29 Oct 2001 08:24:00 +0000 (08:24 +0000)
committerMichael Zucci <zucchi@src.gnome.org>
Mon, 29 Oct 2001 08:24:00 +0000 (08:24 +0000)
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/ChangeLog
camel/camel-folder.c
camel/camel-mime-utils.c
camel/camel-vee-store.c
camel/providers/imap/camel-imap-folder.c
camel/providers/imap/camel-imap-message-cache.c
camel/providers/imap/camel-imap-message-cache.h
camel/providers/imap/camel-imap-store.c
camel/providers/imap/camel-imap-store.h

index cc37be2..fbc70f6 100644 (file)
@@ -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'.
index 405107e..fd1fc13 100644 (file)
@@ -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);
 }
 
index 3b2d0f9..4059391 100644 (file)
@@ -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);
                }
                
index e909671..6fe9e31 100644 (file)
@@ -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)
index e1bd4bc..adc4351 100644 (file)
@@ -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);
index ab5d125..e5cddf9 100644 (file)
@@ -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)
 {
index efdc832..eb3f056 100644 (file)
@@ -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,
index aa7fc5f..f429ef6 100644 (file)
@@ -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++;
index 66ebe13..25c4163 100644 (file)
@@ -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