EDS: EDS 3.33.2, libecal 2.0 support
Developed originally by Milan Crha for Fedora, copied and updated by Patrick Ohly. From Milan: 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 Signed-off-by: Patrick Ohly <patrick.ohly@intel.com>
This commit is contained in:
parent
a3bb1fba4a
commit
edb458dfcb
6 changed files with 356 additions and 27 deletions
|
@ -208,7 +208,10 @@ void EvolutionCalendarSource::open()
|
||||||
// a reasonably cheap operation (so no harm there).
|
// a reasonably cheap operation (so no harm there).
|
||||||
for (int retries = 0; retries < 2; retries++) {
|
for (int retries = 0; retries < 2; retries++) {
|
||||||
auto create = [type=sourceType()] (ESource *source, GError **gerror) {
|
auto create = [type=sourceType()] (ESource *source, GError **gerror) {
|
||||||
return E_CLIENT(e_cal_client_new(source, type, gerror));
|
return E_CLIENT(e_cal_client_connect_sync(source, type,
|
||||||
|
-1, // timeout in seconds
|
||||||
|
nullptr, // cancellable
|
||||||
|
gerror));
|
||||||
};
|
};
|
||||||
m_calendar.reset(E_CAL_CLIENT(openESource(sourceExtension(),
|
m_calendar.reset(E_CAL_CLIENT(openESource(sourceExtension(),
|
||||||
m_type == EVOLUTION_CAL_SOURCE_TYPE_EVENTS ? e_source_registry_ref_builtin_calendar :
|
m_type == EVOLUTION_CAL_SOURCE_TYPE_EVENTS ? e_source_registry_ref_builtin_calendar :
|
||||||
|
@ -372,7 +375,11 @@ void EvolutionCalendarSource::listAllItems(RevisionMap_t &revisions)
|
||||||
const GSList *l;
|
const GSList *l;
|
||||||
|
|
||||||
for (l = objects; l; l = l->next) {
|
for (l = objects; l; l = l->next) {
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
ICalComponent *icomp = (ICalComponent*)l->data;
|
||||||
|
#else
|
||||||
icalcomponent *icomp = (icalcomponent*)l->data;
|
icalcomponent *icomp = (icalcomponent*)l->data;
|
||||||
|
#endif
|
||||||
EvolutionCalendarSource::ItemID id = EvolutionCalendarSource::getItemID(icomp);
|
EvolutionCalendarSource::ItemID id = EvolutionCalendarSource::getItemID(icomp);
|
||||||
string luid = id.getLUID();
|
string luid = id.getLUID();
|
||||||
string modTime = EvolutionCalendarSource::getItemModTime(icomp);
|
string modTime = EvolutionCalendarSource::getItemModTime(icomp);
|
||||||
|
@ -426,13 +433,25 @@ void EvolutionCalendarSource::readItem(const string &luid, std::string &item, bo
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_EDS_CLIENT
|
#ifdef USE_EDS_CLIENT
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
ICalTimezone *
|
||||||
|
#else /* HAVE_LIBECAL_2_0 */
|
||||||
icaltimezone *
|
icaltimezone *
|
||||||
|
#endif /* HAVE_LIBECAL_2_0 */
|
||||||
my_tzlookup(const gchar *tzid,
|
my_tzlookup(const gchar *tzid,
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
gpointer ecalclient,
|
||||||
|
#else
|
||||||
gconstpointer ecalclient,
|
gconstpointer ecalclient,
|
||||||
|
#endif
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
ICalTimezone *zone = nullptr;
|
||||||
|
#else
|
||||||
icaltimezone *zone = nullptr;
|
icaltimezone *zone = nullptr;
|
||||||
|
#endif
|
||||||
GError *local_error = nullptr;
|
GError *local_error = nullptr;
|
||||||
|
|
||||||
if (e_cal_client_get_timezone_sync((ECalClient *)ecalclient, tzid, &zone, cancellable, &local_error)) {
|
if (e_cal_client_get_timezone_sync((ECalClient *)ecalclient, tzid, &zone, cancellable, &local_error)) {
|
||||||
|
@ -490,7 +509,11 @@ EvolutionCalendarSource::InsertItemResult EvolutionCalendarSource::insertItem(co
|
||||||
SE_LOG_DEBUG(getDisplayName(), "after replacing , with \\, in CATEGORIES:\n%s", data.c_str());
|
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()));
|
eptr<icalcomponent> icomp(icalcomponent_new_from_string((char *)data.c_str()));
|
||||||
|
#endif
|
||||||
|
|
||||||
if( !icomp ) {
|
if( !icomp ) {
|
||||||
throwError(SE_HERE, string("failure parsing ical") + data);
|
throwError(SE_HERE, string("failure parsing ical") + data);
|
||||||
|
@ -501,10 +524,19 @@ EvolutionCalendarSource::InsertItemResult EvolutionCalendarSource::insertItem(co
|
||||||
// fix up TZIDs
|
// fix up TZIDs
|
||||||
if (
|
if (
|
||||||
#ifdef USE_EDS_CLIENT
|
#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,
|
||||||
nullptr,
|
nullptr,
|
||||||
my_tzlookup,
|
my_tzlookup,
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
(gpointer)m_calendar.get(),
|
||||||
|
#else
|
||||||
(const void *)m_calendar.get(),
|
(const void *)m_calendar.get(),
|
||||||
|
#endif
|
||||||
nullptr,
|
nullptr,
|
||||||
gerror)
|
gerror)
|
||||||
#else
|
#else
|
||||||
|
@ -521,14 +553,28 @@ EvolutionCalendarSource::InsertItemResult EvolutionCalendarSource::insertItem(co
|
||||||
|
|
||||||
// insert before adding/updating the event so that the new VTIMEZONE is
|
// insert before adding/updating the event so that the new VTIMEZONE is
|
||||||
// immediately available should anyone want it
|
// 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);
|
for (icalcomponent *tcomp = icalcomponent_get_first_component(icomp, ICAL_VTIMEZONE_COMPONENT);
|
||||||
tcomp;
|
tcomp;
|
||||||
tcomp = icalcomponent_get_next_component(icomp, ICAL_VTIMEZONE_COMPONENT)) {
|
tcomp = icalcomponent_get_next_component(icomp, ICAL_VTIMEZONE_COMPONENT)) {
|
||||||
eptr<icaltimezone> zone(icaltimezone_new(), "icaltimezone");
|
eptr<icaltimezone> zone(icaltimezone_new(), "icaltimezone");
|
||||||
icaltimezone_set_component(zone, tcomp);
|
icaltimezone_set_component(zone, tcomp);
|
||||||
|
#endif
|
||||||
|
|
||||||
GErrorCXX gerror;
|
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]) {
|
if (!tzid || !tzid[0]) {
|
||||||
// cannot add a VTIMEZONE without TZID
|
// cannot add a VTIMEZONE without TZID
|
||||||
SE_LOG_DEBUG(getDisplayName(), "skipping VTIMEZONE without TZID");
|
SE_LOG_DEBUG(getDisplayName(), "skipping VTIMEZONE without TZID");
|
||||||
|
@ -550,8 +596,14 @@ EvolutionCalendarSource::InsertItemResult EvolutionCalendarSource::insertItem(co
|
||||||
// the component to update/add must be the
|
// the component to update/add must be the
|
||||||
// ICAL_VEVENT/VTODO_COMPONENT of the item,
|
// ICAL_VEVENT/VTODO_COMPONENT of the item,
|
||||||
// e_cal_create/modify_object() fail otherwise
|
// 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,
|
icalcomponent *subcomp = icalcomponent_get_first_component(icomp,
|
||||||
getCompType());
|
getCompType());
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!subcomp) {
|
if (!subcomp) {
|
||||||
throwError(SE_HERE, "extracting event");
|
throwError(SE_HERE, "extracting event");
|
||||||
}
|
}
|
||||||
|
@ -559,12 +611,16 @@ EvolutionCalendarSource::InsertItemResult EvolutionCalendarSource::insertItem(co
|
||||||
// Remove LAST-MODIFIED: the Evolution Exchange Connector does not
|
// Remove LAST-MODIFIED: the Evolution Exchange Connector does not
|
||||||
// properly update this property if it is already present in the
|
// properly update this property if it is already present in the
|
||||||
// incoming data.
|
// incoming data.
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
e_cal_util_component_remove_property_by_kind(subcomp, I_CAL_LASTMODIFIED_PROPERTY, TRUE);
|
||||||
|
#else
|
||||||
icalproperty *modprop;
|
icalproperty *modprop;
|
||||||
while ((modprop = icalcomponent_get_first_property(subcomp, ICAL_LASTMODIFIED_PROPERTY)) != nullptr) {
|
while ((modprop = icalcomponent_get_first_property(subcomp, ICAL_LASTMODIFIED_PROPERTY)) != nullptr) {
|
||||||
icalcomponent_remove_property(subcomp, modprop);
|
icalcomponent_remove_property(subcomp, modprop);
|
||||||
icalproperty_free(modprop);
|
icalproperty_free(modprop);
|
||||||
modprop = nullptr;
|
modprop = nullptr;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!update) {
|
if (!update) {
|
||||||
ItemID id = getItemID(subcomp);
|
ItemID id = getItemID(subcomp);
|
||||||
|
@ -614,8 +670,11 @@ EvolutionCalendarSource::InsertItemResult EvolutionCalendarSource::insertItem(co
|
||||||
// creating new objects works for normal events and detached occurrences alike
|
// creating new objects works for normal events and detached occurrences alike
|
||||||
if (
|
if (
|
||||||
#ifdef USE_EDS_CLIENT
|
#ifdef USE_EDS_CLIENT
|
||||||
e_cal_client_create_object_sync(m_calendar, subcomp, (gchar **)&uid,
|
e_cal_client_create_object_sync(m_calendar, subcomp,
|
||||||
nullptr, gerror)
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
E_CAL_OPERATION_FLAG_NONE,
|
||||||
|
#endif
|
||||||
|
(gchar **)&uid, nullptr, gerror)
|
||||||
#else
|
#else
|
||||||
e_cal_create_object(m_calendar, subcomp, (gchar **)&uid, gerror)
|
e_cal_create_object(m_calendar, subcomp, (gchar **)&uid, gerror)
|
||||||
#endif
|
#endif
|
||||||
|
@ -636,12 +695,20 @@ EvolutionCalendarSource::InsertItemResult EvolutionCalendarSource::insertItem(co
|
||||||
|
|
||||||
// Recreate any children removed earlier: when we get here,
|
// Recreate any children removed earlier: when we get here,
|
||||||
// the parent exists and we must update it.
|
// the parent exists and we must update it.
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
for (std::shared_ptr< eptr<ICalComponent> > &icalcomp: children) {
|
||||||
|
#else
|
||||||
for (std::shared_ptr< eptr<icalcomponent> > &icalcomp: children) {
|
for (std::shared_ptr< eptr<icalcomponent> > &icalcomp: children) {
|
||||||
|
#endif
|
||||||
if (
|
if (
|
||||||
#ifdef USE_EDS_CLIENT
|
#ifdef USE_EDS_CLIENT
|
||||||
!e_cal_client_modify_object_sync(m_calendar, *icalcomp,
|
!e_cal_client_modify_object_sync(m_calendar, *icalcomp,
|
||||||
CALOBJ_MOD_THIS, nullptr,
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
gerror)
|
E_CAL_OBJ_MOD_THIS, E_CAL_OPERATION_FLAG_NONE,
|
||||||
|
#else
|
||||||
|
CALOBJ_MOD_THIS,
|
||||||
|
#endif
|
||||||
|
nullptr, gerror)
|
||||||
#else
|
#else
|
||||||
!e_cal_modify_object(m_calendar, *icalcomp,
|
!e_cal_modify_object(m_calendar, *icalcomp,
|
||||||
CALOBJ_MOD_THIS,
|
CALOBJ_MOD_THIS,
|
||||||
|
@ -665,13 +732,33 @@ EvolutionCalendarSource::InsertItemResult EvolutionCalendarSource::insertItem(co
|
||||||
// RECURRENCE-ID
|
// RECURRENCE-ID
|
||||||
if (update) {
|
if (update) {
|
||||||
if (!id.m_uid.empty()) {
|
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());
|
icalcomponent_set_uid(subcomp, id.m_uid.c_str());
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
if (!id.m_rid.empty()) {
|
if (!id.m_rid.empty()) {
|
||||||
// Reconstructing the RECURRENCE-ID is non-trivial,
|
// Reconstructing the RECURRENCE-ID is non-trivial,
|
||||||
// because our luid only contains the date-time, but
|
// because our luid only contains the date-time, but
|
||||||
// not the time zone. Only do the work if the event
|
// not the time zone. Only do the work if the event
|
||||||
// really doesn't have a RECURRENCE-ID.
|
// 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;
|
struct icaltimetype rid;
|
||||||
rid = icalcomponent_get_recurrenceid(subcomp);
|
rid = icalcomponent_get_recurrenceid(subcomp);
|
||||||
if (icaltime_is_null_time(rid)) {
|
if (icaltime_is_null_time(rid)) {
|
||||||
|
@ -684,6 +771,7 @@ EvolutionCalendarSource::InsertItemResult EvolutionCalendarSource::insertItem(co
|
||||||
icalcomponent_add_property(subcomp, icalproperty_new_clone(orig_rid));
|
icalcomponent_add_property(subcomp, icalproperty_new_clone(orig_rid));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -714,8 +802,11 @@ EvolutionCalendarSource::InsertItemResult EvolutionCalendarSource::insertItem(co
|
||||||
const char *uid = nullptr;
|
const char *uid = nullptr;
|
||||||
if (
|
if (
|
||||||
#ifdef USE_EDS_CLIENT
|
#ifdef USE_EDS_CLIENT
|
||||||
!e_cal_client_create_object_sync(m_calendar, subcomp, (char **)&uid,
|
!e_cal_client_create_object_sync(m_calendar, subcomp,
|
||||||
nullptr, gerror)
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
E_CAL_OPERATION_FLAG_NONE,
|
||||||
|
#endif
|
||||||
|
(char **)&uid, nullptr, gerror)
|
||||||
#else
|
#else
|
||||||
!e_cal_create_object(m_calendar, subcomp, (char **)&uid, gerror)
|
!e_cal_create_object(m_calendar, subcomp, (char **)&uid, gerror)
|
||||||
#endif
|
#endif
|
||||||
|
@ -728,12 +819,20 @@ EvolutionCalendarSource::InsertItemResult EvolutionCalendarSource::insertItem(co
|
||||||
|
|
||||||
// Recreate any children removed earlier: when we get here,
|
// Recreate any children removed earlier: when we get here,
|
||||||
// the parent exists and we must update it.
|
// the parent exists and we must update it.
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
for (std::shared_ptr< eptr<ICalComponent> > &icalcomp: children) {
|
||||||
|
#else
|
||||||
for (std::shared_ptr< eptr<icalcomponent> > &icalcomp: children) {
|
for (std::shared_ptr< eptr<icalcomponent> > &icalcomp: children) {
|
||||||
|
#endif
|
||||||
if (
|
if (
|
||||||
#ifdef USE_EDS_CLIENT
|
#ifdef USE_EDS_CLIENT
|
||||||
!e_cal_client_modify_object_sync(m_calendar, *icalcomp,
|
!e_cal_client_modify_object_sync(m_calendar, *icalcomp,
|
||||||
CALOBJ_MOD_THIS, nullptr,
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
gerror)
|
E_CAL_OBJ_MOD_THIS, E_CAL_OPERATION_FLAG_NONE,
|
||||||
|
#else
|
||||||
|
CALOBJ_MOD_THIS,
|
||||||
|
#endif
|
||||||
|
nullptr, gerror)
|
||||||
#else
|
#else
|
||||||
!e_cal_modify_object(m_calendar, *icalcomp,
|
!e_cal_modify_object(m_calendar, *icalcomp,
|
||||||
CALOBJ_MOD_THIS,
|
CALOBJ_MOD_THIS,
|
||||||
|
@ -748,8 +847,12 @@ EvolutionCalendarSource::InsertItemResult EvolutionCalendarSource::insertItem(co
|
||||||
if (
|
if (
|
||||||
#ifdef USE_EDS_CLIENT
|
#ifdef USE_EDS_CLIENT
|
||||||
!e_cal_client_modify_object_sync(m_calendar, subcomp,
|
!e_cal_client_modify_object_sync(m_calendar, subcomp,
|
||||||
CALOBJ_MOD_ALL, nullptr,
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
gerror)
|
E_CAL_OBJ_MOD_ALL, E_CAL_OPERATION_FLAG_NONE,
|
||||||
|
#else
|
||||||
|
CALOBJ_MOD_ALL,
|
||||||
|
#endif
|
||||||
|
nullptr, gerror)
|
||||||
#else
|
#else
|
||||||
!e_cal_modify_object(m_calendar, subcomp,
|
!e_cal_modify_object(m_calendar, subcomp,
|
||||||
CALOBJ_MOD_ALL,
|
CALOBJ_MOD_ALL,
|
||||||
|
@ -764,8 +867,12 @@ EvolutionCalendarSource::InsertItemResult EvolutionCalendarSource::insertItem(co
|
||||||
if (
|
if (
|
||||||
#ifdef USE_EDS_CLIENT
|
#ifdef USE_EDS_CLIENT
|
||||||
!e_cal_client_modify_object_sync(m_calendar, subcomp,
|
!e_cal_client_modify_object_sync(m_calendar, subcomp,
|
||||||
CALOBJ_MOD_THIS, nullptr,
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
gerror)
|
E_CAL_OBJ_MOD_THIS, E_CAL_OPERATION_FLAG_NONE,
|
||||||
|
#else
|
||||||
|
CALOBJ_MOD_THIS,
|
||||||
|
#endif
|
||||||
|
nullptr, gerror)
|
||||||
#else
|
#else
|
||||||
!e_cal_modify_object(m_calendar, subcomp,
|
!e_cal_modify_object(m_calendar, subcomp,
|
||||||
CALOBJ_MOD_THIS,
|
CALOBJ_MOD_THIS,
|
||||||
|
@ -781,6 +888,11 @@ EvolutionCalendarSource::InsertItemResult EvolutionCalendarSource::insertItem(co
|
||||||
modTime = getItemModTime(newid);
|
modTime = getItemModTime(newid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
// TODO: this object leaks when an exception is thrown. Store in smart pointer.
|
||||||
|
g_clear_object(&subcomp);
|
||||||
|
#endif
|
||||||
|
|
||||||
return InsertItemResult(newluid, modTime, state);
|
return InsertItemResult(newluid, modTime, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -792,12 +904,24 @@ EvolutionCalendarSource::ICalComps_t EvolutionCalendarSource::removeEvents(const
|
||||||
if (it != m_allLUIDs.end()) {
|
if (it != m_allLUIDs.end()) {
|
||||||
for (const string &rid: it->second) {
|
for (const string &rid: it->second) {
|
||||||
ItemID id(uid, rid);
|
ItemID id(uid, rid);
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
ICalComponent *icomp = retrieveItem(id);
|
||||||
|
#else
|
||||||
icalcomponent *icomp = retrieveItem(id);
|
icalcomponent *icomp = retrieveItem(id);
|
||||||
|
#endif
|
||||||
if (icomp) {
|
if (icomp) {
|
||||||
if (id.m_rid.empty() && returnOnlyChildren) {
|
if (id.m_rid.empty() && returnOnlyChildren) {
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
g_clear_object(&icomp);
|
||||||
|
#else
|
||||||
icalcomponent_free(icomp);
|
icalcomponent_free(icomp);
|
||||||
|
#endif
|
||||||
} else {
|
} 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)));
|
events.push_back(ICalComps_t::value_type(new eptr<icalcomponent>(icomp)));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -807,8 +931,12 @@ EvolutionCalendarSource::ICalComps_t EvolutionCalendarSource::removeEvents(const
|
||||||
GErrorCXX gerror;
|
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.
|
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
|
#ifdef USE_EDS_CLIENT
|
||||||
!e_cal_client_remove_object_sync(m_calendar,
|
!e_cal_client_remove_object_sync(m_calendar, uid.c_str(), nullptr,
|
||||||
uid.c_str(), nullptr, CALOBJ_MOD_ALL,
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
E_CAL_OBJ_MOD_ALL, E_CAL_OPERATION_FLAG_NONE,
|
||||||
|
#else
|
||||||
|
CALOBJ_MOD_ALL,
|
||||||
|
#endif
|
||||||
nullptr, gerror)
|
nullptr, gerror)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -848,14 +976,21 @@ void EvolutionCalendarSource::removeItem(const string &luid)
|
||||||
|
|
||||||
// recreate children
|
// recreate children
|
||||||
bool first = true;
|
bool first = true;
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
for (std::shared_ptr< eptr<ICalComponent> > &icalcomp: children) {
|
||||||
|
#else
|
||||||
for (std::shared_ptr< eptr<icalcomponent> > &icalcomp: children) {
|
for (std::shared_ptr< eptr<icalcomponent> > &icalcomp: children) {
|
||||||
|
#endif
|
||||||
if (first) {
|
if (first) {
|
||||||
char *uid;
|
char *uid;
|
||||||
|
|
||||||
if (
|
if (
|
||||||
#ifdef USE_EDS_CLIENT
|
#ifdef USE_EDS_CLIENT
|
||||||
!e_cal_client_create_object_sync(m_calendar, *icalcomp, &uid,
|
!e_cal_client_create_object_sync(m_calendar, *icalcomp,
|
||||||
nullptr, gerror)
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
E_CAL_OPERATION_FLAG_NONE,
|
||||||
|
#endif
|
||||||
|
&uid, nullptr, gerror)
|
||||||
#else
|
#else
|
||||||
!e_cal_create_object(m_calendar, *icalcomp, &uid, gerror)
|
!e_cal_create_object(m_calendar, *icalcomp, &uid, gerror)
|
||||||
#endif
|
#endif
|
||||||
|
@ -870,8 +1005,12 @@ void EvolutionCalendarSource::removeItem(const string &luid)
|
||||||
if (
|
if (
|
||||||
#ifdef USE_EDS_CLIENT
|
#ifdef USE_EDS_CLIENT
|
||||||
!e_cal_client_modify_object_sync(m_calendar, *icalcomp,
|
!e_cal_client_modify_object_sync(m_calendar, *icalcomp,
|
||||||
CALOBJ_MOD_THIS, nullptr,
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
gerror)
|
E_CAL_OBJ_MOD_THIS, E_CAL_OPERATION_FLAG_NONE,
|
||||||
|
#else
|
||||||
|
CALOBJ_MOD_THIS,
|
||||||
|
#endif
|
||||||
|
nullptr, gerror)
|
||||||
#else
|
#else
|
||||||
!e_cal_modify_object(m_calendar, *icalcomp,
|
!e_cal_modify_object(m_calendar, *icalcomp,
|
||||||
CALOBJ_MOD_THIS,
|
CALOBJ_MOD_THIS,
|
||||||
|
@ -886,14 +1025,23 @@ void EvolutionCalendarSource::removeItem(const string &luid)
|
||||||
// workaround for EDS 2.32 API semantic: succeeds even if
|
// workaround for EDS 2.32 API semantic: succeeds even if
|
||||||
// detached recurrence doesn't exist and adds EXDATE,
|
// detached recurrence doesn't exist and adds EXDATE,
|
||||||
// therefore we have to check for existence first
|
// therefore we have to check for existence first
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
eptr<ICalComponent> item(retrieveItem(id));
|
||||||
|
#else
|
||||||
eptr<icalcomponent> item(retrieveItem(id));
|
eptr<icalcomponent> item(retrieveItem(id));
|
||||||
|
#endif
|
||||||
gboolean success = !item ? false :
|
gboolean success = !item ? false :
|
||||||
#ifdef USE_EDS_CLIENT
|
#ifdef USE_EDS_CLIENT
|
||||||
// TODO: is this necessary?
|
// TODO: is this necessary?
|
||||||
e_cal_client_remove_object_sync(m_calendar,
|
e_cal_client_remove_object_sync(m_calendar,
|
||||||
id.m_uid.c_str(),
|
id.m_uid.c_str(),
|
||||||
id.m_rid.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,
|
CALOBJ_MOD_ONLY_THIS,
|
||||||
|
#endif
|
||||||
nullptr,
|
nullptr,
|
||||||
gerror)
|
gerror)
|
||||||
#else
|
#else
|
||||||
|
@ -937,10 +1085,18 @@ void EvolutionCalendarSource::removeItem(const string &luid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
ICalComponent *EvolutionCalendarSource::retrieveItem(const ItemID &id)
|
||||||
|
#else
|
||||||
icalcomponent *EvolutionCalendarSource::retrieveItem(const ItemID &id)
|
icalcomponent *EvolutionCalendarSource::retrieveItem(const ItemID &id)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
GErrorCXX gerror;
|
GErrorCXX gerror;
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
ICalComponent *comp = nullptr;
|
||||||
|
#else
|
||||||
icalcomponent *comp = nullptr;
|
icalcomponent *comp = nullptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (
|
if (
|
||||||
#ifdef USE_EDS_CLIENT
|
#ifdef USE_EDS_CLIENT
|
||||||
|
@ -967,7 +1123,11 @@ icalcomponent *EvolutionCalendarSource::retrieveItem(const ItemID &id)
|
||||||
if (!comp) {
|
if (!comp) {
|
||||||
throwError(SE_HERE, string("retrieving item: ") + id.getLUID());
|
throwError(SE_HERE, string("retrieving item: ") + id.getLUID());
|
||||||
}
|
}
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
eptr<ICalComponent> ptr(comp);
|
||||||
|
#else
|
||||||
eptr<icalcomponent> ptr(comp);
|
eptr<icalcomponent> ptr(comp);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* EDS bug: if a parent doesn't exist while a child does, and we ask
|
* EDS bug: if a parent doesn't exist while a child does, and we ask
|
||||||
|
@ -975,8 +1135,15 @@ icalcomponent *EvolutionCalendarSource::retrieveItem(const ItemID &id)
|
||||||
* turn it into a "not found" error.
|
* turn it into a "not found" error.
|
||||||
*/
|
*/
|
||||||
if (id.m_rid.empty()) {
|
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);
|
struct icaltimetype rid = icalcomponent_get_recurrenceid(comp);
|
||||||
if (!icaltime_is_null_time(rid)) {
|
if (!icaltime_is_null_time(rid)) {
|
||||||
|
#endif
|
||||||
throwError(SE_HERE, string("retrieving item: got child instead of parent: ") + id.m_uid);
|
throwError(SE_HERE, string("retrieving item: got child instead of parent: ") + id.m_uid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -986,7 +1153,11 @@ icalcomponent *EvolutionCalendarSource::retrieveItem(const ItemID &id)
|
||||||
|
|
||||||
string EvolutionCalendarSource::retrieveItemAsString(const ItemID &id)
|
string EvolutionCalendarSource::retrieveItemAsString(const ItemID &id)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
eptr<ICalComponent> comp(retrieveItem(id));
|
||||||
|
#else
|
||||||
eptr<icalcomponent> comp(retrieveItem(id));
|
eptr<icalcomponent> comp(retrieveItem(id));
|
||||||
|
#endif
|
||||||
eptr<char> icalstr;
|
eptr<char> icalstr;
|
||||||
|
|
||||||
#ifdef USE_EDS_CLIENT
|
#ifdef USE_EDS_CLIENT
|
||||||
|
@ -1001,6 +1172,15 @@ string EvolutionCalendarSource::retrieveItemAsString(const ItemID &id)
|
||||||
// definition. Evolution GUI ignores the TZID and interprets
|
// definition. Evolution GUI ignores the TZID and interprets
|
||||||
// the times as local time. Do the same when exporting the
|
// the times as local time. Do the same when exporting the
|
||||||
// event by removing the bogus TZID.
|
// 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,
|
icalproperty *prop = icalcomponent_get_first_property (comp,
|
||||||
ICAL_ANY_PROPERTY);
|
ICAL_ANY_PROPERTY);
|
||||||
|
|
||||||
|
@ -1010,6 +1190,7 @@ string EvolutionCalendarSource::retrieveItemAsString(const ItemID &id)
|
||||||
prop = icalcomponent_get_next_property (comp,
|
prop = icalcomponent_get_next_property (comp,
|
||||||
ICAL_ANY_PROPERTY);
|
ICAL_ANY_PROPERTY);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// now try again
|
// now try again
|
||||||
#ifdef USE_EDS_CLIENT
|
#ifdef USE_EDS_CLIENT
|
||||||
|
@ -1061,16 +1242,28 @@ string EvolutionCalendarSource::retrieveItemAsString(const ItemID &id)
|
||||||
std::string EvolutionCalendarSource::getDescription(const string &luid)
|
std::string EvolutionCalendarSource::getDescription(const string &luid)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
eptr<ICalComponent> comp(retrieveItem(ItemID(luid)));
|
||||||
|
#else
|
||||||
eptr<icalcomponent> comp(retrieveItem(ItemID(luid)));
|
eptr<icalcomponent> comp(retrieveItem(ItemID(luid)));
|
||||||
|
#endif
|
||||||
std::string descr;
|
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);
|
const char *summary = icalcomponent_get_summary(comp);
|
||||||
|
#endif
|
||||||
if (summary && summary[0]) {
|
if (summary && summary[0]) {
|
||||||
descr += summary;
|
descr += summary;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_type == EVOLUTION_CAL_SOURCE_TYPE_EVENTS) {
|
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);
|
const char *location = icalcomponent_get_location(comp);
|
||||||
|
#endif
|
||||||
if (location && location[0]) {
|
if (location && location[0]) {
|
||||||
if (!descr.empty()) {
|
if (!descr.empty()) {
|
||||||
descr += ", ";
|
descr += ", ";
|
||||||
|
@ -1082,9 +1275,17 @@ std::string EvolutionCalendarSource::getDescription(const string &luid)
|
||||||
if (m_type == EVOLUTION_CAL_SOURCE_TYPE_MEMOS &&
|
if (m_type == EVOLUTION_CAL_SOURCE_TYPE_MEMOS &&
|
||||||
descr.empty()) {
|
descr.empty()) {
|
||||||
// fallback to first line of body text
|
// 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);
|
icalproperty *desc = icalcomponent_get_first_property(comp, ICAL_DESCRIPTION_PROPERTY);
|
||||||
|
#endif
|
||||||
if (desc) {
|
if (desc) {
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
const char *text = i_cal_property_get_description(desc);
|
||||||
|
#else
|
||||||
const char *text = icalproperty_get_description(desc);
|
const char *text = icalproperty_get_description(desc);
|
||||||
|
#endif
|
||||||
if (text) {
|
if (text) {
|
||||||
const char *eol = strchr(text, '\n');
|
const char *eol = strchr(text, '\n');
|
||||||
if (eol) {
|
if (eol) {
|
||||||
|
@ -1093,6 +1294,9 @@ std::string EvolutionCalendarSource::getDescription(const string &luid)
|
||||||
descr = text;
|
descr = text;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
g_object_unref(desc);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1130,7 +1334,11 @@ EvolutionCalendarSource::ItemID::ItemID(const string &luid)
|
||||||
|
|
||||||
EvolutionCalendarSource::ItemID EvolutionCalendarSource::getItemID(ECalComponent *ecomp)
|
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);
|
icalcomponent *icomp = e_cal_component_get_icalcomponent(ecomp);
|
||||||
|
#endif
|
||||||
if (!icomp) {
|
if (!icomp) {
|
||||||
SE_THROW("internal error in getItemID(): ECalComponent without icalcomp");
|
SE_THROW("internal error in getItemID(): ECalComponent without icalcomp");
|
||||||
}
|
}
|
||||||
|
@ -1148,15 +1356,38 @@ EvolutionCalendarSource::ItemID EvolutionCalendarSource::getItemID(icalcomponent
|
||||||
icalTime2Str(rid));
|
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)
|
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;
|
struct icaltimetype *modTime;
|
||||||
e_cal_component_get_last_modified(ecomp, &modTime);
|
e_cal_component_get_last_modified(ecomp, &modTime);
|
||||||
eptr<struct icaltimetype, struct icaltimetype, UnrefFree<struct icaltimetype> > modTimePtr(modTime);
|
eptr<struct icaltimetype, struct icaltimetype, UnrefFree<struct icaltimetype> > modTimePtr(modTime);
|
||||||
|
#endif
|
||||||
if (!modTimePtr) {
|
if (!modTimePtr) {
|
||||||
return "";
|
return "";
|
||||||
} else {
|
} else {
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
return icalTime2Str(modTimePtr.get());
|
||||||
|
#else
|
||||||
return icalTime2Str(*modTimePtr.get());
|
return icalTime2Str(*modTimePtr.get());
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1165,7 +1396,11 @@ string EvolutionCalendarSource::getItemModTime(const ItemID &id)
|
||||||
if (!needChanges()) {
|
if (!needChanges()) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
eptr<ICalComponent> icomp(retrieveItem(id));
|
||||||
|
#else
|
||||||
eptr<icalcomponent> icomp(retrieveItem(id));
|
eptr<icalcomponent> icomp(retrieveItem(id));
|
||||||
|
#endif
|
||||||
return getItemModTime(icomp);
|
return getItemModTime(icomp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1180,6 +1415,15 @@ string EvolutionCalendarSource::getItemModTime(icalcomponent *icomp)
|
||||||
return icalTime2Str(modTime);
|
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)
|
string EvolutionCalendarSource::icalTime2Str(const icaltimetype &tt)
|
||||||
{
|
{
|
||||||
static const struct icaltimetype null = { 0 };
|
static const struct icaltimetype null = { 0 };
|
||||||
|
@ -1194,6 +1438,21 @@ string EvolutionCalendarSource::icalTime2Str(const icaltimetype &tt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#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
|
SE_END_CXX
|
||||||
|
|
||||||
#endif /* ENABLE_ECAL */
|
#endif /* ENABLE_ECAL */
|
||||||
|
|
|
@ -134,6 +134,9 @@ class EvolutionCalendarSource : public EvolutionSyncSource,
|
||||||
*/
|
*/
|
||||||
static ItemID getItemID(ECalComponent *ecomp);
|
static ItemID getItemID(ECalComponent *ecomp);
|
||||||
static ItemID getItemID(icalcomponent *icomp);
|
static ItemID getItemID(icalcomponent *icomp);
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
static ItemID getItemID(ICalComponent *icomp);
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extract modification string from calendar item.
|
* Extract modification string from calendar item.
|
||||||
|
@ -141,6 +144,9 @@ class EvolutionCalendarSource : public EvolutionSyncSource,
|
||||||
*/
|
*/
|
||||||
static string getItemModTime(ECalComponent *ecomp);
|
static string getItemModTime(ECalComponent *ecomp);
|
||||||
static string getItemModTime(icalcomponent *icomp);
|
static string getItemModTime(icalcomponent *icomp);
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
static string getItemModTime(ICalComponent *icomp);
|
||||||
|
#endif
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//
|
//
|
||||||
|
@ -196,18 +202,30 @@ class EvolutionCalendarSource : public EvolutionSyncSource,
|
||||||
*
|
*
|
||||||
* caller has to free result
|
* caller has to free result
|
||||||
*/
|
*/
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
ICalComponent *retrieveItem(const ItemID &id);
|
||||||
|
#else
|
||||||
icalcomponent *retrieveItem(const ItemID &id);
|
icalcomponent *retrieveItem(const ItemID &id);
|
||||||
|
#endif
|
||||||
|
|
||||||
/** retrieve the item with the given luid as VCALENDAR string - may throw exception */
|
/** retrieve the item with the given luid as VCALENDAR string - may throw exception */
|
||||||
string retrieveItemAsString(const ItemID &id);
|
string retrieveItemAsString(const ItemID &id);
|
||||||
|
|
||||||
|
|
||||||
/** returns the type which the ical library uses for our components */
|
/** 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() {
|
icalcomponent_kind getCompType() {
|
||||||
return m_type == EVOLUTION_CAL_SOURCE_TYPE_EVENTS ? ICAL_VEVENT_COMPONENT :
|
return m_type == EVOLUTION_CAL_SOURCE_TYPE_EVENTS ? ICAL_VEVENT_COMPONENT :
|
||||||
m_type == EVOLUTION_CAL_SOURCE_TYPE_MEMOS ? ICAL_VJOURNAL_COMPONENT :
|
m_type == EVOLUTION_CAL_SOURCE_TYPE_MEMOS ? ICAL_VJOURNAL_COMPONENT :
|
||||||
ICAL_VTODO_COMPONENT;
|
ICAL_VTODO_COMPONENT;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef USE_EDS_CLIENT
|
#ifndef USE_EDS_CLIENT
|
||||||
/** ECalAuthFunc which calls the authenticate() methods */
|
/** ECalAuthFunc which calls the authenticate() methods */
|
||||||
|
@ -239,6 +257,9 @@ class EvolutionCalendarSource : public EvolutionSyncSource,
|
||||||
* Convert to string in canonical representation.
|
* Convert to string in canonical representation.
|
||||||
*/
|
*/
|
||||||
static string icalTime2Str(const struct icaltimetype &tt);
|
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
|
* A set of all existing objects. Initialized in the last call to
|
||||||
|
@ -263,7 +284,11 @@ class EvolutionCalendarSource : public EvolutionSyncSource,
|
||||||
* will destroy the smart pointer, which then calls
|
* will destroy the smart pointer, which then calls
|
||||||
* icalcomponent_free().
|
* icalcomponent_free().
|
||||||
*/
|
*/
|
||||||
|
#ifdef HAVE_LIBECAL_2_0
|
||||||
|
typedef list< std::shared_ptr< eptr<ICalComponent> > > ICalComps_t;
|
||||||
|
#else
|
||||||
typedef list< std::shared_ptr< eptr<icalcomponent> > > ICalComps_t;
|
typedef list< std::shared_ptr< eptr<icalcomponent> > > ICalComps_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility function which extracts all icalcomponents with
|
* Utility function which extracts all icalcomponents with
|
||||||
|
|
|
@ -942,7 +942,11 @@ void EvolutionContactSource::flushItemChanges()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
SYNCEVO_GLIB_CALL_ASYNC(e_book_client_add_contacts, process,
|
SYNCEVO_GLIB_CALL_ASYNC(e_book_client_add_contacts, process,
|
||||||
m_addressbook, contacts, nullptr);
|
m_addressbook, contacts,
|
||||||
|
#ifdef HAVE_E_BOOK_OPERATION_FLAGS
|
||||||
|
E_BOOK_OPERATION_FLAG_NONE,
|
||||||
|
#endif
|
||||||
|
nullptr);
|
||||||
}
|
}
|
||||||
if (!m_batchedUpdate.empty()) {
|
if (!m_batchedUpdate.empty()) {
|
||||||
SE_LOG_DEBUG(getDisplayName(), "batch update of %d contacts starting", (int)m_batchedUpdate.size());
|
SE_LOG_DEBUG(getDisplayName(), "batch update of %d contacts starting", (int)m_batchedUpdate.size());
|
||||||
|
@ -976,7 +980,11 @@ void EvolutionContactSource::flushItemChanges()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
SYNCEVO_GLIB_CALL_ASYNC(e_book_client_modify_contacts, process,
|
SYNCEVO_GLIB_CALL_ASYNC(e_book_client_modify_contacts, process,
|
||||||
m_addressbook, contacts, nullptr);
|
m_addressbook, contacts,
|
||||||
|
#ifdef HAVE_E_BOOK_OPERATION_FLAGS
|
||||||
|
E_BOOK_OPERATION_FLAG_NONE,
|
||||||
|
#endif
|
||||||
|
nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1009,14 +1017,22 @@ EvolutionContactSource::insertItem(const string &uid, const std::string &item, b
|
||||||
case SYNCHRONOUS:
|
case SYNCHRONOUS:
|
||||||
if (uid.empty()) {
|
if (uid.empty()) {
|
||||||
gchar* newuid;
|
gchar* newuid;
|
||||||
if (!e_book_client_add_contact_sync(m_addressbook, contact, &newuid, nullptr, gerror)) {
|
if (!e_book_client_add_contact_sync(m_addressbook, contact,
|
||||||
|
#ifdef HAVE_E_BOOK_OPERATION_FLAGS
|
||||||
|
E_BOOK_OPERATION_FLAG_NONE,
|
||||||
|
#endif
|
||||||
|
&newuid, nullptr, gerror)) {
|
||||||
throwError(SE_HERE, "add new contact", gerror);
|
throwError(SE_HERE, "add new contact", gerror);
|
||||||
}
|
}
|
||||||
PlainGStr newuidPtr(newuid);
|
PlainGStr newuidPtr(newuid);
|
||||||
string newrev = getRevision(newuid);
|
string newrev = getRevision(newuid);
|
||||||
return InsertItemResult(newuid, newrev, ITEM_OKAY);
|
return InsertItemResult(newuid, newrev, ITEM_OKAY);
|
||||||
} else {
|
} else {
|
||||||
if (!e_book_client_modify_contact_sync(m_addressbook, contact, nullptr, gerror)) {
|
if (!e_book_client_modify_contact_sync(m_addressbook, contact,
|
||||||
|
#ifdef HAVE_E_BOOK_OPERATION_FLAGS
|
||||||
|
E_BOOK_OPERATION_FLAG_NONE,
|
||||||
|
#endif
|
||||||
|
nullptr, gerror)) {
|
||||||
throwError(SE_HERE, "updating contact "+ uid, gerror);
|
throwError(SE_HERE, "updating contact "+ uid, gerror);
|
||||||
}
|
}
|
||||||
string newrev = getRevision(uid);
|
string newrev = getRevision(uid);
|
||||||
|
@ -1074,7 +1090,11 @@ void EvolutionContactSource::removeItem(const string &uid)
|
||||||
if (
|
if (
|
||||||
#ifdef USE_EDS_CLIENT
|
#ifdef USE_EDS_CLIENT
|
||||||
(invalidateCachedContact(uid),
|
(invalidateCachedContact(uid),
|
||||||
!e_book_client_remove_contact_by_uid_sync(m_addressbook, uid.c_str(), nullptr, 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
|
||||||
|
nullptr, gerror))
|
||||||
#else
|
#else
|
||||||
!e_book_remove_contact(m_addressbook, uid.c_str(), gerror)
|
!e_book_remove_contact(m_addressbook, uid.c_str(), gerror)
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -15,13 +15,23 @@ $anymissing"
|
||||||
|
|
||||||
dnl check for Evolution packages
|
dnl check for Evolution packages
|
||||||
PKG_CHECK_MODULES(EPACKAGE, libedataserver-1.2, EDSFOUND=yes, [EDSFOUND=no])
|
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])
|
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],
|
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()])],
|
[AC_DEFINE(HAVE_E_CONTACT_INLINE_LOCAL_PHOTOS, 1, [have e_contact_inline_local_photos()])],
|
||||||
[true])
|
[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,
|
SE_ARG_ENABLE_BACKEND(ebook, evolution,
|
||||||
[AS_HELP_STRING([--disable-ebook],
|
[AS_HELP_STRING([--disable-ebook],
|
||||||
[disable access to Evolution addressbooks (must be used to compile without it)])],
|
[disable access to Evolution addressbooks (must be used to compile without it)])],
|
||||||
|
|
|
@ -414,7 +414,11 @@ gboolean e_cal_check_timezones(icalcomponent *comp,
|
||||||
goto done;
|
goto done;
|
||||||
nomem:
|
nomem:
|
||||||
/* set gerror for "out of memory" if possible, otherwise abort via g_error() */
|
/* 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");
|
*error = g_error_new(E_CALENDAR_ERROR, E_CALENDAR_STATUS_OTHER_ERROR, "out of memory");
|
||||||
|
#endif
|
||||||
if (!*error) {
|
if (!*error) {
|
||||||
g_error("e_cal_check_timezones(): out of memory, cannot proceed - sorry!");
|
g_error("e_cal_check_timezones(): out of memory, cannot proceed - sorry!");
|
||||||
}
|
}
|
||||||
|
@ -451,6 +455,10 @@ icaltimezone *e_cal_tzlookup_ecal(const char *tzid,
|
||||||
const void *custom,
|
const void *custom,
|
||||||
GError **error)
|
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;
|
ECal *ecal = (ECal *)custom;
|
||||||
icaltimezone *zone = NULL;
|
icaltimezone *zone = NULL;
|
||||||
|
|
||||||
|
@ -470,6 +478,7 @@ icaltimezone *e_cal_tzlookup_ecal(const char *tzid,
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -73,6 +73,12 @@ class Unref {
|
||||||
static void unref(icalproperty *pointer) { icalproperty_free(pointer); }
|
static void unref(icalproperty *pointer) { icalproperty_free(pointer); }
|
||||||
static void unref(icalparameter *pointer) { icalparameter_free(pointer); }
|
static void unref(icalparameter *pointer) { icalparameter_free(pointer); }
|
||||||
static void unref(icaltimezone *pointer) { icaltimezone_free(pointer, 1); }
|
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
|
#endif // ENABLE_ICAL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue