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