Blob Blame History Raw
diff -up syncevolution-1.5.3/src/backends/evolution/configure-sub.in.eds-libecal-2.0 syncevolution-1.5.3/src/backends/evolution/configure-sub.in
--- syncevolution-1.5.3/src/backends/evolution/configure-sub.in.eds-libecal-2.0	2014-04-25 09:55:47.000000000 +0200
+++ syncevolution-1.5.3/src/backends/evolution/configure-sub.in	2019-05-21 13:54:38.676855604 +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.eds-libecal-2.0 syncevolution-1.5.3/src/backends/evolution/e-cal-check-timezones.c
--- syncevolution-1.5.3/src/backends/evolution/e-cal-check-timezones.c.eds-libecal-2.0	2014-04-25 09:55:47.000000000 +0200
+++ syncevolution-1.5.3/src/backends/evolution/e-cal-check-timezones.c	2019-05-21 13:54:38.676855604 +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.eds-libecal-2.0 syncevolution-1.5.3/src/backends/evolution/EvolutionCalendarSource.cpp
--- syncevolution-1.5.3/src/backends/evolution/EvolutionCalendarSource.cpp.eds-libecal-2.0	2014-10-10 11:43:09.000000000 +0200
+++ syncevolution-1.5.3/src/backends/evolution/EvolutionCalendarSource.cpp	2019-05-21 13:54:38.678855604 +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_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(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.eds-libecal-2.0 syncevolution-1.5.3/src/backends/evolution/EvolutionCalendarSource.h
--- syncevolution-1.5.3/src/backends/evolution/EvolutionCalendarSource.h.eds-libecal-2.0	2014-07-21 12:20:53.000000000 +0200
+++ syncevolution-1.5.3/src/backends/evolution/EvolutionCalendarSource.h	2019-05-21 13:54:38.676855604 +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.eds-libecal-2.0 syncevolution-1.5.3/src/backends/evolution/EvolutionContactSource.cpp
--- syncevolution-1.5.3/src/backends/evolution/EvolutionContactSource.cpp.eds-libecal-2.0	2016-09-26 13:20:05.000000000 +0200
+++ syncevolution-1.5.3/src/backends/evolution/EvolutionContactSource.cpp	2019-05-21 13:54:38.676855604 +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.eds-libecal-2.0 syncevolution-1.5.3/src/syncevo/SmartPtr.h
--- syncevolution-1.5.3/src/syncevo/SmartPtr.h.eds-libecal-2.0	2014-04-25 09:55:47.000000000 +0200
+++ syncevolution-1.5.3/src/syncevo/SmartPtr.h	2019-05-21 13:54:38.677855604 +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
 };