From: Art Cancro Date: Wed, 7 Feb 2024 01:43:19 +0000 (-0500) Subject: Moved multiget output into its own function. X-Git-Tag: v999~53 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=20f4dc22b7a4100cb1cda8aaa9e8678bdffa58e3 Moved multiget output into its own function. This will allow the output code to remain DRY when it is called by several different REPORT types. --- diff --git a/webcit-ng/server/caldav_reports.c b/webcit-ng/server/caldav_reports.c index de35081a8..2afade351 100644 --- a/webcit-ng/server/caldav_reports.c +++ b/webcit-ng/server/caldav_reports.c @@ -127,26 +127,9 @@ StrBuf *fetch_ical(struct ctdlsession *c, long msgnum) { } -// Called by caldav_report() to output a single item. -// Our policy is to throw away the list of properties the client asked for, and just send everything. -void caldav_report_one_item(struct http_transaction *h, struct ctdlsession *c, StrBuf *ReportOut, StrBuf *ThisHref) { - long msgnum; - StrBuf *Caldata = NULL; - char *euid; - - euid = strrchr(ChrPtr(ThisHref), '/'); - if (euid != NULL) { - ++euid; - } - else { - euid = (char *) ChrPtr(ThisHref); - } - - char *unescaped_euid = strdup(euid); - if (!unescaped_euid) { - return; - } - unescape_input(unescaped_euid); +// Called by multiple REPORT types to actually perform the output in "multiget" format. +// We need to already know the source message number and the href, but also already have the output data. +void cal_multiget_out(long msgnum, StrBuf *ThisHref, StrBuf *Caldata, StrBuf *ReportOut) { StrBufAppendPrintf(ReportOut, ""); StrBufAppendPrintf(ReportOut, ""); @@ -154,12 +137,6 @@ void caldav_report_one_item(struct http_transaction *h, struct ctdlsession *c, S StrBufAppendPrintf(ReportOut, ""); StrBufAppendPrintf(ReportOut, ""); - msgnum = locate_message_by_uid(c, unescaped_euid); - free(unescaped_euid); - if (msgnum > 0) { - Caldata = fetch_ical(c, msgnum); - } - if (Caldata != NULL) { // syslog(LOG_DEBUG, "caldav_report_one_item(%s) 200 OK", ChrPtr(ThisHref)); StrBufAppendPrintf(ReportOut, ""); @@ -188,6 +165,40 @@ void caldav_report_one_item(struct http_transaction *h, struct ctdlsession *c, S } +// Called by caldav_report() to output a single item. +// Our policy is to throw away the list of properties the client asked for, and just send everything. +void caldav_report_one_item(struct http_transaction *h, struct ctdlsession *c, StrBuf *ReportOut, StrBuf *ThisHref) { + long msgnum; + StrBuf *Caldata = NULL; + char *euid; + + euid = strrchr(ChrPtr(ThisHref), '/'); + if (euid != NULL) { + ++euid; + } + else { + euid = (char *) ChrPtr(ThisHref); + } + + char *unescaped_euid = strdup(euid); + if (!unescaped_euid) { + return; + } + unescape_input(unescaped_euid); + + msgnum = locate_message_by_uid(c, unescaped_euid); + free(unescaped_euid); + if (msgnum > 0) { + Caldata = fetch_ical(c, msgnum); + } + else { + Caldata = NULL; + } + + cal_multiget_out(msgnum, ThisHref, Caldata, ReportOut); +} + + // Called by report_the_room_itself() in room_functions.c when a CalDAV REPORT method // is requested on a calendar room. We fire up an XML Parser to decode the request and // hopefully produce the correct output. @@ -240,8 +251,17 @@ void caldav_report(struct http_transaction *h, struct ctdlsession *c) { for (i = 0; i < array_len(msglist); ++i) { long m; memcpy(&m, array_get_element_at(msglist, i), sizeof(long)); - TRACE; + + // Begin -- evaluate the calendar item + syslog(LOG_DEBUG, "evaluating message %ld", m); + 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); + + // End - evaluate the calendar item + } array_free(msglist); } @@ -279,63 +299,3 @@ 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); -}