From 6ac1bb93afed223fb68315f079bb5da1f181137e Mon Sep 17 00:00:00 2001 From: mikhail_grishak Date: Tue, 26 May 2026 21:04:06 +0300 Subject: [PATCH] res_calendar: Fix build with libical 4.X libical 4.0 removed the icaltime_add() function in favor of icaltime_adjust(). Additionally, the callback signature for icalcomponent_foreach_recurrence() was updated to use a const pointer for the icaltime_span argument. This commit adds conditional compilation using ICAL_MAJOR_VERSION to support both libical 3.X and the new 4.X API, ensuring backward compatibility. Fixes: #1957 --- res/res_calendar_caldav.c | 18 +++++++++++++++++- res/res_calendar_icalendar.c | 18 +++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/res/res_calendar_caldav.c b/res/res_calendar_caldav.c index d531f98063..d2cefa0f0c 100644 --- a/res/res_calendar_caldav.c +++ b/res/res_calendar_caldav.c @@ -31,6 +31,12 @@ #include "asterisk.h" #include + +#if ICAL_MAJOR_VERSION >= 4 +#define ICAL_SPAN_CONST const +#else +#define ICAL_SPAN_CONST +#endif #include #include #include @@ -349,7 +355,7 @@ static time_t icalfloat_to_timet(icaltimetype time) * span here, and instead will grab the start and end from the component, which will * allow us to test for floating times or dates. */ -static void caldav_add_event(icalcomponent *comp, struct icaltime_span *span, void *data) +static void caldav_add_event(icalcomponent *comp, ICAL_SPAN_CONST struct icaltime_span *span, void *data) { struct caldav_pvt *pvt = data; struct ast_calendar_event *event; @@ -464,7 +470,17 @@ static void caldav_add_event(icalcomponent *comp, struct icaltime_span *span, vo } else { /* Offset from either dtstart or dtend */ /* XXX Technically you can check RELATED to see if the event fires from the END of the event * But, I'm not sure I've ever seen anyone implement it in calendaring software, so I'm ignoring for now */ +#if ICAL_MAJOR_VERSION >= 4 + tmp = start; + int sign = trigger.duration.is_neg ? -1 : 1; + icaltime_adjust(&tmp, + sign * (trigger.duration.days + trigger.duration.weeks * 7), + sign * trigger.duration.hours, + sign * trigger.duration.minutes, + sign * trigger.duration.seconds); +#else tmp = icaltime_add(start, trigger.duration); +#endif event->alarm = icaltime_as_timet_with_zone(tmp, icaltime_get_timezone(start)); } diff --git a/res/res_calendar_icalendar.c b/res/res_calendar_icalendar.c index 95790e5d08..0776a3bdd5 100644 --- a/res/res_calendar_icalendar.c +++ b/res/res_calendar_icalendar.c @@ -30,6 +30,12 @@ #include "asterisk.h" #include + +#if ICAL_MAJOR_VERSION >= 4 +#define ICAL_SPAN_CONST const +#else +#define ICAL_SPAN_CONST +#endif #include #include #include @@ -191,7 +197,7 @@ static time_t icalfloat_to_timet(icaltimetype time) * allow us to test for floating times or dates. */ -static void icalendar_add_event(icalcomponent *comp, struct icaltime_span *span, void *data) +static void icalendar_add_event(icalcomponent *comp, ICAL_SPAN_CONST struct icaltime_span *span, void *data) { struct icalendar_pvt *pvt = data; struct ast_calendar_event *event; @@ -341,7 +347,17 @@ static void icalendar_add_event(icalcomponent *comp, struct icaltime_span *span, } else { /* Offset from either dtstart or dtend */ /* XXX Technically you can check RELATED to see if the event fires from the END of the event * But, I'm not sure I've ever seen anyone implement it in calendaring software, so I'm ignoring for now */ +#if ICAL_MAJOR_VERSION >= 4 + tmp = start; + int sign = trigger.duration.is_neg ? -1 : 1; + icaltime_adjust(&tmp, + sign * (trigger.duration.days + trigger.duration.weeks * 7), + sign * trigger.duration.hours, + sign * trigger.duration.minutes, + sign * trigger.duration.seconds); +#else tmp = icaltime_add(start, trigger.duration); +#endif event->alarm = icaltime_as_timet_with_zone(tmp, icaltime_get_timezone(start)); }