X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=imap%2Fcommand.c;h=49e4441962d2b56c9f070bbf158ec64c030d669d;hp=989bd6766bb3f7c49cbc50925388d6c00e0114be;hb=5f6b586de5a46f2359a4fc392fd89f1716d847a3;hpb=be393b838c5e0b8dfe9bedcc7a4a63f05caae7c4 diff --git a/imap/command.c b/imap/command.c index 989bd67..49e4441 100644 --- a/imap/command.c +++ b/imap/command.c @@ -16,15 +16,16 @@ # 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 #include @@ -39,6 +40,7 @@ static void cmd_parse_expunge (IMAP_DATA * idata, const char *s); 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", @@ -106,6 +108,9 @@ int imap_cmd_step (IMAP_DATA * idata) 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")); @@ -134,9 +139,8 @@ int imap_cmd_step (IMAP_DATA * idata) 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)) { @@ -352,6 +356,8 @@ static int cmd_handle_untagged (IMAP_DATA * idata) 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")); @@ -379,6 +385,35 @@ static int cmd_handle_untagged (IMAP_DATA * idata) 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) {