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