Hello,
I thought I'll file a bug with a proposed patch at
bugs.freedesktop.org, where the 
https://syncevolution.org/support#issues pointed me to, but it ends
with "Sorry, entering a bug into the product SyncEvolution has been
disabled.", thus I'm sending it here instead.

There are going to be made huge libecal API changes, as huge as it
deserved a version bump from 1.2 to 2.0, and together with it a small
libebook API changes, most likely being part of the evolution-data-
server 3.33.2 release, which is planned for May 20. More about this can
be found here:
https://mail.gnome.org/archives/desktop-devel-list/2019-April/msg00016.html

The attached is a patch which makes syncevolution build against 3.33.1
and the libical-glib branch without any new compiler warnings. I'm not
able to test the change though, and the `make check` doesn't run any
test here, thus the changes would need some real testing. I'm sorry
about that. On the other hand, this patch gives at least an overview of
the upcoming changes and what to do in the syncevolution code.

One note, the check for HAVE_E_BOOK_OPERATION_FLAGS is quite lame, it
only decides based on the expected version (the libical-glib branch
still references 3.33.1). Maybe you'd like to extend the test in some
better way.

I hope you'll find this useful.
        Bye,
        Milan
diff -up syncevolution-1.5.3/src/backends/evolution/configure-sub.in.orig syncevolution-1.5.3/src/backends/evolution/configure-sub.in
--- syncevolution-1.5.3/src/backends/evolution/configure-sub.in.orig	2019-04-24 14:10:09.961827490 +0200
+++ syncevolution-1.5.3/src/backends/evolution/configure-sub.in	2019-04-24 17:23:23.573667170 +0200
@@ -15,13 +15,23 @@ $anymissing"
 
 dnl check for Evolution packages
 PKG_CHECK_MODULES(EPACKAGE, libedataserver-1.2, EDSFOUND=yes, [EDSFOUND=no])
-PKG_CHECK_MODULES(ECAL, libecal-1.2, ECALFOUND=yes, [ECALFOUND=no])
+PKG_CHECK_MODULES(ECAL, libecal-2.0, ECALFOUND=yes, [ECALFOUND=no])
 PKG_CHECK_MODULES(EBOOK, libebook-1.2, EBOOKFOUND=yes, [EBOOKFOUND=no])
 
+if test "$ECALFOUND" = "yes"; then
+        AC_DEFINE(HAVE_LIBECAL_2_0, 1, [libecal 2.0])
+else
+        PKG_CHECK_MODULES(ECAL, libecal-1.2, ECALFOUND=yes, [ECALFOUND=no])
+fi
+
 PKG_CHECK_MODULES(EBOOK_VERSION, [libebook-1.2 >= 3.3],
                   [AC_DEFINE(HAVE_E_CONTACT_INLINE_LOCAL_PHOTOS, 1, [have e_contact_inline_local_photos()])],
                   [true])
 
+PKG_CHECK_MODULES(EBOOK_VERSION_3_33, [libebook-1.2 >= 3.33.2],
+                  [AC_DEFINE(HAVE_E_BOOK_OPERATION_FLAGS, 1, [have EBookOperationFlags])],
+                  [true])
+
 SE_ARG_ENABLE_BACKEND(ebook, evolution,
                       [AS_HELP_STRING([--disable-ebook],
                                       [disable access to Evolution addressbooks (must be used to compile without it)])],
diff -up syncevolution-1.5.3/src/backends/evolution/e-cal-check-timezones.c.orig syncevolution-1.5.3/src/backends/evolution/e-cal-check-timezones.c
--- syncevolution-1.5.3/src/backends/evolution/e-cal-check-timezones.c.orig	2019-04-24 17:07:51.057680065 +0200
+++ syncevolution-1.5.3/src/backends/evolution/e-cal-check-timezones.c	2019-04-24 17:18:18.077671395 +0200
@@ -414,7 +414,11 @@ gboolean e_cal_check_timezones(icalcompo
     goto done;
  nomem:
     /* set gerror for "out of memory" if possible, otherwise abort via g_error() */
+#ifdef HAVE_LIBECAL_2_0
+    *error = g_error_new(E_CLIENT_ERROR, E_CLIENT_ERROR_OTHER_ERROR, "out of memory");
+#else
     *error = g_error_new(E_CALENDAR_ERROR, E_CALENDAR_STATUS_OTHER_ERROR, "out of memory");
+#endif
     if (!*error) {
         g_error("e_cal_check_timezones(): out of memory, cannot proceed - sorry!");
     }
@@ -451,6 +455,10 @@ icaltimezone *e_cal_tzlookup_ecal(const
                                   const void *custom,
                                   GError **error)
 {
+#ifdef HAVE_LIBECAL_2_0
+    g_propagate_error(error, e_client_error_create(E_CLIENT_ERROR_NOT_SUPPORTED, NULL));
+    return NULL;
+#else
     ECal *ecal = (ECal *)custom;
     icaltimezone *zone = NULL;
 
@@ -470,6 +478,7 @@ icaltimezone *e_cal_tzlookup_ecal(const
         }
         return NULL;
     }
+#endif
 }
 
 /**
diff -up syncevolution-1.5.3/src/backends/evolution/EvolutionCalendarSource.cpp.orig syncevolution-1.5.3/src/backends/evolution/EvolutionCalendarSource.cpp
--- syncevolution-1.5.3/src/backends/evolution/EvolutionCalendarSource.cpp.orig	2019-04-24 14:19:15.057819952 +0200
+++ syncevolution-1.5.3/src/backends/evolution/EvolutionCalendarSource.cpp	2019-04-24 17:19:04.117670758 +0200
@@ -189,7 +189,7 @@ static EClient *newECalClient(ESource *s
                               ECalClientSourceType ecalSourceType,
                               GError **gerror)
 {
-    return E_CLIENT(e_cal_client_new(source, ecalSourceType, gerror));
+    return E_CLIENT(e_cal_client_connect_sync(source, ecalSourceType, -1, NULL, gerror));
 }
 #else
 char *EvolutionCalendarSource::authenticate(const char *prompt,
@@ -440,13 +440,25 @@ void EvolutionCalendarSource::readItem(c
 }
 
 #ifdef USE_EDS_CLIENT
+#ifdef HAVE_LIBECAL_2_0
+ICalTimezone *
+#else /* HAVE_LIBECAL_2_0 */
 icaltimezone *
+#endif /* HAVE_LIBECAL_2_0 */
 my_tzlookup(const gchar *tzid,
+#ifdef HAVE_LIBECAL_2_0
+            gpointer ecalclient,
+#else
             gconstpointer ecalclient,
+#endif
             GCancellable *cancellable,
             GError **error)
 {
+#ifdef HAVE_LIBECAL_2_0
+    ICalTimezone *zone = NULL;
+#else
     icaltimezone *zone = NULL;
+#endif
     GError *local_error = NULL;
 
     if (e_cal_client_get_timezone_sync((ECalClient *)ecalclient, tzid, &zone, cancellable, &local_error)) {
@@ -503,8 +515,12 @@ EvolutionCalendarSource::InsertItemResul
     if (modified) {
         SE_LOG_DEBUG(getDisplayName(), "after replacing , with \\, in CATEGORIES:\n%s", data.c_str());
     }
-
+#ifdef HAVE_LIBECAL_2_0
+    eptr<ICalComponent> icomp(i_cal_component_new_from_string((char *)data.c_str()));
+#else
     eptr<icalcomponent> icomp(icalcomponent_new_from_string((char *)data.c_str()));
+#endif
+
 
     if( !icomp ) {
         throwError(SE_HERE, string("failure parsing ical") + data);
@@ -515,10 +531,19 @@ EvolutionCalendarSource::InsertItemResul
     // fix up TZIDs
     if (
 #ifdef USE_EDS_CLIENT
-        !e_cal_client_check_timezones(icomp,
+#ifdef HAVE_LIBECAL_2_0
+	!e_cal_client_check_timezones_sync(
+#else
+        !e_cal_client_check_timezones(
+#endif
+                                      icomp,
                                       NULL,
                                       my_tzlookup,
+#ifdef HAVE_LIBECAL_2_0
+                                      (gpointer)m_calendar.get(),
+#else
                                       (const void *)m_calendar.get(),
+#endif
                                       NULL,
                                       gerror)
 #else
@@ -535,14 +560,28 @@ EvolutionCalendarSource::InsertItemResul
 
     // insert before adding/updating the event so that the new VTIMEZONE is
     // immediately available should anyone want it
+#ifdef HAVE_LIBECAL_2_0
+    for (ICalComponent *tcomp = i_cal_component_get_first_component(icomp, I_CAL_VTIMEZONE_COMPONENT);
+         tcomp;
+         g_object_unref (tcomp), tcomp = i_cal_component_get_next_component(icomp, I_CAL_VTIMEZONE_COMPONENT)) {
+        eptr<ICalTimezone> zone(i_cal_timezone_new(), "icaltimezone");
+        i_cal_timezone_set_component(zone, tcomp);
+#else
     for (icalcomponent *tcomp = icalcomponent_get_first_component(icomp, ICAL_VTIMEZONE_COMPONENT);
          tcomp;
          tcomp = icalcomponent_get_next_component(icomp, ICAL_VTIMEZONE_COMPONENT)) {
         eptr<icaltimezone> zone(icaltimezone_new(), "icaltimezone");
         icaltimezone_set_component(zone, tcomp);
+#endif
 
         GErrorCXX gerror;
-        const char *tzid = icaltimezone_get_tzid(zone);
+        const char *tzid;
+
+#ifdef HAVE_LIBECAL_2_0
+        tzid = i_cal_timezone_get_tzid(zone);
+#else
+        tzid = icaltimezone_get_tzid(zone);
+#endif
         if (!tzid || !tzid[0]) {
             // cannot add a VTIMEZONE without TZID
             SE_LOG_DEBUG(getDisplayName(), "skipping VTIMEZONE without TZID");
@@ -564,8 +603,14 @@ EvolutionCalendarSource::InsertItemResul
     // the component to update/add must be the
     // ICAL_VEVENT/VTODO_COMPONENT of the item,
     // e_cal_create/modify_object() fail otherwise
+#ifdef HAVE_LIBECAL_2_0
+    ICalComponent *subcomp = i_cal_component_get_first_component(icomp,
+                                                                 getCompType());
+#else
     icalcomponent *subcomp = icalcomponent_get_first_component(icomp,
                                                                getCompType());
+#endif
+
     if (!subcomp) {
         throwError(SE_HERE, "extracting event");
     }
@@ -573,12 +618,16 @@ EvolutionCalendarSource::InsertItemResul
     // Remove LAST-MODIFIED: the Evolution Exchange Connector does not
     // properly update this property if it is already present in the
     // incoming data.
+#ifdef HAVE_LIBECAL_2_0
+    e_cal_util_component_remove_property_by_kind(subcomp, I_CAL_LASTMODIFIED_PROPERTY, TRUE);
+#else
     icalproperty *modprop;
     while ((modprop = icalcomponent_get_first_property(subcomp, ICAL_LASTMODIFIED_PROPERTY)) != NULL) {
         icalcomponent_remove_property(subcomp, modprop);
         icalproperty_free(modprop);
         modprop = NULL;
     }
+#endif
 
     if (!update) {
         ItemID id = getItemID(subcomp);
@@ -628,8 +677,11 @@ EvolutionCalendarSource::InsertItemResul
                 // creating new objects works for normal events and detached occurrences alike
                 if (
 #ifdef USE_EDS_CLIENT
-                    e_cal_client_create_object_sync(m_calendar, subcomp, (gchar **)&uid, 
-                                                    NULL, gerror)
+                    e_cal_client_create_object_sync(m_calendar, subcomp,
+#ifdef HAVE_LIBECAL_2_0
+                                                    E_CAL_OPERATION_FLAG_NONE,
+#endif
+                                                    (gchar **)&uid, NULL, gerror)
 #else
                     e_cal_create_object(m_calendar, subcomp, (gchar **)&uid, gerror)
 #endif
@@ -650,12 +702,20 @@ EvolutionCalendarSource::InsertItemResul
 
                 // Recreate any children removed earlier: when we get here,
                 // the parent exists and we must update it.
+#ifdef HAVE_LIBECAL_2_0
+                BOOST_FOREACH(boost::shared_ptr< eptr<ICalComponent> > &icalcomp, children) {
+#else
                 BOOST_FOREACH(boost::shared_ptr< eptr<icalcomponent> > &icalcomp, children) {
+#endif
                     if (
 #ifdef USE_EDS_CLIENT
                         !e_cal_client_modify_object_sync(m_calendar, *icalcomp,
-                                                         CALOBJ_MOD_THIS, NULL,
-                                                         gerror)
+#ifdef HAVE_LIBECAL_2_0
+                                                         E_CAL_OBJ_MOD_THIS, E_CAL_OPERATION_FLAG_NONE,
+#else
+                                                         CALOBJ_MOD_THIS,
+#endif
+                                                         NULL, gerror)
 #else
                         !e_cal_modify_object(m_calendar, *icalcomp,
                                              CALOBJ_MOD_THIS,
@@ -679,13 +739,33 @@ EvolutionCalendarSource::InsertItemResul
         // RECURRENCE-ID
         if (update) {
             if (!id.m_uid.empty()) {
+#ifdef HAVE_LIBECAL_2_0
+                i_cal_component_set_uid(subcomp, id.m_uid.c_str());
+#else
                 icalcomponent_set_uid(subcomp, id.m_uid.c_str());
+#endif
             }
             if (!id.m_rid.empty()) {
                 // Reconstructing the RECURRENCE-ID is non-trivial,
                 // because our luid only contains the date-time, but
                 // not the time zone. Only do the work if the event
                 // really doesn't have a RECURRENCE-ID.
+#ifdef HAVE_LIBECAL_2_0
+                ICalTime *rid;
+                rid = i_cal_component_get_recurrenceid(subcomp);
+                if (!rid || i_cal_time_is_null_time(rid)) {
+                    // Preserve the original RECURRENCE-ID, including
+                    // timezone, no matter what the update contains
+                    // (might have wrong timezone or UTC).
+                    eptr<ICalComponent> orig(retrieveItem(id));
+                    ICalProperty *orig_rid = i_cal_component_get_first_property(orig, I_CAL_RECURRENCEID_PROPERTY);
+                    if (orig_rid) {
+                        i_cal_component_take_property(subcomp, i_cal_property_new_clone(orig_rid));
+                    }
+                    g_clear_object(&orig_rid);
+                }
+                g_clear_object(&rid);
+#else
                 struct icaltimetype rid;
                 rid = icalcomponent_get_recurrenceid(subcomp);
                 if (icaltime_is_null_time(rid)) {
@@ -698,6 +778,7 @@ EvolutionCalendarSource::InsertItemResul
                         icalcomponent_add_property(subcomp, icalproperty_new_clone(orig_rid));
                     }
                 }
+#endif
             }
         }
 
@@ -728,8 +809,11 @@ EvolutionCalendarSource::InsertItemResul
                 const char *uid = NULL;
                 if (
 #ifdef USE_EDS_CLIENT
-                    !e_cal_client_create_object_sync(m_calendar, subcomp, (char **)&uid, 
-                                                     NULL, gerror)
+                    !e_cal_client_create_object_sync(m_calendar, subcomp,
+#ifdef HAVE_LIBECAL_2_0
+                                                     E_CAL_OPERATION_FLAG_NONE,
+#endif
+                                                     (char **)&uid, NULL, gerror)
 #else
                     !e_cal_create_object(m_calendar, subcomp, (char **)&uid, gerror)
 #endif
@@ -742,12 +826,20 @@ EvolutionCalendarSource::InsertItemResul
 
                 // Recreate any children removed earlier: when we get here,
                 // the parent exists and we must update it.
+#ifdef HAVE_LIBECAL_2_0
+                BOOST_FOREACH(boost::shared_ptr< eptr<ICalComponent> > &icalcomp, children) {
+#else
                 BOOST_FOREACH(boost::shared_ptr< eptr<icalcomponent> > &icalcomp, children) {
+#endif
                     if (
 #ifdef USE_EDS_CLIENT
                         !e_cal_client_modify_object_sync(m_calendar, *icalcomp,
-                                                         CALOBJ_MOD_THIS, NULL,
-                                                         gerror)
+#ifdef HAVE_LIBECAL_2_0
+                                                         E_CAL_OBJ_MOD_THIS, E_CAL_OPERATION_FLAG_NONE,
+#else
+                                                         CALOBJ_MOD_THIS,
+#endif
+                                                         NULL, gerror)
 #else
                         !e_cal_modify_object(m_calendar, *icalcomp,
                                              CALOBJ_MOD_THIS,
@@ -762,8 +854,12 @@ EvolutionCalendarSource::InsertItemResul
                 if (
 #ifdef USE_EDS_CLIENT
                     !e_cal_client_modify_object_sync(m_calendar, subcomp,
-                                                     CALOBJ_MOD_ALL, NULL,
-                                                     gerror)
+#ifdef HAVE_LIBECAL_2_0
+                                                     E_CAL_OBJ_MOD_ALL, E_CAL_OPERATION_FLAG_NONE,
+#else
+                                                     CALOBJ_MOD_ALL,
+#endif
+                                                     NULL, gerror)
 #else
                     !e_cal_modify_object(m_calendar, subcomp,
                                          CALOBJ_MOD_ALL,
@@ -778,8 +874,12 @@ EvolutionCalendarSource::InsertItemResul
             if (
 #ifdef USE_EDS_CLIENT
                 !e_cal_client_modify_object_sync(m_calendar, subcomp,
-                                                 CALOBJ_MOD_THIS, NULL,
-                                                 gerror)
+#ifdef HAVE_LIBECAL_2_0
+                                                 E_CAL_OBJ_MOD_THIS, E_CAL_OPERATION_FLAG_NONE,
+#else
+                                                 CALOBJ_MOD_THIS,
+#endif
+                                                 NULL, gerror)
 #else
                 !e_cal_modify_object(m_calendar, subcomp,
                                      CALOBJ_MOD_THIS,
@@ -795,6 +895,8 @@ EvolutionCalendarSource::InsertItemResul
         modTime = getItemModTime(newid);
     }
 
+    g_clear_object (&subcomp);
+
     return InsertItemResult(newluid, modTime, state);
 }
 
@@ -806,12 +908,24 @@ EvolutionCalendarSource::ICalComps_t Evo
     if (it != m_allLUIDs.end()) {
         BOOST_FOREACH(const string &rid, it->second) {
             ItemID id(uid, rid);
+#ifdef HAVE_LIBECAL_2_0
+            ICalComponent *icomp = retrieveItem(id);
+#else
             icalcomponent *icomp = retrieveItem(id);
+#endif
             if (icomp) {
                 if (id.m_rid.empty() && returnOnlyChildren) {
+#ifdef HAVE_LIBECAL_2_0
+                    g_clear_object(&icomp);
+#else
                     icalcomponent_free(icomp);
+#endif
                 } else {
+#ifdef HAVE_LIBECAL_2_0
+                    events.push_back(ICalComps_t::value_type(new eptr<ICalComponent>(icomp)));
+#else
                     events.push_back(ICalComps_t::value_type(new eptr<icalcomponent>(icomp)));
+#endif
                 }
             }
         }
@@ -821,8 +935,12 @@ EvolutionCalendarSource::ICalComps_t Evo
     GErrorCXX gerror;
     if (!uid.empty() && // e_cal_client_remove_object_sync() in EDS 3.8 aborts the process for empty UID, other versions cannot succeed, so skip the call.
 #ifdef USE_EDS_CLIENT
-        !e_cal_client_remove_object_sync(m_calendar,
-                                         uid.c_str(), NULL, CALOBJ_MOD_ALL,
+        !e_cal_client_remove_object_sync(m_calendar, uid.c_str(), NULL,
+#ifdef HAVE_LIBECAL_2_0
+                                         E_CAL_OBJ_MOD_ALL, E_CAL_OPERATION_FLAG_NONE,
+#else
+                                         CALOBJ_MOD_ALL,
+#endif
                                          NULL, gerror)
 
 #else
@@ -862,14 +980,21 @@ void EvolutionCalendarSource::removeItem
 
         // recreate children
         bool first = true;
+#ifdef HAVE_LIBECAL_2_0
+        BOOST_FOREACH(boost::shared_ptr< eptr<ICalComponent> > &icalcomp, children) {
+#else
         BOOST_FOREACH(boost::shared_ptr< eptr<icalcomponent> > &icalcomp, children) {
+#endif
             if (first) {
                 char *uid;
 
                 if (
 #ifdef USE_EDS_CLIENT
-                    !e_cal_client_create_object_sync(m_calendar, *icalcomp, &uid, 
-                                                     NULL, gerror)
+                    !e_cal_client_create_object_sync(m_calendar, *icalcomp,
+#ifdef HAVE_LIBECAL_2_0
+                                                     E_CAL_OPERATION_FLAG_NONE,
+#endif
+                                                     &uid, NULL, gerror)
 #else
                     !e_cal_create_object(m_calendar, *icalcomp, &uid, gerror)
 #endif
@@ -884,8 +1009,12 @@ void EvolutionCalendarSource::removeItem
                 if (
 #ifdef USE_EDS_CLIENT
                     !e_cal_client_modify_object_sync(m_calendar, *icalcomp,
-                                                     CALOBJ_MOD_THIS, NULL,
-                                                     gerror)
+#ifdef HAVE_LIBECAL_2_0
+                                                     E_CAL_OBJ_MOD_THIS, E_CAL_OPERATION_FLAG_NONE,
+#else
+                                                     CALOBJ_MOD_THIS,
+#endif
+						     NULL, gerror)
 #else
                     !e_cal_modify_object(m_calendar, *icalcomp,
                                          CALOBJ_MOD_THIS,
@@ -900,14 +1029,23 @@ void EvolutionCalendarSource::removeItem
         // workaround for EDS 2.32 API semantic: succeeds even if
         // detached recurrence doesn't exist and adds EXDATE,
         // therefore we have to check for existence first
+#ifdef HAVE_LIBECAL_2_0
+        eptr<ICalComponent> item(retrieveItem(id));
+#else
         eptr<icalcomponent> item(retrieveItem(id));
+#endif
         gboolean success = !item ? false :
 #ifdef USE_EDS_CLIENT
             // TODO: is this necessary?
             e_cal_client_remove_object_sync(m_calendar,
                                             id.m_uid.c_str(),
                                             id.m_rid.c_str(),
+#ifdef HAVE_LIBECAL_2_0
+                                            E_CAL_OBJ_MOD_ONLY_THIS,
+					    E_CAL_OPERATION_FLAG_NONE,
+#else
                                             CALOBJ_MOD_ONLY_THIS,
+#endif
                                             NULL,
                                             gerror)
 #else
@@ -951,10 +1089,18 @@ void EvolutionCalendarSource::removeItem
     }
 }
 
+#ifdef HAVE_LIBECAL_2_0
+ICalComponent *EvolutionCalendarSource::retrieveItem(const ItemID &id)
+#else
 icalcomponent *EvolutionCalendarSource::retrieveItem(const ItemID &id)
+#endif
 {
     GErrorCXX gerror;
+#ifdef HAVE_LIBECAL_2_0
+    ICalComponent *comp = NULL;
+#else
     icalcomponent *comp = NULL;
+#endif
 
     if (
 #ifdef USE_EDS_CLIENT
@@ -981,7 +1127,11 @@ icalcomponent *EvolutionCalendarSource::
     if (!comp) {
         throwError(SE_HERE, string("retrieving item: ") + id.getLUID());
     }
+#ifdef HAVE_LIBECAL_2_0
+    eptr<ICalComponent> ptr(comp);
+#else
     eptr<icalcomponent> ptr(comp);
+#endif
 
     /*
      * EDS bug: if a parent doesn't exist while a child does, and we ask
@@ -989,8 +1139,15 @@ icalcomponent *EvolutionCalendarSource::
      * turn it into a "not found" error.
      */
     if (id.m_rid.empty()) {
+#ifdef HAVE_LIBECAL_2_0
+        ICalTime *rid = i_cal_component_get_recurrenceid(comp);
+        if (!rid || i_cal_time_is_null_time(rid)) {
+            g_clear_object(&rid);
+        } else {
+#else
         struct icaltimetype rid = icalcomponent_get_recurrenceid(comp);
         if (!icaltime_is_null_time(rid)) {
+#endif
             throwError(SE_HERE, string("retrieving item: got child instead of parent: ") + id.m_uid);
         }
     }
@@ -1000,7 +1157,11 @@ icalcomponent *EvolutionCalendarSource::
 
 string EvolutionCalendarSource::retrieveItemAsString(const ItemID &id)
 {
+#ifdef HAVE_LIBECAL_2_0
+    eptr<ICalComponent> comp(retrieveItem(id));
+#else
     eptr<icalcomponent> comp(retrieveItem(id));
+#endif
     eptr<char> icalstr;
 
 #ifdef USE_EDS_CLIENT
@@ -1015,6 +1176,15 @@ string EvolutionCalendarSource::retrieve
         // definition. Evolution GUI ignores the TZID and interprets
         // the times as local time. Do the same when exporting the
         // event by removing the bogus TZID.
+#ifdef HAVE_LIBECAL_2_0
+        ICalProperty *prop;
+	for (prop = i_cal_component_get_first_property (comp, I_CAL_ANY_PROPERTY);
+             prop;
+             g_object_unref(prop), prop = i_cal_component_get_next_property (comp, I_CAL_ANY_PROPERTY)) {
+            // removes only the *first* TZID - but there shouldn't be more than one
+            i_cal_property_remove_parameter_by_kind(prop, I_CAL_TZID_PARAMETER);
+        }
+#else
         icalproperty *prop = icalcomponent_get_first_property (comp,
                                                                ICAL_ANY_PROPERTY);
 
@@ -1024,6 +1194,7 @@ string EvolutionCalendarSource::retrieve
             prop = icalcomponent_get_next_property (comp,
                                                     ICAL_ANY_PROPERTY);
         }
+#endif
 
         // now try again
 #ifdef USE_EDS_CLIENT
@@ -1075,16 +1246,28 @@ string EvolutionCalendarSource::retrieve
 std::string EvolutionCalendarSource::getDescription(const string &luid)
 {
     try {
+#ifdef HAVE_LIBECAL_2_0
+        eptr<ICalComponent> comp(retrieveItem(ItemID(luid)));
+#else
         eptr<icalcomponent> comp(retrieveItem(ItemID(luid)));
+#endif
         std::string descr;
 
+#ifdef HAVE_LIBECAL_2_0
+        const char *summary = i_cal_component_get_summary(comp);
+#else
         const char *summary = icalcomponent_get_summary(comp);
+#endif
         if (summary && summary[0]) {
             descr += summary;
         }
         
         if (m_type == EVOLUTION_CAL_SOURCE_TYPE_EVENTS) {
+#ifdef HAVE_LIBECAL_2_0
+            const char *location = i_cal_component_get_location(comp);
+#else
             const char *location = icalcomponent_get_location(comp);
+#endif
             if (location && location[0]) {
                 if (!descr.empty()) {
                     descr += ", ";
@@ -1096,9 +1279,17 @@ std::string EvolutionCalendarSource::get
         if (m_type == EVOLUTION_CAL_SOURCE_TYPE_MEMOS &&
             descr.empty()) {
             // fallback to first line of body text
+#ifdef HAVE_LIBECAL_2_0
+            ICalProperty *desc = i_cal_component_get_first_property(comp, I_CAL_DESCRIPTION_PROPERTY);
+#else
             icalproperty *desc = icalcomponent_get_first_property(comp, ICAL_DESCRIPTION_PROPERTY);
+#endif
             if (desc) {
+#ifdef HAVE_LIBECAL_2_0
+                const char *text = i_cal_property_get_description(desc);
+#else
                 const char *text = icalproperty_get_description(desc);
+#endif
                 if (text) {
                     const char *eol = strchr(text, '\n');
                     if (eol) {
@@ -1107,6 +1298,9 @@ std::string EvolutionCalendarSource::get
                         descr = text;
                     }
                 }
+#ifdef HAVE_LIBECAL_2_0
+                g_object_unref(desc);
+#endif
             }
         }
 
@@ -1144,7 +1338,11 @@ EvolutionCalendarSource::ItemID::ItemID(
 
 EvolutionCalendarSource::ItemID EvolutionCalendarSource::getItemID(ECalComponent *ecomp)
 {
+#ifdef HAVE_LIBECAL_2_0
+    ICalComponent *icomp = e_cal_component_get_icalcomponent(ecomp);
+#else
     icalcomponent *icomp = e_cal_component_get_icalcomponent(ecomp);
+#endif
     if (!icomp) {
         SE_THROW("internal error in getItemID(): ECalComponent without icalcomp");
     }
@@ -1162,15 +1360,38 @@ EvolutionCalendarSource::ItemID Evolutio
                   icalTime2Str(rid));
 }
 
+#ifdef HAVE_LIBECAL_2_0
+EvolutionCalendarSource::ItemID EvolutionCalendarSource::getItemID(ICalComponent *icomp)
+{
+    icalcomponent *native_icomp;
+
+    native_icomp = static_cast<icalcomponent *>(i_cal_object_get_native(I_CAL_OBJECT (icomp)));
+    if (!native_icomp) {
+        SE_THROW("internal error in getItemID(): ICalComponent without native icalcomp");
+    }
+    return getItemID(native_icomp);
+}
+#endif
+
 string EvolutionCalendarSource::getItemModTime(ECalComponent *ecomp)
 {
+#ifdef HAVE_LIBECAL_2_0
+    ICalTime *modTime;
+    modTime = e_cal_component_get_last_modified(ecomp);
+    eptr<ICalTime, ICalTime, UnrefFree<ICalTime> > modTimePtr(modTime);
+#else
     struct icaltimetype *modTime;
     e_cal_component_get_last_modified(ecomp, &modTime);
     eptr<struct icaltimetype, struct icaltimetype, UnrefFree<struct icaltimetype> > modTimePtr(modTime);
+#endif
     if (!modTimePtr) {
         return "";
     } else {
+#ifdef HAVE_LIBECAL_2_0
+        return icalTime2Str(modTimePtr.get());
+#else
         return icalTime2Str(*modTimePtr.get());
+#endif
     }
 }
 
@@ -1179,7 +1400,11 @@ string EvolutionCalendarSource::getItemM
     if (!needChanges()) {
         return "";
     }
+#ifdef HAVE_LIBECAL_2_0
+    eptr<ICalComponent> icomp(retrieveItem(id));
+#else
     eptr<icalcomponent> icomp(retrieveItem(id));
+#endif
     return getItemModTime(icomp);
 }
 
@@ -1194,6 +1419,15 @@ string EvolutionCalendarSource::getItemM
     return icalTime2Str(modTime);
 }
 
+#ifdef HAVE_LIBECAL_2_0
+string EvolutionCalendarSource::getItemModTime(ICalComponent *icomp)
+{
+    icalcomponent *native_icomp = static_cast<icalcomponent *>(i_cal_object_get_native(I_CAL_OBJECT (icomp)));
+
+    return getItemModTime(native_icomp);
+}
+#endif
+
 string EvolutionCalendarSource::icalTime2Str(const icaltimetype &tt)
 {
     static const struct icaltimetype null = { 0 };
@@ -1208,6 +1442,21 @@ string EvolutionCalendarSource::icalTime
     }
 }
 
+#ifdef HAVE_LIBECAL_2_0
+string EvolutionCalendarSource::icalTime2Str(const ICalTime *tt)
+{
+    if (tt || !i_cal_time_is_valid_time (tt) || i_cal_time_is_null_time (tt)) {
+        return "";
+    } else {
+        eptr<char> timestr(i_cal_time_as_ical_string_r(tt));
+        if (!timestr) {
+            SE_THROW("cannot convert to time string");
+        }
+        return timestr.get();
+    }
+}
+#endif
+
 SE_END_CXX
 
 #endif /* ENABLE_ECAL */
diff -up syncevolution-1.5.3/src/backends/evolution/EvolutionCalendarSource.h.orig syncevolution-1.5.3/src/backends/evolution/EvolutionCalendarSource.h
--- syncevolution-1.5.3/src/backends/evolution/EvolutionCalendarSource.h.orig	2019-04-24 14:30:04.554810971 +0200
+++ syncevolution-1.5.3/src/backends/evolution/EvolutionCalendarSource.h	2019-04-24 17:16:19.485673035 +0200
@@ -134,6 +134,9 @@ class EvolutionCalendarSource : public E
      */
     static ItemID getItemID(ECalComponent *ecomp);
     static ItemID getItemID(icalcomponent *icomp);
+    #ifdef HAVE_LIBECAL_2_0
+    static ItemID getItemID(ICalComponent *icomp);
+    #endif
 
     /**
      * Extract modification string from calendar item.
@@ -141,6 +144,9 @@ class EvolutionCalendarSource : public E
      */
     static string getItemModTime(ECalComponent *ecomp);
     static string getItemModTime(icalcomponent *icomp);
+    #ifdef HAVE_LIBECAL_2_0
+    static string getItemModTime(ICalComponent *icomp);
+    #endif
 
   protected:
     //
@@ -196,18 +202,30 @@ class EvolutionCalendarSource : public E
      *
      * caller has to free result
      */
+#ifdef HAVE_LIBECAL_2_0
+    ICalComponent *retrieveItem(const ItemID &id);
+#else
     icalcomponent *retrieveItem(const ItemID &id);
+#endif
 
     /** retrieve the item with the given luid as VCALENDAR string - may throw exception */
     string retrieveItemAsString(const ItemID &id);
 
 
     /** returns the type which the ical library uses for our components */
+#ifdef HAVE_LIBECAL_2_0
+    ICalComponentKind getCompType() {
+        return m_type == EVOLUTION_CAL_SOURCE_TYPE_EVENTS ? I_CAL_VEVENT_COMPONENT :
+            m_type == EVOLUTION_CAL_SOURCE_TYPE_MEMOS ? I_CAL_VJOURNAL_COMPONENT :
+            I_CAL_VTODO_COMPONENT;
+    }
+#else
     icalcomponent_kind getCompType() {
         return m_type == EVOLUTION_CAL_SOURCE_TYPE_EVENTS ? ICAL_VEVENT_COMPONENT :
             m_type == EVOLUTION_CAL_SOURCE_TYPE_MEMOS ? ICAL_VJOURNAL_COMPONENT :
             ICAL_VTODO_COMPONENT;
     }
+#endif
 
 #ifndef USE_EDS_CLIENT
     /** ECalAuthFunc which calls the authenticate() methods */
@@ -239,6 +257,9 @@ class EvolutionCalendarSource : public E
      * Convert to string in canonical representation.
      */
     static string icalTime2Str(const struct icaltimetype &tt);
+#ifdef HAVE_LIBECAL_2_0
+    static string icalTime2Str(const ICalTime *tt);
+#endif
 
     /**
      * A set of all existing objects. Initialized in the last call to
@@ -263,7 +284,11 @@ class EvolutionCalendarSource : public E
      * will destroy the smart pointer, which then calls
      * icalcomponent_free().
      */
+#ifdef HAVE_LIBECAL_2_0
+    typedef list< boost::shared_ptr< eptr<ICalComponent> > > ICalComps_t;
+#else
     typedef list< boost::shared_ptr< eptr<icalcomponent> > > ICalComps_t;
+#endif
 
     /**
      * Utility function which extracts all icalcomponents with
diff -up syncevolution-1.5.3/src/backends/evolution/EvolutionContactSource.cpp.orig syncevolution-1.5.3/src/backends/evolution/EvolutionContactSource.cpp
--- syncevolution-1.5.3/src/backends/evolution/EvolutionContactSource.cpp.orig	2019-04-24 16:47:55.401696599 +0200
+++ syncevolution-1.5.3/src/backends/evolution/EvolutionContactSource.cpp	2019-04-24 16:52:25.773692860 +0200
@@ -988,7 +988,11 @@ void EvolutionContactSource::flushItemCh
                                             this,
                                             batched,
                                             _1, _2, _3),
-                                m_addressbook, contacts, NULL);
+                                m_addressbook, contacts,
+#ifdef HAVE_E_BOOK_OPERATION_FLAGS
+                                E_BOOK_OPERATION_FLAG_NONE,
+#endif
+                                NULL);
     }
     if (!m_batchedUpdate.empty()) {
         SE_LOG_DEBUG(getDisplayName(), "batch update of %d contacts starting", (int)m_batchedUpdate.size());
@@ -1004,7 +1008,11 @@ void EvolutionContactSource::flushItemCh
                                             this,
                                             batched,
                                             _1, _2),
-                                m_addressbook, contacts, NULL);
+                                m_addressbook, contacts,
+#ifdef HAVE_E_BOOK_OPERATION_FLAGS
+                                E_BOOK_OPERATION_FLAG_NONE,
+#endif
+                                NULL);
     }
 }
 
@@ -1037,14 +1045,22 @@ EvolutionContactSource::insertItem(const
         case SYNCHRONOUS:
             if (uid.empty()) {
                 gchar* newuid;
-                if (!e_book_client_add_contact_sync(m_addressbook, contact, &newuid, NULL, gerror)) {
+                if (!e_book_client_add_contact_sync(m_addressbook, contact,
+#ifdef HAVE_E_BOOK_OPERATION_FLAGS
+                                                    E_BOOK_OPERATION_FLAG_NONE,
+#endif
+                                                    &newuid, NULL, gerror)) {
                     throwError(SE_HERE, "add new contact", gerror);
                 }
                 PlainGStr newuidPtr(newuid);
                 string newrev = getRevision(newuid);
                 return InsertItemResult(newuid, newrev, ITEM_OKAY);
             } else {
-                if (!e_book_client_modify_contact_sync(m_addressbook, contact, NULL, gerror)) {
+                if (!e_book_client_modify_contact_sync(m_addressbook, contact,
+#ifdef HAVE_E_BOOK_OPERATION_FLAGS
+                                                       E_BOOK_OPERATION_FLAG_NONE,
+#endif
+                                                       NULL, gerror)) {
                     throwError(SE_HERE, "updating contact "+ uid, gerror);
                 }
                 string newrev = getRevision(uid);
@@ -1102,7 +1118,11 @@ void EvolutionContactSource::removeItem(
     if (
 #ifdef USE_EDS_CLIENT
         (invalidateCachedContact(uid),
-         !e_book_client_remove_contact_by_uid_sync(m_addressbook, uid.c_str(), NULL, gerror))
+         !e_book_client_remove_contact_by_uid_sync(m_addressbook, uid.c_str(),
+#ifdef HAVE_E_BOOK_OPERATION_FLAGS
+                                                   E_BOOK_OPERATION_FLAG_NONE,
+#endif
+                                                   NULL, gerror))
 #else
         !e_book_remove_contact(m_addressbook, uid.c_str(), gerror)
 #endif
diff -up syncevolution-1.5.3/src/syncevo/SmartPtr.h.orig syncevolution-1.5.3/src/syncevo/SmartPtr.h
--- syncevolution-1.5.3/src/syncevo/SmartPtr.h.orig	2019-04-24 14:38:51.657803682 +0200
+++ syncevolution-1.5.3/src/syncevo/SmartPtr.h	2019-04-24 14:39:45.101802943 +0200
@@ -76,6 +76,12 @@ class Unref {
     static void unref(icalproperty *pointer) { icalproperty_free(pointer); }
     static void unref(icalparameter *pointer) { icalparameter_free(pointer); }
     static void unref(icaltimezone *pointer) { icaltimezone_free(pointer, 1); }
+#ifdef HAVE_LIBECAL_2_0
+    static void unref(ICalComponent *pointer) { g_clear_object(&pointer); }
+    static void unref(ICalProperty *pointer) { g_clear_object(&pointer); }
+    static void unref(ICalParameter *pointer) { g_clear_object(&pointer); }
+    static void unref(ICalTimezone *pointer) { g_clear_object(&pointer); }
+#endif
 #endif // ENABLE_ICAL
 };
 
_______________________________________________
SyncEvolution mailing list
SyncEvolution@syncevolution.org
https://lists.syncevolution.org/mailman/listinfo/syncevolution

Reply via email to