• Skip to content
  • Skip to link menu
KDE 4.0 API Reference
  • KDE API Reference
  • KDE-PIM Libraries
  • Sitemap
  • Contact Us
 

kabc

addressee.cpp

00001 /*** Warning! This file has been generated by the script makeaddressee ***/
00002 /*
00003     This file is part of libkabc.
00004     Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
00005     Copyright (c) 2003 Carsten Pfeiffer <pfeiffer@kde.org>
00006     Copyright (c) 2005 Ingo Kloecker <kloecker@kde.org>
00007 
00008     This library is free software; you can redistribute it and/or
00009     modify it under the terms of the GNU Library General Public
00010     License as published by the Free Software Foundation; either
00011     version 2 of the License, or (at your option) any later version.
00012 
00013     This library is distributed in the hope that it will be useful,
00014     but WITHOUT ANY WARRANTY; without even the implied warranty of
00015     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016     Library General Public License for more details.
00017 
00018     You should have received a copy of the GNU Library General Public License
00019     along with this library; see the file COPYING.LIB.  If not, write to
00020     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00021     Boston, MA 02110-1301, USA.
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 &note )
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   //remove enclosing quotes from string
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   // clear all name parts
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 =