[evolution-ews] I#153 - Limit Subject/Summary/Location text length



commit 3c3193ad813c6b2d6cef291992330e96d9efeab0
Author: Milan Crha <mcrha redhat com>
Date:   Fri Sep 16 09:22:11 2022 +0200

    I#153 - Limit Subject/Summary/Location text length
    
    Closes https://gitlab.gnome.org/GNOME/evolution-ews/-/issues/153

 src/EWS/evolution/CMakeLists.txt                |   2 +
 src/EWS/evolution/e-ews-comp-editor-extension.c |  50 +++++++++
 src/EWS/evolution/e-ews-composer-extension.c    | 130 ++++++++++++++++++++++++
 src/EWS/evolution/e-ews-composer-extension.h    |  18 ++++
 src/EWS/evolution/module-ews-configuration.c    |   2 +
 5 files changed, 202 insertions(+)
---
diff --git a/src/EWS/evolution/CMakeLists.txt b/src/EWS/evolution/CMakeLists.txt
index 8c11d2cf..f2906e03 100644
--- a/src/EWS/evolution/CMakeLists.txt
+++ b/src/EWS/evolution/CMakeLists.txt
@@ -37,6 +37,8 @@ set(sources
        e-mail-part-ews-sharing-metadata.h
        e-ews-comp-editor-extension.c
        e-ews-comp-editor-extension.h
+       e-ews-composer-extension.c
+       e-ews-composer-extension.h
        e-ews-config-lookup.c
        e-ews-config-lookup.h
        e-ews-config-ui-extension.c
diff --git a/src/EWS/evolution/e-ews-comp-editor-extension.c b/src/EWS/evolution/e-ews-comp-editor-extension.c
index ff7a900c..ea989dce 100644
--- a/src/EWS/evolution/e-ews-comp-editor-extension.c
+++ b/src/EWS/evolution/e-ews-comp-editor-extension.c
@@ -29,6 +29,53 @@ typedef struct _EEwsCompEditorExtensionClass {
 
 G_DEFINE_DYNAMIC_TYPE (EEwsCompEditorExtension, e_ews_comp_editor_extension, E_TYPE_EXTENSION)
 
+static void
+e_ews_comp_editor_extension_target_client_changed_cb (ECompEditor *comp_editor)
+{
+       ECalClient *target_client;
+       ECompEditorPropertyPart *part;
+       gboolean can_use;
+
+       target_client = e_comp_editor_get_target_client (comp_editor);
+
+       can_use = target_client != NULL;
+
+       if (can_use) {
+               ESource *source;
+
+               source = e_client_get_source (E_CLIENT (target_client));
+
+               #define check_is_ews_backend(ext) (e_source_has_extension (source, ext) && \
+                       g_strcmp0 (e_source_backend_get_backend_name (e_source_get_extension (source, ext)), 
"ews") == 0)
+
+               can_use = source && (
+                       check_is_ews_backend (E_SOURCE_EXTENSION_CALENDAR) ||
+                       check_is_ews_backend (E_SOURCE_EXTENSION_MEMO_LIST) ||
+                       check_is_ews_backend (E_SOURCE_EXTENSION_TASK_LIST));
+
+               #undef check_is_ews_backend
+       }
+
+       /* These two have limited length on the EWS server */
+       part = e_comp_editor_get_property_part (comp_editor, I_CAL_SUMMARY_PROPERTY);
+       if (part) {
+               GtkWidget *edit_widget;
+
+               edit_widget = e_comp_editor_property_part_get_edit_widget (part);
+               if (GTK_IS_ENTRY (edit_widget))
+                       gtk_entry_set_max_length (GTK_ENTRY (edit_widget), can_use ? 255 : 0);
+       }
+
+       part = e_comp_editor_get_property_part (comp_editor, I_CAL_LOCATION_PROPERTY);
+       if (part) {
+               GtkWidget *edit_widget;
+
+               edit_widget = e_comp_editor_property_part_get_edit_widget (part);
+               if (GTK_IS_ENTRY (edit_widget))
+                       gtk_entry_set_max_length (GTK_ENTRY (edit_widget), can_use ? 255 : 0);
+       }
+}
+
 static void
 e_ews_comp_editor_extension_update_actions (ECompEditor *comp_editor)
 {
@@ -241,6 +288,9 @@ e_ews_comp_editor_extension_constructed (GObject *object)
                g_signal_connect (comp_editor, "fill-component",
                        G_CALLBACK (e_ews_comp_editor_extension_fill_component_cb), NULL);
        }
+
+       g_signal_connect (extensible, "notify::target-client",
+               G_CALLBACK (e_ews_comp_editor_extension_target_client_changed_cb), NULL);
 }
 
 static void
diff --git a/src/EWS/evolution/e-ews-composer-extension.c b/src/EWS/evolution/e-ews-composer-extension.c
new file mode 100644
index 00000000..674955c2
--- /dev/null
+++ b/src/EWS/evolution/e-ews-composer-extension.c
@@ -0,0 +1,130 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * SPDX-FileCopyrightText: (C) 2022 Red Hat (www.redhat.com)
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#include "evolution-ews-config.h"
+
+#include <glib-object.h>
+
+#include <composer/e-msg-composer.h>
+#include <composer/e-composer-from-header.h>
+
+#include "e-ews-composer-extension.h"
+
+#define E_TYPE_EWS_COMPOSER_EXTENSION (e_ews_composer_extension_get_type ())
+
+GType e_ews_composer_extension_get_type (void);
+
+typedef struct _EEwsComposerExtension {
+       EExtension parent;
+} EEwsComposerExtension;
+
+typedef struct _EEwsComposerExtensionClass {
+       EExtensionClass parent_class;
+} EEwsComposerExtensionClass;
+
+G_DEFINE_DYNAMIC_TYPE (EEwsComposerExtension, e_ews_composer_extension, E_TYPE_EXTENSION)
+
+static gboolean
+e_ews_composer_extension_is_ews_transport (ESourceRegistry *registry,
+                                          const gchar *uid)
+{
+       ESource *source;
+       gboolean is_ews_transport = FALSE;
+
+       g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), FALSE);
+       g_return_val_if_fail (uid != NULL, FALSE);
+
+       source = e_source_registry_ref_source (registry, uid);
+       if (source && e_source_has_extension (source, E_SOURCE_EXTENSION_MAIL_SUBMISSION)) {
+               ESourceMailSubmission *mail_submission;
+               const gchar *transport_uid;
+
+               mail_submission = e_source_get_extension (source, E_SOURCE_EXTENSION_MAIL_SUBMISSION);
+               transport_uid = e_source_mail_submission_get_transport_uid (mail_submission);
+
+               if (transport_uid && *transport_uid) {
+                       ESource *transport_source;
+
+                       transport_source = e_source_registry_ref_source (registry, transport_uid);
+                       if (transport_source && e_source_has_extension (transport_source, 
E_SOURCE_EXTENSION_MAIL_TRANSPORT)) {
+                               ESourceBackend *mail_transport;
+
+                               mail_transport = e_source_get_extension (transport_source, 
E_SOURCE_EXTENSION_MAIL_TRANSPORT);
+                               is_ews_transport = g_strcmp0 ("ews", e_source_backend_get_backend_name 
(mail_transport)) == 0;
+                       }
+
+                       g_clear_object (&transport_source);
+               }
+       }
+
+       g_clear_object (&source);
+
+       return is_ews_transport;
+}
+
+static void
+e_ews_composer_extension_from_changed_cb (EComposerHeader *from_header,
+                                         EComposerHeaderTable *header_table)
+{
+       EComposerHeader *subject_header;
+       gchar *uid;
+       gboolean is_ews_transport;
+
+       uid = e_composer_from_header_dup_active_id (E_COMPOSER_FROM_HEADER (from_header), NULL, NULL);
+       is_ews_transport = e_ews_composer_extension_is_ews_transport (e_composer_header_get_registry 
(from_header), uid);
+       g_free (uid);
+
+       subject_header = e_composer_header_table_get_header (header_table, E_COMPOSER_HEADER_SUBJECT);
+       if (subject_header && GTK_IS_ENTRY (subject_header->input_widget))
+               gtk_entry_set_max_length (GTK_ENTRY (subject_header->input_widget), is_ews_transport ? 255 : 
0);
+}
+
+static void
+e_ews_composer_extension_constructed (GObject *object)
+{
+       EExtensible *extensible;
+       EComposerHeaderTable *header_table;
+       EComposerHeader *header;
+
+       /* Chain up to parent's method */
+       G_OBJECT_CLASS (e_ews_composer_extension_parent_class)->constructed (object);
+
+       extensible = e_extension_get_extensible (E_EXTENSION (object));
+       header_table = e_msg_composer_get_header_table (E_MSG_COMPOSER (extensible));
+       header = e_composer_header_table_get_header (header_table, E_COMPOSER_HEADER_FROM);
+
+       g_signal_connect_object (header, "changed",
+               G_CALLBACK (e_ews_composer_extension_from_changed_cb), header_table, 0);
+}
+
+static void
+e_ews_composer_extension_class_init (EEwsComposerExtensionClass *klass)
+{
+       GObjectClass *object_class;
+       EExtensionClass *extension_class;
+
+       object_class = G_OBJECT_CLASS (klass);
+       object_class->constructed = e_ews_composer_extension_constructed;
+
+       extension_class = E_EXTENSION_CLASS (klass);
+       extension_class->extensible_type = E_TYPE_MSG_COMPOSER;
+}
+
+static void
+e_ews_composer_extension_class_finalize (EEwsComposerExtensionClass *klass)
+{
+}
+
+static void
+e_ews_composer_extension_init (EEwsComposerExtension *extension)
+{
+}
+
+void
+e_ews_composer_extension_type_register (GTypeModule *type_module)
+{
+       e_ews_composer_extension_register_type (type_module);
+}
diff --git a/src/EWS/evolution/e-ews-composer-extension.h b/src/EWS/evolution/e-ews-composer-extension.h
new file mode 100644
index 00000000..e4c155f5
--- /dev/null
+++ b/src/EWS/evolution/e-ews-composer-extension.h
@@ -0,0 +1,18 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * SPDX-FileCopyrightText: (C) 2022 Red Hat (www.redhat.com)
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#ifndef E_EWS_COMPOSER_EXTENSION_H
+#define E_EWS_COMPOSER_EXTENSION_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+void e_ews_composer_extension_type_register (GTypeModule *type_module);
+
+G_END_DECLS
+
+#endif /* E_EWS_COMPOSER_EXTENSION_H */
diff --git a/src/EWS/evolution/module-ews-configuration.c b/src/EWS/evolution/module-ews-configuration.c
index 7ce0e8fe..61ae3707 100644
--- a/src/EWS/evolution/module-ews-configuration.c
+++ b/src/EWS/evolution/module-ews-configuration.c
@@ -28,6 +28,7 @@
 #include "e-ews-photo-source.h"
 
 #include "e-ews-comp-editor-extension.h"
+#include "e-ews-composer-extension.h"
 #include "e-ews-config-ui-extension.h"
 #include "common/camel-sasl-xoauth2-office365.h"
 #include "common/e-oauth2-service-office365.h"
@@ -59,6 +60,7 @@ e_module_load (GTypeModule *type_module)
        e_mail_parser_ews_sharing_metadata_type_register (type_module);
        e_mail_part_ews_sharing_metadata_type_register (type_module);
        e_ews_comp_editor_extension_type_register (type_module);
+       e_ews_composer_extension_type_register (type_module);
        e_ews_config_lookup_type_register (type_module);
        e_ews_config_ui_extension_type_register (type_module);
        e_ews_ooo_notificator_type_register (type_module);


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