changeset 8875:629004d13ec4 HEAD

Added mail_index_lookup_view_flags()
author Timo Sirainen <tss@iki.fi>
date Mon, 30 Mar 2009 20:27:02 -0400
parents 6cc8ee6080ed
children 88aeadb32151
files src/lib-index/mail-index-view.c src/lib-index/mail-index.h
diffstat 2 files changed, 39 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-view.c	Mon Mar 30 16:18:25 2009 -0400
+++ b/src/lib-index/mail-index-view.c	Mon Mar 30 20:27:02 2009 -0400
@@ -389,25 +389,30 @@
 	mail_index_data_lookup_keywords(map, data, keyword_idx);
 }
 
+static const void *
+view_map_lookup_ext_full(struct mail_index_map *map,
+			 const struct mail_index_record *rec, uint32_t ext_id)
+{
+	const struct mail_index_ext *ext;
+	uint32_t idx;
+
+	if (!mail_index_map_get_ext_idx(map, ext_id, &idx))
+		return NULL;
+
+	ext = array_idx(&map->extensions, idx);
+	return ext->record_offset == 0 ? NULL :
+		CONST_PTR_OFFSET(rec, ext->record_offset);
+}
+
 static void
 view_lookup_ext_full(struct mail_index_view *view, uint32_t seq,
 		     uint32_t ext_id, struct mail_index_map **map_r,
 		     const void **data_r, bool *expunged_r)
 {
-	const struct mail_index_ext *ext;
 	const struct mail_index_record *rec;
-	uint32_t idx, offset;
 
 	rec = view->v.lookup_full(view, seq, map_r, expunged_r);
-	if (!mail_index_map_get_ext_idx(*map_r, ext_id, &idx)) {
-		*data_r = NULL;
-		return;
-	}
-
-	ext = array_idx(&(*map_r)->extensions, idx);
-	offset = ext->record_offset;
-
-	*data_r = offset == 0 ? NULL : CONST_PTR_OFFSET(rec, offset);
+	*data_r = view_map_lookup_ext_full(*map_r, rec, ext_id);
 }
 
 static void view_get_header_ext(struct mail_index_view *view,
@@ -524,6 +529,23 @@
 	view->v.lookup_keywords(view, seq, keyword_idx);
 }
 
+void mail_index_lookup_view_flags(struct mail_index_view *view, uint32_t seq,
+				  enum mail_flags *flags_r,
+				  ARRAY_TYPE(keyword_indexes) *keyword_idx)
+{
+	const struct mail_index_record *rec;
+	const unsigned char *keyword_data;
+
+	i_assert(seq > 0 && seq <= mail_index_view_get_messages_count(view));
+
+	rec = MAIL_INDEX_MAP_IDX(view->map, seq-1);
+	*flags_r = rec->flags;
+
+	keyword_data = view_map_lookup_ext_full(view->map, rec,
+						view->index->keywords_ext_id);
+	mail_index_data_lookup_keywords(view->map, keyword_data, keyword_idx);
+}
+
 void mail_index_lookup_uid(struct mail_index_view *view, uint32_t seq,
 			   uint32_t *uid_r)
 {
--- a/src/lib-index/mail-index.h	Mon Mar 30 16:18:25 2009 -0400
+++ b/src/lib-index/mail-index.h	Mon Mar 30 20:27:02 2009 -0400
@@ -343,6 +343,12 @@
 /* Return keywords from given map. */
 void mail_index_map_lookup_keywords(struct mail_index_map *map, uint32_t seq,
 				    ARRAY_TYPE(keyword_indexes) *keyword_idx);
+/* mail_index_lookup[_keywords]() returns the latest flag changes.
+   This function instead attempts to return the flags and keywords done by the
+   last view sync. */
+void mail_index_lookup_view_flags(struct mail_index_view *view, uint32_t seq,
+				  enum mail_flags *flags_r,
+				  ARRAY_TYPE(keyword_indexes) *keyword_idx);
 /* Returns the UID for given message. May be slightly faster than
    mail_index_lookup()->uid. */
 void mail_index_lookup_uid(struct mail_index_view *view, uint32_t seq,