--- /dev/null
+// Check to see if two events overlap.
+//
+// This function is used in Citadel Server and in both generations of WebCit. Symlink it accordingly.
+//
+// Copyright (c) 1987-2024 by the citadel.org team
+//
+// This program is open source software. Use, duplication, or disclosure is subject to the GNU General Public License version 3.
+
+#include <libical/ical.h>
+#include <string.h>
+
+// Check to see if two events overlap. Returns nonzero if they do.
+int ical_ctdl_is_overlap(
+ struct icaltimetype t1start,
+ struct icaltimetype t1end,
+ struct icaltimetype t2start,
+ struct icaltimetype t2end
+) {
+ if (icaltime_is_null_time(t1start)) return(0);
+ if (icaltime_is_null_time(t2start)) return(0);
+
+ // if either event lacks end time, assume end = start
+ if (icaltime_is_null_time(t1end)) {
+ memcpy(&t1end, &t1start, sizeof(struct icaltimetype));
+ }
+ else {
+ if (t1end.is_date && icaltime_compare(t1start, t1end)) {
+
+ // The end date is non-inclusive so adjust it by one
+ // day because our test is inclusive, note that a day is
+ // not too much because we are talking about all day events.
+ //
+ // If start = end we assume that nevertheless the whole day is meant.
+
+ icaltime_adjust(&t1end, -1, 0, 0, 0);
+ }
+ }
+
+ if (icaltime_is_null_time(t2end)) {
+ memcpy(&t2end, &t2start, sizeof(struct icaltimetype));
+ }
+ else {
+ if (t2end.is_date && icaltime_compare(t2start, t2end)) {
+ icaltime_adjust(&t2end, -1, 0, 0, 0);
+ }
+ }
+
+ // First, check for all-day events
+ if (t1start.is_date || t2start.is_date) {
+ // If event 1 ends before event 2 starts, there is no match.
+ if (icaltime_compare_date_only(t1end, t2start) < 0) return(0);
+
+ // If event 2 ends before event 1 starts, there is no match.
+ if (icaltime_compare_date_only(t2end, t1start) < 0) return(0);
+
+ // Otherwise there is at least one day of overlap, so yes we have a match.
+ return(1);
+ }
+
+#ifdef DEBUG_ICAL_OVERLAP
+ syslog(LOG_DEBUG, "Comparing t1start %d:%d t1end %d:%d t2start %d:%d t2end %d:%d",
+ t1start.hour, t1start.minute, t1end.hour, t1end.minute,
+ t2start.hour, t2start.minute, t2end.hour, t2end.minute
+ );
+#endif
+
+ // Now check for overlaps using date *and* time.
+
+ // If event 1 ends before event 2 starts, there is no match.
+ if (icaltime_compare(t1end, t2start) <= 0) return(0);
+ // syslog(LOG_DEBUG, "calendar: first passed");
+
+ // If event 2 ends before event 1 starts, there is no match.
+ if (icaltime_compare(t2end, t1start) <= 0) return(0);
+ // syslog(LOG_DEBUG, "calendar: second passed");
+
+ // Otherwise, there is an overlap, so yes we have a match.
+ return(1);
+}
}
-// Check to see if two events overlap. Returns nonzero if they do.
-// (This function is used in both Citadel and WebCit. If you change it in
-// one place, change it in the other. Better yet, put it in a library.)
-int ical_ctdl_is_overlap(
- struct icaltimetype t1start,
- struct icaltimetype t1end,
- struct icaltimetype t2start,
- struct icaltimetype t2end
-) {
- if (icaltime_is_null_time(t1start)) return(0);
- if (icaltime_is_null_time(t2start)) return(0);
-
- // if either event lacks end time, assume end = start
- if (icaltime_is_null_time(t1end)) {
- memcpy(&t1end, &t1start, sizeof(struct icaltimetype));
- }
- else {
- if (t1end.is_date && icaltime_compare(t1start, t1end)) {
-
- // the end date is non-inclusive so adjust it by one
- // day because our test is inclusive, note that a day is
- // not too much because we are talking about all day
- // events
- // if start = end we assume that nevertheless the whole
- // day is meant
-
- icaltime_adjust(&t1end, -1, 0, 0, 0);
- }
- }
-
- if (icaltime_is_null_time(t2end))
- memcpy(&t2end, &t2start, sizeof(struct icaltimetype));
- else {
- if (t2end.is_date && icaltime_compare(t2start, t2end)) {
- icaltime_adjust(&t2end, -1, 0, 0, 0);
- }
- }
-
- // First, check for all-day events
- if (t1start.is_date || t2start.is_date) {
- // If event 1 ends before event 2 starts, we're in the clear.
- if (icaltime_compare_date_only(t1end, t2start) < 0) return(0);
-
- // If event 2 ends before event 1 starts, we're also ok.
- if (icaltime_compare_date_only(t2end, t1start) < 0) return(0);
-
- return(1);
- }
-
- // syslog(LOG_DEBUG, "Comparing t1start %d:%d t1end %d:%d t2start %d:%d t2end %d:%d",
- // t1start.hour, t1start.minute, t1end.hour, t1end.minute,
- // t2start.hour, t2start.minute, t2end.hour, t2end.minute);
-
- // Now check for overlaps using date *and* time.
-
- // If event 1 ends before event 2 starts, we're in the clear.
- if (icaltime_compare(t1end, t2start) <= 0) return(0);
- // syslog(LOG_DEBUG, "calendar: first passed");
-
- // If event 2 ends before event 1 starts, we're also ok.
- if (icaltime_compare(t2end, t1start) <= 0) return(0);
- // syslog(LOG_DEBUG, "calendar: second passed");
-
- // Otherwise, they overlap.
- return(1);
-}
-
-
// Phase 6 of "hunt for conflicts"
// called by ical_conflicts_phase5()
//
icaltimetype dte = icalcomponent_get_dtend(cal);
syslog(LOG_DEBUG, "component end: \033[36m%s\033[0m", icaltime_as_ical_string_r(dte));
+ int result = ical_ctdl_is_overlap(dts, dte, start, end); // We have a convenience function for this.
+
icalcomponent_free(cal);
- return(0); // FIXME reject everything for now
+ return(result);
}
--- /dev/null
+../../citadel/server/modules/calendar/ical_ctdl_is_overlap.c
\ No newline at end of file
// Everything below here is generated with this command:
// cproto -f2 *.c 2>/dev/null |sed 's/^\/\*/\n\/\//g' | sed 's/\ \*\/$//g'
-
// admin_functions.c
void try_login(struct http_transaction *, struct ctdlsession *);
void logout(struct http_transaction *, struct ctdlsession *);
char *header_val(struct http_transaction *, char *);
char *get_url_param(struct http_transaction *, char *);
+// ical_ctdl_is_overlap.c
+int ical_ctdl_is_overlap(struct icaltimetype, struct icaltimetype, struct icaltimetype, struct icaltimetype);
+
// ical_dezonify.c
icaltimezone *get_default_icaltimezone(void);
void ical_dezonify_backend(icalcomponent *, icalcomponent *, icalproperty *);
void worker_entry(int *);
int webserver(char *, int, int);
-
setup
sysdep.h
sysdep.h.in
-webcit
+./webcit
i18n_templatelist.c
autom4te.cache
gmon.out
dav_delete.o dav_put.o http_datestring.o \
downloads.o addressbook_popup.o pushemail.o sysdep.o openid.o \
modules_init.o paramhandling.o utils.o \
- ical_maps.o ical_subst.o static.o feed_generator.o \
+ ical_ctdl_is_overlap.o ical_maps.o ical_subst.o static.o feed_generator.o \
$(LIBOBJS)
echo LD: webcit
$(CC) $(LDFLAGS) -o webcit $(LIBOBJS) \
dav_options.o autocompletion.o tabs.o smtpqueue.o sieve.o sitemap.o \
dav_put.o http_datestring.o fmt_date.o modules_init.o \
gettext.o downloads.o addressbook_popup.o pushemail.o sysdep.o \
- paramhandling.o utils.o ical_maps.o ical_subst.o static.o feed_generator.o \
+ ical_ctdl_is_overlap.o paramhandling.o utils.o ical_maps.o ical_subst.o static.o feed_generator.o \
$(LIBS)
ical_maps.c: scripts/get_ical_data.sh
}
-/*
- * Check to see if two events overlap.
- * (This function is used in both Citadel and WebCit. If you change it in
- * one place, change it in the other. We should seriously consider moving
- * this function upstream into libical.)
- *
- * Returns nonzero if they do overlap.
- */
-int ical_ctdl_is_overlap(
- struct icaltimetype t1start,
- struct icaltimetype t1end,
- struct icaltimetype t2start,
- struct icaltimetype t2end
-) {
-
- if (icaltime_is_null_time(t1start)) return(0);
- if (icaltime_is_null_time(t2start)) return(0);
-
- /* if either event lacks end time, assume end = start */
- if (icaltime_is_null_time(t1end))
- memcpy(&t1end, &t1start, sizeof(struct icaltimetype));
- else {
- if (t1end.is_date && icaltime_compare(t1start, t1end)) {
- /*
- * the end date is non-inclusive so adjust it by one
- * day because our test is inclusive, note that a day is
- * not too much because we are talking about all day
- * events
- * if start = end we assume that nevertheless the whole
- * day is meant
- */
- icaltime_adjust(&t1end, -1, 0, 0, 0);
- }
- }
-
- if (icaltime_is_null_time(t2end))
- memcpy(&t2end, &t2start, sizeof(struct icaltimetype));
- else {
- if (t2end.is_date && icaltime_compare(t2start, t2end)) {
- icaltime_adjust(&t2end, -1, 0, 0, 0);
- }
- }
-
- /* First, check for all-day events */
- if (t1start.is_date || t2start.is_date) {
- /* If event 1 ends before event 2 starts, we're in the clear. */
- if (icaltime_compare_date_only(t1end, t2start) < 0) return(0);
-
- /* If event 2 ends before event 1 starts, we're also ok. */
- if (icaltime_compare_date_only(t2end, t1start) < 0) return(0);
-
- return(1);
- }
-
- /* syslog(LOG_DEBUG, "Comparing t1start %d:%d t1end %d:%d t2start %d:%d t2end %d:%d \n",
- t1start.hour, t1start.minute, t1end.hour, t1end.minute,
- t2start.hour, t2start.minute, t2end.hour, t2end.minute);
- */
-
- /* Now check for overlaps using date *and* time. */
-
- /* If event 1 ends before event 2 starts, we're in the clear. */
- if (icaltime_compare(t1end, t2start) <= 0) return(0);
- /* syslog(LOG_DEBUG, "first passed\n"); */
-
- /* If event 2 ends before event 1 starts, we're also ok. */
- if (icaltime_compare(t2end, t1start) <= 0) return(0);
- /* syslog(LOG_DEBUG, "second passed\n"); */
-
- /* Otherwise, they overlap. */
- return(1);
-}
-
-
-
/*
* Back end function for check_attendee_availability()
* This one checks an individual attendee against a supplied
--- /dev/null
+../citadel/server/modules/calendar/ical_ctdl_is_overlap.c
\ No newline at end of file