imap-util.c revision b9e75defc480cb1292b39bbc5cc1f0e07877420a
89a126810703c666309310d0f3189e9834d70b5bTimo Sirainen/* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "lib.h"
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainen#include "array.h"
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen#include "str.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "strescape.h"
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen#include "mail-types.h"
ffd9a1898a18fadfc5dce399162c25d50548f905Timo Sirainen#include "imap-parser.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "imap-util.h"
89b548af722113acb5d63dfffb44423cb60f91e4Timo Sirainen
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainenvoid imap_write_flags(string_t *dest, enum mail_flags flags,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *const *keywords)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
66ae183b6e895216037bd921367670f4b0665911Timo Sirainen size_t size;
e86d0d34fe365da4c7ca4312d575bfcbf3a01c0eTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen size = str_len(dest);
da5d50534cfca45d0aaaf0bdac17b287b4588809Timo Sirainen if ((flags & MAIL_ANSWERED) != 0)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen str_append(dest, "\\Answered ");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ((flags & MAIL_FLAGGED) != 0)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen str_append(dest, "\\Flagged ");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ((flags & MAIL_DELETED) != 0)
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen str_append(dest, "\\Deleted ");
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen if ((flags & MAIL_SEEN) != 0)
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen str_append(dest, "\\Seen ");
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen if ((flags & MAIL_DRAFT) != 0)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen str_append(dest, "\\Draft ");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if ((flags & MAIL_RECENT) != 0)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen str_append(dest, "\\Recent ");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (keywords != NULL) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* we have keywords too */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen while (*keywords != NULL) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen str_append(dest, *keywords);
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen str_append_c(dest, ' ');
8fa41238067c854435884c459963fde6f8c6436bTimo Sirainen keywords++;
8fa41238067c854435884c459963fde6f8c6436bTimo Sirainen }
91dca97b367c54a139c268b56a0c67f564bd9197Timo Sirainen }
91dca97b367c54a139c268b56a0c67f564bd9197Timo Sirainen
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen if (str_len(dest) != size)
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen str_truncate(dest, str_len(dest)-1);
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid imap_write_seq_range(string_t *dest, const ARRAY_TYPE(seq_range) *array)
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen{
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen const struct seq_range *range;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen unsigned int i, count;
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen
91dca97b367c54a139c268b56a0c67f564bd9197Timo Sirainen range = array_get(array, &count);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen for (i = 0; i < count; i++) {
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen if (i > 0)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen str_append_c(dest, ',');
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen str_printfa(dest, "%u", range[i].seq1);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (range[i].seq1 != range[i].seq2)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen str_printfa(dest, ":%u", range[i].seq2);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenvoid imap_args_to_str(string_t *dest, const struct imap_arg *args)
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen{
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen const ARRAY_TYPE(imap_arg_list) *list;
ee246b46953e4b94b2f22e093373674fa9155500Timo Sirainen bool first = TRUE;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen for (; args->type != IMAP_ARG_EOL; args++) {
ba00293b85c7fb4e7a2d100991c716e17b9daaaeTimo Sirainen if (first)
648d24583c1574441c4fa0331a90bd4d6e7996c5Timo Sirainen first = FALSE;
648d24583c1574441c4fa0331a90bd4d6e7996c5Timo Sirainen else
ee246b46953e4b94b2f22e093373674fa9155500Timo Sirainen str_append_c(dest, ' ');
287ba82a8da3eaa473b5735d4eeac2fb4c5d8117Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen switch (args->type) {
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen case IMAP_ARG_NIL:
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen str_append(dest, "NIL");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen break;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen case IMAP_ARG_ATOM:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen str_append(dest, IMAP_ARG_STR(args));
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen break;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen case IMAP_ARG_STRING:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen str_append_c(dest, '"');
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen str_append(dest, str_escape(IMAP_ARG_STR(args)));
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen str_append_c(dest, '"');
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen break;
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen case IMAP_ARG_LITERAL: {
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen const char *strarg = IMAP_ARG_STR(args);
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen str_printfa(dest, "{%"PRIuSIZE_T"}\r\n",
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen strlen(strarg));
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen str_append(dest, strarg);
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen break;
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen }
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen case IMAP_ARG_LIST:
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen str_append_c(dest, '(');
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen list = IMAP_ARG_LIST(args);
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen imap_args_to_str(dest, array_idx(list, 0));
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen str_append_c(dest, ')');
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen break;
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen case IMAP_ARG_LITERAL_SIZE:
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen case IMAP_ARG_LITERAL_SIZE_NONSYNC:
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen str_printfa(dest, "{%"PRIuUOFF_T"}\r\n",
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen IMAP_ARG_LITERAL_SIZE(args));
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen str_append(dest, "<too large>");
ffd9a1898a18fadfc5dce399162c25d50548f905Timo Sirainen break;
ffd9a1898a18fadfc5dce399162c25d50548f905Timo Sirainen case IMAP_ARG_EOL:
ffd9a1898a18fadfc5dce399162c25d50548f905Timo Sirainen i_unreached();
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen }
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen }
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen}
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen