summaryrefslogtreecommitdiffabout
path: root/kabc/addressee.cpp
authorzautrix <zautrix>2004-06-26 19:01:18 (UTC)
committer zautrix <zautrix>2004-06-26 19:01:18 (UTC)
commitb9aad1f15dc600e4dbe4c62d3fcced6363188ba3 (patch) (unidiff)
tree2c3d4004fb21c72cba65793859f9bcd8ffd3a49c /kabc/addressee.cpp
downloadkdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.zip
kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.tar.gz
kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.tar.bz2
Initial revision
Diffstat (limited to 'kabc/addressee.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/addressee.cpp1616
1 files changed, 1616 insertions, 0 deletions
diff --git a/kabc/addressee.cpp b/kabc/addressee.cpp
new file mode 100644
index 0000000..5cb194a
--- a/dev/null
+++ b/kabc/addressee.cpp
@@ -0,0 +1,1616 @@
1/*** Warning! This file has been generated by the script makeaddressee ***/
2/*
3 This file is part of libkabc.
4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
10
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details.
15
16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.
20*/
21
22/*
23Enhanced Version of the file for platform independent KDE tools.
24Copyright (c) 2004 Ulf Schenk
25
26$Id$
27*/
28
29#include <kconfig.h>
30
31#include <ksharedptr.h>
32#include <kdebug.h>
33#include <kapplication.h>
34#include <klocale.h>
35//US
36#include <kstandarddirs.h>
37
38//US #include "resource.h"
39#include "addressee.h"
40
41using namespace KABC;
42
43static bool matchBinaryPattern( int value, int pattern );
44
45struct Addressee::AddresseeData : public KShared
46{
47 QString uid;
48 QString name;
49 QString formattedName;
50 QString familyName;
51 QString givenName;
52 QString additionalName;
53 QString prefix;
54 QString suffix;
55 QString nickName;
56 QDateTime birthday;
57 QString mailer;
58 TimeZone timeZone;
59 Geo geo;
60 QString title;
61 QString role;
62 QString organization;
63 QString note;
64 QString productId;
65 QDateTime revision;
66 QString sortString;
67 KURL url;
68 Secrecy secrecy;
69 Picture logo;
70 Picture photo;
71 Sound sound;
72 Agent agent;
73
74 PhoneNumber::List phoneNumbers;
75 Address::List addresses;
76 Key::List keys;
77 QStringList emails;
78 QStringList categories;
79 QStringList custom;
80
81 Resource *resource;
82
83 bool empty :1;
84 bool changed :1;
85};
86
87Addressee::Addressee()
88{
89 mData = new AddresseeData;
90 mData->empty = true;
91 mData->changed = false;
92 mData->resource = 0;
93}
94
95Addressee::~Addressee()
96{
97}
98
99Addressee::Addressee( const Addressee &a )
100{
101 mData = a.mData;
102}
103
104Addressee &Addressee::operator=( const Addressee &a )
105{
106 mData = a.mData;
107 return (*this);
108}
109
110Addressee Addressee::copy()
111{
112 Addressee a;
113 *(a.mData) = *mData;
114 return a;
115}
116
117void Addressee::detach()
118{
119 if ( mData.count() == 1 ) return;
120 *this = copy();
121}
122
123bool Addressee::operator==( const Addressee &a ) const
124{
125 if ( uid() != a.uid() ) return false;
126 if ( mData->name != a.mData->name ) return false;
127 if ( mData->formattedName != a.mData->formattedName ) return false;
128 if ( mData->familyName != a.mData->familyName ) return false;
129 if ( mData->givenName != a.mData->givenName ) return false;
130 if ( mData->additionalName != a.mData->additionalName ) return false;
131 if ( mData->prefix != a.mData->prefix ) return false;
132 if ( mData->suffix != a.mData->suffix ) return false;
133 if ( mData->nickName != a.mData->nickName ) return false;
134 if ( mData->birthday != a.mData->birthday ) return false;
135 if ( mData->mailer != a.mData->mailer ) return false;
136 if ( mData->timeZone != a.mData->timeZone ) return false;
137 if ( mData->geo != a.mData->geo ) return false;
138 if ( mData->title != a.mData->title ) return false;
139 if ( mData->role != a.mData->role ) return false;
140 if ( mData->organization != a.mData->organization ) return false;
141 if ( mData->note != a.mData->note ) return false;
142 if ( mData->productId != a.mData->productId ) return false;
143 if ( mData->revision != a.mData->revision ) return false;
144 if ( mData->sortString != a.mData->sortString ) return false;
145 if ( mData->secrecy != a.mData->secrecy ) return false;
146 if ( mData->logo != a.mData->logo ) return false;
147 if ( mData->photo != a.mData->photo ) return false;
148 if ( mData->sound != a.mData->sound ) return false;
149 if ( mData->agent != a.mData->agent ) return false;
150 if ( ( mData->url.isValid() || a.mData->url.isValid() ) &&
151 ( mData->url != a.mData->url ) ) return false;
152 if ( mData->phoneNumbers != a.mData->phoneNumbers ) return false;
153 if ( mData->addresses != a.mData->addresses ) return false;
154 if ( mData->keys != a.mData->keys ) return false;
155 if ( mData->emails != a.mData->emails ) return false;
156 if ( mData->categories != a.mData->categories ) return false;
157 if ( mData->custom != a.mData->custom ) return false;
158
159 return true;
160}
161
162bool Addressee::operator!=( const Addressee &a ) const
163{
164 return !( a == *this );
165}
166
167bool Addressee::isEmpty() const
168{
169 return mData->empty;
170}
171
172void Addressee::setUid( const QString &id )
173{
174 if ( id == mData->uid ) return;
175 detach();
176 mData->empty = false;
177 mData->uid = id;
178}
179
180QString Addressee::uid() const
181{
182 if ( mData->uid.isEmpty() )
183 mData->uid = KApplication::randomString( 10 );
184
185 return mData->uid;
186}
187
188QString Addressee::uidLabel()
189{
190 return i18n("Unique Identifier");
191}
192
193void Addressee::setName( const QString &name )
194{
195 if ( name == mData->name ) return;
196 detach();
197 mData->empty = false;
198 mData->name = name;
199}
200
201QString Addressee::name() const
202{
203 return mData->name;
204}
205
206QString Addressee::nameLabel()
207{
208 return i18n("Name");
209}
210
211
212void Addressee::setFormattedName( const QString &formattedName )
213{
214 if ( formattedName == mData->formattedName ) return;
215 detach();
216 mData->empty = false;
217 mData->formattedName = formattedName;
218}
219
220QString Addressee::formattedName() const
221{
222 return mData->formattedName;
223}
224
225QString Addressee::formattedNameLabel()
226{
227 return i18n("Formatted Name");
228}
229
230
231void Addressee::setFamilyName( const QString &familyName )
232{
233 if ( familyName == mData->familyName ) return;
234 detach();
235 mData->empty = false;
236 mData->familyName = familyName;
237}
238
239QString Addressee::familyName() const
240{
241 return mData->familyName;
242}
243
244QString Addressee::familyNameLabel()
245{
246 return i18n("Family Name");
247}
248
249
250void Addressee::setGivenName( const QString &givenName )
251{
252 if ( givenName == mData->givenName ) return;
253 detach();
254 mData->empty = false;
255 mData->givenName = givenName;
256}
257
258QString Addressee::givenName() const
259{
260 return mData->givenName;
261}
262
263QString Addressee::givenNameLabel()
264{
265 return i18n("Given Name");
266}
267
268
269void Addressee::setAdditionalName( const QString &additionalName )
270{
271 if ( additionalName == mData->additionalName ) return;
272 detach();
273 mData->empty = false;
274 mData->additionalName = additionalName;
275}
276
277QString Addressee::additionalName() const
278{
279 return mData->additionalName;
280}
281
282QString Addressee::additionalNameLabel()
283{
284 return i18n("Additional Names");
285}
286
287
288void Addressee::setPrefix( const QString &prefix )
289{
290 if ( prefix == mData->prefix ) return;
291 detach();
292 mData->empty = false;
293 mData->prefix = prefix;
294}
295
296QString Addressee::prefix() const
297{
298 return mData->prefix;
299}
300
301QString Addressee::prefixLabel()
302{
303 return i18n("Honorific Prefixes");
304}
305
306
307void Addressee::setSuffix( const QString &suffix )
308{
309 if ( suffix == mData->suffix ) return;
310 detach();
311 mData->empty = false;
312 mData->suffix = suffix;
313}
314
315QString Addressee::suffix() const
316{
317 return mData->suffix;
318}
319
320QString Addressee::suffixLabel()
321{
322 return i18n("Honorific Suffixes");
323}
324
325
326void Addressee::setNickName( const QString &nickName )
327{
328 if ( nickName == mData->nickName ) return;
329 detach();
330 mData->empty = false;
331 mData->nickName = nickName;
332}
333
334QString Addressee::nickName() const
335{
336 return mData->nickName;
337}
338
339QString Addressee::nickNameLabel()
340{
341 return i18n("Nick Name");
342}
343
344
345void Addressee::setBirthday( const QDateTime &birthday )
346{
347 if ( birthday == mData->birthday ) return;
348 detach();
349 mData->empty = false;
350 mData->birthday = birthday;
351}
352
353QDateTime Addressee::birthday() const
354{
355 return mData->birthday;
356}
357
358QString Addressee::birthdayLabel()
359{
360 return i18n("Birthday");
361}
362
363
364QString Addressee::homeAddressStreetLabel()
365{
366 return i18n("Home Address Street");
367}
368
369
370QString Addressee::homeAddressLocalityLabel()
371{
372 return i18n("Home Address Locality");
373}
374
375
376QString Addressee::homeAddressRegionLabel()
377{
378 return i18n("Home Address Region");
379}
380
381
382QString Addressee::homeAddressPostalCodeLabel()
383{
384 return i18n("Home Address Postal Code");
385}
386
387
388QString Addressee::homeAddressCountryLabel()
389{
390 return i18n("Home Address Country");
391}
392
393
394QString Addressee::homeAddressLabelLabel()
395{
396 return i18n("Home Address Label");
397}
398
399
400QString Addressee::businessAddressStreetLabel()
401{
402 return i18n("Business Address Street");
403}
404
405
406QString Addressee::businessAddressLocalityLabel()
407{
408 return i18n("Business Address Locality");
409}
410
411
412QString Addressee::businessAddressRegionLabel()
413{
414 return i18n("Business Address Region");
415}
416
417
418QString Addressee::businessAddressPostalCodeLabel()
419{
420 return i18n("Business Address Postal Code");
421}
422
423
424QString Addressee::businessAddressCountryLabel()
425{
426 return i18n("Business Address Country");
427}
428
429
430QString Addressee::businessAddressLabelLabel()
431{
432 return i18n("Business Address Label");
433}
434
435
436QString Addressee::homePhoneLabel()
437{
438 return i18n("Home Phone");
439}
440
441
442QString Addressee::businessPhoneLabel()
443{
444 return i18n("Business Phone");
445}
446
447
448QString Addressee::mobilePhoneLabel()
449{
450 return i18n("Mobile Phone");
451}
452
453
454QString Addressee::homeFaxLabel()
455{
456 return i18n("Home Fax");
457}
458
459
460QString Addressee::businessFaxLabel()
461{
462 return i18n("Business Fax");
463}
464
465
466QString Addressee::carPhoneLabel()
467{
468 return i18n("Car Phone");
469}
470
471
472QString Addressee::isdnLabel()
473{
474 return i18n("ISDN");
475}
476
477
478QString Addressee::pagerLabel()
479{
480 return i18n("Pager");
481}
482
483
484QString Addressee::emailLabel()
485{
486 return i18n("Email Address");
487}
488
489
490void Addressee::setMailer( const QString &mailer )
491{
492 if ( mailer == mData->mailer ) return;
493 detach();
494 mData->empty = false;
495 mData->mailer = mailer;
496}
497
498QString Addressee::mailer() const
499{
500 return mData->mailer;
501}
502
503QString Addressee::mailerLabel()
504{
505 return i18n("Mail Client");
506}
507
508
509void Addressee::setTimeZone( const TimeZone &timeZone )
510{
511 if ( timeZone == mData->timeZone ) return;
512 detach();
513 mData->empty = false;
514 mData->timeZone = timeZone;
515}
516
517TimeZone Addressee::timeZone() const
518{
519 return mData->timeZone;
520}
521
522QString Addressee::timeZoneLabel()
523{
524 return i18n("Time Zone");
525}
526
527
528void Addressee::setGeo( const Geo &geo )
529{
530 if ( geo == mData->geo ) return;
531 detach();
532 mData->empty = false;
533 mData->geo = geo;
534}
535
536Geo Addressee::geo() const
537{
538 return mData->geo;
539}
540
541QString Addressee::geoLabel()
542{
543 return i18n("Geographic Position");
544}
545
546
547void Addressee::setTitle( const QString &title )
548{
549 if ( title == mData->title ) return;
550 detach();
551 mData->empty = false;
552 mData->title = title;
553}
554
555QString Addressee::title() const
556{
557 return mData->title;
558}
559
560QString Addressee::titleLabel()
561{
562 return i18n("Title");
563}
564
565
566void Addressee::setRole( const QString &role )
567{
568 if ( role == mData->role ) return;
569 detach();
570 mData->empty = false;
571 mData->role = role;
572}
573
574QString Addressee::role() const
575{
576 return mData->role;
577}
578
579QString Addressee::roleLabel()
580{
581 return i18n("Role");
582}
583
584
585void Addressee::setOrganization( const QString &organization )
586{
587 if ( organization == mData->organization ) return;
588 detach();
589 mData->empty = false;
590 mData->organization = organization;
591}
592
593QString Addressee::organization() const
594{
595 return mData->organization;
596}
597
598QString Addressee::organizationLabel()
599{
600 return i18n("Organization");
601}
602
603
604void Addressee::setNote( const QString &note )
605{
606 if ( note == mData->note ) return;
607 detach();
608 mData->empty = false;
609 mData->note = note;
610}
611
612QString Addressee::note() const
613{
614 return mData->note;
615}
616
617QString Addressee::noteLabel()
618{
619 return i18n("Note");
620}
621
622
623void Addressee::setProductId( const QString &productId )
624{
625 if ( productId == mData->productId ) return;
626 detach();
627 mData->empty = false;
628 mData->productId = productId;
629}
630
631QString Addressee::productId() const
632{
633 return mData->productId;
634}
635
636QString Addressee::productIdLabel()
637{
638 return i18n("Product Identifier");
639}
640
641
642void Addressee::setRevision( const QDateTime &revision )
643{
644 if ( revision == mData->revision ) return;
645 detach();
646 mData->empty = false;
647 mData->revision = revision;
648}
649
650QDateTime Addressee::revision() const
651{
652 return mData->revision;
653}
654
655QString Addressee::revisionLabel()
656{
657 return i18n("Revision Date");
658}
659
660
661void Addressee::setSortString( const QString &sortString )
662{
663 if ( sortString == mData->sortString ) return;
664 detach();
665 mData->empty = false;
666 mData->sortString = sortString;
667}
668
669QString Addressee::sortString() const
670{
671 return mData->sortString;
672}
673
674QString Addressee::sortStringLabel()
675{
676 return i18n("Sort String");
677}
678
679
680void Addressee::setUrl( const KURL &url )
681{
682 if ( url == mData->url ) return;
683 detach();
684 mData->empty = false;
685 mData->url = url;
686}
687
688KURL Addressee::url() const
689{
690 return mData->url;
691}
692
693QString Addressee::urlLabel()
694{
695 return i18n("URL");
696}
697
698
699void Addressee::setSecrecy( const Secrecy &secrecy )
700{
701 if ( secrecy == mData->secrecy ) return;
702 detach();
703 mData->empty = false;
704 mData->secrecy = secrecy;
705}
706
707Secrecy Addressee::secrecy() const
708{
709 return mData->secrecy;
710}
711
712QString Addressee::secrecyLabel()
713{
714 return i18n("Security Class");
715}
716
717
718void Addressee::setLogo( const Picture &logo )
719{
720 if ( logo == mData->logo ) return;
721 detach();
722 mData->empty = false;
723 mData->logo = logo;
724}
725
726Picture Addressee::logo() const
727{
728 return mData->logo;
729}
730
731QString Addressee::logoLabel()
732{
733 return i18n("Logo");
734}
735
736
737void Addressee::setPhoto( const Picture &photo )
738{
739 if ( photo == mData->photo ) return;
740 detach();
741 mData->empty = false;
742 mData->photo = photo;
743}
744
745Picture Addressee::photo() const
746{
747 return mData->photo;
748}
749
750QString Addressee::photoLabel()
751{
752 return i18n("Photo");
753}
754
755
756void Addressee::setSound( const Sound &sound )
757{
758 if ( sound == mData->sound ) return;
759 detach();
760 mData->empty = false;
761 mData->sound = sound;
762}
763
764Sound Addressee::sound() const
765{
766 return mData->sound;
767}
768
769QString Addressee::soundLabel()
770{
771 return i18n("Sound");
772}
773
774
775void Addressee::setAgent( const Agent &agent )
776{
777 if ( agent == mData->agent ) return;
778 detach();
779 mData->empty = false;
780 mData->agent = agent;
781}
782
783Agent Addressee::agent() const
784{
785 return mData->agent;
786}
787
788QString Addressee::agentLabel()
789{
790 return i18n("Agent");
791}
792
793
794
795void Addressee::setNameFromString( const QString &str )
796{
797 setFormattedName( str );
798 setName( str );
799
800 QStringList titles;
801 titles += i18n( "Dr." );
802 titles += i18n( "Miss" );
803 titles += i18n( "Mr." );
804 titles += i18n( "Mrs." );
805 titles += i18n( "Ms." );
806 titles += i18n( "Prof." );
807
808 QStringList suffixes;
809 suffixes += i18n( "I" );
810 suffixes += i18n( "II" );
811 suffixes += i18n( "III" );
812 suffixes += i18n( "Jr." );
813 suffixes += i18n( "Sr." );
814
815 QStringList prefixes;
816 prefixes += "van";
817 prefixes += "von";
818 prefixes += "de";
819
820//US KConfig config( "kabcrc" );
821 KConfig config( locateLocal( "config", "kabcrc") );
822 config.setGroup( "General" );
823 titles += config.readListEntry( "Prefixes" );
824 titles.remove( "" );
825 prefixes += config.readListEntry( "Inclusions" );
826 prefixes.remove( "" );
827 suffixes += config.readListEntry( "Suffixes" );
828 suffixes.remove( "" );
829
830 // clear all name parts
831 setPrefix( "" );
832 setGivenName( "" );
833 setAdditionalName( "" );
834 setFamilyName( "" );
835 setSuffix( "" );
836
837 if ( str.isEmpty() )
838 return;
839
840 int i = str.find(',');
841 if( i < 0 ) {
842 QStringList parts = QStringList::split( " ", str );
843 int leftOffset = 0;
844 int rightOffset = parts.count() - 1;
845
846 QString suffix;
847 while ( rightOffset >= 0 ) {
848 if ( suffixes.contains( parts[ rightOffset ] ) ) {
849 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
850 rightOffset--;
851 } else
852 break;
853 }
854 setSuffix( suffix );
855
856 if ( rightOffset < 0 )
857 return;
858
859 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
860 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
861 rightOffset--;
862 } else
863 setFamilyName( parts[ rightOffset ] );
864
865 QString prefix;
866 while ( leftOffset < rightOffset ) {
867 if ( titles.contains( parts[ leftOffset ] ) ) {
868 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
869 leftOffset++;
870 } else
871 break;
872 }
873 setPrefix( prefix );
874
875 if ( leftOffset < rightOffset ) {
876 setGivenName( parts[ leftOffset ] );
877 leftOffset++;
878 }
879
880 QString additionalName;
881 while ( leftOffset < rightOffset ) {
882 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
883 leftOffset++;
884 }
885 setAdditionalName( additionalName );
886 } else {
887 QString part1 = str.left( i );
888 QString part2 = str.mid( i + 1 );
889
890 QStringList parts = QStringList::split( " ", part1 );
891 int leftOffset = 0;
892 int rightOffset = parts.count() - 1;
893
894 QString suffix;
895 while ( rightOffset >= 0 ) {
896 if ( suffixes.contains( parts[ rightOffset ] ) ) {
897 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
898 rightOffset--;
899 } else
900 break;
901 }
902 setSuffix( suffix );
903
904 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
905 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
906 rightOffset--;
907 } else
908 setFamilyName( parts[ rightOffset ] );
909
910 QString prefix;
911 while ( leftOffset < rightOffset ) {
912 if ( titles.contains( parts[ leftOffset ] ) ) {
913 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
914 leftOffset++;
915 } else
916 break;
917 }
918
919 parts = QStringList::split( " ", part2 );
920
921 leftOffset = 0;
922 rightOffset = parts.count();
923
924 while ( leftOffset < rightOffset ) {
925 if ( titles.contains( parts[ leftOffset ] ) ) {
926 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
927 leftOffset++;
928 } else
929 break;
930 }
931 setPrefix( prefix );
932
933 if ( leftOffset < rightOffset ) {
934 setGivenName( parts[ leftOffset ] );
935 leftOffset++;
936 }
937
938 QString additionalName;
939 while ( leftOffset < rightOffset ) {
940 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
941 leftOffset++;
942 }
943 setAdditionalName( additionalName );
944 }
945}
946
947QString Addressee::realName() const
948{
949 if ( !formattedName().isEmpty() )
950 return formattedName();
951
952 QString n = assembledName();
953
954 if ( n.isEmpty() )
955 n = name();
956
957 return n;
958}
959
960QString Addressee::assembledName() const
961{
962 QString name = prefix() + " " + givenName() + " " + additionalName() + " " +
963 familyName() + " " + suffix();
964
965 return name.simplifyWhiteSpace();
966}
967
968QString Addressee::fullEmail( const QString &email ) const
969{
970 QString e;
971 if ( email.isNull() ) {
972 e = preferredEmail();
973 } else {
974 e = email;
975 }
976 if ( e.isEmpty() ) return QString::null;
977
978 QString text;
979 if ( realName().isEmpty() )
980 text = e;
981 else
982 text = assembledName() + " <" + e + ">";
983
984 return text;
985}
986
987void Addressee::insertEmail( const QString &email, bool preferred )
988{
989 detach();
990
991 QStringList::Iterator it = mData->emails.find( email );
992
993 if ( it != mData->emails.end() ) {
994 if ( !preferred || it == mData->emails.begin() ) return;
995 mData->emails.remove( it );
996 mData->emails.prepend( email );
997 } else {
998 if ( preferred ) {
999 mData->emails.prepend( email );
1000 } else {
1001 mData->emails.append( email );
1002 }
1003 }
1004}
1005
1006void Addressee::removeEmail( const QString &email )
1007{
1008 detach();
1009
1010 QStringList::Iterator it = mData->emails.find( email );
1011 if ( it == mData->emails.end() ) return;
1012
1013 mData->emails.remove( it );
1014}
1015
1016QString Addressee::preferredEmail() const
1017{
1018 if ( mData->emails.count() == 0 ) return QString::null;
1019 else return mData->emails.first();
1020}
1021
1022QStringList Addressee::emails() const
1023{
1024 return mData->emails;
1025}
1026void Addressee::setEmails( const QStringList& emails ) {
1027 detach();
1028 mData->emails = emails;
1029}
1030void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber )
1031{
1032 detach();
1033 mData->empty = false;
1034
1035 PhoneNumber::List::Iterator it;
1036 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1037 if ( (*it).id() == phoneNumber.id() ) {
1038 *it = phoneNumber;
1039 return;
1040 }
1041 }
1042 mData->phoneNumbers.append( phoneNumber );
1043}
1044
1045void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber )
1046{
1047 detach();
1048
1049 PhoneNumber::List::Iterator it;
1050 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1051 if ( (*it).id() == phoneNumber.id() ) {
1052 mData->phoneNumbers.remove( it );
1053 return;
1054 }
1055 }
1056}
1057
1058PhoneNumber Addressee::phoneNumber( int type ) const
1059{
1060 PhoneNumber phoneNumber( "", type );
1061 PhoneNumber::List::ConstIterator it;
1062 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1063 if ( matchBinaryPattern( (*it).type(), type ) ) {
1064 if ( (*it).type() & PhoneNumber::Pref )
1065 return (*it);
1066 else if ( phoneNumber.number().isEmpty() )
1067 phoneNumber = (*it);
1068 }
1069 }
1070
1071 return phoneNumber;
1072}
1073
1074PhoneNumber::List Addressee::phoneNumbers() const
1075{
1076 return mData->phoneNumbers;
1077}
1078
1079PhoneNumber::List Addressee::phoneNumbers( int type ) const
1080{
1081 PhoneNumber::List list;
1082
1083 PhoneNumber::List::ConstIterator it;
1084 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1085 if ( matchBinaryPattern( (*it).type(), type ) ) {
1086 list.append( *it );
1087 }
1088 }
1089 return list;
1090}
1091
1092PhoneNumber Addressee::findPhoneNumber( const QString &id ) const
1093{
1094 PhoneNumber::List::ConstIterator it;
1095 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1096 if ( (*it).id() == id ) {
1097 return *it;
1098 }
1099 }
1100 return PhoneNumber();
1101}
1102
1103void Addressee::insertKey( const Key &key )
1104{
1105 detach();
1106 mData->empty = false;
1107
1108 Key::List::Iterator it;
1109 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1110 if ( (*it).id() == key.id() ) {
1111 *it = key;
1112 return;
1113 }
1114 }
1115 mData->keys.append( key );
1116}
1117
1118void Addressee::removeKey( const Key &key )
1119{
1120 detach();
1121
1122 Key::List::Iterator it;
1123 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1124 if ( (*it).id() == key.id() ) {
1125 mData->keys.remove( key );
1126 return;
1127 }
1128 }
1129}
1130
1131Key Addressee::key( int type, QString customTypeString ) const
1132{
1133 Key::List::ConstIterator it;
1134 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1135 if ( (*it).type() == type ) {
1136 if ( type == Key::Custom ) {
1137 if ( customTypeString.isEmpty() ) {
1138 return *it;
1139 } else {
1140 if ( (*it).customTypeString() == customTypeString )
1141 return (*it);
1142 }
1143 } else {
1144 return *it;
1145 }
1146 }
1147 }
1148 return Key( QString(), type );
1149}
1150void Addressee::setKeys( const Key::List& list ) {
1151 detach();
1152 mData->keys = list;
1153}
1154
1155Key::List Addressee::keys() const
1156{
1157 return mData->keys;
1158}
1159
1160Key::List Addressee::keys( int type, QString customTypeString ) const
1161{
1162 Key::List list;
1163
1164 Key::List::ConstIterator it;
1165 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1166 if ( (*it).type() == type ) {
1167 if ( type == Key::Custom ) {
1168 if ( customTypeString.isEmpty() ) {
1169 list.append(*it);
1170 } else {
1171 if ( (*it).customTypeString() == customTypeString )
1172 list.append(*it);
1173 }
1174 } else {
1175 list.append(*it);
1176 }
1177 }
1178 }
1179 return list;
1180}
1181
1182Key Addressee::findKey( const QString &id ) const
1183{
1184 Key::List::ConstIterator it;
1185 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1186 if ( (*it).id() == id ) {
1187 return *it;
1188 }
1189 }
1190 return Key();
1191}
1192
1193QString Addressee::asString() const
1194{
1195 return "Smith, agent Smith...";
1196}
1197
1198void Addressee::dump() const
1199{
1200 return;
1201 kdDebug(5700) << "Addressee {" << endl;
1202
1203 kdDebug(5700) << " Uid: '" << uid() << "'" << endl;
1204
1205 kdDebug(5700) << " Name: '" << name() << "'" << endl;
1206 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl;
1207 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl;
1208 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl;
1209 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl;
1210 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl;
1211 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl;
1212 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl;
1213 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl;
1214 kdDebug(5700) << " Mailer: '" << mailer() << "'" << endl;
1215 kdDebug(5700) << " TimeZone: '" << timeZone().asString() << "'" << endl;
1216 kdDebug(5700) << " Geo: '" << geo().asString() << "'" << endl;
1217 kdDebug(5700) << " Title: '" << title() << "'" << endl;
1218 kdDebug(5700) << " Role: '" << role() << "'" << endl;
1219 kdDebug(5700) << " Organization: '" << organization() << "'" << endl;
1220 kdDebug(5700) << " Note: '" << note() << "'" << endl;
1221 kdDebug(5700) << " ProductId: '" << productId() << "'" << endl;
1222 kdDebug(5700) << " Revision: '" << revision().toString() << "'" << endl;
1223 kdDebug(5700) << " SortString: '" << sortString() << "'" << endl;
1224 kdDebug(5700) << " Url: '" << url().url() << "'" << endl;
1225 kdDebug(5700) << " Secrecy: '" << secrecy().asString() << "'" << endl;
1226 kdDebug(5700) << " Logo: '" << logo().asString() << "'" << endl;
1227 kdDebug(5700) << " Photo: '" << photo().asString() << "'" << endl;
1228 kdDebug(5700) << " Sound: '" << sound().asString() << "'" << endl;
1229 kdDebug(5700) << " Agent: '" << agent().asString() << "'" << endl;
1230
1231 kdDebug(5700) << " Emails {" << endl;
1232 QStringList e = emails();
1233 QStringList::ConstIterator it;
1234 for( it = e.begin(); it != e.end(); ++it ) {
1235 kdDebug(5700) << " " << (*it) << endl;
1236 }
1237 kdDebug(5700) << " }" << endl;
1238
1239 kdDebug(5700) << " PhoneNumbers {" << endl;
1240 PhoneNumber::List p = phoneNumbers();
1241 PhoneNumber::List::ConstIterator it2;
1242 for( it2 = p.begin(); it2 != p.end(); ++it2 ) {
1243 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl;
1244 }
1245 kdDebug(5700) << " }" << endl;
1246
1247 Address::List a = addresses();
1248 Address::List::ConstIterator it3;
1249 for( it3 = a.begin(); it3 != a.end(); ++it3 ) {
1250 (*it3).dump();
1251 }
1252
1253 kdDebug(5700) << " Keys {" << endl;
1254 Key::List k = keys();
1255 Key::List::ConstIterator it4;
1256 for( it4 = k.begin(); it4 != k.end(); ++it4 ) {
1257 kdDebug(5700) << " Type: " << int((*it4).type()) <<
1258 " Key: " << (*it4).textData() <<
1259 " CustomString: " << (*it4).customTypeString() << endl;
1260 }
1261 kdDebug(5700) << " }" << endl;
1262
1263 kdDebug(5700) << "}" << endl;
1264}
1265
1266
1267void Addressee::insertAddress( const Address &address )
1268{
1269 detach();
1270 mData->empty = false;
1271
1272 Address::List::Iterator it;
1273 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1274 if ( (*it).id() == address.id() ) {
1275 *it = address;
1276 return;
1277 }
1278 }
1279 mData->addresses.append( address );
1280}
1281
1282void Addressee::removeAddress( const Address &address )
1283{
1284 detach();
1285
1286 Address::List::Iterator it;
1287 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1288 if ( (*it).id() == address.id() ) {
1289 mData->addresses.remove( it );
1290 return;
1291 }
1292 }
1293}
1294
1295Address Addressee::address( int type ) const
1296{
1297 Address address( type );
1298 Address::List::ConstIterator it;
1299 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1300 if ( matchBinaryPattern( (*it).type(), type ) ) {
1301 if ( (*it).type() & Address::Pref )
1302 return (*it);
1303 else if ( address.isEmpty() )
1304 address = (*it);
1305 }
1306 }
1307
1308 return address;
1309}
1310
1311Address::List Addressee::addresses() const
1312{
1313 return mData->addresses;
1314}
1315
1316Address::List Addressee::addresses( int type ) const
1317{
1318 Address::List list;
1319
1320 Address::List::ConstIterator it;
1321 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1322 if ( matchBinaryPattern( (*it).type(), type ) ) {
1323 list.append( *it );
1324 }
1325 }
1326
1327 return list;
1328}
1329
1330Address Addressee::findAddress( const QString &id ) const
1331{
1332 Address::List::ConstIterator it;
1333 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1334 if ( (*it).id() == id ) {
1335 return *it;
1336 }
1337 }
1338 return Address();
1339}
1340
1341void Addressee::insertCategory( const QString &c )
1342{
1343 detach();
1344 mData->empty = false;
1345
1346 if ( mData->categories.contains( c ) ) return;
1347
1348 mData->categories.append( c );
1349}
1350
1351void Addressee::removeCategory( const QString &c )
1352{
1353 detach();
1354
1355 QStringList::Iterator it = mData->categories.find( c );
1356 if ( it == mData->categories.end() ) return;
1357
1358 mData->categories.remove( it );
1359}
1360
1361bool Addressee::hasCategory( const QString &c ) const
1362{
1363 return ( mData->categories.contains( c ) );
1364}
1365
1366void Addressee::setCategories( const QStringList &c )
1367{
1368 detach();
1369 mData->empty = false;
1370
1371 mData->categories = c;
1372}
1373
1374QStringList Addressee::categories() const
1375{
1376 return mData->categories;
1377}
1378
1379void Addressee::insertCustom( const QString &app, const QString &name,
1380 const QString &value )
1381{
1382 if ( value.isNull() || name.isEmpty() || app.isEmpty() ) return;
1383
1384 detach();
1385 mData->empty = false;
1386
1387 QString qualifiedName = app + "-" + name + ":";
1388
1389 QStringList::Iterator it;
1390 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
1391 if ( (*it).startsWith( qualifiedName ) ) {
1392 (*it) = qualifiedName + value;
1393 return;
1394 }
1395 }
1396
1397 mData->custom.append( qualifiedName + value );
1398}
1399
1400void Addressee::removeCustom( const QString &app, const QString &name)
1401{
1402 detach();
1403
1404 QString qualifiedName = app + "-" + name + ":";
1405
1406 QStringList::Iterator it;
1407 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
1408 if ( (*it).startsWith( qualifiedName ) ) {
1409 mData->custom.remove( it );
1410 return;
1411 }
1412 }
1413}
1414
1415QString Addressee::custom( const QString &app, const QString &name ) const
1416{
1417 QString qualifiedName = app + "-" + name + ":";
1418 QString value;
1419
1420 QStringList::ConstIterator it;
1421 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
1422 if ( (*it).startsWith( qualifiedName ) ) {
1423 value = (*it).mid( (*it).find( ":" ) + 1 );
1424 break;
1425 }
1426 }
1427
1428 return value;
1429}
1430
1431void Addressee::setCustoms( const QStringList &l )
1432{
1433 detach();
1434 mData->empty = false;
1435
1436 mData->custom = l;
1437}
1438
1439QStringList Addressee::customs() const
1440{
1441 return mData->custom;
1442}
1443
1444void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName,
1445 QString &email)
1446{
1447 int startPos, endPos, len;
1448 QString partA, partB, result;
1449 char endCh = '>';
1450
1451 startPos = rawEmail.find('<');
1452 if (startPos < 0)
1453 {
1454 startPos = rawEmail.find('(');
1455 endCh = ')';
1456 }
1457 if (startPos < 0)
1458 {
1459 // We couldn't find any separators, so we assume the whole string
1460 // is the email address
1461 email = rawEmail;
1462 fullName = "";
1463 }
1464 else
1465 {
1466 // We have a start position, try to find an end
1467 endPos = rawEmail.find(endCh, startPos+1);
1468
1469 if (endPos < 0)
1470 {
1471 // We couldn't find the end of the email address. We can only
1472 // assume the entire string is the email address.
1473 email = rawEmail;
1474 fullName = "";
1475 }
1476 else
1477 {
1478 // We have a start and end to the email address
1479
1480 // Grab the name part
1481 fullName = rawEmail.left(startPos).stripWhiteSpace();
1482
1483 // grab the email part
1484 email = rawEmail.mid(startPos+1, endPos-startPos-1).stripWhiteSpace();
1485
1486 // Check that we do not have any extra characters on the end of the
1487 // strings
1488 len = fullName.length();
1489 if (fullName[0]=='"' && fullName[len-1]=='"')
1490 fullName = fullName.mid(1, len-2);
1491 else if (fullName[0]=='<' && fullName[len-1]=='>')
1492 fullName = fullName.mid(1, len-2);
1493 else if (fullName[0]=='(' && fullName[len-1]==')')
1494 fullName = fullName.mid(1, len-2);
1495 }
1496 }
1497}
1498
1499void Addressee::setResource( Resource *resource )
1500{
1501 detach();
1502 mData->resource = resource;
1503}
1504
1505Resource *Addressee::resource() const
1506{
1507 return mData->resource;
1508}
1509
1510void Addressee::setChanged( bool value )
1511{
1512 detach();
1513 mData->changed = value;
1514}
1515
1516bool Addressee::changed() const
1517{
1518 return mData->changed;
1519}
1520
1521QDataStream &KABC::operator<<( QDataStream &s, const Addressee &a )
1522{
1523 if (!a.mData) return s;
1524
1525 s << a.uid();
1526
1527 s << a.mData->name;
1528 s << a.mData->formattedName;
1529 s << a.mData->familyName;
1530 s << a.mData->givenName;
1531 s << a.mData->additionalName;
1532 s << a.mData->prefix;
1533 s << a.mData->suffix;
1534 s << a.mData->nickName;
1535 s << a.mData->birthday;
1536 s << a.mData->mailer;
1537 s << a.mData->timeZone;
1538 s << a.mData->geo;
1539 s << a.mData->title;
1540 s << a.mData->role;
1541 s << a.mData->organization;
1542 s << a.mData->note;
1543 s << a.mData->productId;
1544 s << a.mData->revision;
1545 s << a.mData->sortString;
1546 s << a.mData->url;
1547 s << a.mData->secrecy;
1548 s << a.mData->logo;
1549 s << a.mData->photo;
1550 s << a.mData->sound;
1551 s << a.mData->agent;
1552 s << a.mData->phoneNumbers;
1553 s << a.mData->addresses;
1554 s << a.mData->emails;
1555 s << a.mData->categories;
1556 s << a.mData->custom;
1557 s << a.mData->keys;
1558 return s;
1559}
1560
1561QDataStream &KABC::operator>>( QDataStream &s, Addressee &a )
1562{
1563 if (!a.mData) return s;
1564
1565 s >> a.mData->uid;
1566
1567 s >> a.mData->name;
1568 s >> a.mData->formattedName;
1569 s >> a.mData->familyName;
1570 s >> a.mData->givenName;
1571 s >> a.mData->additionalName;
1572 s >> a.mData->prefix;
1573 s >> a.mData->suffix;
1574 s >> a.mData->nickName;
1575 s >> a.mData->birthday;
1576 s >> a.mData->mailer;
1577 s >> a.mData->timeZone;
1578 s >> a.mData->geo;
1579 s >> a.mData->title;
1580 s >> a.mData->role;
1581 s >> a.mData->organization;
1582 s >> a.mData->note;
1583 s >> a.mData->productId;
1584 s >> a.mData->revision;
1585 s >> a.mData->sortString;
1586 s >> a.mData->url;
1587 s >> a.mData->secrecy;
1588 s >> a.mData->logo;
1589 s >> a.mData->photo;
1590 s >> a.mData->sound;
1591 s >> a.mData->agent;
1592 s >> a.mData->phoneNumbers;
1593 s >> a.mData->addresses;
1594 s >> a.mData->emails;
1595 s >> a.mData->categories;
1596 s >> a.mData->custom;
1597 s >> a.mData->keys;
1598
1599 a.mData->empty = false;
1600
1601 return s;
1602}
1603
1604bool matchBinaryPattern( int value, int pattern )
1605{
1606 /**
1607 We want to match all telephonnumbers/addresses which have the bits in the
1608 pattern set. More are allowed.
1609 if pattern == 0 we have a special handling, then we want only those with
1610 exactly no bit set.
1611 */
1612 if ( pattern == 0 )
1613 return ( value == 0 );
1614 else
1615 return ( pattern == ( pattern & value ) );
1616}