sogo/SOPE/NGCards/iCalEventChanges.m
Wolfgang Sourdeau a729e7a7c6 Monotone-Parent: 744c3e733b57edb33736f8baa6507148efdf032a
Monotone-Revision: be6b50d4ca1f324c2ee9dc23ac3ffac066e3de76

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2007-07-23T13:53:13
Monotone-Branch: ca.inverse.sogo
2007-07-23 13:53:13 +00:00

213 lines
6.5 KiB
Objective-C

/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of SOPE.
SOPE is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with SOPE; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#import <Foundation/NSArray.h>
#import <Foundation/NSString.h>
#import "iCalEventChanges.h"
#import "iCalEvent.h"
#import "iCalPerson.h"
@interface iCalEventChanges (PrivateAPI)
- (void)_trackAttendeeChanges:(iCalEvent *)_from :(iCalEvent *)_to;
- (void)_trackAlarmChanges:(iCalEvent *)_from :(iCalEvent *)_to;
- (void)_trackPropertyChanges:(iCalEvent *)_from :(iCalEvent *)_to;
@end
@implementation iCalEventChanges
+ (id)changesFromEvent:(iCalEvent *)_from toEvent:(iCalEvent *)_to {
return [[[self alloc] initWithFromEvent:_from toEvent:_to] autorelease];
}
- (id)initWithFromEvent:(iCalEvent *)_from toEvent:(iCalEvent *)_to {
self = [super init];
if(self) {
self->insertedAttendees = [[NSMutableArray alloc] init];
self->deletedAttendees = [[NSMutableArray alloc] init];
self->updatedAttendees = [[NSMutableArray alloc] init];
self->insertedAlarms = [[NSMutableArray alloc] init];
self->deletedAlarms = [[NSMutableArray alloc] init];
self->updatedAlarms = [[NSMutableArray alloc] init];
self->updatedProperties = [[NSMutableArray alloc] init];
[self _trackAttendeeChanges:_from :_to];
[self _trackPropertyChanges:_from :_to];
}
return self;
}
- (void)dealloc {
[self->insertedAttendees release];
[self->deletedAttendees release];
[self->updatedAttendees release];
[self->insertedAlarms release];
[self->deletedAlarms release];
[self->updatedAlarms release];
[self->updatedProperties release];
[super dealloc];
}
- (void)_trackAttendeeChanges:(iCalEvent *)_from :(iCalEvent *)_to {
unsigned f, t, fcount, tcount;
NSArray *fromAttendees, *toAttendees;
fromAttendees = [_from attendees];
fcount = [fromAttendees count];
toAttendees = [_to attendees];
tcount = [toAttendees count];
for(f = 0; f < fcount; f++) {
iCalPerson *fp;
BOOL found = NO;
fp = [fromAttendees objectAtIndex:f];
for(t = 0; t < tcount; t++) {
iCalPerson *tp;
tp = [toAttendees objectAtIndex:t];
if([fp hasSameEmailAddress:tp]) {
found = YES;
if(![fp isEqualToPerson:tp]) {
[self->updatedAttendees addObject:tp];
}
break;
}
}
if(!found) {
[self->deletedAttendees addObject:fp];
}
}
for(t = 0; t < tcount; t++) {
iCalPerson *tp;
BOOL found = NO;
tp = [toAttendees objectAtIndex:t];
for(f = 0; f < fcount; f++) {
iCalPerson *fp;
fp = [fromAttendees objectAtIndex:f];
if([tp hasSameEmailAddress:fp]) {
found = YES;
break;
}
}
if(!found)
[self->insertedAttendees addObject:tp];
}
}
- (void)_trackAlarmChanges:(iCalEvent *)_from :(iCalEvent *)_to {
}
- (void)_trackPropertyChanges:(iCalEvent *)_from :(iCalEvent *)_to {
if(!IS_EQUAL([_from startDate], [_to startDate], isEqualToDate:))
[self->updatedProperties addObject:@"startDate"];
if(!IS_EQUAL([_from endDate], [_to endDate], isEqualToDate:))
[self->updatedProperties addObject:@"endDate"];
if(!IS_EQUAL([_from created], [_to created], isEqualToDate:))
[self->updatedProperties addObject:@"created"];
if(!IS_EQUAL([_from lastModified], [_to lastModified], isEqualToDate:))
[self->updatedProperties addObject:@"lastModified"];
if(![_from durationAsTimeInterval] == [_to durationAsTimeInterval])
[self->updatedProperties addObject:@"duration"];
if(!IS_EQUAL([_from summary], [_to summary], isEqualToString:))
[self->updatedProperties addObject:@"summary"];
if(!IS_EQUAL([_from location], [_to location], isEqualToString:))
[self->updatedProperties addObject:@"location"];
if(!IS_EQUAL([_from comment], [_to comment], isEqualToString:))
[self->updatedProperties addObject:@"comment"];
if(!IS_EQUAL([_from priority], [_to priority], isEqualToString:))
[self->updatedProperties addObject:@"priority"];
if(!IS_EQUAL([_from status], [_to status], isEqualToString:))
[self->updatedProperties addObject:@"status"];
if(!IS_EQUAL([_from accessClass], [_to accessClass], isEqualToString:))
[self->updatedProperties addObject:@"accessClass"];
if(!IS_EQUAL([_from sequence], [_to sequence], isEqualToNumber:))
[self->updatedProperties addObject:@"sequence"];
if(!IS_EQUAL([_from organizer], [_to organizer], isEqual:))
[self->updatedProperties addObject:@"organizer"];
}
- (BOOL)hasChanges {
return [self hasAttendeeChanges] ||
[self hasAlarmChanges] ||
[self hasPropertyChanges];
}
- (BOOL)hasAttendeeChanges {
return [[self insertedAttendees] count] > 0 ||
[[self deletedAttendees] count] > 0 ||
[[self updatedAttendees] count] > 0;
}
- (BOOL)hasAlarmChanges {
return [[self insertedAlarms] count] > 0 ||
[[self deletedAlarms] count] > 0 ||
[[self updatedAlarms] count] > 0;
}
- (BOOL)hasPropertyChanges {
return [[self updatedProperties] count] > 0;
}
- (NSArray *)insertedAttendees {
return self->insertedAttendees;
}
- (NSArray *)deletedAttendees {
return self->deletedAttendees;
}
- (NSArray *)updatedAttendees {
return self->updatedAttendees;
}
- (NSArray *)insertedAlarms {
return self->insertedAlarms;
}
- (NSArray *)deletedAlarms {
return self->deletedAlarms;
}
- (NSArray *)updatedAlarms {
return self->updatedAlarms;
}
- (NSArray *)updatedProperties {
return self->updatedProperties;
}
/* descriptions */
- (NSString *)description {
NSMutableString *ms;
ms = [NSMutableString stringWithCapacity:128];
[ms appendFormat:@"<0x%p[%@]:", self, NSStringFromClass([self class])];
[ms appendFormat:@" updatedProperties=%@", self->updatedProperties];
[ms appendFormat:@" insertedAttendees=%@", self->insertedAttendees];
[ms appendFormat:@" deletedAttendees=%@", self->deletedAttendees];
[ms appendFormat:@" updatedAttendees=%@", self->updatedAttendees];
[ms appendString:@">"];
return ms;
}
@end