changeset 8548:6a6a3bfea547 HEAD

transaction view: Allow looking up multiple ext datas for the same message without breaking.
author Timo Sirainen <tss@iki.fi>
date Sun, 14 Dec 2008 06:51:04 +0200
parents 545cb188f7ab
children 7b16388a3bb0
files src/lib-index/mail-index-transaction-view.c
diffstat 1 files changed, 12 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-transaction-view.c	Sun Dec 14 06:38:24 2008 +0200
+++ b/src/lib-index/mail-index-transaction-view.c	Sun Dec 14 06:51:04 2008 +0200
@@ -16,6 +16,7 @@
 	struct mail_index_map *lookup_map;
 	struct mail_index_header hdr;
 	buffer_t *lookup_return_data;
+	uint32_t lookup_prev_seq;
 };
 
 static void tview_close(struct mail_index_view *view)
@@ -201,13 +202,14 @@
 
 static const void *
 tview_return_updated_ext(struct mail_index_view_transaction *tview,
-			 const void *data, uint32_t ext_id)
+			 uint32_t seq, const void *data, uint32_t ext_id)
 {
 	const struct mail_index_ext *ext;
 	const struct mail_index_registered_ext *rext;
 	const struct mail_transaction_ext_intro *intro;
 	unsigned int record_align, record_size;
 	uint32_t ext_idx;
+	size_t pos;
 
 	/* data begins with a 32bit sequence, followed by the actual
 	   extension data */
@@ -244,9 +246,15 @@
 			tview->lookup_return_data =
 				buffer_create_dynamic(default_pool,
 						      record_size + 64);
+		} else if (seq != tview->lookup_prev_seq) {
+			/* clear the buffer between lookups for different
+			   messages */
+			buffer_set_used_size(tview->lookup_return_data, 0);
 		}
-		buffer_write(tview->lookup_return_data, 0, data, record_size);
-		return tview->lookup_return_data->data;
+		tview->lookup_prev_seq = seq;
+		pos = tview->lookup_return_data->used;
+		buffer_append(tview->lookup_return_data, data, record_size);
+		return CONST_PTR_OFFSET(tview->lookup_return_data->data, pos);
 	}
 }
 
@@ -274,7 +282,7 @@
 		    mail_index_seq_array_lookup(ext_buf, seq, &idx)) {
 			data = array_idx(ext_buf, idx);
 			*map_r = tview_get_lookup_map(tview);
-			*data_r = tview_return_updated_ext(tview, data,
+			*data_r = tview_return_updated_ext(tview, seq, data,
 							   ext_id);
 			return;
 		}