• Skip to content
  • Skip to link menu
KDE 4.1 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() << "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 &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 = 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   // This is a simplified version of KPIM::splitAddress().
01567 
01568   fullName = "";
01569   email = "";
01570   if ( rawEmail.isEmpty() )
01571     return; // KPIM::AddressEmpty;
01572 
01573   // The code works on 8-bit strings, so convert the input to UTF-8.
01574   QByteArray address = rawEmail.toUtf8();
01575 
01576   QByteArray displayName;
01577   QByteArray addrSpec;
01578   QByteArray comment;
01579 
01580   // The following is a primitive parser for a mailbox-list (cf. RFC 2822).
01581   // The purpose is to extract a displayable string from the mailboxes.
01582   // Comments in the addr-spec are not handled. No error checking is done.
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 '\\' : // quoted character
01610                  displayName += *p;
01611                  ++p; // skip the '\'
01612                  if ( *p )
01613                    displayName += *p;
01614                  else
01615                    //return KPIM::UnexpectedEnd;
01616                    goto ABORT_PARSING;
01617                  break;
01618       case ',' : if ( !inQuotedString ) {
01619                    //if ( allowMultipleAddresses )
01620                    //  stop = true;
01621                    //else
01622                    //  return KPIM::UnexpectedComma;
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 += ' '; // separate the text of several comments
01641                  }
01642                  else
01643                    comment += *p;
01644                  break;
01645       case '\\' : // quoted character
01646                  comment += *p;
01647                  ++p; // skip the '\'
01648                  if ( *p )
01649                    comment += *p;
01650                  else
01651                    //return KPIM::UnexpectedEnd;
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 '\\' : // quoted character
01670                  addrSpec += *p;
01671                  ++p; // skip the '\'
01672                  if ( *p )
01673                    addrSpec += *p;
01674                  else
01675                    //return KPIM::UnexpectedEnd;
01676                    goto ABORT_PARSING;
01677                  break;
01678       default :  addrSpec += *p;
01679       }
01680       break;
01681     }
01682     } // switch ( context )
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   // check for errors
01694   if ( inQuotedString )
01695     return; // KPIM::UnbalancedQuote;
01696   if ( context == InComment )
01697     return; // KPIM::UnbalancedParens;
01698   if ( context == InAngleAddress )
01699     return; // KPIM::UnclosedAngleAddr;
01700 
01701   if ( addrSpec.isEmpty() ) {
01702     if ( displayName.isEmpty() )
01703       return; // KPIM::NoAddressSpec;
01704     else {
01705       //addrSpec = displayName;
01706       //displayName.truncate( 0 );
01707       // Address of the form "foo@bar" or "foo@bar (Name)".
01708       email = fullName;
01709       fullName = QString::fromUtf8( comment );
01710     }
01711   }
01712 
01713   // Check that we do not have any extra characters on the end of the
01714   // strings
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 }

kabc

Skip menu "kabc"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

KDE-PIM Libraries

Skip menu "KDE-PIM Libraries"
  • akonadi
  • kabc
  • kblog
  • kcal
  • kimap
  • kioslave
  •   imap4
  •   mbox
  • kldap
  • kmime
  • kpimidentities
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Generated for KDE-PIM Libraries by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal