[evolution-data-server] Bug #309945 - Ability to filter folders other than INBOX too
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Bug #309945 - Ability to filter folders other than INBOX too
- Date: Tue, 7 Feb 2012 11:57:08 +0000 (UTC)
commit 88b7d1fb53aafb66d19625553dfbc1678dc9239c
Author: Milan Crha <mcrha redhat com>
Date: Tue Feb 7 12:55:59 2012 +0100
Bug #309945 - Ability to filter folders other than INBOX too
camel/camel-object.c | 2 +
camel/providers/imap/camel-imap-folder.c | 103 ++++++++++++++++++--------
camel/providers/imap/camel-imap-private.h | 1 +
camel/providers/imap/camel-imap-provider.c | 4 +-
camel/providers/imap/camel-imap-settings.c | 65 ++++++++++++++++
camel/providers/imap/camel-imap-settings.h | 5 +
camel/providers/imapx/camel-imapx-folder.c | 91 ++++++++++++++++++++++-
camel/providers/imapx/camel-imapx-folder.h | 2 +
camel/providers/imapx/camel-imapx-provider.c | 4 +-
camel/providers/imapx/camel-imapx-settings.c | 65 ++++++++++++++++
camel/providers/imapx/camel-imapx-settings.h | 5 +
camel/providers/nntp/camel-nntp-folder.c | 99 +++++++++++++++++++++++-
camel/providers/nntp/camel-nntp-private.h | 2 +
camel/providers/nntp/camel-nntp-provider.c | 4 +
camel/providers/nntp/camel-nntp-settings.c | 65 ++++++++++++++++
camel/providers/nntp/camel-nntp-settings.h | 5 +
camel/providers/nntp/camel-nntp-summary.c | 10 +++
17 files changed, 491 insertions(+), 41 deletions(-)
---
diff --git a/camel/camel-object.c b/camel/camel-object.c
index cf1e245..ede155b 100644
--- a/camel/camel-object.c
+++ b/camel/camel-object.c
@@ -224,6 +224,8 @@ object_state_read (CamelObject *object,
/* Sanity check. */
g_warn_if_fail (pspec->flags & CAMEL_PARAM_PERSISTENT);
+ if ((pspec->flags & CAMEL_PARAM_PERSISTENT) == 0)
+ continue;
g_object_set_property (
G_OBJECT (object), pspec->name, &value);
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c
index 0b19e25..d1ab781 100644
--- a/camel/providers/imap/camel-imap-folder.c
+++ b/camel/providers/imap/camel-imap-folder.c
@@ -63,7 +63,8 @@
* It still identifies the property in state files. */
enum {
PROP_0,
- PROP_CHECK_FOLDER = 0x2500
+ PROP_CHECK_FOLDER = 0x2500,
+ PROP_APPLY_FILTERS
};
extern gint camel_application_is_exiting;
@@ -137,6 +138,30 @@ static gboolean imap_transfer_messages (CamelFolder *source,
GCancellable *cancellable,
GError **error);
+static gboolean
+imap_folder_get_apply_filters (CamelImapFolder *folder)
+{
+ g_return_val_if_fail (folder != NULL, FALSE);
+ g_return_val_if_fail (CAMEL_IS_IMAP_FOLDER (folder), FALSE);
+
+ return folder->priv->apply_filters;
+}
+
+static void
+imap_folder_set_apply_filters (CamelImapFolder *folder,
+ gboolean apply_filters)
+{
+ g_return_if_fail (folder != NULL);
+ g_return_if_fail (CAMEL_IS_IMAP_FOLDER (folder));
+
+ if ((folder->priv->apply_filters ? 1 : 0) == (apply_filters ? 1 : 0))
+ return;
+
+ folder->priv->apply_filters = apply_filters;
+
+ g_object_notify (G_OBJECT (folder), "apply-filters");
+}
+
#ifdef G_OS_WIN32
/* The strtok() in Microsoft's C library is MT-safe (but still uses
* only one buffer pointer per thread, but for the use of strtok_r()
@@ -159,6 +184,12 @@ imap_folder_set_property (GObject *object,
CAMEL_IMAP_FOLDER (object),
g_value_get_boolean (value));
return;
+
+ case PROP_APPLY_FILTERS:
+ imap_folder_set_apply_filters (
+ CAMEL_IMAP_FOLDER (object),
+ g_value_get_boolean (value));
+ return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -176,6 +207,12 @@ imap_folder_get_property (GObject *object,
value, camel_imap_folder_get_check_folder (
CAMEL_IMAP_FOLDER (object)));
return;
+
+ case PROP_APPLY_FILTERS:
+ g_value_set_boolean (
+ value, imap_folder_get_apply_filters (
+ CAMEL_IMAP_FOLDER (object)));
+ return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -308,6 +345,17 @@ camel_imap_folder_class_init (CamelImapFolderClass *class)
FALSE,
G_PARAM_READWRITE |
CAMEL_PARAM_PERSISTENT));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_APPLY_FILTERS,
+ g_param_spec_boolean (
+ "apply-filters",
+ "Apply Filters",
+ _("Apply message filters to this folder"),
+ FALSE,
+ G_PARAM_READWRITE |
+ CAMEL_PARAM_PERSISTENT));
}
static void
@@ -375,6 +423,12 @@ camel_imap_folder_new (CamelStore *parent,
CamelImapFolder *imap_folder;
const gchar *short_name;
gchar *state_file, *path;
+ CamelService *service;
+ CamelSettings *settings;
+ gboolean filter_all;
+ gboolean filter_inbox;
+ gboolean filter_junk;
+ gboolean filter_junk_inbox;
if (g_mkdir_with_parents (folder_dir, S_IRWXU) != 0) {
g_set_error (
@@ -422,42 +476,29 @@ camel_imap_folder_new (CamelStore *parent,
return NULL;
}
+ service = CAMEL_SERVICE (parent);
+ settings = camel_service_get_settings (service);
+
+ g_object_get (
+ settings,
+ "filter-all", &filter_all,
+ "filter-inbox", &filter_inbox,
+ "filter-junk", &filter_junk,
+ "filter-junk-inbox", &filter_junk_inbox,
+ NULL);
+
if (g_ascii_strcasecmp (folder_name, "INBOX") == 0) {
- CamelService *service;
- CamelSettings *settings;
- gboolean filter_inbox;
- gboolean filter_junk;
- gboolean filter_junk_inbox;
-
- service = CAMEL_SERVICE (parent);
- settings = camel_service_get_settings (service);
-
- g_object_get (
- settings,
- "filter-inbox", &filter_inbox,
- "filter-junk", &filter_junk,
- "filter-junk-inbox", &filter_junk_inbox,
- NULL);
-
- if (filter_inbox)
+ if (filter_inbox || filter_all)
folder->folder_flags |= CAMEL_FOLDER_FILTER_RECENT;
if (filter_junk)
folder->folder_flags |= CAMEL_FOLDER_FILTER_JUNK;
if (filter_junk_inbox)
folder->folder_flags |= CAMEL_FOLDER_FILTER_JUNK;
} else {
- CamelService *service;
- CamelSettings *settings;
- gboolean filter_junk;
- gboolean filter_junk_inbox;
- gboolean folder_is_junk;
- gboolean folder_is_trash;
+ gboolean folder_is_trash, folder_is_junk;
gchar *junk_path;
gchar *trash_path;
- service = CAMEL_SERVICE (parent);
- settings = camel_service_get_settings (service);
-
junk_path = camel_imap_settings_dup_real_junk_path (
CAMEL_IMAP_SETTINGS (settings));
@@ -472,11 +513,6 @@ camel_imap_folder_new (CamelStore *parent,
if (trash_path == NULL)
trash_path = g_strdup ("");
- filter_junk = camel_imap_settings_get_filter_junk (
- CAMEL_IMAP_SETTINGS (settings));
- filter_junk_inbox = camel_imap_settings_get_filter_junk_inbox (
- CAMEL_IMAP_SETTINGS (settings));
-
if (filter_junk && !filter_junk_inbox)
folder->folder_flags |= CAMEL_FOLDER_FILTER_JUNK;
@@ -494,6 +530,9 @@ camel_imap_folder_new (CamelStore *parent,
if (folder_is_junk)
folder->folder_flags |= CAMEL_FOLDER_IS_JUNK;
+ if (filter_all || imap_folder_get_apply_filters (imap_folder))
+ folder->folder_flags |= CAMEL_FOLDER_FILTER_RECENT;
+
g_free (junk_path);
g_free (trash_path);
}
diff --git a/camel/providers/imap/camel-imap-private.h b/camel/providers/imap/camel-imap-private.h
index 8b485c3..a9710e8 100644
--- a/camel/providers/imap/camel-imap-private.h
+++ b/camel/providers/imap/camel-imap-private.h
@@ -15,6 +15,7 @@ struct _CamelImapFolderPrivate {
GStaticRecMutex cache_lock; /* for locking the cache object */
GHashTable *ignore_recent; /* hash table of UIDs to ignore as recent when updating folder */
gboolean check_folder; /* persistent property */
+ gboolean apply_filters; /* persistent property */
};
#define CAMEL_IMAP_FOLDER_LOCK(f, l) \
diff --git a/camel/providers/imap/camel-imap-provider.c b/camel/providers/imap/camel-imap-provider.c
index a1d0cc2..d2a3187 100644
--- a/camel/providers/imap/camel-imap-provider.c
+++ b/camel/providers/imap/camel-imap-provider.c
@@ -62,7 +62,9 @@ static CamelProviderConfEntry imap_conf_entries[] = {
N_("Names_pace:") },
{ CAMEL_PROVIDER_CONF_SECTION_END },
{ CAMEL_PROVIDER_CONF_SECTION_START, "general", NULL, N_("Options") },
- { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-inbox", NULL,
+ { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-all", NULL,
+ N_("Apply _filters to new messages in all folders"), "0" },
+ { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-inbox", "!filter-all",
N_("_Apply filters to new messages in Inbox on this server"), "1" },
{ CAMEL_PROVIDER_CONF_CHECKBOX, "filter-junk", NULL,
N_("Check new messages for Jun_k contents"), "0" },
diff --git a/camel/providers/imap/camel-imap-settings.c b/camel/providers/imap/camel-imap-settings.c
index 3b6a3fe..5fd7a4b 100644
--- a/camel/providers/imap/camel-imap-settings.c
+++ b/camel/providers/imap/camel-imap-settings.c
@@ -32,6 +32,7 @@ struct _CamelImapSettingsPrivate {
gboolean check_all;
gboolean check_subscribed;
+ gboolean filter_all;
gboolean filter_junk;
gboolean filter_junk_inbox;
gboolean use_namespace;
@@ -50,6 +51,7 @@ enum {
PROP_CHECK_SUBSCRIBED,
PROP_FETCH_HEADERS,
PROP_FETCH_HEADERS_EXTRA,
+ PROP_FILTER_ALL,
PROP_FILTER_JUNK,
PROP_FILTER_JUNK_INBOX,
PROP_HOST,
@@ -111,6 +113,12 @@ imap_settings_set_property (GObject *object,
g_value_get_boxed (value));
return;
+ case PROP_FILTER_ALL:
+ camel_imap_settings_set_filter_all (
+ CAMEL_IMAP_SETTINGS (object),
+ g_value_get_boolean (value));
+ return;
+
case PROP_FILTER_JUNK:
camel_imap_settings_set_filter_junk (
CAMEL_IMAP_SETTINGS (object),
@@ -247,6 +255,13 @@ imap_settings_get_property (GObject *object,
CAMEL_IMAP_SETTINGS (object)));
return;
+ case PROP_FILTER_ALL:
+ g_value_set_boolean (
+ value,
+ camel_imap_settings_get_filter_all (
+ CAMEL_IMAP_SETTINGS (object)));
+ return;
+
case PROP_FILTER_JUNK:
g_value_set_boolean (
value,
@@ -444,6 +459,18 @@ camel_imap_settings_class_init (CamelImapSettingsClass *class)
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",
@@ -853,6 +880,44 @@ camel_imap_settings_set_filter_junk (CamelImapSettings *settings,
}
/**
+ * camel_imap_settings_get_filter_all:
+ * @settings: a #CamelImapSettings
+ *
+ * Returns whether apply filters in all folders.
+ *
+ * Returns: whether to apply filters in all folders
+ *
+ * Since: 3.4
+ **/
+gboolean
+camel_imap_settings_get_filter_all (CamelImapSettings *settings)
+{
+ g_return_val_if_fail (CAMEL_IS_IMAP_SETTINGS (settings), FALSE);
+
+ return settings->priv->filter_all;
+}
+
+/**
+ * camel_imap_settings_set_filter_all:
+ * @settings: a #CamelImapSettings
+ * @filter_all: whether to apply filters in all folders
+ *
+ * Sets whether to apply filters in all folders.
+ *
+ * Since: 3.4
+ **/
+void
+camel_imap_settings_set_filter_all (CamelImapSettings *settings,
+ gboolean filter_all)
+{
+ g_return_if_fail (CAMEL_IS_IMAP_SETTINGS (settings));
+
+ settings->priv->filter_all = filter_all;
+
+ g_object_notify (G_OBJECT (settings), "filter-all");
+}
+
+/**
* camel_imap_settings_get_filter_junk_inbox:
* @settings: a #CamelImapSettings
*
diff --git a/camel/providers/imap/camel-imap-settings.h b/camel/providers/imap/camel-imap-settings.h
index 2d1aa7a..f7f185e 100644
--- a/camel/providers/imap/camel-imap-settings.h
+++ b/camel/providers/imap/camel-imap-settings.h
@@ -81,6 +81,11 @@ gchar ** camel_imap_settings_dup_fetch_headers_extra
void camel_imap_settings_set_fetch_headers_extra
(CamelImapSettings *settings,
const gchar * const *fetch_headers_extra);
+gboolean camel_imap_settings_get_filter_all
+ (CamelImapSettings *settings);
+void camel_imap_settings_set_filter_all
+ (CamelImapSettings *settings,
+ gboolean filter_all);
gboolean camel_imap_settings_get_filter_junk
(CamelImapSettings *settings);
void camel_imap_settings_set_filter_junk
diff --git a/camel/providers/imapx/camel-imapx-folder.c b/camel/providers/imapx/camel-imapx-folder.c
index 81a4a66..24deaf5 100644
--- a/camel/providers/imapx/camel-imapx-folder.c
+++ b/camel/providers/imapx/camel-imapx-folder.c
@@ -38,8 +38,17 @@
#define d(...) camel_imapx_debug(debug, '?', __VA_ARGS__)
+/* The custom property ID is a CamelArg artifact.
+ * It still identifies the property in state files. */
+enum {
+ PROP_0,
+ PROP_APPLY_FILTERS = 0x2501
+};
+
G_DEFINE_TYPE (CamelIMAPXFolder, camel_imapx_folder, CAMEL_TYPE_OFFLINE_FOLDER)
+static gboolean imapx_folder_get_apply_filters (CamelIMAPXFolder *folder);
+
CamelFolder *
camel_imapx_folder_new (CamelStore *store,
const gchar *folder_dir,
@@ -52,6 +61,7 @@ camel_imapx_folder_new (CamelStore *store,
CamelIMAPXFolder *ifolder;
const gchar *short_name;
gchar *state_file;
+ gboolean filter_all;
gboolean filter_inbox;
gboolean filter_junk;
gboolean filter_junk_inbox;
@@ -63,6 +73,7 @@ camel_imapx_folder_new (CamelStore *store,
g_object_get (
settings,
+ "filter-all", &filter_all,
"filter-inbox", &filter_inbox,
"filter-junk", &filter_junk,
"filter-junk-inbox", &filter_junk_inbox,
@@ -115,13 +126,18 @@ camel_imapx_folder_new (CamelStore *store,
ifolder->uidnext_on_server = 0;
if (!g_ascii_strcasecmp (folder_name, "INBOX")) {
- if (filter_inbox)
+ if (filter_inbox || filter_all)
folder->folder_flags |= CAMEL_FOLDER_FILTER_RECENT;
if (filter_junk)
folder->folder_flags |= CAMEL_FOLDER_FILTER_JUNK;
- } else if (filter_junk && !filter_junk_inbox)
+ } else {
+ if (filter_junk && !filter_junk_inbox)
folder->folder_flags |= CAMEL_FOLDER_FILTER_JUNK;
+ if (filter_all || imapx_folder_get_apply_filters (ifolder))
+ folder->folder_flags |= CAMEL_FOLDER_FILTER_RECENT;
+ }
+
camel_store_summary_connect_folder_summary (
(CamelStoreSummary *) ((CamelIMAPXStore *) store)->summary,
folder_name, folder->summary);
@@ -129,6 +145,64 @@ camel_imapx_folder_new (CamelStore *store,
return folder;
}
+static gboolean
+imapx_folder_get_apply_filters (CamelIMAPXFolder *folder)
+{
+ g_return_val_if_fail (folder != NULL, FALSE);
+ g_return_val_if_fail (CAMEL_IS_IMAPX_FOLDER (folder), FALSE);
+
+ return folder->apply_filters;
+}
+
+static void
+imapx_folder_set_apply_filters (CamelIMAPXFolder *folder,
+ gboolean apply_filters)
+{
+ g_return_if_fail (folder != NULL);
+ g_return_if_fail (CAMEL_IS_IMAPX_FOLDER (folder));
+
+ if ((folder->apply_filters ? 1 : 0) == (apply_filters ? 1 : 0))
+ return;
+
+ folder->apply_filters = apply_filters;
+
+ g_object_notify (G_OBJECT (folder), "apply-filters");
+}
+
+static void
+imapx_folder_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_APPLY_FILTERS:
+ imapx_folder_set_apply_filters (
+ CAMEL_IMAPX_FOLDER (object),
+ g_value_get_boolean (value));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+imapx_folder_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_APPLY_FILTERS:
+ g_value_set_boolean (
+ value, imapx_folder_get_apply_filters (
+ CAMEL_IMAPX_FOLDER (object)));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
static void
imapx_folder_dispose (GObject *object)
{
@@ -643,6 +717,8 @@ camel_imapx_folder_class_init (CamelIMAPXFolderClass *class)
CamelFolderClass *folder_class;
object_class = G_OBJECT_CLASS (class);
+ object_class->set_property = imapx_folder_set_property;
+ object_class->get_property = imapx_folder_get_property;
object_class->dispose = imapx_folder_dispose;
object_class->finalize = imapx_folder_finalize;
@@ -661,6 +737,17 @@ camel_imapx_folder_class_init (CamelIMAPXFolderClass *class)
folder_class->synchronize_sync = imapx_synchronize_sync;
folder_class->synchronize_message_sync = imapx_synchronize_message_sync;
folder_class->transfer_messages_to_sync = imapx_transfer_messages_to_sync;
+
+ g_object_class_install_property (
+ object_class,
+ PROP_APPLY_FILTERS,
+ g_param_spec_boolean (
+ "apply-filters",
+ "Apply Filters",
+ _("Apply message filters to this folder"),
+ FALSE,
+ G_PARAM_READWRITE |
+ CAMEL_PARAM_PERSISTENT));
}
static void
diff --git a/camel/providers/imapx/camel-imapx-folder.h b/camel/providers/imapx/camel-imapx-folder.h
index efe0af7..885640f 100644
--- a/camel/providers/imapx/camel-imapx-folder.h
+++ b/camel/providers/imapx/camel-imapx-folder.h
@@ -68,6 +68,8 @@ struct _CamelIMAPXFolder {
GMutex *search_lock;
GMutex *stream_lock;
+
+ gboolean apply_filters; /* persistent property */
};
struct _CamelIMAPXFolderClass {
diff --git a/camel/providers/imapx/camel-imapx-provider.c b/camel/providers/imapx/camel-imapx-provider.c
index 6179e84..05a93de 100644
--- a/camel/providers/imapx/camel-imapx-provider.c
+++ b/camel/providers/imapx/camel-imapx-provider.c
@@ -70,7 +70,9 @@ CamelProviderConfEntry imapx_conf_entries[] = {
#endif
{ CAMEL_PROVIDER_CONF_SECTION_END },
{ CAMEL_PROVIDER_CONF_SECTION_START, "general", NULL, N_("Options") },
- { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-inbox", NULL,
+ { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-all", NULL,
+ N_("Apply _filters to new messages in all folders"), "0" },
+ { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-inbox", "!filter-all",
N_("_Apply filters to new messages in Inbox on this server"), "1" },
{ CAMEL_PROVIDER_CONF_CHECKBOX, "filter-junk", NULL,
N_("Check new messages for Jun_k contents"), "0" },
diff --git a/camel/providers/imapx/camel-imapx-settings.c b/camel/providers/imapx/camel-imapx-settings.c
index 2b4c333..2f1c3a8 100644
--- a/camel/providers/imapx/camel-imapx-settings.c
+++ b/camel/providers/imapx/camel-imapx-settings.c
@@ -35,6 +35,7 @@ struct _CamelIMAPXSettingsPrivate {
gboolean check_all;
gboolean check_subscribed;
+ gboolean filter_all;
gboolean filter_junk;
gboolean filter_junk_inbox;
gboolean use_idle;
@@ -55,6 +56,7 @@ enum {
PROP_CHECK_SUBSCRIBED,
PROP_CONCURRENT_CONNECTIONS,
PROP_FETCH_ORDER,
+ PROP_FILTER_ALL,
PROP_FILTER_JUNK,
PROP_FILTER_JUNK_INBOX,
PROP_HOST,
@@ -121,6 +123,12 @@ imapx_settings_set_property (GObject *object,
g_value_get_enum (value));
return;
+ case PROP_FILTER_ALL:
+ camel_imapx_settings_set_filter_all (
+ CAMEL_IMAPX_SETTINGS (object),
+ g_value_get_boolean (value));
+ return;
+
case PROP_FILTER_JUNK:
camel_imapx_settings_set_filter_junk (
CAMEL_IMAPX_SETTINGS (object),
@@ -258,6 +266,13 @@ imapx_settings_get_property (GObject *object,
CAMEL_IMAPX_SETTINGS (object)));
return;
+ case PROP_FILTER_ALL:
+ g_value_set_boolean (
+ value,
+ camel_imapx_settings_get_filter_all (
+ CAMEL_IMAPX_SETTINGS (object)));
+ return;
+
case PROP_FILTER_JUNK:
g_value_set_boolean (
value,
@@ -461,6 +476,18 @@ camel_imapx_settings_class_init (CamelIMAPXSettingsClass *class)
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",
@@ -824,6 +851,44 @@ camel_imapx_settings_set_fetch_order (CamelIMAPXSettings *settings,
}
/**
+ * camel_imapx_settings_get_filter_all:
+ * @settings: a #CamelIMAPXSettings
+ *
+ * Returns whether apply filters in all folders.
+ *
+ * Returns: whether to apply filters in all folders
+ *
+ * Since: 3.4
+ **/
+gboolean
+camel_imapx_settings_get_filter_all (CamelIMAPXSettings *settings)
+{
+ g_return_val_if_fail (CAMEL_IS_IMAPX_SETTINGS (settings), FALSE);
+
+ return settings->priv->filter_all;
+}
+
+/**
+ * camel_imapx_settings_set_filter_all:
+ * @settings: a #CamelIMAPXSettings
+ * @filter_all: whether to apply filters in all folders
+ *
+ * Sets whether to apply filters in all folders.
+ *
+ * Since: 3.4
+ **/
+void
+camel_imapx_settings_set_filter_all (CamelIMAPXSettings *settings,
+ gboolean filter_all)
+{
+ g_return_if_fail (CAMEL_IS_IMAPX_SETTINGS (settings));
+
+ settings->priv->filter_all = filter_all;
+
+ g_object_notify (G_OBJECT (settings), "filter-all");
+}
+
+/**
* camel_imapx_settings_get_filter_junk:
* @settings: a #CamelIMAPXSettings
*
diff --git a/camel/providers/imapx/camel-imapx-settings.h b/camel/providers/imapx/camel-imapx-settings.h
index bffa560..fbd1084 100644
--- a/camel/providers/imapx/camel-imapx-settings.h
+++ b/camel/providers/imapx/camel-imapx-settings.h
@@ -81,6 +81,11 @@ CamelSortType camel_imapx_settings_get_fetch_order
void camel_imapx_settings_set_fetch_order
(CamelIMAPXSettings *settings,
CamelSortType fetch_order);
+gboolean camel_imapx_settings_get_filter_all
+ (CamelIMAPXSettings *settings);
+void camel_imapx_settings_set_filter_all
+ (CamelIMAPXSettings *settings,
+ gboolean filter_all);
gboolean camel_imapx_settings_get_filter_junk
(CamelIMAPXSettings *settings);
void camel_imapx_settings_set_filter_junk
diff --git a/camel/providers/nntp/camel-nntp-folder.c b/camel/providers/nntp/camel-nntp-folder.c
index 7681b0a..2133b1e 100644
--- a/camel/providers/nntp/camel-nntp-folder.c
+++ b/camel/providers/nntp/camel-nntp-folder.c
@@ -37,8 +37,73 @@
#include "camel-nntp-store.h"
#include "camel-nntp-summary.h"
+/* The custom property ID is a CamelArg artifact.
+ * It still identifies the property in state files. */
+enum {
+ PROP_0,
+ PROP_APPLY_FILTERS = 0x2501
+};
+
G_DEFINE_TYPE (CamelNNTPFolder, camel_nntp_folder, CAMEL_TYPE_DISCO_FOLDER)
+static gboolean
+nntp_folder_get_apply_filters (CamelNNTPFolder *folder)
+{
+ g_return_val_if_fail (folder != NULL, FALSE);
+ g_return_val_if_fail (CAMEL_IS_NNTP_FOLDER (folder), FALSE);
+
+ return folder->priv->apply_filters;
+}
+
+static void
+nntp_folder_set_apply_filters (CamelNNTPFolder *folder,
+ gboolean apply_filters)
+{
+ g_return_if_fail (folder != NULL);
+ g_return_if_fail (CAMEL_IS_NNTP_FOLDER (folder));
+
+ if ((folder->priv->apply_filters ? 1 : 0) == (apply_filters ? 1 : 0))
+ return;
+
+ folder->priv->apply_filters = apply_filters;
+
+ g_object_notify (G_OBJECT (folder), "apply-filters");
+}
+
+static void
+nntp_folder_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_APPLY_FILTERS:
+ nntp_folder_set_apply_filters (
+ CAMEL_NNTP_FOLDER (object),
+ g_value_get_boolean (value));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+nntp_folder_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_APPLY_FILTERS:
+ g_value_set_boolean (
+ value, nntp_folder_get_apply_filters (
+ CAMEL_NNTP_FOLDER (object)));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
static void
nntp_folder_dispose (GObject *object)
{
@@ -180,7 +245,7 @@ nntp_folder_sync (CamelFolder *folder,
g_ptr_array_free (changed, TRUE);
camel_folder_summary_touch (folder->summary);
}
- success = !camel_folder_summary_save_to_db (folder->summary, error);
+ success = camel_folder_summary_save_to_db (folder->summary, error);
camel_service_unlock (CAMEL_SERVICE (parent_store), CAMEL_SERVICE_REC_CONNECT_LOCK);
return success;
@@ -653,6 +718,8 @@ camel_nntp_folder_class_init (CamelNNTPFolderClass *class)
g_type_class_add_private (class, sizeof (CamelNNTPFolderPrivate));
object_class = G_OBJECT_CLASS (class);
+ object_class->set_property = nntp_folder_set_property;
+ object_class->get_property = nntp_folder_get_property;
object_class->dispose = nntp_folder_dispose;
object_class->finalize = nntp_folder_finalize;
@@ -679,6 +746,17 @@ camel_nntp_folder_class_init (CamelNNTPFolderClass *class)
disco_folder_class->expunge_uids_online = nntp_folder_expunge_uids_offline;
disco_folder_class->expunge_uids_offline = nntp_folder_expunge_uids_offline;
disco_folder_class->expunge_uids_resyncing = nntp_folder_expunge_uids_offline;
+
+ g_object_class_install_property (
+ object_class,
+ PROP_APPLY_FILTERS,
+ g_param_spec_boolean (
+ "apply-filters",
+ "Apply Filters",
+ _("Apply message filters to this folder"),
+ FALSE,
+ G_PARAM_READWRITE |
+ CAMEL_PARAM_PERSISTENT));
}
static void
@@ -702,13 +780,21 @@ camel_nntp_folder_new (CamelStore *parent,
CamelNNTPFolder *nntp_folder;
gchar *root;
CamelService *service;
+ CamelSettings *settings;
CamelStoreInfo *si;
const gchar *user_cache_dir;
gboolean subscribed = TRUE;
+ gboolean filter_all;
service = CAMEL_SERVICE (parent);
+ settings = camel_service_get_settings (service);
user_cache_dir = camel_service_get_user_cache_dir (service);
+ g_object_get (
+ settings,
+ "filter-all", &filter_all,
+ NULL);
+
folder = g_object_new (
CAMEL_TYPE_NNTP_FOLDER,
"display-name", folder_name,
@@ -730,6 +816,9 @@ camel_nntp_folder_new (CamelStore *parent,
folder->summary = (CamelFolderSummary *) camel_nntp_summary_new (folder);
+ if (filter_all || nntp_folder_get_apply_filters (nntp_folder))
+ folder->folder_flags |= CAMEL_FOLDER_FILTER_RECENT;
+
camel_folder_summary_load_from_db (folder->summary, NULL);
si = camel_store_summary_path ((CamelStoreSummary *) ((CamelNNTPStore *) parent)->summary, folder_name);
@@ -738,15 +827,15 @@ camel_nntp_folder_new (CamelStore *parent,
camel_store_summary_info_free ((CamelStoreSummary *) ((CamelNNTPStore *) parent)->summary, si);
}
+ camel_store_summary_connect_folder_summary (
+ (CamelStoreSummary *) ((CamelNNTPStore *) parent)->summary,
+ folder_name, folder->summary);
+
if (subscribed && !camel_folder_refresh_info_sync (
folder, cancellable, error)) {
g_object_unref (folder);
folder = NULL;
}
- camel_store_summary_connect_folder_summary (
- (CamelStoreSummary *) ((CamelNNTPStore *) parent)->summary,
- folder_name, folder->summary);
-
return folder;
}
diff --git a/camel/providers/nntp/camel-nntp-private.h b/camel/providers/nntp/camel-nntp-private.h
index 1ed654c..206adbe 100644
--- a/camel/providers/nntp/camel-nntp-private.h
+++ b/camel/providers/nntp/camel-nntp-private.h
@@ -38,6 +38,8 @@ G_BEGIN_DECLS
struct _CamelNNTPFolderPrivate {
GMutex *search_lock; /* for locking the search object */
GMutex *cache_lock; /* for locking the cache object */
+
+ gboolean apply_filters; /* persistent property */
};
#define CAMEL_NNTP_FOLDER_LOCK(f, l) (g_mutex_lock(((CamelNNTPFolder *)f)->priv->l))
diff --git a/camel/providers/nntp/camel-nntp-provider.c b/camel/providers/nntp/camel-nntp-provider.c
index f0d8997..9b4a724 100644
--- a/camel/providers/nntp/camel-nntp-provider.c
+++ b/camel/providers/nntp/camel-nntp-provider.c
@@ -38,6 +38,10 @@ static gint check_equal (gchar *s1, gchar *s2);
static gint nntp_url_equal (gconstpointer a, gconstpointer b);
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_SECTION_END },
{ CAMEL_PROVIDER_CONF_SECTION_START, "folders", NULL,
N_("Folders") },
{ CAMEL_PROVIDER_CONF_CHECKBOX, "short-folder-names", NULL,
diff --git a/camel/providers/nntp/camel-nntp-settings.c b/camel/providers/nntp/camel-nntp-settings.c
index 7990655..7c66449 100644
--- a/camel/providers/nntp/camel-nntp-settings.c
+++ b/camel/providers/nntp/camel-nntp-settings.c
@@ -23,6 +23,7 @@
((obj), CAMEL_TYPE_NNTP_SETTINGS, CamelNNTPSettingsPrivate))
struct _CamelNNTPSettingsPrivate {
+ gboolean filter_all;
gboolean folder_hierarchy_relative;
gboolean short_folder_names;
};
@@ -30,6 +31,7 @@ struct _CamelNNTPSettingsPrivate {
enum {
PROP_0,
PROP_AUTH_MECHANISM,
+ PROP_FILTER_ALL,
PROP_FOLDER_HIERARCHY_RELATIVE,
PROP_HOST,
PROP_PORT,
@@ -58,6 +60,12 @@ nntp_settings_set_property (GObject *object,
g_value_get_string (value));
return;
+ case PROP_FILTER_ALL:
+ camel_nntp_settings_set_filter_all (
+ 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),
@@ -112,6 +120,13 @@ nntp_settings_get_property (GObject *object,
CAMEL_NETWORK_SETTINGS (object)));
return;
+ case PROP_FILTER_ALL:
+ g_value_set_boolean (
+ value,
+ camel_nntp_settings_get_filter_all (
+ CAMEL_NNTP_SETTINGS (object)));
+ return;
+
case PROP_FOLDER_HIERARCHY_RELATIVE:
g_value_set_boolean (
value,
@@ -222,6 +237,18 @@ camel_nntp_settings_class_init (CamelNNTPSettingsClass *class)
object_class,
PROP_USER,
"user");
+
+ 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));
}
static void
@@ -231,6 +258,44 @@ camel_nntp_settings_init (CamelNNTPSettings *settings)
}
/**
+ * camel_nntp_settings_get_filter_all:
+ * @settings: a #CamelNNTPSettings
+ *
+ * Returns whether apply filters in all folders.
+ *
+ * Returns: whether to apply filters in all folders
+ *
+ * Since: 3.4
+ **/
+gboolean
+camel_nntp_settings_get_filter_all (CamelNNTPSettings *settings)
+{
+ g_return_val_if_fail (CAMEL_IS_NNTP_SETTINGS (settings), FALSE);
+
+ return settings->priv->filter_all;
+}
+
+/**
+ * camel_nntp_settings_set_filter_all:
+ * @settings: a #CamelNNTPSettings
+ * @filter_all: whether to apply filters in all folders
+ *
+ * Sets whether to apply filters in all folders.
+ *
+ * Since: 3.4
+ **/
+void
+camel_nntp_settings_set_filter_all (CamelNNTPSettings *settings,
+ gboolean filter_all)
+{
+ g_return_if_fail (CAMEL_IS_NNTP_SETTINGS (settings));
+
+ settings->priv->filter_all = filter_all;
+
+ g_object_notify (G_OBJECT (settings), "filter-all");
+}
+
+/**
* camel_nntp_settings_get_folder_hierarchy_relative:
* @settings: a #CamelNNTPSettings
*
diff --git a/camel/providers/nntp/camel-nntp-settings.h b/camel/providers/nntp/camel-nntp-settings.h
index 0634c9f..34e1c1c 100644
--- a/camel/providers/nntp/camel-nntp-settings.h
+++ b/camel/providers/nntp/camel-nntp-settings.h
@@ -57,6 +57,11 @@ struct _CamelNNTPSettingsClass {
GType camel_nntp_settings_get_type
(void) G_GNUC_CONST;
+gboolean camel_nntp_settings_get_filter_all
+ (CamelNNTPSettings *settings);
+void camel_nntp_settings_set_filter_all
+ (CamelNNTPSettings *settings,
+ gboolean filter_all);
gboolean camel_nntp_settings_get_folder_hierarchy_relative
(CamelNNTPSettings *settings);
void camel_nntp_settings_set_folder_hierarchy_relative
diff --git a/camel/providers/nntp/camel-nntp-summary.c b/camel/providers/nntp/camel-nntp-summary.c
index f2997d8..38f8573 100644
--- a/camel/providers/nntp/camel-nntp-summary.c
+++ b/camel/providers/nntp/camel-nntp-summary.c
@@ -178,9 +178,12 @@ add_range_xover (CamelNNTPSummary *cns,
guint len;
gint ret;
guint n, count, total, size;
+ gboolean folder_filter_recent;
struct _xover_header *xover;
s = (CamelFolderSummary *) cns;
+ folder_filter_recent = camel_folder_summary_get_folder (s) &&
+ (camel_folder_summary_get_folder (s)->folder_flags & CAMEL_FOLDER_FILTER_RECENT) != 0;
service = CAMEL_SERVICE (store);
settings = camel_service_get_settings (service);
@@ -262,6 +265,8 @@ add_range_xover (CamelNNTPSummary *cns,
mi->size = size;
cns->high = n;
camel_folder_change_info_add_uid (changes, camel_message_info_uid (mi));
+ if (folder_filter_recent)
+ camel_folder_change_info_recent_uid (changes, camel_message_info_uid (mi));
}
}
}
@@ -299,8 +304,11 @@ add_range_head (CamelNNTPSummary *cns,
CamelMessageInfo *mi;
CamelMimeParser *mp;
gchar *host;
+ gboolean folder_filter_recent;
s = (CamelFolderSummary *) cns;
+ folder_filter_recent = camel_folder_summary_get_folder (s) &&
+ (camel_folder_summary_get_folder (s)->folder_flags & CAMEL_FOLDER_FILTER_RECENT) != 0;
mp = camel_mime_parser_new ();
@@ -353,6 +361,8 @@ add_range_head (CamelNNTPSummary *cns,
}
cns->high = i;
camel_folder_change_info_add_uid (changes, camel_message_info_uid (mi));
+ if (folder_filter_recent)
+ camel_folder_change_info_recent_uid (changes, camel_message_info_uid (mi));
}
if (cns->priv->uid) {
g_free (cns->priv->uid);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]