]> err.no Git - sope/blobdiff - sope-ical/NGiCal/NSCalendarDate+ICal.m
minor changes to Xcode project layout
[sope] / sope-ical / NGiCal / NSCalendarDate+ICal.m
index 777dbb6df203126aa6747cae1fa4bf44fe6faf54..dd5b70a9ae7391f8659775dd19427e19585fa203 100644 (file)
@@ -20,6 +20,7 @@
 */
 
 #include "NSCalendarDate+ICal.h"
+#include "iCalDateHolder.h"
 #include "common.h"
 
 static NSTimeZone *gmt = nil;
@@ -28,12 +29,27 @@ static inline void _setupGMT(void) {
     gmt = [[NSTimeZone timeZoneWithAbbreviation:@"GMT"] retain];
 }
 
-@implementation NSCalendarDate(ICalValue)
+@interface iCalDateHolder (PrivateAPI)
+- (id)awakeAfterUsingSaxDecoder:(id)_decoder;
+@end
+
+@implementation NSCalendarDate(iCalRepresentation)
 
 /* represention */
 
 static NSString *gmtcalfmt = @"%Y%m%dT%H%M00Z";
 
++ (id)calendarDateWithICalRepresentation:(NSString *)_iCalRep {
+  iCalDateHolder *dh;
+  NSCalendarDate *date;
+  
+  dh = [[iCalDateHolder alloc] init];
+  [dh setString:_iCalRep];
+  date = [dh awakeAfterUsingSaxDecoder:nil];
+  [dh release];
+  return date;
+}
+
 - (NSString *)icalStringInGMT {
   NSTimeZone *oldtz;
   NSString   *s;
@@ -82,3 +98,48 @@ static NSString *gmtcalfmt = @"%Y%m%dT%H%M00Z";
 }
 
 @end /* NSDate(ICalValue) */
+
+
+#ifndef ABS
+#define ABS(a) ((a) < 0 ? -(a) : (a))
+#endif
+
+@implementation NSCalendarDate (iCalRecurrenceCalculatorExtensions)
+
+- (unsigned)yearsBetweenDate:(NSCalendarDate *)_date {
+  return ABS([self yearOfCommonEra] - [_date yearOfCommonEra]);
+}
+
+- (unsigned)monthsBetweenDate:(NSCalendarDate *)_date {
+  NSCalendarDate     *start, *end;
+  NSComparisonResult order;
+  int                yDiff;
+  
+  order = [self compare:_date];
+  if (order == NSOrderedSame)
+    return 0;
+  else if (order == NSOrderedAscending) {
+    start = self;
+    end   = _date;
+  }
+  else {
+    start = _date;
+    end   = self;
+  }
+  yDiff = [end yearOfCommonEra] - [start yearOfCommonEra];
+  if (yDiff > 0) {
+    unsigned monthsRemaining, monthsToGo;
+    
+    monthsRemaining = 12 - [start monthOfYear];
+    monthsToGo      = [end monthOfYear];
+    yDiff          -= 1;
+    return monthsRemaining + monthsToGo + (12 * yDiff);
+  }
+  /* start and end in same year, calculate plain diff */
+  return [end monthOfYear] - [start monthOfYear];
+}
+
+- (unsigned)daysBetweenDate:(NSCalendarDate *)_date {
+  return ABS([self julianNumber] - [_date julianNumber]);
+}
+@end /* NSCalendarDate (iCalRecurrenceCalculatorExtensions) */