]> err.no Git - sope/blobdiff - sope-ical/NGiCal/iCalRecurrenceRule.m
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@1201 e4a50df8-12e2-0310-a44c...
[sope] / sope-ical / NGiCal / iCalRecurrenceRule.m
index f437738a57e707ab7083a3aa6ac7474aaba576f9..15f6e700e5fde11b7c45fc64280787c5fb236507 100644 (file)
@@ -80,6 +80,7 @@
 }
 
 - (void)dealloc {
+  [self->byMonthDay release];
   [self->untilDate release];
   [self->rrule     release];
   [super dealloc];
 }
 
 - (void)setUntilDate:(NSCalendarDate *)_untilDate {
-  ASSIGN(self->untilDate, _untilDate);
+  ASSIGNCOPY(self->untilDate, _untilDate);
 }
 - (NSCalendarDate *)untilDate {
   return self->untilDate;
   return self->byDayOccurence1;
 }
 
+- (NSArray *)byMonthDay {
+  return self->byMonthDay;
+}
+
 - (BOOL)isInfinite {
   return (self->repeatCount != 0 || self->untilDate) ? NO : YES;
 }
 */
 - (NSString *)byDayList {
   NSMutableString *s;
-  unsigned        i, mask, day;
+  unsigned        dow, mask, day;
   BOOL            needsComma;
   
   s          = [NSMutableString stringWithCapacity:20];
   mask       = self->byDay.mask;
   day        = iCalWeekDayMonday;
   
-  for (i = 0; i < 7; i++) {
+  for (dow = 0 /* Sun */; dow < 7; dow++) {
     if (mask & day) {
       if (needsComma)
         [s appendString:@","];
-      else if (self->byDay.useOccurence)
-       // Note: we only support one occurrence currently
+      
+      if (self->byDay.useOccurence)
+       // Note: we only support one occurrence for all currently
        [s appendFormat:@"%i", self->byDayOccurence1];
       
       [s appendString:[self iCalRepresentationForWeekDay:day]];
   NSString *pUntil     = nil;
   NSString *pCount     = nil;
   NSString *pByday     = nil;
+  NSString *pBymday    = nil;
   NSString *pBysetpos  = nil;
+  NSString *pInterval  = nil;
   
   props = [_rrule componentsSeparatedByString:@";"];
   for (i = 0, count = [props count]; i < count; i++) {
     vHolder = NULL;
     switch ([key characterAtIndex:0]) {
     case 'b':
-      if ([key isEqualToString:@"byday"])    vHolder = &pByday;    break;
-      if ([key isEqualToString:@"bysetpos"]) vHolder = &pBysetpos; break;
+      if ([key isEqualToString:@"byday"])      { vHolder = &pByday;    break; }
+      if ([key isEqualToString:@"bymonthday"]) { vHolder = &pBymday;   break; }
+      if ([key isEqualToString:@"bysetpos"])   { vHolder = &pBysetpos; break; }
       break;
     case 'c':
-      if ([key isEqualToString:@"count"])    vHolder = &pCount;    break;
+      if ([key isEqualToString:@"count"]) { vHolder = &pCount; break; }
       break;
     case 'f':
-      if ([key isEqualToString:@"freq"]) vHolder = &pFrequency; break;
+      if ([key isEqualToString:@"freq"]) { vHolder = &pFrequency; break; }
+      break;
+    case 'i':
+      if ([key isEqualToString:@"interval"]) { vHolder = &pInterval; break; }
       break;
     case 'u':
-      if ([key isEqualToString:@"until"]) vHolder = &pUntil; break;
+      if ([key isEqualToString:@"until"]) { vHolder = &pUntil; break; }
       break;
     default:
       break;
     else {
       // TODO: we should just parse known keys and put remainders into a
       //       separate dictionary
-      //[self logWithFormat:@"TODO: add explicit support for key: %@", key];
+      [self logWithFormat:@"TODO: add explicit support for key: %@", key];
       [self takeValue:value forKey:key];
     }
   }
     [self errorWithFormat:@"rrule contains no frequency: '%@'", _rrule];
   [pFrequency release]; pFrequency = nil;
   
+  if (pInterval != nil)
+    self->interval = [pInterval intValue];
+  [pInterval release]; pInterval = nil;
+  
   // TODO: we should parse byday in here
   if (pByday != nil) [self setByday:pByday];
   [pByday release]; pByday = nil;
+
+  if (pBymday != nil) {
+    NSArray *t;
+    
+    t = [pBymday componentsSeparatedByString:@","];
+    ASSIGNCOPY(self->byMonthDay, t);
+  }
+  [pBymday release]; pBymday = nil;
   
   if (pBysetpos != nil)
     // TODO: implement
          UTC time format."
       TODO: we still need some object representing a 'timeless' date.
     */
-    if (![pUntil hasSuffix:@"Z"]) {
+    if (![pUntil hasSuffix:@"Z"] && [pUntil length] > 8) {
       [self warnWithFormat:@"'until' date has no explicit UTC marker: '%@'",
               _rrule];
     }
       int offset;
       
       occurence = [iCalDay intValue];
-
-      offset = 1;
+      
+      offset = 1; /* skip occurence */
       while (offset < len && isdigit([iCalDay characterAtIndex:offset]))
        offset++;
       
       iCalDay = [iCalDay substringFromIndex:offset];
       
-      if (self->byDay.useOccurence) {
+      if (self->byDay.useOccurence && (occurence != self->byDayOccurence1)) {
        [self errorWithFormat:
                @"we only supported one occurence (occ=%i,day=%@): '%@'", 
                occurence, iCalDay, _byDayList];