2 Copyright (C) 2005 Helge Hess
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 <Foundation/NSArray.h>
23 #import <Foundation/NSEnumerator.h>
24 #import <Foundation/NSString.h>
26 #import "NSArray+NGCards.h"
30 @implementation NGVCard
32 + (id) parseSingleFromSource: (id) source
36 newCard = [super parseSingleFromSource: source];
37 [newCard setVersion: @"3.0"];
42 + (id) cardWithUid: (NSString *) _uid
46 newCard = [[self alloc] initWithUid: _uid];
47 [newCard autorelease];
52 - (id) initWithUid: (NSString *) _uid
54 if ((self = [self init]))
56 [self setTag: @"vcard"];
58 [self setVersion: @"3.0"];
65 - (Class) classForTag: (NSString *) classTag
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];
92 tagClass = [super classForTag: classTag];
97 - (void) setPreferred: (CardElement *) aChild
99 NSEnumerator *elements;
100 CardElement *element;
102 if (![aChild hasAttribute: @"type" havingValue: @"pref"])
104 elements = [[children cardElementsWithTag: tag] objectEnumerator];
105 element = [elements nextObject];
108 [element removeValue: @"pref" fromAttribute: @"type"];
109 element = [elements nextObject];
111 [aChild addAttribute: @"type" value: @"pref"];
116 - (NSArray *) childrenWithType: (NSString *) aType
118 return [self childrenWithAttribute: @"type" havingValue: aType];
123 - (void) setVersion: (NSString *) _version
125 [[self uniqueChildWithTag: @"version"] setValue: 0 to: _version];
128 - (NSString *) version
130 return [[self uniqueChildWithTag: @"version"] value: 0];
133 - (void) setUid: (NSString *) _uid
135 [[self uniqueChildWithTag: @"uid"] setValue: 0 to: _uid];
140 return [[self uniqueChildWithTag: @"uid"] value: 0];
143 - (void) setVClass: (NSString *) _class
145 [[self uniqueChildWithTag: @"class"] setValue: 0 to: _class];
148 - (NSString *) vClass
150 return [[self uniqueChildWithTag: @"class"] value: 0];
153 - (void) setVName: (NSString *) _vname
155 [[self uniqueChildWithTag: @"vname"] setValue: 0 to: _vname];
160 return [[self uniqueChildWithTag: @"vname"] value: 0];
163 - (void) setProdID: (NSString *) _value
165 [[self uniqueChildWithTag: @"prodid"] setValue: 0 to: _value];
168 - (NSString *) prodID
170 return [[self uniqueChildWithTag: @"prodid"] value: 0];
173 - (void) setProfile: (NSString *) _value
175 [[self uniqueChildWithTag: @"profile"] setValue: 0 to: _value];
178 - (NSString *) profile
180 return [[self uniqueChildWithTag: @"profile"] value: 0];
183 - (void) setSource: (NSString *) _value
185 [[self uniqueChildWithTag: @"source"] setValue: 0 to: _value];
188 - (NSString *) source
190 return [[self uniqueChildWithTag: @"source"] value: 0];
193 - (void) setFn: (NSString *) _value
195 [[self uniqueChildWithTag: @"fn"] setValue: 0 to: _value];
200 return [[self uniqueChildWithTag: @"fn"] value: 0];
203 - (void) setRole: (NSString *) _value
205 [[self uniqueChildWithTag: @"role"] setValue: 0 to: _value];
210 return [[self uniqueChildWithTag: @"role"] value: 0];
213 - (void) setTitle: (NSString *) _title
215 [[self uniqueChildWithTag: @"title"] setValue: 0 to: _title];
220 return [[self uniqueChildWithTag: @"title"] value: 0];
223 - (void) setBday: (NSString *) _value
225 [[self uniqueChildWithTag: @"bday"] setValue: 0 to: _value];
230 return [[self uniqueChildWithTag: @"bday"] value: 0];
233 - (void) setNote: (NSString *) _value
235 [[self uniqueChildWithTag: @"note"] setValue: 0 to: _value];
240 return [[self uniqueChildWithTag: @"note"] value: 0];
243 - (void) setTz: (NSString *) _value
245 [[self uniqueChildWithTag: @"tz"] setValue: 0 to: _value];
250 return [[self uniqueChildWithTag: @"tz"] value: 0];
253 - (void) setNickname: (NSString *) _value
255 [[self uniqueChildWithTag: @"nickname"] setValue: 0 to: _value];
258 - (NSString *) nickname
260 return [[self uniqueChildWithTag: @"nickname"] value: 0];
263 - (void) addTel: (NSString *) phoneNumber
264 types: (NSArray *) types
266 [self addChildWithTag: @"tel" types: types singleValue: phoneNumber];
269 - (void) addEmail: (NSString *) emailAddress
270 types: (NSArray *) types
272 [self addChildWithTag: @"email"
274 singleValue: emailAddress];
277 - (void) setNWithFamily: (NSString *) family
278 given: (NSString *) given
279 additional: (NSString *) additional
280 prefixes: (NSString *) prefixes
281 suffixes: (NSString *) suffixes
285 n = [self uniqueChildWithTag: @"n"];
287 [n setValue: 0 to: family];
289 [n setValue: 1 to: given];
291 [n setValue: 2 to: additional];
293 [n setValue: 3 to: prefixes];
295 [n setValue: 4 to: suffixes];
300 NSArray *elements, *n;
302 elements = [self childrenWithTag: @"n"];
303 if ([elements count] > 0)
304 n = [[elements objectAtIndex: 0] values];
311 - (void) setOrg: (NSString *) anOrg
312 units: (NSArray *) someUnits
315 unsigned int count, max;
317 org = [self uniqueChildWithTag: @"org"];
319 [org setValue: 0 to: anOrg];
322 max = [someUnits count];
323 for (count = 0; count < max; count++)
324 [org setValue: count + 1 to: [someUnits objectAtIndex: count]];
330 NSArray *elements, *org;
332 elements = [self childrenWithTag: @"org"];
333 if ([elements count] > 0)
334 org = [[elements objectAtIndex: 0] values];
341 // - (void) setOrg: (NGVCardOrg *) _v
343 // ASSIGNCOPY(self->org, _v);
346 // - (NGVCardOrg *)org {
350 // - (void)setNickname: (id) _v
352 // if (![_v isKindOfClass:[NGVCardStrArrayValue class]] && [_v isNotNull])
353 // _v = [[[NGVCardStrArrayValue alloc] initWithPropertyList:_v] autorelease];
355 // ASSIGNCOPY(self->nickname, _v);
358 // - (NGVCardStrArrayValue *) nickname
360 // return self->nickname;
363 // - (void) setCategories: (id) _v
365 // if (![_v isKindOfClass:[NGVCardStrArrayValue class]] && [_v isNotNull])
366 // _v = [[[NGVCardStrArrayValue alloc] initWithPropertyList:_v] autorelease];
368 // ASSIGNCOPY(self->categories, _v);
371 // - (NGVCardStrArrayValue *) categories
373 // return self->categories;
376 // - (void) setTel: (NSArray *) _tel
378 // ASSIGNCOPY(self->tel, _tel);
383 // return [self childrenWithTag: @"tel"];
386 // - (void) setAdr: (NSArray *) _adr
388 // ASSIGNCOPY(self->adr, _adr);
396 // - (void) setEmail: (NSArray *) _email
398 // ASSIGNCOPY(self->email, _email);
401 // - (NSArray *) email
403 // return [self childrenWithTag: @"email"];
406 // - (void) setLabel: (NSArray *) _label
408 // ASSIGNCOPY(self->label, _label);
411 // - (NSArray *) label
413 // return [self childrenWithTag: @"email"];
416 // - (void) setUrl: (NSArray *) _url
418 // ASSIGNCOPY(self->url, _url);
426 // - (void) setFreeBusyURL: (NSArray *) _v
428 // ASSIGNCOPY(self->fburl, _v);
431 // - (NSArray *) freeBusyURL
433 // return self->fburl;
436 // - (void) setCalURI: (NSArray *) _v
438 // ASSIGNCOPY(self->caluri, _v);
441 // - (NSArray *) calURI
443 // return self->caluri;
446 // - (void) setX: (NSDictionary *) _dict
448 // ASSIGNCOPY(self->x, _dict);
451 // - (NSDictionary *) x
458 - (CardElement *) _preferredElementWithTag: (NSString *) aTag
460 NSArray *elements, *prefElements;
461 CardElement *element;
463 elements = [self childrenWithTag: aTag];
464 if (elements && [elements count] > 0)
466 prefElements = [elements cardElementsWithAttribute: @"type"
467 havingValue: @"pref"];
468 if (prefElements && [prefElements count] > 0)
469 element = [prefElements objectAtIndex: 0];
471 element = [elements objectAtIndex: 0];
479 - (NSString *) preferredEMail
481 return [[self _preferredElementWithTag: @"email"] value: 0];
484 - (NSString *) preferredTel
486 return [[self _preferredElementWithTag: @"tel"] value: 0];
489 - (CardElement *) preferredAdr
491 return [self _preferredElementWithTag: @"adr"];
496 - (void) appendAttributesToDescription: (NSMutableString *) _ms
498 if ([self uid]) [_ms appendFormat:@" uid='%@'", [self uid]];
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]];
511 - (NSString *) description
513 NSMutableString *str = nil;
515 str = [NSMutableString stringWithCapacity:64];
516 [str appendFormat:@"<0x%p[%@]:", self, NSStringFromClass([self class])];
517 [self appendAttributesToDescription:str];
518 [str appendString:@">"];