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