Began refactoring CALDAV REPORT flow of control.
[citadel.git] / webcit-ng / server / caldav_reports.c
index 70a4e8095722d8312f763319bdf07a72f6ad97f5..edd0b4558cffc0742568fe82bf73885cca4b9c80 100644 (file)
@@ -1,7 +1,7 @@
 // This file contains functions which handle all of the CalDAV "REPORT" queries
 // specified in RFC4791 section 7.
 //
-// Copyright (c) 2023 by the citadel.org team
+// Copyright (c) 2023-2024 by the citadel.org team
 //
 // This program is open source software.  Use, duplication, or
 // disclosure is subject to the GNU General Public License v3.
@@ -39,14 +39,17 @@ void caldav_xml_start(void *data, const char *el, const char **attr) {
                syslog(LOG_DEBUG, "                    Attribute '%s' = '%s'", attr[i], attr[i + 1]);
        }
 
-       if (!strcasecmp(el, "urn:ietf:params:xml:ns:caldav:calendar-multiget")) {
-               crp->report_type = cr_calendar_multiget;
+       // RFC4791 7.8 "calendar-query" REPORT - Client will send a lot of search criteria.
+       if (!strcasecmp(el, "urn:ietf:params:xml:ns:caldav:calendar-query")) {
+               crp->report_type = cr_calendar_query;
        }
 
-       else if (!strcasecmp(el, "urn:ietf:params:xml:ns:caldav:calendar-query")) {
-               crp->report_type = cr_calendar_query;
+       // RFC4791 7.9 "calendar-multiget" REPORT - Client will supply a list of specific hrefs.
+       else if (!strcasecmp(el, "urn:ietf:params:xml:ns:caldav:calendar-multiget")) {
+               crp->report_type = cr_calendar_multiget;
        }
 
+       // RFC4791 7.10 "free-busy-query" REPORT
        else if (!strcasecmp(el, "urn:ietf:params:xml:ns:caldav:free-busy-query")) {
                crp->report_type = cr_freebusy_query;
        }
@@ -248,7 +251,8 @@ void caldav_report(struct http_transaction *h, struct ctdlsession *c) {
                ">"
        );
 
-       if (crp.Hrefs != NULL) {        // Output all qualifying calendar items!
+       // RFC4791 7.9 "calendar-multiget" REPORT - go get the specific Hrefs the client asked for.
+       if ( (crp.report_type == cr_calendar_multiget) && (crp.Hrefs != NULL) ) {
                StrBuf *ThisHref = NewStrBuf();
                const char *pvset = NULL;
                while (StrBufExtract_NextToken(ThisHref, crp.Hrefs, &pvset, '|') >= 0) {
@@ -267,3 +271,63 @@ void caldav_report(struct http_transaction *h, struct ctdlsession *c) {
        h->response_body_length = StrLength(ReportOut);
        h->response_body = SmashStrBuf(&ReportOut);
 }
+
+
+
+
+
+// Client is requesting a message list (make this code work for calendar-query REPORT)
+void XXXXXXXXXXXXXX(struct http_transaction *h, struct ctdlsession *c, char *range) {
+       char buf[SIZ];
+
+       // Determine the date/time range requested by the client
+       time_t lo = atol(range);
+       char *colon = strchr(range, ':');
+       time_t hi = colon ? atol(++colon) : LONG_MAX;
+
+       // Rule out impossible ranges
+       if (hi < lo) {
+               do_404(h);
+               return;
+       }
+
+       // Begin by requesting all messages in the room
+       int i = 0;
+       Array *msglist = get_msglist(c, "ALL");
+       if (msglist == NULL) {
+               do_404(h);
+               return;
+       }
+
+       // We're going to make a lot of MSG4 calls, and the preferred MIME type we want is "text/calendar".
+       // The iCalendar standard is mature now, and we are no longer interested in text/x-vcal or application/ics.
+       ctdl_printf(c, "MSGP text/calendar");
+       ctdl_readline(c, buf, sizeof buf);
+
+       // Iterate through our message list.
+       for (i = 0; i < array_len(msglist); ++i) {
+               long m;
+               memcpy(&m, array_get_element_at(msglist, i), sizeof(long));
+               syslog(LOG_DEBUG, "FIXME %ld", m);
+
+               // now we have to:
+               // 1. fetch the message from citadel server
+               // 2. parse the ical
+               // 3. figure out range
+               // we should steal code from webcit-classic for this
+
+               StrBuf *one_item;
+               one_item = fetch_ical(c, m);
+               syslog(LOG_DEBUG, "calendar item:\n---\n\033[33m%s\n---\033[0m", ChrPtr(one_item));
+               FreeStrBuf(&one_item);
+
+       }
+       array_free(msglist);
+
+       // FIXME we still fail because we aren't finished yet
+       add_response_header(h, strdup("Content-type"), strdup("application/json"));
+       h->response_code = 200;
+       h->response_string = strdup("OK");
+       h->response_body = "{ \"one\":111 , \"two\":222 , \"three\":333 }";
+       h->response_body_length = strlen(h->response_body);
+}