Mercurial > dovecot > original-hg > dovecot-1.2
changeset 9444:a5d8d201bd39 HEAD
imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02).
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 18 Oct 2009 18:37:03 -0400 |
parents | b5e6de777e52 |
children | d7f8dbc38fd7 |
files | configure.in src/imap/cmd-sort.c src/lib-storage/index/index-sort-string.c src/lib-storage/index/index-sort.c src/lib-storage/mail-storage.h |
diffstat | 5 files changed, 72 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/configure.in Fri Oct 16 15:30:15 2009 -0400 +++ b/configure.in Sun Oct 18 18:37:03 2009 -0400 @@ -2431,7 +2431,7 @@ dnl ** capability_banner="IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE" -capability="$capability_banner SORT THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT IDLE CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH" +capability="$capability_banner SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT IDLE CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH" AC_DEFINE_UNQUOTED(CAPABILITY_STRING, "$capability", IMAP capabilities) AC_DEFINE_UNQUOTED(CAPABILITY_BANNER_STRING, "$capability_banner", IMAP capabilities advertised in banner)
--- a/src/imap/cmd-sort.c Fri Oct 16 15:30:15 2009 -0400 +++ b/src/imap/cmd-sort.c Sun Oct 18 18:37:03 2009 -0400 @@ -20,6 +20,8 @@ { MAIL_SORT_SUBJECT, "subject" }, { MAIL_SORT_TO, "to" }, { MAIL_SORT_SEARCH_SCORE, "x-score" }, + { MAIL_SORT_DISPLAYFROM, "displayfrom" }, + { MAIL_SORT_DISPLAYTO, "displayto" }, { MAIL_SORT_END, NULL } };
--- a/src/lib-storage/index/index-sort-string.c Fri Oct 16 15:30:15 2009 -0400 +++ b/src/lib-storage/index/index-sort-string.c Sun Oct 18 18:37:03 2009 -0400 @@ -71,6 +71,12 @@ case MAIL_SORT_TO: name = "sort-t"; break; + case MAIL_SORT_DISPLAYFROM: + name = "sort-df"; + break; + case MAIL_SORT_DISPLAYTO: + name = "sort-dt"; + break; default: i_unreached(); }
--- a/src/lib-storage/index/index-sort.c Fri Oct 16 15:30:15 2009 -0400 +++ b/src/lib-storage/index/index-sort.c Sun Oct 18 18:37:03 2009 -0400 @@ -5,6 +5,7 @@ #include "str.h" #include "unichar.h" #include "message-address.h" +#include "message-header-decode.h" #include "imap-base-subject.h" #include "index-storage.h" #include "index-sort-private.h" @@ -278,6 +279,8 @@ case MAIL_SORT_FROM: case MAIL_SORT_SUBJECT: case MAIL_SORT_TO: + case MAIL_SORT_DISPLAYFROM: + case MAIL_SORT_DISPLAYTO: program->sort_list_add = index_sort_list_add_string; program->sort_list_finish = index_sort_list_finish_string; index_sort_list_init_string(program); @@ -312,21 +315,64 @@ } static int -get_first_mailbox(struct mail *mail, const char *header, const char **mailbox_r) +get_first_addr(struct mail *mail, const char *header, + struct message_address **addr_r) { - struct message_address *addr; const char *str; int ret; if ((ret = mail_get_first_header_utf8(mail, header, &str)) <= 0) { - *mailbox_r = ""; + *addr_r = NULL; return ret; } - addr = message_address_parse(pool_datastack_create(), - (const unsigned char *)str, - strlen(str), 1, TRUE); - *mailbox_r = addr != NULL ? addr->mailbox : ""; + *addr_r = message_address_parse(pool_datastack_create(), + (const unsigned char *)str, + strlen(str), 1, TRUE); + return 0; +} + +static int +get_first_mailbox(struct mail *mail, const char *header, const char **mailbox_r) +{ + struct message_address *addr; + + if (get_first_addr(mail, header, &addr) < 0) { + *mailbox_r = ""; + return -1; + } + *mailbox_r = addr != NULL && addr->mailbox != NULL ? addr->mailbox : ""; + return 0; +} + +static int +get_display_name(struct mail *mail, const char *header, const char **name_r) +{ + struct message_address *addr; + + *name_r = ""; + + if (get_first_addr(mail, header, &addr) < 0) + return -1; + if (addr == NULL) + return 0; + + if (addr->name != NULL) { + string_t *str; + unsigned int len = strlen(addr->name); + + str = t_str_new(len*2); + (void)message_header_decode_utf8( + (const unsigned char *)addr->name, len, str, FALSE); + if (str_len(str) > 0) { + *name_r = str_c(str); + return 0; + } + } + if (addr->mailbox != NULL && addr->domain != NULL) + *name_r = t_strconcat(addr->mailbox, "@", addr->domain, NULL); + else if (addr->mailbox != NULL) + *name_r = addr->mailbox; return 0; } @@ -356,6 +402,12 @@ case MAIL_SORT_TO: ret = get_first_mailbox(mail, "To", &str); break; + case MAIL_SORT_DISPLAYFROM: + ret = get_display_name(mail, "From", &str); + break; + case MAIL_SORT_DISPLAYTO: + ret = get_display_name(mail, "To", &str); + break; default: i_unreached(); } @@ -380,6 +432,8 @@ case MAIL_SORT_FROM: case MAIL_SORT_TO: case MAIL_SORT_SUBJECT: + case MAIL_SORT_DISPLAYFROM: + case MAIL_SORT_DISPLAYTO: T_BEGIN { string_t *str1, *str2;
--- a/src/lib-storage/mail-storage.h Fri Oct 16 15:30:15 2009 -0400 +++ b/src/lib-storage/mail-storage.h Sun Oct 18 18:37:03 2009 -0400 @@ -104,6 +104,8 @@ MAIL_SORT_SUBJECT = 0x0020, MAIL_SORT_TO = 0x0040, MAIL_SORT_SEARCH_SCORE = 0x0080, + MAIL_SORT_DISPLAYFROM = 0x0100, + MAIL_SORT_DISPLAYTO = 0x0200, MAIL_SORT_MASK = 0x0fff, MAIL_SORT_FLAG_REVERSE = 0x1000, /* reverse this mask type */