X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=imap%2Fcommand.c;h=ac192981d11eb6fffd74c66aab305f2cc9653c8f;hp=45d6ba313625f13ff543f232006679c3fa82b6b9;hb=355d6c883e8aafb8f424c22aa576cf8262ed9e58;hpb=bbc4fd52516a8afefbd14c77e34f8389d6f0a6ed diff --git a/imap/command.c b/imap/command.c index 45d6ba3..ac19298 100644 --- a/imap/command.c +++ b/imap/command.c @@ -40,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", @@ -107,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")); @@ -353,6 +357,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")); @@ -380,6 +386,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) {