This commit is contained in:
Steve Holme 2012-12-28 21:41:28 +00:00
Родитель 2255ac52f7
Коммит ffa62e5bab
1 изменённых файлов: 76 добавлений и 77 удалений

Просмотреть файл

@ -319,14 +319,6 @@ static char* imap_atom(const char* str)
return newstr; return newstr;
} }
/* For the IMAP "protocol connect" and "doing" phases only */
static int imap_getsock(struct connectdata *conn,
curl_socket_t *socks,
int numsocks)
{
return Curl_pp_getsock(&conn->proto.imapc.pp, socks, numsocks);
}
/* Function that checks for an ending imap status code at the start of the /* Function that checks for an ending imap status code at the start of the
given string. */ given string. */
static int imap_endofresp(struct pingpong *pp, int *resp) static int imap_endofresp(struct pingpong *pp, int *resp)
@ -404,6 +396,14 @@ static CURLcode imap_state_login(struct connectdata *conn)
return CURLE_OK; return CURLE_OK;
} }
/* For the IMAP "protocol connect" and "doing" phases only */
static int imap_getsock(struct connectdata *conn,
curl_socket_t *socks,
int numsocks)
{
return Curl_pp_getsock(&conn->proto.imapc.pp, socks, numsocks);
}
#ifdef USE_SSL #ifdef USE_SSL
static void imap_to_imaps(struct connectdata *conn) static void imap_to_imaps(struct connectdata *conn)
{ {
@ -431,9 +431,7 @@ static CURLcode imap_state_servergreet_resp(struct connectdata *conn,
if(data->set.use_ssl && !conn->ssl[FIRSTSOCKET].use) { if(data->set.use_ssl && !conn->ssl[FIRSTSOCKET].use) {
/* We don't have a SSL/TLS connection yet, but SSL is requested. Switch /* We don't have a SSL/TLS connection yet, but SSL is requested. Switch
to TLS connection now */ to TLS connection now */
const char *str; const char *str = getcmdid(conn);
str = getcmdid(conn);
result = imap_sendf(conn, str, "%s STARTTLS", str); result = imap_sendf(conn, str, "%s STARTTLS", str);
state(conn, IMAP_STARTTLS); state(conn, IMAP_STARTTLS);
} }
@ -517,7 +515,69 @@ static CURLcode imap_state_login_resp(struct connectdata *conn,
return result; return result;
} }
/* for the (first line of) FETCH BODY[TEXT] response */ /* Start the DO phase */
static CURLcode imap_select(struct connectdata *conn)
{
CURLcode result = CURLE_OK;
struct imap_conn *imapc = &conn->proto.imapc;
const char *str = getcmdid(conn);
result = imap_sendf(conn, str, "%s SELECT %s", str,
imapc->mailbox?imapc->mailbox:"");
if(result)
return result;
state(conn, IMAP_SELECT);
return result;
}
static CURLcode imap_fetch(struct connectdata *conn)
{
CURLcode result = CURLE_OK;
const char *str = getcmdid(conn);
/* TODO: make this select the correct mail
* Use "1 body[text]" to get the full mail body of mail 1
*/
result = imap_sendf(conn, str, "%s FETCH 1 BODY[TEXT]", str);
if(result)
return result;
/*
* When issued, the server will respond with a single line similar to
* '* 1 FETCH (BODY[TEXT] {2021}'
*
* Identifying the fetch and how many bytes of contents we can expect. We
* must extract that number before continuing to "download as usual".
*/
state(conn, IMAP_FETCH);
return result;
}
/* For SELECT responses */
static CURLcode imap_state_select_resp(struct connectdata *conn,
int imapcode,
imapstate instate)
{
CURLcode result = CURLE_OK;
struct SessionHandle *data = conn->data;
(void)instate; /* no use for this yet */
if(imapcode != 'O') {
failf(data, "Select failed");
result = CURLE_LOGIN_DENIED;
}
else
result = imap_fetch(conn);
return result;
}
/* For the (first line of) FETCH BODY[TEXT] response */
static CURLcode imap_state_fetch_resp(struct connectdata *conn, static CURLcode imap_state_fetch_resp(struct connectdata *conn,
int imapcode, int imapcode,
imapstate instate) imapstate instate)
@ -600,68 +660,6 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn,
return result; return result;
} }
/* start the DO phase */
static CURLcode imap_select(struct connectdata *conn)
{
CURLcode result = CURLE_OK;
struct imap_conn *imapc = &conn->proto.imapc;
const char *str;
str = getcmdid(conn);
result = imap_sendf(conn, str, "%s SELECT %s", str,
imapc->mailbox?imapc->mailbox:"");
if(result)
return result;
state(conn, IMAP_SELECT);
return result;
}
static CURLcode imap_fetch(struct connectdata *conn)
{
CURLcode result = CURLE_OK;
const char *str;
str = getcmdid(conn);
/* TODO: make this select the correct mail
* Use "1 body[text]" to get the full mail body of mail 1
*/
result = imap_sendf(conn, str, "%s FETCH 1 BODY[TEXT]", str);
if(result)
return result;
/*
* When issued, the server will respond with a single line similar to
* '* 1 FETCH (BODY[TEXT] {2021}'
*
* Identifying the fetch and how many bytes of contents we can expect. We
* must extract that number before continuing to "download as usual".
*/
state(conn, IMAP_FETCH);
return result;
}
/* for SELECT responses */
static CURLcode imap_state_select_resp(struct connectdata *conn,
int imapcode,
imapstate instate)
{
CURLcode result = CURLE_OK;
struct SessionHandle *data = conn->data;
(void)instate; /* no use for this yet */
if(imapcode != 'O') {
failf(data, "Select failed");
result = CURLE_LOGIN_DENIED;
}
else
result = imap_fetch(conn);
return result;
}
static CURLcode imap_statemach_act(struct connectdata *conn) static CURLcode imap_statemach_act(struct connectdata *conn)
{ {
CURLcode result; CURLcode result;
@ -969,9 +967,7 @@ static CURLcode imap_do(struct connectdata *conn, bool *done)
static CURLcode imap_logout(struct connectdata *conn) static CURLcode imap_logout(struct connectdata *conn)
{ {
CURLcode result = CURLE_OK; CURLcode result = CURLE_OK;
const char *str; const char *str = getcmdid(conn);
str = getcmdid(conn);
result = imap_sendf(conn, str, "%s LOGOUT", str, NULL); result = imap_sendf(conn, str, "%s LOGOUT", str, NULL);
if(result) if(result)
@ -1053,6 +1049,9 @@ static CURLcode imap_doing(struct connectdata *conn, bool *dophase_done)
{ {
CURLcode result = imap_multi_statemach(conn, dophase_done); CURLcode result = imap_multi_statemach(conn, dophase_done);
if(result)
DEBUGF(infof(conn->data, "DO phase failed\n"));
if(*dophase_done) { if(*dophase_done) {
result = imap_dophase_done(conn, FALSE /* not connected */); result = imap_dophase_done(conn, FALSE /* not connected */);