Imported Upstream version 0.8~alpha1
[platform/upstream/syncevolution.git] / src / client-api / src / c++ / common / vocl / vCard / Contact.cpp
1 /*
2  * Funambol is a mobile platform developed by Funambol, Inc. 
3  * Copyright (C) 2003 - 2007 Funambol, Inc.
4  * 
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU Affero General Public License version 3 as published by
7  * the Free Software Foundation with the addition of the following permission 
8  * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
9  * WORK IN WHICH THE COPYRIGHT IS OWNED BY FUNAMBOL, FUNAMBOL DISCLAIMS THE 
10  * WARRANTY OF NON INFRINGEMENT  OF THIRD PARTY RIGHTS.
11  * 
12  * This program is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
15  * details.
16  * 
17  * You should have received a copy of the GNU Affero General Public License 
18  * along with this program; if not, see http://www.gnu.org/licenses or write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20  * MA 02110-1301 USA.
21  * 
22  * You can contact Funambol, Inc. headquarters at 643 Bair Island Road, Suite 
23  * 305, Redwood City, CA 94063, USA, or at email address info@funambol.com.
24  * 
25  * The interactive user interfaces in modified source and object code versions
26  * of this program must display Appropriate Legal Notices, as required under
27  * Section 5 of the GNU Affero General Public License version 3.
28  * 
29  * In accordance with Section 7(b) of the GNU Affero General Public License
30  * version 3, these Appropriate Legal Notices must retain the display of the
31  * "Powered by Funambol" logo. If the display of the logo is not reasonably 
32  * feasible for technical reasons, the Appropriate Legal Notices must display
33  * the words "Powered by Funambol".
34  */
35
36
37 #include "base/fscapi.h"
38 #include "base/util/utils.h"
39 #include "vocl/vCard/Contact.h"
40 #include "base/globalsdef.h"
41
42 USE_NAMESPACE
43
44 Contact::Contact() {
45     name           = NULL;
46     notes          = NULL;
47     businessDetail = NULL;
48     personalDetail = NULL;
49
50     setVersion(TEXT("2.1"));
51     setProdID(TEXT("VCARD"));
52 }
53
54 Contact::~Contact() {
55     if (name) {
56         delete name; name = NULL;
57     }
58     if (notes) {
59         delete notes; notes = NULL;
60     }
61     if (businessDetail) {
62         delete businessDetail; businessDetail = NULL;
63     }
64     if (personalDetail) {
65         delete personalDetail; personalDetail = NULL;
66     }
67 }
68
69 /**
70  * Returns the UID of this contact
71  *
72  * @return the uid of this contact or NULL if not specified
73  */
74 WCHAR* Contact::getUID(WCHAR* buf, int size) {
75
76     if(!containsProperty(TEXT("UID")))
77         return NULL;
78
79     if (buf == NULL) {
80         return (getProperty(TEXT("UID"))->getValue());
81     }
82
83     if (size >= 0) {
84         wcsncpy(buf, getProperty(TEXT("UID"))->getValue(), size);
85     } else {
86         wcscpy(buf, getProperty(TEXT("UID"))->getValue());
87     }
88
89     return buf;
90 }
91
92 WCHAR* Contact::getTimezone (WCHAR* buf, int size) {
93
94     if(!containsProperty(TEXT("TZ")))
95         return NULL;
96
97     if (buf == NULL) {
98         return (getProperty(TEXT("TZ"))->getValue());
99     }
100
101     if (size >= 0) {
102         wcsncpy(buf, getProperty(TEXT("TZ"))->getValue(), size);
103     } else {
104         wcscpy(buf, getProperty(TEXT("TZ"))->getValue());
105     }
106
107     return buf;
108 }
109
110 ArrayList* Contact::getNotes() {
111     if(!notes) {
112         for(int i = 0; i<propertiesCount();i++) {
113             if(!wcscmp(getProperty(i)->getName(), TEXT("NOTE")))
114                 if(getProperty(i)->getValue()) {
115                     vCardProperty *property = getPropertyFromVProperty(getProperty(i));
116                     Note* note = new Note();
117                     note->setProperty(*property);
118                     if(getProperty(i)->containsParameter(TEXT("TYPE")))
119                         note->setType(getProperty(i)->getParameterValue(TEXT("TYPE")));
120                     if(!notes)
121                         notes = new ArrayList();
122                     notes->add((ArrayElement&)*note);
123                 }
124         }
125     }
126
127     return notes;
128 }
129
130 void Contact::setNotes(ArrayList& list) {
131         int i,m;
132     if (notes) {
133         notes->clear();
134     } else {
135         notes = new ArrayList();
136     }
137
138     Note *note = NULL;
139     VProperty *vp;
140
141     for(i = 0, m = propertiesCount();i < m;i++) {
142         if(!wcscmp(getProperty(i)->getName(), TEXT("NOTE"))) {
143             removeProperty(i);
144             --i;
145             --m;
146         }
147     }
148
149     int s = list.size();
150     for (i=0; i<s; ++i) {
151         notes->add(*list[i]);
152
153         note = (Note*)list[i];
154         if(note->getProperty()) {
155             vp = getVPropertyFromProperty(TEXT("NOTE"), note->getProperty());
156             if(note->getType())
157                 vp->addParameter(TEXT("TYPE"), note->getType());
158             insertProperty(vp);
159         }
160     }
161 }
162
163 WCHAR* Contact::getRevision (WCHAR* buf, int size) {
164     if(!containsProperty(TEXT("REV")))
165         return NULL;
166
167     if (buf == NULL) {
168         return (getProperty(TEXT("REV"))->getValue());
169     }
170
171     if (size >= 0) {
172         wcsncpy(buf, getProperty(TEXT("REV"))->getValue(), size);
173     } else {
174         wcscpy(buf, getProperty(TEXT("REV"))->getValue());
175     }
176
177     return buf;
178 }
179
180 Name* Contact::getName () {
181     if (!name) {
182         if(containsProperty(TEXT("N")) && getProperty(TEXT("N"))->getValue()) {
183             VProperty* vp = getProperty(TEXT("N"));
184
185             name = new Name();
186             if(vp->getPropComponent(4)) {
187                 vCardProperty *salutation = getPropertyFromVProperty(vp);
188                 salutation->setValue(vp->getPropComponent(4));
189                 name->setSalutation(*salutation);
190
191                 delete salutation;
192             }
193             if(vp->getPropComponent(2)) {
194                 vCardProperty *firstName = getPropertyFromVProperty(vp);
195                 firstName->setValue(vp->getPropComponent(2));
196                 name->setFirstName(*firstName);
197
198                 delete firstName;
199             }
200             if(vp->getPropComponent(3)) {
201                 vCardProperty *middleName = getPropertyFromVProperty(vp);
202                 middleName->setValue(vp->getPropComponent(3));
203                 name->setMiddleName(*middleName);
204
205                 delete middleName;
206             }
207             if(vp->getPropComponent(1)) {
208                 vCardProperty *lastName = getPropertyFromVProperty(vp);
209                 lastName->setValue(vp->getPropComponent(1));
210                 name->setLastName(*lastName);
211
212                 delete lastName;
213             }
214             if(vp->getPropComponent(5)) {
215                 vCardProperty *suffix = getPropertyFromVProperty(vp);
216                 suffix->setValue(vp->getPropComponent(5));
217                 name->setSuffix(*suffix);
218
219                 delete suffix;
220             }
221         }
222
223         if(containsProperty(TEXT("FN")) && getProperty(TEXT("FN"))->getValue()) {
224             if (!name)
225                 name = new Name();
226
227             VProperty* vp = getProperty(TEXT("FN"));
228             vCardProperty *displayName = getPropertyFromVProperty(vp);
229             name->setDisplayName(*displayName);
230
231             delete displayName;
232         }
233
234         if(containsProperty(TEXT("NICKNAME")) && getProperty(TEXT("NICKNAME"))->getValue()) {
235             if (!name)
236                 name = new Name();
237
238             VProperty* vp = getProperty(TEXT("NICKNAME"));
239             vCardProperty *nickName = getPropertyFromVProperty(vp);
240             name->setNickname(*nickName);
241
242             delete nickName;
243         }
244     }
245     return name;
246 }
247
248 void Contact::setName(Name& n) {
249     if (name) delete name;
250
251     name = n.clone();
252
253     if (containsProperty(TEXT("N")))
254         removeProperty(TEXT("N"));
255     if (containsProperty(TEXT("FN")))
256         removeProperty(TEXT("FN"));
257     if (containsProperty(TEXT("NICKNAME")))
258         removeProperty(TEXT("NICKNAME"));
259
260     if(name) {
261         WCHAR *nameProp = new WCHAR[MAX_VPROPERTY_VALUE + 1];
262         wcscpy(nameProp,TEXT(""));
263         if(name->getLastName())
264             wcscat(nameProp,name->getLastName()->getValue());
265         wcscat(nameProp,TEXT(";"));
266
267         if(name->getFirstName())
268             wcscat(nameProp,name->getFirstName()->getValue());
269             wcscat(nameProp,TEXT(";"));
270
271         if(name->getMiddleName())
272             wcscat(nameProp,name->getMiddleName()->getValue());
273             wcscat(nameProp,TEXT(";"));
274
275         if(name->getSalutation())
276             wcscat(nameProp,name->getSalutation()->getValue());
277             wcscat(nameProp,TEXT(";"));
278
279         if(name->getSuffix())
280             wcscat(nameProp,name->getSuffix()->getValue());
281
282         VProperty* vpName = new VProperty(TEXT("N"), nameProp);
283         if(name->getFirstName()) {
284             if(name->getFirstName()->getCharset())
285                 vpName->addParameter(TEXT("CHARSET"), name->getFirstName()->getCharset());
286             if(name->getFirstName()->getEncoding())
287                 vpName->addParameter(TEXT("ENCODING"), name->getFirstName()->getEncoding());
288             if(name->getFirstName()->getLanguage())
289                 vpName->addParameter(TEXT("LANGUAGE"), name->getFirstName()->getLanguage());
290         }
291         insertProperty(vpName);
292
293         if(name->getDisplayName()) {
294             VProperty* vpDisplayName = getVPropertyFromProperty(TEXT("FN"), name->getDisplayName());
295             insertProperty(vpDisplayName);
296         }
297         if(name->getNickname()) {
298             VProperty* vpNickName = getVPropertyFromProperty(TEXT("NICKNAME"), name->getNickname());
299             insertProperty(vpNickName);
300         }
301     }
302 }
303
304 BusinessDetail* Contact::getBusinessDetail () {
305     if(!businessDetail) {
306         WCHAR* titles[MAX_TITLES];
307         int titlesIndex = 0;
308         ArrayList* phones = NULL;
309         ArrayList* emails = NULL;
310         ArrayList* webPages = NULL;
311         ContactDetail* contactDetail = NULL;
312         Address* adr = NULL;
313
314         for(int i = 0; i<propertiesCount();i++) {
315             if(!wcscmp(getProperty(i)->getName(), TEXT("ADR")) && getProperty(i)->isType(TEXT("WORK")))
316                 if(getProperty(i)->getValue()) {
317                     adr = composeAddress(getProperty(i), BUSINESS);
318                     if(!businessDetail)
319                         businessDetail = new BusinessDetail();
320
321                     businessDetail->setAddress(*adr);
322
323                     delete adr;
324                 }
325             if(!wcscmp(getProperty(i)->getName(), TEXT("LABEL")) && getProperty(i)->isType(TEXT("WORK")))
326                 if(getProperty(i)->getValue()) {
327                     adr = addLabelAddress(getProperty(i), BUSINESS);
328
329                     if(!businessDetail)
330                         businessDetail = new BusinessDetail();
331
332                     businessDetail->setAddress(*adr);
333
334                     delete adr;
335                 }
336             if(!wcscmp(getProperty(i)->getName(), TEXT("ROLE")))
337                 if(getProperty(i)->getValue()) {
338                     vCardProperty *prop = getPropertyFromVProperty(getProperty(i));
339                     if(!businessDetail)
340                         businessDetail = new BusinessDetail();
341                     businessDetail->setRole(*prop);
342
343                     delete prop;
344                 }
345             if(!wcscmp(getProperty(i)->getName(), TEXT("TITLE")))
346                 if(getProperty(i)->getValue()) {
347                     titles[titlesIndex] = new WCHAR[MAX_VPROPERTY_VALUE + 1];
348                     wcscpy(titles[titlesIndex], getProperty(i)->getValue());
349                     titlesIndex++;
350                 }
351
352             if(!wcscmp(getProperty(i)->getName(), TEXT("ORG")))
353                 if(getProperty(i)->getValue()) {
354                     vCardProperty *prop = getPropertyFromVProperty(getProperty(i));
355                     if(!businessDetail)
356                         businessDetail = new BusinessDetail();
357                     businessDetail->setCompany(*prop);
358
359                     delete prop;
360                 }
361             if(!wcscmp(getProperty(i)->getName(), TEXT("LOGO")))
362                 if(getProperty(i)->getValue()) {
363                     vCardProperty *prop = getPropertyFromVProperty(getProperty(i));
364                     if(!businessDetail)
365                         businessDetail = new BusinessDetail();
366                     businessDetail->setLogo(*prop);
367
368                     delete prop;
369                 }
370             if(!wcscmp(getProperty(i)->getName(), TEXT("TEL")))
371                 if(getProperty(i)->isType(TEXT("WORK"))) {
372                     if(getProperty(i)->isType(TEXT("CELL"))) {
373                         vCardProperty* prop = getPropertyFromVProperty(getProperty(i));
374                         Phone* phone = new Phone();
375                         phone->setPhoneNumber(*prop);
376                         phone->setType(TEXT("MobileBusinessTelephoneNumber"));
377                         if(!phones)
378                             phones = new ArrayList();
379                         phones->add((ArrayElement&) *phone);
380                         delete phone;
381                     }
382
383                     if(getProperty(i)->isType(TEXT("VOICE"))) {
384                         vCardProperty* prop = getPropertyFromVProperty(getProperty(i));
385                         Phone* phone = new Phone();
386                         phone->setPhoneNumber(*prop);
387                         phone->setType(TEXT("BusinessTelephoneNumber"));
388                         if(!phones)
389                             phones = new ArrayList();
390                         phones->add((ArrayElement&) *phone);
391                         delete phone;
392                     }
393
394                     if(getProperty(i)->isType(TEXT("FAX"))) {
395                         vCardProperty* prop = getPropertyFromVProperty(getProperty(i));
396                         Phone* phone = new Phone();
397                         phone->setPhoneNumber(*prop);
398                         phone->setType(TEXT("BusinessFaxNumber"));
399                         if(!phones)
400                             phones = new ArrayList();
401                         phones->add((ArrayElement&) *phone);
402                         delete phone;
403                     }
404                 }
405             if(!wcscmp(getProperty(i)->getName(), TEXT("EMAIL")))
406                 if(getProperty(i)->containsParameter(TEXT("WORK")) && getProperty(i)->isType(TEXT("INTERNET"))) {
407                     vCardProperty* prop = getPropertyFromVProperty(getProperty(i));
408                     Email* email = new Email();
409                     email->setEmailAddress(*prop);
410                     email->setType(TEXT("Email3Address"));
411                     if(!emails)
412                         emails = new ArrayList();
413                     emails->add((ArrayElement&) *email);
414                     delete email;
415                 }
416             if(!wcscmp(getProperty(i)->getName(), TEXT("URL")))
417                 if(getProperty(i)->containsParameter(TEXT("WORK"))) {
418                     vCardProperty* prop = getPropertyFromVProperty(getProperty(i));
419                     WebPage* url = new WebPage();
420                     url->setWebPage(*prop);
421                     url->setType(TEXT("BusinessWebPage"));
422                     if(!webPages)
423                         webPages = new ArrayList();
424                     webPages->add((ArrayElement&) *url);
425                     delete url;
426                 }
427         }
428        if(titlesIndex>0) {
429             if(!businessDetail)
430                 businessDetail = new BusinessDetail();
431             businessDetail->setTitles(titles, titlesIndex);
432             delete *titles;
433         }
434         if(phones) {
435             if(!contactDetail)
436                 contactDetail = new ContactDetail();
437             contactDetail->setPhones(*phones);
438             delete phones;
439         }
440         if(emails) {
441             if(!contactDetail)
442                 contactDetail = new ContactDetail();
443             contactDetail->setEmails(*emails);
444             delete emails;
445         }
446         if(webPages) {
447             if(!contactDetail)
448                 contactDetail = new ContactDetail();
449             contactDetail->setWebPages(*webPages);
450             delete webPages;
451         }
452         if(contactDetail) {
453             if(!businessDetail)
454                 businessDetail = new BusinessDetail();
455             businessDetail->setContactDetail(*contactDetail);
456             delete contactDetail;
457         }
458     }
459     return businessDetail;
460 }
461
462 void Contact::setBusinessDetail(BusinessDetail& d) {
463     if (businessDetail) delete businessDetail;
464
465     businessDetail = d.clone();
466
467     for(int i = 0, m = propertiesCount(); i < m;i++) {
468         if(!wcscmp(getProperty(i)->getName(), TEXT("ADR")) && getProperty(i)->isType(TEXT("WORK"))) {
469             removeProperty(i);
470             --i;
471             --m;
472         }
473         if(!wcscmp(getProperty(i)->getName(), TEXT("LABEL")) && getProperty(i)->isType(TEXT("WORK"))) {
474             removeProperty(i);
475             --i;
476             --m;
477         }
478         if(!wcscmp(getProperty(i)->getName(), TEXT("ROLE"))) {
479             removeProperty(i);
480             --i;
481             --m;
482         }
483         if(!wcscmp(getProperty(i)->getName(), TEXT("TITLE"))) {
484             removeProperty(i);
485             --i;
486             --m;
487         }
488         if(!wcscmp(getProperty(i)->getName(), TEXT("ORG"))) {
489             removeProperty(i);
490             --i;
491             --m;
492         }
493         if(!wcscmp(getProperty(i)->getName(), TEXT("LOGO"))) {
494             removeProperty(i);
495             --i;
496             --m;
497         }
498         if(!wcscmp(getProperty(i)->getName(), TEXT("TEL")) && getProperty(i)->isType(TEXT("WORK"))) {
499                     removeProperty(i);
500                     --i;
501                     --m;
502                 }
503         if(!wcscmp(getProperty(i)->getName(), TEXT("EMAIL")) && getProperty(i)->containsParameter(TEXT("WORK"))
504             && getProperty(i)->isType(TEXT("INTERNET"))) {
505                 removeProperty(i);
506                 --i;
507                 --m;
508             }
509             if(!wcscmp(getProperty(i)->getName(), TEXT("URL")) && getProperty(i)->containsParameter(TEXT("WORK"))) {
510                 removeProperty(i);
511                 --i;
512                 --m;
513             }
514     }
515
516     if(businessDetail) {
517         if(businessDetail->getAddress()) {
518             VProperty* vp = composeVAddress(businessDetail->getAddress());
519             vp->addParameter(TEXT("TYPE"), TEXT("WORK"));
520             insertProperty(vp);
521
522             if(businessDetail->getAddress()->getLabel()) {
523                 VProperty* vp = getVPropertyFromProperty(TEXT("LABEL"),businessDetail->getAddress()->getLabel());
524                 vp->addParameter(TEXT("TYPE"), TEXT("WORK"));
525                 insertProperty(vp);
526             }
527         }
528         if(businessDetail->getContactDetail()) {
529             if(businessDetail->getContactDetail()->getEmails()) {
530                 ArrayList* emails = businessDetail->getContactDetail()->getEmails();
531                 for (int i=0; i<emails->size(); ++i) {
532                     if(((Email*) emails->get(i))->getProperty()) {
533                         VProperty* vp = getVPropertyFromProperty(TEXT("EMAIL"), ((Email*)emails->get(i))->getProperty());
534                         vp->addParameter(TEXT("WORK"), NULL);
535                         vp->addParameter(TEXT("TYPE"),TEXT("INTERNET"));
536                         insertProperty(vp);
537                     }
538                 }
539             }
540             if(businessDetail->getContactDetail()->getWebPages()) {
541                 ArrayList* webs = businessDetail->getContactDetail()->getWebPages();
542                 for (int i=0; i<webs->size(); ++i) {
543                     if(((WebPage*) webs->get(i))->getProperty()) {
544                         VProperty* vp = getVPropertyFromProperty(TEXT("URL"), ((WebPage*)webs->get(i))->getProperty());
545                         vp->addParameter(TEXT("WORK"), NULL);
546                         insertProperty(vp);
547                     }
548                 }
549             }
550             if(businessDetail->getContactDetail()->getPhones()) {
551                 ArrayList* phones = businessDetail->getContactDetail()->getPhones();
552                 for (int i=0; i<phones->size(); ++i)
553                     if(((Phone*) phones->get(i))->getProperty()) {
554                         VProperty* vp = getVPropertyFromProperty(TEXT("TEL"), ((Phone*)phones->get(i))->getProperty());
555                         if(!wcscmp(TEXT("MobileBusinessTelephoneNumber"),((Phone*)phones->get(i))->getType()))
556                             vp->addParameter(TEXT("TYPE"),TEXT("WORK,CELL"));
557                         if(!wcscmp(TEXT("BusinessTelephoneNumber"),((Phone*)phones->get(i))->getType()))
558                             vp->addParameter(TEXT("TYPE"),TEXT("WORK,VOICE"));
559                         if(!wcscmp(TEXT("BusinessFaxNumber"),((Phone*)phones->get(i))->getType()))
560                             vp->addParameter(TEXT("TYPE"),TEXT("WORK,FAX"));
561                         insertProperty(vp);
562                     }
563             }
564         }
565         if(businessDetail->getRole()) {
566             VProperty* vp = getVPropertyFromProperty(TEXT("ROLE"), businessDetail->getRole());
567             insertProperty(vp);
568         }
569         if(businessDetail->getLogo()) {
570             VProperty* vp = getVPropertyFromProperty(TEXT("LOGO"), businessDetail->getLogo());
571             insertProperty(vp);
572         }
573         if(businessDetail->getCompany()) {
574             VProperty* vp = getVPropertyFromProperty(TEXT("ORG"), businessDetail->getCompany());
575             insertProperty(vp);
576         }
577
578         if(businessDetail->getTitles()) {
579             ArrayList* titles = businessDetail->getTitles();
580             for (int i=0; i<titles->size(); ++i) {
581                 if(((Title*)titles->get(i))->getProperty()) {
582                     VProperty* vp = getVPropertyFromProperty(TEXT("TITLE"), ((Title*)titles->get(i))->getProperty());
583                     insertProperty(vp);
584                 }
585             }
586         }
587     }
588 }
589
590 PersonalDetail* Contact::getPersonalDetail() {
591     if(!personalDetail) {
592         ArrayList* phones = new ArrayList();
593         ArrayList* emails = new ArrayList();
594         ArrayList* webPages = new ArrayList();
595         ContactDetail* contactDetail = NULL;
596         Address* adr = NULL;
597
598         for(int i = 0; i<propertiesCount();i++) {
599             if(!wcscmp(getProperty(i)->getName(), TEXT("ADR")) && getProperty(i)->isType(TEXT("HOME")))
600                 if(getProperty(i)->getValue()) {
601                     adr = composeAddress(getProperty(i), HOME);
602                     if(!personalDetail)
603                         personalDetail = new PersonalDetail();
604                     personalDetail->setAddress(*adr);
605                     delete adr;
606                 }
607             if(!wcscmp(getProperty(i)->getName(), TEXT("LABEL")) && getProperty(i)->isType(TEXT("HOME")))
608                 if(getProperty(i)->getValue()) {
609                     adr = addLabelAddress(getProperty(i), HOME);
610                     if(!personalDetail)
611                         personalDetail = new PersonalDetail();
612                     personalDetail->setAddress(*adr);
613                     delete adr;
614                 }
615             if(!wcscmp(getProperty(i)->getName(), TEXT("ADR")) && !getProperty(i)->isType(TEXT("HOME"))
616                 && !getProperty(i)->isType(TEXT("WORK")))
617                 if(getProperty(i)->getValue()) {
618                     adr = composeAddress(getProperty(i), OTHER);
619                     if(!personalDetail)
620                         personalDetail = new PersonalDetail();
621                     personalDetail->setOtherAddress(*adr);
622                     delete adr;
623                 }
624             if(!wcscmp(getProperty(i)->getName(), TEXT("LABEL")) && !getProperty(i)->isType(TEXT("HOME"))
625                 && !getProperty(i)->isType(TEXT("WORK")))
626                 if(getProperty(i)->getValue()) {
627                     adr = addLabelAddress(getProperty(i), OTHER);
628                     if(!personalDetail)
629                         personalDetail = new PersonalDetail();
630                     personalDetail->setOtherAddress(*adr);
631                     delete adr;
632                 }
633             if(!wcscmp(getProperty(i)->getName(), TEXT("PHOTO")))
634                 if(getProperty(i)->getValue()) {
635                     vCardProperty* prop = getPropertyFromVProperty(getProperty(i));
636                     if(!personalDetail)
637                         personalDetail = new PersonalDetail();
638                     personalDetail->setPhoto(*prop);
639                 }
640             if(!wcscmp(getProperty(i)->getName(), TEXT("BDAY")) && getProperty(i)->getValue()) {
641                 if(!personalDetail)
642                     personalDetail = new PersonalDetail();
643                 personalDetail->setBirthday(getProperty(i)->getValue());
644             }
645
646             if(!wcscmp(getProperty(i)->getName(), TEXT("TEL"))) {
647                 if(getProperty(i)->isType(TEXT("HOME"))) {
648                     if(getProperty(i)->isType(TEXT("CELL"))) {
649                         vCardProperty* prop = getPropertyFromVProperty(getProperty(i));
650                         Phone* phone = new Phone();
651                         phone->setPhoneNumber(*prop);
652                         phone->setType(TEXT("MobileHomeTelephoneNumber"));
653                         phones->add((ArrayElement&) *phone);
654                         delete phone;
655                     }
656
657                     if(getProperty(i)->isType(TEXT("VOICE"))) {
658                         vCardProperty* prop = getPropertyFromVProperty(getProperty(i));
659                         Phone* phone = new Phone();
660                         phone->setPhoneNumber(*prop);
661                         phone->setType(TEXT("HomeTelephoneNumber"));
662                         phones->add((ArrayElement&) *phone);
663                         delete phone;
664                     }
665
666                     if(getProperty(i)->isType(TEXT("FAX"))) {
667                         vCardProperty* prop = getPropertyFromVProperty(getProperty(i));
668                         Phone* phone = new Phone();
669                         phone->setPhoneNumber(*prop);
670                         phone->setType(TEXT("HomeFaxNumber"));
671                         phones->add((ArrayElement&) *phone);
672                         delete phone;
673                     }
674                 }
675                 if(getProperty(i)->containsParameter(TEXT("PAGER"))) {
676                     vCardProperty* prop = getPropertyFromVProperty(getProperty(i));
677                     Phone* phone = new Phone();
678                     phone->setPhoneNumber(*prop);
679                     phone->setType(TEXT("PagerNumber"));
680                     phones->add((ArrayElement&) *phone);
681                     delete phone;
682                 }
683                 if(getProperty(i)->isType(TEXT("CELL")) && !getProperty(i)->isType(TEXT("HOME"))
684                     && !getProperty(i)->isType(TEXT("WORK"))) {
685                         vCardProperty* prop = getPropertyFromVProperty(getProperty(i));
686                         Phone* phone = new Phone();
687                         phone->setPhoneNumber(*prop);
688                         phone->setType(TEXT("MobileTelephoneNumber"));
689                         phones->add((ArrayElement&) *phone);
690                         delete phone;
691                     }
692                 if(getProperty(i)->isType(TEXT("VOICE")) && !getProperty(i)->isType(TEXT("HOME"))
693                     && !getProperty(i)->isType(TEXT("WORK"))) {
694                         vCardProperty* prop = getPropertyFromVProperty(getProperty(i));
695                         Phone* phone = new Phone();
696                         phone->setPhoneNumber(*prop);
697                         phone->setType(TEXT("OtherTelephoneNumber"));
698                         phones->add((ArrayElement&) *phone);
699                         delete phone;
700                     }
701                 if(getProperty(i)->isType(TEXT("FAX")) && !getProperty(i)->isType(TEXT("HOME"))
702                     && !getProperty(i)->isType(TEXT("WORK"))) {
703                         vCardProperty* prop = getPropertyFromVProperty(getProperty(i));
704                         Phone* phone = new Phone();
705                         phone->setPhoneNumber(*prop);
706                         phone->setType(TEXT("OtherFaxNumber"));
707                         phones->add((ArrayElement&) *phone);
708                         delete phone;
709                     }
710             }
711             if(!wcscmp(getProperty(i)->getName(), TEXT("EMAIL"))) {
712                 if(getProperty(i)->containsParameter(TEXT("HOME")) && getProperty(i)->isType(TEXT("INTERNET"))) {
713                     vCardProperty* prop = getPropertyFromVProperty(getProperty(i));
714                     Email* email = new Email();
715                     email->setEmailAddress(*prop);
716                     email->setType(TEXT("Email2Address"));
717                     emails->add((ArrayElement&) *email);
718                     delete email;
719                 }
720                 if(getProperty(i)->isType(TEXT("INTERNET")) && !getProperty(i)->containsParameter(TEXT("HOME"))
721                     && !getProperty(i)->containsParameter(TEXT("WORK"))) {
722                     vCardProperty* prop = getPropertyFromVProperty(getProperty(i));
723                     Email* email = new Email();
724                     email->setEmailAddress(*prop);
725                     email->setType(TEXT("Email1Address"));
726                     emails->add((ArrayElement&) *email);
727                     delete email;
728                 }
729             }
730             if(!wcscmp(getProperty(i)->getName(), TEXT("URL"))) {
731                 if(getProperty(i)->containsParameter(TEXT("HOME"))) {
732                     vCardProperty* prop = getPropertyFromVProperty(getProperty(i));
733                     WebPage* url = new WebPage();
734                     url->setWebPage(*prop);
735                     url->setType(TEXT("HomeWebPage"));
736                     webPages->add((ArrayElement&) *url);
737                     delete url;
738                 }
739                 if(!getProperty(i)->containsParameter(TEXT("HOME")) && !getProperty(i)->containsParameter(TEXT("WORK"))) {
740                     vCardProperty* prop = getPropertyFromVProperty(getProperty(i));
741                     WebPage* url = new WebPage();
742                     url->setWebPage(*prop);
743                     url->setType(TEXT("WebPage"));
744                     webPages->add((ArrayElement&) *url);
745                     delete url;
746                 }
747             }
748         } //end for VProperties
749         if(phones) {
750             if(!contactDetail)
751                 contactDetail = new ContactDetail();
752             contactDetail->setPhones(*phones);
753             delete phones;
754         }
755         if(emails) {
756             if(!contactDetail)
757                 contactDetail = new ContactDetail();
758             contactDetail->setEmails(*emails);
759             delete emails;
760         }
761         if(webPages) {
762             if(!contactDetail)
763                 contactDetail = new ContactDetail();
764             contactDetail->setWebPages(*webPages);
765             delete webPages;
766         }
767         if(contactDetail) {
768             if(!personalDetail)
769                 personalDetail = new PersonalDetail();
770             personalDetail->setContactDetail(*contactDetail);
771             delete contactDetail;
772         }
773     }
774     return personalDetail;
775 }
776
777 void Contact::setPersonalDetail(PersonalDetail& d) {
778     if (personalDetail) delete personalDetail;
779
780     personalDetail = d.clone();
781
782     for(int i = 0, m = propertiesCount(); i < m ; i++) {
783         if(!wcscmp(getProperty(i)->getName(), TEXT("ADR")) && getProperty(i)->isType(TEXT("HOME"))) {
784             removeProperty(i);
785             --i;
786             --m;
787         }
788         if(!wcscmp(getProperty(i)->getName(), TEXT("ADR")) && !getProperty(i)->isType(TEXT("HOME"))
789             && !getProperty(i)->isType(TEXT("WORK"))) {
790             removeProperty(i);
791             --i;
792             --m;
793         }
794         if(!wcscmp(getProperty(i)->getName(), TEXT("LABEL")) && getProperty(i)->isType(TEXT("HOME"))) {
795             removeProperty(i);
796             --i;
797             --m;
798         }
799         if(!wcscmp(getProperty(i)->getName(), TEXT("LABEL")) && !getProperty(i)->isType(TEXT("HOME"))
800             && !getProperty(i)->isType(TEXT("WORK"))) {
801                 removeProperty(i);
802                 --i;
803                 --m;
804             }
805         if(!wcscmp(getProperty(i)->getName(), TEXT("PHOTO"))) {
806             removeProperty(i);
807             --i;
808             --m;
809         }
810         if(!wcscmp(getProperty(i)->getName(), TEXT("BDAY"))) {
811             removeProperty(i);
812             --i;
813             --m;
814         }
815         if(!wcscmp(getProperty(i)->getName(), TEXT("TEL")) && !getProperty(i)->isType(TEXT("WORK")))
816             if(getProperty(i)->isType(TEXT("CELL")) || getProperty(i)->isType(TEXT("VOICE"))
817                 || getProperty(i)->isType(TEXT("FAX"))) {
818                     removeProperty(i);
819                     --i;
820                     --m;
821                 }
822         if(!wcscmp(getProperty(i)->getName(), TEXT("EMAIL")) && !getProperty(i)->containsParameter(TEXT("WORK"))
823             && getProperty(i)->isType(TEXT("INTERNET"))) {
824                 removeProperty(i);
825                 --i;
826                 --m;
827             }
828         if(!wcscmp(getProperty(i)->getName(), TEXT("URL")) && !getProperty(i)->containsParameter(TEXT("WORK"))) {
829             removeProperty(i);
830             --i;
831             --m;
832         }
833     }
834
835     if(personalDetail) {
836         if(personalDetail->getAddress()) {
837             VProperty* vp = composeVAddress(personalDetail->getAddress());
838             vp->addParameter(TEXT("TYPE"),TEXT("HOME"));
839             insertProperty(vp);
840
841             if(personalDetail->getAddress()->getLabel()) {
842                 VProperty* vp = getVPropertyFromProperty(TEXT("LABEL"),personalDetail->getAddress()->getLabel());
843                 vp->addParameter(TEXT("TYPE"),TEXT("HOME"));
844                 insertProperty(vp);
845             }
846         }
847         if(personalDetail->getOtherAddress()) {
848             VProperty* vp = composeVAddress(personalDetail->getOtherAddress());
849             insertProperty(vp);
850
851             if(personalDetail->getOtherAddress()->getLabel()) {
852                 VProperty* vp = getVPropertyFromProperty(TEXT("LABEL"),personalDetail->getOtherAddress()->getLabel());
853                 insertProperty(vp);
854             }
855         }
856         if(personalDetail->getContactDetail()) {
857             if(personalDetail->getContactDetail()->getEmails()) {
858                 ArrayList* emails = personalDetail->getContactDetail()->getEmails();
859                 for (int i=0; i<emails->size(); ++i) {
860                     if(((Email*) emails->get(i))->getProperty()) {
861                         VProperty* vp = getVPropertyFromProperty(TEXT("EMAIL"), ((Email*)emails->get(i))->getProperty());
862                         if(!wcscmp(TEXT("Email2Address") ,((Email*)emails->get(i))->getType()))
863                             vp->addParameter(TEXT("HOME"), NULL);
864                         vp->addParameter(TEXT("TYPE"),TEXT("INTERNET"));
865                         insertProperty(vp);
866                     }
867                 }
868             }
869             if(personalDetail->getContactDetail()->getWebPages()) {
870                 ArrayList* webs = personalDetail->getContactDetail()->getWebPages();
871                 for (int i=0; i<webs->size(); ++i) {
872                     if(((WebPage*) webs->get(i))->getProperty()) {
873                         VProperty* vp = getVPropertyFromProperty(TEXT("URL"), ((WebPage*)webs->get(i))->getProperty());
874                         if(!wcscmp(TEXT("HomeWebPage") ,((WebPage*)webs->get(i))->getType()))
875                             vp->addParameter(TEXT("HOME"), NULL);
876                         insertProperty(vp);
877                     }
878                 }
879             }
880             if(personalDetail->getContactDetail()->getPhones()) {
881                 ArrayList* phones = personalDetail->getContactDetail()->getPhones();
882                 for (int i=0; i<phones->size(); ++i)
883                     if(((Phone*) phones->get(i))->getProperty()) {
884                         VProperty* vp = getVPropertyFromProperty(TEXT("TEL"), ((Phone*)phones->get(i))->getProperty());
885                         if(!wcscmp(TEXT("MobileTelephoneNumber"),((Phone*)phones->get(i))->getType()))
886                             vp->addParameter(TEXT("TYPE"), TEXT("CELL"));
887                         if(!wcscmp(TEXT("MobileHomeTelephoneNumber"),((Phone*)phones->get(i))->getType()))
888                             vp->addParameter(TEXT("TYPE"),TEXT("HOME,CELL"));
889                         if(!wcscmp(TEXT("OtherTelephoneNumber"),((Phone*)phones->get(i))->getType()))
890                             vp->addParameter(TEXT("TYPE"),TEXT("VOICE"));
891                         if(!wcscmp(TEXT("HomeTelephoneNumber"),((Phone*)phones->get(i))->getType()))
892                             vp->addParameter(TEXT("TYPE"),TEXT("HOME,VOICE"));
893                         if(!wcscmp(TEXT("OtherFaxNumber"),((Phone*)phones->get(i))->getType()))
894                             vp->addParameter(TEXT("TYPE"), TEXT("FAX"));
895                         if(!wcscmp(TEXT("HomeFaxNumber"),((Phone*)phones->get(i))->getType()))
896                              vp->addParameter(TEXT("TYPE"), TEXT("HOME,FAX"));
897                         insertProperty(vp);
898                     }
899             }
900         } //end contactDetail
901         if(personalDetail->getPhoto()) {
902             VProperty* vp = getVPropertyFromProperty(TEXT("PHOTO"), personalDetail->getPhoto());
903             insertProperty(vp);
904         }
905         if(personalDetail->getBirthday()) {
906             VProperty* vp = new VProperty(TEXT("BDAY"), personalDetail->getBirthday());
907             insertProperty(vp);
908         }
909     }
910 }
911
912 void Contact::setUID (WCHAR* u) {
913     if (containsProperty(TEXT("UID")))
914         getProperty(TEXT("UID"))->setValue(u);
915     else
916         insertProperty(new VProperty(TEXT("UID"),u));
917 }
918
919 void Contact::setTimezone (WCHAR* tz) {
920     if (containsProperty(TEXT("TZ")))
921         getProperty(TEXT("TZ"))->setValue(tz);
922     else
923         insertProperty(new VProperty(TEXT("TZ"),tz));
924 }
925
926 void Contact::setRevision (WCHAR* r) {
927     if (containsProperty(TEXT("REV")))
928         getProperty(TEXT("REV"))->setValue(r);
929     else
930         insertProperty(new VProperty(TEXT("REV"),r));
931 }
932
933 void Contact::set(WCHAR** p, WCHAR* v) {
934     if(*p)
935         delete *p;
936     *p = wstrdup(v);
937 }
938
939 vCardProperty* Contact::getPropertyFromVProperty(VProperty* vp) {
940
941     if(vp) {
942         vCardProperty *prop = new vCardProperty(vp->getValue());
943         if(vp->getParameterValue(TEXT("ENCODING")))
944             prop->setEncoding(vp->getParameterValue(TEXT("ENCODING")));
945         if(vp->containsParameter(TEXT("BASE64")))
946             prop->setEncoding(TEXT("BASE64"));
947         if(vp->containsParameter(TEXT("QUOTED-PRINTABLE")))
948             prop->setEncoding(TEXT("QUOTED-PRINTABLE"));
949         if(vp->getParameterValue(TEXT("LANGUAGE")))
950             prop->setLanguage(vp->getParameterValue(TEXT("LANGUAGE")));
951         if(vp->getParameterValue(TEXT("CHARSET")))
952             prop->setCharset(vp->getParameterValue(TEXT("CHARSET")));
953         return prop;
954     }
955
956     return NULL;
957 }
958
959 VProperty* Contact::getVPropertyFromProperty(WCHAR*name, vCardProperty* prop) {
960     if(prop && name) {
961         VProperty *vprop = new VProperty(name, prop->getValue());
962         if(prop->getCharset())
963             vprop->addParameter(TEXT("CHARSET"), prop->getCharset());
964         if(prop->getLanguage())
965             vprop->addParameter(TEXT("LANGUAGE"), prop->getLanguage());
966         if(prop->getEncoding())
967             vprop->addParameter(TEXT("ENCODING"), prop->getEncoding());
968         return vprop;
969     }
970
971     return NULL;
972 }
973
974 VProperty* Contact::composeVAddress(Address* adr) {
975     WCHAR *addressValue = new WCHAR[MAX_VPROPERTY_VALUE + 1];
976     WCHAR *encoding = NULL;
977     WCHAR *language = NULL;
978     WCHAR *charset = NULL;
979
980     wcscpy(addressValue,TEXT(""));
981     if(adr->getPostOfficeAddress()) {
982         wcscat(addressValue, adr->getPostOfficeAddress()->getValue());
983         if(adr->getPostOfficeAddress()->getCharset()) {
984             charset = new WCHAR[MAX_VPROPERTY_VALUE +1 ];
985             wcscpy(charset, adr->getPostOfficeAddress()->getCharset());
986         }
987         if(adr->getPostOfficeAddress()->getLanguage()) {
988             language = new WCHAR[MAX_VPROPERTY_VALUE + 1];
989             wcscpy(language, adr->getPostOfficeAddress()->getLanguage());
990         }
991         if(adr->getPostOfficeAddress()->getEncoding()) {
992             encoding = new WCHAR[MAX_VPROPERTY_VALUE +1 ];
993             wcscpy(encoding, adr->getPostOfficeAddress()->getEncoding());
994         }
995     }
996     wcscat(addressValue, TEXT(";"));
997     if(adr->getRoomNumber()) {
998         wcscat(addressValue, adr->getRoomNumber()->getValue());
999         if(!charset)
1000             if(adr->getRoomNumber()->getCharset()) {
1001                 charset = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1002                 wcscpy(charset, adr->getRoomNumber()->getCharset());
1003             }
1004         if(!language)
1005             if(adr->getRoomNumber()->getLanguage()) {
1006                 language = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1007                 wcscpy(language, adr->getRoomNumber()->getLanguage());
1008             }
1009         if(!encoding)
1010             if(adr->getRoomNumber()->getEncoding()) {
1011                 encoding = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1012                 wcscpy(encoding, adr->getRoomNumber()->getEncoding());
1013             }
1014     }
1015     wcscat(addressValue, TEXT(";"));
1016     if(adr->getStreet()) {
1017         wcscat(addressValue, adr->getStreet()->getValue());
1018         if(!charset)
1019             if(adr->getStreet()->getCharset()) {
1020                 charset = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1021                 wcscpy(charset, adr->getStreet()->getCharset());
1022             }
1023         if(!language)
1024             if(adr->getStreet()->getLanguage()) {
1025                 language = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1026                 wcscpy(language, adr->getStreet()->getLanguage());
1027             }
1028         if(!encoding)
1029             if(adr->getStreet()->getEncoding()) {
1030                 encoding = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1031                 wcscpy(encoding, adr->getStreet()->getEncoding());
1032             }
1033     }
1034     wcscat(addressValue, TEXT(";"));
1035     if(adr->getCity()) {
1036         wcscat(addressValue, adr->getCity()->getValue());
1037         if(!charset)
1038             if(adr->getCity()->getCharset()) {
1039                 charset = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1040                 wcscpy(charset, adr->getCity()->getCharset());
1041             }
1042         if(!language)
1043             if(adr->getCity()->getLanguage()) {
1044                 language = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1045                 wcscpy(language, adr->getCity()->getLanguage());
1046             }
1047         if(!encoding)
1048             if(adr->getCity()->getEncoding()) {
1049                 encoding = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1050                 wcscpy(encoding, adr->getCity()->getEncoding());
1051             }
1052     }
1053     wcscat(addressValue, TEXT(";"));
1054     if(adr->getState()) {
1055         wcscat(addressValue, adr->getState()->getValue());
1056         if(!charset)
1057             if(adr->getState()->getCharset()) {
1058                 charset = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1059                 wcscpy(charset, adr->getState()->getCharset());
1060             }
1061         if(!language)
1062             if(adr->getState()->getLanguage()) {
1063                 language = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1064                 wcscpy(language, adr->getState()->getLanguage());
1065             }
1066         if(!encoding)
1067             if(adr->getState()->getEncoding()) {
1068                 encoding = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1069                 wcscpy(encoding, adr->getState()->getEncoding());
1070             }
1071     }
1072     wcscat(addressValue, TEXT(";"));
1073     if(adr->getPostalCode()) {
1074         wcscat(addressValue, adr->getPostalCode()->getValue());
1075         if(!charset)
1076             if(adr->getPostalCode()->getCharset()) {
1077                 charset = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1078                 wcscpy(charset, adr->getPostalCode()->getCharset());
1079             }
1080         if(!language)
1081             if(adr->getPostalCode()->getLanguage()) {
1082                 language = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1083                 wcscpy(language, adr->getPostalCode()->getLanguage());
1084             }
1085         if(!encoding)
1086             if(adr->getPostalCode()->getEncoding()) {
1087                 encoding = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1088                 wcscpy(encoding, adr->getPostalCode()->getEncoding());
1089             }
1090     }
1091     wcscat(addressValue, TEXT(";"));
1092     if(adr->getCountry()) {
1093         wcscat(addressValue, adr->getCountry()->getValue());
1094         if(!charset)
1095             if(adr->getCountry()->getCharset()) {
1096                 charset = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1097                 wcscpy(charset, adr->getCountry()->getCharset());
1098             }
1099         if(!language)
1100             if(adr->getCountry()->getLanguage()) {
1101                 language = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1102                 wcscpy(language, adr->getCountry()->getLanguage());
1103             }
1104         if(!encoding)
1105             if(adr->getCountry()->getEncoding()) {
1106                 encoding = new WCHAR[MAX_VPROPERTY_VALUE + 1];
1107                 wcscpy(encoding, adr->getCountry()->getEncoding());
1108             }
1109     }
1110
1111     VProperty* vp = new VProperty(TEXT("ADR"), addressValue);
1112     if(charset)
1113         vp->addParameter(TEXT("CHARSET"), charset);
1114     if(language)
1115         vp->addParameter(TEXT("LANGUAGE"), language);
1116     if(encoding)
1117         vp->addParameter(TEXT("ENCODING"), encoding);
1118
1119     return vp;
1120 }
1121
1122 Address* Contact::composeAddress(VProperty* vp, int type) {
1123     if(vp) {
1124         Address* adr;
1125         switch (type) {
1126             case BUSINESS:
1127                 if(!businessDetail || !businessDetail->getAddress())
1128                     adr = new Address();
1129                 else
1130                     adr = businessDetail->getAddress()->clone();
1131                 break;
1132             case HOME:
1133                 if(!personalDetail || !personalDetail->getAddress())
1134                     adr = new Address();
1135                 else
1136                     adr = personalDetail->getAddress()->clone();
1137                 break;
1138             case OTHER:
1139                 if(!personalDetail || !personalDetail->getOtherAddress())
1140                     adr = new Address();
1141                 else
1142                     adr = personalDetail->getOtherAddress()->clone();
1143                 break;
1144             default:
1145                 return NULL;
1146         }
1147
1148         if(vp->getPropComponent(1)){
1149             vCardProperty *prop = getPropertyFromVProperty(vp);
1150             prop->setValue(vp->getPropComponent(1));
1151             adr->setPostOfficeAddress(*prop);
1152
1153             delete prop;
1154         }
1155         if(vp->getPropComponent(2)){
1156             vCardProperty *prop = getPropertyFromVProperty(vp);
1157             prop->setValue(vp->getPropComponent(2));
1158             adr->setRoomNumber(*prop);
1159
1160             delete prop;
1161         }
1162         if(vp->getPropComponent(3)){
1163             vCardProperty *prop = getPropertyFromVProperty(vp);
1164             prop->setValue(vp->getPropComponent(3));
1165             adr->setStreet(*prop);
1166
1167             delete prop;
1168         }
1169         if(vp->getPropComponent(4)){
1170             vCardProperty *prop = getPropertyFromVProperty(vp);
1171             prop->setValue(vp->getPropComponent(4));
1172             adr->setCity(*prop);
1173
1174             delete prop;
1175         }
1176         if(vp->getPropComponent(5)){
1177             vCardProperty *prop = getPropertyFromVProperty(vp);
1178             prop->setValue(vp->getPropComponent(5));
1179             adr->setState(*prop);
1180
1181             delete prop;
1182         }
1183         if(vp->getPropComponent(6)){
1184             vCardProperty *prop = getPropertyFromVProperty(vp);
1185             prop->setValue(vp->getPropComponent(6));
1186             adr->setPostalCode(*prop);
1187
1188             delete prop;
1189         }
1190         if(vp->getPropComponent(7)){
1191             vCardProperty *prop = getPropertyFromVProperty(vp);
1192             prop->setValue(vp->getPropComponent(7));
1193             adr->setCountry(*prop);
1194
1195             delete prop;
1196         }
1197         return adr;
1198     }
1199     return NULL;
1200 }
1201
1202 Address* Contact::addLabelAddress(VProperty* vp, int type) {
1203     if(vp) {
1204         Address* adr;
1205
1206         switch (type) {
1207             case BUSINESS:
1208                 if(!businessDetail || !businessDetail->getAddress())
1209                     adr = new Address();
1210                 else
1211                     adr = businessDetail->getAddress()->clone();
1212                 break;
1213             case HOME:
1214                 if(!personalDetail || !personalDetail->getAddress())
1215                     adr = new Address();
1216                 else
1217                     adr = personalDetail->getAddress()->clone();
1218                 break;
1219             case OTHER:
1220                 if(!personalDetail || !personalDetail->getOtherAddress())
1221                     adr = new Address();
1222                 else
1223                     adr = personalDetail->getOtherAddress()->clone();
1224                 break;
1225             default:
1226                 return NULL;
1227         }
1228
1229         if(vp->getValue()) {
1230             vCardProperty *prop = getPropertyFromVProperty(vp);
1231             adr->setLabel(*prop);
1232
1233             delete prop;
1234         }
1235         return adr;
1236     }
1237     return NULL;
1238 }
1239
1240 Contact* Contact::clone() {
1241
1242     Contact* ret = new Contact();
1243     VProperty* property;
1244
1245     for(int i = 0; i < this->propertiesCount(); i++) {
1246         property = (VProperty*)this->getProperty(i)->clone();
1247         ret->addProperty(property);
1248     }
1249     return ret;
1250 }
1251
1252 WCHAR* Contact::toString() {
1253     if(!containsProperty(TEXT("BEGIN")) && !containsProperty(TEXT("VERSION")) && !containsProperty(TEXT("END"))) {
1254         //this means the Contact was created with new, not using vConverter::parse
1255         //we need to add BEGIN, VERSION, END to VObject properties
1256         addFirstProperty(new VProperty(TEXT("VERSION"), getVersion()));
1257         addFirstProperty(new VProperty(TEXT("BEGIN"), TEXT("VCARD")));
1258         addProperty(new VProperty(TEXT("END"), TEXT("VCARD")));
1259     }
1260
1261     return ((VObject*)this)->toString();
1262 }