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"));
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)
{