X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit-ng%2Fserver%2Fcaldav_reports.c;h=edd0b4558cffc0742568fe82bf73885cca4b9c80;hb=d837babd310852f5e1360b368fab8d59877939a1;hp=70a4e8095722d8312f763319bdf07a72f6ad97f5;hpb=491081a15e7f711852a96cfb9396048b53a23a14;p=citadel.git diff --git a/webcit-ng/server/caldav_reports.c b/webcit-ng/server/caldav_reports.c index 70a4e8095..edd0b4558 100644 --- a/webcit-ng/server/caldav_reports.c +++ b/webcit-ng/server/caldav_reports.c @@ -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); +}