# HG changeset patch # User Timo Sirainen # Date 1255905423 14400 # Node ID a5d8d201bd39bb6b50fabf2ead523ba5f8b80967 # Parent b5e6de777e5223d021aa490d143a86e61101878b imap: Implemented SORT=DISPLAY extension (draft-ietf-morg-sortdisplay-02). diff -r b5e6de777e52 -r a5d8d201bd39 configure.in --- 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) diff -r b5e6de777e52 -r a5d8d201bd39 src/imap/cmd-sort.c --- 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 } }; diff -r b5e6de777e52 -r a5d8d201bd39 src/lib-storage/index/index-sort-string.c --- 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(); } diff -r b5e6de777e52 -r a5d8d201bd39 src/lib-storage/index/index-sort.c --- 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; diff -r b5e6de777e52 -r a5d8d201bd39 src/lib-storage/mail-storage.h --- 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 */