X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fimap%2Fimap_store.c;h=429f8edbb980c8162eb9bd62b068f14e07c425e3;hb=7a9b0685e406cc83597171cc39d008c7e5459ca8;hp=9750a6538d899d31d8e27f087c568b3e384b3ae2;hpb=8c47559cb5ae97ec0fa35660ee16fd61a9451c72;p=citadel.git diff --git a/citadel/modules/imap/imap_store.c b/citadel/modules/imap/imap_store.c index 9750a6538..429f8edbb 100644 --- a/citadel/modules/imap/imap_store.c +++ b/citadel/modules/imap/imap_store.c @@ -1,28 +1,25 @@ /* - * $Id$ - * * Implements the STORE command in IMAP. * - * * Copyright (c) 2001-2009 by the citadel.org team * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. + * This program is open source software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include "ctdl_module.h" -#include "sysdep.h" #include #include #include @@ -31,18 +28,7 @@ #include #include #include - -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif - +#include #include #include #include @@ -54,10 +40,9 @@ #include "citserver.h" #include "support.h" #include "config.h" -#include "room_ops.h" #include "user_ops.h" -#include "policy.h" #include "database.h" +#include "room_ops.h" #include "msgbase.h" #include "internet_addressing.h" #include "serv_imap.h" @@ -67,41 +52,36 @@ #include "genstamp.h" - - - - /* * imap_do_store() calls imap_do_store_msg() to tweak the settings of * an individual message. * * We also implement the ".SILENT" protocol option here. :( */ -void imap_do_store_msg(int seq, char *oper, unsigned int bits_to_twiddle) { - +void imap_do_store_msg(int seq, const char *oper, unsigned int bits_to_twiddle) { + citimap *Imap = IMAP; if (!strncasecmp(oper, "FLAGS", 5)) { - IMAP->flags[seq] &= IMAP_MASK_SYSTEM; - IMAP->flags[seq] |= bits_to_twiddle; + Imap->flags[seq] &= IMAP_MASK_SYSTEM; + Imap->flags[seq] |= bits_to_twiddle; } else if (!strncasecmp(oper, "+FLAGS", 6)) { - IMAP->flags[seq] |= bits_to_twiddle; + Imap->flags[seq] |= bits_to_twiddle; } else if (!strncasecmp(oper, "-FLAGS", 6)) { - IMAP->flags[seq] &= (~bits_to_twiddle); + Imap->flags[seq] &= (~bits_to_twiddle); } } - /* * imap_store() calls imap_do_store() to perform the actual bit twiddling * on the flags. */ -void imap_do_store(int num_items, char **itemlist) { +void imap_do_store(citimap_command *Cmd) { int i, j; unsigned int bits_to_twiddle = 0; - char *oper; + const char *oper; char flag[32]; char whichflags[256]; char num_flags; @@ -109,10 +89,11 @@ void imap_do_store(int num_items, char **itemlist) { long *ss_msglist; int num_ss = 0; int last_item_twiddled = (-1); + citimap *Imap = IMAP; - if (num_items < 2) return; - oper = itemlist[0]; - if (bmstrcasestr(oper, ".SILENT")) { + if (Cmd->num_parms < 2) return; + oper = Cmd->Params[0].Key; + if (cbmstrcasestr(oper, ".SILENT")) { silent = 1; } @@ -120,14 +101,14 @@ void imap_do_store(int num_items, char **itemlist) { * ss_msglist is an array of message numbers to manipulate. We * are going to supply this array to CtdlSetSeen() later. */ - ss_msglist = malloc(IMAP->num_msgs * sizeof(long)); + ss_msglist = malloc(Imap->num_msgs * sizeof(long)); if (ss_msglist == NULL) return; /* * Ok, go ahead and parse the flags. */ - for (i=1; inum_parms; ++i) {///TODO: why strcpy? + strcpy(whichflags, Cmd->Params[i].Key); if (whichflags[0]=='(') { safestrncpy(whichflags, &whichflags[1], sizeof whichflags); @@ -162,18 +143,18 @@ void imap_do_store(int num_items, char **itemlist) { } } - if (IMAP->num_msgs > 0) { - for (i = 0; i < IMAP->num_msgs; ++i) { - if (IMAP->flags[i] & IMAP_SELECTED) { + if (Imap->num_msgs > 0) { + for (i = 0; i < Imap->num_msgs; ++i) { + if (Imap->flags[i] & IMAP_SELECTED) { last_item_twiddled = i; - ss_msglist[num_ss++] = IMAP->msgids[i]; + ss_msglist[num_ss++] = Imap->msgids[i]; imap_do_store_msg(i, oper, bits_to_twiddle); if (!silent) { - cprintf("* %d FETCH (", i+1); + IAPrintf("* %d FETCH (", i+1); imap_fetch_flags(i); - cprintf(")\r\n"); + IAPuts(")\r\n"); } } @@ -187,7 +168,7 @@ void imap_do_store(int num_items, char **itemlist) { if (bits_to_twiddle & IMAP_SEEN) { CtdlSetSeen(ss_msglist, num_ss, - ((IMAP->flags[last_item_twiddled] & IMAP_SEEN) ? 1 : 0), + ((Imap->flags[last_item_twiddled] & IMAP_SEEN) ? 1 : 0), ctdlsetseen_seen, NULL, NULL ); @@ -195,7 +176,7 @@ void imap_do_store(int num_items, char **itemlist) { if (bits_to_twiddle & IMAP_ANSWERED) { CtdlSetSeen(ss_msglist, num_ss, - ((IMAP->flags[last_item_twiddled] & IMAP_ANSWERED) ? 1 : 0), + ((Imap->flags[last_item_twiddled] & IMAP_ANSWERED) ? 1 : 0), ctdlsetseen_answered, NULL, NULL ); @@ -204,92 +185,85 @@ void imap_do_store(int num_items, char **itemlist) { } free(ss_msglist); - - /* - * The following two commands implement "instant expunge" if enabled. - */ - if (config.c_instant_expunge) { - imap_do_expunge(); - imap_rescan_msgids(); - } - + imap_do_expunge(); // Citadel always expunges immediately. + imap_rescan_msgids(); } /* * This function is called by the main command loop. */ -void imap_store(int num_parms, char *parms[]) { - char items[1024]; - char *itemlist[256]; +void imap_store(int num_parms, ConstStr *Params) { + citimap_command Cmd; int num_items; - int i; if (num_parms < 3) { - cprintf("%s BAD invalid parameters\r\n", parms[0]); + IReply("BAD invalid parameters"); return; } - if (imap_is_message_set(parms[2])) { - imap_pick_range(parms[2], 0); + if (imap_is_message_set(Params[2].Key)) { + imap_pick_range(Params[2].Key, 0); } else { - cprintf("%s BAD invalid parameters\r\n", parms[0]); + IReply("BAD invalid parameters"); return; } - strcpy(items, ""); - for (i=3; iCmd.CmdBuf)); + MakeStringOf(Cmd.CmdBuf, 3); - num_items = imap_extract_data_items(itemlist, items); + num_items = imap_extract_data_items(&Cmd); if (num_items < 1) { - cprintf("%s BAD invalid data item list\r\n", parms[0]); + IReply("BAD invalid data item list"); + FreeStrBuf(&Cmd.CmdBuf); + free(Cmd.Params); return; } - imap_do_store(num_items, itemlist); - cprintf("%s OK STORE completed\r\n", parms[0]); + imap_do_store(&Cmd); + IReply("OK STORE completed"); + FreeStrBuf(&Cmd.CmdBuf); + free(Cmd.Params); } /* * This function is called by the main command loop. */ -void imap_uidstore(int num_parms, char *parms[]) { - char items[1024]; - char *itemlist[256]; +void imap_uidstore(int num_parms, ConstStr *Params) { + citimap_command Cmd; int num_items; - int i; if (num_parms < 4) { - cprintf("%s BAD invalid parameters\r\n", parms[0]); + IReply("BAD invalid parameters"); return; } - if (imap_is_message_set(parms[3])) { - imap_pick_range(parms[3], 1); + if (imap_is_message_set(Params[3].Key)) { + imap_pick_range(Params[3].Key, 1); } else { - cprintf("%s BAD invalid parameters\r\n", parms[0]); + IReply("BAD invalid parameters"); return; } - strcpy(items, ""); - for (i=4; iCmd.CmdBuf)); + MakeStringOf(Cmd.CmdBuf, 4); - num_items = imap_extract_data_items(itemlist, items); + num_items = imap_extract_data_items(&Cmd); if (num_items < 1) { - cprintf("%s BAD invalid data item list\r\n", parms[0]); + IReply("BAD invalid data item list"); + FreeStrBuf(&Cmd.CmdBuf); + free(Cmd.Params); return; } - imap_do_store(num_items, itemlist); - cprintf("%s OK UID STORE completed\r\n", parms[0]); + imap_do_store(&Cmd); + IReply("OK UID STORE completed"); + FreeStrBuf(&Cmd.CmdBuf); + free(Cmd.Params); }