summaryrefslogtreecommitdiff
path: root/camel/providers/imapx/camel-imapx-server.c
diff options
context:
space:
mode:
Diffstat (limited to 'camel/providers/imapx/camel-imapx-server.c')
-rw-r--r--camel/providers/imapx/camel-imapx-server.c104
1 files changed, 61 insertions, 43 deletions
diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c
index d77901cef..582d6a4da 100644
--- a/camel/providers/imapx/camel-imapx-server.c
+++ b/camel/providers/imapx/camel-imapx-server.c
@@ -351,9 +351,6 @@ static gint imapx_uids_array_cmp (gconstpointer ap,
gconstpointer bp);
static void imapx_sync_free_user (GArray *user_set);
-static gboolean imapx_in_idle (CamelIMAPXServer *is);
-static gboolean imapx_use_idle (CamelIMAPXServer *is);
-
G_DEFINE_TYPE (CamelIMAPXServer, camel_imapx_server, G_TYPE_OBJECT)
typedef struct _FetchChangesInfo {
@@ -632,7 +629,7 @@ imapx_server_inactivity_thread (gpointer user_data)
g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL);
- if (imapx_in_idle (is)) {
+ if (camel_imapx_server_is_in_idle (is)) {
/* Stop and restart the IDLE command. */
if (!camel_imapx_server_schedule_idle_sync (is, NULL, is->priv->cancellable, &local_error) &&
!g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
@@ -759,7 +756,7 @@ imapx_expunge_uid_from_summary (CamelIMAPXServer *is,
camel_folder_summary_remove_uid (folder->summary, uid);
camel_folder_change_info_remove_uid (is->priv->changes, uid);
- if (imapx_in_idle (is)) {
+ if (camel_imapx_server_is_in_idle (is)) {
camel_folder_summary_save_to_db (folder->summary, NULL);
imapx_update_store_summary (folder);
camel_folder_changed (folder, is->priv->changes);
@@ -1017,7 +1014,7 @@ imapx_untagged_exists (CamelIMAPXServer *is,
folder = imapx_server_ref_folder (is, mailbox);
g_return_val_if_fail (folder != NULL, FALSE);
- if (imapx_in_idle (is)) {
+ if (camel_imapx_server_is_in_idle (is)) {
guint count;
count = camel_folder_summary_count (folder->summary);
@@ -1218,7 +1215,7 @@ imapx_untagged_fetch (CamelIMAPXServer *is,
}
g_free (uid);
- if (changed && imapx_in_idle (is)) {
+ if (changed && camel_imapx_server_is_in_idle (is)) {
camel_folder_summary_save_to_db (select_folder->summary, NULL);
imapx_update_store_summary (select_folder);
camel_folder_changed (select_folder, is->priv->changes);
@@ -2008,7 +2005,7 @@ imapx_continuation (CamelIMAPXServer *is,
* can write while we have it ... so we dont need any
* ohter lock here. All other writes go through
* queue-lock */
- if (imapx_in_idle (is)) {
+ if (camel_imapx_server_is_in_idle (is)) {
success = camel_imapx_input_stream_skip (
CAMEL_IMAPX_INPUT_STREAM (input_stream),
cancellable, error);
@@ -2334,40 +2331,6 @@ imapx_step (CamelIMAPXServer *is,
return success;
}
-static gboolean
-imapx_use_idle (CamelIMAPXServer *is)
-{
- gboolean use_idle = FALSE;
-
- /* No need for IDLE if the server supports NOTIFY. */
- if (CAMEL_IMAPX_HAVE_CAPABILITY (is->priv->cinfo, NOTIFY))
- return FALSE;
-
- if (CAMEL_IMAPX_HAVE_CAPABILITY (is->priv->cinfo, IDLE)) {
- CamelIMAPXSettings *settings;
-
- settings = camel_imapx_server_ref_settings (is);
- use_idle = camel_imapx_settings_get_use_idle (settings);
- g_object_unref (settings);
- }
-
- return use_idle;
-}
-
-static gboolean
-imapx_in_idle (CamelIMAPXServer *is)
-{
- gboolean in_idle;
-
- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE);
-
- g_rec_mutex_lock (&is->priv->idle_lock);
- in_idle = is->priv->idle_running || is->priv->idle_pending || is->priv->idle_thread;
- g_rec_mutex_unlock (&is->priv->idle_lock);
-
- return in_idle;
-}
-
static void
imapx_server_set_streams (CamelIMAPXServer *is,
GInputStream *input_stream,
@@ -6043,6 +6006,61 @@ imapx_server_run_idle_thread_cb (gpointer user_data)
}
gboolean
+camel_imapx_server_can_use_idle (CamelIMAPXServer *is)
+{
+ gboolean use_idle = FALSE;
+
+ /* No need for IDLE if the server supports NOTIFY. */
+ if (CAMEL_IMAPX_HAVE_CAPABILITY (is->priv->cinfo, NOTIFY))
+ return FALSE;
+
+ if (CAMEL_IMAPX_HAVE_CAPABILITY (is->priv->cinfo, IDLE)) {
+ CamelIMAPXSettings *settings;
+
+ settings = camel_imapx_server_ref_settings (is);
+ use_idle = camel_imapx_settings_get_use_idle (settings);
+ g_object_unref (settings);
+ }
+
+ return use_idle;
+}
+
+gboolean
+camel_imapx_server_is_in_idle (CamelIMAPXServer *is)
+{
+ gboolean in_idle;
+
+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE);
+
+ g_rec_mutex_lock (&is->priv->idle_lock);
+ in_idle = is->priv->idle_running || is->priv->idle_pending || is->priv->idle_thread;
+ g_rec_mutex_unlock (&is->priv->idle_lock);
+
+ return in_idle;
+}
+
+CamelIMAPXMailbox *
+camel_imapx_server_ref_idle_mailbox (CamelIMAPXServer *is)
+{
+ CamelIMAPXMailbox *mailbox = NULL;
+
+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL);
+
+ g_rec_mutex_lock (&is->priv->idle_lock);
+
+ if (is->priv->idle_running || is->priv->idle_pending || is->priv->idle_thread) {
+ if (is->priv->idle_mailbox)
+ mailbox = g_object_ref (is->priv->idle_mailbox);
+ else
+ mailbox = camel_imapx_server_ref_selected (is);
+ }
+
+ g_rec_mutex_unlock (&is->priv->idle_lock);
+
+ return mailbox;
+}
+
+gboolean
camel_imapx_server_schedule_idle_sync (CamelIMAPXServer *is,
CamelIMAPXMailbox *mailbox,
GCancellable *cancellable,
@@ -6055,7 +6073,7 @@ camel_imapx_server_schedule_idle_sync (CamelIMAPXServer *is,
if (!camel_imapx_server_stop_idle_sync (is, cancellable, error))
return FALSE;
- if (!imapx_use_idle (is))
+ if (!camel_imapx_server_can_use_idle (is))
return TRUE;
g_rec_mutex_lock (&is->priv->idle_lock);