]> code.citadel.org Git - citadel.git/blobdiff - webcit-ng/server/caldav_reports.c
Improved logging of XML parse
[citadel.git] / webcit-ng / server / caldav_reports.c
index f042c70311388b6194752a7f40a30374ef097af1..e6a13cef009f3e0eaff57442ea878221d6ff9433 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,23 @@ 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;
 
+#ifdef DEBUG_XML_PARSE
+       // logging
+       int i;
+       char indent[256];
+       indent[0] = 0;
+       for (i=0; i<crp->tag_nesting_level; ++i) {
+               strcat(indent, "  ");
+       }
        if (crp->Chardata != NULL) {
-               // syslog(LOG_DEBUG, "CALDAV CHARDATA     : %s", ChrPtr(crp->Chardata));
+               syslog(LOG_DEBUG, "%sCHARDATA: '%s'", indent, ChrPtr(crp->Chardata));
        }
-       // 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
@@ -224,7 +239,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;
        }
@@ -258,10 +273,15 @@ void caldav_report(struct http_transaction *h, struct ctdlsession *c) {
                                StrBuf *one_item = fetch_ical(c, m);
                                icalcomponent *cal = icalcomponent_new_from_string(ChrPtr(one_item));
 
-                               // this is a horrible temporary hack to output every item
-                               int qualify = 1;
+                               // qualify will be set to nonzero if this calendar item is a match for the QUERY.
+                               int qualify = 0;
+
+                               // 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);
                                }