*/
#include "NSCalendarDate+ICal.h"
+#include "iCalDateHolder.h"
#include "common.h"
static NSTimeZone *gmt = nil;
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;
}
@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) */