15#include "../../ctdl_module.h"
18#include "../../sysdep.h"
32#include <libcitadel.h>
33#include "../../citadel_defs.h"
34#include "../../server.h"
35#include "../../sysdep_decls.h"
36#include "../../citserver.h"
37#include "../../support.h"
38#include "../../config.h"
39#include "../../user_ops.h"
40#include "../../database.h"
41#include "../../msgbase.h"
42#include "../../internet_addressing.h"
47#include "../../genstamp.h"
60 int num_items, ConstStr *itemlist,
int is_uid) {
70 int need_to_free_msg = 0;
81 if (!strcasecmp(itemlist[0].Key,
"NOT")) {
87 if (!strcasecmp(itemlist[0].Key,
"OR")) {
93 if (!strcasecmp(itemlist[pos].Key,
"ALL")) {
98 else if (!strcasecmp(itemlist[pos].Key,
"ANSWERED")) {
105 else if (!strcasecmp(itemlist[pos].Key,
"BCC")) {
108 need_to_free_msg = 1;
112 if (fieldptr != NULL) {
113 if (bmstrcasestr(fieldptr, itemlist[pos+1].Key)) {
122 else if (!strcasecmp(itemlist[pos].Key,
"BEFORE")) {
125 need_to_free_msg = 1;
138 else if (!strcasecmp(itemlist[pos].Key,
"BODY")) {
151 need_to_free_msg = 1;
163 else if (!strcasecmp(itemlist[pos].Key,
"CC")) {
166 need_to_free_msg = 1;
170 if (fieldptr != NULL) {
171 if (bmstrcasestr(fieldptr, itemlist[pos+1].Key)) {
177 if (fieldptr != NULL) {
178 if (bmstrcasestr(fieldptr, itemlist[pos+1].Key)) {
188 else if (!strcasecmp(itemlist[pos].Key,
"DELETED")) {
195 else if (!strcasecmp(itemlist[pos].Key,
"DRAFT")) {
202 else if (!strcasecmp(itemlist[pos].Key,
"FLAGGED")) {
209 else if (!strcasecmp(itemlist[pos].Key,
"FROM")) {
212 need_to_free_msg = 1;
225 else if (!strcasecmp(itemlist[pos].Key,
"HEADER")) {
234 need_to_free_msg = 1;
239 CC->redirect_buffer = NewStrBufPlain(NULL,
SIZ);
243 if (fieldptr != NULL) {
244 if (bmstrcasestr(fieldptr, itemlist[pos+2].Key)) {
250 FreeStrBuf(&
CC->redirect_buffer);
256 else if (!strcasecmp(itemlist[pos].Key,
"KEYWORD")) {
261 else if (!strcasecmp(itemlist[pos].Key,
"LARGER")) {
264 need_to_free_msg = 1;
274 else if (!strcasecmp(itemlist[pos].Key,
"NEW")) {
281 else if (!strcasecmp(itemlist[pos].Key,
"OLD")) {
288 else if (!strcasecmp(itemlist[pos].Key,
"ON")) {
291 need_to_free_msg = 1;
304 else if (!strcasecmp(itemlist[pos].Key,
"RECENT")) {
311 else if (!strcasecmp(itemlist[pos].Key,
"SEEN")) {
318 else if (!strcasecmp(itemlist[pos].Key,
"SENTBEFORE")) {
321 need_to_free_msg = 1;
334 else if (!strcasecmp(itemlist[pos].Key,
"SENTON")) {
337 need_to_free_msg = 1;
350 else if (!strcasecmp(itemlist[pos].Key,
"SENTSINCE")) {
353 need_to_free_msg = 1;
366 else if (!strcasecmp(itemlist[pos].Key,
"SINCE")) {
369 need_to_free_msg = 1;
382 else if (!strcasecmp(itemlist[pos].Key,
"SMALLER")) {
385 need_to_free_msg = 1;
395 else if (!strcasecmp(itemlist[pos].Key,
"SUBJECT")) {
398 need_to_free_msg = 1;
408 else if (!strcasecmp(itemlist[pos].Key,
"TEXT")) {
411 need_to_free_msg = 1;
414 for (i=
'A'; i<=
'Z'; ++i) {
415 if (bmstrcasestr(msg->
cm_fields[i], itemlist[pos+1].Key)) {
423 else if (!strcasecmp(itemlist[pos].Key,
"TO")) {
426 need_to_free_msg = 1;
438 if (is_msg_in_sequence_set(itemlist[pos].Key, seq)) {
445 else if (!strcasecmp(itemlist[pos].Key,
"UID")) {
446 if (is_msg_in_sequence_set(itemlist[pos+1].Key, Imap->
msgids[seq-1])) {
457 else if (!strcasecmp(itemlist[pos].Key,
"UNANSWERED")) {
464 else if (!strcasecmp(itemlist[pos].Key,
"UNDELETED")) {
471 else if (!strcasecmp(itemlist[pos].Key,
"UNDRAFT")) {
478 else if (!strcasecmp(itemlist[pos].Key,
"UNFLAGGED")) {
485 else if (!strcasecmp(itemlist[pos].Key,
"UNKEYWORD")) {
490 else if (!strcasecmp(itemlist[pos].Key,
"UNSEEN")) {
503 if (pos < num_items) {
506 match = (match ||
imap_do_search_msg(seq, msg, num_items - pos, &itemlist[pos], is_uid));
509 match = (match &&
imap_do_search_msg(seq, msg, num_items - pos, &itemlist[pos], is_uid));
514 if (need_to_free_msg) {
528 int fts_num_msgs = 0;
529 long *fts_msgs = NULL;
537 for (i=0; i<num_items; ++i) {
538 if (itemlist[i].Key[0] ==
'(') {
541 if (itemlist[i].Key[itemlist[i].len-1] ==
')') {
550 if (
CtdlGetConfigInt(
"c_enable_fulltext"))
for (i=0; i<(num_items-1); ++i) {
551 if (!strcasecmp(itemlist[i].Key,
"BODY")) {
553 if (fts_num_msgs > 0) {
554 for (j=0; j < Imap->
num_msgs; ++j) {
557 for (k=0; k<fts_num_msgs; ++k) {
558 if (Imap->
msgids[j] == fts_msgs[k]) {
564 Imap->
flags[j] = Imap->
flags[j] & ~IMAP_SELECTED;
569 for (j=0; j < Imap->
num_msgs; ++j) {
570 Imap->
flags[j] = Imap->
flags[j] & ~IMAP_SELECTED;
583 for (i = 0; i < Imap->
num_msgs; ++i)
586 if (num_results != 0) {
610 IReply(
"BAD invalid parameters");
614 for (i = 0; i <
IMAP->num_msgs; ++i) {
619 IReply(
"OK SEARCH completed");
629 IReply(
"BAD invalid parameters");
633 for (i = 0; i <
IMAP->num_msgs; ++i) {
638 IReply(
"OK UID SEARCH completed");
int CtdlGetConfigInt(char *key)
void CtdlModuleDoSearch(int *num_msgs, long **search_msgs, const char *search_string, const char *func_name)
int imap_do_search_msg(int seq, struct CtdlMessage *supplied_msg, int num_items, ConstStr *itemlist, int is_uid)
void imap_uidsearch(int num_parms, ConstStr *Params)
void imap_do_search(int num_items, ConstStr *itemlist, int is_uid)
void imap_search(int num_parms, ConstStr *Params)
char * rfc822_fetch_field(const char *rfc822, const char *fieldname)
void CM_Free(struct CtdlMessage *msg)
int CtdlOutputPreLoadedMsg(struct CtdlMessage *TheMessage, int mode, int headers_only, int do_proto, int crlf, int flags)
struct CtdlMessage * CtdlFetchMessage(long msgnum, int with_body)
int CM_IsEmpty(struct CtdlMessage *Msg, eMsgField which)
void unbuffer_output(void)