[evolution-ews] Bug 770936 - BAD REQUEST due to empty Categories element



commit 5c0780e21ab972d491733d7cf444f6d93f940a4a
Author: Milan Crha <mcrha redhat com>
Date:   Tue Oct 18 12:55:23 2016 +0200

    Bug 770936 - BAD REQUEST due to empty Categories element

 src/calendar/e-cal-backend-ews-utils.c |   58 ++++++++++++++++++++++---------
 src/camel/camel-ews-folder.c           |   34 +++++++++++++-----
 src/camel/camel-ews-utils.c            |   21 +++++++----
 src/camel/camel-ews-utils.h            |    2 +-
 4 files changed, 79 insertions(+), 36 deletions(-)
---
diff --git a/src/calendar/e-cal-backend-ews-utils.c b/src/calendar/e-cal-backend-ews-utils.c
index dbee3c9..65cb712 100644
--- a/src/calendar/e-cal-backend-ews-utils.c
+++ b/src/calendar/e-cal-backend-ews-utils.c
@@ -1207,18 +1207,28 @@ convert_categories_calcomp_to_xml (ESoapMessage *msg,
        if (!categ_list)
                return;
 
-       e_soap_message_start_element (msg, "Categories", NULL, NULL);
-
-       for (citer = categ_list; citer;  citer = g_slist_next (citer)) {
+       /* Categories cannot be empty, thus first verify they are not */
+       for (citer = categ_list; citer; citer = g_slist_next (citer)) {
                const gchar *category = citer->data;
 
-               if (!category || !*category)
-                       continue;
-
-               e_ews_message_write_string_parameter (msg, "String", NULL, category);
+               if (category && *category)
+                       break;
        }
 
-       e_soap_message_end_element (msg); /* Categories */
+       if (citer) {
+               e_soap_message_start_element (msg, "Categories", NULL, NULL);
+
+               for (citer = categ_list; citer; citer = g_slist_next (citer)) {
+                       const gchar *category = citer->data;
+
+                       if (!category || !*category)
+                               continue;
+
+                       e_ews_message_write_string_parameter (msg, "String", NULL, category);
+               }
+
+               e_soap_message_end_element (msg); /* Categories */
+       }
 
        e_cal_component_free_categories_list (categ_list);
 }
@@ -1504,20 +1514,34 @@ convert_component_categories_to_updatexml (ECalComponent *comp,
        g_return_if_fail (base_elem_name != NULL);
 
        e_cal_component_get_categories_list (comp, &categ_list);
-       e_ews_message_start_set_item_field (msg, "Categories", "item", base_elem_name);
-       e_soap_message_start_element (msg, "Categories", NULL, NULL);
 
-       for (citer = categ_list; citer;  citer = g_slist_next (citer)) {
-               const gchar *category = citer->data;
+       /* Categories cannot be empty, thus first verify they are not */
 
-               if (!category || !*category)
-                       continue;
+       for (citer = categ_list; citer; citer = g_slist_next (citer)) {
+               const gchar *category = citer->data;
 
-               e_ews_message_write_string_parameter (msg, "String", NULL, category);
+               if (category && *category)
+                       break;
        }
 
-       e_soap_message_end_element (msg); /* Categories */
-       e_ews_message_end_set_item_field (msg);
+       if (citer) {
+               e_ews_message_start_set_item_field (msg, "Categories", "item", base_elem_name);
+               e_soap_message_start_element (msg, "Categories", NULL, NULL);
+
+               for (citer = categ_list; citer; citer = g_slist_next (citer)) {
+                       const gchar *category = citer->data;
+
+                       if (!category || !*category)
+                               continue;
+
+                       e_ews_message_write_string_parameter (msg, "String", NULL, category);
+               }
+
+               e_soap_message_end_element (msg); /* Categories */
+               e_ews_message_end_set_item_field (msg);
+       } else {
+               e_ews_message_add_delete_item_field (msg, "Categories", "item");
+       }
 
        e_cal_component_free_categories_list (categ_list);
 }
diff --git a/src/camel/camel-ews-folder.c b/src/camel/camel-ews-folder.c
index 7675a6a..0e9be48 100644
--- a/src/camel/camel-ews-folder.c
+++ b/src/camel/camel-ews-folder.c
@@ -920,6 +920,7 @@ msg_update_flags (ESoapMessage *msg,
 
        for (iter = mi_list; iter; iter = g_slist_next (iter)) {
                guint32 flags_changed;
+               GSList *user_flags;
 
                mi = iter->data;
 
@@ -980,20 +981,33 @@ msg_update_flags (ESoapMessage *msg,
                }
 
                /* now update the Categories */
-               e_soap_message_start_element (msg, "SetItemField", NULL, NULL);
+               user_flags = ews_utils_gather_server_user_flags (msg, mi);
+               if (user_flags) {
+                       GSList *link;
 
-               e_soap_message_start_element (msg, "FieldURI", NULL, NULL);
-               e_soap_message_add_attribute (msg, "FieldURI", "item:Categories", NULL, NULL);
-               e_soap_message_end_element (msg);
+                       e_soap_message_start_element (msg, "SetItemField", NULL, NULL);
+
+                       e_soap_message_start_element (msg, "FieldURI", NULL, NULL);
+                       e_soap_message_add_attribute (msg, "FieldURI", "item:Categories", NULL, NULL);
+                       e_soap_message_end_element (msg);
+
+                       e_soap_message_start_element (msg, "Message", NULL, NULL);
+                       e_soap_message_start_element (msg, "Categories", NULL, NULL);
 
-               e_soap_message_start_element (msg, "Message", NULL, NULL);
-               e_soap_message_start_element (msg, "Categories", NULL, NULL);
+                       for (link = user_flags; link; link = g_slist_next (link)) {
+                               const gchar *user_flag = link->data;
 
-               ews_utils_replace_server_user_flags (msg, mi);
+                               e_ews_message_write_string_parameter (msg, "String", NULL, user_flag);
+                       }
+
+                       e_soap_message_end_element (msg); /* Categories */
+                       e_soap_message_end_element (msg); /* Message */
+                       e_soap_message_end_element (msg); /* SetItemField */
+               } else {
+                       e_ews_message_add_delete_item_field (msg, "Categories", "item");
+               }
 
-               e_soap_message_end_element (msg); /* Categories */
-               e_soap_message_end_element (msg); /* Message */
-               e_soap_message_end_element (msg); /* SetItemField */
+               g_slist_free_full (user_flags, g_free);
 
                ews_utils_update_followup_flags (msg, (CamelMessageInfo *) mi);
 
diff --git a/src/camel/camel-ews-utils.c b/src/camel/camel-ews-utils.c
index 5f05603..382c4ec 100644
--- a/src/camel/camel-ews-utils.c
+++ b/src/camel/camel-ews-utils.c
@@ -420,10 +420,13 @@ ews_utils_is_system_user_flag (const gchar *name)
                g_str_equal (name, "$has-cal");
 }
 
-void
-ews_utils_replace_server_user_flags (ESoapMessage *msg,
-                                     CamelEwsMessageInfo *mi)
+/* free with g_slist_free_full (flags, g_free);
+   the lists' members are values for the String xml element. */
+GSList *
+ews_utils_gather_server_user_flags (ESoapMessage *msg,
+                                   CamelEwsMessageInfo *mi)
 {
+       GSList *user_flags = NULL;
        const CamelFlag *flag;
 
        /* transfer camel flags to become the categories as an XML
@@ -439,8 +442,10 @@ ews_utils_replace_server_user_flags (ESoapMessage *msg,
                if (ews_utils_is_system_user_flag (n))
                        continue;
 
-               e_ews_message_write_string_parameter (msg, "String", NULL, n);
+               user_flags = g_slist_prepend (user_flags, g_strdup (n));
        }
+
+       return g_slist_reverse (user_flags);
 }
 
 static void
@@ -993,13 +998,13 @@ ews_utils_update_followup_flags (ESoapMessage *msg,
        if (dueby && *dueby)
                dueby_tt = camel_header_decode_date (dueby, NULL);
 
-       /* PidTagFlagStatus */
-       e_ews_message_add_set_item_field_extended_tag_int (msg, NULL, "Message", 0x1090,
-               followup ? (completed_tt != (time_t) 0 ? 0x01 /* followupComplete */: 0x02 /* followupFlagged 
*/) : 0x0);
-
        if (followup) {
                time_t now_tt = time (NULL);
 
+               /* PidTagFlagStatus */
+               e_ews_message_add_set_item_field_extended_tag_int (msg, NULL, "Message", 0x1090,
+                       completed_tt != (time_t) 0 ? 0x01 /* followupComplete */: 0x02 /* followupFlagged */);
+
                /* PidLidFlagRequest */
                e_ews_message_add_set_item_field_extended_distinguished_tag_string (msg, NULL, "Message", 
"Common", 0x8530, followup);
 
diff --git a/src/camel/camel-ews-utils.h b/src/camel/camel-ews-utils.h
index 0cf4940..93ec395 100644
--- a/src/camel/camel-ews-utils.h
+++ b/src/camel/camel-ews-utils.h
@@ -74,7 +74,7 @@ void          camel_ews_utils_sync_updated_items
                                                (CamelEwsFolder *ews_folder,
                                                 GSList *items_updated,
                                                 CamelFolderChangeInfo *change_info);
-void           ews_utils_replace_server_user_flags
+GSList *       ews_utils_gather_server_user_flags
                                                (ESoapMessage *msg,
                                                 CamelEwsMessageInfo *mi);
 void           ews_utils_update_followup_flags (ESoapMessage *msg,


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