2 Copyright (C) 2000-2005 SKYRIX Software AG
4 This file is part of SOPE.
6 SOPE is free software; you can redistribute it and/or modify it under
7 the terms of the GNU Lesser General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with SOPE; see the file COPYING. If not, write to the
18 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 #import "NSCalendarDate+NGCards.h"
23 #import "CardGroup+iCal.h"
26 #import "iCalDateTime.h"
27 #import "iCalEntityObject.h"
28 #import "iCalPerson.h"
31 @interface iCalEntityObject (PrivateAPI)
32 - (NSArray *)_filteredAttendeesThinkingOfPersons:(BOOL)_persons;
35 @implementation iCalEntityObject
37 - (Class) classForTag: (NSString *) classTag
41 if ([classTag isEqualToString: @"ATTENDEE"]
42 || [classTag isEqualToString: @"ORGANIZER"])
43 tagClass = [iCalPerson class];
44 else if ([classTag isEqualToString: @"VALARM"])
45 tagClass = [iCalAlarm class];
46 else if ([classTag isEqualToString: @"SUMMARY"]
47 || [classTag isEqualToString: @"UID"]
48 || [classTag isEqualToString: @"COMMENT"]
49 || [classTag isEqualToString: @"DESCRIPTION"]
50 || [classTag isEqualToString: @"CLASS"]
51 || [classTag isEqualToString: @"STATUS"]
52 || [classTag isEqualToString: @"SEQUENCE"]
53 || [classTag isEqualToString: @"URL"]
54 || [classTag isEqualToString: @"PRIORITY"]
55 || [classTag isEqualToString: @"CATEGORIES"]
56 || [classTag isEqualToString: @"LOCATION"])
57 tagClass = [CardElement class];
58 else if ([classTag isEqualToString: @"DTSTAMP"]
59 || [classTag isEqualToString: @"DTSTART"]
60 || [classTag isEqualToString: @"CREATED"]
61 || [classTag isEqualToString: @"LAST-MODIFIED"])
62 tagClass = [iCalDateTime class];
64 tagClass = [super classForTag: classTag];
71 - (void) setUid: (NSString *) _uid
73 [[self uniqueChildWithTag: @"uid"] setValue: 0 to: _uid];
78 return [[self uniqueChildWithTag: @"uid"] value: 0];
81 - (void) setSummary: (NSString *) _value
83 [[self uniqueChildWithTag: @"summary"] setValue: 0 to: _value];
86 - (NSString *) summary
88 return [[self uniqueChildWithTag: @"summary"] value: 0];
91 - (void) setLocation: (NSString *) _value
93 [[self uniqueChildWithTag: @"location"] setValue: 0 to: _value];
96 - (NSString *) location
98 return [[self uniqueChildWithTag: @"location"] value: 0];
101 - (void) setComment: (NSString *) _value
103 [[self uniqueChildWithTag: @"description"] setValue: 0 to: _value];
106 - (NSString *) comment
108 return [[self uniqueChildWithTag: @"description"] value: 0];
111 - (void) setAccessClass: (NSString *) _value
113 [[self uniqueChildWithTag: @"class"] setValue: 0 to: _value];
116 - (NSString *) accessClass
118 return [[self uniqueChildWithTag: @"class"] value: 0];
123 return [[[self accessClass] uppercaseString] isEqualToString: @"PUBLIC"];
126 - (void) setPriority: (NSString *) _value
128 [[self uniqueChildWithTag: @"priority"] setValue: 0 to: _value];
131 - (NSString *) priority
133 return [[self uniqueChildWithTag: @"priority"] value: 0];
136 - (void) setCategories: (NSString *) _value
138 [[self uniqueChildWithTag: @"categories"] setValue: 0 to: _value];
141 - (NSString *) categories
143 return [[self uniqueChildWithTag: @"categories"] value: 0];
146 - (void) setUserComment: (NSString *) _value
148 [[self uniqueChildWithTag: @"usercomment"] setValue: 0 to: _value];
151 - (NSString *) userComment
153 return [[self uniqueChildWithTag: @"usercomment"] value: 0];
156 - (void) setStatus: (NSString *) _value
158 [[self uniqueChildWithTag: @"status"] setValue: 0 to: _value];
161 - (NSString *) status
163 return [[self uniqueChildWithTag: @"status"] value: 0];
166 - (void) setSequence: (NSNumber *)_value
170 sequence = [NSString stringWithFormat: @"%@", _value];
171 [[self uniqueChildWithTag: @"sequence"] setValue: 0
175 - (NSNumber *) sequence
179 sequence = [[self uniqueChildWithTag: @"sequence"] value: 0];
181 return [NSNumber numberWithInt: [sequence intValue]];
184 - (void) increaseSequence
188 seq = [[self sequence] intValue];
190 [self setSequence: [NSNumber numberWithInt: seq]];
193 - (void) setCreated: (NSCalendarDate *) _value
195 [self setDate: _value forDateTimeValue: @"created"];
198 - (NSCalendarDate *) created
200 return [self dateForDateTimeValue: @"created"];
203 - (void) setLastModified: (NSCalendarDate *) _value
205 [self setDate: _value forDateTimeValue: @"last-modified"];
208 - (NSCalendarDate *) lastModified
210 return [self dateForDateTimeValue: @"last-modified"];
213 - (void) setTimeStampAsDate: (NSCalendarDate *) _value
215 [self setDate: _value forDateTimeValue: @"dtstamp"];
218 - (NSCalendarDate *) timeStampAsDate
220 return [self dateForDateTimeValue: @"dtstamp"];
223 - (void) setStartDate: (NSCalendarDate *) _value
225 [self setDate: _value forDateTimeValue: @"dtstart"];
228 - (NSCalendarDate *) startDate
230 return [self dateForDateTimeValue: @"dtstart"];
233 - (BOOL) hasStartDate
235 return ([[self childrenWithTag: @"dtstart"] count] > 0);
238 - (void) setOrganizer: (iCalPerson *) _organizer
240 [_organizer setTag: @"organizer"];
241 [self setUniqueChild: _organizer];
244 - (iCalPerson *) organizer
246 return (iCalPerson *) [self uniqueChildWithTag: @"organizer"];
249 - (void) removeAllAttendees
251 [children removeObjectsInArray: [self attendees]];
254 - (void) addToAttendees: (iCalPerson *) _person
256 [_person setTag: @"attendee"];
257 [self addChild: _person];
260 - (void) setAttendees: (NSArray *) attendees
262 [self removeAllAttendees];
263 [self addChildren: attendees];
266 - (NSArray *) attendees
268 return [self childrenWithTag: @"attendee"];
271 - (void) removeAllAlarms
273 [children removeObjectsInArray: [self alarms]];
276 - (void) addToAlarms: (id) _alarm
280 [_alarm setTag: @"valarm"];
281 [self addChild: _alarm];
287 return ([[self childrenWithTag: @"valarm"] count] > 0);
292 return [self childrenWithTag: @"valarm"];
295 - (void) setUrl: (id) _value
299 if ([_value isKindOfClass: [NSString class]])
301 else if ([_value isKindOfClass: [NSURL class]])
302 asString = [_value absoluteString];
306 [[self uniqueChildWithTag: @"url"] setValue: 0 to: asString];
313 stringUrl = [[self uniqueChildWithTag: @"url"] value: 0];
315 return [NSURL URLWithString: stringUrl];
320 - (NSArray *) participants
322 return [self _filteredAttendeesThinkingOfPersons: YES];
325 - (NSArray *) resources
327 return [self _filteredAttendeesThinkingOfPersons: NO];
330 - (NSArray *) _filteredAttendeesThinkingOfPersons: (BOOL) _persons
333 NSMutableArray *filtered;
340 list = [self attendees];
342 filtered = [NSMutableArray arrayWithCapacity: max];
343 for (count = 0; count < max; count++)
345 person = (iCalPerson *) [list objectAtIndex: count];
346 role = [[person role] uppercaseString];
347 if (![role hasPrefix: @"NON-PART"])
348 [filtered addObject: person];
354 list = [self childrenWithTag: @"attendee"
355 andAttribute: @"role"
356 havingValue: @"non-part"];
361 - (BOOL) isOrganizer: (id)_email
363 _email = [_email lowercaseString];
365 return [[[[self organizer] rfc822Email] lowercaseString]
366 isEqualToString:_email];
369 - (BOOL) isParticipant: (id) _email
373 _email = [_email lowercaseString];
374 partEmails = [[self participants] valueForKey:@"rfc822Email"];
375 partEmails = [partEmails valueForKey: @"lowercaseString"];
376 return [partEmails containsObject:_email];
379 - (iCalPerson *) findParticipantWithEmail: (id) _email
384 _email = [_email lowercaseString];
385 ps = [self participants];
388 for (i = 0; i < count; i++) {
391 p = [ps objectAtIndex:i];
392 if ([[[p rfc822Email] lowercaseString] isEqualToString:_email])
396 return nil; /* not found */
399 @end /* iCalEntityObject */