[evolution-ews] I#102 - Hidden folders are displayed normally in the UI



commit cf53f472e787f765be6f5e2d1f69766d5954f001
Author: Milan Crha <mcrha redhat com>
Date:   Thu May 28 11:09:06 2020 +0200

    I#102 - Hidden folders are displayed normally in the UI
    
    Closes https://gitlab.gnome.org/GNOME/evolution-ews/-/issues/102

 src/collection/e-ews-backend.c | 32 ++------------------------------
 src/server/e-ews-connection.c  | 38 +++++++++++++++++++++++++-------------
 src/server/e-ews-folder.c      | 21 ++++++++++++++++++++-
 src/server/e-ews-folder.h      |  3 +--
 4 files changed, 48 insertions(+), 46 deletions(-)
---
diff --git a/src/collection/e-ews-backend.c b/src/collection/e-ews-backend.c
index ea7c7518..474deab3 100644
--- a/src/collection/e-ews-backend.c
+++ b/src/collection/e-ews-backend.c
@@ -225,32 +225,6 @@ ews_backend_sync_authentication (EEwsBackend *ews_backend,
                e_source_authentication_get_user (coll_authentication_extension));
 }
 
-static gboolean
-ews_backend_is_uuid_like_name (const gchar *name)
-{
-       const gchar *uuid_mask = "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}";
-       const gchar *ptr, *msk_ptr;
-       gint len;
-
-       if (!name || *name != '{')
-               return FALSE;
-
-       len = strlen (name);
-       if (name[len - 1] != '}' || len != strlen (uuid_mask))
-               return FALSE;
-
-       for (ptr = name, msk_ptr = uuid_mask; *ptr && *msk_ptr; ptr++, msk_ptr++) {
-               if (*msk_ptr == 'X') {
-                       if (!g_ascii_isxdigit (*ptr))
-                               break;
-               } else if (*msk_ptr != *ptr) {
-                       break;
-               }
-       }
-
-       return *msk_ptr == *ptr && !*msk_ptr;
-}
-
 static ESource *
 ews_backend_new_child (EEwsBackend *backend,
                        EEwsFolder *folder)
@@ -268,11 +242,9 @@ ews_backend_new_child (EEwsBackend *backend,
 
        display_name = e_ews_folder_get_name (folder);
 
-       if (e_ews_folder_get_folder_type (folder) == E_EWS_FOLDER_TYPE_CONTACTS &&
-           ews_backend_is_uuid_like_name (display_name)) {
-               /* Ignore address books with UUID-like name */
+       /* Hide on-the-server hidden folders */
+       if (e_ews_folder_get_is_hidden (folder))
                return NULL;
-       }
 
        collection_backend = E_COLLECTION_BACKEND (backend);
        source = e_collection_backend_new_child (collection_backend, fid->id);
diff --git a/src/server/e-ews-connection.c b/src/server/e-ews-connection.c
index 55660237..5b810821 100644
--- a/src/server/e-ews-connection.c
+++ b/src/server/e-ews-connection.c
@@ -1187,32 +1187,38 @@ sync_xxx_response_cb (ESoapParameter *subparam,
                for (subparam1 = e_soap_parameter_get_first_child_by_name (node, "Create");
                     subparam1 != NULL;
                     subparam1 = e_soap_parameter_get_next_child_by_name (subparam1, "Create")) {
-                       EEwsFolder *folder;
+                       GObject *object;
 
-                       folder = parser (subparam1);
-                       if (folder)
-                               items_created = g_slist_append (items_created, folder);
+                       object = parser (subparam1);
+                       if (object && (!E_IS_EWS_FOLDER (object) || !e_ews_folder_get_is_hidden (E_EWS_FOLDER 
(object))))
+                               items_created = g_slist_append (items_created, object);
+                       else
+                               g_clear_object (&object);
                }
 
                for (subparam1 = e_soap_parameter_get_first_child_by_name (node, "Update");
                     subparam1 != NULL;
                     subparam1 = e_soap_parameter_get_next_child_by_name (subparam1, "Update")) {
-                       EEwsFolder *folder;
+                       GObject *object;
 
-                       folder = parser (subparam1);
-                       if (folder)
-                               items_updated = g_slist_append (items_updated, folder);
+                       object = parser (subparam1);
+                       if (object && (!E_IS_EWS_FOLDER (object) || !e_ews_folder_get_is_hidden (E_EWS_FOLDER 
(object))))
+                               items_updated = g_slist_append (items_updated, object);
+                       else
+                               g_clear_object (&object);
                }
                  /* Exchange 2007SP1 introduced <ReadFlagChange> which is basically identical
                   * to <Update>; no idea why they thought it was a good idea. */
                for (subparam1 = e_soap_parameter_get_first_child_by_name (node, "ReadFlagChange");
                     subparam1 != NULL;
                     subparam1 = e_soap_parameter_get_next_child_by_name (subparam1, "ReadFlagChange")) {
-                       EEwsFolder *folder;
+                       GObject *object;
 
-                       folder = parser (subparam1);
-                       if (folder)
-                               items_updated = g_slist_append (items_updated, folder);
+                       object = parser (subparam1);
+                       if (object && (!E_IS_EWS_FOLDER (object) || !e_ews_folder_get_is_hidden (E_EWS_FOLDER 
(object))))
+                               items_updated = g_slist_append (items_updated, object);
+                       else
+                               g_clear_object (&object);
                }
 
                for (subparam1 = e_soap_parameter_get_first_child_by_name (node, "Delete");
@@ -5130,7 +5136,13 @@ e_ews_connection_sync_folder_hierarchy (EEwsConnection *cnc,
                        TRUE);
        e_soap_message_start_element (msg, "FolderShape", "messages", NULL);
        e_ews_message_write_string_parameter (msg, "BaseShape", NULL, "AllProperties");
-       e_soap_message_end_element (msg);
+       e_soap_message_start_element (msg, "AdditionalProperties", NULL, NULL);
+       e_soap_message_start_element (msg, "ExtendedFieldURI", NULL, NULL);
+       e_soap_message_add_attribute (msg, "PropertyTag", "4340", NULL, NULL); /* PidTagAttributeHidden */
+       e_soap_message_add_attribute (msg, "PropertyType", "Boolean", NULL, NULL);
+       e_soap_message_end_element (msg); /* ExtendedFieldURI */
+       e_soap_message_end_element (msg); /* AdditionalProperties */
+       e_soap_message_end_element (msg); /* FolderShape */
 
        if (sync_state)
                e_ews_message_write_string_parameter (msg, "SyncState", "messages", sync_state);
diff --git a/src/server/e-ews-folder.c b/src/server/e-ews-folder.c
index 65830fc7..e8f77590 100644
--- a/src/server/e-ews-folder.c
+++ b/src/server/e-ews-folder.c
@@ -47,6 +47,7 @@ struct _EEwsFolderPrivate {
        gboolean foreign;
        gchar *foreign_mail;
        gboolean is_public;
+       gboolean is_hidden;
 };
 
 static void
@@ -110,6 +111,7 @@ e_ews_folder_init (EEwsFolder *folder)
        folder->priv->folder_type = E_EWS_FOLDER_TYPE_UNKNOWN;
        folder->priv->foreign = FALSE;
        folder->priv->is_public = FALSE;
+       folder->priv->is_hidden = FALSE;
 }
 
 static gboolean
@@ -214,10 +216,19 @@ e_ews_folder_set_from_soap_parameter (EEwsFolder *folder,
                subparam1 = e_soap_parameter_get_first_child_by_name (subparam, "ExtendedFieldURI");
                if (subparam1) {
                        prop_tag = e_soap_parameter_get_property (subparam1, "PropertyTag");
-                       if (g_strcmp0 (prop_tag, "0xe08") == 0) {
+                       if (prop_tag && g_ascii_strcasecmp (prop_tag, "0xe08") == 0) {
                                subparam1 = e_soap_parameter_get_first_child_by_name (subparam, "Value");
                                if (subparam1)
                                        priv->size = e_soap_parameter_get_int_value (subparam1);
+                       } else if (prop_tag && g_ascii_strcasecmp (prop_tag, "0x10f4") == 0) { /* 
PidTagAttributeHidden */
+                               subparam1 = e_soap_parameter_get_first_child_by_name (subparam, "Value");
+                               if (subparam1) {
+                                       gchar *value;
+
+                                       value = e_soap_parameter_get_string_value (subparam1);
+                                       priv->is_hidden = g_strcmp0 (value, "true") == 0;
+                                       g_free (value);
+                               }
                        }
                        g_free (prop_tag);
                }
@@ -474,6 +485,14 @@ e_ews_folder_set_parent_id (EEwsFolder *folder,
        priv->parent_fid = parent_fid;
 }
 
+gboolean
+e_ews_folder_get_is_hidden (EEwsFolder *folder)
+{
+       g_return_val_if_fail (E_IS_EWS_FOLDER (folder), FALSE);
+
+       return folder->priv->is_hidden;
+}
+
 EEwsFolderType
 e_ews_folder_get_folder_type (const EEwsFolder *folder)
 {
diff --git a/src/server/e-ews-folder.h b/src/server/e-ews-folder.h
index f07957e9..baab181b 100644
--- a/src/server/e-ews-folder.h
+++ b/src/server/e-ews-folder.h
@@ -74,8 +74,7 @@ guint32               e_ews_folder_get_total_count (const EEwsFolder *folder);
 guint32                e_ews_folder_get_unread_count (const EEwsFolder *folder);
 guint32                e_ews_folder_get_child_count (const EEwsFolder *folder);
 guint64                e_ews_folder_get_size (const EEwsFolder *folder);
-gboolean       e_ews_folder_get_is_writable (const EEwsFolder *folder);
-void           e_ews_folder_set_is_writable (EEwsFolder *folder, gboolean writable);
+gboolean       e_ews_folder_get_is_hidden (EEwsFolder *folder);
 EEwsFolderType e_ews_folder_get_folder_type (const EEwsFolder *folder);
 void           e_ews_folder_set_folder_type (EEwsFolder *folder, EEwsFolderType folder_type);
 gboolean       e_ews_folder_get_foreign (const EEwsFolder *folder);


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