[evolution/wip/webkit2] Enhance delayed message send through Outbox



commit 0e9f2fed35f1deb17cd63457a5e6af63aac6d199
Author: Milan Crha <mcrha redhat com>
Date:   Wed May 11 10:47:50 2016 +0200

    Enhance delayed message send through Outbox
    
    It could happen that a message was sent from Outbox before the set
    timeout. This change makes sure that messages which are not in
    the Outbox folder for long enough are not sent earlier. Users still
    can flush the Outbox earlier from the context menu or from
    File->Send/Receive->Send All (the "Send/Receive" action doesn't
    skip this timeout).

 libemail-engine/e-mail-session.c         |   42 +++++++++++++++++++++++++++++-
 libemail-engine/mail-ops.c               |   20 +++++++++++++-
 libemail-engine/mail-ops.h               |    1 +
 mail/mail-send-recv.c                    |   21 +++++++++++++-
 mail/mail-send-recv.h                    |    1 +
 modules/mail/e-mail-shell-view-actions.c |    4 +-
 6 files changed, 83 insertions(+), 6 deletions(-)
---
diff --git a/libemail-engine/e-mail-session.c b/libemail-engine/e-mail-session.c
index 2277ad6..a2183d6 100644
--- a/libemail-engine/e-mail-session.c
+++ b/libemail-engine/e-mail-session.c
@@ -78,6 +78,7 @@ struct _EMailSessionPrivate {
        gulong source_enabled_handler_id;
        gulong source_disabled_handler_id;
        gulong default_mail_account_handler_id;
+       gulong outbox_changed_handler_id;
 
        CamelService *local_store;
        CamelService *vfolder_store;
@@ -641,12 +642,36 @@ mail_session_default_mail_account_cb (ESourceRegistry *registry,
 }
 
 static void
+mail_session_outbox_folder_changed_cb (CamelFolder *folder,
+                                      CamelFolderChangeInfo *changes,
+                                      EMailSession *session)
+{
+       g_return_if_fail (CAMEL_IS_FOLDER (folder));
+       g_return_if_fail (changes != NULL);
+       g_return_if_fail (E_IS_MAIL_SESSION (session));
+
+       if (changes->uid_added && changes->uid_added->len) {
+               GSettings *settings;
+
+               settings = e_util_ref_settings ("org.gnome.evolution.mail");
+               if (g_settings_get_boolean (settings, "composer-use-outbox")) {
+                       gint delay_flush = g_settings_get_int (settings, "composer-delay-outbox-flush");
+
+                       if (delay_flush > 0)
+                               e_mail_session_schedule_outbox_flush (session, delay_flush);
+               }
+               g_object_unref (settings);
+       }
+}
+
+static void
 mail_session_configure_local_store (EMailSession *session)
 {
        CamelLocalSettings *local_settings;
        CamelSession *camel_session;
        CamelSettings *settings;
        CamelService *service;
+       CamelFolder *folder;
        const gchar *data_dir;
        const gchar *uid;
        gchar *path;
@@ -677,7 +702,6 @@ mail_session_configure_local_store (EMailSession *session)
 
        /* Populate the local folder cache. */
        for (ii = 0; ii < E_MAIL_NUM_LOCAL_FOLDERS; ii++) {
-               CamelFolder *folder;
                gchar *folder_uri;
                const gchar *display_name;
                GError *error = NULL;
@@ -705,6 +729,12 @@ mail_session_configure_local_store (EMailSession *session)
                        g_error_free (error);
                }
        }
+
+       folder = e_mail_session_get_local_folder (session, E_MAIL_LOCAL_FOLDER_OUTBOX);
+       if (folder) {
+               session->priv->outbox_changed_handler_id = g_signal_connect (folder, "changed",
+                       G_CALLBACK (mail_session_outbox_folder_changed_cb), session);
+       }
 }
 
 static void
@@ -901,6 +931,16 @@ mail_session_dispose (GObject *object)
 
        priv = E_MAIL_SESSION_GET_PRIVATE (object);
 
+       if (priv->outbox_changed_handler_id) {
+               CamelFolder *folder;
+
+               folder = e_mail_session_get_local_folder (E_MAIL_SESSION (object), 
E_MAIL_LOCAL_FOLDER_OUTBOX);
+               if (folder)
+                       g_signal_handler_disconnect (folder, priv->outbox_changed_handler_id);
+
+               priv->outbox_changed_handler_id = 0;
+       }
+
        if (priv->folder_cache != NULL) {
                g_object_unref (priv->folder_cache);
                priv->folder_cache = NULL;
diff --git a/libemail-engine/mail-ops.c b/libemail-engine/mail-ops.c
index 6b82a90..fe80865 100644
--- a/libemail-engine/mail-ops.c
+++ b/libemail-engine/mail-ops.c
@@ -552,6 +552,7 @@ struct _send_queue_msg {
        EMailSession *session;
        CamelFolder *queue;
        CamelTransport *transport;
+       gboolean immediately;
 
        CamelFilterDriver *driver;
 
@@ -945,10 +946,24 @@ send_queue_exec (struct _send_queue_msg *m,
        CamelFolder *sent_folder;
        GPtrArray *uids, *send_uids = NULL;
        gint i, j;
+       time_t delay_send = 0;
        GError *local_error = NULL;
 
        d (printf ("sending queue\n"));
 
+       if (!m->immediately) {
+               GSettings *settings;
+
+               settings = e_util_ref_settings ("org.gnome.evolution.mail");
+               if (g_settings_get_boolean (settings, "composer-use-outbox")) {
+                       gint delay_flush = g_settings_get_int (settings, "composer-delay-outbox-flush");
+
+                       if (delay_flush > 0)
+                               delay_send = time (NULL) - (60 * delay_flush);
+               }
+               g_object_unref (settings);
+       }
+
        sent_folder =
                e_mail_session_get_local_folder (
                m->session, E_MAIL_LOCAL_FOLDER_SENT);
@@ -962,7 +977,8 @@ send_queue_exec (struct _send_queue_msg *m,
 
                info = camel_folder_get_message_info (m->queue, uids->pdata[i]);
                if (info) {
-                       if ((camel_message_info_flags (info) & CAMEL_MESSAGE_DELETED) == 0)
+                       if ((camel_message_info_flags (info) & CAMEL_MESSAGE_DELETED) == 0 &&
+                           (!delay_send || camel_message_info_date_sent (info) <= delay_send))
                                send_uids->pdata[j++] = uids->pdata[i];
                        camel_message_info_unref (info);
                }
@@ -1108,6 +1124,7 @@ mail_send_queue (EMailSession *session,
                  CamelFolder *queue,
                  CamelTransport *transport,
                  const gchar *type,
+                gboolean immediately,
                  GCancellable *cancellable,
                  CamelFilterGetFolderFunc get_folder,
                  gpointer get_data,
@@ -1126,6 +1143,7 @@ mail_send_queue (EMailSession *session,
        m->session = g_object_ref (session);
        m->queue = g_object_ref (queue);
        m->transport = g_object_ref (transport);
+       m->immediately = immediately;
        if (G_IS_CANCELLABLE (cancellable))
                m->base.cancellable = g_object_ref (cancellable);
        m->status = status;
diff --git a/libemail-engine/mail-ops.h b/libemail-engine/mail-ops.h
index aac56a1..35b971b 100644
--- a/libemail-engine/mail-ops.h
+++ b/libemail-engine/mail-ops.h
@@ -56,6 +56,7 @@ void          mail_send_queue                 (EMailSession *session,
                                                 CamelFolder *queue,
                                                 CamelTransport *transport,
                                                 const gchar *type,
+                                                gboolean immediately,
                                                 GCancellable *cancellable,
                                                 CamelFilterGetFolderFunc get_folder,
                                                 gpointer get_data,
diff --git a/mail/mail-send-recv.c b/mail/mail-send-recv.c
index 2963693..68f5a9a 100644
--- a/mail/mail-send-recv.c
+++ b/mail/mail-send-recv.c
@@ -946,6 +946,7 @@ receive_done (gpointer data)
                        local_outbox,
                        CAMEL_TRANSPORT (info->service),
                        E_FILTER_SOURCE_OUTGOING,
+                       FALSE,
                        info->cancellable,
                        receive_get_folder, info,
                        receive_status, info,
@@ -1610,6 +1611,7 @@ send_receive (GtkWindow *parent,
                                session, local_outbox,
                                CAMEL_TRANSPORT (info->service),
                                E_FILTER_SOURCE_OUTGOING,
+                               FALSE,
                                info->cancellable,
                                receive_get_folder, info,
                                receive_status, info,
@@ -1719,6 +1721,7 @@ mail_receive_service (CamelService *service)
                        local_outbox,
                        CAMEL_TRANSPORT (service),
                        E_FILTER_SOURCE_OUTGOING,
+                       FALSE,
                        info->cancellable,
                        receive_get_folder, info,
                        receive_status, info,
@@ -1735,8 +1738,9 @@ exit:
        g_object_unref (session);
 }
 
-void
-mail_send (EMailSession *session)
+static void
+do_mail_send (EMailSession *session,
+             gboolean immediately)
 {
        CamelFolder *local_outbox;
        CamelService *service;
@@ -1792,6 +1796,7 @@ mail_send (EMailSession *session)
                session, local_outbox,
                CAMEL_TRANSPORT (service),
                E_FILTER_SOURCE_OUTGOING,
+               immediately,
                info->cancellable,
                receive_get_folder, info,
                receive_status, info,
@@ -1799,3 +1804,15 @@ mail_send (EMailSession *session)
 
        g_object_unref (service);
 }
+
+void
+mail_send (EMailSession *session)
+{
+       do_mail_send (session, FALSE);
+}
+
+void
+mail_send_immediately (EMailSession *session)
+{
+       do_mail_send (session, TRUE);
+}
diff --git a/mail/mail-send-recv.h b/mail/mail-send-recv.h
index 23667be..2b2f1ca 100644
--- a/mail/mail-send-recv.h
+++ b/mail/mail-send-recv.h
@@ -38,6 +38,7 @@ GtkWidget *   mail_receive                    (GtkWindow *parent,
 void           mail_receive_service            (CamelService *service);
 
 void           mail_send                       (EMailSession *session);
+void           mail_send_immediately           (EMailSession *session);
 
 /* setup auto receive stuff */
 void           mail_autoreceive_init           (EMailSession *session);
diff --git a/modules/mail/e-mail-shell-view-actions.c b/modules/mail/e-mail-shell-view-actions.c
index 026dea4..f1159cf 100644
--- a/modules/mail/e-mail-shell-view-actions.c
+++ b/modules/mail/e-mail-shell-view-actions.c
@@ -337,7 +337,7 @@ action_mail_flush_outbox_cb (GtkAction *action,
        backend = E_MAIL_BACKEND (shell_backend);
        session = e_mail_backend_get_session (backend);
 
-       mail_send (session);
+       mail_send_immediately (session);
 }
 
 static void
@@ -1300,7 +1300,7 @@ action_mail_send_receive_send_all_cb (GtkAction *action,
        backend = E_MAIL_BACKEND (shell_backend);
        session = e_mail_backend_get_session (backend);
 
-       mail_send (session);
+       mail_send_immediately (session);
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]