dovecot-2.2: lib-storage: Moved more of dbox attachments code to...

dovecot at dovecot.org dovecot at dovecot.org
Wed Nov 6 23:01:14 EET 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/0ed18f77ff08
changeset: 16946:0ed18f77ff08
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Nov 06 23:00:58 2013 +0200
description:
lib-storage: Moved more of dbox attachments code to generic code.

diffstat:

 src/lib-storage/index/dbox-common/dbox-attachment.c |  163 +-------------------
 src/lib-storage/index/dbox-common/dbox-attachment.h |    4 -
 src/lib-storage/index/dbox-multi/mdbox-purge.c      |    8 +-
 src/lib-storage/index/dbox-single/sdbox-copy.c      |    2 +-
 src/lib-storage/index/dbox-single/sdbox-file.c      |    2 +-
 src/lib-storage/index/dbox-single/sdbox-sync.c      |    3 +-
 src/lib-storage/index/index-attachment.c            |  158 +++++++++++++++++++-
 src/lib-storage/index/index-attachment.h            |   12 +
 8 files changed, 185 insertions(+), 167 deletions(-)

diffs (truncated from 482 to 300 lines):

diff -r 883ba4a47829 -r 0ed18f77ff08 src/lib-storage/index/dbox-common/dbox-attachment.c
--- a/src/lib-storage/index/dbox-common/dbox-attachment.c	Wed Nov 06 21:10:22 2013 +0200
+++ b/src/lib-storage/index/dbox-common/dbox-attachment.c	Wed Nov 06 23:00:58 2013 +0200
@@ -3,155 +3,32 @@
 #include "lib.h"
 #include "istream.h"
 #include "str.h"
-#include "fs-api.h"
-#include "istream-fs-file.h"
-#include "istream-attachment-connector.h"
 #include "dbox-file.h"
 #include "dbox-save.h"
 #include "dbox-attachment.h"
 
-enum dbox_attachment_decode_option {
-	DBOX_ATTACHMENT_DECODE_OPTION_NONE = '-',
-	DBOX_ATTACHMENT_DECODE_OPTION_BASE64 = 'B',
-	DBOX_ATTACHMENT_DECODE_OPTION_CRLF = 'C'
-};
-
 void dbox_attachment_save_write_metadata(struct mail_save_context *ctx,
 					 string_t *str)
 {
 	const ARRAY_TYPE(mail_attachment_extref) *extrefs;
-	const struct mail_attachment_extref *extref;
-	bool add_space = FALSE;
-	unsigned int startpos;
 
 	extrefs = index_attachment_save_get_extrefs(ctx);
 	if (extrefs == NULL || array_count(extrefs) == 0)
 		return;
 
 	str_append_c(str, DBOX_METADATA_EXT_REF);
-	array_foreach(extrefs, extref) {
-		if (!add_space)
-			add_space = TRUE;
-		else
-			str_append_c(str, ' ');
-		str_printfa(str, "%"PRIuUOFF_T" %"PRIuUOFF_T" ",
-			    extref->start_offset, extref->size);
-
-		startpos = str_len(str);
-		if (extref->base64_have_crlf)
-			str_append_c(str, DBOX_ATTACHMENT_DECODE_OPTION_CRLF);
-		if (extref->base64_blocks_per_line > 0) {
-			str_printfa(str, "%c%u",
-				    DBOX_ATTACHMENT_DECODE_OPTION_BASE64,
-				    extref->base64_blocks_per_line * 4);
-		}
-		if (startpos == str_len(str)) {
-			/* make it clear there are no options */
-			str_append_c(str, DBOX_ATTACHMENT_DECODE_OPTION_NONE);
-		}
-		str_append_c(str, ' ');
-		str_append(str, extref->path);
-	}
+	index_attachment_append_extrefs(str, extrefs);
 	str_append_c(str, '\n');
 }
 
-static bool
-parse_extref_decode_options(const char *str,
-			    struct mail_attachment_extref *extref)
-{
-	unsigned int num;
-
-	if (*str == DBOX_ATTACHMENT_DECODE_OPTION_NONE)
-		return str[1] == '\0';
-
-	while (*str != '\0') {
-		switch (*str) {
-		case DBOX_ATTACHMENT_DECODE_OPTION_BASE64:
-			str++; num = 0;
-			while (*str >= '0' && *str <= '9') {
-				num = num*10 + (*str-'0');
-				str++;
-			}
-			if (num == 0 || num % 4 != 0)
-				return FALSE;
-
-			extref->base64_blocks_per_line = num/4;
-			break;
-		case DBOX_ATTACHMENT_DECODE_OPTION_CRLF:
-			extref->base64_have_crlf = TRUE;
-			str++;
-			break;
-		default:
-			return FALSE;
-		}
-	}
-	return TRUE;
-}
-
-static bool
-dbox_attachment_parse_extref_real(const char *line, pool_t pool,
-				  ARRAY_TYPE(mail_attachment_extref) *extrefs)
-{
-	struct mail_attachment_extref extref;
-	const char *const *args;
-	unsigned int i, len;
-	uoff_t last_voffset;
-
-	args = t_strsplit(line, " ");
-	len = str_array_length(args);
-	if ((len % 4) != 0)
-		return FALSE;
-
-	last_voffset = 0;
-	for (i = 0; args[i] != NULL; i += 4) {
-		const char *start_offset_str = args[i+0];
-		const char *size_str = args[i+1];
-		const char *decode_options = args[i+2];
-		const char *path = args[i+3];
-
-		memset(&extref, 0, sizeof(extref));
-		if (str_to_uoff(start_offset_str, &extref.start_offset) < 0 ||
-		    str_to_uoff(size_str, &extref.size) < 0 ||
-		    extref.start_offset < last_voffset ||
-		    !parse_extref_decode_options(decode_options, &extref))
-			return FALSE;
-
-		last_voffset += extref.size +
-			(extref.start_offset - last_voffset);
-
-		extref.path = p_strdup(pool, path);
-		array_append(extrefs, &extref, 1);
-	}
-	return TRUE;
-}
-
-bool dbox_attachment_parse_extref(const char *line, pool_t pool,
-				  ARRAY_TYPE(mail_attachment_extref) *extrefs)
-{
-	bool ret;
-
-	T_BEGIN {
-		ret = dbox_attachment_parse_extref_real(line, pool, extrefs);
-	} T_END;
-	return ret;
-}
-
 static int
 dbox_attachment_file_get_stream_from(struct dbox_file *file,
 				     const char *ext_refs,
 				     struct istream **stream,
 				     const char **error_r)
 {
-	ARRAY_TYPE(mail_attachment_extref) extrefs_arr;
-	const struct mail_attachment_extref *extref;
-	struct istream_attachment_connector *conn;
-	struct fs_file *fsfile;
-	struct istream *input;
-	const char *path, *path_suffix;
+	const char *path_suffix;
 	uoff_t msg_size;
-	int ret;
-
-	*error_r = NULL;
 
 	if (*file->storage->attachment_dir == '\0') {
 		mail_storage_set_critical(&file->storage->storage,
@@ -160,37 +37,13 @@
 		return -1;
 	}
 
-	t_array_init(&extrefs_arr, 16);
-	if (!dbox_attachment_parse_extref_real(ext_refs, pool_datastack_create(),
-					       &extrefs_arr)) {
-		*error_r = "Broken ext-refs string";
+	msg_size = dbox_file_get_plaintext_size(file);
+	path_suffix = file->storage->v.get_attachment_path_suffix(file);
+	if (index_attachment_stream_get(file->storage->attachment_fs,
+					file->storage->attachment_dir,
+					path_suffix, stream, msg_size,
+					ext_refs, error_r) < 0)
 		return 0;
-	}
-	msg_size = dbox_file_get_plaintext_size(file);
-	conn = istream_attachment_connector_begin(*stream, msg_size);
-
-	path_suffix = file->storage->v.get_attachment_path_suffix(file);
-	array_foreach(&extrefs_arr, extref) {
-		path = t_strdup_printf("%s/%s%s", file->storage->attachment_dir,
-				       extref->path, path_suffix);
-		fsfile = fs_file_init(file->storage->attachment_fs, path,
-				      FS_OPEN_MODE_READONLY);
-		input = i_stream_create_fs_file(&fsfile, IO_BLOCK_SIZE);
-
-		ret = istream_attachment_connector_add(conn, input,
-					extref->start_offset, extref->size,
-					extref->base64_blocks_per_line,
-					extref->base64_have_crlf, error_r);
-		i_stream_unref(&input);
-		if (ret < 0) {
-			istream_attachment_connector_abort(&conn);
-			return 0;
-		}
-	}
-
-	input = istream_attachment_connector_finish(&conn);
-	i_stream_unref(stream);
-	*stream = input;
 	return 1;
 }
 
diff -r 883ba4a47829 -r 0ed18f77ff08 src/lib-storage/index/dbox-common/dbox-attachment.h
--- a/src/lib-storage/index/dbox-common/dbox-attachment.h	Wed Nov 06 21:10:22 2013 +0200
+++ b/src/lib-storage/index/dbox-common/dbox-attachment.h	Wed Nov 06 23:00:58 2013 +0200
@@ -8,10 +8,6 @@
 void dbox_attachment_save_write_metadata(struct mail_save_context *ctx,
 					 string_t *str);
 
-/* Parse DBOX_METADATA_EXT_REF line to given array. Names are allocated
-   from the given pool. */
-bool dbox_attachment_parse_extref(const char *line, pool_t pool,
-				  ARRAY_TYPE(mail_attachment_extref) *extrefs);
 /* Build a single message body stream out of the current message and all of its
    attachments. */
 int dbox_attachment_file_get_stream(struct dbox_file *file,
diff -r 883ba4a47829 -r 0ed18f77ff08 src/lib-storage/index/dbox-multi/mdbox-purge.c
--- a/src/lib-storage/index/dbox-multi/mdbox-purge.c	Wed Nov 06 21:10:22 2013 +0200
+++ b/src/lib-storage/index/dbox-multi/mdbox-purge.c	Wed Nov 06 23:00:58 2013 +0200
@@ -147,13 +147,13 @@
 			/* end of metadata */
 			break;
 		}
-		if (*line == DBOX_METADATA_EXT_REF) {
-			if (!dbox_attachment_parse_extref(line+1, ext_refs_pool,
-							  extrefs)) {
+		if (*line == DBOX_METADATA_EXT_REF) T_BEGIN {
+			if (!index_attachment_parse_extrefs(line+1, ext_refs_pool,
+							    extrefs)) {
 				i_warning("%s: Ignoring corrupted extref: %s",
 					  file->cur_path, line);
 			}
-		}
+		} T_END;
 	}
 	i_stream_set_max_buffer_size(file->input, buf_size);
 
diff -r 883ba4a47829 -r 0ed18f77ff08 src/lib-storage/index/dbox-single/sdbox-copy.c
--- a/src/lib-storage/index/dbox-single/sdbox-copy.c	Wed Nov 06 21:10:22 2013 +0200
+++ b/src/lib-storage/index/dbox-single/sdbox-copy.c	Wed Nov 06 23:00:58 2013 +0200
@@ -40,7 +40,7 @@
 
 	pool = pool_alloconly_create("sdbox attachments copy", 1024);
 	p_array_init(&extrefs, pool, 16);
-	if (!dbox_attachment_parse_extref(extrefs_line, pool, &extrefs)) {
+	if (!index_attachment_parse_extrefs(extrefs_line, pool, &extrefs)) {
 		mail_storage_set_critical(&dest_storage->storage,
 			"Can't copy %s with corrupted extref metadata: %s",
 			src_file->file.cur_path, extrefs_line);
diff -r 883ba4a47829 -r 0ed18f77ff08 src/lib-storage/index/dbox-single/sdbox-file.c
--- a/src/lib-storage/index/dbox-single/sdbox-file.c	Wed Nov 06 21:10:22 2013 +0200
+++ b/src/lib-storage/index/dbox-single/sdbox-file.c	Wed Nov 06 23:00:58 2013 +0200
@@ -436,7 +436,7 @@
 
 	pool = pool_alloconly_create("sdbox attachments unlink", 1024);
 	p_array_init(&extrefs, pool, 16);
-	if (!dbox_attachment_parse_extref(extrefs_line, pool, &extrefs)) {
+	if (!index_attachment_parse_extrefs(extrefs_line, pool, &extrefs)) {
 		i_warning("%s: Ignoring corrupted extref: %s",
 			  sfile->file.cur_path, extrefs_line);
 		array_clear(&extrefs);
diff -r 883ba4a47829 -r 0ed18f77ff08 src/lib-storage/index/dbox-single/sdbox-sync.c
--- a/src/lib-storage/index/dbox-single/sdbox-sync.c	Wed Nov 06 21:10:22 2013 +0200
+++ b/src/lib-storage/index/dbox-single/sdbox-sync.c	Wed Nov 06 23:00:58 2013 +0200
@@ -160,8 +160,9 @@
 	/* NOTE: Index is no longer locked. Multiple processes may be unlinking
 	   the files at the same time. */
 	ctx->mbox->box.tmp_sync_view = ctx->sync_view;
-	array_foreach(&ctx->expunged_uids, uidp)
+	array_foreach(&ctx->expunged_uids, uidp) T_BEGIN {
 		dbox_sync_file_expunge(ctx, *uidp);
+	} T_END;
 	if (ctx->mbox->box.v.sync_notify != NULL)
 		ctx->mbox->box.v.sync_notify(&ctx->mbox->box, 0, 0);
 	ctx->mbox->box.tmp_sync_view = NULL;
diff -r 883ba4a47829 -r 0ed18f77ff08 src/lib-storage/index/index-attachment.c
--- a/src/lib-storage/index/index-attachment.c	Wed Nov 06 21:10:22 2013 +0200
+++ b/src/lib-storage/index/index-attachment.c	Wed Nov 06 23:00:58 2013 +0200
@@ -10,11 +10,20 @@
 #include "str.h"
 #include "message-parser.h"
 #include "rfc822-parser.h"
+#include "fs-api.h"
+#include "istream-fs-file.h"
+#include "istream-attachment-connector.h"
 #include "istream-attachment-extractor.h"
 #include "mail-user.h"
 #include "index-mail.h"
 #include "index-attachment.h"
 
+enum mail_attachment_decode_option {
+	MAIL_ATTACHMENT_DECODE_OPTION_NONE = '-',
+	MAIL_ATTACHMENT_DECODE_OPTION_BASE64 = 'B',
+	MAIL_ATTACHMENT_DECODE_OPTION_CRLF = 'C'
+};
+
 struct mail_save_attachment {


More information about the dovecot-cvs mailing list