addressee.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <qregexp.h>
00024
00025 #include <ksharedptr.h>
00026 #include <kdebug.h>
00027 #include <kapplication.h>
00028 #include <klocale.h>
00029
00030 #include "addresseehelper.h"
00031 #include "field.h"
00032 #include "resource.h"
00033
00034 #include "addressee.h"
00035
00036 using namespace KABC;
00037
00038 static bool matchBinaryPattern( int value, int pattern );
00039 KABC::Field *Addressee::mSortField = 0;
00040
00041 struct Addressee::AddresseeData : public KShared
00042 {
00043 QString uid;
00044 QString name;
00045 QString formattedName;
00046 QString familyName;
00047 QString givenName;
00048 QString additionalName;
00049 QString prefix;
00050 QString suffix;
00051 QString nickName;
00052 QDateTime birthday;
00053 QString mailer;
00054 TimeZone timeZone;
00055 Geo geo;
00056 QString title;
00057 QString role;
00058 QString organization;
00059 QString note;
00060 QString productId;
00061 QDateTime revision;
00062 QString sortString;
00063 KURL url;
00064 Secrecy secrecy;
00065 Picture logo;
00066 Picture photo;
00067 Sound sound;
00068 Agent agent;
00069
00070 PhoneNumber::List phoneNumbers;
00071 Address::List addresses;
00072 Key::List keys;
00073 QStringList emails;
00074 QStringList categories;
00075 QStringList custom;
00076
00077 Resource *resource;
00078
00079 bool empty :1;
00080 bool changed :1;
00081 };
00082
00083 Addressee::AddresseeData* Addressee::shared_null = 0;
00084
00085 Addressee::AddresseeData* Addressee::makeSharedNull()
00086 {
00087 Addressee::shared_null = new AddresseeData;
00088 shared_null->_KShared_ref();
00089 shared_null->empty = true;
00090 shared_null->changed = false;
00091 shared_null->resource = 0;
00092 return shared_null;
00093 }
00094
00095 Addressee::Addressee()
00096 {
00097 mData = shared_null ? shared_null : makeSharedNull();
00098 }
00099
00100 Addressee::~Addressee()
00101 {
00102 }
00103
00104 Addressee::Addressee( const Addressee &a )
00105 {
00106 mData = a.mData;
00107 }
00108
00109 Addressee &Addressee::operator=( const Addressee &a )
00110 {
00111 mData = a.mData;
00112 return (*this);
00113 }
00114
00115 void Addressee::detach()
00116 {
00117 if ( mData.data() == shared_null ) {
00118 mData = new AddresseeData;
00119 mData->empty = true;
00120 mData->changed = false;
00121 mData->resource = 0;
00122 return;
00123 } else if ( mData.count() == 1 ) return;
00124
00125 AddresseeData data = *mData;
00126 mData = new AddresseeData( data );
00127 }
00128
00129 bool Addressee::operator==( const Addressee &a ) const
00130 {
00131 if ( uid() != a.uid() ) return false;
00132 if ( mData->name != a.mData->name ) return false;
00133 if ( mData->formattedName != a.mData->formattedName ) return false;
00134 if ( mData->familyName != a.mData->familyName ) return false;
00135 if ( mData->givenName != a.mData->givenName ) return false;
00136 if ( mData->additionalName != a.mData->additionalName ) return false;
00137 if ( mData->prefix != a.mData->prefix ) return false;
00138 if ( mData->suffix != a.mData->suffix ) return false;
00139 if ( mData->nickName != a.mData->nickName ) return false;
00140 if ( mData->birthday != a.mData->birthday ) return false;
00141 if ( mData->mailer != a.mData->mailer ) return false;
00142 if ( mData->timeZone != a.mData->timeZone ) return false;
00143 if ( mData->geo != a.mData->geo ) return false;
00144 if ( mData->title != a.mData->title ) return false;
00145 if ( mData->role != a.mData->role ) return false;
00146 if ( mData->organization != a.mData->organization ) return false;
00147 if ( mData->note != a.mData->note ) return false;
00148 if ( mData->productId != a.mData->productId ) return false;
00149 if ( mData->revision != a.mData->revision ) return false;
00150 if ( mData->sortString != a.mData->sortString ) return false;
00151 if ( mData->secrecy != a.mData->secrecy ) return false;
00152 if ( mData->logo != a.mData->logo ) return false;
00153 if ( mData->photo != a.mData->photo ) return false;
00154 if ( mData->sound != a.mData->sound ) return false;
00155 if ( mData->agent != a.mData->agent ) return false;
00156 if ( ( mData->url.isValid() || a.mData->url.isValid() ) &&
00157 ( mData->url != a.mData->url ) ) return false;
00158 if ( mData->phoneNumbers != a.mData->phoneNumbers ) return false;
00159 if ( mData->addresses != a.mData->addresses ) return false;
00160 if ( mData->keys != a.mData->keys ) return false;
00161 if ( mData->emails != a.mData->emails ) return false;
00162 if ( mData->categories != a.mData->categories ) return false;
00163 if ( mData->custom != a.mData->custom ) return false;
00164
00165 return true;
00166 }
00167
00168 bool Addressee::operator!=( const Addressee &a ) const
00169 {
00170 return !( a == *this );
00171 }
00172
00173 bool Addressee::isEmpty() const
00174 {
00175 return mData->empty;
00176 }
00177
00178 void Addressee::setUid( const QString &id )
00179 {
00180 if ( id == mData->uid ) return;
00181 detach();
00182 mData->empty = false;
00183 mData->uid = id;
00184 }
00185
00186 QString Addressee::uid() const
00187 {
00188 if ( mData->uid.isEmpty() )
00189 mData->uid = KApplication::randomString( 10 );
00190
00191 return mData->uid;
00192 }
00193
00194 QString Addressee::uidLabel()
00195 {
00196 return i18n("Unique Identifier");
00197 }
00198
00199 void Addressee::setName( const QString &name )
00200 {
00201 if ( name == mData->name ) return;
00202 detach();
00203 mData->empty = false;
00204 mData->name = name;
00205 }
00206
00207 QString Addressee::name() const
00208 {
00209 return mData->name;
00210 }
00211
00212 QString Addressee::nameLabel()
00213 {
00214 return i18n("Name");
00215 }
00216
00217
00218 void Addressee::setFormattedName( const QString &formattedName )
00219 {
00220 if ( formattedName == mData->formattedName ) return;
00221 detach();
00222 mData->empty = false;
00223 mData->formattedName = formattedName;
00224 }
00225
00226 QString Addressee::formattedName() const
00227 {
00228 return mData->formattedName;
00229 }
00230
00231 QString Addressee::formattedNameLabel()
00232 {
00233 return i18n("Formatted Name");
00234 }
00235
00236
00237 void Addressee::setFamilyName( const QString &familyName )
00238 {
00239 if ( familyName == mData->familyName ) return;
00240 detach();
00241 mData->empty = false;
00242 mData->familyName = familyName;
00243 }
00244
00245 QString Addressee::familyName() const
00246 {
00247 return mData->familyName;
00248 }
00249
00250 QString Addressee::familyNameLabel()
00251 {
00252 return i18n("Family Name");
00253 }
00254
00255
00256 void Addressee::setGivenName( const QString &givenName )
00257 {
00258 if ( givenName == mData->givenName ) return;
00259 detach();
00260 mData->empty = false;
00261 mData->givenName = givenName;
00262 }
00263
00264 QString Addressee::givenName() const
00265 {
00266 return mData->givenName;
00267 }
00268
00269 QString Addressee::givenNameLabel()
00270 {
00271 return i18n("Given Name");
00272 }
00273
00274
00275 void Addressee::setAdditionalName( const QString &additionalName )
00276 {
00277 if ( additionalName == mData->additionalName ) return;
00278 detach();
00279 mData->empty = false;
00280 mData->additionalName = additionalName;
00281 }
00282
00283 QString Addressee::additionalName() const
00284 {
00285 return mData->additionalName;
00286 }
00287
00288 QString Addressee::additionalNameLabel()
00289 {
00290 return i18n("Additional Names");
00291 }
00292
00293
00294 void Addressee::setPrefix( const QString &prefix )
00295 {
00296 if ( prefix == mData->prefix ) return;
00297 detach();
00298 mData->empty = false;
00299 mData->prefix = prefix;
00300 }
00301
00302 QString Addressee::prefix() const
00303 {
00304 return mData->prefix;
00305 }
00306
00307 QString Addressee::prefixLabel()
00308 {
00309 return i18n("Honorific Prefixes");
00310 }
00311
00312
00313 void Addressee::setSuffix( const QString &suffix )
00314 {
00315 if ( suffix == mData->suffix ) return;
00316 detach();
00317 mData->empty = false;
00318 mData->suffix = suffix;
00319 }
00320
00321 QString Addressee::suffix() const
00322 {
00323 return mData->suffix;
00324 }
00325
00326 QString Addressee::suffixLabel()
00327 {
00328 return i18n("Honorific Suffixes");
00329 }
00330
00331
00332 void Addressee::setNickName( const QString &nickName )
00333 {
00334 if ( nickName == mData->nickName ) return;
00335 detach();
00336 mData->empty = false;
00337 mData->nickName = nickName;
00338 }
00339
00340 QString Addressee::nickName() const
00341 {
00342 return mData->nickName;
00343 }
00344
00345 QString Addressee::nickNameLabel()
00346 {
00347 return i18n("Nick Name");
00348 }
00349
00350
00351 void Addressee::setBirthday( const QDateTime &birthday )
00352 {
00353 if ( birthday == mData->birthday ) return;
00354 detach();
00355 mData->empty = false;
00356 mData->birthday = birthday;
00357 }
00358
00359 QDateTime Addressee::birthday() const
00360 {
00361 return mData->birthday;
00362 }
00363
00364 QString Addressee::birthdayLabel()
00365 {
00366 return i18n("Birthday");
00367 }
00368
00369
00370 QString Addressee::homeAddressStreetLabel()
00371 {
00372 return i18n("Home Address Street");
00373 }
00374
00375
00376 QString Addressee::homeAddressLocalityLabel()
00377 {
00378 return i18n("Home Address Locality");
00379 }
00380
00381
00382 QString Addressee::homeAddressRegionLabel()
00383 {
00384 return i18n("Home Address Region");
00385 }
00386
00387
00388 QString Addressee::homeAddressPostalCodeLabel()
00389 {
00390 return i18n("Home Address Postal Code");
00391 }
00392
00393
00394 QString Addressee::homeAddressCountryLabel()
00395 {
00396 return i18n("Home Address Country");
00397 }
00398
00399
00400 QString Addressee::homeAddressLabelLabel()
00401 {
00402 return i18n("Home Address Label");
00403 }
00404
00405
00406 QString Addressee::businessAddressStreetLabel()
00407 {
00408 return i18n("Business Address Street");
00409 }
00410
00411
00412 QString Addressee::businessAddressLocalityLabel()
00413 {
00414 return i18n("Business Address Locality");
00415 }
00416
00417
00418 QString Addressee::businessAddressRegionLabel()
00419 {
00420 return i18n("Business Address Region");
00421 }
00422
00423
00424 QString Addressee::businessAddressPostalCodeLabel()
00425 {
00426 return i18n("Business Address Postal Code");
00427 }
00428
00429
00430 QString Addressee::businessAddressCountryLabel()
00431 {
00432 return i18n("Business Address Country");
00433 }
00434
00435
00436 QString Addressee::businessAddressLabelLabel()
00437 {
00438 return i18n("Business Address Label");
00439 }
00440
00441
00442 QString Addressee::homePhoneLabel()
00443 {
00444 return i18n("Home Phone");
00445 }
00446
00447
00448 QString Addressee::businessPhoneLabel()
00449 {
00450 return i18n("Business Phone");
00451 }
00452
00453
00454 QString Addressee::mobilePhoneLabel()
00455 {
00456 return i18n("Mobile Phone");
00457 }
00458
00459
00460 QString Addressee::homeFaxLabel()
00461 {
00462 return i18n("Home Fax");
00463 }
00464
00465
00466 QString Addressee::businessFaxLabel()
00467 {
00468 return i18n("Business Fax");
00469 }
00470
00471
00472 QString Addressee::carPhoneLabel()
00473 {
00474 return i18n("Car Phone");
00475 }
00476
00477
00478 QString Addressee::isdnLabel()
00479 {
00480 return i18n("ISDN");
00481 }
00482
00483
00484 QString Addressee::pagerLabel()
00485 {
00486 return i18n("Pager");
00487 }
00488
00489
00490 QString Addressee::emailLabel()
00491 {
00492 return i18n("Email Address");
00493 }
00494
00495
00496 void Addressee::setMailer( const QString &mailer )
00497 {
00498 if ( mailer == mData->mailer ) return;
00499 detach();
00500 mData->empty = false;
00501 mData->mailer = mailer;
00502 }
00503
00504 QString Addressee::mailer() const
00505 {
00506 return mData->mailer;
00507 }
00508
00509 QString Addressee::mailerLabel()
00510 {
00511 return i18n("Mail Client");
00512 }
00513
00514
00515 void Addressee::setTimeZone( const TimeZone &timeZone )
00516 {
00517 if ( timeZone == mData->timeZone ) return;
00518 detach();
00519 mData->empty = false;
00520 mData->timeZone = timeZone;
00521 }
00522
00523 TimeZone Addressee::timeZone() const
00524 {
00525 return mData->timeZone;
00526 }
00527
00528 QString Addressee::timeZoneLabel()
00529 {
00530 return i18n("Time Zone");
00531 }
00532
00533
00534 void Addressee::setGeo( const Geo &geo )
00535 {
00536 if ( geo == mData->geo ) return;
00537 detach();
00538 mData->empty = false;
00539 mData->geo = geo;
00540 }
00541
00542 Geo Addressee::geo() const
00543 {
00544 return mData->geo;
00545 }
00546
00547 QString Addressee::geoLabel()
00548 {
00549 return i18n("Geographic Position");
00550 }
00551
00552
00553 void Addressee::setTitle( const QString &title )
00554 {
00555 if ( title == mData->title ) return;
00556 detach();
00557 mData->empty = false;
00558 mData->title = title;
00559 }
00560
00561 QString Addressee::title() const
00562 {
00563 return mData->title;
00564 }
00565
00566 QString Addressee::titleLabel()
00567 {
00568 return i18n("Title");
00569 }
00570
00571
00572 void Addressee::setRole( const QString &role )
00573 {
00574 if ( role == mData->role ) return;
00575 detach();
00576 mData->empty = false;
00577 mData->role = role;
00578 }
00579
00580 QString Addressee::role() const
00581 {
00582 return mData->role;
00583 }
00584
00585 QString Addressee::roleLabel()
00586 {
00587 return i18n("Role");
00588 }
00589
00590
00591 void Addressee::setOrganization( const QString &organization )
00592 {
00593 if ( organization == mData->organization ) return;
00594 detach();
00595 mData->empty = false;
00596 mData->organization = organization;
00597 }
00598
00599 QString Addressee::organization() const
00600 {
00601 return mData->organization;
00602 }
00603
00604 QString Addressee::organizationLabel()
00605 {
00606 return i18n("Organization");
00607 }
00608
00609
00610 void Addressee::setNote( const QString ¬e )
00611 {
00612 if ( note == mData->note ) return;
00613 detach();
00614 mData->empty = false;
00615 mData->note = note;
00616 }
00617
00618 QString Addressee::note() const
00619 {
00620 return mData->note;
00621 }
00622
00623 QString Addressee::noteLabel()
00624 {
00625 return i18n("Note");
00626 }
00627
00628
00629 void Addressee::setProductId( const QString &productId )
00630 {
00631 if ( productId == mData->productId ) return;
00632 detach();
00633 mData->empty = false;
00634 mData->productId = productId;
00635 }
00636
00637 QString Addressee::productId() const
00638 {
00639 return mData->productId;
00640 }
00641
00642 QString Addressee::productIdLabel()
00643 {
00644 return i18n("Product Identifier");
00645 }
00646
00647
00648 void Addressee::setRevision( const QDateTime &revision )
00649 {
00650 if ( revision == mData->revision ) return;
00651 detach();
00652 mData->empty = false;
00653 mData->revision = revision;
00654 }
00655
00656 QDateTime Addressee::revision() const
00657 {
00658 return mData->revision;
00659 }
00660
00661 QString Addressee::revisionLabel()
00662 {
00663 return i18n("Revision Date");
00664 }
00665
00666
00667 void Addressee::setSortString( const QString &sortString )
00668 {
00669 if ( sortString == mData->sortString ) return;
00670 detach();
00671 mData->empty = false;
00672 mData->sortString = sortString;
00673 }
00674
00675 QString Addressee::sortString() const
00676 {
00677 return mData->sortString;
00678 }
00679
00680 QString Addressee::sortStringLabel()
00681 {
00682 return i18n("Sort String");
00683 }
00684
00685
00686 void Addressee::setUrl( const KURL &url )
00687 {
00688 if ( url == mData->url ) return;
00689 detach();
00690 mData->empty = false;
00691 mData->url = url;
00692 }
00693
00694 KURL Addressee::url() const
00695 {
00696 return mData->url;
00697 }
00698
00699 QString Addressee::urlLabel()
00700 {
00701 return i18n("URL");
00702 }
00703
00704
00705 void Addressee::setSecrecy( const Secrecy &secrecy )
00706 {
00707 if ( secrecy == mData->secrecy ) return;
00708 detach();
00709 mData->empty = false;
00710 mData->secrecy = secrecy;
00711 }
00712
00713 Secrecy Addressee::secrecy() const
00714 {
00715 return mData->secrecy;
00716 }
00717
00718 QString Addressee::secrecyLabel()
00719 {
00720 return i18n("Security Class");
00721 }
00722
00723
00724 void Addressee::setLogo( const Picture &logo )
00725 {
00726 if ( logo == mData->logo ) return;
00727 detach();
00728 mData->empty = false;
00729 mData->logo = logo;
00730 }
00731
00732 Picture Addressee::logo() const
00733 {
00734 return mData->logo;
00735 }
00736
00737 QString Addressee::logoLabel()
00738 {
00739 return i18n("Logo");
00740 }
00741
00742
00743 void Addressee::setPhoto( const Picture &photo )
00744 {
00745 if ( photo == mData->photo ) return;
00746 detach();
00747 mData->empty = false;
00748 mData->photo = photo;
00749 }
00750
00751 Picture Addressee::photo() const
00752 {
00753 return mData->photo;
00754 }
00755
00756 QString Addressee::photoLabel()
00757 {
00758 return i18n("Photo");
00759 }
00760
00761
00762 void Addressee::setSound( const Sound &sound )
00763 {
00764 if ( sound == mData->sound ) return;
00765 detach();
00766 mData->empty = false;
00767 mData->sound = sound;
00768 }
00769
00770 Sound Addressee::sound() const
00771 {
00772 return mData->sound;
00773 }
00774
00775 QString Addressee::soundLabel()
00776 {
00777 return i18n("Sound");
00778 }
00779
00780
00781 void Addressee::setAgent( const Agent &agent )
00782 {
00783 if ( agent == mData->agent ) return;
00784 detach();
00785 mData->empty = false;
00786 mData->agent = agent;
00787 }
00788
00789 Agent Addressee::agent() const
00790 {
00791 return mData->agent;
00792 }
00793
00794 QString Addressee::agentLabel()
00795 {
00796 return i18n("Agent");
00797 }
00798
00799
00800
00801 void Addressee::setNameFromString( const QString &str )
00802 {
00803 setFormattedName( str );
00804 setName( str );
00805
00806
00807 setPrefix( QString::null );
00808 setGivenName( QString::null );
00809 setAdditionalName( QString::null );
00810 setFamilyName( QString::null );
00811 setSuffix( QString::null );
00812
00813 if ( str.isEmpty() )
00814 return;
00815
00816 QString spaceStr = " ";
00817 QString emptyStr = "";
00818 AddresseeHelper *helper = AddresseeHelper::self();
00819
00820 int i = str.find( ',' );
00821 if( i < 0 ) {
00822 QStringList parts = QStringList::split( spaceStr, str );
00823 int leftOffset = 0;
00824 int rightOffset = parts.count() - 1;
00825
00826 QString suffix;
00827 while ( rightOffset >= 0 ) {
00828 if ( helper->containsSuffix( parts[ rightOffset ] ) ) {
00829 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? emptyStr : spaceStr));
00830 rightOffset--;
00831 } else
00832 break;
00833 }
00834 setSuffix( suffix );
00835
00836 if ( rightOffset < 0 )
00837 return;
00838
00839 if ( rightOffset - 1 >= 0 && helper->containsPrefix( parts[ rightOffset - 1 ].lower() ) ) {
00840 setFamilyName( parts[ rightOffset - 1 ] + spaceStr + parts[ rightOffset ] );
00841 rightOffset--;
00842 } else
00843 setFamilyName( parts[ rightOffset ] );
00844
00845 QString prefix;
00846 while ( leftOffset < rightOffset ) {
00847 if ( helper->containsTitle( parts[ leftOffset ] ) ) {
00848 prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
00849 leftOffset++;
00850 } else
00851 break;
00852 }
00853 setPrefix( prefix );
00854
00855 if ( leftOffset < rightOffset ) {
00856 setGivenName( parts[ leftOffset ] );
00857 leftOffset++;
00858 }
00859
00860 QString additionalName;
00861 while ( leftOffset < rightOffset ) {
00862 additionalName.append( ( additionalName.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
00863 leftOffset++;
00864 }
00865 setAdditionalName( additionalName );
00866 } else {
00867 QString part1 = str.left( i );
00868 QString part2 = str.mid( i + 1 );
00869
00870 QStringList parts = QStringList::split( spaceStr, part1 );
00871 int leftOffset = 0;
00872 int rightOffset = parts.count() - 1;
00873
00874 if ( parts.count() > 0 ) {
00875
00876 QString suffix;
00877 while ( rightOffset >= 0 ) {
00878 if ( helper->containsSuffix( parts[ rightOffset ] ) ) {
00879 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? emptyStr : spaceStr));
00880 rightOffset--;
00881 } else
00882 break;
00883 }
00884 setSuffix( suffix );
00885
00886 if ( rightOffset - 1 >= 0 && helper->containsPrefix( parts[ rightOffset - 1 ].lower() ) ) {
00887 setFamilyName( parts[ rightOffset - 1 ] + spaceStr + parts[ rightOffset ] );
00888 rightOffset--;
00889 } else
00890 setFamilyName( parts[ rightOffset ] );
00891
00892 QString prefix;
00893 while ( leftOffset < rightOffset ) {
00894 if ( helper->containsTitle( parts[ leftOffset ] ) ) {
00895 prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
00896 leftOffset++;
00897 } else
00898 break;
00899 }
00900 } else {
00901 setPrefix( "" );
00902 setFamilyName( "" );
00903 setSuffix( "" );
00904 }
00905
00906 parts = QStringList::split( spaceStr, part2 );
00907
00908 leftOffset = 0;
00909 rightOffset = parts.count();
00910
00911 if ( parts.count() > 0 ) {
00912
00913 QString prefix;
00914 while ( leftOffset < rightOffset ) {
00915 if ( helper->containsTitle( parts[ leftOffset ] ) ) {
00916 prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
00917 leftOffset++;
00918 } else
00919 break;
00920 }
00921 setPrefix( prefix );
00922
00923 if ( leftOffset < rightOffset ) {
00924 setGivenName( parts[ leftOffset ] );
00925 leftOffset++;
00926 }
00927
00928 QString additionalName;
00929 while ( leftOffset < rightOffset ) {
00930 additionalName.append( ( additionalName.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
00931 leftOffset++;
00932 }
00933 setAdditionalName( additionalName );
00934 } else {
00935 setGivenName( "" );
00936 setAdditionalName( "" );
00937 }
00938 }
00939 }
00940
00941 QString Addressee::realName() const
00942 {
00943 if ( !formattedName().isEmpty() )
00944 return formattedName();
00945
00946 QString n = assembledName();
00947
00948 if ( n.isEmpty() )
00949 n = name();
00950
00951 return n;
00952 }
00953
00954 QString Addressee::assembledName() const
00955 {
00956 QString name = prefix() + " " + givenName() + " " + additionalName() + " " +
00957 familyName() + " " + suffix();
00958
00959 return name.simplifyWhiteSpace();
00960 }
00961
00962 QString Addressee::fullEmail( const QString &email ) const
00963 {
00964 QString e;
00965 if ( email.isNull() ) {
00966 e = preferredEmail();
00967 } else {
00968 e = email;
00969 }
00970 if ( e.isEmpty() ) return QString::null;
00971
00972 QString text;
00973 if ( realName().isEmpty() )
00974 text = e;
00975 else {
00976 QRegExp needQuotes( "[^ 0-9A-Za-z\\x0080-\\xFFFF]" );
00977 if ( realName().find( needQuotes ) != -1 )
00978 text = "\"" + realName() + "\" <" + e + ">";
00979 else
00980 text = realName() + " <" + e + ">";
00981 }
00982
00983 return text;
00984 }
00985
00986 void Addressee::insertEmail( const QString &email, bool preferred )
00987 {
00988 if (email.simplifyWhiteSpace().isEmpty())
00989 return;
00990 detach();
00991
00992 QStringList::Iterator it = mData->emails.find( email );
00993
00994 if ( it != mData->emails.end() ) {
00995 if ( !preferred || it == mData->emails.begin() ) return;
00996 mData->emails.remove( it );
00997 mData->emails.prepend( email );
00998 } else {
00999 if ( preferred ) {
01000 mData->emails.prepend( email );
01001 } else {
01002 mData->emails.append( email );
01003 }
01004 }
01005 }
01006
01007 void Addressee::removeEmail( const QString &email )
01008 {
01009 detach();
01010
01011 QStringList::Iterator it = mData->emails.find( email );
01012 if ( it == mData->emails.end() ) return;
01013
01014 mData->emails.remove( it );
01015 }
01016
01017 QString Addressee::preferredEmail() const
01018 {
01019 if ( mData->emails.count() == 0 ) return QString::null;
01020 else return mData->emails.first();
01021 }
01022
01023 QStringList Addressee::emails() const
01024 {
01025 return mData->emails;
01026 }
01027 void Addressee::setEmails( const QStringList& emails ) {
01028 detach();
01029 mData->emails = emails;
01030 }
01031 void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber )
01032 {
01033 detach();
01034 mData->empty = false;
01035
01036 PhoneNumber::List::Iterator it;
01037 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
01038 if ( (*it).id() == phoneNumber.id() ) {
01039 *it = phoneNumber;
01040 return;
01041 }
01042 }
01043 if ( !phoneNumber.number().simplifyWhiteSpace().isEmpty() )
01044 mData->phoneNumbers.append( phoneNumber );
01045 }
01046
01047 void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber )
01048 {
01049 detach();
01050
01051 PhoneNumber::List::Iterator it;
01052 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
01053 if ( (*it).id() == phoneNumber.id() ) {
01054 mData->phoneNumbers.remove( it );
01055 return;
01056 }
01057 }
01058 }
01059
01060 PhoneNumber Addressee::phoneNumber( int type ) const
01061 {
01062 PhoneNumber phoneNumber( "", type );
01063 PhoneNumber::List::ConstIterator it;
01064 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
01065 if ( matchBinaryPattern( (*it).type(), type ) ) {
01066 if ( (*it).type() & PhoneNumber::Pref )
01067 return (*it);
01068 else if ( phoneNumber.number().isEmpty() )
01069 phoneNumber = (*it);
01070 }
01071 }
01072
01073 return phoneNumber;
01074 }
01075
01076 PhoneNumber::List Addressee::phoneNumbers() const
01077 {
01078 return mData->phoneNumbers;
01079 }
01080
01081 PhoneNumber::List Addressee::phoneNumbers( int type ) const
01082 {
01083 PhoneNumber::List list;
01084
01085 PhoneNumber::List::ConstIterator it;
01086 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
01087 if ( matchBinaryPattern( (*it).type(), type ) ) {
01088 list.append( *it );
01089 }
01090 }
01091 return list;
01092 }
01093
01094 PhoneNumber Addressee::findPhoneNumber( const QString &id ) const
01095 {
01096 PhoneNumber::List::ConstIterator it;
01097 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
01098 if ( (*it).id() == id ) {
01099 return *it;
01100 }
01101 }
01102 return PhoneNumber();
01103 }
01104
01105 void Addressee::insertKey( const Key &key )
01106 {
01107 detach();
01108 mData->empty = false;
01109
01110 Key::List::Iterator it;
01111 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
01112 if ( (*it).id() == key.id() ) {
01113 *it = key;
01114 return;
01115 }
01116 }
01117 mData->keys.append( key );
01118 }
01119
01120 void Addressee::removeKey( const Key &key )
01121 {
01122 detach();
01123
01124 Key::List::Iterator it;
01125 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
01126 if ( (*it).id() == key.id() ) {
01127 mData->keys.remove( key );
01128 return;
01129 }
01130 }
01131 }
01132
01133 Key Addressee::key( int type, QString customTypeString ) const
01134 {
01135 Key::List::ConstIterator it;
01136 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
01137 if ( (*it).type() == type ) {
01138 if ( type == Key::Custom ) {
01139 if ( customTypeString.isEmpty() ) {
01140 return *it;
01141 } else {
01142 if ( (*it).customTypeString() == customTypeString )
01143 return (*it);
01144 }
01145 } else {
01146 return *it;
01147 }
01148 }
01149 }
01150 return Key( QString(), type );
01151 }
01152
01153 void Addressee::setKeys( const Key::List& list )
01154 {
01155 detach();
01156 mData->keys = list;
01157 }
01158
01159 Key::List Addressee::keys() const
01160 {
01161 return mData->keys;
01162 }
01163
01164 Key::List Addressee::keys( int type, QString customTypeString ) const
01165 {
01166 Key::List list;
01167
01168 Key::List::ConstIterator it;
01169 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
01170 if ( (*it).type() == type ) {
01171 if ( type == Key::Custom ) {
01172 if ( customTypeString.isEmpty() ) {
01173 list.append( *it );
01174 } else {
01175 if ( (*it).customTypeString() == customTypeString )
01176 list.append( *it );
01177 }
01178 } else {
01179 list.append( *it );
01180 }
01181 }
01182 }
01183 return list;
01184 }
01185
01186 Key Addressee::findKey( const QString &id ) const
01187 {
01188 Key::List::ConstIterator it;
01189 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
01190 if ( (*it).id() == id ) {
01191 return *it;
01192 }
01193 }
01194 return Key();
01195 }
01196
01197 QString Addressee::asString() const
01198 {
01199 return "Smith, agent Smith...";
01200 }
01201
01202 void Addressee::dump() const
01203 {
01204 kdDebug(5700) << "Addressee {" << endl;
01205
01206 kdDebug(5700) << " Uid: '" << uid() << "'" << endl;
01207
01208 kdDebug(5700) << " Name: '" << name() << "'" << endl;
01209 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl;
01210 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl;
01211 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl;
01212 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl;
01213 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl;
01214 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl;
01215 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl;
01216 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl;
01217 kdDebug(5700) << " Mailer: '" << mailer() << "'" << endl;
01218 kdDebug(5700) << " TimeZone: '" << timeZone().asString() << "'" << endl;
01219 kdDebug(5700) << " Geo: '" << geo().asString() << "'" << endl;
01220 kdDebug(5700) << " Title: '" << title() << "'" << endl;
01221 kdDebug(5700) << " Role: '" << role() << "'" << endl;
01222 kdDebug(5700) << " Organization: '" << organization() << "'" << endl;
01223 kdDebug(5700) << " Note: '" << note() << "'" << endl;
01224 kdDebug(5700) << " ProductId: '" << productId() << "'" << endl;
01225 kdDebug(5700) << " Revision: '" << revision().toString() << "'" << endl;
01226 kdDebug(5700) << " SortString: '" << sortString() << "'" << endl;
01227 kdDebug(5700) << " Url: '" << url().url() << "'" << endl;
01228 kdDebug(5700) << " Secrecy: '" << secrecy().asString() << "'" << endl;
01229 kdDebug(5700) << " Logo: '" << logo().asString() << "'" << endl;
01230 kdDebug(5700) << " Photo: '" << photo().asString() << "'" << endl;
01231 kdDebug(5700) << " Sound: '" << sound().asString() << "'" << endl;
01232 kdDebug(5700) << " Agent: '" << agent().asString() << "'" << endl;
01233
01234 kdDebug(5700) << " Emails {" << endl;
01235 QStringList e = emails();
01236 QStringList::ConstIterator it;
01237 for( it = e.begin(); it != e.end(); ++it ) {
01238 kdDebug(5700) << " " << (*it) << endl;
01239 }
01240 kdDebug(5700) << " }" << endl;
01241
01242 kdDebug(5700) << " PhoneNumbers {" << endl;
01243 PhoneNumber::List p = phoneNumbers();
01244 PhoneNumber::List::ConstIterator it2;
01245 for( it2 = p.begin(); it2 != p.end(); ++it2 ) {
01246 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl;
01247 }
01248 kdDebug(5700) << " }" << endl;
01249
01250 Address::List a = addresses();
01251 Address::List::ConstIterator it3;
01252 for( it3 = a.begin(); it3 != a.end(); ++it3 ) {
01253 (*it3).dump();
01254 }
01255
01256 kdDebug(5700) << " Keys {" << endl;
01257 Key::List k = keys();
01258 Key::List::ConstIterator it4;
01259 for( it4 = k.begin(); it4 != k.end(); ++it4 ) {
01260 kdDebug(5700) << " Type: " << int((*it4).type()) <<
01261 " Key: " << (*it4).textData() <<
01262 " CustomString: " << (*it4).customTypeString() << endl;
01263 }
01264 kdDebug(5700) << " }" << endl;
01265
01266 kdDebug(5700) << "}" << endl;
01267 }
01268
01269
01270 void Addressee::insertAddress( const Address &address )
01271 {
01272 detach();
01273 mData->empty = false;
01274
01275 Address::List::Iterator it;
01276 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
01277 if ( (*it).id() == address.id() ) {
01278 *it = address;
01279 return;
01280 }
01281 }
01282 mData->addresses.append( address );
01283 }
01284
01285 void Addressee::removeAddress( const Address &address )
01286 {
01287 detach();
01288
01289 Address::List::Iterator it;
01290 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
01291 if ( (*it).id() == address.id() ) {
01292 mData->addresses.remove( it );
01293 return;
01294 }
01295 }
01296 }
01297
01298 Address Addressee::address( int type ) const
01299 {
01300 Address address( type );
01301 Address::List::ConstIterator it;
01302 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
01303 if ( matchBinaryPattern( (*it).type(), type ) ) {
01304 if ( (*it).type() & Address::Pref )
01305 return (*it);
01306 else if ( address.isEmpty() )
01307 address = (*it);
01308 }
01309 }
01310
01311 return address;
01312 }
01313
01314 Address::List Addressee::addresses() const
01315 {
01316 return mData->addresses;
01317 }
01318
01319 Address::List Addressee::addresses( int type ) const
01320 {
01321 Address::List list;
01322
01323 Address::List::ConstIterator it;
01324 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
01325 if ( matchBinaryPattern( (*it).type(), type ) ) {
01326 list.append( *it );
01327 }
01328 }
01329
01330 return list;
01331 }
01332
01333 Address Addressee::findAddress( const QString &id ) const
01334 {
01335 Address::List::ConstIterator it;
01336 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
01337 if ( (*it).id() == id ) {
01338 return *it;
01339 }
01340 }
01341 return Address();
01342 }
01343
01344 void Addressee::insertCategory( const QString &c )
01345 {
01346 detach();
01347 mData->empty = false;
01348
01349 if ( mData->categories.findIndex( c ) != -1 ) return;
01350
01351 mData->categories.append( c );
01352 }
01353
01354 void Addressee::removeCategory( const QString &c )
01355 {
01356 detach();
01357
01358 QStringList::Iterator it = mData->categories.find( c );
01359 if ( it == mData->categories.end() ) return;
01360
01361 mData->categories.remove( it );
01362 }
01363
01364 bool Addressee::hasCategory( const QString &c ) const
01365 {
01366 return ( mData->categories.findIndex( c ) != -1 );
01367 }
01368
01369 void Addressee::setCategories( const QStringList &c )
01370 {
01371 detach();
01372 mData->empty = false;
01373
01374 mData->categories = c;
01375 }
01376
01377 QStringList Addressee::categories() const
01378 {
01379 return mData->categories;
01380 }
01381
01382 void Addressee::insertCustom( const QString &app, const QString &name,
01383 const QString &value )
01384 {
01385 if ( value.isNull() || name.isEmpty() || app.isEmpty() ) return;
01386
01387 detach();
01388 mData->empty = false;
01389
01390 QString qualifiedName = app + "-" + name + ":";
01391
01392 QStringList::Iterator it;
01393 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
01394 if ( (*it).startsWith( qualifiedName ) ) {
01395 (*it) = qualifiedName + value;
01396 return;
01397 }
01398 }
01399
01400 mData->custom.append( qualifiedName + value );
01401 }
01402
01403 void Addressee::removeCustom( const QString &app, const QString &name)
01404 {
01405 detach();
01406
01407 QString qualifiedName = app + "-" + name + ":";
01408
01409 QStringList::Iterator it;
01410 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
01411 if ( (*it).startsWith( qualifiedName ) ) {
01412 mData->custom.remove( it );
01413 return;
01414 }
01415 }
01416 }
01417
01418 QString Addressee::custom( const QString &app, const QString &name ) const
01419 {
01420 QString qualifiedName = app + "-" + name + ":";
01421 QString value;
01422
01423 QStringList::ConstIterator it;
01424 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
01425 if ( (*it).startsWith( qualifiedName ) ) {
01426 value = (*it).mid( (*it).find( ":" ) + 1 );
01427 break;
01428 }
01429 }
01430
01431 return value;
01432 }
01433
01434 void Addressee::setCustoms( const QStringList &l )
01435 {
01436 detach();
01437 mData->empty = false;
01438
01439 mData->custom = l;
01440 }
01441
01442 QStringList Addressee::customs() const
01443 {
01444 return mData->custom;
01445 }
01446
01447 void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName,
01448 QString &email)
01449 {
01450 int startPos, endPos, len;
01451 QString partA, partB, result;
01452 char endCh = '>';
01453
01454 startPos = rawEmail.find( '<' );
01455 if ( startPos < 0 ) {
01456 startPos = rawEmail.find( '(' );
01457 endCh = ')';
01458 }
01459
01460 if ( startPos < 0 ) {
01461
01462
01463 email = rawEmail;
01464 fullName = "";
01465 } else {
01466
01467 endPos = rawEmail.find( endCh, startPos + 1 );
01468
01469 if ( endPos < 0 ) {
01470
01471
01472 email = rawEmail;
01473 fullName = "";
01474 } else {
01475
01476
01477
01478 QString left = rawEmail.left( startPos ).stripWhiteSpace();
01479
01480 QString right = rawEmail.mid( startPos + 1, endPos - startPos - 1 )
01481 .stripWhiteSpace();
01482
01483
01484 if ( endCh == '>' ) {
01485 fullName = left;
01486 email = right;
01487 } else {
01488 fullName = right;
01489 email = left;
01490 }
01491
01492
01493
01494 len = fullName.length();
01495 if ( fullName[ 0 ] == '"' && fullName[ len - 1 ] == '"' )
01496 fullName = fullName.mid( 1, len - 2 );
01497 else if ( fullName[ 0 ] == '(' && fullName[ len - 1 ] == ')' )
01498 fullName = fullName.mid( 1, len - 2 );
01499
01500 len = email.length();
01501 if ( email[ 0 ] == '<' && email[ len - 1 ] == '>' )
01502 email = email.mid( 1, len - 2 );
01503 }
01504 }
01505 }
01506
01507 void Addressee::setResource( Resource *resource )
01508 {
01509 detach();
01510 mData->resource = resource;
01511 }
01512
01513 Resource *Addressee::resource() const
01514 {
01515 return mData->resource;
01516 }
01517
01518 void Addressee::setChanged( bool value )
01519 {
01520 detach();
01521 mData->changed = value;
01522 }
01523
01524 bool Addressee::changed() const
01525 {
01526 return mData->changed;
01527 }
01528
01529 void Addressee::setSortKey( KABC::Field *field )
01530 {
01531 mSortField = field;
01532 }
01533
01534 bool Addressee::operator< ( const Addressee &addr )
01535 {
01536 if ( !mSortField )
01537 return false;
01538 else
01539 return ( QString::localeAwareCompare( mSortField->value( *this ).lower(),
01540 mSortField->value( addr ).lower() ) < 0 );
01541 }
01542
01543 QDataStream &KABC::operator<<( QDataStream &s, const Addressee &a )
01544 {
01545 if (!a.mData) return s;
01546
01547 s << a.uid();
01548
01549 s << a.mData->name;
01550 s << a.mData->formattedName;
01551 s << a.mData->familyName;
01552 s << a.mData->givenName;
01553 s << a.mData->additionalName;
01554 s << a.mData->prefix;
01555 s << a.mData->suffix;
01556 s << a.mData->nickName;
01557 s << a.mData->birthday;
01558 s << a.mData->mailer;
01559 s << a.mData->timeZone;
01560 s << a.mData->geo;
01561 s << a.mData->title;
01562 s << a.mData->role;
01563 s << a.mData->organization;
01564 s << a.mData->note;
01565 s << a.mData->productId;
01566 s << a.mData->revision;
01567 s << a.mData->sortString;
01568 s << a.mData->url;
01569 s << a.mData->secrecy;
01570 s << a.mData->logo;
01571 s << a.mData->photo;
01572 s << a.mData->sound;
01573 s << a.mData->agent;
01574 s << a.mData->phoneNumbers;
01575 s << a.mData->addresses;
01576 s << a.mData->emails;
01577 s << a.mData->categories;
01578 s << a.mData->custom;
01579 s << a.mData->keys;
01580 return s;
01581 }
01582
01583 QDataStream &KABC::operator>>( QDataStream &s, Addressee &a )
01584 {
01585 if (!a.mData) return s;
01586
01587 s >> a.mData->uid;
01588
01589 s >> a.mData->name;
01590 s >> a.mData->formattedName;
01591 s >> a.mData->familyName;
01592 s >> a.mData->givenName;
01593 s >> a.mData->additionalName;
01594 s >> a.mData->prefix;
01595 s >> a.mData->suffix;
01596 s >> a.mData->nickName;
01597 s >> a.mData->birthday;
01598 s >> a.mData->mailer;
01599 s >> a.mData->timeZone;
01600 s >> a.mData->geo;
01601 s >> a.mData->title;
01602 s >> a.mData->role;
01603 s >> a.mData->organization;
01604 s >> a.mData->note;
01605 s >> a.mData->productId;
01606 s >> a.mData->revision;
01607 s >> a.mData->sortString;
01608 s >> a.mData->url;
01609 s >> a.mData->secrecy;
01610 s >> a.mData->logo;
01611 s >> a.mData->photo;
01612 s >> a.mData->sound;
01613 s >> a.mData->agent;
01614 s >> a.mData->phoneNumbers;
01615 s >> a.mData->addresses;
01616 s >> a.mData->emails;
01617 s >> a.mData->categories;
01618 s >> a.mData->custom;
01619 s >> a.mData->keys;
01620
01621 a.mData->empty = false;
01622
01623 return s;
01624 }
01625
01626 bool matchBinaryPattern( int value, int pattern )
01627 {
01634 if ( pattern == 0 )
01635 return ( value == 0 );
01636 else
01637 return ( pattern == ( pattern & value ) );
01638 }
This file is part of the documentation for kabc Library Version 3.2.0.