16#include "../../sysdep.h"
30#include <libcitadel.h>
31#include "../../citadel.h"
32#include "../../server.h"
33#include "../../sysdep_decls.h"
34#include "../../citserver.h"
35#include "../../support.h"
36#include "../../config.h"
37#include "../../user_ops.h"
38#include "../../database.h"
39#include "../../msgbase.h"
40#include "../../room_ops.h"
41#include "../../internet_addressing.h"
46#include "../../genstamp.h"
47#include "../../ctdl_module.h"
62 long *selected_msgs = NULL;
70 if (i != 0)
return(i);
76 if (selected_msgs == NULL)
return(-1);
78 for (i = 0; i < Imap->
num_msgs; ++i) {
80 selected_msgs[num_selected++] = Imap->
msgids[i];
84 if (num_selected > 0) {
90 if (num_selected == 0) {
95 long *seen_yes = NULL;
99 long *answ_yes = NULL;
100 int num_answ_yes = 0;
101 long *answ_no = NULL;
104 seen_yes =
malloc(num_selected *
sizeof(
long));
105 seen_no =
malloc(num_selected *
sizeof(
long));
106 answ_yes =
malloc(num_selected *
sizeof(
long));
107 answ_no =
malloc(num_selected *
sizeof(
long));
109 for (i = 0; i < Imap->
num_msgs; ++i) {
112 seen_yes[num_seen_yes++] = Imap->
msgids[i];
115 seen_no[num_seen_no++] = Imap->
msgids[i];
118 answ_yes[num_answ_yes++] = Imap->
msgids[i];
121 answ_no[num_answ_no++] = Imap->
msgids[i];
154 StrBuf *MsgsCopied = NewStrBuf();
156 for (i = 0; i < Imap->
num_msgs; ++i) {
158 if (StrLength(MsgsCopied) > 0) {
159 StrBufAppendBufPlain(MsgsCopied, HKEY(
","), 0);
161 StrBufAppendPrintf(MsgsCopied,
"%ld", Imap->
msgids[i]);
165 if (StrLength(MsgsCopied) > 0) {
169 FreeStrBuf(&MsgsCopied);
179 if (num_parms != 4) {
180 IReply(
"BAD invalid parameters");
188 IReply(
"BAD invalid parameters");
196 IAPuts(
"COPY completed\r\n");
208 if (num_parms != 5) {
209 IReply(
"BAD invalid parameters");
217 IReply(
"BAD invalid parameters");
224 IAPuts(
"UID COPY completed\r\n");
227 IReply(
"NO UID COPY failed");
240 char this_flag[
sizeof flags];
243 if (new_message_flags == NULL)
return;
244 if (IsEmptyStr(new_message_flags))
return;
246 safestrncpy(flags, new_message_flags,
sizeof flags);
248 for (i=0; i<num_tokens(flags,
' '); ++i) {
249 extract_token(this_flag, flags, i,
' ',
sizeof this_flag);
250 if (this_flag[0] ==
'\\') strcpy(this_flag, &this_flag[1]);
251 if (!strcasecmp(this_flag,
"Seen")) {
255 if (!strcasecmp(this_flag,
"Answered")) {
269 long new_msgnum = (-1L);
277 char new_message_flags[
SIZ];
281 IReply(
"BAD usage error");
285 if ( (Params[num_parms-1].Key[0] !=
'{')
286 || (Params[num_parms-1].Key[Params[num_parms-1].len-1] !=
'}') ) {
287 IReply(
"BAD no message literal supplied");
291 *new_message_flags =
'\0';
292 if (num_parms >= 5) {
293 for (i=3; i<num_parms; ++i) {
294 strcat(new_message_flags, Params[i].Key);
295 strcat(new_message_flags,
" ");
297 stripallbut(new_message_flags,
'(',
')');
306 literal_length = atol(&Params[num_parms-1].Key[1]);
307 if (literal_length < 1) {
308 IReply(
"BAD Message length must be at least 1.");
318 IReply(
"NO Cannot allocate memory.");
322 IAPrintf(
"+ Transmit message now.\r\n");
329 IReply(
"NO Read failed.");
340 syslog(LOG_DEBUG,
"Converting CRLF to LF");
343 syslog(LOG_DEBUG,
"Converting message format");
348 IReply(
"NO Invalid mailbox name or access denied");
357 strcpy(savedroom,
CC->room.QRname);
386 if (new_msgnum >= 0L) {
409 if (IsEmptyStr(new_message_flags)) {
int CtdlGetConfigInt(char *key)
int CtdlGetRoom(struct ctdlroom *qrbuf, const char *room_name)
void CtdlUserGoto(char *where, int display_result, int transiently, int *msgs, int *new, long *oldest, long *newest)
void imap_pick_range(const char *supplied_range, int is_uid)
void imap_append(int num_parms, ConstStr *Params)
void imap_output_copyuid_response(citimap *Imap)
void imap_uidcopy(int num_parms, ConstStr *Params)
int imap_do_copy(const char *destination_folder)
void imap_copy(int num_parms, ConstStr *Params)
void imap_do_append_flags(long new_msgnum, char *new_message_flags)
struct CtdlMessage * convert_internet_message_buf(StrBuf **rfc822)
void CM_Free(struct CtdlMessage *msg)
long CtdlSubmitMsg(struct CtdlMessage *msg, struct recptypes *recps, const char *force)
void CM_SetField(struct CtdlMessage *Msg, eMsgField which, const char *buf, long length)
void CtdlSetSeen(long *target_msgnums, int num_target_msgnums, int target_setting, int which_set, struct ctdluser *which_user, struct ctdlroom *which_room)
int CtdlSaveMsgPointersInRoom(char *roomname, long newmsgidlist[], int num_newmsgs, int do_repl_check, struct CtdlMessage *supplied_msg, int suppress_refcount_adj)
int CtdlDoIHavePermissionToPostInThisRoom(char *errmsgbuf, size_t n, PostType PostPublic, int is_reply)
int imap_grabroom(char *returned_roomname, const char *foldername, int zapped_ok)
void imap_free_transmitted_message(void)
#define GLOBAL_UIDVALIDITY_VALUE
StrBuf * TransmittedMessage
int client_getln(char *buf, int bufsize)
int client_read_blob(StrBuf *Target, int bytes, int timeout)