diff options
Diffstat (limited to 'camel/providers/pop3')
-rw-r--r-- | camel/providers/pop3/camel-pop3-engine.c | 40 | ||||
-rw-r--r-- | camel/providers/pop3/camel-pop3-engine.h | 11 | ||||
-rw-r--r-- | camel/providers/pop3/camel-pop3-provider.c | 2 | ||||
-rw-r--r-- | camel/providers/pop3/camel-pop3-store.c | 6 |
4 files changed, 38 insertions, 21 deletions
diff --git a/camel/providers/pop3/camel-pop3-engine.c b/camel/providers/pop3/camel-pop3-engine.c index 762212388e..2186136f95 100644 --- a/camel/providers/pop3/camel-pop3-engine.c +++ b/camel/providers/pop3/camel-pop3-engine.c @@ -97,6 +97,7 @@ camel_pop3_engine_get_type (void) /** * camel_pop3_engine_new: * @source: source stream + * @flags: engine flags * * Returns a NULL stream. A null stream is always at eof, and * always returns success for all reads and writes. @@ -104,7 +105,7 @@ camel_pop3_engine_get_type (void) * Return value: the stream **/ CamelPOP3Engine * -camel_pop3_engine_new(CamelStream *source) +camel_pop3_engine_new(CamelStream *source, guint32 flags) { CamelPOP3Engine *pe; @@ -112,7 +113,8 @@ camel_pop3_engine_new(CamelStream *source) pe->stream = (CamelPOP3Stream *)camel_pop3_stream_new(source); pe->state = CAMEL_POP3_ENGINE_AUTH; - + pe->flags = flags; + get_capabilities(pe, TRUE); return pe; @@ -213,21 +215,23 @@ get_capabilities(CamelPOP3Engine *pe, int read_greeting) pe->auth = g_list_prepend(pe->auth, &camel_pop3_password_authtype); } - pc = camel_pop3_engine_command_new(pe, CAMEL_POP3_COMMAND_MULTI, cmd_capa, NULL, "CAPA\r\n"); - while (camel_pop3_engine_iterate(pe, pc) > 0) - ; - camel_pop3_engine_command_free(pe, pc); - - if (pe->state == CAMEL_POP3_ENGINE_TRANSACTION && !(pe->capa & CAMEL_POP3_CAP_UIDL)) { - /* check for UIDL support manually */ - pc = camel_pop3_engine_command_new (pe, CAMEL_POP3_COMMAND_SIMPLE, NULL, NULL, "UIDL 1\r\n"); - while (camel_pop3_engine_iterate (pe, pc) > 0) + if (!(pe->flags & CAMEL_POP3_ENGINE_DISABLE_EXTENSIONS)) { + pc = camel_pop3_engine_command_new(pe, CAMEL_POP3_COMMAND_MULTI, cmd_capa, NULL, "CAPA\r\n"); + while (camel_pop3_engine_iterate(pe, pc) > 0) ; + camel_pop3_engine_command_free(pe, pc); - if (pc->state == CAMEL_POP3_COMMAND_OK) - pe->capa |= CAMEL_POP3_CAP_UIDL; - - camel_pop3_engine_command_free (pe, pc); + if (pe->state == CAMEL_POP3_ENGINE_TRANSACTION && !(pe->capa & CAMEL_POP3_CAP_UIDL)) { + /* check for UIDL support manually */ + pc = camel_pop3_engine_command_new (pe, CAMEL_POP3_COMMAND_SIMPLE, NULL, NULL, "UIDL 1\r\n"); + while (camel_pop3_engine_iterate (pe, pc) > 0) + ; + + if (pc->state == CAMEL_POP3_COMMAND_OK) + pe->capa |= CAMEL_POP3_CAP_UIDL; + + camel_pop3_engine_command_free (pe, pc); + } } } @@ -304,8 +308,8 @@ camel_pop3_engine_iterate(CamelPOP3Engine *pe, CamelPOP3Command *pcwait) default: /* what do we do now? f'knows! */ g_warning("Bad server response: %s\n", p); - errno = EIO; - return -1; + pc->state = CAMEL_POP3_COMMAND_ERR; + break; } e_dlist_addtail(&pe->done, (EDListNode *)pc); @@ -313,7 +317,7 @@ camel_pop3_engine_iterate(CamelPOP3Engine *pe, CamelPOP3Command *pcwait) /* Set next command */ pe->current = (CamelPOP3Command *)e_dlist_remhead(&pe->active); - + /* check the queue for sending any we can now send also */ pw = (CamelPOP3Command *)pe->queue.head; pn = pw->next; diff --git a/camel/providers/pop3/camel-pop3-engine.h b/camel/providers/pop3/camel-pop3-engine.h index caf6ca1d2a..3114980311 100644 --- a/camel/providers/pop3/camel-pop3-engine.h +++ b/camel/providers/pop3/camel-pop3-engine.h @@ -68,6 +68,11 @@ enum { CAMEL_POP3_CAP_STLS = 1<<5 }; +/* enable/disable flags for the engine itself */ +enum { + CAMEL_POP3_ENGINE_DISABLE_EXTENSIONS = 1<<0, +}; + typedef void (*CamelPOP3CommandFunc)(CamelPOP3Engine *pe, CamelPOP3Stream *stream, void *data); struct _CamelPOP3Command { @@ -86,7 +91,9 @@ struct _CamelPOP3Command { struct _CamelPOP3Engine { CamelObject parent; - + + guint32 flags; + camel_pop3_engine_t state; GList *auth; /* authtypes supported */ @@ -114,7 +121,7 @@ struct _CamelPOP3EngineClass { CamelType camel_pop3_engine_get_type (void); -CamelPOP3Engine *camel_pop3_engine_new (CamelStream *source); +CamelPOP3Engine *camel_pop3_engine_new (CamelStream *source, guint32 flags); void camel_pop3_engine_reget_capabilities (CamelPOP3Engine *engine); diff --git a/camel/providers/pop3/camel-pop3-provider.c b/camel/providers/pop3/camel-pop3-provider.c index f01cf74253..1354470e69 100644 --- a/camel/providers/pop3/camel-pop3-provider.c +++ b/camel/providers/pop3/camel-pop3-provider.c @@ -42,6 +42,8 @@ CamelProviderConfEntry pop3_conf_entries[] = { { CAMEL_PROVIDER_CONF_CHECKSPIN, "delete_after", "UNIMPLEMENTED", N_("Delete after %s day(s)"), "0:1:7:365" }, #endif + { CAMEL_PROVIDER_CONF_CHECKBOX, "disable_extensions", NULL, + N_("Disable support for all POP3 extensions"), "0" }, { CAMEL_PROVIDER_CONF_SECTION_END }, { CAMEL_PROVIDER_CONF_END } }; diff --git a/camel/providers/pop3/camel-pop3-store.c b/camel/providers/pop3/camel-pop3-store.c index be4469f3eb..8b674e019e 100644 --- a/camel/providers/pop3/camel-pop3-store.c +++ b/camel/providers/pop3/camel-pop3-store.c @@ -151,6 +151,7 @@ connect_to_server (CamelService *service, int ssl_mode, int try_starttls, CamelE CamelStream *tcp_stream; CamelPOP3Command *pc; struct hostent *h; + guint32 flags = 0; int clean_quit; int ret, port; @@ -197,7 +198,10 @@ connect_to_server (CamelService *service, int ssl_mode, int try_starttls, CamelE return FALSE; } - store->engine = camel_pop3_engine_new (tcp_stream); + if (camel_url_get_param (service->url, "disable_extensions")) + flags |= CAMEL_POP3_ENGINE_DISABLE_EXTENSIONS; + + store->engine = camel_pop3_engine_new (tcp_stream, flags); #ifdef HAVE_SSL if (store->engine) { |