4 * Implements the STORE command in IMAP.
17 #include <sys/types.h>
26 #include "sysdep_decls.h"
27 #include "citserver.h"
30 #include "dynloader.h"
37 #include "internet_addressing.h"
38 #include "serv_imap.h"
39 #include "imap_tools.h"
40 #include "imap_fetch.h"
41 #include "imap_store.h"
50 * imap_do_store() calls imap_do_store_msg() to output the deta of an
51 * individual message, once it has been successfully loaded from disk.
53 void imap_do_store_msg(int seq, struct CtdlMessage *msg,
54 int num_items, char **itemlist, int is_uid) {
62 * imap_store() calls imap_do_store() to do its actual work, once it's
63 * validated and boiled down the request a bit.
65 void imap_do_store(int num_items, char **itemlist, int is_uid) {
67 struct CtdlMessage *msg;
69 if (IMAP->num_msgs > 0)
70 for (i = 0; i < IMAP->num_msgs; ++i)
71 if (IMAP->flags[i] && IMAP_SELECTED) {
72 msg = CtdlFetchMessage(IMAP->msgids[i]);
74 imap_do_store_msg(i+1, msg, num_items,
79 lprintf(1, "IMAP STORE internal error\n");
86 * This function is called by the main command loop.
88 void imap_store(int num_parms, char *parms[]) {
95 cprintf("%s BAD invalid parameters\r\n", parms[0]);
99 if (imap_is_message_set(parms[2])) {
100 imap_pick_range(parms[2], 0);
103 cprintf("%s BAD invalid parameters\r\n", parms[0]);
108 for (i=3; i<num_parms; ++i) {
109 strcat(items, parms[i]);
110 if (i < (num_parms-1)) strcat(items, " ");
113 num_items = imap_extract_data_items(itemlist, items);
115 cprintf("%s BAD invalid data item list\r\n", parms[0]);
119 imap_do_store(num_items, itemlist, 0);
120 cprintf("%s OK STORE completed\r\n", parms[0]);
124 * This function is called by the main command loop.
126 void imap_uidstore(int num_parms, char *parms[]) {
133 cprintf("%s BAD invalid parameters\r\n", parms[0]);
137 if (imap_is_message_set(parms[3])) {
138 imap_pick_range(parms[3], 1);
141 cprintf("%s BAD invalid parameters\r\n", parms[0]);
146 for (i=4; i<num_parms; ++i) {
147 strcat(items, parms[i]);
148 if (i < (num_parms-1)) strcat(items, " ");
151 num_items = imap_extract_data_items(itemlist, items);
153 cprintf("%s BAD invalid data item list\r\n", parms[0]);
157 imap_do_store(num_items, itemlist, 1);
158 cprintf("%s OK UID STORE completed\r\n", parms[0]);