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