diff options
author | Jiri Hruska <jirka@fud.cz> | 2013-02-27 19:02:53 +0100 |
---|---|---|
committer | Steve Holme <steve_holme@hotmail.com> | 2013-02-27 20:08:02 +0000 |
commit | b644c47192fb4c16297149544c5a647d916f7b10 (patch) | |
tree | b1144036959ea53d49f8f701c8031d2e212d9565 | |
parent | d03aa16164dba606e9d6a6bfef741ebb1bedfd7f (diff) |
imap: Added skipping of SELECT command if already in the same mailbox
Added storage and checking of the last mailbox userd to prevent
unnecessary switching.
-rw-r--r-- | lib/imap.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/lib/imap.c b/lib/imap.c index 38e25355b..247d37779 100644 --- a/lib/imap.c +++ b/lib/imap.c @@ -674,7 +674,8 @@ static CURLcode imap_select(struct connectdata *conn) struct imap_conn *imapc = &conn->proto.imapc; char *mailbox; - /* Invalidate old information in case we are switching mailboxes */ + /* Invalidate old information as we are switching mailboxes */ + Curl_safefree(imapc->mailbox); Curl_safefree(imapc->mailbox_uidvalidity); mailbox = imap_atom(imap->mailbox ? imap->mailbox : ""); @@ -1241,8 +1242,12 @@ static CURLcode imap_state_select_resp(struct connectdata *conn, failf(conn->data, "Mailbox UIDVALIDITY has changed"); result = CURLE_REMOTE_FILE_NOT_FOUND; } - else + else { + /* Note the currently opened mailbox on this connection */ + imapc->mailbox = strdup(imap->mailbox); + result = imap_fetch(conn); + } } return result; @@ -1592,6 +1597,9 @@ static CURLcode imap_perform(struct connectdata *conn, bool *connected, { /* This is IMAP and no proxy */ CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + struct IMAP *imap = data->state.proto.imap; + struct imap_conn *imapc = &conn->proto.imapc; DEBUGF(infof(conn->data, "DO phase starts\n")); @@ -1604,7 +1612,17 @@ static CURLcode imap_perform(struct connectdata *conn, bool *connected, *dophase_done = FALSE; /* not done yet */ /* Start the first command in the DO phase */ - result = imap_select(conn); + if(imap->mailbox && imapc->mailbox && + !strcmp(imap->mailbox, imapc->mailbox) && + (!imap->uidvalidity || !imapc->mailbox_uidvalidity || + !strcmp(imap->uidvalidity, imapc->mailbox_uidvalidity))) { + /* This mailbox (with the same UIDVALIDITY if set) is already selected on + this connection so go straight to the next fetch operation */ + result = imap_fetch(conn); + } + else + result = imap_select(conn); + if(result) return result; |