changeset 12989:fac2d4fe86b1

lib-storage: Added MAIL_SORT_POP3_ORDER
author Timo Sirainen <tss@iki.fi>
date Wed, 04 May 2011 11:43:16 +0200
parents bf0a80c91536
children c9b7e829c6a9
files src/lib-storage/index/index-sort.c src/lib-storage/mail-storage.h
diffstat 2 files changed, 46 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/index-sort.c	Wed May 04 11:42:17 2011 +0200
+++ b/src/lib-storage/index/index-sort.c	Wed May 04 11:43:16 2011 +0200
@@ -81,6 +81,30 @@
 		node->size = 0;
 }
 
+static uoff_t index_sort_get_pop3_order(struct mail *mail)
+{
+	const char *str;
+	uoff_t size;
+
+	if (mail_get_special(mail, MAIL_FETCH_POP3_ORDER, &str) < 0 ||
+	    str_to_uoff(str, &size) < 0)
+		return (uint32_t)-1;
+	else
+		return size;
+}
+
+static void
+index_sort_list_add_pop3_order(struct mail_search_sort_program *program,
+			       struct mail *mail)
+{
+	ARRAY_TYPE(mail_sort_node_size) *nodes = program->context;
+	struct mail_sort_node_size *node;
+
+	node = array_append_space(nodes);
+	node->seq = mail->seq;
+	node->size = index_sort_get_pop3_order(mail);
+}
+
 static float index_sort_get_score(struct mail *mail)
 {
 	const char *str;
@@ -283,6 +307,16 @@
 		program->context = nodes;
 		break;
 	}
+	case MAIL_SORT_POP3_ORDER: {
+		ARRAY_TYPE(mail_sort_node_size) *nodes;
+
+		nodes = i_malloc(sizeof(*nodes));
+		i_array_init(nodes, 128);
+		program->sort_list_add = index_sort_list_add_pop3_order;
+		program->sort_list_finish = index_sort_list_finish_size;
+		program->context = nodes;
+		break;
+	}
 	default:
 		i_unreached();
 	}
@@ -486,6 +520,17 @@
 		ret = float1 < float2 ? -1 :
 			(float1 > float2 ? 1 : 0);
 		break;
+	case MAIL_SORT_POP3_ORDER:
+		/* 32bit numbers would be enough, but since there is already
+		   existing code for uoff_t in sizes, just use them. */
+		mail_set_seq(mail, seq1);
+		size1 = index_sort_get_pop3_order(mail);
+		mail_set_seq(mail, seq2);
+		size2 = index_sort_get_pop3_order(mail);
+
+		ret = size1 < size2 ? -1 :
+			(size1 > size2 ? 1 : 0);
+		break;
 	case MAIL_SORT_END:
 		return seq1 < seq2 ? -1 :
 			(seq1 > seq2 ? 1 : 0);
--- a/src/lib-storage/mail-storage.h	Wed May 04 11:42:17 2011 +0200
+++ b/src/lib-storage/mail-storage.h	Wed May 04 11:43:16 2011 +0200
@@ -92,6 +92,7 @@
 	MAIL_SORT_SEARCH_SCORE	= 0x0080,
 	MAIL_SORT_DISPLAYFROM	= 0x0100,
 	MAIL_SORT_DISPLAYTO	= 0x0200,
+	MAIL_SORT_POP3_ORDER	= 0x0400,
 
 	MAIL_SORT_MASK		= 0x0fff,
 	MAIL_SORT_FLAG_REVERSE	= 0x1000, /* reverse this mask type */