ical_ctdl_is_overlap() is now symlinked 3 places.
authorArt Cancro <ajc@citadel.org>
Wed, 20 Mar 2024 19:56:01 +0000 (15:56 -0400)
committerArt Cancro <ajc@citadel.org>
Wed, 20 Mar 2024 19:56:01 +0000 (15:56 -0400)
It's the same function used in Citadel Server, WebCit-Classic, and
WebCit-NG.  It isn't really suitable for use in libcitadel so we
made symlinks instead.

citadel/server/modules/calendar/ical_ctdl_is_overlap.c [new file with mode: 0644]
citadel/server/modules/calendar/serv_calendar.c
webcit-ng/server/caldav_reports.c
webcit-ng/server/ical_ctdl_is_overlap.c [new symlink]
webcit-ng/server/webcit.h
webcit/.gitignore
webcit/Makefile.in
webcit/availability.c
webcit/ical_ctdl_is_overlap.c [new symlink]

diff --git a/citadel/server/modules/calendar/ical_ctdl_is_overlap.c b/citadel/server/modules/calendar/ical_ctdl_is_overlap.c
new file mode 100644 (file)
index 0000000..6902fd0
--- /dev/null
@@ -0,0 +1,79 @@
+// 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);
+}
index a1016a41027cfe3f351137fd179a0ae3bd94a59d..17b80b0dd7d2b722c30b9ff94e3a7351fd13f080 100644 (file)
@@ -718,74 +718,6 @@ icalproperty *ical_ctdl_get_subprop(
 }
 
 
-// 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()
 //
index 22c90fea62ba981fffdc9b4e54b077e952db0e74..758a4a2f1295cdfb6211d086e78c0876aacad13c 100644 (file)
@@ -283,8 +283,10 @@ int caldav_time_range_filter_matches(icalcomponent *supplied_cal, char *start_st
        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);
 }
 
 
diff --git a/webcit-ng/server/ical_ctdl_is_overlap.c b/webcit-ng/server/ical_ctdl_is_overlap.c
new file mode 120000 (symlink)
index 0000000..7ee533d
--- /dev/null
@@ -0,0 +1 @@
+../../citadel/server/modules/calendar/ical_ctdl_is_overlap.c
\ No newline at end of file
index e422849a4321c3e962253339d34220e5c2f6cea7..916c4e1f0b50a3445b4f66dcb2e6c96835f6ce6b 100644 (file)
@@ -146,7 +146,6 @@ enum {
 // 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 *);
@@ -210,6 +209,9 @@ void perform_one_http_transaction(struct client_handle *);
 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 *);
@@ -304,4 +306,3 @@ void spawn_another_worker_thread(int *);
 void worker_entry(int *);
 int webserver(char *, int, int);
 
-
index 2be77a2f282fe9c78f6dda262b9cb7abe2415447..9188fff4f69c1b95f54ce3c5b1f7106ac1461c77 100644 (file)
@@ -17,7 +17,7 @@ po/Makefile
 setup
 sysdep.h
 sysdep.h.in
-webcit
+./webcit
 i18n_templatelist.c
 autom4te.cache
 gmon.out
index 1e11235b40c45c65ab8fbb7c7f63eee0b233ed88..cb6c8fe619c731772a886af91295f4bc0b0bbf82 100644 (file)
@@ -64,7 +64,7 @@ webcit: webserver.o context_loop.o ical_dezonify.o \
        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) \
@@ -81,7 +81,7 @@ webcit: webserver.o context_loop.o ical_dezonify.o \
        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
index 44e9ecf12a28756b81de9e8a88e6e70c45a6c4ff..a57e3f71329543e3d1c684144b33809d552b9605 100644 (file)
@@ -44,81 +44,6 @@ icalcomponent *get_freebusy_for_user(char *who) {
 }
 
 
-/*
- * 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
diff --git a/webcit/ical_ctdl_is_overlap.c b/webcit/ical_ctdl_is_overlap.c
new file mode 120000 (symlink)
index 0000000..a6a6bc2
--- /dev/null
@@ -0,0 +1 @@
+../citadel/server/modules/calendar/ical_ctdl_is_overlap.c
\ No newline at end of file