]> err.no Git - scalable-opengroupware.org/blob - SOPE/NGCards/iCalEntityObject.m
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1021 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / SOPE / NGCards / iCalEntityObject.m
1 /*
2   Copyright (C) 2000-2005 SKYRIX Software AG
3
4   This file is part of SOPE.
5
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
9   later version.
10
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.
15
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
19   02111-1307, USA.
20 */
21
22 #import "NSCalendarDate+NGCards.h"
23 #import "CardGroup+iCal.h"
24
25 #import "iCalAlarm.h"
26 #import "iCalDateTime.h"
27 #import "iCalEntityObject.h"
28 #import "iCalPerson.h"
29 #import "common.h"
30
31 @interface iCalEntityObject (PrivateAPI)
32 - (NSArray *)_filteredAttendeesThinkingOfPersons:(BOOL)_persons;
33 @end
34
35 @implementation iCalEntityObject
36
37 - (Class) classForTag: (NSString *) classTag
38 {
39   Class tagClass;
40
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];
63   else
64     tagClass = [super classForTag: classTag];
65
66   return tagClass;
67 }
68
69 /* accessors */
70
71 - (void) setUid: (NSString *) _uid
72 {
73   [[self uniqueChildWithTag: @"uid"] setValue: 0 to: _uid];
74 }
75
76 - (NSString *) uid
77 {
78   return [[self uniqueChildWithTag: @"uid"] value: 0];
79 }
80
81 - (void) setSummary: (NSString *) _value
82 {
83   [[self uniqueChildWithTag: @"summary"] setValue: 0 to: _value];
84 }
85
86 - (NSString *) summary
87 {
88   return [[self uniqueChildWithTag: @"summary"] value: 0];
89 }
90
91 - (void) setLocation: (NSString *) _value
92 {
93   [[self uniqueChildWithTag: @"location"] setValue: 0 to: _value];
94 }
95
96 - (NSString *) location
97 {
98   return [[self uniqueChildWithTag: @"location"] value: 0];
99 }
100
101 - (void) setComment: (NSString *) _value
102 {
103   [[self uniqueChildWithTag: @"description"] setValue: 0 to: _value];
104 }
105
106 - (NSString *) comment
107 {
108   return [[self uniqueChildWithTag: @"description"] value: 0];
109 }
110
111 - (void) setAccessClass: (NSString *) _value
112 {
113   [[self uniqueChildWithTag: @"class"] setValue: 0 to: _value];
114 }
115
116 - (NSString *) accessClass
117 {
118   return [[self uniqueChildWithTag: @"class"] value: 0];
119 }
120
121 - (BOOL) isPublic
122 {
123   return [[[self accessClass] uppercaseString] isEqualToString: @"PUBLIC"];
124 }
125
126 - (void) setPriority: (NSString *) _value
127 {
128   [[self uniqueChildWithTag: @"priority"] setValue: 0 to: _value];
129 }
130
131 - (NSString *) priority
132 {
133   return [[self uniqueChildWithTag: @"priority"] value: 0];
134 }
135
136 - (void) setCategories: (NSString *) _value
137 {
138   [[self uniqueChildWithTag: @"categories"] setValue: 0 to: _value];
139 }
140
141 - (NSString *) categories
142 {
143   return [[self uniqueChildWithTag: @"categories"] value: 0];
144 }
145
146 - (void) setUserComment: (NSString *) _value
147 {
148   [[self uniqueChildWithTag: @"usercomment"] setValue: 0 to: _value];
149 }
150
151 - (NSString *) userComment
152 {
153   return [[self uniqueChildWithTag: @"usercomment"] value: 0];
154 }
155
156 - (void) setStatus: (NSString *) _value
157 {
158   [[self uniqueChildWithTag: @"status"] setValue: 0 to: _value];
159 }
160
161 - (NSString *) status
162 {
163   return [[self uniqueChildWithTag: @"status"] value: 0];
164 }
165
166 - (void) setSequence: (NSNumber *)_value
167 {
168   NSString *sequence;
169
170   sequence = [NSString stringWithFormat: @"%@", _value];
171   [[self uniqueChildWithTag: @"sequence"] setValue: 0
172                                           to: sequence];;
173 }
174
175 - (NSNumber *) sequence
176 {
177   NSString *sequence;
178
179   sequence = [[self uniqueChildWithTag: @"sequence"] value: 0];
180
181   return [NSNumber numberWithInt: [sequence intValue]];
182 }
183
184 - (void) increaseSequence
185 {
186   int seq;
187   
188   seq = [[self sequence] intValue];
189   seq += 1;
190   [self setSequence: [NSNumber numberWithInt: seq]];
191 }
192
193 - (void) setCreated: (NSCalendarDate *) _value
194 {
195   [self setDate: _value forDateTimeValue: @"created"];
196 }
197
198 - (NSCalendarDate *) created
199 {
200   return [self dateForDateTimeValue: @"created"];
201 }
202
203 - (void) setLastModified: (NSCalendarDate *) _value
204 {
205   [self setDate: _value forDateTimeValue: @"last-modified"];
206 }
207
208 - (NSCalendarDate *) lastModified
209 {
210   return [self dateForDateTimeValue: @"last-modified"];
211 }
212
213 - (void) setTimeStampAsDate: (NSCalendarDate *) _value
214 {
215   [self setDate: _value forDateTimeValue: @"dtstamp"];
216 }
217
218 - (NSCalendarDate *) timeStampAsDate
219 {
220   return [self dateForDateTimeValue: @"dtstamp"];
221 }
222
223 - (void) setStartDate: (NSCalendarDate *) _value
224 {
225   [self setDate: _value forDateTimeValue: @"dtstart"];
226 }
227
228 - (NSCalendarDate *) startDate
229 {
230   return [self dateForDateTimeValue: @"dtstart"];
231 }
232
233 - (BOOL) hasStartDate
234 {
235   return ([[self childrenWithTag: @"dtstart"] count] > 0);
236 }
237
238 - (void) setOrganizer: (iCalPerson *) _organizer
239 {
240   [_organizer setTag: @"organizer"];
241   [self setUniqueChild: _organizer];
242 }
243
244 - (iCalPerson *) organizer
245 {
246   return (iCalPerson *) [self uniqueChildWithTag: @"organizer"];
247 }
248
249 - (void) removeAllAttendees
250 {
251   [children removeObjectsInArray: [self attendees]];
252 }
253
254 - (void) addToAttendees: (iCalPerson *) _person
255 {
256   [_person setTag: @"attendee"];
257   [self addChild: _person];
258 }
259
260 - (void) setAttendees: (NSArray *) attendees
261 {
262   [self removeAllAttendees];
263   [self addChildren: attendees];
264 }
265
266 - (NSArray *) attendees
267 {
268   return [self childrenWithTag: @"attendee"];
269 }
270
271 - (void) removeAllAlarms
272 {
273   [children removeObjectsInArray: [self alarms]];
274 }
275
276 - (void) addToAlarms: (id) _alarm
277 {
278   if (_alarm)
279     {
280       [_alarm setTag: @"valarm"];
281       [self addChild: _alarm];
282     }
283 }
284
285 - (BOOL) hasAlarms
286 {
287   return ([[self childrenWithTag: @"valarm"] count] > 0);
288 }
289
290 - (NSArray *) alarms
291 {
292   return [self childrenWithTag: @"valarm"];
293 }
294
295 - (void) setUrl: (id) _value
296 {
297   NSString *asString;
298
299   if ([_value isKindOfClass: [NSString class]])
300     asString = _value;
301   else if ([_value isKindOfClass: [NSURL class]])
302     asString = [_value absoluteString];
303   else
304     asString = @"";
305
306   [[self uniqueChildWithTag: @"url"] setValue: 0 to: asString];
307 }
308
309 - (NSURL *) url
310 {
311   NSString *stringUrl;
312
313   stringUrl = [[self uniqueChildWithTag: @"url"] value: 0];
314
315   return [NSURL URLWithString: stringUrl];
316 }
317
318 /* stuff */
319
320 - (NSArray *) participants
321 {
322   return [self _filteredAttendeesThinkingOfPersons: YES];
323 }
324
325 - (NSArray *) resources
326 {
327   return [self _filteredAttendeesThinkingOfPersons: NO];
328 }
329
330 - (NSArray *) _filteredAttendeesThinkingOfPersons: (BOOL) _persons
331 {
332   NSArray *list;
333   NSMutableArray *filtered;
334   unsigned count, max;
335   iCalPerson *person;
336   NSString *role;
337
338   if (_persons)
339     {
340       list = [self attendees];
341       max = [list count];
342       filtered = [NSMutableArray arrayWithCapacity: max];
343       for (count = 0; count < max; count++)
344         {
345           person = (iCalPerson *) [list objectAtIndex: count];
346           role = [[person role] uppercaseString];
347           if (![role hasPrefix: @"NON-PART"])
348             [filtered addObject: person];
349         }
350
351       list = filtered;
352     }
353   else
354     list = [self childrenWithTag: @"attendee"
355                  andAttribute: @"role"
356                  havingValue: @"non-part"];
357
358   return list;
359 }
360
361 - (BOOL) isOrganizer: (id)_email
362 {
363   _email = [_email lowercaseString];
364
365   return [[[[self organizer] rfc822Email] lowercaseString]
366            isEqualToString:_email];
367 }
368
369 - (BOOL) isParticipant: (id) _email
370 {
371   NSArray *partEmails;
372   
373   _email     = [_email lowercaseString];
374   partEmails = [[self participants] valueForKey:@"rfc822Email"];
375   partEmails = [partEmails valueForKey: @"lowercaseString"];
376   return [partEmails containsObject:_email];
377 }
378
379 - (iCalPerson *) findParticipantWithEmail: (id) _email
380 {
381   NSArray  *ps;
382   unsigned i, count;
383   
384   _email = [_email lowercaseString];
385   ps     = [self participants];
386   count  = [ps count];
387
388   for (i = 0; i < count; i++) {
389     iCalPerson *p;
390     
391     p = [ps objectAtIndex:i];
392     if ([[[p rfc822Email] lowercaseString] isEqualToString:_email])
393       return p;
394   }
395
396   return nil; /* not found */
397 }
398
399 @end /* iCalEntityObject */