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(5700) << "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(5700) << "url differs";
00286 return false;
00287 }
00288 if ( !listEquals( d->mPhoneNumbers, a.d->mPhoneNumbers ) ) {
00289 kDebug(5700) << "phoneNumbers differs";
00290 return false;
00291 }
00292 if ( !listEquals( d->mAddresses, a.d->mAddresses ) ) {
00293 kDebug(5700) << "addresses differs";
00294 return false;
00295 }
00296 if ( !listEquals( d->mKeys, a.d->mKeys ) ) {
00297 kDebug(5700) << "keys differs";
00298 return false;
00299 }
00300 if ( !emailsEquals( d->mEmails, a.d->mEmails ) ) {
00301 kDebug(5700) << "emails differs";
00302 return false;
00303 }
00304 if ( !listEquals( d->mCategories, a.d->mCategories ) ) {
00305 kDebug(5700) << "categories differs";
00306 return false;
00307 }
00308 if ( !listEquals( d->mCustom, a.d->mCustom ) ) {
00309 kDebug(5700) << "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 =