Commit 6bdd3d4a authored by Steve Holme's avatar Steve Holme
Browse files

imap: Removed the need for separate custom request functions

Moved the custom request processing into the LIST command as the logic
is the same.
parent 69eca5c2
Loading
Loading
Loading
Loading
+21 −44
Original line number Diff line number Diff line
@@ -398,7 +398,12 @@ static bool imap_endofresp(struct connectdata *conn, char *line, size_t len,
        break;

      case IMAP_LIST:
        if(!imap_matchresp(line, len, "LIST"))
        if((!imap->custom && !imap_matchresp(line, len, "LIST")) ||
          (imap->custom && !imap_matchresp(line, len, imap->custom) &&
           (strcmp(imap->custom, "STORE") ||
            !imap_matchresp(line, len, "FETCH")) &&
           strcmp(imap->custom, "SELECT") &&
           strcmp(imap->custom, "EXAMINE")))
          return FALSE;
        break;

@@ -412,20 +417,6 @@ static bool imap_endofresp(struct connectdata *conn, char *line, size_t len,
          return FALSE;
        break;

      case IMAP_CUSTOM:
        /* When dealing with a custom command, we are interested in all
           intermediate responses which match the parameter name. The
           exceptions are STORE, which returns untagged responses as FETCH,
           and SELECT and EXAMINE commands, for which no filtering is (or can
           be easily) done. */
        if(!imap_matchresp(line, len, imap->custom) &&
           (strcmp(imap->custom, "STORE") ||
            !imap_matchresp(line, len, "FETCH")) &&
           strcmp(imap->custom, "SELECT") &&
           strcmp(imap->custom, "EXAMINE"))
          return FALSE;
        break;

      /* Ignore other untagged responses */
      default:
        return FALSE;
@@ -493,7 +484,6 @@ static void state(struct connectdata *conn, imapstate newstate)
    "FETCH_FINAL",
    "APPEND",
    "APPEND_FINAL",
    "CUSTOM",
    "LOGOUT",
    /* LAST */
  };
@@ -696,6 +686,11 @@ static CURLcode imap_list(struct connectdata *conn)
  struct IMAP *imap = data->state.proto.imap;
  char *mailbox;

  if(imap->custom)
    /* Send the custom request */
    result = imap_sendf(conn, "%s%s", imap->custom,
                        imap->custom_params ? imap->custom_params : "");
  else {
    /* Make sure the mailbox is in the correct atom format */
    mailbox = imap_atom(imap->mailbox ? imap->mailbox : "");
    if(!mailbox)
@@ -705,6 +700,7 @@ static CURLcode imap_list(struct connectdata *conn)
    result = imap_sendf(conn, "LIST \"%s\" *", mailbox);

    Curl_safefree(mailbox);
  }

  if(!result)
    state(conn, IMAP_LIST);
@@ -803,24 +799,6 @@ static CURLcode imap_append(struct connectdata *conn)
  return result;
}

static CURLcode imap_custom(struct connectdata *conn)
{
  struct IMAP *imap = conn->data->state.proto.imap;

  /* Send the custom request */
  CURLcode result = imap_sendf(conn, "%s%s", imap->custom,
                               imap->custom_params ? imap->custom_params : "");

  if(!result) {
    /* We don't know how much data will be received */
    Curl_pgrsSetDownloadSize(conn->data, -1);

    state(conn, IMAP_CUSTOM);
  }

  return result;
}

/***********************************************************************
 *
 * imap_logout()
@@ -1391,7 +1369,7 @@ static CURLcode imap_state_select_resp(struct connectdata *conn, int imapcode,
      imapc->mailbox = strdup(imap->mailbox);

      if(imap->custom)
        result = imap_custom(conn);
        result = imap_list(conn);
      else
        result = imap_fetch(conn);
    }
@@ -1650,7 +1628,6 @@ static CURLcode imap_statemach_act(struct connectdata *conn)
      break;

    case IMAP_LIST:
    case IMAP_CUSTOM:
      result = imap_state_list_resp(conn, imapcode, imapc->state);
      break;

@@ -1891,7 +1868,7 @@ static CURLcode imap_perform(struct connectdata *conn, bool *connected,
    result = imap_append(conn);
  else if(imap->custom && (selected || !imap->mailbox))
    /* Custom command using the same mailbox or no mailbox */
    result = imap_custom(conn);
    result = imap_list(conn);
  else if(!imap->custom && selected && imap->uid)
    /* FETCH from the same mailbox */
    result = imap_fetch(conn);
+0 −1
Original line number Diff line number Diff line
@@ -51,7 +51,6 @@ typedef enum {
  IMAP_FETCH_FINAL,
  IMAP_APPEND,
  IMAP_APPEND_FINAL,
  IMAP_CUSTOM,
  IMAP_LOGOUT,
  IMAP_LAST          /* never used */
} imapstate;