From 905fad4c32a36d066743b809235cf989016f8f93 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Fri, 16 Jul 2010 22:50:42 +0100 Subject: [PATCH] Attempt to handle recurrence --- ews2ical.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 3 deletions(-) diff --git a/ews2ical.c b/ews2ical.c index efe2c5e..91c4e69 100644 --- a/ews2ical.c +++ b/ews2ical.c @@ -7,6 +7,7 @@ #include #include #include +#include FILE *calfile; @@ -18,7 +19,7 @@ int process_end(xmlNode *xml_node); int process_location(xmlNode *xml_node); int process_body(xmlNode *xml_node); int process_subject(xmlNode *xml_node); - +int process_recurrence(xmlNode *xml_node); int main(int argc, char **argv) { @@ -140,6 +141,8 @@ int main(int argc, char **argv) process_location(xml_node); else if (!strcmp((char *)xml_node->name, "Subject")) process_subject(xml_node); + else if (!strcmp((char *)xml_node->name, "Recurrence")) + process_recurrence(xml_node); else fprintf(stderr, "Unhandled node type '%s'\n", xml_node->name); } @@ -257,12 +260,12 @@ int process_location (xmlNode *xml_node) int process_body(xmlNode *xml_node) { const char *body = (char *)xmlNodeGetContent(xml_node); - int col = 12; + int col; if (!body) return -1; - fprintf(calfile, "DESCRIPTION:"); + col = fprintf(calfile, "DESCRIPTION:"); while (*body) { switch (*body) { @@ -295,3 +298,59 @@ int process_subject(xmlNode *xml_node) fprintf(calfile, "SUMMARY:\"%s\"\n", subject); return 0; } + +int process_recurrence(xmlNode *xml_node) +{ + xmlNode *xml_node2; + const char *weekly_interval = NULL; + const char *weekday = NULL; + const char *end_date = NULL; + + for (xml_node = xml_node->children; xml_node; xml_node = xml_node->next) { + if (xml_node->type != XML_ELEMENT_NODE) + continue; + if (!strcmp((char *)xml_node->name, "WeeklyRecurrence")) { + for (xml_node2 = xml_node->children; xml_node2; + xml_node2 = xml_node2->next) { + if (xml_node2->type != XML_ELEMENT_NODE) + continue; + if (!strcmp((char *)xml_node2->name, "Interval")) + weekly_interval = (char *)xmlNodeGetContent(xml_node2); + else if (!strcmp((char *)xml_node2->name, "DaysOfWeek")) + weekday = (char *)xmlNodeGetContent(xml_node2); + } + } else if (!strcmp((char *)xml_node->name, "EndDateRecurrence")) { + for (xml_node2 = xml_node->children; xml_node2; + xml_node2 = xml_node2->next) { + if (xml_node2->type != XML_ELEMENT_NODE) + continue; + if (!strcmp((char *)xml_node2->name, "EndDate")) + end_date = (char *)xmlNodeGetContent(xml_node2); + } + } + } + if (weekly_interval && weekday && end_date) { + char enddate_cal[9]; + char day[3]; + day[0] = toupper(weekday[0]); + day[1] = toupper(weekday[1]); + day[2] = 0; + + enddate_cal[0] = end_date[0]; + enddate_cal[1] = end_date[1]; + enddate_cal[2] = end_date[2]; + enddate_cal[3] = end_date[3]; + + enddate_cal[4] = end_date[5]; + enddate_cal[5] = end_date[6]; + + enddate_cal[6] = end_date[8]; + enddate_cal[7] = end_date[9]; + enddate_cal[8] = 0; + + fprintf(calfile, "RRULE:FREQ=WEEKLY;UNTIL=%sT235959Z;INTERVAL=%s;BYDAY=%s;WKST=SU\n", + enddate_cal, weekly_interval, day); + return 0; + } + return -1; +} -- 2.49.0