Commit 59c71c7f authored by Jiri Hruska's avatar Jiri Hruska Committed by Steve Holme
Browse files

imap: Added support for parsing the UIDVALIDITY property

Added support for parsing the UIDVALIDITY property from the SELECT
response and storing it in the per-connection structure.
parent 58efa46a
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
@@ -395,6 +395,11 @@ static bool imap_endofresp(struct connectdata *conn, char *line, size_t len,
          return FALSE;
        break;

      case IMAP_SELECT:
        /* SELECT is special in that its untagged responses does not have a
           common prefix so accept anything! */
        break;

      case IMAP_FETCH:
        if(!imap_matchresp(line, len, "FETCH"))
          return FALSE;
@@ -666,8 +671,12 @@ static CURLcode imap_select(struct connectdata *conn)
  CURLcode result = CURLE_OK;
  struct SessionHandle *data = conn->data;
  struct IMAP *imap = data->state.proto.imap;
  struct imap_conn *imapc = &conn->proto.imapc;
  char *mailbox;

  /* Invalidate old information in case we are switching mailboxes */
  Curl_safefree(imapc->mailbox_uidvalidity);

  mailbox = imap_atom(imap->mailbox ? imap->mailbox : "");
  if(!mailbox)
    result = CURLE_OUT_OF_MEMORY;
@@ -1207,10 +1216,20 @@ static CURLcode imap_state_select_resp(struct connectdata *conn,
{
  CURLcode result = CURLE_OK;
  struct SessionHandle *data = conn->data;
  struct imap_conn *imapc = &conn->proto.imapc;
  const char *line = data->state.buffer;
  char tmp[20];

  (void)instate; /* no use for this yet */

  if(imapcode != 'O') {
  if(imapcode == '*') {
    /* See if this is an UIDVALIDITY response */
    if(sscanf(line + 2, "OK [UIDVALIDITY %19[0123456789]]", tmp) == 1) {
      Curl_safefree(imapc->mailbox_uidvalidity);
      imapc->mailbox_uidvalidity = strdup(tmp);
    }
  }
  else if(imapcode != 'O') {
    failf(data, "Select failed");
    result = CURLE_LOGIN_DENIED;
  }