From: Art Cancro Date: Thu, 25 Jan 2024 16:37:39 +0000 (-0500) Subject: Rearranging code to prepare for multiple REPORT types X-Git-Tag: v997~10 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=bcdcc6d9a5f4d5f1a86d1fc725a2ce787f1d92f8 Rearranging code to prepare for multiple REPORT types --- diff --git a/webcit-ng/server/caldav_reports.c b/webcit-ng/server/caldav_reports.c index 1031a4685..d253b777b 100644 --- a/webcit-ng/server/caldav_reports.c +++ b/webcit-ng/server/caldav_reports.c @@ -24,7 +24,7 @@ struct cr_parms { int tag_nesting_level; // not needed, just kept for pretty-printing enum cr_type report_type; // which RFC4791 section 7 REPORT are we generating StrBuf *Chardata; // XML chardata in between tags is built up here - StrBuf *Hrefs; // list of items requested by a calendar-multiget report + StrBuf *Hrefs; // list of items requested by a `calendar-multiget` REPORT }; @@ -99,7 +99,7 @@ void caldav_xml_chardata(void *data, const XML_Char * s, int len) { } -// Called by caldav_response() to fetch a message (by number) in the current room, +// Called by caldav_report_one_item() to fetch a message (by number) in the current room, // and return only the icalendar data as a StrBuf. Returns NULL if not found. // // NOTE: this function expects that "MSGP text/calendar" was issued at the beginning @@ -115,7 +115,7 @@ StrBuf *fetch_ical(struct ctdlsession *c, long msgnum) { } while (ctdl_readline(c, buf, sizeof(buf)), strcmp(buf, "000")) { - if (Buf != NULL) { // already in body + if (Buf != NULL) { // already in body StrBufAppendPrintf(Buf, "%s\n", buf); } else if (IsEmptyStr(buf)) { // beginning of body @@ -124,31 +124,12 @@ StrBuf *fetch_ical(struct ctdlsession *c, long msgnum) { } return Buf; - -// webcit[13039]: msgn=53CE87AF-00392161@uncensored.citadel.org -// webcit[13039]: path=IGnatius T Foobar -// webcit[13039]: time=1208008800 -// webcit[13039]: from=IGnatius T Foobar -// webcit[13039]: room=0000000001.Calendar -// webcit[13039]: node=uncnsrd -// webcit[13039]: hnod=Uncensored -// webcit[13039]: exti=040000E00074C5B7101A82E0080000000080C728F83E84C801000000000000000010000000E857E0DC57F53947ADF0BB91EE3A502F -// webcit[13039]: subj==?UTF-8?B?V2VzbGV5J3MgYmlydGhkYXkgcGFydHk= -// webcit[13039]: ?= -// webcit[13039]: part=||1||text/calendar|1127|| -// webcit[13039]: text -// webcit[13039]: Content-type: text/calendar -// webcit[13039]: Content-length: 1127 -// webcit[13039]: Content-transfer-encoding: 7bit -// webcit[13039]: X-Citadel-MSG4-Partnum: 1 -// webcit[13039]: -// webcit[13039]: BEGIN:VCALENDAR } // 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_response(struct http_transaction *h, struct ctdlsession *c, StrBuf *ReportOut, StrBuf *ThisHref) { +void caldav_report_one_item(struct http_transaction *h, struct ctdlsession *c, StrBuf *ReportOut, StrBuf *ThisHref) { long msgnum; StrBuf *Caldata = NULL; char *euid; @@ -180,7 +161,7 @@ void caldav_response(struct http_transaction *h, struct ctdlsession *c, StrBuf * } if (Caldata != NULL) { - // syslog(LOG_DEBUG, "caldav_response(%s) 200 OK", ChrPtr(ThisHref)); + // syslog(LOG_DEBUG, "caldav_report_one_item(%s) 200 OK", ChrPtr(ThisHref)); StrBufAppendPrintf(ReportOut, ""); StrBufAppendPrintf(ReportOut, "HTTP/1.1 200 OK"); StrBufAppendPrintf(ReportOut, ""); @@ -196,7 +177,7 @@ void caldav_response(struct http_transaction *h, struct ctdlsession *c, StrBuf * Caldata = NULL; } else { - // syslog(LOG_DEBUG, "caldav_response(%s) 404 not found", ChrPtr(ThisHref)); + // syslog(LOG_DEBUG, "caldav_report_one_item(%s) 404 not found", ChrPtr(ThisHref)); StrBufAppendPrintf(ReportOut, ""); StrBufAppendPrintf(ReportOut, "HTTP/1.1 404 not found"); StrBufAppendPrintf(ReportOut, ""); @@ -251,15 +232,29 @@ void caldav_report(struct http_transaction *h, struct ctdlsession *c) { ">" ); + // RFC4791 7.8 "calendar-query" REPORT - Client will send a lot of search criteria. + if (crp.report_type == cr_calendar_query) { + // FIXME build this REPORT. At the moment we send an empty multistatus. + } + // 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) ) { + else 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) { StrBufTrim(ThisHref); // remove leading/trailing whitespace from the href - caldav_response(h, c, ReportOut, ThisHref); + caldav_report_one_item(h, c, ReportOut, ThisHref); } FreeStrBuf(&ThisHref); + } + + // RFC4791 7.10 "free-busy-query" REPORT + else if (crp.report_type == cr_freebusy_query) { + // FIXME build this REPORT. At the moment we send an empty multistatus. + } + + // Free any query parameters that might have been allocated during the xml parse + if (crp.Hrefs != NULL) { FreeStrBuf(&crp.Hrefs); crp.Hrefs = NULL; } diff --git a/webcit-ng/server/webcit.h b/webcit-ng/server/webcit.h index 57f242f83..908048ee1 100644 --- a/webcit-ng/server/webcit.h +++ b/webcit-ng/server/webcit.h @@ -150,9 +150,8 @@ void caldav_xml_start(void *, const char *, const char **); void caldav_xml_end(void *, const char *); void caldav_xml_chardata(void *, const XML_Char *, int); StrBuf *fetch_ical(struct ctdlsession *, long); -void caldav_response(struct http_transaction *, struct ctdlsession *, StrBuf *, StrBuf *); +void caldav_report_one_item(struct http_transaction *, struct ctdlsession *, StrBuf *, StrBuf *); void caldav_report(struct http_transaction *, struct ctdlsession *); -void XXXXXXXXXXXXXX(struct http_transaction *, struct ctdlsession *, char *); // ctdlclient.c int ctdl_read_binary(struct ctdlsession *, char *, int);