# HG changeset patch # User Timo Sirainen # Date 1212785670 -10800 # Node ID efbfe9344c142c62c2eaee02d59045590bd22351 # Parent d003fb4bb7d93a44728aab04f35f3588303904ff Renamed imap_messageset_parse() to imap_seq_set_parse(). Added imap_seq_range_parse(). diff -r d003fb4bb7d9 -r efbfe9344c14 src/imap/cmd-select.c --- a/src/imap/cmd-select.c Thu Jun 05 05:16:31 2008 +0300 +++ b/src/imap/cmd-select.c Fri Jun 06 23:54:30 2008 +0300 @@ -4,7 +4,7 @@ #include "seq-range-array.h" #include "commands.h" #include "mail-search-build.h" -#include "imap-messageset.h" +#include "imap-seqset.h" #include "imap-fetch.h" #include "imap-sync.h" @@ -100,8 +100,8 @@ strtoull(IMAP_ARG_STR_NONULL(&args[1]), NULL, 10); if (count > 2) { i_array_init(&ctx->qresync_known_uids, 64); - if (imap_messageset_parse(&ctx->qresync_known_uids, - IMAP_ARG_STR_NONULL(&args[2])) < 0) { + if (imap_seq_set_parse(IMAP_ARG_STR_NONULL(&args[2]), + &ctx->qresync_known_uids) < 0) { client_send_command_error(ctx->cmd, "Invalid QRESYNC known-uids"); return FALSE; @@ -121,15 +121,15 @@ return FALSE; } t_array_init(&seqset, 32); - if (imap_messageset_parse(&seqset, - IMAP_ARG_STR_NONULL(&args[0])) < 0) { + if (imap_seq_set_parse(IMAP_ARG_STR_NONULL(&args[0]), + &seqset) < 0) { client_send_command_error(ctx->cmd, "Invalid QRESYNC known-sequence-set"); return FALSE; } t_array_init(&uidset, 32); - if (imap_messageset_parse(&uidset, - IMAP_ARG_STR_NONULL(&args[1])) < 0) { + if (imap_seq_set_parse(IMAP_ARG_STR_NONULL(&args[1]), + &uidset) < 0) { client_send_command_error(ctx->cmd, "Invalid QRESYNC known-uid-set"); return FALSE; diff -r d003fb4bb7d9 -r efbfe9344c14 src/imap/imap-search.c --- a/src/imap/imap-search.c Thu Jun 05 05:16:31 2008 +0300 +++ b/src/imap/imap-search.c Fri Jun 06 23:54:30 2008 +0300 @@ -5,7 +5,7 @@ #include "mail-search-build.h" #include "imap-search.h" #include "imap-parser.h" -#include "imap-messageset.h" +#include "imap-seqset.h" #include @@ -97,7 +97,7 @@ args->args = p_new(args->pool, struct mail_search_arg, 1); args->args->type = SEARCH_SEQSET; p_array_init(&args->args->value.seqset, args->pool, 16); - if (imap_messageset_parse(&args->args->value.seqset, messageset) < 0 || + if (imap_seq_set_parse(messageset, &args->args->value.seqset) < 0 || !msgset_is_valid(&args->args->value.seqset, cmd->client->messages_count)) { *error_r = "Invalid messageset"; @@ -118,7 +118,7 @@ args->args = p_new(args->pool, struct mail_search_arg, 1); args->args->type = SEARCH_UIDSET; p_array_init(&args->args->value.seqset, cmd->pool, 16); - if (imap_messageset_parse(&args->args->value.seqset, uidset) < 0) { + if (imap_seq_set_parse(uidset, &args->args->value.seqset) < 0) { *error_r = "Invalid uidset"; return -1; } diff -r d003fb4bb7d9 -r efbfe9344c14 src/lib-imap/Makefile.am --- a/src/lib-imap/Makefile.am Thu Jun 05 05:16:31 2008 +0300 +++ b/src/lib-imap/Makefile.am Fri Jun 06 23:54:30 2008 +0300 @@ -11,9 +11,9 @@ imap-date.c \ imap-envelope.c \ imap-match.c \ - imap-messageset.c \ imap-parser.c \ imap-quote.c \ + imap-seqset.c \ imap-util.c headers = \ @@ -22,9 +22,9 @@ imap-date.h \ imap-envelope.h \ imap-match.h \ - imap-messageset.h \ imap-parser.h \ imap-quote.h \ + imap-seqset.h \ imap-util.h if INSTALL_HEADERS diff -r d003fb4bb7d9 -r efbfe9344c14 src/lib-imap/imap-messageset.c --- a/src/lib-imap/imap-messageset.c Thu Jun 05 05:16:31 2008 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -/* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */ - -#include "lib.h" -#include "imap-messageset.h" - -static uint32_t get_next_number(const char **str) -{ - uint32_t num; - - num = 0; - while (**str != '\0') { - if (**str < '0' || **str > '9') - break; - - num = num*10 + (**str - '0'); - (*str)++; - } - - if (num == (uint32_t)-1) { - /* FIXME: ugly hack, we're using this number to mean the - last existing message. In reality UIDs should never get - this high, so we can quite safely just drop this one down. */ - num--; - } - - return num; -} - -int imap_messageset_parse(ARRAY_TYPE(seq_range) *dest, const char *messageset) -{ - uint32_t seq1, seq2; - - while (*messageset != '\0') { - if (*messageset == '*') { - /* last message */ - seq1 = (uint32_t)-1; - messageset++; - } else { - seq1 = get_next_number(&messageset); - if (seq1 == 0) - return -1; - } - - if (*messageset != ':') - seq2 = seq1; - else { - /* first:last range */ - messageset++; - - if (*messageset == '*') { - seq2 = (uint32_t)-1; - messageset++; - } else { - seq2 = get_next_number(&messageset); - if (seq2 == 0) - return -1; - } - } - - if (*messageset == ',') - messageset++; - else if (*messageset != '\0') - return -1; - - if (seq1 > seq2) { - /* swap, as specified by RFC-3501 */ - uint32_t temp = seq1; - seq1 = seq2; - seq2 = temp; - } - - seq_range_array_add_range(dest, seq1, seq2); - } - return 0; -} diff -r d003fb4bb7d9 -r efbfe9344c14 src/lib-imap/imap-messageset.h --- a/src/lib-imap/imap-messageset.h Thu Jun 05 05:16:31 2008 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -#ifndef IMAP_MESSAGESET_H -#define IMAP_MESSAGESET_H - -#include "seq-range-array.h" - -int imap_messageset_parse(ARRAY_TYPE(seq_range) *dest, const char *messageset); - -#endif diff -r d003fb4bb7d9 -r efbfe9344c14 src/lib-imap/imap-seqset.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib-imap/imap-seqset.c Fri Jun 06 23:54:30 2008 +0300 @@ -0,0 +1,93 @@ +/* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "imap-seqset.h" + +static uint32_t get_next_number(const char **str) +{ + uint32_t num; + + num = 0; + while (**str != '\0') { + if (**str < '0' || **str > '9') + break; + + num = num*10 + (**str - '0'); + (*str)++; + } + + if (num == (uint32_t)-1) { + /* FIXME: ugly hack, we're using this number to mean the + last existing message. In reality UIDs should never get + this high, so we can quite safely just drop this one down. */ + num--; + } + + return num; +} + +static int +get_next_seq_range(const char **str, uint32_t *seq1_r, uint32_t *seq2_r) +{ + uint32_t seq1, seq2; + + if (**str == '*') { + /* last message */ + seq1 = (uint32_t)-1; + *str += 1; + } else { + seq1 = get_next_number(str); + if (seq1 == 0) + return -1; + } + + if (**str != ':') + seq2 = seq1; + else { + /* first:last range */ + *str += 1; + + if (**str == '*') { + seq2 = (uint32_t)-1; + *str += 1; + } else { + seq2 = get_next_number(str); + if (seq2 == 0) + return -1; + } + } + + if (seq1 > seq2) { + /* swap, as specified by RFC-3501 */ + *seq1_r = seq2; + *seq2_r = seq1; + } else { + *seq1_r = seq1; + *seq2_r = seq2; + } + return 0; +} + +int imap_seq_set_parse(const char *str, ARRAY_TYPE(seq_range) *dest) +{ + uint32_t seq1, seq2; + + while (*str != '\0') { + if (get_next_seq_range(&str, &seq1, &seq2) < 0) + return -1; + seq_range_array_add_range(dest, seq1, seq2); + + if (*str == ',') + str++; + else if (*str != '\0') + return -1; + } + return 0; +} + +int imap_seq_range_parse(const char *str, uint32_t *seq1_r, uint32_t *seq2_r) +{ + if (get_next_seq_range(&str, seq1_r, seq2_r) < 0) + return -1; + return *str == '\0' ? 0 : -1; +} diff -r d003fb4bb7d9 -r efbfe9344c14 src/lib-imap/imap-seqset.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib-imap/imap-seqset.h Fri Jun 06 23:54:30 2008 +0300 @@ -0,0 +1,13 @@ +#ifndef IMAP_SEQSET_H +#define IMAP_SEQSET_H + +#include "seq-range-array.h" + +/* Parse IMAP sequence-set and store the result in dest. '*' is stored as + (uint32_t)-1. Returns 0 if successful, -1 if input is invalid. */ +int imap_seq_set_parse(const char *str, ARRAY_TYPE(seq_range) *dest); + +/* Parse IMAP seq-number / seq-range. */ +int imap_seq_range_parse(const char *str, uint32_t *seq1_r, uint32_t *seq2_r); + +#endif diff -r d003fb4bb7d9 -r efbfe9344c14 src/lib-storage/mail-search-build.c --- a/src/lib-storage/mail-search-build.c Thu Jun 05 05:16:31 2008 +0300 +++ b/src/lib-storage/mail-search-build.c Fri Jun 06 23:54:30 2008 +0300 @@ -4,7 +4,7 @@ #include "ioloop.h" #include "imap-date.h" #include "imap-parser.h" -#include "imap-messageset.h" +#include "imap-seqset.h" #include "mail-search-build.h" #include "mail-storage.h" @@ -513,8 +513,8 @@ /* SEARCHRES: delay initialization */ return TRUE; } - if (imap_messageset_parse(&sarg->value.seqset, - sarg->value.str) < 0) { + if (imap_seq_set_parse(sarg->value.str, + &sarg->value.seqset) < 0) { data->error = "Invalid UID messageset"; return FALSE; } @@ -584,8 +584,7 @@ p_array_init(&(*next_sarg)->value.seqset, data->pool, 16); - if (imap_messageset_parse(&(*next_sarg)->value.seqset, - str) < 0) { + if (imap_seq_set_parse(str, &(*next_sarg)->value.seqset) < 0) { data->error = "Invalid messageset"; return FALSE; }