]> code.citadel.org Git - citadel.git/blobdiff - webcit-ng/server/caldav_reports.c
more logging and chardata stuff
[citadel.git] / webcit-ng / server / caldav_reports.c
index 2afade3515a952a5a69672f1cd4b01c9f638f6c3..15a05dccf50c6e63de5d2237b434af6729ee365a 100644 (file)
@@ -1,10 +1,6 @@
-// This file contains functions which handle all of the CalDAV "REPORT" queries
-// specified in RFC4791 section 7.
-//
+// This file contains functions which handle all of the CalDAV "REPORT" queries specified in RFC4791 section 7.
 // 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.
+// This program is open source software.  Use, duplication, or disclosure is subject to the GNU General Public License v3.
 
 #include "webcit.h"
 
@@ -31,13 +27,21 @@ struct cr_parms {
 // XML parser callback
 void caldav_xml_start(void *data, const char *el, const char **attr) {
        struct cr_parms *crp = (struct cr_parms *) data;
-       int i;
-
-       // syslog(LOG_DEBUG, "CALDAV ELEMENT START: <%s> %d", el, crp->tag_nesting_level);
 
+#ifdef DEBUG_XML_PARSE
+       // logging
+       int i;
+       char indent[256];
+       indent[0] = 0;
+       for (i=0; i<crp->tag_nesting_level; ++i) {
+               strcat(indent, "··");
+       }
+       syslog(LOG_DEBUG, "%s<%s>", indent, el);
        for (i = 0; attr[i] != NULL; i += 2) {
-               syslog(LOG_DEBUG, "                    Attribute '%s' = '%s'", attr[i], attr[i + 1]);
+               syslog(LOG_DEBUG, "%sAttribute '%s' = '%s'", indent, attr[i], attr[i + 1]);
        }
+       // end logging
+#endif
 
        // 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")) {
@@ -61,12 +65,20 @@ void caldav_xml_start(void *data, const char *el, const char **attr) {
 // XML parser callback
 void caldav_xml_end(void *data, const char *el) {
        struct cr_parms *crp = (struct cr_parms *) data;
+
        --crp->tag_nesting_level;
 
-       if (crp->Chardata != NULL) {
-               // syslog(LOG_DEBUG, "CALDAV CHARDATA     : %s", ChrPtr(crp->Chardata));
+#ifdef DEBUG_XML_PARSE
+       // logging
+       int i;
+       char indent[256];
+       indent[0] = 0;
+       for (i=0; i<crp->tag_nesting_level; ++i) {
+               strcat(indent, "··");
        }
-       // syslog(LOG_DEBUG, "CALDAV ELEMENT END  : <%s> %d", el, crp->tag_nesting_level);
+       syslog(LOG_DEBUG, "%s</%s>", indent, el);
+       // end logging
+#endif
 
        if ((!strcasecmp(el, "DAV::href")) || (!strcasecmp(el, "DAV:href"))) {
                if (crp->Hrefs == NULL) {       // append crp->Chardata to crp->Hrefs
@@ -86,14 +98,34 @@ void caldav_xml_end(void *data, const char *el) {
 
 
 // XML parser callback
-void caldav_xml_chardata(void *data, const XML_Char * s, int len) {
+void caldav_xml_chardata(void *data, const XML_Char *s, int len) {
        struct cr_parms *crp = (struct cr_parms *) data;
 
+       char *app = malloc(len+1);
+       if (!app) {
+               return;
+       }
+       memcpy(app, s, len);
+       app[len] = 0;
+
+#ifdef DEBUG_XML_PARSE
+       // logging
+       int i;
+       char indent[256];
+       indent[0] = 0;
+       for (i=0; i<crp->tag_nesting_level; ++i) {
+               strcat(indent, "··");
+       }
+       syslog(LOG_DEBUG, "%s%s", indent, app, len);
+       // end logging
+#endif
+
        if (crp->Chardata == NULL) {
                crp->Chardata = NewStrBuf();
        }
 
-       StrBufAppendBufPlain(crp->Chardata, s, len, 0);
+       StrBufAppendBufPlain(crp->Chardata, app, len, 0);
+       free(app);
 
        return;
 }
@@ -150,8 +182,6 @@ void cal_multiget_out(long msgnum, StrBuf *ThisHref, StrBuf *Caldata, StrBuf *Re
                StrBufXMLEscAppend(ReportOut, Caldata, NULL, 0, 0);
                StrBufAppendPrintf(ReportOut, "</C:calendar-data>");
                StrBufAppendPrintf(ReportOut, "</D:prop>");
-               FreeStrBuf(&Caldata);
-               Caldata = NULL;
        }
        else {
                // syslog(LOG_DEBUG, "caldav_report_one_item(%s) 404 not found", ChrPtr(ThisHref));
@@ -196,6 +226,10 @@ void caldav_report_one_item(struct http_transaction *h, struct ctdlsession *c, S
        }
 
        cal_multiget_out(msgnum, ThisHref, Caldata, ReportOut);
+
+       if (Caldata != NULL) {
+               FreeStrBuf(&Caldata);
+       }
 }
 
 
@@ -222,7 +256,7 @@ void caldav_report(struct http_transaction *h, struct ctdlsession *c) {
        XML_Parse(xp, h->request_body, h->request_body_length, 1);
        XML_ParserFree(xp);
 
-       if (crp.Chardata != NULL) {     // Discard any trailing chardata ... normally nothing here
+       if (crp.Chardata != NULL) {             // Discard any trailing chardata ... normally nothing here
                FreeStrBuf(&crp.Chardata);
                crp.Chardata = NULL;
        }
@@ -252,15 +286,24 @@ void caldav_report(struct http_transaction *h, struct ctdlsession *c) {
                                long m;
                                memcpy(&m, array_get_element_at(msglist, i), sizeof(long));
 
-                               // Begin -- evaluate the calendar item
+                               // load and parse one calendar item
+                               StrBuf *one_item = fetch_ical(c, m);
+                               icalcomponent *cal = icalcomponent_new_from_string(ChrPtr(one_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);
+                               // qualify will be set to nonzero if this calendar item is a match for the QUERY.
+                               int qualify = 0;
 
-                               // End - evaluate the calendar item
+                               // this is a horrible temporary hack to output every item (for now)
+                               qualify = 1;
+
+                               // Did this calendar item match the query?  If so, output it.
+                               if (qualify) {
+                                       // FIXME need to populate the Href instead of NULL
+                                       cal_multiget_out(m, NULL, one_item, ReportOut);
+                               }
+
+                               icalcomponent_free(cal);
+                               FreeStrBuf(&one_item);
 
                        }
                        array_free(msglist);