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;
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();
}
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);
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 */