[evolution-data-server] Bug 338649 - [NNTP] Add option to limit message download count
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Bug 338649 - [NNTP] Add option to limit message download count
- Date: Thu, 22 Jun 2017 11:35:19 +0000 (UTC)
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]