aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-tools.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/mail-tools.c')
-rw-r--r--mail/mail-tools.c95
1 files changed, 43 insertions, 52 deletions
diff --git a/mail/mail-tools.c b/mail/mail-tools.c
index c5592625eb..7a86ab49f1 100644
--- a/mail/mail-tools.c
+++ b/mail/mail-tools.c
@@ -252,25 +252,26 @@ mail_tool_move_folder_contents (CamelFolder *source, CamelFolder *dest, gboolean
CamelUIDCache *cache;
GPtrArray *uids;
int i;
-
+ gboolean summary_capability;
+
mail_tool_camel_lock_up();
-
+
camel_object_ref (CAMEL_OBJECT (source));
camel_object_ref (CAMEL_OBJECT (dest));
-
+
/* Get all uids of source */
-
+
mail_op_set_message ("Examining %s", source->full_name);
-
+
uids = camel_folder_get_uids (source);
printf ("mail_tool_move_folder: got %d messages in source\n", uids->len);
-
+
/* If we're using the cache, ... use it */
-
+
if (use_cache) {
GPtrArray *new_uids;
char *url, *p, *filename;
-
+
url = camel_url_to_string (
CAMEL_SERVICE (source->parent_store)->url, FALSE);
for (p = url; *p; p++) {
@@ -281,9 +282,9 @@ mail_tool_move_folder_contents (CamelFolder *source, CamelFolder *dest, gboolean
filename = g_strdup_printf ("%s/config/cache-%s",
evolution_dir, url);
g_free (url);
-
+
cache = camel_uid_cache_new (filename);
-
+
if (cache) {
new_uids = camel_uid_cache_get_new_uids (cache, uids);
camel_folder_free_uids (source, uids);
@@ -295,26 +296,26 @@ mail_tool_move_folder_contents (CamelFolder *source, CamelFolder *dest, gboolean
"receive duplicate "
"messages."), filename);
}
-
+
g_free (filename);
} else
cache = NULL;
-
+
printf ("mail_tool_move_folder: %d of those messages are new\n", uids->len);
-
+
+ summary_capability = camel_folder_has_summary_capability (source);
+
/* Copy the messages */
-
for (i = 0; i < uids->len; i++) {
CamelMimeMessage *msg;
- CamelMessageInfo *info;
- gboolean no_info = FALSE;
-
+ const CamelMessageInfo *info = NULL;
+
/* Info */
-
+
mail_op_set_message ("Retrieving message %d of %d", i + 1, uids->len);
-
+
/* Get the message */
-
+
msg = camel_folder_get_message (source, uids->pdata[i], ex);
if (camel_exception_is_set (ex)) {
camel_object_unref (CAMEL_OBJECT (msg));
@@ -322,36 +323,26 @@ mail_tool_move_folder_contents (CamelFolder *source, CamelFolder *dest, gboolean
}
/* Append it to dest */
-
+
mail_op_set_message ("Writing message %d of %d", i + 1, uids->len);
-
- info = (CamelMessageInfo *) camel_folder_get_message_info (source, uids->pdata[i]);
- if (!info) {
- /* FIXME: should we even bother to call get_message_info? */
- no_info = TRUE;
- info = g_new0 (CamelMessageInfo, 1);
- info->flags = 0;
- }
-
+
+ if (summary_capability)
+ info = camel_folder_get_message_info (source, uids->pdata[i]);
camel_folder_append_message (dest, msg, info, ex);
-
- if (no_info)
- g_free (info);
-
if (camel_exception_is_set (ex)) {
camel_object_unref (CAMEL_OBJECT (msg));
goto cleanup;
}
-
+
/* (Maybe) get rid of the message */
-
+
camel_object_unref (CAMEL_OBJECT (msg));
if (!use_cache)
camel_folder_delete_message (source, uids->pdata[i]);
}
-
+
/* All done. Sync n' free. */
-
+
if (cache) {
camel_uid_cache_free_uids (uids);
@@ -360,11 +351,11 @@ mail_tool_move_folder_contents (CamelFolder *source, CamelFolder *dest, gboolean
camel_uid_cache_destroy (cache);
} else
camel_folder_free_uids (source, uids);
-
+
mail_op_set_message ("Saving changes to %s", source->full_name);
-
+
camel_folder_sync (source, TRUE, ex);
-
+
cleanup:
camel_object_unref (CAMEL_OBJECT (source));
camel_object_unref (CAMEL_OBJECT (dest));
@@ -461,42 +452,42 @@ mail_tool_fetch_mail_into_searchable (const char *source_url, gboolean keep_on_s
{
CamelFolder *search_folder = NULL;
CamelFolder *spool_folder = NULL;
-
+
/* If fetching mail from an mbox store, safely copy it to a
* temporary store first.
*/
-
+
if (!strncmp (source_url, "mbox:", 5))
spool_folder = mail_tool_do_movemail (source_url, ex);
else
spool_folder = mail_tool_get_inbox (source_url, ex);
-
+
/* No new mail */
if (spool_folder == NULL)
return NULL;
-
+
if (camel_exception_is_set (ex))
goto cleanup;
-
+
/* can we perform filtering on this source? */
-
+
if (!(spool_folder->has_summary_capability
&& spool_folder->has_search_capability)) {
-
+
/* no :-(. Copy the messages to a local tempbox
* so that the folder browser can search it. */
gchar *url;
-
+
url = mail_tool_get_local_movemail_url();
search_folder = mail_tool_get_folder_from_urlname (url, "movemail", TRUE, ex);
g_free (url);
if (camel_exception_is_set (ex))
goto cleanup;
-
+
mail_tool_move_folder_contents (spool_folder, search_folder, keep_on_server, ex);
if (camel_exception_is_set (ex))
goto cleanup;
-
+
} else {
/* we can search! don't bother movemailing */
search_folder = spool_folder;
@@ -504,7 +495,7 @@ mail_tool_fetch_mail_into_searchable (const char *source_url, gboolean keep_on_s
camel_object_ref (CAMEL_OBJECT (search_folder));
mail_tool_camel_lock_down();
}
-
+
cleanup:
mail_tool_camel_lock_up();
camel_object_unref (CAMEL_OBJECT (spool_folder));