]> www.infradead.org Git - users/dwmw2/ews-sync.git/commitdiff
Handle multiple weekdays in WeeklyRecurrence
authorDavid Woodhouse <dwmw2@infradead.org>
Sun, 18 Jul 2010 22:07:32 +0000 (23:07 +0100)
committerDavid Woodhouse <dwmw2@infradead.org>
Sun, 18 Jul 2010 22:07:32 +0000 (23:07 +0100)
ews2ical.c

index 9296840d523531eefb50de59067b4a423195d589..102b5b2b13791fd168997648a880b5234ec27ba1 100644 (file)
@@ -883,10 +883,44 @@ int process_absolutemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencety
        return 0;
 }
 
+static int weekdays_to_recur_byday(const char *days, struct icalrecurrencetype *ical_recur)
+{
+       const char *space;
+       const char *day;
+       int count = 0;
+       int daynr;
+
+       do {
+               space = strchr(days, ' ');
+               if (space)
+                       day = strndup(days, space - days);
+               else
+                       day = days;
+
+               daynr = weekday_to_number(day, 7);
+               if (!daynr)
+                       return -1;
+
+               if (count == ICAL_BY_DAY_SIZE) {
+                       fprintf(stderr, "Too many days in DaysOfWeek list\n");
+                       return -1;
+               }
+
+               ical_recur->by_day[count++] = daynr;
+               if (space) {
+                       free((char *)day);
+                       days = space + 1;
+               }
+       } while (space);
+       return 0;
+}
+       
+
+
 int process_weeklyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur)
 {
        const char *interval = NULL, *weekday = NULL, *firstday = NULL;
-       int intervalnr, daynr, firstdaynr;
+       int intervalnr, firstdaynr;
 
        for (xml_node = xml_node->children; xml_node; xml_node = xml_node->next) {
                if (xml_node->type != XML_ELEMENT_NODE)
@@ -909,20 +943,19 @@ int process_weeklyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_
                fprintf(stderr, "Failed to parse Interval '%s'\n", interval);
                return -1;
        }
-       daynr = weekday_to_number(weekday, 7);
-       if (!daynr)
-               return -1;
-       
        if (firstday)
                firstdaynr = weekday_to_number(firstday, 7);
        else
                firstdaynr = 0;
 
        icalrecurrencetype_clear(ical_recur);
-       ical_recur->freq = ICAL_WEEKLY_RECURRENCE;
        ical_recur->interval = intervalnr;
-       ical_recur->by_day[0] = daynr;
        ical_recur->week_start = firstdaynr;
+
+       if (weekdays_to_recur_byday(weekday, ical_recur))
+               return -1;
+
+       ical_recur->freq = ICAL_WEEKLY_RECURRENCE;
        return 0;
 }
 int process_dailyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur)