From a7a11d4c7fc013b1e8e3c1bd5e01fcd03e222996 Mon Sep 17 00:00:00 2001 From: helge Date: Mon, 19 Sep 2005 22:17:56 +0000 Subject: [PATCH] improved byday support git-svn-id: http://svn.opengroupware.org/SOPE/trunk@1117 e4a50df8-12e2-0310-a44c-efbce7f8a7e3 --- sope-ical/NGiCal/ChangeLog | 5 +++ sope-ical/NGiCal/Version | 2 +- sope-ical/NGiCal/iCalRecurrenceRule.h | 4 ++ sope-ical/NGiCal/iCalRecurrenceRule.m | 62 ++++++++++++++++++++++++--- 4 files changed, 67 insertions(+), 6 deletions(-) diff --git a/sope-ical/NGiCal/ChangeLog b/sope-ical/NGiCal/ChangeLog index ebe1c60d..77a68ba4 100644 --- a/sope-ical/NGiCal/ChangeLog +++ b/sope-ical/NGiCal/ChangeLog @@ -1,3 +1,8 @@ +2005-09-20 Helge Hess + + * iCalRecurrenceRule.m: added some parsing/gen support for BYDAY + (v4.5.62) + 2005-09-19 Helge Hess * iCalRecurrenceRule.m: minor code improvements, more tolerant on diff --git a/sope-ical/NGiCal/Version b/sope-ical/NGiCal/Version index 1b755532..2075e285 100644 --- a/sope-ical/NGiCal/Version +++ b/sope-ical/NGiCal/Version @@ -2,7 +2,7 @@ MAJOR_VERSION=4 MINOR_VERSION=5 -SUBMINOR_VERSION:=61 +SUBMINOR_VERSION:=62 # v4.5.40 requires NGExtensions v4.5.145 # v4.5.37 requires NGExtensions v4.5.140 diff --git a/sope-ical/NGiCal/iCalRecurrenceRule.h b/sope-ical/NGiCal/iCalRecurrenceRule.h index 9cc99901..45d42b75 100644 --- a/sope-ical/NGiCal/iCalRecurrenceRule.h +++ b/sope-ical/NGiCal/iCalRecurrenceRule.h @@ -34,6 +34,7 @@ Please see the unit tests for what is covered. */ +// TODO: we could use string constants? typedef enum { iCalRecurrenceFrequenceSecondly = 1, iCalRecurrenceFrequenceMinutely = 2, @@ -65,7 +66,10 @@ typedef enum { struct { unsigned weekStart: 7; unsigned mask: 7; + unsigned useOccurence:1; + unsigned reserved:1; } byDay; + int byDayOccurence1; NSString *rrule; } diff --git a/sope-ical/NGiCal/iCalRecurrenceRule.m b/sope-ical/NGiCal/iCalRecurrenceRule.m index 55a1a1db..7a03c467 100644 --- a/sope-ical/NGiCal/iCalRecurrenceRule.m +++ b/sope-ical/NGiCal/iCalRecurrenceRule.m @@ -144,7 +144,7 @@ if (c0 == 'f' || c0 == 'F') return iCalWeekDayFriday; c1 = [_day characterAtIndex:1]; - if (c0 == 't' || c0 == 't') { + if (c0 == 't' || c0 == 'T') { if (c1 == 'u' || c1 == 'U') return iCalWeekDayTuesday; if (c1 == 'h' || c1 == 'H') return iCalWeekDayThursday; } @@ -206,7 +206,7 @@ NSMutableString *s; unsigned i, mask, day; BOOL needsComma; - + s = [NSMutableString stringWithCapacity:20]; needsComma = NO; mask = self->byDay.mask; @@ -216,6 +216,10 @@ if (mask & day) { if (needsComma) [s appendString:@","]; + else if (self->byDay.useOccurence) + // Note: we only support one occurrence currently + [s appendFormat:@"%i", self->byDayOccurence1]; + [s appendString:[self iCalRepresentationForWeekDay:day]]; needsComma = YES; } @@ -260,6 +264,7 @@ /* properties */ - (void)setFreq:(NSString *)_freq { + // TODO: shouldn't we preserve what the user gives us? _freq = [_freq uppercaseString]; if ([_freq isEqualToString:@"WEEKLY"]) self->frequency = iCalRecurrenceFrequenceWeekly; @@ -299,17 +304,60 @@ } - (void)setByday:(NSString *)_byDayList { + // TODO: each day can have an associated occurence, eg: + // +1MO,+2TU,-9WE NSArray *days; unsigned i, count; - + + /* reset mask */ self->byDay.mask = 0; + self->byDay.useOccurence = 0; + self->byDayOccurence1 = 0; + days = [_byDayList componentsSeparatedByString:@","]; for (i = 0, count = [days count]; i < count; i++) { NSString *iCalDay; iCalWeekDay day; + unsigned len; + unichar c0; + int occurence; + + iCalDay = [days objectAtIndex:i]; // eg: MO or TU + if ((len = [iCalDay length]) == 0) { + [self errorWithFormat:@"found an empty day in byday list: '%@'", + _byDayList]; + continue; + } + + c0 = [iCalDay characterAtIndex:0]; + if (((c0 == '+' || c0 == '-') && len > 2) || (isdigit(c0) && len > 1)) { + int offset; + + occurence = [iCalDay intValue]; + + offset = 1; + while (offset < len && isdigit([iCalDay characterAtIndex:offset])) + offset++; + + iCalDay = [iCalDay substringFromIndex:offset]; + + if (self->byDay.useOccurence) { + [self errorWithFormat: + @"we only supported one occurence (occ=%i,day=%@): '%@'", + occurence, iCalDay, _byDayList]; + continue; + } + + self->byDay.useOccurence = 1; + self->byDayOccurence1 = occurence; + } + else if (self->byDay.useOccurence) { + [self errorWithFormat: + @"a byday occurence was specified on one day, but not on others" + @" (unsupported): '%@'", _byDayList]; + } - iCalDay = [days objectAtIndex:i]; - day = [self weekDayFromICalRepresentation:iCalDay]; + day = [self weekDayFromICalRepresentation:iCalDay]; self->byDay.mask |= day; } } @@ -354,4 +402,8 @@ return s; } +- (NSString *)description { + return [self iCalRepresentation]; +} + @end /* iCalRecurrenceRule */ -- 2.39.5