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