]> err.no Git - scalable-opengroupware.org/blob - SOPE/NGCards/NGVCard.m
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1021 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / SOPE / NGCards / NGVCard.m
1 /*
2   Copyright (C) 2005 Helge Hess
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 <Foundation/NSArray.h>
23 #import <Foundation/NSEnumerator.h>
24 #import <Foundation/NSString.h>
25
26 #import "NSArray+NGCards.h"
27
28 #import "NGVCard.h"
29
30 @implementation NGVCard
31
32 + (id) parseSingleFromSource: (id) source
33 {
34   NGVCard *newCard;
35
36   newCard = [super parseSingleFromSource: source];
37   [newCard setVersion: @"3.0"];
38
39   return newCard;
40 }
41
42 + (id) cardWithUid: (NSString *) _uid
43 {
44   NGVCard *newCard;
45
46   newCard = [[self alloc] initWithUid: _uid];
47   [newCard autorelease];
48
49   return newCard;
50 }
51
52 - (id) initWithUid: (NSString *) _uid
53 {
54   if ((self = [self init]))
55     {
56       [self setTag: @"vcard"];
57       [self setUid: _uid];
58       [self setVersion: @"3.0"];
59     }
60
61   return self;
62 }
63
64 /* class mapping */
65 - (Class) classForTag: (NSString *) classTag
66 {
67   Class tagClass;
68
69   tagClass = Nil;
70   if ([classTag isEqualToString: @"PRODID"]
71       || [classTag isEqualToString: @"PRODID"]
72       || [classTag isEqualToString: @"PROFILE"]
73       || [classTag isEqualToString: @"UID"]
74       || [classTag isEqualToString: @"CLASS"]
75       || [classTag isEqualToString: @"N"]
76       || [classTag isEqualToString: @"FN"]
77       || [classTag isEqualToString: @"ORG"]
78       || [classTag isEqualToString: @"ADR"]
79       || [classTag isEqualToString: @"TEL"]
80       || [classTag isEqualToString: @"TZ"]
81       || [classTag isEqualToString: @"URL"]
82       || [classTag isEqualToString: @"FBURL"]
83       || [classTag isEqualToString: @"LABEL"]
84       || [classTag isEqualToString: @"EMAIL"]
85       || [classTag isEqualToString: @"NICKNAME"]
86       || [classTag isEqualToString: @"NOTE"]
87       || [classTag isEqualToString: @"BDAY"]
88       || [classTag isEqualToString: @"TITLE"]
89       || [classTag isEqualToString: @"VERSION"])
90     tagClass = [CardElement class];
91   else
92     tagClass = [super classForTag: classTag];
93
94   return tagClass;
95 }
96
97 - (void) setPreferred: (CardElement *) aChild
98 {
99   NSEnumerator *elements;
100   CardElement *element;
101
102   if (![aChild hasAttribute: @"type" havingValue: @"pref"])
103     {
104       elements = [[children cardElementsWithTag: tag] objectEnumerator];
105       element = [elements nextObject];
106       while (element)
107         {
108           [element removeValue: @"pref" fromAttribute: @"type"];
109           element = [elements nextObject];
110         }
111       [aChild addAttribute: @"type" value: @"pref"];
112     }
113 }
114
115 /* helpers */
116 - (NSArray *) childrenWithType: (NSString *) aType
117 {
118   return [self childrenWithAttribute: @"type" havingValue: aType];
119 }
120
121 /* accessors */
122
123 - (void) setVersion: (NSString *) _version
124 {
125   [[self uniqueChildWithTag: @"version"] setValue: 0 to: _version];
126 }
127
128 - (NSString *) version
129 {
130   return [[self uniqueChildWithTag: @"version"] value: 0];
131 }
132
133 - (void) setUid: (NSString *) _uid
134 {
135   [[self uniqueChildWithTag: @"uid"] setValue: 0 to: _uid];
136 }
137
138 - (NSString *) uid
139 {
140   return [[self uniqueChildWithTag: @"uid"] value: 0];
141 }
142
143 - (void) setVClass: (NSString *) _class
144 {
145   [[self uniqueChildWithTag: @"class"] setValue: 0 to: _class];
146 }
147
148 - (NSString *) vClass
149 {
150   return [[self uniqueChildWithTag: @"class"] value: 0];
151 }
152
153 - (void) setVName: (NSString *) _vname
154 {
155   [[self uniqueChildWithTag: @"vname"] setValue: 0 to: _vname];
156 }
157
158 - (NSString *) vName
159 {
160   return [[self uniqueChildWithTag: @"vname"] value: 0];
161 }
162
163 - (void) setProdID: (NSString *) _value
164 {
165   [[self uniqueChildWithTag: @"prodid"] setValue: 0 to: _value];
166 }
167
168 - (NSString *) prodID
169 {
170   return [[self uniqueChildWithTag: @"prodid"] value: 0];
171 }
172
173 - (void) setProfile: (NSString *) _value
174 {
175   [[self uniqueChildWithTag: @"profile"] setValue: 0 to: _value];
176 }
177
178 - (NSString *) profile
179 {
180   return [[self uniqueChildWithTag: @"profile"] value: 0];
181 }
182
183 - (void) setSource: (NSString *) _value
184 {
185   [[self uniqueChildWithTag: @"source"] setValue: 0 to: _value];
186 }
187
188 - (NSString *) source
189 {
190   return [[self uniqueChildWithTag: @"source"] value: 0];
191 }
192
193 - (void) setFn: (NSString *) _value
194 {
195   [[self uniqueChildWithTag: @"fn"] setValue: 0 to: _value];
196 }
197
198 - (NSString *) fn
199 {
200   return [[self uniqueChildWithTag: @"fn"] value: 0];
201 }
202
203 - (void) setRole: (NSString *) _value
204 {
205   [[self uniqueChildWithTag: @"role"] setValue: 0 to: _value];
206 }
207
208 - (NSString *) role
209 {
210   return [[self uniqueChildWithTag: @"role"] value: 0];
211 }
212
213 - (void) setTitle: (NSString *) _title
214 {
215   [[self uniqueChildWithTag: @"title"] setValue: 0 to: _title];
216 }
217
218 - (NSString *) title
219 {
220   return [[self uniqueChildWithTag: @"title"] value: 0];
221 }
222
223 - (void) setBday: (NSString *) _value
224 {
225   [[self uniqueChildWithTag: @"bday"] setValue: 0 to: _value];
226 }
227
228 - (NSString *) bday
229 {
230   return [[self uniqueChildWithTag: @"bday"] value: 0];
231 }
232
233 - (void) setNote: (NSString *) _value
234 {
235   [[self uniqueChildWithTag: @"note"] setValue: 0 to: _value];
236 }
237
238 - (NSString *) note
239 {
240   return [[self uniqueChildWithTag: @"note"] value: 0];
241 }
242
243 - (void) setTz: (NSString *) _value
244 {
245   [[self uniqueChildWithTag: @"tz"] setValue: 0 to: _value];
246 }
247
248 - (NSString *) tz
249 {
250   return [[self uniqueChildWithTag: @"tz"] value: 0];
251 }
252
253 - (void) setNickname: (NSString *) _value
254 {
255   [[self uniqueChildWithTag: @"nickname"] setValue: 0 to: _value];
256 }
257
258 - (NSString *) nickname
259 {
260   return [[self uniqueChildWithTag: @"nickname"] value: 0];
261 }
262
263 - (void) addTel: (NSString *) phoneNumber
264           types: (NSArray *) types
265 {
266   [self addChildWithTag: @"tel" types: types singleValue: phoneNumber];
267 }
268
269 - (void) addEmail: (NSString *) emailAddress
270             types: (NSArray *) types
271 {
272   [self addChildWithTag: @"email"
273         types: types
274         singleValue: emailAddress];
275 }
276
277 - (void) setNWithFamily: (NSString *) family
278                   given: (NSString *) given
279              additional: (NSString *) additional
280                prefixes: (NSString *) prefixes
281                suffixes: (NSString *) suffixes
282 {
283   CardElement *n;
284
285   n = [self uniqueChildWithTag: @"n"];
286   if (family)
287     [n setValue: 0 to: family];
288   if (given)
289     [n setValue: 1 to: given];
290   if (additional)
291     [n setValue: 2 to: additional];
292   if (prefixes)
293     [n setValue: 3 to: prefixes];
294   if (suffixes)
295     [n setValue: 4 to: suffixes];
296 }
297
298 - (NSArray *) n
299 {
300   NSArray *elements, *n;
301
302   elements = [self childrenWithTag: @"n"];
303   if ([elements count] > 0)
304     n = [[elements objectAtIndex: 0] values];
305   else
306     n = nil;
307
308   return n;
309 }
310
311 - (void) setOrg: (NSString *) anOrg
312           units: (NSArray *) someUnits
313 {
314   CardElement *org;
315   unsigned int count, max;
316
317   org = [self uniqueChildWithTag: @"org"];
318   if (anOrg)
319     [org setValue: 0 to: anOrg];
320   if (someUnits)
321     {
322       max = [someUnits count];
323       for (count = 0; count < max; count++)
324         [org setValue: count + 1 to: [someUnits objectAtIndex: count]];
325     }
326 }
327
328 - (NSArray *) org
329 {
330   NSArray *elements, *org;
331
332   elements = [self childrenWithTag: @"org"];
333   if ([elements count] > 0)
334     org = [[elements objectAtIndex: 0] values];
335   else
336     org = nil;
337
338   return org;
339 }
340
341 // - (void) setOrg: (NGVCardOrg *) _v
342 // {
343 //   ASSIGNCOPY(self->org, _v);
344 // }
345
346 // - (NGVCardOrg *)org {
347 //   return self->org;
348 // }
349
350 // - (void)setNickname: (id) _v
351 // {
352 //   if (![_v isKindOfClass:[NGVCardStrArrayValue class]] && [_v isNotNull])
353 //     _v = [[[NGVCardStrArrayValue alloc] initWithPropertyList:_v] autorelease];
354   
355 //   ASSIGNCOPY(self->nickname, _v);
356 // }
357
358 // - (NGVCardStrArrayValue *) nickname
359 // {
360 //   return self->nickname;
361 // }
362
363 // - (void) setCategories: (id) _v
364 // {
365 //   if (![_v isKindOfClass:[NGVCardStrArrayValue class]] && [_v isNotNull])
366 //     _v = [[[NGVCardStrArrayValue alloc] initWithPropertyList:_v] autorelease];
367   
368 //   ASSIGNCOPY(self->categories, _v);
369 // }
370
371 // - (NGVCardStrArrayValue *) categories
372 // {
373 //   return self->categories;
374 // }
375
376 // - (void) setTel: (NSArray *) _tel
377 // {
378 //   ASSIGNCOPY(self->tel, _tel);
379 // }
380
381 // - (NSArray *) tel
382 // {
383 //   return [self childrenWithTag: @"tel"];
384 // }
385
386 // - (void) setAdr: (NSArray *) _adr
387 // {
388 //   ASSIGNCOPY(self->adr, _adr);
389 // }
390
391 // - (NSArray *) adr
392 // {
393 //   return self->adr;
394 // }
395
396 // - (void) setEmail: (NSArray *) _email
397 // {
398 //   ASSIGNCOPY(self->email, _email);
399 // }
400
401 // - (NSArray *) email
402 // {
403 //   return [self childrenWithTag: @"email"];
404 // }
405
406 // - (void) setLabel: (NSArray *) _label
407 // {
408 //   ASSIGNCOPY(self->label, _label);
409 // }
410
411 // - (NSArray *) label
412 // {
413 //   return [self childrenWithTag: @"email"];
414 // }
415
416 // - (void) setUrl: (NSArray *) _url
417 // {
418 //   ASSIGNCOPY(self->url, _url);
419 // }
420
421 // - (NSArray *) url
422 // {
423 //   return self->url;
424 // }
425
426 // - (void) setFreeBusyURL: (NSArray *) _v
427 // {
428 //   ASSIGNCOPY(self->fburl, _v);
429 // }
430
431 // - (NSArray *) freeBusyURL
432 // {
433 //   return self->fburl;
434 // }
435
436 // - (void) setCalURI: (NSArray *) _v
437 // {
438 //   ASSIGNCOPY(self->caluri, _v);
439 // }
440
441 // - (NSArray *) calURI
442 // {
443 //   return self->caluri;
444 // }
445
446 // - (void) setX: (NSDictionary *) _dict
447 // {
448 //   ASSIGNCOPY(self->x, _dict);
449 // }
450
451 // - (NSDictionary *) x
452 // {
453 //   return self->x;
454 // }
455
456 /* convenience */
457
458 - (CardElement *) _preferredElementWithTag: (NSString *) aTag
459 {
460   NSArray *elements, *prefElements;
461   CardElement *element;
462
463   elements = [self childrenWithTag: aTag];
464   if (elements && [elements count] > 0)
465     {
466       prefElements = [elements cardElementsWithAttribute: @"type"
467                                havingValue: @"pref"];
468       if (prefElements && [prefElements count] > 0)
469         element = [prefElements objectAtIndex: 0];
470       else
471         element = [elements objectAtIndex: 0];
472     }
473   else
474     element = nil;
475
476   return element;
477 }
478
479 - (NSString *) preferredEMail
480 {
481   return [[self _preferredElementWithTag: @"email"] value: 0];
482 }
483
484 - (NSString *) preferredTel
485 {
486   return [[self _preferredElementWithTag: @"tel"] value: 0];
487 }
488
489 - (CardElement *) preferredAdr
490 {
491   return [self _preferredElementWithTag: @"adr"];
492 }
493
494 /* description */
495
496 - (void) appendAttributesToDescription: (NSMutableString *) _ms
497 {
498   if ([self uid]) [_ms appendFormat:@" uid='%@'", [self uid]];
499   
500 //   if ([[self tel] count] > 0) [_ms appendFormat:@" tel=%@", [self tel];
501 //   if ([[self adr] count])
502 //     [_ms appendFormat:@" adr=%@", [self adr]];
503 //   if ([[self email] count])
504 //     [_ms appendFormat:@" email=%@", [self email]];
505 //   if ([[self label] count])
506 //     [_ms appendFormat:@" label=%@", [self label]];
507 //   if ([[self x] count])
508 //     [_ms appendFormat:@" x=%@", [self x]];
509 }
510
511 - (NSString *) description
512 {
513   NSMutableString *str = nil;
514   
515   str = [NSMutableString stringWithCapacity:64];
516   [str appendFormat:@"<0x%p[%@]:", self, NSStringFromClass([self class])];
517   [self appendAttributesToDescription:str];
518   [str appendString:@">"];
519   return str;
520 }
521
522 @end /* NGVCard */