diff options
Diffstat (limited to 'camel/providers/imap4')
-rw-r--r-- | camel/providers/imap4/camel-imap4-engine.c | 34 | ||||
-rw-r--r-- | camel/providers/imap4/camel-imap4-engine.h | 3 | ||||
-rw-r--r-- | camel/providers/imap4/camel-imap4-store.c | 46 |
3 files changed, 48 insertions, 35 deletions
diff --git a/camel/providers/imap4/camel-imap4-engine.c b/camel/providers/imap4/camel-imap4-engine.c index 40501ae399..ce5f83e38f 100644 --- a/camel/providers/imap4/camel-imap4-engine.c +++ b/camel/providers/imap4/camel-imap4-engine.c @@ -1173,8 +1173,7 @@ engine_prequeue_folder_select (CamelIMAP4Engine *engine) } /* we need to pre-queue a SELECT */ - ic = camel_imap4_command_new (engine, ic->folder, "SELECT %F\r\n", ic->folder); - camel_imap4_engine_prequeue (engine, ic); + ic = camel_imap4_engine_prequeue (engine, (CamelFolder *) ic->folder, "SELECT %F\r\n", ic->folder); ic->user_data = engine; camel_imap4_command_unref (ic); @@ -1280,7 +1279,7 @@ camel_imap4_engine_iterate (CamelIMAP4Engine *engine) * @format: command format * @Varargs: arguments * - * Basically the same as #camel_imap4_command_new() except that this + * Basically the same as camel_imap4_command_new() except that this * function also places the command in the engine queue. * * Returns the CamelIMAP4Command. @@ -1291,6 +1290,8 @@ camel_imap4_engine_queue (CamelIMAP4Engine *engine, CamelFolder *folder, const c CamelIMAP4Command *ic; va_list args; + g_return_val_if_fail (CAMEL_IS_IMAP4_ENGINE (engine), NULL); + va_start (args, format); ic = camel_imap4_command_newv (engine, (CamelIMAP4Folder *) folder, format, args); va_end (args); @@ -1306,17 +1307,26 @@ camel_imap4_engine_queue (CamelIMAP4Engine *engine, CamelFolder *folder, const c /** * camel_imap4_engine_prequeue: * @engine: IMAP4 engine - * @ic: IMAP4 command to pre-queue + * @folder: IMAP4 folder that the command will affect (or %NULL if it doesn't matter) + * @format: command format + * @Varargs: arguments + * + * Same as camel_imap4_engine_queue() except this places the new + * command at the head of the queue. * - * Places @ic at the head of the queue of pending IMAP4 commands. + * Returns the CamelIMAP4Command. **/ -void -camel_imap4_engine_prequeue (CamelIMAP4Engine *engine, CamelIMAP4Command *ic) +CamelIMAP4Command * +camel_imap4_engine_prequeue (CamelIMAP4Engine *engine, CamelFolder *folder, const char *format, ...) { - g_return_if_fail (CAMEL_IS_IMAP4_ENGINE (engine)); - g_return_if_fail (ic != NULL); + CamelIMAP4Command *ic; + va_list args; - camel_imap4_command_ref (ic); + g_return_val_if_fail (CAMEL_IS_IMAP4_ENGINE (engine), NULL); + + va_start (args, format); + ic = camel_imap4_command_newv (engine, (CamelIMAP4Folder *) folder, format, args); + va_end (args); if (e_dlist_empty (&engine->queue)) { e_dlist_addtail (&engine->queue, (EDListNode *) ic); @@ -1340,6 +1350,10 @@ camel_imap4_engine_prequeue (CamelIMAP4Engine *engine, CamelIMAP4Command *ic) } } } + + camel_imap4_command_ref (ic); + + return ic; } diff --git a/camel/providers/imap4/camel-imap4-engine.h b/camel/providers/imap4/camel-imap4-engine.h index 1dda36ac43..2fdc52e145 100644 --- a/camel/providers/imap4/camel-imap4-engine.h +++ b/camel/providers/imap4/camel-imap4-engine.h @@ -194,7 +194,8 @@ int camel_imap4_engine_select_folder (CamelIMAP4Engine *engine, CamelFolder *fol struct _CamelIMAP4Command *camel_imap4_engine_queue (CamelIMAP4Engine *engine, CamelFolder *folder, const char *format, ...); -void camel_imap4_engine_prequeue (CamelIMAP4Engine *engine, struct _CamelIMAP4Command *ic); +struct _CamelIMAP4Command *camel_imap4_engine_prequeue (CamelIMAP4Engine *engine, CamelFolder *folder, + const char *format, ...); void camel_imap4_engine_dequeue (CamelIMAP4Engine *engine, struct _CamelIMAP4Command *ic); diff --git a/camel/providers/imap4/camel-imap4-store.c b/camel/providers/imap4/camel-imap4-store.c index 08f7459614..0d47c3252e 100644 --- a/camel/providers/imap4/camel-imap4-store.c +++ b/camel/providers/imap4/camel-imap4-store.c @@ -271,7 +271,7 @@ connect_to_server (CamelIMAP4Engine *engine, struct hostent *host, int ssl_mode, CamelIMAP4Command *ic; int id; - ic = camel_imap4_engine_queue (engine, NULL, "STARTTLS\r\n"); + ic = camel_imap4_engine_prequeue (engine, NULL, "STARTTLS\r\n"); while ((id = camel_imap4_engine_iterate (engine)) < ic->id && id != -1) ; @@ -423,12 +423,12 @@ imap4_try_authenticate (CamelIMAP4Engine *engine, gboolean reprompt, const char mech = g_hash_table_lookup (engine->authtypes, service->url->authmech); sasl = camel_sasl_new ("imap4", mech->authproto, service); - ic = camel_imap4_engine_queue (engine, NULL, "AUTHENTICATE %s\r\n", service->url->authmech); + ic = camel_imap4_engine_prequeue (engine, NULL, "AUTHENTICATE %s\r\n", service->url->authmech); ic->plus = sasl_auth; ic->user_data = sasl; } else { - ic = camel_imap4_engine_queue (engine, NULL, "LOGIN %S %S\r\n", - service->url->user, service->url->passwd); + ic = camel_imap4_engine_prequeue (engine, NULL, "LOGIN %S %S\r\n", + service->url->user, service->url->passwd); } while ((id = camel_imap4_engine_iterate (engine)) < ic->id && id != -1) @@ -459,35 +459,29 @@ imap4_try_authenticate (CamelIMAP4Engine *engine, gboolean reprompt, const char } static gboolean -imap4_connect (CamelService *service, CamelException *ex) +imap4_reconnect (CamelIMAP4Engine *engine, CamelException *ex) { - CamelIMAP4Store *store = (CamelIMAP4Store *) service; + CamelService *service = engine->service; CamelServiceAuthType *mech; gboolean reprompt = FALSE; char *errmsg = NULL; CamelException lex; - CAMEL_SERVICE_LOCK (store, connect_lock); - - if (!connect_to_server_wrapper (store->engine, ex)) { - CAMEL_SERVICE_UNLOCK (store, connect_lock); + if (!connect_to_server_wrapper (engine, ex)) return FALSE; - } -#define CANT_USE_AUTHMECH (!(mech = g_hash_table_lookup (store->engine->authtypes, service->url->authmech))) +#define CANT_USE_AUTHMECH (!(mech = g_hash_table_lookup (engine->authtypes, service->url->authmech))) if (service->url->authmech && CANT_USE_AUTHMECH) { /* Oops. We can't AUTH using the requested mechanism */ camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, _("Cannot authenticate to IMAP server %s using %s"), service->url->host, service->url->authmech); - CAMEL_SERVICE_UNLOCK (store, connect_lock); - return FALSE; } camel_exception_init (&lex); - while (imap4_try_authenticate (store->engine, reprompt, errmsg, &lex)) { + while (imap4_try_authenticate (engine, reprompt, errmsg, &lex)) { g_free (errmsg); errmsg = g_strdup (lex.desc); camel_exception_clear (&lex); @@ -497,24 +491,28 @@ imap4_connect (CamelService *service, CamelException *ex) if (camel_exception_is_set (&lex)) { camel_exception_xfer (ex, &lex); - - CAMEL_SERVICE_UNLOCK (store, connect_lock); - return FALSE; } - if (camel_imap4_engine_namespace (store->engine, ex) == -1) { - CAMEL_SERVICE_UNLOCK (store, connect_lock); - + if (camel_imap4_engine_namespace (engine, ex) == -1) return FALSE; - } - - CAMEL_SERVICE_UNLOCK (store, connect_lock); return TRUE; } static gboolean +imap4_connect (CamelService *service, CamelException *ex) +{ + gboolean retval; + + CAMEL_SERVICE_LOCK (service, connect_lock); + retval = imap4_reconnect (((CamelIMAP4Store *) service)->engine, ex); + CAMEL_SERVICE_UNLOCK (service, connect_lock); + + return retval; +} + +static gboolean imap4_disconnect (CamelService *service, gboolean clean, CamelException *ex) { CamelIMAP4Store *store = (CamelIMAP4Store *) service; |