[evolution-data-server] evo-I#113 - Make 'Mark messages as read' a folder/account option



commit c559c57c38b1a26043cd5795eebd80c35ebf2ed2
Author: Milan Crha <mcrha redhat com>
Date:   Wed Nov 7 21:46:15 2018 +0100

    evo-I#113 - Make 'Mark messages as read' a folder/account option
    
    Related to https://gitlab.gnome.org/GNOME/evolution/issues/113

 docs/reference/camel/camel-docs.sgml.in    |   4 +
 src/camel/camel-folder.c                   | 160 ++++++++++++++++++++++++++++-
 src/camel/camel-folder.h                   |   8 ++
 src/camel/camel-object.c                   |  16 +++
 src/libedataserver/e-source-mail-account.c | 146 +++++++++++++++++++++++++-
 src/libedataserver/e-source-mail-account.h |  11 ++
 6 files changed, 343 insertions(+), 2 deletions(-)
---
diff --git a/docs/reference/camel/camel-docs.sgml.in b/docs/reference/camel/camel-docs.sgml.in
index 2e66b6d4a..717b5606d 100644
--- a/docs/reference/camel/camel-docs.sgml.in
+++ b/docs/reference/camel/camel-docs.sgml.in
@@ -297,6 +297,10 @@
     <title>Index of deprecated symbols</title>
     <xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
   </index>
+  <index id="api-index-3-32" role="3.32">
+    <title>Index of new symbols in 3.32</title>
+    <xi:include href="xml/api-index-3.32.xml"><xi:fallback /></xi:include>
+  </index>
   <index id="api-index-3-30" role="3.30">
     <title>Index of new symbols in 3.30</title>
     <xi:include href="xml/api-index-3.30.xml"><xi:fallback /></xi:include>
diff --git a/src/camel/camel-folder.c b/src/camel/camel-folder.c
index 9c21e5940..abece0c9f 100644
--- a/src/camel/camel-folder.c
+++ b/src/camel/camel-folder.c
@@ -26,6 +26,7 @@
 
 #include "camel-db.h"
 #include "camel-debug.h"
+#include "camel-enumtypes.h"
 #include "camel-filter-driver.h"
 #include "camel-folder.h"
 #include "camel-mempool.h"
@@ -70,6 +71,9 @@ struct _CamelFolderPrivate {
        gchar *full_name;
        gchar *display_name;
        gchar *description;
+
+       CamelThreeState mark_seen;
+       gint mark_seen_timeout;
 };
 
 struct _AsyncContext {
@@ -112,7 +116,9 @@ enum {
        PROP_DESCRIPTION,
        PROP_DISPLAY_NAME,
        PROP_FULL_NAME,
-       PROP_PARENT_STORE
+       PROP_PARENT_STORE,
+       PROP_MARK_SEEN,
+       PROP_MARK_SEEN_TIMEOUT
 };
 
 enum {
@@ -587,6 +593,18 @@ folder_set_property (GObject *object,
                                CAMEL_FOLDER (object),
                                g_value_get_object (value));
                        return;
+
+               case PROP_MARK_SEEN:
+                       camel_folder_set_mark_seen (
+                               CAMEL_FOLDER (object),
+                               g_value_get_enum (value));
+                       return;
+
+               case PROP_MARK_SEEN_TIMEOUT:
+                       camel_folder_set_mark_seen_timeout (
+                               CAMEL_FOLDER (object),
+                               g_value_get_int (value));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -622,6 +640,18 @@ folder_get_property (GObject *object,
                                value, camel_folder_get_parent_store (
                                CAMEL_FOLDER (object)));
                        return;
+
+               case PROP_MARK_SEEN:
+                       g_value_set_enum (
+                               value, camel_folder_get_mark_seen (
+                               CAMEL_FOLDER (object)));
+                       return;
+
+               case PROP_MARK_SEEN_TIMEOUT:
+                       g_value_set_int (
+                               value, camel_folder_get_mark_seen_timeout (
+                               CAMEL_FOLDER (object)));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -1274,6 +1304,50 @@ camel_folder_class_init (CamelFolderClass *class)
                        G_PARAM_READWRITE |
                        G_PARAM_CONSTRUCT_ONLY));
 
+       /**
+        * CamelFolder:mark-seen
+        *
+        * A #CamelThreeState persistent option of the folder,
+        * which can override global option to mark messages
+        * as seen after certain interval.
+        *
+        * Since: 3.32
+        **/
+       g_object_class_install_property (
+               object_class,
+               PROP_MARK_SEEN,
+               g_param_spec_enum (
+                       "mark-seen",
+                       "Mark Seen",
+                       "Mark messages as read after N seconds",
+                       CAMEL_TYPE_THREE_STATE,
+                       CAMEL_THREE_STATE_INCONSISTENT,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT |
+                       G_PARAM_EXPLICIT_NOTIFY |
+                       CAMEL_PARAM_PERSISTENT));
+
+       /**
+        * CamelFolder:mark-seen-timeout
+        *
+        * Timeout in milliseconds for marking messages as seen.
+        *
+        * Since: 3.32
+        **/
+       g_object_class_install_property (
+               object_class,
+               PROP_MARK_SEEN_TIMEOUT,
+               g_param_spec_int (
+                       "mark-seen-timeout",
+                       "Mark Seen Timeout",
+                       "Mark seen timeout",
+                       0, G_MAXINT32,
+                       1500,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT |
+                       G_PARAM_EXPLICIT_NOTIFY |
+                       CAMEL_PARAM_PERSISTENT));
+
        /**
         * CamelFolder::changed
         * @folder: the #CamelFolder which emitted the signal
@@ -1765,6 +1839,90 @@ camel_folder_set_flags (CamelFolder *folder,
        folder->priv->folder_flags = folder_flags;
 }
 
+/**
+ * camel_folder_get_mark_seen:
+ * @folder: a #CamelFolder
+ *
+ * Returns: a #CamelThreeState, whether messages in this @folder
+ *    should be marked as seen automatically.
+ *
+ * Since: 3.32
+ **/
+CamelThreeState
+camel_folder_get_mark_seen (CamelFolder *folder)
+{
+       g_return_val_if_fail (CAMEL_IS_FOLDER (folder), CAMEL_THREE_STATE_INCONSISTENT);
+
+       return folder->priv->mark_seen;
+}
+
+/**
+ * camel_folder_set_mark_seen:
+ * @folder: a #CamelFolder
+ * @mark_seen: a #CamelThreeState as the value to set
+ *
+ * Sets whether the messages in this @folder should be marked
+ * as seen automatically. An inconsistent state means to use
+ * global option.
+ *
+ * Since: 3.32
+ **/
+void
+camel_folder_set_mark_seen (CamelFolder *folder,
+                           CamelThreeState mark_seen)
+{
+       g_return_if_fail (CAMEL_IS_FOLDER (folder));
+
+       if (folder->priv->mark_seen == mark_seen)
+               return;
+
+       folder->priv->mark_seen = mark_seen;
+
+       g_object_notify (G_OBJECT (folder), "mark-seen");
+}
+
+/**
+ * camel_folder_get_mark_seen_timeout:
+ * @folder: a #CamelFolder
+ *
+ * Returns: timeout in milliseconds for marking messages
+ *    as seen in this @folder
+ *
+ * Since: 3.32
+ **/
+gint
+camel_folder_get_mark_seen_timeout (CamelFolder *folder)
+{
+       g_return_val_if_fail (CAMEL_IS_FOLDER (folder), -1);
+
+       return folder->priv->mark_seen_timeout;
+}
+
+/**
+ * camel_folder_set_mark_seen_timeout:
+ * @folder: a #CamelFolder
+ * @timeout: a timeout in milliseconds
+ *
+ * Sets the @timeout in milliseconds for marking messages
+ * as seen in this @folder. Whether the timeout is used
+ * depends on camel_folder_get_mark_seen().
+ *
+ * Since: 3.32
+ **/
+void
+camel_folder_set_mark_seen_timeout (CamelFolder *folder,
+                                   gint timeout)
+{
+       g_return_if_fail (CAMEL_IS_FOLDER (folder));
+
+       if (folder->priv->mark_seen_timeout == timeout)
+               return;
+
+       folder->priv->mark_seen_timeout = timeout;
+
+       g_object_notify (G_OBJECT (folder), "mark-seen-timeout");
+}
+
 /**
  * camel_folder_get_permanent_flags:
  * @folder: a #CamelFolder
diff --git a/src/camel/camel-folder.h b/src/camel/camel-folder.h
index a20e183cf..ea5b80c44 100644
--- a/src/camel/camel-folder.h
+++ b/src/camel/camel-folder.h
@@ -301,6 +301,14 @@ void               camel_folder_set_description    (CamelFolder *folder,
 guint32                camel_folder_get_flags          (CamelFolder *folder);
 void           camel_folder_set_flags          (CamelFolder *folder,
                                                 guint32 folder_flags);
+CamelThreeState        camel_folder_get_mark_seen      (CamelFolder *folder);
+void           camel_folder_set_mark_seen      (CamelFolder *folder,
+                                                CamelThreeState mark_seen);
+gint           camel_folder_get_mark_seen_timeout
+                                               (CamelFolder *folder);
+void           camel_folder_set_mark_seen_timeout
+                                               (CamelFolder *folder,
+                                                gint timeout);
 guint32                camel_folder_get_permanent_flags
                                                (CamelFolder *folder);
 #ifndef CAMEL_DISABLE_DEPRECATED
diff --git a/src/camel/camel-object.c b/src/camel/camel-object.c
index 807c9acc5..6dbae762f 100644
--- a/src/camel/camel-object.c
+++ b/src/camel/camel-object.c
@@ -200,6 +200,7 @@ object_state_read (CamelObject *object,
        for (ii = 0; ii < count; ii++) {
                gboolean property_set = FALSE;
                guint32 tag, v_uint32;
+               gint32 v_int32;
 
                if (camel_file_util_decode_uint32 (fp, &tag) == -1)
                        goto exit;
@@ -213,6 +214,12 @@ object_state_read (CamelObject *object,
                                g_value_init (&value, G_TYPE_BOOLEAN);
                                g_value_set_boolean (&value, (gboolean) v_uint32);
                                break;
+                       case CAMEL_ARG_INT:
+                               if (camel_file_util_decode_fixed_int32 (fp, &v_int32) == -1)
+                                       goto exit;
+                               g_value_init (&value, G_TYPE_INT);
+                               g_value_set_int (&value, v_int32);
+                               break;
                        case CAMEL_ARG_3ST:
                                if (camel_file_util_decode_uint32 (fp, &v_uint32) == -1)
                                        goto exit;
@@ -320,6 +327,7 @@ object_state_write (CamelObject *object,
        for (ii = 0; ii < n_properties; ii++) {
                GParamSpec *pspec = properties[ii];
                guint32 tag, v_uint32;
+               gint32 v_int32;
 
                if ((pspec->flags & CAMEL_PARAM_PERSISTENT) == 0)
                        continue;
@@ -342,6 +350,14 @@ object_state_write (CamelObject *object,
                                if (camel_file_util_encode_uint32 (fp, v_uint32) == -1)
                                        goto exit;
                                break;
+                       case G_TYPE_INT:
+                               tag |= CAMEL_ARG_INT;
+                               v_int32 = g_value_get_int (&value);
+                               if (camel_file_util_encode_uint32 (fp, tag) == -1)
+                                       goto exit;
+                               if (camel_file_util_encode_fixed_int32 (fp, v_int32) == -1)
+                                       goto exit;
+                               break;
                        default:
                                if (pspec->value_type == CAMEL_TYPE_THREE_STATE) {
                                        tag |= CAMEL_ARG_3ST;
diff --git a/src/libedataserver/e-source-mail-account.c b/src/libedataserver/e-source-mail-account.c
index 6b27fe6d6..5dab9c7fc 100644
--- a/src/libedataserver/e-source-mail-account.c
+++ b/src/libedataserver/e-source-mail-account.c
@@ -48,13 +48,17 @@ struct _ESourceMailAccountPrivate {
        gchar *identity_uid;
        gchar *archive_folder;
        gboolean needs_initial_setup;
+       EThreeState mark_seen;
+       gint mark_seen_timeout;
 };
 
 enum {
        PROP_0,
        PROP_IDENTITY_UID,
        PROP_ARCHIVE_FOLDER,
-       PROP_NEEDS_INITIAL_SETUP
+       PROP_NEEDS_INITIAL_SETUP,
+       PROP_MARK_SEEN,
+       PROP_MARK_SEEN_TIMEOUT
 };
 
 G_DEFINE_TYPE (
@@ -86,6 +90,18 @@ source_mail_account_set_property (GObject *object,
                                E_SOURCE_MAIL_ACCOUNT (object),
                                g_value_get_boolean (value));
                        return;
+
+               case PROP_MARK_SEEN:
+                       e_source_mail_account_set_mark_seen (
+                               E_SOURCE_MAIL_ACCOUNT (object),
+                               g_value_get_enum (value));
+                       return;
+
+               case PROP_MARK_SEEN_TIMEOUT:
+                       e_source_mail_account_set_mark_seen_timeout (
+                               E_SOURCE_MAIL_ACCOUNT (object),
+                               g_value_get_int (value));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -118,6 +134,20 @@ source_mail_account_get_property (GObject *object,
                                e_source_mail_account_get_needs_initial_setup (
                                E_SOURCE_MAIL_ACCOUNT (object)));
                        return;
+
+               case PROP_MARK_SEEN:
+                       g_value_set_enum (
+                               value,
+                               e_source_mail_account_get_mark_seen (
+                               E_SOURCE_MAIL_ACCOUNT (object)));
+                       return;
+
+               case PROP_MARK_SEEN_TIMEOUT:
+                       g_value_set_int (
+                               value,
+                               e_source_mail_account_get_mark_seen_timeout (
+                               E_SOURCE_MAIL_ACCOUNT (object)));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -194,6 +224,36 @@ e_source_mail_account_class_init (ESourceMailAccountClass *class)
                        G_PARAM_EXPLICIT_NOTIFY |
                        G_PARAM_STATIC_STRINGS |
                        E_SOURCE_PARAM_SETTING));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_MARK_SEEN,
+               g_param_spec_enum (
+                       "mark-seen",
+                       "Mark Seen",
+                       "Three-state option for Mark messages as read after N seconds",
+                       E_TYPE_THREE_STATE,
+                       E_THREE_STATE_INCONSISTENT,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT |
+                       G_PARAM_EXPLICIT_NOTIFY |
+                       G_PARAM_STATIC_STRINGS |
+                       E_SOURCE_PARAM_SETTING));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_MARK_SEEN_TIMEOUT,
+               g_param_spec_int (
+                       "mark-seen-timeout",
+                       "Mark Seen Timeout",
+                       "Timeout in milliseconds for Mark messages as read after N seconds",
+                       0, G_MAXINT,
+                       1500,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT |
+                       G_PARAM_EXPLICIT_NOTIFY |
+                       G_PARAM_STATIC_STRINGS |
+                       E_SOURCE_PARAM_SETTING));
 }
 
 static void
@@ -408,3 +468,87 @@ e_source_mail_account_set_needs_initial_setup (ESourceMailAccount *extension,
 
        g_object_notify (G_OBJECT (extension), "needs-initial-setup");
 }
+
+/**
+ * e_source_mail_account_get_mark_seen:
+ * @extension: an #ESourceMailAccount
+ *
+ * Returns: an #EThreeState, whether messages in this account
+ *    should be marked as seen automatically.
+ *
+ * Since: 3.32
+ **/
+EThreeState
+e_source_mail_account_get_mark_seen (ESourceMailAccount *extension)
+{
+       g_return_val_if_fail (E_IS_SOURCE_MAIL_ACCOUNT (extension), E_THREE_STATE_INCONSISTENT);
+
+       return extension->priv->mark_seen;
+}
+
+/**
+ * e_source_mail_account_set_mark_seen:
+ * @extension: an #ESourceMailAccount
+ * @mark_seen: an #EThreeState as the value to set
+ *
+ * Sets whether the messages in this account should be marked
+ * as seen automatically. An inconsistent state means to use
+ * global option.
+ *
+ * Since: 3.32
+ **/
+void
+e_source_mail_account_set_mark_seen (ESourceMailAccount *extension,
+                                    EThreeState mark_seen)
+{
+       g_return_if_fail (E_IS_SOURCE_MAIL_ACCOUNT (extension));
+
+       if (extension->priv->mark_seen == mark_seen)
+               return;
+
+       extension->priv->mark_seen = mark_seen;
+
+       g_object_notify (G_OBJECT (extension), "mark-seen");
+}
+
+/**
+ * e_source_mail_account_get_mark_seen_timeout:
+ * @extension: an #ESourceMailAccount
+ *
+ * Returns: timeout in milliseconds for marking messages
+ *    as seen in this account
+ *
+ * Since: 3.32
+ **/
+gint
+e_source_mail_account_get_mark_seen_timeout (ESourceMailAccount *extension)
+{
+       g_return_val_if_fail (E_IS_SOURCE_MAIL_ACCOUNT (extension), -1);
+
+       return extension->priv->mark_seen_timeout;
+}
+
+/**
+ * e_source_mail_account_set_mark_seen_timeout:
+ * @extension: an #ESourceMailAccount
+ * @timeout: a timeout in milliseconds
+ *
+ * Sets the @timeout in milliseconds for marking messages
+ * as seen in this account. Whether the timeout is used
+ * depends on e_source_mail_account_get_mark_seen().
+ *
+ * Since: 3.32
+ **/
+void
+e_source_mail_account_set_mark_seen_timeout (ESourceMailAccount *extension,
+                                            gint timeout)
+{
+       g_return_if_fail (E_IS_SOURCE_MAIL_ACCOUNT (extension));
+
+       if (extension->priv->mark_seen_timeout == timeout)
+               return;
+
+       extension->priv->mark_seen_timeout = timeout;
+
+       g_object_notify (G_OBJECT (extension), "mark-seen-timeout");
+}
diff --git a/src/libedataserver/e-source-mail-account.h b/src/libedataserver/e-source-mail-account.h
index 0c1c468ff..4039b9edb 100644
--- a/src/libedataserver/e-source-mail-account.h
+++ b/src/libedataserver/e-source-mail-account.h
@@ -23,6 +23,7 @@
 #define E_SOURCE_MAIL_ACCOUNT_H
 
 #include <libedataserver/e-source-backend.h>
+#include <libedataserver/e-source-enums.h>
 
 /* Standard GObject macros */
 #define E_TYPE_SOURCE_MAIL_ACCOUNT \
@@ -98,6 +99,16 @@ gboolean     e_source_mail_account_get_needs_initial_setup
 void           e_source_mail_account_set_needs_initial_setup
                                        (ESourceMailAccount *extension,
                                         gboolean needs_initial_setup);
+EThreeState    e_source_mail_account_get_mark_seen
+                                       (ESourceMailAccount *extension);
+void           e_source_mail_account_set_mark_seen
+                                       (ESourceMailAccount *extension,
+                                        EThreeState mark_seen);
+gint           e_source_mail_account_get_mark_seen_timeout
+                                       (ESourceMailAccount *extension);
+void           e_source_mail_account_set_mark_seen_timeout
+                                       (ESourceMailAccount *extension,
+                                        gint timeout);
 
 G_END_DECLS
 


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