]> www.infradead.org Git - users/dwmw2/ews-sync.git/commitdiff
Fix handling of first/second/third/fourth/last day/weekday/weekendday
authorDavid Woodhouse <dwmw2@infradead.org>
Sun, 18 Jul 2010 21:44:45 +0000 (22:44 +0100)
committerDavid Woodhouse <dwmw2@infradead.org>
Sun, 18 Jul 2010 21:44:45 +0000 (22:44 +0100)
ews2ical.c

index ce672bb158e7f2205c9fe3079e2fc5b498a92c00..9296840d523531eefb50de59067b4a423195d589 100644 (file)
@@ -376,16 +376,15 @@ static int month_to_number(const char *month)
        fprintf(stderr, "Unrecognised month name '%s'\n", month);
        return 0;
 }
-static int weekday_to_number(const char *day)
+static int weekday_to_number(const char *day, int accept)
 {
        static char *days[] = {
                "Sunday", "Monday", "Tuesday", "Wednesday",
                "Thursday", "Friday", "Saturday",
-               /* "Day", "Weekday", "WeekendDay" */
-
+               "Day", "Weekday", "WeekendDay"
        };
        int daynr;
-       for (daynr = 0; daynr < 7; daynr++) {
+       for (daynr = 0; daynr < accept; daynr++) {
                if (!strcmp(day, days[daynr]))
                        return daynr + 1;
        }
@@ -721,17 +720,34 @@ int process_relativeyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetyp
        if (!weeknr)
                return -1;
 
-       daynr = weekday_to_number(weekday);
+       daynr = weekday_to_number(weekday, 10);
        if (!daynr)
                return -1;
 
        icalrecurrencetype_clear(ical_recur);
        ical_recur->freq = ICAL_YEARLY_RECURRENCE;
        ical_recur->by_month[0] = monthnr;
-       if (weeknr > 0)
-               ical_recur->by_day[0] = daynr + (weeknr * 8);
-       else
-               ical_recur->by_day[0] = -8 - daynr;
+
+
+       if (daynr < 8) {
+               if (weeknr > 0)
+                       ical_recur->by_day[0] = daynr + (weeknr * 8);
+               else
+                       ical_recur->by_day[0] = -8 - daynr;
+       } else if (daynr == 8) { /* Day */
+               ical_recur->by_month_day[0] = weeknr;
+       } else if (daynr == 9) { /* Weekday */
+               ical_recur->by_day[0] = 2;
+               ical_recur->by_day[1] = 3;
+               ical_recur->by_day[2] = 4;
+               ical_recur->by_day[3] = 5;
+               ical_recur->by_day[4] = 6;
+               ical_recur->by_set_pos[0] = weeknr;
+       } else if (daynr == 10) { /* WeekendDay */
+               ical_recur->by_day[0] = 1;
+               ical_recur->by_day[1] = 7;
+               ical_recur->by_set_pos[0] = weeknr;
+       }               
 
        return 0;
 }
@@ -801,18 +817,33 @@ int process_relativemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencety
        if (!weeknr)
                return -1;
 
-       daynr = weekday_to_number(weekday);
+       daynr = weekday_to_number(weekday, 10);
        if (!daynr)
                return -1;
 
        icalrecurrencetype_clear(ical_recur);
        ical_recur->freq = ICAL_MONTHLY_RECURRENCE;
        ical_recur->interval = intervalnr;
-       if (weeknr > 0)
-               ical_recur->by_day[0] = daynr + (weeknr * 8);
-       else
-               ical_recur->by_day[0] = -8 - daynr;
-
+       if (daynr < 8) {
+               if (weeknr > 0)
+                       ical_recur->by_day[0] = daynr + (weeknr * 8);
+               else
+                       ical_recur->by_day[0] = -8 - daynr;
+       } else if (daynr == 8) { /* Day */
+               ical_recur->by_month_day[0] = weeknr;
+       } else if (daynr == 9) { /* Weekday */
+               ical_recur->by_day[0] = 2;
+               ical_recur->by_day[1] = 3;
+               ical_recur->by_day[2] = 4;
+               ical_recur->by_day[3] = 5;
+               ical_recur->by_day[4] = 6;
+               ical_recur->by_set_pos[0] = weeknr;
+       } else if (daynr == 10) { /* WeekendDay */
+               ical_recur->by_day[0] = 1;
+               ical_recur->by_day[1] = 7;
+               ical_recur->by_set_pos[0] = weeknr;
+       }               
+                                
        return 0;
 }
 int process_absolutemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur)
@@ -878,12 +909,12 @@ 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);
+       daynr = weekday_to_number(weekday, 7);
        if (!daynr)
                return -1;
        
        if (firstday)
-               firstdaynr = weekday_to_number(firstday);
+               firstdaynr = weekday_to_number(firstday, 7);
        else
                firstdaynr = 0;