]> err.no Git - sope/blob - sope-ical/NGiCal/NGVCard.m
8be6a93aaadcc4d65e01100e8d74e80dbe0d9c28
[sope] / sope-ical / NGiCal / 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 #include "NGVCard.h"
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>
29 #include "common.h"
30
31 @implementation NGVCard
32
33 static id<NSObject,SaxXMLReader> parser = nil; // THREAD
34 static NGVCardSaxHandler         *sax   = nil; // THREAD
35
36 + (id<NSObject,SaxXMLReader>)vCardParser {
37   if (sax == nil)
38     sax = [[NGVCardSaxHandler alloc] init];
39   
40   if (parser == nil) {
41     parser =
42       [[[SaxXMLReaderFactory standardXMLReaderFactory] 
43                              createXMLReaderForMimeType:@"text/x-vcard"]
44                              retain];
45     if (parser == nil) {
46       NSLog(@"ERROR(%s): did not find a parser for text/x-vcard!",
47             __PRETTY_FUNCTION__);
48       return nil;
49     }
50     
51     [parser setContentHandler:sax];
52     [parser setErrorHandler:sax];
53   }
54   
55   return parser;
56 }
57
58 + (NSArray *)parseVCardsFromSource:(id)_src {
59   static id<NSObject,SaxXMLReader> parser;
60   NSArray *vCards;
61   
62   if ((parser = [self vCardParser]) == nil)
63     return nil;
64   
65   [parser parseFromSource:_src];
66   vCards = [[sax vCards] retain];
67   [sax reset];
68   return [vCards autorelease];
69 }
70
71 - (id)initWithUid:(NSString *)_uid version:(NSString *)_version {
72   if ((self = [super init]) != nil) {
73     self->uid     = [_uid     copy];
74     self->version = [_version copy];
75   }
76   return self;
77 }
78 - (id)init {
79   return [self initWithUid:nil version:@"3.0"];
80 }
81
82 - (void)dealloc {
83   [self->profile    release];
84   [self->source     release];
85   [self->vName      release];
86   [self->n          release];
87   [self->org        release];
88   [self->nickname   release];
89   [self->categories release];
90   [self->caluri     release];
91   [self->fburl      release];
92   [self->role       release];
93   [self->fn         release];
94   [self->title      release];
95   [self->bday       release];
96   [self->note       release];
97   [self->vClass     release];
98   [self->prodID     release];
99   [self->x          release];
100   [self->tel        release];
101   [self->url        release];
102   [self->adr        release];
103   [self->email      release];
104   [self->label      release];
105   [self->version    release];
106   [self->uid        release];
107   [super dealloc];
108 }
109
110 /* accessors */
111
112 - (NSString *)version {
113   return self->version;
114 }
115
116 - (void)setUid:(NSString *)_uid {
117   ASSIGNCOPY(self->uid, _uid);
118 }
119 - (NSString *)uid {
120   return self->uid;
121 }
122
123 - (void)setVClass:(NSString *)_vClass {
124   ASSIGNCOPY(self->vClass, _vClass);
125 }
126 - (NSString *)vClass {
127   return self->vClass;
128 }
129
130 - (void)setVName:(NSString *)_value {
131   ASSIGNCOPY(self->vName, _value);
132 }
133 - (NSString *)vName {
134   return self->vName;
135 }
136
137 - (void)setProdID:(NSString *)_prodID {
138   ASSIGNCOPY(self->prodID, _prodID);
139 }
140 - (NSString *)prodID {
141   return self->prodID;
142 }
143
144 - (void)setProfile:(NSString *)_value {
145   ASSIGNCOPY(self->profile, _value);
146 }
147 - (NSString *)profile {
148   return self->profile;
149 }
150
151 - (void)setSource:(NSString *)_value {
152   ASSIGNCOPY(self->source, _value);
153 }
154 - (NSString *)source {
155   return self->source;
156 }
157
158 - (void)setFn:(NSString *)_fn {
159   ASSIGNCOPY(self->fn, _fn);
160 }
161 - (NSString *)fn {
162   return self->fn;
163 }
164
165 - (void)setRole:(NSString *)_role {
166   ASSIGNCOPY(self->role, _role);
167 }
168 - (NSString *)role {
169   return self->role;
170 }
171
172 - (void)setTitle:(NSString *)_title {
173   ASSIGNCOPY(self->title, _title);
174 }
175 - (NSString *)title {
176   return self->title;
177 }
178
179 - (void)setBday:(NSString *)_bday {
180   ASSIGNCOPY(self->bday, _bday);
181 }
182 - (NSString *)bday {
183   return self->bday;
184 }
185
186 - (void)setNote:(NSString *)_note {
187   ASSIGNCOPY(self->note, _note);
188 }
189 - (NSString *)note {
190   return self->note;
191 }
192
193
194 - (void)setN:(NGVCardName *)_v {
195   ASSIGNCOPY(self->n, _v);
196 }
197 - (NGVCardName *)n {
198   return self->n;
199 }
200
201 - (void)setOrg:(NGVCardOrg *)_v {
202   ASSIGNCOPY(self->org, _v);
203 }
204 - (NGVCardOrg *)org {
205   return self->org;
206 }
207
208
209 - (void)setNickname:(id)_v {
210   if (![_v isKindOfClass:[NGVCardStrArrayValue class]] && [_v isNotNull])
211     _v = [[[NGVCardStrArrayValue alloc] initWithPropertyList:_v] autorelease];
212   
213   ASSIGNCOPY(self->nickname, _v);
214 }
215 - (NGVCardStrArrayValue *)nickname {
216   return self->nickname;
217 }
218
219 - (void)setCategories:(id)_v {
220   if (![_v isKindOfClass:[NGVCardStrArrayValue class]] && [_v isNotNull])
221     _v = [[[NGVCardStrArrayValue alloc] initWithPropertyList:_v] autorelease];
222   
223   ASSIGNCOPY(self->categories, _v);
224 }
225 - (NGVCardStrArrayValue *)categories {
226   return self->categories;
227 }
228
229
230 - (void)setTel:(NSArray *)_tel {
231   ASSIGNCOPY(self->tel, _tel);
232 }
233 - (NSArray *)tel {
234   return self->tel;
235 }
236
237 - (void)setAdr:(NSArray *)_adr {
238   ASSIGNCOPY(self->adr, _adr);
239 }
240 - (NSArray *)adr {
241   return self->adr;
242 }
243
244 - (void)setEmail:(NSArray *)_email {
245   ASSIGNCOPY(self->email, _email);
246 }
247 - (NSArray *)email {
248   return self->email;
249 }
250
251 - (void)setLabel:(NSArray *)_label {
252   ASSIGNCOPY(self->label, _label);
253 }
254 - (NSArray *)label {
255   return self->label;
256 }
257
258 - (void)setUrl:(NSArray *)_url {
259   ASSIGNCOPY(self->url, _url);
260 }
261 - (NSArray *)url {
262   return self->url;
263 }
264
265
266 - (void)setFreeBusyURL:(NSArray *)_v {
267   ASSIGNCOPY(self->fburl, _v);
268 }
269 - (NSArray *)freeBusyURL {
270   return self->fburl;
271 }
272 - (void)setCalURI:(NSArray *)_v {
273   ASSIGNCOPY(self->caluri, _v);
274 }
275 - (NSArray *)calURI {
276   return self->caluri;
277 }
278
279
280 - (void)setX:(NSDictionary *)_dict {
281   ASSIGNCOPY(self->x, _dict);
282 }
283 - (NSDictionary *)x {
284   return self->x;
285 }
286
287 /* convenience */
288
289 - (id)preferredValueInArray:(NSArray *)_values {
290   unsigned i, count;
291   
292   if ((count = [_values count]) == 0)
293     return nil;
294   if (count == 1)
295     return [_values objectAtIndex:0];
296   
297   /* scan for preferred value */
298   for (i = 0; i < count; i++) {
299     if ([[_values objectAtIndex:i] isPreferred])
300       return [_values objectAtIndex:i];
301   }
302   
303   /* just take first in sequence */
304   return [_values objectAtIndex:0];
305 }
306
307 - (NGVCardSimpleValue *)preferredEMail {
308   return [self preferredValueInArray:self->email];
309 }
310 - (NGVCardPhone *)preferredTel {
311   return [self preferredValueInArray:self->tel];
312 }
313 - (NGVCardAddress *)preferredAdr {
314   return [self preferredValueInArray:self->adr];
315 }
316
317 /* description */
318
319 - (void)appendAttributesToDescription:(NSMutableString *)_ms {
320   if (self->uid   != nil) [_ms appendFormat:@" uid='%@'", self->uid];
321   
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];
327 }
328
329 - (NSString *)description {
330   NSMutableString *str = nil;
331   
332   str = [NSMutableString stringWithCapacity:64];
333   [str appendFormat:@"<0x%08X[%@]:", self, NSStringFromClass([self class])];
334   [self appendAttributesToDescription:str];
335   [str appendString:@">"];
336   return str;
337 }
338
339 @end /* NGVCard */