]> www.infradead.org Git - users/dwmw2/ews-sync.git/commitdiff
Attempt to handle recurrence
authorDavid Woodhouse <dwmw2@infradead.org>
Fri, 16 Jul 2010 21:50:42 +0000 (22:50 +0100)
committerDavid Woodhouse <dwmw2@infradead.org>
Fri, 16 Jul 2010 21:50:42 +0000 (22:50 +0100)
ews2ical.c

index efe2c5e6f6fefffa25d9773ecefb8cf0b8fdd183..91c4e69febdf8f7f4b985334152f7e3351d41d2e 100644 (file)
@@ -7,6 +7,7 @@
 #include <stdio.h>
 #include <unistd.h>
 #include <string.h>
+#include <ctype.h>
 
 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;
+}