From d1afd18903200577308e5bdf504f061e03af15d1 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Sun, 18 Jul 2010 23:07:32 +0100 Subject: [PATCH] Handle multiple weekdays in WeeklyRecurrence --- ews2ical.c | 47 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/ews2ical.c b/ews2ical.c index 9296840..102b5b2 100644 --- a/ews2ical.c +++ b/ews2ical.c @@ -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) -- 2.50.1