]> err.no Git - sope/blobdiff - sope-ical/NGiCal/iCalRecurrenceRule.m
implemented byday in monthly calculator
[sope] / sope-ical / NGiCal / iCalRecurrenceRule.m
index f437738a57e707ab7083a3aa6ac7474aaba576f9..a8aaec0449083c210a77a16f26f0e00aae5ea0e9 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;
   
   props = [_rrule componentsSeparatedByString:@";"];
     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 '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];
     }
   }
   // 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
       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];