[evolution-data-server] Bug 772947 - Global junk test option doesn't respect account settings



commit 517204d3e39a8c9385f523a280870e6b67727e1d
Author: Milan Crha <mcrha redhat com>
Date:   Thu Nov 10 14:20:52 2016 +0100

    Bug 772947 - Global junk test option doesn't respect account settings

 src/camel/camel-folder.c                         |    2 +-
 src/camel/camel-local-settings.c                 |  135 ++++++++++++++++++++++
 src/camel/camel-local-settings.h                 |   10 ++
 src/camel/camel-session.c                        |   13 ++-
 src/camel/camel-session.h                        |    2 +
 src/camel/providers/local/camel-local-folder.c   |   10 ++
 src/camel/providers/local/camel-local-provider.c |   13 ++
 src/camel/providers/nntp/camel-nntp-folder.c     |    6 +-
 src/camel/providers/nntp/camel-nntp-provider.c   |    2 +
 src/camel/providers/nntp/camel-nntp-settings.c   |   68 +++++++++++
 src/camel/providers/nntp/camel-nntp-settings.h   |    5 +
 11 files changed, 260 insertions(+), 6 deletions(-)
---
diff --git a/src/camel/camel-folder.c b/src/camel/camel-folder.c
index 460da61..87bb683 100644
--- a/src/camel/camel-folder.c
+++ b/src/camel/camel-folder.c
@@ -1144,7 +1144,7 @@ folder_changed (CamelFolder *folder,
                driver = camel_session_get_filter_driver (
                        session,
                        (camel_folder_get_flags (folder) & CAMEL_FOLDER_FILTER_RECENT)
-                       ? "incoming" : "junktest", NULL);
+                       ? "incoming" : "junktest", folder, NULL);
 
        if (driver) {
                recents = g_ptr_array_new ();
diff --git a/src/camel/camel-local-settings.c b/src/camel/camel-local-settings.c
index 800d64b..023cb5d 100644
--- a/src/camel/camel-local-settings.c
+++ b/src/camel/camel-local-settings.c
@@ -26,10 +26,14 @@
 struct _CamelLocalSettingsPrivate {
        GMutex property_lock;
        gchar *path;
+       gboolean filter_all;
+       gboolean filter_junk;
 };
 
 enum {
        PROP_0,
+       PROP_FILTER_ALL,
+       PROP_FILTER_JUNK,
        PROP_PATH
 };
 
@@ -45,6 +49,18 @@ local_settings_set_property (GObject *object,
                              GParamSpec *pspec)
 {
        switch (property_id) {
+               case PROP_FILTER_ALL:
+                       camel_local_settings_set_filter_all (
+                               CAMEL_LOCAL_SETTINGS (object),
+                               g_value_get_boolean (value));
+                       return;
+
+               case PROP_FILTER_JUNK:
+                       camel_local_settings_set_filter_junk (
+                               CAMEL_LOCAL_SETTINGS (object),
+                               g_value_get_boolean (value));
+                       return;
+
                case PROP_PATH:
                        camel_local_settings_set_path (
                                CAMEL_LOCAL_SETTINGS (object),
@@ -62,6 +78,20 @@ local_settings_get_property (GObject *object,
                              GParamSpec *pspec)
 {
        switch (property_id) {
+               case PROP_FILTER_ALL:
+                       g_value_set_boolean (
+                               value,
+                               camel_local_settings_get_filter_all (
+                               CAMEL_LOCAL_SETTINGS (object)));
+                       return;
+
+               case PROP_FILTER_JUNK:
+                       g_value_set_boolean (
+                               value,
+                               camel_local_settings_get_filter_junk (
+                               CAMEL_LOCAL_SETTINGS (object)));
+                       return;
+
                case PROP_PATH:
                        g_value_take_string (
                                value,
@@ -111,6 +141,30 @@ camel_local_settings_class_init (CamelLocalSettingsClass *class)
                        G_PARAM_READWRITE |
                        G_PARAM_CONSTRUCT |
                        G_PARAM_STATIC_STRINGS));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_FILTER_ALL,
+               g_param_spec_boolean (
+                       "filter-all",
+                       "Filter All",
+                       "Whether to apply filters in all folders",
+                       FALSE,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT |
+                       G_PARAM_STATIC_STRINGS));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_FILTER_JUNK,
+               g_param_spec_boolean (
+                       "filter-junk",
+                       "Filter Junk",
+                       "Whether to check new messages for junk",
+                       TRUE,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT |
+                       G_PARAM_STATIC_STRINGS));
 }
 
 static void
@@ -218,3 +272,84 @@ camel_local_settings_set_path (CamelLocalSettings *settings,
        g_object_notify (G_OBJECT (settings), "path");
 }
 
+/**
+ * camel_local_settings_get_filter_all:
+ * @settings: a #CamelLocalSettings
+ *
+ * Returns whether apply filters in all folders.
+ *
+ * Returns: whether to apply filters in all folders
+ *
+ * Since: 3.24
+ **/
+gboolean
+camel_local_settings_get_filter_all (CamelLocalSettings *settings)
+{
+       g_return_val_if_fail (CAMEL_IS_LOCAL_SETTINGS (settings), FALSE);
+
+       return settings->priv->filter_all;
+}
+
+/**
+ * camel_local_settings_set_filter_all:
+ * @settings: a #CamelLocalSettings
+ * @filter_all: whether to apply filters in all folders
+ *
+ * Sets whether to apply filters in all folders.
+ *
+ * Since: 3.24
+ **/
+void
+camel_local_settings_set_filter_all (CamelLocalSettings *settings,
+                                    gboolean filter_all)
+{
+       g_return_if_fail (CAMEL_IS_LOCAL_SETTINGS (settings));
+
+       if (settings->priv->filter_all == filter_all)
+               return;
+
+       settings->priv->filter_all = filter_all;
+
+       g_object_notify (G_OBJECT (settings), "filter-all");
+}
+
+/**
+ * camel_local_settings_get_filter_junk:
+ * @settings: a #CamelLocalSettings
+ *
+ * Returns whether to check new messages for junk.
+ *
+ * Returns: whether to check new messages for junk
+ *
+ * Since: 3.24
+ **/
+gboolean
+camel_local_settings_get_filter_junk (CamelLocalSettings *settings)
+{
+       g_return_val_if_fail (CAMEL_IS_LOCAL_SETTINGS (settings), FALSE);
+
+       return settings->priv->filter_junk;
+}
+
+/**
+ * camel_local_settings_set_filter_junk:
+ * @settings: a #CamelLocalSettings
+ * @filter_junk: whether to check new messages for junk
+ *
+ * Sets whether to check new messages for junk.
+ *
+ * Since: 3.24
+ **/
+void
+camel_local_settings_set_filter_junk (CamelLocalSettings *settings,
+                                     gboolean filter_junk)
+{
+       g_return_if_fail (CAMEL_IS_LOCAL_SETTINGS (settings));
+
+       if (settings->priv->filter_junk == filter_junk)
+               return;
+
+       settings->priv->filter_junk = filter_junk;
+
+       g_object_notify (G_OBJECT (settings), "filter-junk");
+}
diff --git a/src/camel/camel-local-settings.h b/src/camel/camel-local-settings.h
index 6775928..ea5b76c 100644
--- a/src/camel/camel-local-settings.h
+++ b/src/camel/camel-local-settings.h
@@ -76,6 +76,16 @@ const gchar *        camel_local_settings_get_path   (CamelLocalSettings *settings);
 gchar *                camel_local_settings_dup_path   (CamelLocalSettings *settings);
 void           camel_local_settings_set_path   (CamelLocalSettings *settings,
                                                 const gchar *path);
+gboolean       camel_local_settings_get_filter_all
+                                       (CamelLocalSettings *settings);
+void           camel_local_settings_set_filter_all
+                                       (CamelLocalSettings *settings,
+                                        gboolean filter_all);
+gboolean       camel_local_settings_get_filter_junk
+                                       (CamelLocalSettings *settings);
+void           camel_local_settings_set_filter_junk
+                                       (CamelLocalSettings *settings,
+                                        gboolean filter_junk);
 
 G_END_DECLS
 
diff --git a/src/camel/camel-session.c b/src/camel/camel-session.c
index c7d76b9..0029f3c 100644
--- a/src/camel/camel-session.c
+++ b/src/camel/camel-session.c
@@ -1361,14 +1361,19 @@ camel_session_set_online (CamelSession *session,
  * camel_session_get_filter_driver:
  * @session: a #CamelSession
  * @type: the type of filter (eg, "incoming")
+ * @for_folder: (nullable): an optional #CamelFolder, for which the filter driver will run, or %NULL
  * @error: return location for a #GError, or %NULL
  *
- * Returns:(transfer none): a filter driver, loaded with applicable rules
+ * The optional @for_folder can be used to determine which filters
+ * to add and which not.
+ *
+ * Returns: (transfer none): a filter driver, loaded with applicable rules
  **/
 CamelFilterDriver *
 camel_session_get_filter_driver (CamelSession *session,
-                                 const gchar *type,
-                                 GError **error)
+                                const gchar *type,
+                                CamelFolder *for_folder,
+                                GError **error)
 {
        CamelSessionClass *class;
        CamelFilterDriver *driver;
@@ -1379,7 +1384,7 @@ camel_session_get_filter_driver (CamelSession *session,
        class = CAMEL_SESSION_GET_CLASS (session);
        g_return_val_if_fail (class->get_filter_driver != NULL, NULL);
 
-       driver = class->get_filter_driver (session, type, error);
+       driver = class->get_filter_driver (session, type, for_folder, error);
        CAMEL_CHECK_GERROR (session, get_filter_driver, driver != NULL, error);
 
        return driver;
diff --git a/src/camel/camel-session.h b/src/camel/camel-session.h
index 1745ac6..cdf8184 100644
--- a/src/camel/camel-session.h
+++ b/src/camel/camel-session.h
@@ -115,6 +115,7 @@ struct _CamelSessionClass {
        CamelFilterDriver *
                        (*get_filter_driver)    (CamelSession *session,
                                                 const gchar *type,
+                                                CamelFolder *for_folder,
                                                 GError **error);
        gboolean        (*lookup_addressbook)   (CamelSession *session,
                                                 const gchar *name);
@@ -200,6 +201,7 @@ void                camel_session_set_online        (CamelSession *session,
 CamelFilterDriver *
                camel_session_get_filter_driver (CamelSession *session,
                                                 const gchar *type,
+                                                CamelFolder *for_folder,
                                                 GError **error);
 CamelJunkFilter *
                camel_session_get_junk_filter   (CamelSession *session);
diff --git a/src/camel/providers/local/camel-local-folder.c b/src/camel/providers/local/camel-local-folder.c
index 1b451aa..e978aa1 100644
--- a/src/camel/providers/local/camel-local-folder.c
+++ b/src/camel/providers/local/camel-local-folder.c
@@ -544,6 +544,7 @@ camel_local_folder_construct (CamelLocalFolder *lf,
        CamelStore *parent_store;
        const gchar *full_name;
        gboolean need_summary_check;
+       gboolean filter_all = FALSE, filter_junk = TRUE;
 
        folder = CAMEL_FOLDER (lf);
        full_name = camel_folder_get_full_name (folder);
@@ -555,12 +556,21 @@ camel_local_folder_construct (CamelLocalFolder *lf,
 
        local_settings = CAMEL_LOCAL_SETTINGS (settings);
        lf->base_path = camel_local_settings_dup_path (local_settings);
+       filter_all = camel_local_settings_get_filter_all (local_settings);
+       filter_junk = camel_local_settings_get_filter_junk (local_settings);
 
        g_object_unref (settings);
 
        ls = CAMEL_LOCAL_STORE (parent_store);
        need_summary_check = camel_local_store_get_need_summary_check (ls);
 
+       filter_junk = filter_junk || camel_local_store_is_main_store (CAMEL_LOCAL_STORE (parent_store));
+       if (filter_all || filter_junk) {
+               camel_folder_set_flags (folder, camel_folder_get_flags (folder) |
+                       (filter_all ? CAMEL_FOLDER_FILTER_RECENT : 0) |
+                       (filter_junk ? CAMEL_FOLDER_FILTER_JUNK : 0));
+       }
+
        lf->folder_path = camel_local_store_get_full_path (ls, full_name);
        lf->index_path = camel_local_store_get_meta_path (ls, full_name, ".ibex");
        statepath = camel_local_store_get_meta_path (ls, full_name, ".cmeta");
diff --git a/src/camel/providers/local/camel-local-provider.c 
b/src/camel/providers/local/camel-local-provider.c
index 0613dd0..af18e7c 100644
--- a/src/camel/providers/local/camel-local-provider.c
+++ b/src/camel/providers/local/camel-local-provider.c
@@ -35,6 +35,10 @@
 
 static CamelProviderConfEntry mh_conf_entries[] = {
        { CAMEL_PROVIDER_CONF_SECTION_START, "general", NULL, N_("Options") },
+       { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-all", NULL,
+         N_("Apply _filters to new messages in all folders"), "1" },
+       { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-junk", NULL,
+         N_("Check new messages for _Junk contents"), "1" },
        { CAMEL_PROVIDER_CONF_CHECKBOX, "use-dot-folders", NULL,
          N_("_Use the '.folders' folder summary file (exmh)"), "0" },
        { CAMEL_PROVIDER_CONF_SECTION_END },
@@ -56,6 +60,11 @@ static CamelProvider mh_provider = {
 #endif
 
 static CamelProviderConfEntry mbox_conf_entries[] = {
+       { CAMEL_PROVIDER_CONF_SECTION_START, "general", NULL, N_("Options") },
+       { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-all", NULL,
+         N_("Apply _filters to new messages"), "1" },
+       { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-junk", NULL,
+         N_("Check new messages for _Junk contents"), "1" },
        { CAMEL_PROVIDER_CONF_END }
 };
 
@@ -75,6 +84,8 @@ static CamelProviderConfEntry maildir_conf_entries[] = {
        { CAMEL_PROVIDER_CONF_SECTION_START, "general", NULL, N_("Options") },
        { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-inbox", NULL,
          N_("_Apply filters to new messages in Inbox"), "0" },
+       { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-junk", NULL,
+         N_("Check new messages for _Junk contents"), "1" },
        { CAMEL_PROVIDER_CONF_SECTION_END },
        { CAMEL_PROVIDER_CONF_END }
 };
@@ -97,6 +108,8 @@ static CamelProviderConfEntry spool_conf_entries[] = {
        { CAMEL_PROVIDER_CONF_SECTION_START, "general", NULL, N_("Options") },
        { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-inbox", NULL,
          N_("_Apply filters to new messages in Inbox"), "0" },
+       { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-junk", NULL,
+         N_("Check new messages for _Junk contents"), "1" },
        { CAMEL_PROVIDER_CONF_CHECKBOX, "use-xstatus-headers", NULL, N_("_Store status headers in 
Elm/Pine/Mutt format"), "0" },
        { CAMEL_PROVIDER_CONF_SECTION_END },
        { CAMEL_PROVIDER_CONF_END }
diff --git a/src/camel/providers/nntp/camel-nntp-folder.c b/src/camel/providers/nntp/camel-nntp-folder.c
index 8ff03a1..5453586 100644
--- a/src/camel/providers/nntp/camel-nntp-folder.c
+++ b/src/camel/providers/nntp/camel-nntp-folder.c
@@ -783,7 +783,7 @@ camel_nntp_folder_new (CamelStore *parent,
        CamelStoreInfo *si;
        const gchar *user_cache_dir;
        gboolean subscribed = TRUE;
-       gboolean filter_all;
+       gboolean filter_all = FALSE, filter_junk = TRUE;
 
        service = CAMEL_SERVICE (parent);
        user_cache_dir = camel_service_get_user_cache_dir (service);
@@ -793,6 +793,7 @@ camel_nntp_folder_new (CamelStore *parent,
        g_object_get (
                settings,
                "filter-all", &filter_all,
+               "filter-junk", &filter_junk,
                NULL);
 
        g_object_unref (settings);
@@ -818,6 +819,9 @@ camel_nntp_folder_new (CamelStore *parent,
        if (filter_all || nntp_folder_get_apply_filters (nntp_folder))
                camel_folder_set_flags (folder, camel_folder_get_flags (folder) | CAMEL_FOLDER_FILTER_RECENT);
 
+       if (filter_junk)
+               camel_folder_set_flags (folder, camel_folder_get_flags (folder) | CAMEL_FOLDER_FILTER_JUNK);
+
        camel_folder_summary_load (camel_folder_get_folder_summary (folder), NULL);
 
        nntp_store = CAMEL_NNTP_STORE (parent);
diff --git a/src/camel/providers/nntp/camel-nntp-provider.c b/src/camel/providers/nntp/camel-nntp-provider.c
index a2382a1..4f88ede 100644
--- a/src/camel/providers/nntp/camel-nntp-provider.c
+++ b/src/camel/providers/nntp/camel-nntp-provider.c
@@ -36,6 +36,8 @@ static CamelProviderConfEntry nntp_conf_entries[] = {
        { CAMEL_PROVIDER_CONF_SECTION_START, "general", NULL, N_("Options") },
        { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-all", NULL,
          N_("Apply _filters to new messages in all folders"), "0" },
+       { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-junk", NULL,
+         N_("Check new messages for _Junk contents"), "0" },
        { CAMEL_PROVIDER_CONF_SECTION_END },
        { CAMEL_PROVIDER_CONF_SECTION_START, "folders", NULL,
          N_("Folders") },
diff --git a/src/camel/providers/nntp/camel-nntp-settings.c b/src/camel/providers/nntp/camel-nntp-settings.c
index 94feefb..921ed2c 100644
--- a/src/camel/providers/nntp/camel-nntp-settings.c
+++ b/src/camel/providers/nntp/camel-nntp-settings.c
@@ -23,6 +23,7 @@
 
 struct _CamelNNTPSettingsPrivate {
        gboolean filter_all;
+       gboolean filter_junk;
        gboolean folder_hierarchy_relative;
        gboolean short_folder_names;
 };
@@ -31,6 +32,7 @@ enum {
        PROP_0,
        PROP_AUTH_MECHANISM,
        PROP_FILTER_ALL,
+       PROP_FILTER_JUNK,
        PROP_FOLDER_HIERARCHY_RELATIVE,
        PROP_HOST,
        PROP_PORT,
@@ -65,6 +67,12 @@ nntp_settings_set_property (GObject *object,
                                g_value_get_boolean (value));
                        return;
 
+               case PROP_FILTER_JUNK:
+                       camel_nntp_settings_set_filter_junk (
+                               CAMEL_NNTP_SETTINGS (object),
+                               g_value_get_boolean (value));
+                       return;
+
                case PROP_FOLDER_HIERARCHY_RELATIVE:
                        camel_nntp_settings_set_folder_hierarchy_relative (
                                CAMEL_NNTP_SETTINGS (object),
@@ -126,6 +134,13 @@ nntp_settings_get_property (GObject *object,
                                CAMEL_NNTP_SETTINGS (object)));
                        return;
 
+               case PROP_FILTER_JUNK:
+                       g_value_set_boolean (
+                               value,
+                               camel_nntp_settings_get_filter_junk (
+                               CAMEL_NNTP_SETTINGS (object)));
+                       return;
+
                case PROP_FOLDER_HIERARCHY_RELATIVE:
                        g_value_set_boolean (
                                value,
@@ -248,6 +263,18 @@ camel_nntp_settings_class_init (CamelNNTPSettingsClass *class)
                        G_PARAM_READWRITE |
                        G_PARAM_CONSTRUCT |
                        G_PARAM_STATIC_STRINGS));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_FILTER_JUNK,
+               g_param_spec_boolean (
+                       "filter-junk",
+                       "Filter Junk",
+                       "Whether to check new messages for junk",
+                       TRUE,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT |
+                       G_PARAM_STATIC_STRINGS));
 }
 
 static void
@@ -298,6 +325,47 @@ camel_nntp_settings_set_filter_all (CamelNNTPSettings *settings,
 }
 
 /**
+ * camel_nntp_settings_get_filter_junk:
+ * @settings: a #CamelNNTPSettings
+ *
+ * Returns whether to check new messages for junk.
+ *
+ * Returns: whether to check new messages for junk
+ *
+ * Since: 3.24
+ **/
+gboolean
+camel_nntp_settings_get_filter_junk (CamelNNTPSettings *settings)
+{
+       g_return_val_if_fail (CAMEL_IS_NNTP_SETTINGS (settings), FALSE);
+
+       return settings->priv->filter_junk;
+}
+
+/**
+ * camel_nntp_settings_set_filter_junk:
+ * @settings: a #CamelNNTPSettings
+ * @filter_junk: whether to check new messages for junk
+ *
+ * Sets whether to check new messages for junk.
+ *
+ * Since: 3.24
+ **/
+void
+camel_nntp_settings_set_filter_junk (CamelNNTPSettings *settings,
+                                    gboolean filter_junk)
+{
+       g_return_if_fail (CAMEL_IS_NNTP_SETTINGS (settings));
+
+       if (settings->priv->filter_junk == filter_junk)
+               return;
+
+       settings->priv->filter_junk = filter_junk;
+
+       g_object_notify (G_OBJECT (settings), "filter-junk");
+}
+
+/**
  * camel_nntp_settings_get_folder_hierarchy_relative:
  * @settings: a #CamelNNTPSettings
  *
diff --git a/src/camel/providers/nntp/camel-nntp-settings.h b/src/camel/providers/nntp/camel-nntp-settings.h
index 74b198e..8aa5233 100644
--- a/src/camel/providers/nntp/camel-nntp-settings.h
+++ b/src/camel/providers/nntp/camel-nntp-settings.h
@@ -64,6 +64,11 @@ gboolean     camel_nntp_settings_get_filter_all
 void           camel_nntp_settings_set_filter_all
                                        (CamelNNTPSettings *settings,
                                         gboolean filter_all);
+gboolean       camel_nntp_settings_get_filter_junk
+                                       (CamelNNTPSettings *settings);
+void           camel_nntp_settings_set_filter_junk
+                                       (CamelNNTPSettings *settings,
+                                        gboolean filter_junk);
 gboolean       camel_nntp_settings_get_folder_hierarchy_relative
                                        (CamelNNTPSettings *settings);
 void           camel_nntp_settings_set_folder_hierarchy_relative


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