Blame SOURCES/evolution-ews-3.28.5-birthday-date.patch

8e0de2
diff -up evolution-ews-3.28.5/src/addressbook/CMakeLists.txt.birthday-date evolution-ews-3.28.5/src/addressbook/CMakeLists.txt
8e0de2
--- evolution-ews-3.28.5/src/addressbook/CMakeLists.txt.birthday-date	2018-07-30 16:01:00.000000000 +0200
8e0de2
+++ evolution-ews-3.28.5/src/addressbook/CMakeLists.txt	2019-10-23 14:13:13.158137514 +0200
8e0de2
@@ -45,6 +45,7 @@ target_compile_options(ebookbackendews P
8e0de2
 	${LIBEBOOK_CFLAGS}
8e0de2
 	${LIBEDATABOOK_CFLAGS}
8e0de2
 	${LIBEDATASERVER_CFLAGS}
8e0de2
+	${LIBICAL_CFLAGS}
8e0de2
 	${MSPACK_CFLAGS}
8e0de2
 	${SOUP_CFLAGS}
8e0de2
 )
8e0de2
@@ -60,6 +61,7 @@ target_include_directories(ebookbackende
8e0de2
 	${LIBEBOOK_INCLUDE_DIRS}
8e0de2
 	${LIBEDATABOOK_INCLUDE_DIRS}
8e0de2
 	${LIBEDATASERVER_INCLUDE_DIRS}
8e0de2
+	${LIBICAL_INCLUDE_DIRS}
8e0de2
 	${MSPACK_INCLUDE_DIRS}
8e0de2
 	${SOUP_INCLUDE_DIRS}
8e0de2
 )
8e0de2
@@ -70,6 +72,7 @@ target_link_libraries(ebookbackendews
8e0de2
 	${LIBEBOOK_LDFLAGS}
8e0de2
 	${LIBEDATABOOK_LDFLAGS}
8e0de2
 	${LIBEDATASERVER_LDFLAGS}
8e0de2
+	${LIBICAL_LDFLAGS}
8e0de2
 	${MATH_LDFLAGS}
8e0de2
 	${MSPACK_LDFLAGS}
8e0de2
 	${SOUP_LDFLAGS}
8e0de2
diff -up evolution-ews-3.28.5/src/addressbook/e-book-backend-ews.c.birthday-date evolution-ews-3.28.5/src/addressbook/e-book-backend-ews.c
8e0de2
--- evolution-ews-3.28.5/src/addressbook/e-book-backend-ews.c.birthday-date	2019-10-23 14:04:31.100144733 +0200
8e0de2
+++ evolution-ews-3.28.5/src/addressbook/e-book-backend-ews.c	2019-10-23 14:15:41.719135459 +0200
8e0de2
@@ -37,6 +37,8 @@
8e0de2
 #include <glib/gstdio.h>
8e0de2
 #include <glib/gi18n-lib.h>
8e0de2
 
8e0de2
+#include <libical/ical.h>
8e0de2
+
8e0de2
 #include <libedata-book/libedata-book.h>
8e0de2
 
8e0de2
 #include "server/e-ews-item-change.h"
8e0de2
@@ -268,29 +270,36 @@ ebews_populate_nick_name (EBookBackendEw
8e0de2
 }
8e0de2
 
8e0de2
 static void
8e0de2
+ebews_populate_date_value (EBookBackendEws *bbews,
8e0de2
+			   EContact *contact,
8e0de2
+			   EContactField field,
8e0de2
+			   time_t value)
8e0de2
+{
8e0de2
+	if (value > (time_t) 0) {
8e0de2
+		struct icaltimetype itt;
8e0de2
+
8e0de2
+		itt = icaltime_from_timet_with_zone (value, TRUE, icaltimezone_get_utc_timezone ());
8e0de2
+
8e0de2
+		if (icaltime_is_valid_time (itt) && !icaltime_is_null_time (itt)) {
8e0de2
+			EContactDate edate = { 0 };
8e0de2
+
8e0de2
+			edate.year = itt.year;
8e0de2
+			edate.month = itt.month;
8e0de2
+			edate.day = itt.day;
8e0de2
+
8e0de2
+			e_contact_set (contact, field, &edate);
8e0de2
+		}
8e0de2
+	}
8e0de2
+}
8e0de2
+
8e0de2
+static void
8e0de2
 ebews_populate_birth_date (EBookBackendEws *bbews,
8e0de2
 			   EContact *contact,
8e0de2
 			   EEwsItem *item,
8e0de2
 			   GCancellable *cancellable,
8e0de2
 			   GError **error)
8e0de2
 {
8e0de2
-	time_t bdate;
8e0de2
-	GDate date;
8e0de2
-	EContactDate edate;
8e0de2
-
8e0de2
-	bdate = e_ews_item_get_birthday (item);
8e0de2
-
8e0de2
-	if (bdate) {
8e0de2
-		g_date_clear (&date, 1);
8e0de2
-		g_date_set_time_t (&date, bdate);
8e0de2
-
8e0de2
-		edate.year = date.year;
8e0de2
-		edate.month = date.month;
8e0de2
-		edate.day = date.day;
8e0de2
-
8e0de2
-		if (g_date_valid (&date))
8e0de2
-			e_contact_set (contact, E_CONTACT_BIRTH_DATE, &edate);
8e0de2
-	}
8e0de2
+	ebews_populate_date_value (bbews, contact, E_CONTACT_BIRTH_DATE, e_ews_item_get_birthday (item));
8e0de2
 }
8e0de2
 
8e0de2
 static void
8e0de2
@@ -300,23 +309,7 @@ ebews_populate_anniversary (EBookBackend
8e0de2
 			    GCancellable *cancellable,
8e0de2
 			    GError **error)
8e0de2
 {
8e0de2
-	time_t bdate;
8e0de2
-	GDate date;
8e0de2
-	EContactDate edate;
8e0de2
-
8e0de2
-	bdate = e_ews_item_get_wedding_anniversary (item);
8e0de2
-
8e0de2
-	if (bdate) {
8e0de2
-		g_date_clear (&date, 1);
8e0de2
-		g_date_set_time_t (&date, bdate);
8e0de2
-
8e0de2
-		edate.year = date.year;
8e0de2
-		edate.month = date.month;
8e0de2
-		edate.day = date.day;
8e0de2
-
8e0de2
-		if (g_date_valid (&date))
8e0de2
-			e_contact_set (contact, E_CONTACT_ANNIVERSARY, &edate);
8e0de2
-	}
8e0de2
+	ebews_populate_date_value (bbews, contact, E_CONTACT_ANNIVERSARY, e_ews_item_get_wedding_anniversary (item));
8e0de2
 }
8e0de2
 
8e0de2
 static EContactPhoto *
8e0de2
@@ -600,34 +593,41 @@ ebews_set_full_name (ESoapMessage *msg,
8e0de2
 	e_contact_name_free (name);
8e0de2
 }
8e0de2
 
8e0de2
-/* TODO Set birth and anniversary dates */
8e0de2
 static void
8e0de2
-ebews_set_birth_date (ESoapMessage *message,
8e0de2
-                      EContact *contact)
8e0de2
+ebews_set_date_value (ESoapMessage *message,
8e0de2
+		      EContact *contact,
8e0de2
+		      EContactField field,
8e0de2
+		      const gchar *element_name)
8e0de2
 {
8e0de2
 	EContactDate *date;
8e0de2
-	gchar *birthday;
8e0de2
+	gchar *value;
8e0de2
 
8e0de2
-	date = e_contact_get (contact, E_CONTACT_BIRTH_DATE);
8e0de2
+	date = e_contact_get (contact, field);
8e0de2
 
8e0de2
 	if (!date)
8e0de2
 		return;
8e0de2
 
8e0de2
-	birthday = g_strdup_printf (
8e0de2
-		"%04d-%02d-%02dT00:00:00",
8e0de2
+	value = g_strdup_printf ("%04d-%02d-%02dT00:00:00Z",
8e0de2
 		date->year, date->month, date->day);
8e0de2
 
8e0de2
-	e_ews_message_write_string_parameter (message, "Birthday", NULL, birthday);
8e0de2
+	e_ews_message_write_string_parameter (message, element_name, NULL, value);
8e0de2
 
8e0de2
-	g_free (birthday);
8e0de2
+	e_contact_date_free (date);
8e0de2
+	g_free (value);
8e0de2
+}
8e0de2
 
8e0de2
+static void
8e0de2
+ebews_set_birth_date (ESoapMessage *message,
8e0de2
+                      EContact *contact)
8e0de2
+{
8e0de2
+	ebews_set_date_value (message, contact, E_CONTACT_BIRTH_DATE, "Birthday");
8e0de2
 }
8e0de2
 
8e0de2
 static void
8e0de2
 ebews_set_anniversary (ESoapMessage *message,
8e0de2
                        EContact *contact)
8e0de2
 {
8e0de2
-
8e0de2
+	ebews_set_date_value (message, contact, E_CONTACT_ANNIVERSARY, "WeddingAnniversary");
8e0de2
 }
8e0de2
 
8e0de2
 static void
8e0de2
@@ -838,30 +838,33 @@ ebews_set_full_name_changes (EBookBacken
8e0de2
 }
8e0de2
 
8e0de2
 static void
8e0de2
-ebews_set_birth_date_changes (EBookBackendEws *bbews,
8e0de2
-			      ESoapMessage *message,
8e0de2
+ebews_set_date_value_changes (ESoapMessage *message,
8e0de2
 			      EContact *new,
8e0de2
 			      EContact *old,
8e0de2
-			      gchar **out_new_change_key,
8e0de2
-			      GCancellable *cancellable,
8e0de2
-			      GError **error)
8e0de2
+			      EContactField field,
8e0de2
+			      const gchar *element_name)
8e0de2
 {
8e0de2
 	EContactDate *new_date, *old_date;
8e0de2
-	gchar *birthday;
8e0de2
 
8e0de2
 	if (!message)
8e0de2
 		return;
8e0de2
 
8e0de2
-	new_date = e_contact_get (new, E_CONTACT_BIRTH_DATE);
8e0de2
-	old_date = e_contact_get (old, E_CONTACT_BIRTH_DATE);
8e0de2
+	new_date = e_contact_get (new, field);
8e0de2
+	old_date = e_contact_get (old, field);
8e0de2
 
8e0de2
 	if (!e_contact_date_equal (new_date, old_date)) {
8e0de2
-		birthday = g_strdup_printf (
8e0de2
-			"%04d-%02d-%02dT00:00:00",
8e0de2
-			new_date->year, new_date->month, new_date->day);
8e0de2
+		if (new_date) {
8e0de2
+			gchar *value;
8e0de2
+
8e0de2
+			value = g_strdup_printf ("%04d-%02d-%02dT00:00:00Z",
8e0de2
+				new_date->year, new_date->month, new_date->day);
8e0de2
+
8e0de2
+			convert_contact_property_to_updatexml (message, element_name, value, "contacts", NULL, NULL);
8e0de2
 
8e0de2
-		convert_contact_property_to_updatexml (message, "Birthday", birthday, "contacts", NULL, NULL);
8e0de2
-		g_free (birthday);
8e0de2
+			g_free (value);
8e0de2
+		} else {
8e0de2
+			e_ews_message_add_delete_item_field (message, element_name, "contacts");
8e0de2
+		}
8e0de2
 	}
8e0de2
 
8e0de2
 	e_contact_date_free (new_date);
8e0de2
@@ -869,6 +872,18 @@ ebews_set_birth_date_changes (EBookBacke
8e0de2
 }
8e0de2
 
8e0de2
 static void
8e0de2
+ebews_set_birth_date_changes (EBookBackendEws *bbews,
8e0de2
+			      ESoapMessage *message,
8e0de2
+			      EContact *new,
8e0de2
+			      EContact *old,
8e0de2
+			      gchar **out_new_change_key,
8e0de2
+			      GCancellable *cancellable,
8e0de2
+			      GError **error)
8e0de2
+{
8e0de2
+	ebews_set_date_value_changes (message, new, old, E_CONTACT_BIRTH_DATE, "Birthday");
8e0de2
+}
8e0de2
+
8e0de2
+static void
8e0de2
 ebews_set_anniversary_changes (EBookBackendEws *bbews,
8e0de2
 			       ESoapMessage *message,
8e0de2
 			       EContact *new,
8e0de2
@@ -877,7 +892,7 @@ ebews_set_anniversary_changes (EBookBack
8e0de2
 			       GCancellable *cancellable,
8e0de2
 			       GError **error)
8e0de2
 {
8e0de2
-
8e0de2
+	ebews_set_date_value_changes (message, new, old, E_CONTACT_ANNIVERSARY, "WeddingAnniversary");
8e0de2
 }
8e0de2
 
8e0de2
 static void
8e0de2
@@ -1373,7 +1388,7 @@ static const struct field_element_mappin
8e0de2
 	{ E_CONTACT_SPOUSE, ELEMENT_TYPE_SIMPLE, "SpouseName", e_ews_item_get_spouse_name},
8e0de2
 	{ E_CONTACT_FAMILY_NAME, ELEMENT_TYPE_SIMPLE, "Surname", e_ews_item_get_surname},
8e0de2
 	{ E_CONTACT_GIVEN_NAME, ELEMENT_TYPE_COMPLEX, "GivenName", NULL, ebews_populate_givenname, ebews_set_givenname, ebews_set_givenname_changes},
8e0de2
-	{ E_CONTACT_BIRTH_DATE, ELEMENT_TYPE_COMPLEX, "WeddingAnniversary", NULL,  ebews_populate_anniversary, ebews_set_anniversary, ebews_set_anniversary_changes },
8e0de2
+	{ E_CONTACT_ANNIVERSARY, ELEMENT_TYPE_COMPLEX, "WeddingAnniversary", NULL,  ebews_populate_anniversary, ebews_set_anniversary, ebews_set_anniversary_changes },
8e0de2
 	{ E_CONTACT_PHOTO, ELEMENT_TYPE_COMPLEX, "Photo", NULL,  ebews_populate_photo, ebews_set_photo, ebews_set_photo_changes },
8e0de2
 
8e0de2
 	/* Should take of uid and changekey (REV) */
8e0de2
@@ -3515,6 +3530,7 @@ ebb_ews_get_backend_property (EBookBacke
8e0de2
 			e_contact_field_name (E_CONTACT_ADDRESS_WORK),
8e0de2
 			e_contact_field_name (E_CONTACT_ADDRESS_HOME),
8e0de2
 			e_contact_field_name (E_CONTACT_ADDRESS_OTHER),
8e0de2
+			e_contact_field_name (E_CONTACT_ANNIVERSARY),
8e0de2
 			e_contact_field_name (E_CONTACT_BIRTH_DATE),
8e0de2
 			e_contact_field_name (E_CONTACT_NOTE),
8e0de2
 			e_contact_field_name (E_CONTACT_PHOTO),