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
23 #include "NGVCardSaxHandler.h"
24 #include "NGVCardStrArrayValue.h"
25 #include "NGVCardName.h"
26 #include "NGVCardOrg.h"
27 #include <SaxObjC/SaxXMLReader.h>
28 #include <SaxObjC/SaxXMLReaderFactory.h>
31 @implementation NGVCard
33 static id<NSObject,SaxXMLReader> parser = nil; // THREAD
34 static NGVCardSaxHandler *sax = nil; // THREAD
36 + (id<NSObject,SaxXMLReader>)vCardParser {
38 sax = [[NGVCardSaxHandler alloc] init];
42 [[[SaxXMLReaderFactory standardXMLReaderFactory]
43 createXMLReaderForMimeType:@"text/x-vcard"]
46 NSLog(@"ERROR(%s): did not find a parser for text/x-vcard!",
51 [parser setContentHandler:sax];
52 [parser setErrorHandler:sax];
58 + (NSArray *)parseVCardsFromSource:(id)_src {
59 static id<NSObject,SaxXMLReader> parser;
62 if ((parser = [self vCardParser]) == nil)
65 [parser parseFromSource:_src];
66 vCards = [[sax vCards] retain];
68 return [vCards autorelease];
71 - (id)initWithUid:(NSString *)_uid version:(NSString *)_version {
72 if ((self = [super init]) != nil) {
73 self->uid = [_uid copy];
74 self->version = [_version copy];
79 return [self initWithUid:nil version:@"3.0"];
83 [self->profile release];
84 [self->source release];
85 [self->vName release];
88 [self->nickname release];
89 [self->categories release];
90 [self->caluri release];
91 [self->fburl release];
94 [self->title release];
97 [self->vClass release];
98 [self->prodID release];
103 [self->email release];
104 [self->label release];
105 [self->version release];
112 - (NSString *)version {
113 return self->version;
116 - (void)setUid:(NSString *)_uid {
117 ASSIGNCOPY(self->uid, _uid);
123 - (void)setVClass:(NSString *)_vClass {
124 ASSIGNCOPY(self->vClass, _vClass);
126 - (NSString *)vClass {
130 - (void)setVName:(NSString *)_value {
131 ASSIGNCOPY(self->vName, _value);
133 - (NSString *)vName {
137 - (void)setProdID:(NSString *)_prodID {
138 ASSIGNCOPY(self->prodID, _prodID);
140 - (NSString *)prodID {
144 - (void)setProfile:(NSString *)_value {
145 ASSIGNCOPY(self->profile, _value);
147 - (NSString *)profile {
148 return self->profile;
151 - (void)setSource:(NSString *)_value {
152 ASSIGNCOPY(self->source, _value);
154 - (NSString *)source {
158 - (void)setFn:(NSString *)_fn {
159 ASSIGNCOPY(self->fn, _fn);
165 - (void)setRole:(NSString *)_role {
166 ASSIGNCOPY(self->role, _role);
172 - (void)setTitle:(NSString *)_title {
173 ASSIGNCOPY(self->title, _title);
175 - (NSString *)title {
179 - (void)setBday:(NSString *)_bday {
180 ASSIGNCOPY(self->bday, _bday);
186 - (void)setNote:(NSString *)_note {
187 ASSIGNCOPY(self->note, _note);
194 - (void)setN:(NGVCardName *)_v {
195 ASSIGNCOPY(self->n, _v);
201 - (void)setOrg:(NGVCardOrg *)_v {
202 ASSIGNCOPY(self->org, _v);
204 - (NGVCardOrg *)org {
209 - (void)setNickname:(id)_v {
210 if (![_v isKindOfClass:[NGVCardStrArrayValue class]] && [_v isNotNull])
211 _v = [[[NGVCardStrArrayValue alloc] initWithPropertyList:_v] autorelease];
213 ASSIGNCOPY(self->nickname, _v);
215 - (NGVCardStrArrayValue *)nickname {
216 return self->nickname;
219 - (void)setCategories:(id)_v {
220 if (![_v isKindOfClass:[NGVCardStrArrayValue class]] && [_v isNotNull])
221 _v = [[[NGVCardStrArrayValue alloc] initWithPropertyList:_v] autorelease];
223 ASSIGNCOPY(self->categories, _v);
225 - (NGVCardStrArrayValue *)categories {
226 return self->categories;
230 - (void)setTel:(NSArray *)_tel {
231 ASSIGNCOPY(self->tel, _tel);
237 - (void)setAdr:(NSArray *)_adr {
238 ASSIGNCOPY(self->adr, _adr);
244 - (void)setEmail:(NSArray *)_email {
245 ASSIGNCOPY(self->email, _email);
251 - (void)setLabel:(NSArray *)_label {
252 ASSIGNCOPY(self->label, _label);
258 - (void)setUrl:(NSArray *)_url {
259 ASSIGNCOPY(self->url, _url);
266 - (void)setFreeBusyURL:(NSArray *)_v {
267 ASSIGNCOPY(self->fburl, _v);
269 - (NSArray *)freeBusyURL {
272 - (void)setCalURI:(NSArray *)_v {
273 ASSIGNCOPY(self->caluri, _v);
275 - (NSArray *)calURI {
280 - (void)setX:(NSDictionary *)_dict {
281 ASSIGNCOPY(self->x, _dict);
283 - (NSDictionary *)x {
289 - (id)preferredValueInArray:(NSArray *)_values {
292 if ((count = [_values count]) == 0)
295 return [_values objectAtIndex:0];
297 /* scan for preferred value */
298 for (i = 0; i < count; i++) {
299 if ([[_values objectAtIndex:i] isPreferred])
300 return [_values objectAtIndex:i];
303 /* just take first in sequence */
304 return [_values objectAtIndex:0];
307 - (NGVCardSimpleValue *)preferredEMail {
308 return [self preferredValueInArray:self->email];
310 - (NGVCardPhone *)preferredTel {
311 return [self preferredValueInArray:self->tel];
313 - (NGVCardAddress *)preferredAdr {
314 return [self preferredValueInArray:self->adr];
319 - (void)appendAttributesToDescription:(NSMutableString *)_ms {
320 if (self->uid != nil) [_ms appendFormat:@" uid='%@'", self->uid];
322 if ([self->tel count] > 0) [_ms appendFormat:@" tel=%@", self->tel];
323 if ([self->adr count] > 0) [_ms appendFormat:@" adr=%@", self->adr];
324 if ([self->email count] > 0) [_ms appendFormat:@" email=%@", self->email];
325 if ([self->label count] > 0) [_ms appendFormat:@" label=%@", self->label];
326 if ([self->x count] > 0) [_ms appendFormat:@" x=%@", self->x];
329 - (NSString *)description {
330 NSMutableString *str = nil;
332 str = [NSMutableString stringWithCapacity:64];
333 [str appendFormat:@"<0x%08X[%@]:", self, NSStringFromClass([self class])];
334 [self appendAttributesToDescription:str];
335 [str appendString:@">"];