[evolution-data-server] I#372 - SMTP: Add option to not re-encode message on upload



commit b7bbd30a195b105d0d56ca6680e1065863bcad46
Author: Milan Crha <mcrha redhat com>
Date:   Mon Jan 24 18:07:23 2022 +0100

    I#372 - SMTP: Add option to not re-encode message on upload
    
    Closes https://gitlab.gnome.org/GNOME/evolution-data-server/-/issues/372

 src/camel/providers/smtp/camel-smtp-provider.c  | 11 ++++-
 src/camel/providers/smtp/camel-smtp-settings.c  | 64 ++++++++++++++++++++++---
 src/camel/providers/smtp/camel-smtp-settings.h  |  6 +++
 src/camel/providers/smtp/camel-smtp-transport.c | 29 +++++++----
 4 files changed, 92 insertions(+), 18 deletions(-)
---
diff --git a/src/camel/providers/smtp/camel-smtp-provider.c b/src/camel/providers/smtp/camel-smtp-provider.c
index c7b667cd2..f21b00830 100644
--- a/src/camel/providers/smtp/camel-smtp-provider.c
+++ b/src/camel/providers/smtp/camel-smtp-provider.c
@@ -33,6 +33,15 @@
 static guint smtp_url_hash (gconstpointer key);
 static gint smtp_url_equal (gconstpointer a, gconstpointer b);
 
+CamelProviderConfEntry smtp_conf_entries[] = {
+       { CAMEL_PROVIDER_CONF_SECTION_START, "smtpsection", NULL,
+         N_("Send Options") },
+       { CAMEL_PROVIDER_CONF_CHECKBOX, "reencode-data", NULL,
+         N_("_Re-encode message before send"), "0" },
+       { CAMEL_PROVIDER_CONF_SECTION_END },
+       { CAMEL_PROVIDER_CONF_END }
+};
+
 CamelProviderPortEntry smtp_port_entries[] = {
        { 25, N_("Default SMTP port"), FALSE },
        { 465, N_("SMTP over TLS"), TRUE },
@@ -53,7 +62,7 @@ static CamelProvider smtp_provider = {
 
        CAMEL_URL_NEED_HOST | CAMEL_URL_ALLOW_AUTH | CAMEL_URL_ALLOW_USER,
 
-       NULL,
+       smtp_conf_entries,
 
        smtp_port_entries,
 
diff --git a/src/camel/providers/smtp/camel-smtp-settings.c b/src/camel/providers/smtp/camel-smtp-settings.c
index c314dfebb..644ae7d97 100644
--- a/src/camel/providers/smtp/camel-smtp-settings.c
+++ b/src/camel/providers/smtp/camel-smtp-settings.c
@@ -17,21 +17,23 @@
 
 #include "camel-smtp-settings.h"
 
+struct _CamelSmtpSettingsPrivate {
+       gboolean reencode_data;
+};
+
 enum {
        PROP_0,
        PROP_AUTH_MECHANISM,
        PROP_HOST,
        PROP_PORT,
        PROP_SECURITY_METHOD,
-       PROP_USER
+       PROP_USER,
+       PROP_REENCODE_DATA
 };
 
-G_DEFINE_TYPE_WITH_CODE (
-       CamelSmtpSettings,
-       camel_smtp_settings,
-       CAMEL_TYPE_SETTINGS,
-       G_IMPLEMENT_INTERFACE (
-               CAMEL_TYPE_NETWORK_SETTINGS, NULL))
+G_DEFINE_TYPE_WITH_CODE (CamelSmtpSettings, camel_smtp_settings, CAMEL_TYPE_SETTINGS,
+       G_ADD_PRIVATE (CamelSmtpSettings)
+       G_IMPLEMENT_INTERFACE (CAMEL_TYPE_NETWORK_SETTINGS, NULL))
 
 static void
 smtp_settings_set_property (GObject *object,
@@ -69,6 +71,12 @@ smtp_settings_set_property (GObject *object,
                                CAMEL_NETWORK_SETTINGS (object),
                                g_value_get_string (value));
                        return;
+
+               case PROP_REENCODE_DATA:
+                       camel_smtp_settings_set_reencode_data (
+                               CAMEL_SMTP_SETTINGS (object),
+                               g_value_get_boolean (value));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -115,6 +123,13 @@ smtp_settings_get_property (GObject *object,
                                camel_network_settings_dup_user (
                                CAMEL_NETWORK_SETTINGS (object)));
                        return;
+
+               case PROP_REENCODE_DATA:
+                       g_value_set_boolean (
+                               value,
+                               camel_smtp_settings_get_reencode_data (
+                               CAMEL_SMTP_SETTINGS (object)));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -158,10 +173,45 @@ camel_smtp_settings_class_init (CamelSmtpSettingsClass *class)
                object_class,
                PROP_USER,
                "user");
+
+       g_object_class_install_property (
+               object_class,
+               PROP_REENCODE_DATA,
+               g_param_spec_boolean (
+                       "reencode-data",
+                       "Reencode Data",
+                       "Whether to re-encode data on send",
+                       FALSE,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT |
+                       G_PARAM_EXPLICIT_NOTIFY |
+                       G_PARAM_STATIC_STRINGS));
 }
 
 static void
 camel_smtp_settings_init (CamelSmtpSettings *settings)
 {
+       settings->priv = camel_smtp_settings_get_instance_private (settings);
 }
 
+gboolean
+camel_smtp_settings_get_reencode_data (CamelSmtpSettings *settings)
+{
+       g_return_val_if_fail (CAMEL_IS_SMTP_SETTINGS (settings), FALSE);
+
+       return settings->priv->reencode_data;
+}
+
+void
+camel_smtp_settings_set_reencode_data (CamelSmtpSettings *settings,
+                                      gboolean reencode_data)
+{
+       g_return_if_fail (CAMEL_IS_SMTP_SETTINGS (settings));
+
+       if ((settings->priv->reencode_data ? 1 : 0) == (reencode_data ? 1 : 0))
+               return;
+
+       settings->priv->reencode_data = reencode_data;
+
+       g_object_notify (G_OBJECT (settings), "reencode-data");
+}
diff --git a/src/camel/providers/smtp/camel-smtp-settings.h b/src/camel/providers/smtp/camel-smtp-settings.h
index e2dd454fa..513e1deb1 100644
--- a/src/camel/providers/smtp/camel-smtp-settings.h
+++ b/src/camel/providers/smtp/camel-smtp-settings.h
@@ -59,6 +59,12 @@ struct _CamelSmtpSettingsClass {
 
 GType          camel_smtp_settings_get_type    (void) G_GNUC_CONST;
 
+gboolean       camel_smtp_settings_get_reencode_data
+                                               (CamelSmtpSettings *settings);
+void           camel_smtp_settings_set_reencode_data
+                                               (CamelSmtpSettings *settings,
+                                                gboolean reencode_data);
+
 G_END_DECLS
 
 #endif /* CAMEL_SMTP_SETTINGS_H */
diff --git a/src/camel/providers/smtp/camel-smtp-transport.c b/src/camel/providers/smtp/camel-smtp-transport.c
index 0dba2bd19..f535ad66b 100644
--- a/src/camel/providers/smtp/camel-smtp-transport.c
+++ b/src/camel/providers/smtp/camel-smtp-transport.c
@@ -1745,26 +1745,35 @@ smtp_data (CamelSmtpTransport *transport,
            GCancellable *cancellable,
            GError **error)
 {
+       CamelSettings *settings;
        CamelNameValueArray *previous_headers;
        const gchar *header_name = NULL, *header_value = NULL;
-       CamelBestencEncoding enctype = CAMEL_BESTENC_8BIT;
        CamelStream *filtered_stream;
        gchar *cmdbuf, *respbuf = NULL;
        CamelMimeFilter *filter;
        gsize bytes_written;
+       gboolean reencode_data;
        gint ret;
        guint ii;
 
-       /* If the server doesn't support 8BITMIME, set our required encoding to be 7bit */
-       if (!(transport->flags & CAMEL_SMTP_TRANSPORT_8BITMIME))
-               enctype = CAMEL_BESTENC_7BIT;
+       settings = camel_service_ref_settings (CAMEL_SERVICE (transport));
+       reencode_data = camel_smtp_settings_get_reencode_data (CAMEL_SMTP_SETTINGS (settings));
+       g_clear_object (&settings);
+
+       if (reencode_data) {
+               CamelBestencEncoding enctype = CAMEL_BESTENC_8BIT;
 
-       /* FIXME: should we get the best charset too?? */
-       /* Changes the encoding of all mime parts to fit within our required
-        * encoding type and also force any text parts with long lines (longer
-        * than 998 octets) to wrap by QP or base64 encoding them. */
-       camel_mime_message_set_best_encoding (
-               message, CAMEL_BESTENC_GET_ENCODING, enctype);
+               /* If the server doesn't support 8BITMIME, set our required encoding to be 7bit */
+               if (!(transport->flags & CAMEL_SMTP_TRANSPORT_8BITMIME))
+                       enctype = CAMEL_BESTENC_7BIT;
+
+               /* FIXME: should we get the best charset too?? */
+               /* Changes the encoding of all mime parts to fit within our required
+                * encoding type and also force any text parts with long lines (longer
+                * than 998 octets) to wrap by QP or base64 encoding them. */
+               camel_mime_message_set_best_encoding (
+                       message, CAMEL_BESTENC_GET_ENCODING, enctype);
+       }
 
        cmdbuf = g_strdup ("DATA\r\n");
 


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