cmd-search.c revision 2f25f180578a4c280c9f5fda1cb9f22410084a1e
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#include "common.h"
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen#include "imap-search-args.h"
0536ccb51d41e3078c3a9fa33e509fb4b2420f95Timo Sirainen#include "imap-search.h"
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainenbool cmd_search(struct client_command_context *cmd)
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen{
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen struct imap_search_context *ctx;
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen struct mail_search_args *sargs;
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen const struct imap_arg *args;
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen const char *charset;
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen int ret;
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen if (!client_read_args(cmd, 0, 0, &args))
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen return FALSE;
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen if (!client_verify_open_mailbox(cmd))
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen return TRUE;
e3678f7bfba87b5aa1446a1a7b9928272b4f72a3Timo Sirainen
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen ctx = p_new(cmd->pool, struct imap_search_context, 1);
8cb72c59d5ea4e9e5f638d7ec840bb853f5a188eTimo Sirainen ctx->cmd = cmd;
8b247780e911909a9fdc47f69ce6d1478902ad98Timo Sirainen
8b247780e911909a9fdc47f69ce6d1478902ad98Timo Sirainen if ((ret = cmd_search_parse_return_if_found(ctx, &args)) <= 0) {
8b247780e911909a9fdc47f69ce6d1478902ad98Timo Sirainen /* error / waiting for unambiguity */
8b247780e911909a9fdc47f69ce6d1478902ad98Timo Sirainen return ret < 0;
8b247780e911909a9fdc47f69ce6d1478902ad98Timo Sirainen }
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen if (args->type == IMAP_ARG_ATOM &&
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen strcasecmp(IMAP_ARG_STR_NONULL(args), "CHARSET") == 0) {
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen /* CHARSET specified */
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen args++;
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen if (args->type != IMAP_ARG_ATOM &&
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen args->type != IMAP_ARG_STRING) {
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen client_send_command_error(cmd,
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen "Invalid charset argument.");
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen return TRUE;
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen }
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen charset = IMAP_ARG_STR(args);
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen args++;
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen } else {
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen charset = "UTF-8";
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen }
862ec874f9373e3e499e237d3b9f71fdf1413feeTimo Sirainen
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen ret = imap_search_args_build(cmd, args, charset, &sargs);
e2ce8d4a6ac5d82a906178148453e7613fab9ba0Timo Sirainen if (ret <= 0)
9a48c2243fe98ca8393be7908f84d20c634bcdf9Timo Sirainen return ret < 0;
9a48c2243fe98ca8393be7908f84d20c634bcdf9Timo Sirainen
9a48c2243fe98ca8393be7908f84d20c634bcdf9Timo Sirainen return imap_search_start(ctx, sargs, NULL);
9a48c2243fe98ca8393be7908f84d20c634bcdf9Timo Sirainen}
9a48c2243fe98ca8393be7908f84d20c634bcdf9Timo Sirainen