dnl IDLE doesn't really belong to banner. It's there just to make Blackberries
dnl happy, because otherwise BIS server disables push email.
capability_banner="IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE"
-capability="$capability_banner SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY PREVIEW=FUZZY STATUS=SIZE"
+capability="$capability_banner SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY PREVIEW=FUZZY STATUS=SIZE SAVEDATE"
AC_DEFINE_UNQUOTED(CAPABILITY_STRING, "$capability", [IMAP capabilities])
AC_DEFINE_UNQUOTED(CAPABILITY_BANNER_STRING, "$capability_banner", [IMAP capabilities advertised in banner])
return TRUE;
}
+static int imap_fetch_savedate(struct imap_fetch_context *ctx, struct mail *mail,
+ void *context ATTR_UNUSED)
+{
+ time_t date;
+ int ret;
+
+ ret = mail_get_save_date(mail, &date);
+ if (ret < 0)
+ return -1;
+
+ if (ret == 0)
+ str_append(ctx->state.cur_str, "SAVEDATE NIL ");
+ else {
+ str_printfa(ctx->state.cur_str, "SAVEDATE \"%s\" ",
+ imap_to_datetime(date));
+ }
+ return 1;
+}
+
+static bool imap_fetch_savedate_init(struct imap_fetch_init_context *ctx)
+{
+ ctx->fetch_ctx->fetch_data |= MAIL_FETCH_SAVE_DATE;
+ imap_fetch_add_handler(ctx, IMAP_FETCH_HANDLER_FLAG_BUFFERED,
+ "NIL", imap_fetch_savedate, NULL);
+ return TRUE;
+}
+
static int fetch_guid(struct imap_fetch_context *ctx, struct mail *mail,
void *context ATTR_UNUSED)
{
{ "RFC822", imap_fetch_rfc822_init },
{ "SNIPPET", imap_fetch_snippet_init },
{ "UID", imap_fetch_uid_init },
+ { "SAVEDATE", imap_fetch_savedate_init },
{ "X-GUID", fetch_guid_init },
{ "X-MAILBOX", fetch_x_mailbox_init },
{ "X-REAL-UID", fetch_x_real_uid_init },
str_append(dest, "BEFORE");
break;
case MAIL_SEARCH_DATE_TYPE_SAVED:
- str_append(dest, "X-SAVEDBEFORE");
+ str_append(dest, "SAVEDBEFORE");
break;
}
if (mail_search_arg_to_imap_date(dest, arg))
str_append(dest, "ON");
break;
case MAIL_SEARCH_DATE_TYPE_SAVED:
- str_append(dest, "X-SAVEDON");
+ str_append(dest, "SAVEDON");
break;
}
if (!mail_search_arg_to_imap_date(dest, arg)) {
str_append(dest, "SINCE");
break;
case MAIL_SEARCH_DATE_TYPE_SAVED:
- str_append(dest, "X-SAVEDSINCE");
+ str_append(dest, "SAVEDSINCE");
break;
}
if (mail_search_arg_to_imap_date(dest, arg))
CALLBACK_DATE(savedon, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SAVED)
CALLBACK_DATE(savedsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SAVED)
+static struct mail_search_arg *
+human_search_savedatesupported(struct mail_search_build_context *ctx)
+{
+ return mail_search_build_new(ctx, SEARCH_SAVEDATESUPPORTED);
+}
+
static struct mail_search_arg *
arg_new_human_size(struct mail_search_build_context *ctx,
enum mail_search_arg_type type)
{ "SAVEDBEFORE", human_search_savedbefore },
{ "SAVEDON", human_search_savedon },
{ "SAVEDSINCE", human_search_savedsince },
+ { "SAVEDATESUPPORTED", human_search_savedatesupported },
{ "X-SAVEDBEFORE", human_search_savedbefore },
{ "X-SAVEDON", human_search_savedon },
{ "X-SAVEDSINCE", human_search_savedsince },
#include "mail-search-register.h"
#include "mail-search-parser.h"
#include "mail-search-build.h"
+#include "mail-search-build.h"
#include "mail-search-mime-build.h"
struct mail_search_register *mail_search_register_imap;
CALLBACK_DATE(senton, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SENT)
CALLBACK_DATE(sentsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SENT)
+CALLBACK_DATE(savedbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SAVED)
+CALLBACK_DATE(savedon, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SAVED)
+CALLBACK_DATE(savedsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SAVED)
+
CALLBACK_DATE(x_savedbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SAVED)
CALLBACK_DATE(x_savedon, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SAVED)
CALLBACK_DATE(x_savedsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SAVED)
+static struct mail_search_arg *
+imap_search_savedatesupported(struct mail_search_build_context *ctx)
+{
+ return mail_search_build_new(ctx, SEARCH_SAVEDATESUPPORTED);
+}
+
static struct mail_search_arg *
arg_new_size(struct mail_search_build_context *ctx,
enum mail_search_arg_type type)
{ "SENTBEFORE", imap_search_sentbefore },
{ "SENTON", imap_search_senton },
{ "SENTSINCE", imap_search_sentsince },
+ { "SAVEDBEFORE", imap_search_savedbefore },
+ { "SAVEDON", imap_search_savedon },
+ { "SAVEDSINCE", imap_search_savedsince },
+ { "SAVEDATESUPPORTED", imap_search_savedatesupported },
+ /* FIXME: remove these in v2.4: */
{ "X-SAVEDBEFORE", imap_search_x_savedbefore },
{ "X-SAVEDON", imap_search_x_savedon },
{ "X-SAVEDSINCE", imap_search_x_savedsince },
{ "SENTBEFORE 20-May-2015", "SENTBEFORE \"20-May-2015\"" },
{ "SENTON 20-May-2015", "SENTON \"20-May-2015\"" },
{ "SENTSINCE 20-May-2015", "SENTSINCE \"20-May-2015\"" },
- { "X-SAVEDBEFORE 20-May-2015", "X-SAVEDBEFORE \"20-May-2015\"" },
- { "X-SAVEDON 20-May-2015", "X-SAVEDON \"20-May-2015\"" },
- { "X-SAVEDSINCE 20-May-2015", "X-SAVEDSINCE \"20-May-2015\"" },
+ { "SAVEDBEFORE 20-May-2015", "SAVEDBEFORE \"20-May-2015\"" },
+ { "SAVEDON 20-May-2015", "SAVEDON \"20-May-2015\"" },
+ { "SAVEDSINCE 20-May-2015", "SAVEDSINCE \"20-May-2015\"" },
+ { "X-SAVEDBEFORE 20-May-2015", "SAVEDBEFORE \"20-May-2015\"" },
+ { "X-SAVEDON 20-May-2015", "SAVEDON \"20-May-2015\"" },
+ { "X-SAVEDSINCE 20-May-2015", "SAVEDSINCE \"20-May-2015\"" },
{ "OLDER 1", NULL },
{ "OLDER 1000", NULL },
{ "YOUNGER 1", NULL },