imap: Code tidy up prior to adding support for the CAPABILITY command

* Changing the order of the state machine to represent the order in
  which commands are sent to the server.

* Reworking the imap_endofresp() function as the FETCH response doesn't
  include the command id and shouldn't be part of the length comparison
  that takes into account the id string.
This commit is contained in:
Steve Holme 2012-12-30 12:44:09 +00:00
parent c02449ca53
commit bd8ae68006
2 changed files with 13 additions and 10 deletions

View File

@ -31,10 +31,10 @@ typedef enum {
IMAP_STOP, /* do nothing state, stops the state machine */
IMAP_SERVERGREET, /* waiting for the initial greeting immediately after
a connect */
IMAP_LOGIN,
IMAP_STARTTLS,
IMAP_UPGRADETLS, /* asynchronously upgrade the connection to SSL/TLS
(multi mode only) */
IMAP_LOGIN,
IMAP_SELECT,
IMAP_FETCH,
IMAP_LOGOUT,

View File

@ -329,15 +329,18 @@ static int imap_endofresp(struct pingpong *pp, int *resp)
const char *id = imapc->idstr;
size_t id_len = strlen(id);
/* Do we have a generic command response? */
if(len >= id_len + 3) {
if(!memcmp(id, line, id_len) && (line[id_len] == ' ') ) {
/* end of response */
*resp = line[id_len+1]; /* O, N or B */
return TRUE;
}
else if((imapc->state == IMAP_FETCH) &&
!memcmp("* ", line, 2) ) {
/* FETCH response we're interested in */
}
/* Are we processing FETCH command responses? */
if(imapc->state == IMAP_FETCH) {
/* Do we have a valid response? */
if(len >= 2 && !memcmp("* ", line, 2)) {
*resp = '*';
return TRUE;
}
@ -356,9 +359,9 @@ static void state(struct connectdata *conn,
static const char * const names[]={
"STOP",
"SERVERGREET",
"LOGIN",
"STARTTLS",
"UPGRADETLS",
"LOGIN",
"SELECT",
"FETCH",
"LOGOUT",
@ -687,14 +690,14 @@ static CURLcode imap_statemach_act(struct connectdata *conn)
result = imap_state_servergreet_resp(conn, imapcode, imapc->state);
break;
case IMAP_LOGIN:
result = imap_state_login_resp(conn, imapcode, imapc->state);
break;
case IMAP_STARTTLS:
result = imap_state_starttls_resp(conn, imapcode, imapc->state);
break;
case IMAP_LOGIN:
result = imap_state_login_resp(conn, imapcode, imapc->state);
break;
case IMAP_FETCH:
result = imap_state_fetch_resp(conn, imapcode, imapc->state);
break;