[evolution-data-server] Bug 338649 - [NNTP] Add option to limit message download count



commit c8fe6a5f4e81346cd6e311206db4b4fa2021134c
Author: Milan Crha <mcrha redhat com>
Date:   Thu Jun 22 13:34:51 2017 +0200

    Bug 338649 - [NNTP] Add option to limit message download count

 src/camel/providers/nntp/camel-nntp-provider.c |    3 +
 src/camel/providers/nntp/camel-nntp-settings.c |  133 +++++++++++++++++++++++-
 src/camel/providers/nntp/camel-nntp-settings.h |   10 ++
 src/camel/providers/nntp/camel-nntp-summary.c  |   46 +++++++--
 4 files changed, 184 insertions(+), 8 deletions(-)
---
diff --git a/src/camel/providers/nntp/camel-nntp-provider.c b/src/camel/providers/nntp/camel-nntp-provider.c
index 4f88ede..07935d6 100644
--- a/src/camel/providers/nntp/camel-nntp-provider.c
+++ b/src/camel/providers/nntp/camel-nntp-provider.c
@@ -46,6 +46,9 @@ static CamelProviderConfEntry nntp_conf_entries[] = {
          "than comp.os.linux)"), "1" },
        { CAMEL_PROVIDER_CONF_CHECKBOX, "folder-hierarchy-relative", NULL,
          N_("In the subscription _dialog, show relative folder names"), "1" },
+       { CAMEL_PROVIDER_CONF_CHECKSPIN, "limit-latest", NULL,
+         /* Translators: The '%s' is replaced with a spin button with the actual value to use */
+         N_("Download only up to %s latest messages"), "y:100:1000:99999999" },
        { CAMEL_PROVIDER_CONF_SECTION_END },
        { CAMEL_PROVIDER_CONF_END }
 };
diff --git a/src/camel/providers/nntp/camel-nntp-settings.c b/src/camel/providers/nntp/camel-nntp-settings.c
index 921ed2c..155dc3d 100644
--- a/src/camel/providers/nntp/camel-nntp-settings.c
+++ b/src/camel/providers/nntp/camel-nntp-settings.c
@@ -26,6 +26,8 @@ struct _CamelNNTPSettingsPrivate {
        gboolean filter_junk;
        gboolean folder_hierarchy_relative;
        gboolean short_folder_names;
+       gboolean use_limit_latest;
+       guint limit_latest;
 };
 
 enum {
@@ -38,7 +40,9 @@ enum {
        PROP_PORT,
        PROP_SECURITY_METHOD,
        PROP_SHORT_FOLDER_NAMES,
-       PROP_USER
+       PROP_USER,
+       PROP_USE_LIMIT_LATEST,
+       PROP_LIMIT_LATEST
 };
 
 G_DEFINE_TYPE_WITH_CODE (
@@ -85,6 +89,18 @@ nntp_settings_set_property (GObject *object,
                                g_value_get_string (value));
                        return;
 
+               case PROP_USE_LIMIT_LATEST:
+                       camel_nntp_settings_set_use_limit_latest (
+                               CAMEL_NNTP_SETTINGS (object),
+                               g_value_get_boolean (value));
+                       return;
+
+               case PROP_LIMIT_LATEST:
+                       camel_nntp_settings_set_limit_latest (
+                               CAMEL_NNTP_SETTINGS (object),
+                               g_value_get_uint (value));
+                       return;
+
                case PROP_PORT:
                        camel_network_settings_set_port (
                                CAMEL_NETWORK_SETTINGS (object),
@@ -155,6 +171,20 @@ nntp_settings_get_property (GObject *object,
                                CAMEL_NETWORK_SETTINGS (object)));
                        return;
 
+               case PROP_USE_LIMIT_LATEST:
+                       g_value_set_boolean (
+                               value,
+                               camel_nntp_settings_get_use_limit_latest (
+                               CAMEL_NNTP_SETTINGS (object)));
+                       return;
+
+               case PROP_LIMIT_LATEST:
+                       g_value_set_uint (
+                               value,
+                               camel_nntp_settings_get_limit_latest (
+                               CAMEL_NNTP_SETTINGS (object)));
+                       return;
+
                case PROP_PORT:
                        g_value_set_uint (
                                value,
@@ -236,6 +266,30 @@ camel_nntp_settings_class_init (CamelNNTPSettingsClass *class)
 
        g_object_class_install_property (
                object_class,
+               PROP_USE_LIMIT_LATEST,
+               g_param_spec_boolean (
+                       "use-limit-latest",
+                       "Use Limit Latest",
+                       "Whether to limit download of the latest messages",
+                       FALSE,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT |
+                       G_PARAM_STATIC_STRINGS));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_LIMIT_LATEST,
+               g_param_spec_uint (
+                       "limit-latest",
+                       "Limit Latest",
+                       "The actual limit to download of the latest messages",
+                       100, G_MAXUINT, 1000,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT |
+                       G_PARAM_STATIC_STRINGS));
+
+       g_object_class_install_property (
+               object_class,
                PROP_SHORT_FOLDER_NAMES,
                g_param_spec_boolean (
                        "short-folder-names",
@@ -457,3 +511,80 @@ camel_nntp_settings_set_short_folder_names (CamelNNTPSettings *settings,
        g_object_notify (G_OBJECT (settings), "short-folder-names");
 }
 
+/**
+ * camel_nntp_settings_get_use_limit_latest:
+ * @settings: a #CamelNNTPSettings
+ *
+ * Returns: Whether should limit download of the messages
+ *
+ * Since: 3.26
+ **/
+gboolean
+camel_nntp_settings_get_use_limit_latest (CamelNNTPSettings *settings)
+{
+       g_return_val_if_fail (CAMEL_IS_NNTP_SETTINGS (settings), FALSE);
+
+       return settings->priv->use_limit_latest;
+}
+
+/**
+ * camel_nntp_settings_set_use_limit_latest:
+ * @settings: a #CamelNNTPSettings
+ * @use_limit_latest: value to set
+ *
+ * Sets whether should limit download of the messages.
+ *
+ * Since: 3.26
+ **/
+void
+camel_nntp_settings_set_use_limit_latest (CamelNNTPSettings *settings,
+                                         gboolean use_limit_latest)
+{
+       g_return_if_fail (CAMEL_IS_NNTP_SETTINGS (settings));
+
+       if ((settings->priv->use_limit_latest ? 1 : 0) == (use_limit_latest ? 1 : 0))
+               return;
+
+       settings->priv->use_limit_latest = use_limit_latest;
+
+       g_object_notify (G_OBJECT (settings), "use-limit-latest");
+}
+
+/**
+ * camel_nntp_settings_get_limit_latest:
+ * @settings: a #CamelNNTPSettings
+ *
+ * Returns: How many latest messages can be downloaded
+ *
+ * Since: 3.26
+ **/
+guint
+camel_nntp_settings_get_limit_latest (CamelNNTPSettings *settings)
+{
+       g_return_val_if_fail (CAMEL_IS_NNTP_SETTINGS (settings), 0);
+
+       return settings->priv->limit_latest;
+}
+
+/**
+ * camel_nntp_settings_set_limit_latest:
+ * @settings: a #CamelNNTPSettings
+ * @limit_latest: the value to set
+ *
+ * Sets how many latest messages can be downloaded.
+ *
+ * Since: 3.26
+ **/
+void
+camel_nntp_settings_set_limit_latest (CamelNNTPSettings *settings,
+                                     guint limit_latest)
+{
+       g_return_if_fail (CAMEL_IS_NNTP_SETTINGS (settings));
+
+       if (settings->priv->limit_latest == limit_latest)
+               return;
+
+       settings->priv->limit_latest = limit_latest;
+
+       g_object_notify (G_OBJECT (settings), "limit-latest");
+}
diff --git a/src/camel/providers/nntp/camel-nntp-settings.h b/src/camel/providers/nntp/camel-nntp-settings.h
index 8aa5233..5b45451 100644
--- a/src/camel/providers/nntp/camel-nntp-settings.h
+++ b/src/camel/providers/nntp/camel-nntp-settings.h
@@ -79,6 +79,16 @@ gboolean     camel_nntp_settings_get_short_folder_names
 void           camel_nntp_settings_set_short_folder_names
                                        (CamelNNTPSettings *settings,
                                         gboolean short_folder_names);
+gboolean       camel_nntp_settings_get_use_limit_latest
+                                       (CamelNNTPSettings *settings);
+void           camel_nntp_settings_set_use_limit_latest
+                                       (CamelNNTPSettings *settings,
+                                        gboolean use_limit_latest);
+guint          camel_nntp_settings_get_limit_latest
+                                       (CamelNNTPSettings *settings);
+void           camel_nntp_settings_set_limit_latest
+                                       (CamelNNTPSettings *settings,
+                                        guint limit_latest);
 
 G_END_DECLS
 
diff --git a/src/camel/providers/nntp/camel-nntp-summary.c b/src/camel/providers/nntp/camel-nntp-summary.c
index 158ca02..39e6fac 100644
--- a/src/camel/providers/nntp/camel-nntp-summary.c
+++ b/src/camel/providers/nntp/camel-nntp-summary.c
@@ -29,6 +29,7 @@
 #include <glib/gi18n-lib.h>
 
 #include "camel-nntp-folder.h"
+#include "camel-nntp-settings.h"
 #include "camel-nntp-store.h"
 #include "camel-nntp-stream.h"
 #include "camel-nntp-summary.h"
@@ -47,6 +48,7 @@
 struct _CamelNNTPSummaryPrivate {
        gchar *uid;
        guint last_full_resync;
+       guint last_limit_latest;
 
        struct _xover_header *xover; /* xoverview format */
        gint xover_setup;
@@ -129,6 +131,7 @@ summary_header_load (CamelFolderSummary *s,
        cns->high = camel_util_bdata_get_number (&part, 0);
        cns->low = camel_util_bdata_get_number (&part, 0);
        cns->priv->last_full_resync = camel_util_bdata_get_number (&part, 0);
+       cns->priv->last_limit_latest = camel_util_bdata_get_number (&part, 0);
 
        return TRUE;
 }
@@ -143,7 +146,7 @@ summary_header_save (CamelFolderSummary *s,
        fir = CAMEL_FOLDER_SUMMARY_CLASS (camel_nntp_summary_parent_class)->summary_header_save (s, error);
        if (!fir)
                return NULL;
-       fir->bdata = g_strdup_printf ("%d %u %u %u", CAMEL_NNTP_SUMMARY_VERSION, cns->high, cns->low, 
cns->priv->last_full_resync);
+       fir->bdata = g_strdup_printf ("%d %u %u %u %u", CAMEL_NNTP_SUMMARY_VERSION, cns->high, cns->low, 
cns->priv->last_full_resync, cns->priv->last_limit_latest);
 
        return fir;
 }
@@ -427,6 +430,7 @@ static GHashTable *
 nntp_get_existing_article_numbers (CamelNNTPSummary *cns,
                                   CamelNNTPStore *nntp_store,
                                   const gchar *full_name,
+                                  guint limit_from,
                                   guint total,
                                   GCancellable *cancellable,
                                   GError **error)
@@ -456,7 +460,10 @@ nntp_get_existing_article_numbers (CamelNNTPSummary *cns,
 
        nntp_stream = camel_nntp_store_ref_stream (nntp_store);
 
-       ret = camel_nntp_raw_command_auth (nntp_store, cancellable, error, &line, "listgroup %s", full_name);
+       if (limit_from)
+               ret = camel_nntp_raw_command_auth (nntp_store, cancellable, error, &line, "listgroup %s %u-", 
full_name, limit_from);
+       else
+               ret = camel_nntp_raw_command_auth (nntp_store, cancellable, error, &line, "listgroup %s", 
full_name);
        if (ret != 211) {
                g_set_error (
                        error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
@@ -526,11 +533,12 @@ camel_nntp_summary_check (CamelNNTPSummary *cns,
        CamelStoreSummary *store_summary;
        CamelFolderSummary *s;
        gint ret = 0, i;
-       guint n, f, l;
+       guint n, f, l, limit_latest = 0;
        gint count;
        gchar *folder = NULL;
        CamelNNTPStoreInfo *si = NULL;
        CamelStore *parent_store;
+       CamelSettings *settings;
        GPtrArray *known_uids;
        const gchar *full_name;
 
@@ -539,6 +547,14 @@ camel_nntp_summary_check (CamelNNTPSummary *cns,
        full_name = camel_folder_get_full_name (camel_folder_summary_get_folder (s));
        parent_store = camel_folder_get_parent_store (camel_folder_summary_get_folder (s));
 
+       settings = camel_service_ref_settings (CAMEL_SERVICE (store));
+       if (settings) {
+               if (camel_nntp_settings_get_use_limit_latest (CAMEL_NNTP_SETTINGS (settings)))
+                       limit_latest = camel_nntp_settings_get_limit_latest (CAMEL_NNTP_SETTINGS (settings));
+
+               g_object_unref (settings);
+       }
+
        line +=3;
        n = strtoul (line, &line, 10);
        f = strtoul (line, &line, 10);
@@ -558,7 +574,14 @@ camel_nntp_summary_check (CamelNNTPSummary *cns,
                folder = tmp;
        }
 
-       if (cns->low == f && cns->high == l) {
+       if (cns->low == f && cns->high == l && cns->priv->last_limit_latest >= limit_latest) {
+               if (cns->priv->last_limit_latest != limit_latest) {
+                       cns->priv->last_limit_latest = limit_latest;
+
+                       camel_folder_summary_touch (s);
+                       camel_folder_summary_save (s, NULL);
+               }
+
                dd (printf ("nntp_summary: no work to do!\n"));
                goto update;
        }
@@ -574,13 +597,17 @@ camel_nntp_summary_check (CamelNNTPSummary *cns,
 
                if (n != cns->priv->last_full_resync) {
                        GHashTable *existing_articles;
+                       guint first = f;
 
                        /* Do full resync only once per day, not on every folder change */
                        cns->priv->last_full_resync = n;
 
+                       if (limit_latest > 0 && l - first > limit_latest)
+                               first = l - limit_latest;
+
                        /* Ignore errors, the worse is that some already deleted aricles will be still
                           in the local summary, which is not a big deal as no articles shown at all. */
-                       existing_articles = nntp_get_existing_article_numbers (cns, store, full_name, l - f + 
1, cancellable, NULL);
+                       existing_articles = nntp_get_existing_article_numbers (cns, store, full_name, first 
== f ? 0 : first, l - first + 1, cancellable, NULL);
                        if (existing_articles) {
                                for (i = 0; i < known_uids->len; i++) {
                                        const gchar *uid;
@@ -618,8 +645,11 @@ camel_nntp_summary_check (CamelNNTPSummary *cns,
 
        cns->low = f;
 
-       if (cns->high < l) {
-               if (cns->high < f)
+       if (cns->high < l || limit_latest != cns->priv->last_limit_latest) {
+               if (limit_latest > 0 && l - f > limit_latest)
+                       f = l - limit_latest + 1;
+
+               if (cns->high < f || limit_latest != cns->priv->last_limit_latest)
                        cns->high = f - 1;
 
                if (store->xover)
@@ -632,6 +662,8 @@ camel_nntp_summary_check (CamelNNTPSummary *cns,
                                changes, cancellable, error);
        }
 
+       cns->priv->last_limit_latest = limit_latest;
+
        /* TODO: not from here */
        camel_folder_summary_touch (s);
        camel_folder_summary_save (s, NULL);


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