]> err.no Git - sope/blob - sope-ical/NGiCal/NGVCard.m
finishing touches on the vcard parser
[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->n          release];
81   [self->org        release];
82   [self->nickname   release];
83   [self->categories release];
84   [self->caluri     release];
85   [self->fburl      release];
86   [self->role       release];
87   [self->fn         release];
88   [self->title      release];
89   [self->bday       release];
90   [self->note       release];
91   [self->vClass     release];
92   [self->prodID     release];
93   [self->x          release];
94   [self->tel        release];
95   [self->url        release];
96   [self->adr        release];
97   [self->email      release];
98   [self->label      release];
99   [self->version    release];
100   [self->uid        release];
101   [super dealloc];
102 }
103
104 /* accessors */
105
106 - (NSString *)version {
107   return self->version;
108 }
109
110 - (void)setUid:(NSString *)_uid {
111   ASSIGNCOPY(self->uid, _uid);
112 }
113 - (NSString *)uid {
114   return self->uid;
115 }
116
117 - (void)setVClass:(NSString *)_vClass {
118   ASSIGNCOPY(self->vClass, _vClass);
119 }
120 - (NSString *)vClass {
121   return self->vClass;
122 }
123
124 - (void)setProdID:(NSString *)_prodID {
125   ASSIGNCOPY(self->prodID, _prodID);
126 }
127 - (NSString *)prodID {
128   return self->prodID;
129 }
130
131 - (void)setFn:(NSString *)_fn {
132   ASSIGNCOPY(self->fn, _fn);
133 }
134 - (NSString *)fn {
135   return self->fn;
136 }
137
138 - (void)setRole:(NSString *)_role {
139   ASSIGNCOPY(self->role, _role);
140 }
141 - (NSString *)role {
142   return self->role;
143 }
144
145 - (void)setTitle:(NSString *)_title {
146   ASSIGNCOPY(self->title, _title);
147 }
148 - (NSString *)title {
149   return self->title;
150 }
151
152 - (void)setBday:(NSString *)_bday {
153   ASSIGNCOPY(self->bday, _bday);
154 }
155 - (NSString *)bday {
156   return self->bday;
157 }
158
159 - (void)setNote:(NSString *)_note {
160   ASSIGNCOPY(self->note, _note);
161 }
162 - (NSString *)note {
163   return self->note;
164 }
165
166
167 - (void)setN:(NGVCardName *)_v {
168   ASSIGNCOPY(self->n, _v);
169 }
170 - (NGVCardName *)n {
171   return self->n;
172 }
173
174 - (void)setOrg:(NGVCardOrg *)_v {
175   ASSIGNCOPY(self->org, _v);
176 }
177 - (NGVCardOrg *)org {
178   return self->org;
179 }
180
181
182 - (void)setNickname:(id)_v {
183   if (![_v isKindOfClass:[NGVCardStrArrayValue class]] && [_v isNotNull])
184     _v = [[[NGVCardStrArrayValue alloc] initWithPropertyList:_v] autorelease];
185   
186   ASSIGNCOPY(self->nickname, _v);
187 }
188 - (NGVCardStrArrayValue *)nickname {
189   return self->nickname;
190 }
191
192 - (void)setCategories:(id)_v {
193   if (![_v isKindOfClass:[NGVCardStrArrayValue class]] && [_v isNotNull])
194     _v = [[[NGVCardStrArrayValue alloc] initWithPropertyList:_v] autorelease];
195   
196   ASSIGNCOPY(self->categories, _v);
197 }
198 - (NGVCardStrArrayValue *)categories {
199   return self->categories;
200 }
201
202
203 - (void)setTel:(NSArray *)_tel {
204   ASSIGNCOPY(self->tel, _tel);
205 }
206 - (NSArray *)tel {
207   return self->tel;
208 }
209
210 - (void)setAdr:(NSArray *)_adr {
211   ASSIGNCOPY(self->adr, _adr);
212 }
213 - (NSArray *)adr {
214   return self->adr;
215 }
216
217 - (void)setEmail:(NSArray *)_email {
218   ASSIGNCOPY(self->email, _email);
219 }
220 - (NSArray *)email {
221   return self->email;
222 }
223
224 - (void)setLabel:(NSArray *)_label {
225   ASSIGNCOPY(self->label, _label);
226 }
227 - (NSArray *)label {
228   return self->label;
229 }
230
231 - (void)setUrl:(NSArray *)_url {
232   ASSIGNCOPY(self->url, _url);
233 }
234 - (NSArray *)url {
235   return self->url;
236 }
237
238
239 - (void)setFreeBusyURL:(NSArray *)_v {
240   ASSIGNCOPY(self->fburl, _v);
241 }
242 - (NSArray *)freeBusyURL {
243   return self->fburl;
244 }
245 - (void)setCalURI:(NSArray *)_v {
246   ASSIGNCOPY(self->caluri, _v);
247 }
248 - (NSArray *)calURI {
249   return self->caluri;
250 }
251
252
253 - (void)setX:(NSDictionary *)_dict {
254   ASSIGNCOPY(self->x, _dict);
255 }
256 - (NSDictionary *)x {
257   return self->x;
258 }
259
260 /* description */
261
262 - (void)appendAttributesToDescription:(NSMutableString *)_ms {
263   if (self->uid   != nil) [_ms appendFormat:@" uid='%@'", self->uid];
264   
265   if ([self->tel   count] > 0) [_ms appendFormat:@" tel=%@",   self->tel];
266   if ([self->adr   count] > 0) [_ms appendFormat:@" adr=%@",   self->adr];
267   if ([self->email count] > 0) [_ms appendFormat:@" email=%@", self->email];
268   if ([self->label count] > 0) [_ms appendFormat:@" label=%@", self->label];
269   if ([self->x     count] > 0) [_ms appendFormat:@" x=%@",     self->x];
270 }
271
272 - (NSString *)description {
273   NSMutableString *str = nil;
274   
275   str = [NSMutableString stringWithCapacity:64];
276   [str appendFormat:@"<0x%08X[%@]:", self, NSStringFromClass([self class])];
277   [self appendAttributesToDescription:str];
278   [str appendString:@">"];
279   return str;
280 }
281
282 @end /* NGVCard */