# include "config.h"
#endif
-#include "mutt.h"
-#include "imap_private.h"
-#include "message.h"
-#include "mx.h"
-
#include "lib/mem.h"
#include "lib/intl.h"
#include "lib/debug.h"
+#include "mutt.h"
+#include "message.h"
+#include "mx.h"
+#include "ascii.h"
+#include "imap_private.h"
+
#include <ctype.h>
#include <stdlib.h>
static void cmd_parse_lsub (IMAP_DATA* idata, char* s);
static void cmd_parse_fetch (IMAP_DATA * idata, char *s);
static void cmd_parse_myrights (IMAP_DATA * idata, char *s);
+static void cmd_parse_search (IMAP_DATA* idata, char* s);
static char *Capabilities[] = {
"IMAP4",
debug_print (3, ("grew buffer to %u bytes\n", cmd->blen));
}
+ if (len)
+ len--;
+
c = mutt_socket_readln (cmd->buf + len, cmd->blen - len, idata->conn);
if (c <= 0) {
debug_print (1, ("Error reading server response.\n"));
return IMAP_CMD_BAD;
/* server demands a continuation response from us */
- if (!ascii_strncmp (cmd->buf, "+ ", 2)) {
+ if (cmd->buf[0] == '+')
return IMAP_CMD_RESPOND;
- }
/* tagged completion code */
if (!ascii_strncmp (cmd->buf, cmd->seq, SEQLEN)) {
cmd_parse_lsub (idata, s);
else if (ascii_strncasecmp ("MYRIGHTS", s, 8) == 0)
cmd_parse_myrights (idata, s);
+ else if (ascii_strncasecmp ("SEARCH", s, 6) == 0)
+ cmd_parse_search (idata, s);
else if (ascii_strncasecmp ("BYE", s, 3) == 0) {
debug_print (2, ("Handling BYE\n"));
return 0;
}
+/* This should be optimised (eg with a tree or hash) */
+static int uid2msgno (IMAP_DATA* idata, unsigned int uid) {
+ int i;
+
+ for (i = 0; i < idata->ctx->msgcount; i++) {
+ HEADER* h = idata->ctx->hdrs[i];
+ if (HEADER_DATA(h)->uid == uid)
+ return i;
+ }
+
+ return -1;
+}
+
+/* cmd_parse_search: store SEARCH response for later use */
+static void cmd_parse_search (IMAP_DATA* idata, char* s) {
+ unsigned int uid;
+ int msgno;
+
+ debug_print (2, ("Handling SEARCH\n"));
+
+ while ((s = imap_next_word (s)) && *s != '\0') {
+ uid = atoi (s);
+ msgno = uid2msgno (idata, uid);
+
+ if (msgno >= 0)
+ idata->ctx->hdrs[uid2msgno (idata, uid)]->matched = 1;
+ }
+}
+
/* cmd_make_sequence: make a tag suitable for starting an IMAP command */
static void cmd_make_sequence (IMAP_DATA * idata)
{