summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Holme <steve_holme@hotmail.com>2013-03-09 13:26:59 +0000
committerSteve Holme <steve_holme@hotmail.com>2013-03-09 13:27:16 +0000
commit6bdd3d4a88c58611460dc24a1a04e987c614c79d (patch)
tree7542044f7926d72899aa635897d470a6b0eedc1f
parent69eca5c25242f2451ecc2a68af4a76fbe49c5db2 (diff)
downloadcurl-6bdd3d4a88c58611460dc24a1a04e987c614c79d.tar.gz
imap: Removed the need for separate custom request functions
Moved the custom request processing into the LIST command as the logic is the same.
-rw-r--r--lib/imap.c65
-rw-r--r--lib/imap.h1
2 files changed, 21 insertions, 45 deletions
diff --git a/lib/imap.c b/lib/imap.c
index 3be8b11dd..cfdc98f7d 100644
--- a/lib/imap.c
+++ b/lib/imap.c
@@ -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,15 +686,21 @@ static CURLcode imap_list(struct connectdata *conn)
struct IMAP *imap = data->state.proto.imap;
char *mailbox;
- /* Make sure the mailbox is in the correct atom format */
- mailbox = imap_atom(imap->mailbox ? imap->mailbox : "");
- if(!mailbox)
- return CURLE_OUT_OF_MEMORY;
+ 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)
+ return CURLE_OUT_OF_MEMORY;
- /* Send the LIST command */
- result = imap_sendf(conn, "LIST \"%s\" *", mailbox);
+ /* Send the LIST command */
+ result = imap_sendf(conn, "LIST \"%s\" *", mailbox);
- Curl_safefree(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);
diff --git a/lib/imap.h b/lib/imap.h
index d290c3bc2..caf400d7a 100644
--- a/lib/imap.h
+++ b/lib/imap.h
@@ -51,7 +51,6 @@ typedef enum {
IMAP_FETCH_FINAL,
IMAP_APPEND,
IMAP_APPEND_FINAL,
- IMAP_CUSTOM,
IMAP_LOGOUT,
IMAP_LAST /* never used */
} imapstate;