summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--camel/providers/imapx/camel-imapx-server.c77
1 files changed, 42 insertions, 35 deletions
diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c
index eb6e85e56..ecd89bc3e 100644
--- a/camel/providers/imapx/camel-imapx-server.c
+++ b/camel/providers/imapx/camel-imapx-server.c
@@ -5966,6 +5966,9 @@ imapx_server_idle_thread (gpointer user_data)
return NULL;
}
+ is->priv->idle_state = IMAPX_IDLE_STATE_PREPARING;
+ g_cond_broadcast (&is->priv->idle_cond);
+
mailbox = is->priv->idle_mailbox;
if (mailbox)
g_object_ref (mailbox);
@@ -5998,9 +6001,7 @@ imapx_server_idle_thread (gpointer user_data)
g_mutex_lock (&is->priv->idle_lock);
if (is->priv->idle_stamp == itd->idle_stamp &&
- is->priv->idle_state == IMAPX_IDLE_STATE_SCHEDULED) {
- is->priv->idle_state = IMAPX_IDLE_STATE_PREPARING;
- g_cond_broadcast (&is->priv->idle_cond);
+ is->priv->idle_state == IMAPX_IDLE_STATE_PREPARING) {
g_mutex_unlock (&is->priv->idle_lock);
/* Blocks, until the DONE is issued or on inactivity timeout, error, ... */
@@ -6230,8 +6231,7 @@ camel_imapx_server_stop_idle_sync (CamelIMAPXServer *is,
GError **error)
{
GCancellable *idle_cancellable;
- gboolean issue_done = FALSE;
- gboolean rather_disconnect = FALSE;
+ gulong handler_id = 0;
gboolean success = TRUE;
g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE);
@@ -6249,16 +6249,7 @@ camel_imapx_server_stop_idle_sync (CamelIMAPXServer *is,
}
is->priv->idle_state = IMAPX_IDLE_STATE_OFF;
- } else if (is->priv->idle_state == IMAPX_IDLE_STATE_PREPARING) {
- success = FALSE;
-
- /* This message won't get into UI. */
- g_set_error_literal (error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT,
- "Reconnect after preparing IDLE command");
- } else if (is->priv->idle_state == IMAPX_IDLE_STATE_RUNNING) {
- is->priv->idle_state = IMAPX_IDLE_STATE_STOPPING;
g_cond_broadcast (&is->priv->idle_cond);
- issue_done = TRUE;
}
idle_cancellable = is->priv->idle_cancellable ? g_object_ref (is->priv->idle_cancellable) : NULL;
@@ -6267,9 +6258,20 @@ camel_imapx_server_stop_idle_sync (CamelIMAPXServer *is,
g_clear_object (&is->priv->idle_mailbox);
is->priv->idle_stamp++;
- g_mutex_unlock (&is->priv->idle_lock);
+ if (cancellable)
+ handler_id = g_cancellable_connect (cancellable, G_CALLBACK (imapx_server_wait_idle_stop_cancelled_cb), is, NULL);
+
+ while (is->priv->idle_state == IMAPX_IDLE_STATE_PREPARING &&
+ !g_cancellable_is_cancelled (cancellable)) {
+ g_cond_wait (&is->priv->idle_cond, &is->priv->idle_lock);
+ }
+
+ if (is->priv->idle_state == IMAPX_IDLE_STATE_RUNNING &&
+ !g_cancellable_is_cancelled (cancellable)) {
+ is->priv->idle_state = IMAPX_IDLE_STATE_STOPPING;
+ g_cond_broadcast (&is->priv->idle_cond);
+ g_mutex_unlock (&is->priv->idle_lock);
- if (issue_done) {
g_mutex_lock (&is->priv->stream_lock);
if (is->priv->output_stream) {
gint previous_timeout = -1;
@@ -6292,33 +6294,38 @@ camel_imapx_server_stop_idle_sync (CamelIMAPXServer *is,
"Reconnect after couldn't issue DONE command");
}
g_mutex_unlock (&is->priv->stream_lock);
+ g_mutex_lock (&is->priv->idle_lock);
}
- if (success) {
- gulong handler_id = 0;
+ while (success && is->priv->idle_state != IMAPX_IDLE_STATE_OFF &&
+ !g_cancellable_is_cancelled (cancellable)) {
+ g_cond_wait (&is->priv->idle_cond, &is->priv->idle_lock);
+ }
- if (cancellable)
- handler_id = g_cancellable_connect (cancellable, G_CALLBACK (imapx_server_wait_idle_stop_cancelled_cb), is, NULL);
+ if (cancellable && handler_id)
+ g_cancellable_disconnect (cancellable, handler_id);
- g_mutex_lock (&is->priv->idle_lock);
- while (is->priv->idle_state != IMAPX_IDLE_STATE_OFF &&
- !g_cancellable_set_error_if_cancelled (cancellable, error)) {
- g_cond_wait (&is->priv->idle_cond, &is->priv->idle_lock);
- }
- g_mutex_unlock (&is->priv->idle_lock);
+ if (success && g_cancellable_is_cancelled (cancellable)) {
+ g_clear_error (error);
- if (cancellable && handler_id)
- g_cancellable_disconnect (cancellable, handler_id);
- } else {
+ success = FALSE;
+
+ /* This message won't get into UI. */
+ g_set_error_literal (error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT,
+ "Reconnect after cancelled IDLE stop command");
+ }
+
+ g_mutex_unlock (&is->priv->idle_lock);
+
+ if (!success) {
if (idle_cancellable)
g_cancellable_cancel (idle_cancellable);
- if (rather_disconnect) {
- g_mutex_lock (&is->priv->idle_lock);
- is->priv->idle_state = IMAPX_IDLE_STATE_OFF;
- g_mutex_unlock (&is->priv->idle_lock);
- imapx_disconnect (is);
- }
+ g_mutex_lock (&is->priv->idle_lock);
+ is->priv->idle_state = IMAPX_IDLE_STATE_OFF;
+ g_mutex_unlock (&is->priv->idle_lock);
+
+ imapx_disconnect (is);
}
g_clear_object (&idle_cancellable);