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