aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libemail-engine/e-mail-folder-utils.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/libemail-engine/e-mail-folder-utils.c b/libemail-engine/e-mail-folder-utils.c
index 25754f4f96..7819cb533a 100644
--- a/libemail-engine/e-mail-folder-utils.c
+++ b/libemail-engine/e-mail-folder-utils.c
@@ -1164,8 +1164,8 @@ e_mail_folder_save_messages_sync (CamelFolder *folder,
GError **error)
{
GFileOutputStream *file_output_stream;
+ CamelStream *base_stream = NULL;
GByteArray *byte_array;
- CamelStream *base_stream;
gboolean success = TRUE;
guint ii;
@@ -1194,9 +1194,7 @@ e_mail_folder_save_messages_sync (CamelFolder *folder,
return FALSE;
}
- /* CamelStreamMem takes ownership of the GByteArray. */
byte_array = g_byte_array_new ();
- base_stream = camel_stream_mem_new_with_byte_array (byte_array);
for (ii = 0; ii < message_uids->len; ii++) {
CamelMimeMessage *message;
@@ -1207,6 +1205,17 @@ e_mail_folder_save_messages_sync (CamelFolder *folder,
gint percent;
gint retval;
+ if (base_stream != NULL)
+ g_object_unref (base_stream);
+
+ /* CamelStreamMem does NOT take ownership of the byte
+ * array when set with camel_stream_mem_set_byte_array().
+ * This allows us to reuse the same memory slab for each
+ * message, which is slightly more efficient. */
+ base_stream = camel_stream_mem_new ();
+ camel_stream_mem_set_byte_array (
+ CAMEL_STREAM_MEM (base_stream), byte_array);
+
uid = g_ptr_array_index (message_uids, ii);
message = camel_folder_get_message_sync (
@@ -1264,18 +1273,19 @@ e_mail_folder_save_messages_sync (CamelFolder *folder,
percent = ((ii + 1) * 100) / message_uids->len;
camel_operation_progress (cancellable, percent);
- /* Flush the buffer for the next message.
- * For memory streams this never fails. */
- g_seekable_seek (
- G_SEEKABLE (base_stream),
- 0, G_SEEK_SET, NULL, NULL);
+ /* Reset the byte array for the next message. */
+ g_byte_array_set_size (byte_array, 0);
g_object_unref (message);
}
exit:
+ if (base_stream != NULL)
+ g_object_unref (base_stream);
+
+ g_byte_array_free (byte_array, TRUE);
+
g_object_unref (file_output_stream);
- g_object_unref (base_stream);
camel_operation_pop_message (cancellable);