[evolution] Enhance delayed message send through Outbox
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] Enhance delayed message send through Outbox
- Date: Wed, 11 May 2016 08:51:41 +0000 (UTC)
commit 3f8fa420999a46c7aea030e783539f4d0a9aeb57
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]