aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog9
-rw-r--r--mail/em-migrate.c296
-rw-r--r--mail/message-list.c20
3 files changed, 283 insertions, 42 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index d4b869f5e5..a0f304c295 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,12 @@
+2004-01-21 Jeffrey Stedfast <fejj@ximian.com>
+
+ * em-migrate.c (em_migrate_1_4): Migrate the ETree expanded state
+ files as well as the GalView files.
+
+ * message-list.c: s/hide_save_state/save_hide_state/g and
+ s/hide_load_state/load_hide_state/g to be more consistant with the
+ other state saving function names.
+
2004-01-21 Not Zed <NotZed@Ximian.com>
* em-migrate.c (cp_r): use camel_mkdir(0777) rather than 0777 &
diff --git a/mail/em-migrate.c b/mail/em-migrate.c
index 999708ad54..2961c049a1 100644
--- a/mail/em-migrate.c
+++ b/mail/em-migrate.c
@@ -49,6 +49,8 @@
#include <libxml/parser.h>
#include <libxml/xmlmemory.h>
+#include <gal/util/e-util.h>
+#include <gal/util/e-iconv.h>
#include <gal/util/e-xml-utils.h>
#include "e-util/e-bconf-map.h"
@@ -1245,35 +1247,35 @@ cp (const char *src, const char *dest, gboolean show_progress)
size_t total = 0;
struct stat st;
struct utimbuf ut;
-
+
/* if the dest file exists and has content, abort - we don't
* want to corrupt their existing data */
- if (stat(dest, &st) == 0 && st.st_size > 0) {
- printf("destination exists, not copying '%s' to '%s'\n", src, dest);
+ if (stat (dest, &st) == 0 && st.st_size > 0) {
+ printf ("destination exists, not copying '%s' to '%s'\n", src, dest);
return -1;
}
- if (stat(src, &st) == -1) {
- printf("source doesn't exist '%s'\n", src);
+ if (stat (src, &st) == -1) {
+ printf ("source doesn't exist '%s'\n", src);
return -1;
}
- if ((readfd = open(src, O_RDONLY)) == -1) {
- printf("source cannot be opened '%s'\n", src);
+ if ((readfd = open (src, O_RDONLY)) == -1) {
+ printf ("source cannot be opened '%s'\n", src);
return -1;
}
- if ((writefd = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1) {
- printf("cannot open dest '%s' '%s'\n", dest, strerror(errno));
+ if ((writefd = open (dest, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1) {
+ printf ("cannot open dest '%s' '%s'\n", dest, strerror(errno));
errnosav = errno;
- close(readfd);
+ close (readfd);
errno = errnosav;
return -1;
}
-
+
do {
do {
- nread = read(readfd, readbuf, sizeof(readbuf));
+ nread = read (readfd, readbuf, sizeof (readbuf));
} while (nread == -1 && errno == EINTR);
if (nread == 0)
@@ -1282,7 +1284,7 @@ cp (const char *src, const char *dest, gboolean show_progress)
goto exception;
do {
- nwritten = write(writefd, readbuf, nread);
+ nwritten = write (writefd, readbuf, nread);
} while (nwritten == -1 && errno == EINTR);
if (nwritten < nread)
@@ -1291,36 +1293,34 @@ cp (const char *src, const char *dest, gboolean show_progress)
total += nwritten;
if (show_progress)
- em_migrate_set_progress(((double) total) / ((double) st.st_size));
+ em_migrate_set_progress (((double) total) / ((double) st.st_size));
} while (total < st.st_size);
- if (fsync(writefd) == -1)
+ if (fsync (writefd) == -1)
goto exception;
- close(readfd);
- if (close(writefd) == -1)
- goto failwrite;
-
+ close (readfd);
+ if (close (writefd) == -1)
+ goto failclose;
+
ut.actime = st.st_atime;
ut.modtime = st.st_mtime;
- utime(dest, &ut);
- chmod(dest, st.st_mode);
-
+ utime (dest, &ut);
+ chmod (dest, st.st_mode);
+
return 0;
exception:
errnosav = errno;
-
- close(readfd);
- close(writefd);
-
+ close (readfd);
+ close (writefd);
errno = errnosav;
-failwrite:
- errnosav = errno;
-
- unlink(dest);
+ failclose:
+
+ errnosav = errno;
+ unlink (dest);
errno = errnosav;
return -1;
@@ -1759,7 +1759,7 @@ em_migrate_pop_uid_caches_1_4 (const char *evolution_dir, CamelException *ex)
g_free(cache_dir);
return 0;
}
-
+
camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
_("Failed to migrate pop3 uid caches: %s"),
g_strerror (errno));
@@ -1844,6 +1844,232 @@ em_migrate_imap_caches_1_4 (const char *evolution_dir, CamelException *ex)
}
static int
+em_migrate_folder_expand_state_1_4 (const char *evolution_dir, CamelException *ex)
+{
+ GString *srcpath, *destpath;
+ size_t slen, dlen, rlen;
+ char *evo14_mbox_root;
+ struct dirent *dent;
+ struct stat st;
+ DIR *dir;
+
+ srcpath = g_string_new (g_get_home_dir ());
+ g_string_append (srcpath, "/evolution/config");
+ if (stat (srcpath->str, &st) == -1 || !S_ISDIR (st.st_mode)) {
+ g_string_free (srcpath, TRUE);
+ return 0;
+ }
+
+ destpath = g_string_new (evolution_dir);
+ g_string_append (destpath, "/mail/config");
+ if (camel_mkdir (destpath->str, 0777) == -1 || !(dir = opendir (srcpath->str))) {
+ camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
+ _("Failed to migrate folder expand state: %s"), g_strerror (errno));
+ g_warning ("Failed to migrate folder expand state: %s", g_strerror (errno));
+ g_string_free (destpath, TRUE);
+ g_string_free (srcpath, TRUE);
+ return -1;
+ }
+
+ g_string_append (srcpath, "/et-expanded-");
+ slen = srcpath->len;
+ g_string_append (destpath, "/et-expanded-");
+ dlen = destpath->len;
+
+ evo14_mbox_root = g_build_filename (g_get_home_dir (), "evolution", "local", NULL);
+ e_filename_make_safe (evo14_mbox_root);
+ rlen = strlen (evo14_mbox_root);
+ evo14_mbox_root = g_realloc (evo14_mbox_root, rlen + 2);
+ evo14_mbox_root[rlen++] = '_';
+ evo14_mbox_root[rlen] = '\0';
+
+ while ((dent = readdir (dir))) {
+ char *full_name, *inptr, *buf = NULL;
+ const char *filename;
+ GString *new;
+
+ if (strncmp (dent->d_name, "et-expanded-", 12) != 0)
+ continue;
+
+ if (!strncmp (dent->d_name + 12, "file:", 5)) {
+ /* need to munge the filename */
+ inptr = dent->d_name + 17;
+
+ if (!strncmp (inptr, evo14_mbox_root, rlen)) {
+ /* this should always be the case afaik... */
+ inptr += rlen;
+ new = g_string_new ("mbox:");
+ g_string_append_printf (new, "%s/mail/local#", evolution_dir);
+
+ full_name = g_strdup (inptr);
+ inptr = full_name + strlen (full_name) - 12;
+ while (inptr > full_name) {
+ if (!strncmp (inptr, "_subfolders_", 12))
+ memmove (inptr, inptr + 11, strlen (inptr + 11) + 1);
+
+ inptr--;
+ }
+
+ g_string_append (new, full_name);
+ g_free (full_name);
+
+ filename = buf = new->str;
+ g_string_free (new, FALSE);
+ e_filename_make_safe (buf);
+ } else {
+ /* but just in case... */
+ filename = dent->d_name + 12;
+ }
+ } else {
+ /* no munging needed */
+ filename = dent->d_name + 12;
+ }
+
+ g_string_append (srcpath, dent->d_name + 12);
+ g_string_append (destpath, filename);
+ g_free (buf);
+
+ cp (srcpath->str, destpath->str, FALSE);
+
+ g_string_truncate (srcpath, slen);
+ g_string_truncate (destpath, dlen);
+ }
+
+ closedir (dir);
+
+ g_free (evo14_mbox_root);
+ g_string_free (destpath, TRUE);
+ g_string_free (srcpath, TRUE);
+
+ return 0;
+}
+
+static int
+em_migrate_folder_view_settings_1_4 (const char *evolution_dir, CamelException *ex)
+{
+ GString *srcpath, *destpath;
+ size_t slen, dlen, rlen;
+ char *evo14_mbox_root;
+ struct dirent *dent;
+ struct stat st;
+ DIR *dir;
+
+ srcpath = g_string_new (g_get_home_dir ());
+ g_string_append (srcpath, "/evolution/views/mail");
+ if (stat (srcpath->str, &st) == -1 || !S_ISDIR (st.st_mode)) {
+ g_string_free (srcpath, TRUE);
+ return 0;
+ }
+
+ destpath = g_string_new (evolution_dir);
+ g_string_append (destpath, "/mail/views");
+ if (camel_mkdir (destpath->str, 0777) == -1 || !(dir = opendir (srcpath->str))) {
+ camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
+ _("Failed to migrate folder expand state: %s"), g_strerror (errno));
+ g_warning ("Failed to migrate folder expand state: %s", g_strerror (errno));
+ g_string_free (destpath, TRUE);
+ g_string_free (srcpath, TRUE);
+ return -1;
+ }
+
+ g_string_append_c (srcpath, '/');
+ slen = srcpath->len;
+ g_string_append_c (destpath, '/');
+ dlen = destpath->len;
+
+ evo14_mbox_root = g_build_filename (g_get_home_dir (), "evolution", "local", NULL);
+ e_filename_make_safe (evo14_mbox_root);
+ rlen = strlen (evo14_mbox_root);
+ evo14_mbox_root = g_realloc (evo14_mbox_root, rlen + 2);
+ evo14_mbox_root[rlen++] = '_';
+ evo14_mbox_root[rlen] = '\0';
+
+ while ((dent = readdir (dir))) {
+ char *full_name, *inptr, *buf = NULL;
+ const char *filename, *ext;
+ size_t prelen = 0;
+ GString *new;
+
+ if (dent->d_name[0] == '.')
+ continue;
+
+ if (!(ext = strrchr (dent->d_name, '.')))
+ continue;
+
+ if (!strcmp (ext, ".galview") || !strcmp (dent->d_name, "galview.xml")) {
+ /* just copy the file */
+ filename = dent->d_name;
+ goto copy;
+ } else if (strcmp (ext, ".xml") != 0) {
+ continue;
+ }
+
+ if (!strncmp (dent->d_name, "current_view-", 13)) {
+ prelen = 13;
+ } else if (!strncmp (dent->d_name, "custom_view-", 12)) {
+ prelen = 12;
+ } else {
+ /* huh? wtf is this file? */
+ continue;
+ }
+
+ if (!strncmp (dent->d_name + prelen, "file:", 5)) {
+ /* need to munge the filename */
+ inptr = dent->d_name + prelen + 5;
+
+ if (!strncmp (inptr, evo14_mbox_root, rlen)) {
+ /* this should always be the case afaik... */
+ inptr += rlen;
+ new = g_string_new ("mbox:");
+ g_string_append_printf (new, "%s/mail/local#", evolution_dir);
+
+ full_name = g_strdup (inptr);
+ inptr = full_name + strlen (full_name) - 12;
+ while (inptr > full_name) {
+ if (!strncmp (inptr, "_subfolders_", 12))
+ memmove (inptr, inptr + 11, strlen (inptr + 11) + 1);
+
+ inptr--;
+ }
+
+ g_string_append (new, full_name);
+ g_free (full_name);
+
+ filename = buf = new->str;
+ g_string_free (new, FALSE);
+ e_filename_make_safe (buf);
+ } else {
+ /* but just in case... */
+ filename = dent->d_name + prelen;
+ }
+ } else {
+ /* no munging needed */
+ filename = dent->d_name + prelen;
+ }
+
+ copy:
+ g_string_append (srcpath, dent->d_name);
+ if (prelen > 0)
+ g_string_append_len (destpath, dent->d_name, prelen);
+ g_string_append (destpath, filename);
+ g_free (buf);
+
+ cp (srcpath->str, destpath->str, FALSE);
+
+ g_string_truncate (srcpath, slen);
+ g_string_truncate (destpath, dlen);
+ }
+
+ closedir (dir);
+
+ g_free (evo14_mbox_root);
+ g_string_free (destpath, TRUE);
+ g_string_free (srcpath, TRUE);
+
+ return 0;
+}
+
+static int
em_migrate_1_4 (const char *evolution_dir, xmlDocPtr filters, xmlDocPtr vfolders, CamelException *ex)
{
EMMigrateSession *session;
@@ -1914,6 +2140,12 @@ em_migrate_1_4 (const char *evolution_dir, xmlDocPtr filters, xmlDocPtr vfolders
if (em_migrate_imap_caches_1_4 (evolution_dir, ex) == -1)
return -1;
+ if (em_migrate_folder_expand_state_1_4 (evolution_dir, ex) == -1)
+ return -1;
+
+ if (em_migrate_folder_view_settings_1_4 (evolution_dir, ex) == -1)
+ return -1;
+
return 0;
}
@@ -1960,7 +2192,7 @@ emm_setup_initial(const char *evolution_dir)
/* special-case - this means brand new install of evolution */
/* FIXME: create default folders and stuff... */
- base = e_iconv_locale_language();
+ base = (char *) e_iconv_locale_language ();
if (base) {
lang = g_alloca(strlen(base)+1);
strcpy(lang, base);
diff --git a/mail/message-list.c b/mail/message-list.c
index c239f21cc5..745b637fd8 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -148,8 +148,8 @@ static char *filter_size (int size);
static void folder_changed (CamelObject *o, gpointer event_data, gpointer user_data);
static void message_changed (CamelObject *o, gpointer event_data, gpointer user_data);
-static void hide_save_state(MessageList *ml);
-static void hide_load_state(MessageList *ml);
+static void save_hide_state(MessageList *ml);
+static void load_hide_state(MessageList *ml);
/* note: @changes is owned/freed by the caller */
/*static void mail_do_regenerate_messagelist (MessageList *list, const char *search, const char *hideexpr, CamelFolderChangeInfo *changes);*/
@@ -1365,10 +1365,10 @@ static void
save_tree_state(MessageList *ml)
{
char *filename;
-
+
if (ml->folder == NULL || ml->tree == NULL)
return;
-
+
filename = mail_config_folder_to_cachename(ml->folder, "et-expanded-");
e_tree_save_expanded_state(ml->tree, filename);
g_free(filename);
@@ -1392,7 +1392,7 @@ void
message_list_save_state (MessageList *ml)
{
save_tree_state (ml);
- hide_save_state (ml);
+ save_hide_state (ml);
}
static void
@@ -1627,7 +1627,7 @@ message_list_destroy(GtkObject *object)
}
save_tree_state(message_list);
- hide_save_state(message_list);
+ save_hide_state(message_list);
camel_object_unhook_event(message_list->folder, "folder_changed", folder_changed, message_list);
camel_object_unhook_event(message_list->folder, "message_changed", message_changed, message_list);
camel_object_unref (message_list->folder);
@@ -2547,7 +2547,7 @@ message_list_set_folder (MessageList *message_list, CamelFolder *folder, const c
clear_tree (message_list);
if (message_list->folder) {
- hide_save_state(message_list);
+ save_hide_state(message_list);
camel_object_unhook_event((CamelObject *)message_list->folder, "folder_changed",
folder_changed, message_list);
camel_object_unhook_event((CamelObject *)message_list->folder, "message_changed",
@@ -2608,7 +2608,7 @@ message_list_set_folder (MessageList *message_list, CamelFolder *folder, const c
message_list->hidedeleted = hide_deleted && !(folder->folder_flags & CAMEL_FOLDER_IS_TRASH);
message_list->hidejunk = junk_folder && !(folder->folder_flags & CAMEL_FOLDER_IS_JUNK) && !(folder->folder_flags & CAMEL_FOLDER_IS_TRASH);
- hide_load_state (message_list);
+ load_hide_state (message_list);
mail_regen_list (message_list, message_list->search, NULL, NULL);
}
}
@@ -2985,7 +2985,7 @@ message_list_hide_clear (MessageList *ml)
*/
static void
-hide_load_state (MessageList *ml)
+load_hide_state (MessageList *ml)
{
char *filename;
FILE *in;
@@ -3038,7 +3038,7 @@ hide_save_1 (char *uid, char *keydata, FILE *out)
/* save the hide state. Note that messages are hidden by uid, if the uid's change, then
this will become invalid, but is easy to reset in the ui */
static void
-hide_save_state (MessageList *ml)
+save_hide_state (MessageList *ml)
{
char *filename;
FILE *out;