Git commit c75473ef870e054b48a38051769095146334bc2a by Tobias Koenig. Committed on 03/03/2013 at 19:03. Pushed by tokoe into branch 'master'. Do no auto-generate the code of the Addressee class We haven't changed the Addressee class for a long time, so the overhead of using a script to generate it isn't justified anymore. M +3 -20 kabc/CMakeLists.txt M +0 -1 kabc/Mainpage.dox M +0 -2 kabc/Messages.sh A +2032 -0 kabc/addressee.cpp [License: GENERATED FILE] * A +992 -0 kabc/addressee.h [License: LGPL (v2+)] A +632 -0 kabc/field.cpp [License: LGPL (v2+)] D +0 -1136 kabc/scripts/addressee.src.cpp D +0 -500 kabc/scripts/addressee.src.h D +0 -32 kabc/scripts/createisomap.pl D +0 -5 kabc/scripts/doxygen-preprocess-addressee.sh D +0 -83 kabc/scripts/entrylist D +0 -395 kabc/scripts/field.src.cpp D +0 -224 kabc/scripts/makeaddressee The files marked with a * at the end have a non valid license. Please read:= http://techbase.kde.org/Policies/Licensing_Policy and use the headers whic= h are listed at that page. http://commits.kde.org/kdepimlibs/c75473ef870e054b48a38051769095146334bc2a diff --git a/kabc/CMakeLists.txt b/kabc/CMakeLists.txt index 5b82caa..b3907c6 100644 --- a/kabc/CMakeLists.txt +++ b/kabc/CMakeLists.txt @@ -30,33 +30,16 @@ if(NOT KDEPIM_NO_KRESOURCES) add_subdirectory(plugins) endif() add_subdirectory(tests) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) - -add_custom_command( - OUTPUT - ${CMAKE_CURRENT_BINARY_DIR}/field.cpp - ${CMAKE_CURRENT_BINARY_DIR}/addressee.h - ${CMAKE_CURRENT_BINARY_DIR}/addressee.cpp - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts - COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/scripts/makeaddre= ssee - DEPENDS - scripts/makeaddressee - scripts/addressee.src.cpp - scripts/addressee.src.h - scripts/entrylist - scripts/field.src.cpp -) = ########### next target ############### = set(kabc_LIB_SRCS address.cpp - ${CMAKE_CURRENT_BINARY_DIR}/addressee.cpp - ${CMAKE_CURRENT_BINARY_DIR}/addressee.h - ${CMAKE_CURRENT_BINARY_DIR}/field.cpp + addressee.cpp contactgroup.cpp contactgrouptool.cpp errorhandler.cpp + field.cpp geo.cpp key.cpp ldapdn.cpp @@ -125,7 +108,7 @@ install(FILES countrytransl.map DESTINATION ${DATA_INST= ALL_DIR}/kabc) install(FILES kabc_export.h address.h - ${CMAKE_CURRENT_BINARY_DIR}/addressee.h + addressee.h addresseedialog.h addresseelist.h contactgroup.h diff --git a/kabc/Mainpage.dox b/kabc/Mainpage.dox index 6ee8d00..587f24e 100644 --- a/kabc/Mainpage.dox +++ b/kabc/Mainpage.dox @@ -31,5 +31,4 @@ KPilot etc. It is meant as replacement for libkab (in kde= base/kab). LICENCE: LGPL */ // DOXYGEN_REFERENCES =3D kdecore kdeui kresources -// DOXYGEN_EXCLUDE =3D scripts // DOXYGEN_TOOLTIP =3D "An API for the KDE Addressbook." diff --git a/kabc/Messages.sh b/kabc/Messages.sh index b09261a..6e8db52 100644 --- a/kabc/Messages.sh +++ b/kabc/Messages.sh @@ -1,4 +1,2 @@ #! /usr/bin/env bash -cd scripts && perl ./makeaddressee && cd .. $XGETTEXT *.cpp -o $podir/kabc.pot -rm -f addressee.cpp addressee.h field.cpp diff --git a/kabc/addressee.cpp b/kabc/addressee.cpp new file mode 100644 index 0000000..8b79325 --- /dev/null +++ b/kabc/addressee.cpp @@ -0,0 +1,2032 @@ +/*** Warning! This file has been generated by the script makeaddressee ***/ +/* + This file is part of libkabc. + Copyright (c) 2001 Cornelius Schumacher + Copyright (c) 2003 Carsten Pfeiffer + Copyright (c) 2005 Ingo Kloecker + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public Lice= nse + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include +#include +#include + +#include +#include +#include +#include + +#include "addresseehelper.h" +#include "field.h" +#ifndef KDEPIM_NO_KRESOURCES +#include "resource.h" +#endif +#include "sortmode.h" + +#include "addressee.h" + +using namespace KABC; + +static bool matchBinaryPattern( int value, int pattern ); + +template +static bool listEquals( const QList&, const QList& ); +static bool listEquals( const QStringList&, const QStringList& ); +static bool emailsEquals( const QStringList&, const QStringList& ); + +class Addressee::Private : public QSharedData +{ + public: + Private() + : mUid( KRandom::randomString( 10 ) ), +#ifndef KDEPIM_NO_KRESOURCES + mResource( 0 ), +#endif + mEmpty( true ), mChanged( false ) + { + } + + Private( const Private &other ) + : QSharedData( other ) +#ifndef KDEPIM_NO_KRESOURCES + ,mResource( 0 ) +#endif + { + mUid =3D other.mUid; + mName =3D other.mName; + mFormattedName =3D other.mFormattedName; + mFamilyName =3D other.mFamilyName; + mGivenName =3D other.mGivenName; + mAdditionalName =3D other.mAdditionalName; + mPrefix =3D other.mPrefix; + mSuffix =3D other.mSuffix; + mNickName =3D other.mNickName; + mBirthday =3D other.mBirthday; + mMailer =3D other.mMailer; + mTimeZone =3D other.mTimeZone; + mGeo =3D other.mGeo; + mTitle =3D other.mTitle; + mRole =3D other.mRole; + mOrganization =3D other.mOrganization; + mDepartment =3D other.mDepartment; + mNote =3D other.mNote; + mProductId =3D other.mProductId; + mRevision =3D other.mRevision; + mSortString =3D other.mSortString; + mUrl =3D other.mUrl; + mSecrecy =3D other.mSecrecy; + mLogo =3D other.mLogo; + mPhoto =3D other.mPhoto; + mSound =3D other.mSound; + + mPhoneNumbers =3D other.mPhoneNumbers; + mAddresses =3D other.mAddresses; + mKeys =3D other.mKeys; + mEmails =3D other.mEmails; + mCategories =3D other.mCategories; + mCustom =3D other.mCustom; + +#ifndef KDEPIM_NO_KRESOURCES + mResource =3D other.mResource; +#endif + mEmpty =3D other.mEmpty; + mChanged =3D other.mChanged; + } + + ~Private() + { + } + + QString mUid; + QString mName; + QString mFormattedName; + QString mFamilyName; + QString mGivenName; + QString mAdditionalName; + QString mPrefix; + QString mSuffix; + QString mNickName; + QDateTime mBirthday; + QString mMailer; + TimeZone mTimeZone; + Geo mGeo; + QString mTitle; + QString mRole; + QString mOrganization; + QString mDepartment; + QString mNote; + QString mProductId; + QDateTime mRevision; + QString mSortString; + KUrl mUrl; + Secrecy mSecrecy; + Picture mLogo; + Picture mPhoto; + Sound mSound; + + PhoneNumber::List mPhoneNumbers; + Address::List mAddresses; + Key::List mKeys; + QStringList mEmails; + QStringList mCategories; + QStringList mCustom; + +#ifndef KDEPIM_NO_KRESOURCES + Resource *mResource; +#endif + + bool mEmpty :1; + bool mChanged :1; + + static KABC::SortMode *mSortMode; +}; + +KABC::SortMode *Addressee::Private::mSortMode =3D 0; + +Addressee::Addressee() + : d( new Private ) +{ +} + +Addressee::~Addressee() +{ +} + +Addressee::Addressee( const Addressee &other ) + : d( other.d ) +{ +} + +Addressee& Addressee::operator=3D( const Addressee &other ) +{ + if ( this !=3D &other ) + d =3D other.d; + + return *this; +} + +bool Addressee::operator=3D=3D( const Addressee &addressee ) const +{ + if ( d->mUid !=3D addressee.d->mUid ) { + kDebug() << "uid differs"; + return false; + } + + if ( d->mName !=3D addressee.d->mName && + !( d->mName.isEmpty() && addressee.d->mName.isEmpty() ) ) { + kDebug(5700) << "name differs"; + return false; + } + + if ( d->mFormattedName !=3D addressee.d->mFormattedName && + !( d->mFormattedName.isEmpty() && addressee.d->mFormattedName.isEmpty= () ) ) { + kDebug(5700) << "formattedName differs"; + return false; + } + + if ( d->mFamilyName !=3D addressee.d->mFamilyName && + !( d->mFamilyName.isEmpty() && addressee.d->mFamilyName.isEmpty() ) )= { + kDebug(5700) << "familyName differs"; + return false; + } + + if ( d->mGivenName !=3D addressee.d->mGivenName && + !( d->mGivenName.isEmpty() && addressee.d->mGivenName.isEmpty() ) ) { + kDebug(5700) << "givenName differs"; + return false; + } + + if ( d->mAdditionalName !=3D addressee.d->mAdditionalName && + !( d->mAdditionalName.isEmpty() && addressee.d->mAdditionalName.isEmp= ty() ) ) { + kDebug(5700) << "additionalName differs"; + return false; + } + + if ( d->mPrefix !=3D addressee.d->mPrefix && + !( d->mPrefix.isEmpty() && addressee.d->mPrefix.isEmpty() ) ) { + kDebug(5700) << "prefix differs"; + return false; + } + + if ( d->mSuffix !=3D addressee.d->mSuffix && + !( d->mSuffix.isEmpty() && addressee.d->mSuffix.isEmpty() ) ) { + kDebug(5700) << "suffix differs"; + return false; + } + + if ( d->mNickName !=3D addressee.d->mNickName && + !( d->mNickName.isEmpty() && addressee.d->mNickName.isEmpty() ) ) { + kDebug(5700) << "nickName differs"; + return false; + } + + if ( d->mBirthday !=3D addressee.d->mBirthday ) { + kDebug(5700) << "birthday differs"; + return false; + } + + if ( d->mMailer !=3D addressee.d->mMailer && + !( d->mMailer.isEmpty() && addressee.d->mMailer.isEmpty() ) ) { + kDebug(5700) << "mailer differs"; + return false; + } + + if ( d->mTimeZone !=3D addressee.d->mTimeZone ) { + kDebug(5700) << "timeZone differs"; + return false; + } + + if ( d->mGeo !=3D addressee.d->mGeo ) { + kDebug(5700) << "geo differs"; + return false; + } + + if ( d->mTitle !=3D addressee.d->mTitle && + !( d->mTitle.isEmpty() && addressee.d->mTitle.isEmpty() ) ) { + kDebug(5700) << "title differs"; + return false; + } + + if ( d->mRole !=3D addressee.d->mRole && + !( d->mRole.isEmpty() && addressee.d->mRole.isEmpty() ) ) { + kDebug(5700) << "role differs"; + return false; + } + + if ( d->mOrganization !=3D addressee.d->mOrganization && + !( d->mOrganization.isEmpty() && addressee.d->mOrganization.isEmpty()= ) ) { + kDebug(5700) << "organization differs"; + return false; + } + + if ( d->mDepartment !=3D addressee.d->mDepartment && + !( d->mDepartment.isEmpty() && addressee.d->mDepartment.isEmpty() ) )= { + kDebug(5700) << "department differs"; + return false; + } + + if ( d->mNote !=3D addressee.d->mNote && + !( d->mNote.isEmpty() && addressee.d->mNote.isEmpty() ) ) { + kDebug(5700) << "note differs"; + return false; + } + + if ( d->mProductId !=3D addressee.d->mProductId && + !( d->mProductId.isEmpty() && addressee.d->mProductId.isEmpty() ) ) { + kDebug(5700) << "productId differs"; + return false; + } + + if ( d->mSortString !=3D addressee.d->mSortString && + !( d->mSortString.isEmpty() && addressee.d->mSortString.isEmpty() ) )= { + kDebug(5700) << "sortString differs"; + return false; + } + + if ( d->mSecrecy !=3D addressee.d->mSecrecy ) { + kDebug(5700) << "secrecy differs"; + return false; + } + + if ( d->mLogo !=3D addressee.d->mLogo ) { + kDebug(5700) << "logo differs"; + return false; + } + + if ( d->mPhoto !=3D addressee.d->mPhoto ) { + kDebug(5700) << "photo differs"; + return false; + } + + if ( d->mSound !=3D addressee.d->mSound ) { + kDebug(5700) << "sound differs"; + return false; + } + + if ( ( d->mUrl.isValid() || addressee.d->mUrl.isValid() ) && + ( d->mUrl !=3D addressee.d->mUrl ) ) { + kDebug() << "url differs"; + return false; + } + + if ( !listEquals( d->mPhoneNumbers, addressee.d->mPhoneNumbers ) ) { + kDebug() << "phoneNumbers differs"; + return false; + } + + if ( !listEquals( d->mAddresses, addressee.d->mAddresses ) ) { + kDebug() << "addresses differs"; + return false; + } + + if ( !listEquals( d->mKeys, addressee.d->mKeys ) ) { + kDebug() << "keys differs"; + return false; + } + + if ( !emailsEquals( d->mEmails, addressee.d->mEmails ) ) { + kDebug() << "emails differs"; + return false; + } + + if ( !listEquals( d->mCategories, addressee.d->mCategories ) ) { + kDebug() << "categories differs"; + return false; + } + + if ( !listEquals( d->mCustom, addressee.d->mCustom ) ) { + kDebug() << "custom differs"; + return false; + } + + return true; +} + +bool Addressee::operator!=3D( const Addressee &a ) const +{ + return !( a =3D=3D *this ); +} + +bool Addressee::isEmpty() const +{ + return d->mEmpty; +} + +void Addressee::setUid( const QString &id ) +{ + if ( id =3D=3D d->mUid ) + return; + + d->mEmpty =3D false; + d->mUid =3D id; +} + +QString Addressee::uid() const +{ + return d->mUid; +} + +QString Addressee::uidLabel() +{ + return i18n( "Unique Identifier" ); +} + +void Addressee::setName( const QString &name ) +{ + if ( name =3D=3D d->mName ) + return; + + d->mEmpty =3D false; + d->mName =3D name; +} + +QString Addressee::name() const +{ + return d->mName; +} + +QString Addressee::nameLabel() +{ + return i18n( "Name" ); +} + + +void Addressee::setFormattedName( const QString &formattedName ) +{ + if ( formattedName =3D=3D d->mFormattedName ) + return; + + d->mEmpty =3D false; + d->mFormattedName =3D formattedName; +} + +QString Addressee::formattedName() const +{ + return d->mFormattedName; +} + +QString Addressee::formattedNameLabel() +{ + return i18n( "Formatted Name" ); +} + + +void Addressee::setFamilyName( const QString &familyName ) +{ + if ( familyName =3D=3D d->mFamilyName ) + return; + + d->mEmpty =3D false; + d->mFamilyName =3D familyName; +} + +QString Addressee::familyName() const +{ + return d->mFamilyName; +} + +QString Addressee::familyNameLabel() +{ + return i18n( "Family Name" ); +} + + +void Addressee::setGivenName( const QString &givenName ) +{ + if ( givenName =3D=3D d->mGivenName ) + return; + + d->mEmpty =3D false; + d->mGivenName =3D givenName; +} + +QString Addressee::givenName() const +{ + return d->mGivenName; +} + +QString Addressee::givenNameLabel() +{ + return i18n( "Given Name" ); +} + + +void Addressee::setAdditionalName( const QString &additionalName ) +{ + if ( additionalName =3D=3D d->mAdditionalName ) + return; + + d->mEmpty =3D false; + d->mAdditionalName =3D additionalName; +} + +QString Addressee::additionalName() const +{ + return d->mAdditionalName; +} + +QString Addressee::additionalNameLabel() +{ + return i18n( "Additional Names" ); +} + + +void Addressee::setPrefix( const QString &prefix ) +{ + if ( prefix =3D=3D d->mPrefix ) + return; + + d->mEmpty =3D false; + d->mPrefix =3D prefix; +} + +QString Addressee::prefix() const +{ + return d->mPrefix; +} + +QString Addressee::prefixLabel() +{ + return i18n( "Honorific Prefixes" ); +} + + +void Addressee::setSuffix( const QString &suffix ) +{ + if ( suffix =3D=3D d->mSuffix ) + return; + + d->mEmpty =3D false; + d->mSuffix =3D suffix; +} + +QString Addressee::suffix() const +{ + return d->mSuffix; +} + +QString Addressee::suffixLabel() +{ + return i18n( "Honorific Suffixes" ); +} + + +void Addressee::setNickName( const QString &nickName ) +{ + if ( nickName =3D=3D d->mNickName ) + return; + + d->mEmpty =3D false; + d->mNickName =3D nickName; +} + +QString Addressee::nickName() const +{ + return d->mNickName; +} + +QString Addressee::nickNameLabel() +{ + return i18n( "Nick Name" ); +} + + +void Addressee::setBirthday( const QDateTime &birthday ) +{ + if ( birthday =3D=3D d->mBirthday ) + return; + + d->mEmpty =3D false; + d->mBirthday =3D birthday; +} + +QDateTime Addressee::birthday() const +{ + return d->mBirthday; +} + +QString Addressee::birthdayLabel() +{ + return i18n( "Birthday" ); +} + + +QString Addressee::homeAddressStreetLabel() +{ + return i18n( "Home Address Street" ); +} + + +QString Addressee::homeAddressPostOfficeBoxLabel() +{ + return i18n( "Home Address Post Office Box" ); +} + + +QString Addressee::homeAddressLocalityLabel() +{ + return i18n( "Home Address City" ); +} + + +QString Addressee::homeAddressRegionLabel() +{ + return i18n( "Home Address State" ); +} + + +QString Addressee::homeAddressPostalCodeLabel() +{ + return i18n( "Home Address Zip Code" ); +} + + +QString Addressee::homeAddressCountryLabel() +{ + return i18n( "Home Address Country" ); +} + + +QString Addressee::homeAddressLabelLabel() +{ + return i18n( "Home Address Label" ); +} + + +QString Addressee::businessAddressStreetLabel() +{ + return i18n( "Business Address Street" ); +} + + +QString Addressee::businessAddressPostOfficeBoxLabel() +{ + return i18n( "Business Address Post Office Box" ); +} + + +QString Addressee::businessAddressLocalityLabel() +{ + return i18n( "Business Address City" ); +} + + +QString Addressee::businessAddressRegionLabel() +{ + return i18n( "Business Address State" ); +} + + +QString Addressee::businessAddressPostalCodeLabel() +{ + return i18n( "Business Address Zip Code" ); +} + + +QString Addressee::businessAddressCountryLabel() +{ + return i18n( "Business Address Country" ); +} + + +QString Addressee::businessAddressLabelLabel() +{ + return i18n( "Business Address Label" ); +} + + +QString Addressee::homePhoneLabel() +{ + return i18n( "Home Phone" ); +} + + +QString Addressee::businessPhoneLabel() +{ + return i18n( "Business Phone" ); +} + + +QString Addressee::mobilePhoneLabel() +{ + return i18n( "Mobile Phone" ); +} + + +QString Addressee::homeFaxLabel() +{ + return i18n( "Home Fax" ); +} + + +QString Addressee::businessFaxLabel() +{ + return i18n( "Business Fax" ); +} + + +QString Addressee::carPhoneLabel() +{ + return i18n( "Car Phone" ); +} + + +QString Addressee::isdnLabel() +{ + return i18n( "ISDN" ); +} + + +QString Addressee::pagerLabel() +{ + return i18n( "Pager" ); +} + + +QString Addressee::emailLabel() +{ + return i18n( "Email Address" ); +} + + +void Addressee::setMailer( const QString &mailer ) +{ + if ( mailer =3D=3D d->mMailer ) + return; + + d->mEmpty =3D false; + d->mMailer =3D mailer; +} + +QString Addressee::mailer() const +{ + return d->mMailer; +} + +QString Addressee::mailerLabel() +{ + return i18n( "Mail Client" ); +} + + +void Addressee::setTimeZone( const TimeZone &timeZone ) +{ + if ( timeZone =3D=3D d->mTimeZone ) + return; + + d->mEmpty =3D false; + d->mTimeZone =3D timeZone; +} + +TimeZone Addressee::timeZone() const +{ + return d->mTimeZone; +} + +QString Addressee::timeZoneLabel() +{ + return i18n( "Time Zone" ); +} + + +void Addressee::setGeo( const Geo &geo ) +{ + if ( geo =3D=3D d->mGeo ) + return; + + d->mEmpty =3D false; + d->mGeo =3D geo; +} + +Geo Addressee::geo() const +{ + return d->mGeo; +} + +QString Addressee::geoLabel() +{ + return i18n( "Geographic Position" ); +} + + +void Addressee::setTitle( const QString &title ) +{ + if ( title =3D=3D d->mTitle ) + return; + + d->mEmpty =3D false; + d->mTitle =3D title; +} + +QString Addressee::title() const +{ + return d->mTitle; +} + +QString Addressee::titleLabel() +{ + return i18nc( "a person's title", "Title" ); +} + + +void Addressee::setRole( const QString &role ) +{ + if ( role =3D=3D d->mRole ) + return; + + d->mEmpty =3D false; + d->mRole =3D role; +} + +QString Addressee::role() const +{ + return d->mRole; +} + +QString Addressee::roleLabel() +{ + return i18nc( "of a person in an organization", "Role" ); +} + + +void Addressee::setOrganization( const QString &organization ) +{ + if ( organization =3D=3D d->mOrganization ) + return; + + d->mEmpty =3D false; + d->mOrganization =3D organization; +} + +QString Addressee::organization() const +{ + return d->mOrganization; +} + +QString Addressee::organizationLabel() +{ + return i18n( "Organization" ); +} + + +void Addressee::setDepartment( const QString &department ) +{ + if ( department =3D=3D d->mDepartment ) + return; + + d->mEmpty =3D false; + d->mDepartment =3D department; +} + +QString Addressee::department() const +{ + return d->mDepartment; +} + +QString Addressee::departmentLabel() +{ + return i18n( "Department" ); +} + + +void Addressee::setNote( const QString ¬e ) +{ + if ( note =3D=3D d->mNote ) + return; + + d->mEmpty =3D false; + d->mNote =3D note; +} + +QString Addressee::note() const +{ + return d->mNote; +} + +QString Addressee::noteLabel() +{ + return i18n( "Note" ); +} + + +void Addressee::setProductId( const QString &productId ) +{ + if ( productId =3D=3D d->mProductId ) + return; + + d->mEmpty =3D false; + d->mProductId =3D productId; +} + +QString Addressee::productId() const +{ + return d->mProductId; +} + +QString Addressee::productIdLabel() +{ + return i18n( "Product Identifier" ); +} + + +void Addressee::setRevision( const QDateTime &revision ) +{ + if ( revision =3D=3D d->mRevision ) + return; + + d->mEmpty =3D false; + d->mRevision =3D revision; +} + +QDateTime Addressee::revision() const +{ + return d->mRevision; +} + +QString Addressee::revisionLabel() +{ + return i18n( "Revision Date" ); +} + + +void Addressee::setSortString( const QString &sortString ) +{ + if ( sortString =3D=3D d->mSortString ) + return; + + d->mEmpty =3D false; + d->mSortString =3D sortString; +} + +QString Addressee::sortString() const +{ + return d->mSortString; +} + +QString Addressee::sortStringLabel() +{ + return i18n( "Sort String" ); +} + + +void Addressee::setUrl( const KUrl &url ) +{ + if ( url =3D=3D d->mUrl ) + return; + + d->mEmpty =3D false; + d->mUrl =3D url; +} + +KUrl Addressee::url() const +{ + return d->mUrl; +} + +QString Addressee::urlLabel() +{ + return i18n( "Homepage" ); +} + + +void Addressee::setSecrecy( const Secrecy &secrecy ) +{ + if ( secrecy =3D=3D d->mSecrecy ) + return; + + d->mEmpty =3D false; + d->mSecrecy =3D secrecy; +} + +Secrecy Addressee::secrecy() const +{ + return d->mSecrecy; +} + +QString Addressee::secrecyLabel() +{ + return i18n( "Security Class" ); +} + + +void Addressee::setLogo( const Picture &logo ) +{ + if ( logo =3D=3D d->mLogo ) + return; + + d->mEmpty =3D false; + d->mLogo =3D logo; +} + +Picture Addressee::logo() const +{ + return d->mLogo; +} + +QString Addressee::logoLabel() +{ + return i18n( "Logo" ); +} + + +void Addressee::setPhoto( const Picture &photo ) +{ + if ( photo =3D=3D d->mPhoto ) + return; + + d->mEmpty =3D false; + d->mPhoto =3D photo; +} + +Picture Addressee::photo() const +{ + return d->mPhoto; +} + +QString Addressee::photoLabel() +{ + return i18n( "Photo" ); +} + + +void Addressee::setSound( const Sound &sound ) +{ + if ( sound =3D=3D d->mSound ) + return; + + d->mEmpty =3D false; + d->mSound =3D sound; +} + +Sound Addressee::sound() const +{ + return d->mSound; +} + +QString Addressee::soundLabel() +{ + return i18n( "Sound" ); +} + + +void Addressee::setNameFromString( const QString &s ) +{ + QString str =3D s; + //remove enclosing quotes from string + if ( str.length() > 1 && + s[ 0 ] =3D=3D QLatin1Char( '"' ) && + s[ s.length() - 1 ] =3D=3D QLatin1Char( '"' ) ) { + str =3D s.mid( 1, s.length() - 2 ); + } + + setFormattedName( str ); + setName( str ); + + // clear all name parts + setPrefix( QString() ); + setGivenName( QString() ); + setAdditionalName( QString() ); + setFamilyName( QString() ); + setSuffix( QString() ); + + if ( str.isEmpty() ) + return; + + static QString spaceStr =3D QString::fromLatin1( " " ); + static QString emptyStr =3D QString::fromLatin1( "" ); + AddresseeHelper *helper =3D AddresseeHelper::self(); + + int i =3D str.indexOf( QLatin1Char( ',' ) ); + if ( i < 0 ) { + QStringList parts =3D str.split( spaceStr ); + int leftOffset =3D 0; + int rightOffset =3D parts.count() - 1; + + QString suffix; + while ( rightOffset >=3D 0 ) { + if ( helper->containsSuffix( parts[ rightOffset ] ) ) { + suffix.prepend( parts[ rightOffset ] + ( suffix.isEmpty() ? emptyS= tr : spaceStr ) ); + rightOffset--; + } else + break; + } + setSuffix( suffix ); + + if ( rightOffset < 0 ) + return; + + if ( rightOffset - 1 >=3D 0 && helper->containsPrefix( parts[ rightOff= set - 1 ].toLower() ) ) { + setFamilyName( parts[ rightOffset - 1 ] + spaceStr + parts[ rightOff= set ] ); + rightOffset--; + } else { + if ( helper->tradeAsFamilyName() ) + setFamilyName( parts[ rightOffset ] ); + else + setGivenName( parts[ rightOffset ] ); + } + + QString prefix; + while ( leftOffset < rightOffset ) { + if ( helper->containsTitle( parts[ leftOffset ] ) ) { + prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr ) + parts[= leftOffset ] ); + leftOffset++; + } else + break; + } + setPrefix( prefix ); + + if ( leftOffset < rightOffset ) { + setGivenName( parts[ leftOffset ] ); + leftOffset++; + } + + QString additionalName; + while ( leftOffset < rightOffset ) { + additionalName.append( ( additionalName.isEmpty() ? emptyStr : space= Str ) + parts[ leftOffset ] ); + leftOffset++; + } + setAdditionalName( additionalName ); + } else { + QString part1 =3D str.left( i ); + QString part2 =3D str.mid( i + 1 ); + + QStringList parts =3D part1.split( spaceStr ); + int leftOffset =3D 0; + int rightOffset =3D parts.count() - 1; + + if ( parts.count() > 0 ) { + + QString suffix; + while ( rightOffset >=3D 0 ) { + if ( helper->containsSuffix( parts[ rightOffset ] ) ) { + suffix.prepend( parts[ rightOffset ] + ( suffix.isEmpty() ? empt= yStr : spaceStr ) ); + rightOffset--; + } else + break; + } + setSuffix( suffix ); + + if ( rightOffset - 1 >=3D 0 && helper->containsPrefix( parts[ rightO= ffset - 1 ].toLower() ) ) { + setFamilyName( parts[ rightOffset - 1 ] + spaceStr + parts[ rightO= ffset ] ); + rightOffset--; + } else + setFamilyName( parts[ rightOffset ] ); + + QString prefix; + while ( leftOffset < rightOffset ) { + if ( helper->containsTitle( parts[ leftOffset ] ) ) { + prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr ) + part= s[ leftOffset ] ); + leftOffset++; + } else + break; + } + } else { + setPrefix( QString() ); + setFamilyName( QString() ); + setSuffix( QString() ); + } + + parts =3D part2.split( spaceStr ); + + leftOffset =3D 0; + rightOffset =3D parts.count(); + + if ( parts.count() > 0 ) { + + QString prefix; + while ( leftOffset < rightOffset ) { + if ( helper->containsTitle( parts[ leftOffset ] ) ) { + prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr ) + part= s[ leftOffset ] ); + leftOffset++; + } else + break; + } + setPrefix( prefix ); + + if ( leftOffset < rightOffset ) { + setGivenName( parts[ leftOffset ] ); + leftOffset++; + } + + QString additionalName; + while ( leftOffset < rightOffset ) { + additionalName.append( ( additionalName.isEmpty() ? emptyStr : spa= ceStr ) + parts[ leftOffset ] ); + leftOffset++; + } + setAdditionalName( additionalName ); + } else { + setGivenName( QString() ); + setAdditionalName( QString() ); + } + } +} + +QString Addressee::realName() const +{ + QString n( formattedName() ); + if ( !n.isEmpty() ) + return n; + + n =3D assembledName(); + if ( !n.isEmpty() ) + return n; + + n =3D name(); + if ( !n.isEmpty() ) + return n; + + return organization(); +} + +QString Addressee::assembledName() const +{ + const QString name =3D prefix() + QLatin1Char( ' ' ) + + givenName() + QLatin1Char( ' ' ) + + additionalName() + QLatin1Char( ' ' ) + + familyName() + QLatin1Char( ' ' ) + + suffix(); + + return name.simplified(); +} + +QString Addressee::fullEmail( const QString &email ) const +{ + QString e; + if ( email.isNull() ) { + e =3D preferredEmail(); + } else { + e =3D email; + } + if ( e.isEmpty() ) return QString(); + + QString text; + if ( realName().isEmpty() ) + text =3D e; + else { + QRegExp needQuotes( QLatin1String( "[^ 0-9A-Za-z\\x0080-\\xFFFF]" ) ); + if ( realName().indexOf( needQuotes ) !=3D -1 ) { + QString name =3D realName(); + name.replace( QLatin1String( "\"" ), QLatin1String( "\\\"" ) ); + text =3D QLatin1String( "\"" ) + name + QLatin1String( "\" <" ) + e = + QLatin1Char( '>' ); + } else + text =3D realName() + QLatin1String( " <" ) + e + QLatin1Char( '>' ); + } + + return text; +} + +void Addressee::insertEmail( const QString &email, bool preferred ) +{ + if ( email.simplified().isEmpty() ) + return; + + if ( d->mEmails.contains( email ) ) { + if ( !preferred || d->mEmails.first() =3D=3D email ) + return; + + d->mEmails.removeAll( email ); + d->mEmails.prepend( email ); + } else { + d->mEmpty =3D false; + if ( preferred ) { + d->mEmails.prepend( email ); + } else { + d->mEmails.append( email ); + } + } +} + +void Addressee::removeEmail( const QString &email ) +{ + if ( d->mEmails.contains( email ) ) { + d->mEmails.removeAll( email ); + } +} + +QString Addressee::preferredEmail() const +{ + if ( d->mEmails.count() =3D=3D 0 ) + return QString(); + else + return d->mEmails.first(); +} + +QStringList Addressee::emails() const +{ + return d->mEmails; +} + +void Addressee::setEmails( const QStringList& emails ) +{ + d->mEmails =3D emails; +} +void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber ) +{ + d->mEmpty =3D false; + + PhoneNumber::List::Iterator it; + for ( it =3D d->mPhoneNumbers.begin(); it !=3D d->mPhoneNumbers.end(); += +it ) { + if ( ( *it ).id() =3D=3D phoneNumber.id() ) { + *it =3D phoneNumber; + return; + } + } + if ( !phoneNumber.number().simplified().isEmpty() ) + d->mPhoneNumbers.append( phoneNumber ); +} + +void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber ) +{ + PhoneNumber::List::Iterator it; + for ( it =3D d->mPhoneNumbers.begin(); it !=3D d->mPhoneNumbers.end(); += +it ) { + if ( ( *it ).id() =3D=3D phoneNumber.id() ) { + d->mPhoneNumbers.erase( it ); + return; + } + } +} + +PhoneNumber Addressee::phoneNumber( PhoneNumber::Type type ) const +{ + PhoneNumber phoneNumber( QString(), type ); + PhoneNumber::List::ConstIterator it; + for ( it =3D d->mPhoneNumbers.constBegin(); it !=3D d->mPhoneNumbers.con= stEnd(); ++it ) { + if ( matchBinaryPattern( ( *it ).type(), type ) ) { + if ( ( *it ).type() & PhoneNumber::Pref ) { + return ( *it ); + } else if ( phoneNumber.number().isEmpty() ) { + phoneNumber =3D ( *it ); + } + } + } + + return phoneNumber; +} + +PhoneNumber::List Addressee::phoneNumbers() const +{ + return d->mPhoneNumbers; +} + +PhoneNumber::List Addressee::phoneNumbers( PhoneNumber::Type type ) const +{ + PhoneNumber::List list; + + PhoneNumber::List::ConstIterator it; + PhoneNumber::List::ConstIterator end( d->mPhoneNumbers.constEnd() ); + for ( it =3D d->mPhoneNumbers.constBegin(); it !=3D end; ++it ) { + if ( matchBinaryPattern( ( *it ).type(), type ) ) { + list.append( *it ); + } + } + return list; +} + +PhoneNumber Addressee::findPhoneNumber( const QString &id ) const +{ + PhoneNumber::List::ConstIterator it; + PhoneNumber::List::ConstIterator end( d->mPhoneNumbers.constEnd() ); + for ( it =3D d->mPhoneNumbers.constBegin(); it !=3D end; ++it ) { + if ( ( *it ).id() =3D=3D id ) { + return *it; + } + } + return PhoneNumber(); +} + +void Addressee::insertKey( const Key &key ) +{ + d->mEmpty =3D false; + + Key::List::Iterator it; + for ( it =3D d->mKeys.begin(); it !=3D d->mKeys.end(); ++it ) { + if ( ( *it ).id() =3D=3D key.id() ) { + *it =3D key; + return; + } + } + d->mKeys.append( key ); +} + +void Addressee::removeKey( const Key &key ) +{ + Key::List::Iterator it; + for ( it =3D d->mKeys.begin(); it !=3D d->mKeys.end(); ++it ) { + if ( ( *it ).id() =3D=3D key.id() ) { + d->mKeys.removeAll( key ); + return; + } + } +} + +Key Addressee::key( Key::Type type, QString customTypeString ) const +{ + Key::List::ConstIterator it; + Key::List::ConstIterator end( d->mKeys.constEnd() ); + for ( it =3D d->mKeys.constBegin(); it !=3D end; ++it ) { + if ( ( *it ).type() =3D=3D type ) { + if ( type =3D=3D Key::Custom ) { + if ( customTypeString.isEmpty() ) { + return *it; + } else { + if ( ( *it ).customTypeString() =3D=3D customTypeString ) + return ( *it ); + } + } else { + return *it; + } + } + } + return Key( QString(), type ); +} + +void Addressee::setKeys( const Key::List& list ) +{ + d->mKeys =3D list; +} + +Key::List Addressee::keys() const +{ + return d->mKeys; +} + +Key::List Addressee::keys( Key::Type type, QString customTypeString ) const +{ + Key::List list; + + Key::List::ConstIterator it; + Key::List::ConstIterator end( d->mKeys.constEnd() ); + for ( it =3D d->mKeys.constBegin(); it !=3D end; ++it ) { + if ( ( *it ).type() =3D=3D type ) { + if ( type =3D=3D Key::Custom ) { + if ( customTypeString.isEmpty() ) { + list.append( *it ); + } else { + if ( ( *it ).customTypeString() =3D=3D customTypeString ) + list.append( *it ); + } + } else { + list.append( *it ); + } + } + } + return list; +} + +Key Addressee::findKey( const QString &id ) const +{ + Key::List::ConstIterator it; + Key::List::ConstIterator end( d->mKeys.constEnd() ); + for ( it =3D d->mKeys.constBegin(); it !=3D end; ++it ) { + if ( ( *it ).id() =3D=3D id ) { + return *it; + } + } + return Key(); +} + +QString Addressee::toString() const +{ + QString str; + + str +=3D QLatin1String( "Addressee {\n" ); + str +=3D QString::fromLatin1( " Uid: %1\n" ).arg( uid() ); + + str +=3D QString::fromLatin1( " Name: %1\n" ).arg( name() ); + str +=3D QString::fromLatin1( " FormattedName: %1\n" ).arg( formattedNa= me() ); + str +=3D QString::fromLatin1( " FamilyName: %1\n" ).arg( familyName() ); + str +=3D QString::fromLatin1( " GivenName: %1\n" ).arg( givenName() ); + str +=3D QString::fromLatin1( " AdditionalName: %1\n" ).arg( additional= Name() ); + str +=3D QString::fromLatin1( " Prefix: %1\n" ).arg( prefix() ); + str +=3D QString::fromLatin1( " Suffix: %1\n" ).arg( suffix() ); + str +=3D QString::fromLatin1( " NickName: %1\n" ).arg( nickName() ); + str +=3D QString::fromLatin1( " Birthday: %1\n" ).arg( birthday().toStr= ing() ); + str +=3D QString::fromLatin1( " Mailer: %1\n" ).arg( mailer() ); + str +=3D QString::fromLatin1( " TimeZone: %1\n" ).arg( timeZone().toStr= ing() ); + str +=3D QString::fromLatin1( " Geo: %1\n" ).arg( geo().toString() ); + str +=3D QString::fromLatin1( " Title: %1\n" ).arg( title() ); + str +=3D QString::fromLatin1( " Role: %1\n" ).arg( role() ); + str +=3D QString::fromLatin1( " Organization: %1\n" ).arg( organization= () ); + str +=3D QString::fromLatin1( " Department: %1\n" ).arg( department() ); + str +=3D QString::fromLatin1( " Note: %1\n" ).arg( note() ); + str +=3D QString::fromLatin1( " ProductId: %1\n" ).arg( productId() ); + str +=3D QString::fromLatin1( " Revision: %1\n" ).arg( revision().toStr= ing() ); + str +=3D QString::fromLatin1( " SortString: %1\n" ).arg( sortString() ); + str +=3D QString::fromLatin1( " Url: %1\n" ).arg( url().url() ); + str +=3D QString::fromLatin1( " Secrecy: %1\n" ).arg( secrecy().toStrin= g() ); + str +=3D QString::fromLatin1( " Logo: %1\n" ).arg( logo().toString() ); + str +=3D QString::fromLatin1( " Photo: %1\n" ).arg( photo().toString() = ); + str +=3D QString::fromLatin1( " Sound: %1\n" ).arg( sound().toString() = ); + + str +=3D QLatin1String( " Emails {\n" ); + const QStringList e =3D emails(); + QStringList::ConstIterator it; + for ( it =3D e.begin(); it !=3D e.end(); ++it ) { + str +=3D QString::fromLatin1( " %1\n" ).arg( *it ); + } + str +=3D QLatin1String( " }\n" ); + + str +=3D QLatin1String( " PhoneNumbers {\n" ); + const PhoneNumber::List p =3D phoneNumbers(); + PhoneNumber::List::ConstIterator it2; + for ( it2 =3D p.begin(); it2 !=3D p.end(); ++it2 ) { + str +=3D ( *it2 ).toString(); + } + str +=3D QLatin1String( " }\n" ); + + str +=3D QLatin1String( " Addresses {\n" ); + const Address::List a =3D addresses(); + Address::List::ConstIterator it3; + for ( it3 =3D a.begin(); it3 !=3D a.end(); ++it3 ) { + str +=3D ( *it3 ).toString(); + } + str +=3D QLatin1String( " }\n" ); + + str +=3D QLatin1String( " Keys {\n" ); + const Key::List k =3D keys(); + Key::List::ConstIterator it4; + for ( it4 =3D k.begin(); it4 !=3D k.end(); ++it4 ) { + str +=3D ( *it4 ).toString(); + } + str +=3D QLatin1String( " }\n" ); + + str +=3D QLatin1String( "}\n" ); + + return str; +} + + +void Addressee::insertAddress( const Address &address ) +{ + if ( address.isEmpty() ) + return; + + d->mEmpty =3D false; + + Address::List::Iterator it; + for ( it =3D d->mAddresses.begin(); it !=3D d->mAddresses.end(); ++it ) { + if ( ( *it ).id() =3D=3D address.id() ) { + *it =3D address; + return; + } + } + + d->mAddresses.append( address ); +} + +void Addressee::removeAddress( const Address &address ) +{ + Address::List::Iterator it; + for ( it =3D d->mAddresses.begin(); it !=3D d->mAddresses.end(); ++it ) { + if ( ( *it ).id() =3D=3D address.id() ) { + d->mAddresses.erase( it ); + return; + } + } +} + +Address Addressee::address( Address::Type type ) const +{ + Address address( type ); + Address::List::ConstIterator it; + Address::List::ConstIterator end( d->mAddresses.constEnd() ); + for ( it =3D d->mAddresses.constBegin(); it !=3D end; ++it ) { + if ( matchBinaryPattern( ( *it ).type(), type ) ) { + if ( ( *it ).type() & Address::Pref ) { + return ( *it ); + } else if ( address.isEmpty() ) { + address =3D ( *it ); + } + } + } + + return address; +} + +Address::List Addressee::addresses() const +{ + return d->mAddresses; +} + +Address::List Addressee::addresses( Address::Type type ) const +{ + Address::List list; + + Address::List::ConstIterator it; + Address::List::ConstIterator end( d->mAddresses.constEnd() ); + for ( it =3D d->mAddresses.constBegin(); it !=3D end; ++it ) { + if ( matchBinaryPattern( ( *it ).type(), type ) ) { + list.append( *it ); + } + } + + return list; +} + +Address Addressee::findAddress( const QString &id ) const +{ + Address::List::ConstIterator it; + Address::List::ConstIterator end( d->mAddresses.constEnd() ); + for ( it =3D d->mAddresses.constBegin(); it !=3D end; ++it ) { + if ( ( *it ).id() =3D=3D id ) { + return *it; + } + } + return Address(); +} + +void Addressee::insertCategory( const QString &c ) +{ + d->mEmpty =3D false; + + if ( d->mCategories.contains( c ) ) + return; + + d->mCategories.append( c ); +} + +void Addressee::removeCategory( const QString &category ) +{ + if ( d->mCategories.contains( category ) ) { + d->mCategories.removeAll( category ); + } +} + +bool Addressee::hasCategory( const QString &category ) const +{ + return d->mCategories.contains( category ); +} + +void Addressee::setCategories( const QStringList &c ) +{ + d->mEmpty =3D false; + + d->mCategories =3D c; +} + +QStringList Addressee::categories() const +{ + return d->mCategories; +} + +void Addressee::insertCustom( const QString &app, const QString &name, + const QString &value ) +{ + if ( value.isEmpty() || name.isEmpty() || app.isEmpty() ) { + return; + } + + d->mEmpty =3D false; + + QString qualifiedName =3D app + QLatin1Char( '-' ) + name + QLatin1Char(= ':' ); + + QStringList::Iterator it; + QStringList::Iterator end( d->mCustom.end() ); + for ( it =3D d->mCustom.begin(); it !=3D end; ++it ) { + if ( ( *it ).startsWith( qualifiedName ) ) { + ( *it ) =3D qualifiedName + value; + return; + } + } + + d->mCustom.append( qualifiedName + value ); +} + +void Addressee::removeCustom( const QString &app, const QString &name ) +{ + const QString qualifiedName =3D app + QLatin1Char( '-' ) + name + QLatin= 1Char( ':' ); + + QStringList::Iterator it; + for ( it =3D d->mCustom.begin(); it !=3D d->mCustom.end(); ++it ) { + if ( ( *it ).startsWith( qualifiedName ) ) { + d->mCustom.erase( it ); + return; + } + } +} + +QString Addressee::custom( const QString &app, const QString &name ) const +{ + QString qualifiedName =3D app + QLatin1Char( '-' ) + name + QLatin1Char(= ':' ); + QString value; + + QStringList::ConstIterator it; + QStringList::ConstIterator end( d->mCustom.constEnd() ); + for ( it =3D d->mCustom.constBegin(); it !=3D end; ++it ) { + if ( ( *it ).startsWith( qualifiedName ) ) { + value =3D ( *it ).mid( ( *it ).indexOf( QLatin1Char( ':' ) ) + 1 ); + break; + } + } + + return value; +} + +void Addressee::setCustoms( const QStringList &l ) +{ + d->mEmpty =3D false; + d->mCustom =3D l; +} + +QStringList Addressee::customs() const +{ + return d->mCustom; +} + +void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullN= ame, + QString &email ) +{ + // This is a simplified version of KPIM::splitAddress(). + + fullName.clear(); + email.clear(); + if ( rawEmail.isEmpty() ) + return; // KPIM::AddressEmpty; + + // The code works on 8-bit strings, so convert the input to UTF-8. + QByteArray address =3D rawEmail.toUtf8(); + + QByteArray displayName; + QByteArray addrSpec; + QByteArray comment; + + // The following is a primitive parser for a mailbox-list (cf. RFC 2822). + // The purpose is to extract a displayable string from the mailboxes. + // Comments in the addr-spec are not handled. No error checking is done. + + enum { TopLevel, InComment, InAngleAddress } context =3D TopLevel; + bool inQuotedString =3D false; + int commentLevel =3D 0; + bool stop =3D false; + + for ( char* p =3D address.data(); *p && !stop; ++p ) { + switch ( context ) { + case TopLevel : { + switch ( *p ) { + case '"' : inQuotedString =3D !inQuotedString; + displayName +=3D *p; + break; + case '(' : if ( !inQuotedString ) { + context =3D InComment; + commentLevel =3D 1; + } + else + displayName +=3D *p; + break; + case '<' : if ( !inQuotedString ) { + context =3D InAngleAddress; + } + else + displayName +=3D *p; + break; + case '\\' : // quoted character + displayName +=3D *p; + ++p; // skip the '\' + if ( *p ) + displayName +=3D *p; + else + //return KPIM::UnexpectedEnd; + goto ABORT_PARSING; + break; + case ',' : if ( !inQuotedString ) { + //if ( allowMultipleAddresses ) + // stop =3D true; + //else + // return KPIM::UnexpectedComma; + goto ABORT_PARSING; + } + else + displayName +=3D *p; + break; + default : displayName +=3D *p; + } + break; + } + case InComment : { + switch ( *p ) { + case '(' : ++commentLevel; + comment +=3D *p; + break; + case ')' : --commentLevel; + if ( commentLevel =3D=3D 0 ) { + context =3D TopLevel; + comment +=3D ' '; // separate the text of several comme= nts + } + else + comment +=3D *p; + break; + case '\\' : // quoted character + comment +=3D *p; + ++p; // skip the '\' + if ( *p ) + comment +=3D *p; + else + //return KPIM::UnexpectedEnd; + goto ABORT_PARSING; + break; + default : comment +=3D *p; + } + break; + } + case InAngleAddress : { + switch ( *p ) { + case '"' : inQuotedString =3D !inQuotedString; + addrSpec +=3D *p; + break; + case '>' : if ( !inQuotedString ) { + context =3D TopLevel; + } + else + addrSpec +=3D *p; + break; + case '\\' : // quoted character + addrSpec +=3D *p; + ++p; // skip the '\' + if ( *p ) + addrSpec +=3D *p; + else + //return KPIM::UnexpectedEnd; + goto ABORT_PARSING; + break; + default : addrSpec +=3D *p; + } + break; + } + } // switch ( context ) + } + +ABORT_PARSING: + displayName =3D displayName.trimmed(); + comment =3D comment.trimmed(); + addrSpec =3D addrSpec.trimmed(); + + fullName =3D QString::fromUtf8( displayName ); + email =3D QString::fromUtf8( addrSpec ); + + // check for errors + if ( inQuotedString ) + return; // KPIM::UnbalancedQuote; + if ( context =3D=3D InComment ) + return; // KPIM::UnbalancedParens; + if ( context =3D=3D InAngleAddress ) + return; // KPIM::UnclosedAngleAddr; + + if ( addrSpec.isEmpty() ) { + if ( displayName.isEmpty() ) + return; // KPIM::NoAddressSpec; + else { + //addrSpec =3D displayName; + //displayName.truncate( 0 ); + // Address of the form "foo@bar" or "foo@bar (Name)". + email =3D fullName; + fullName =3D QString::fromUtf8( comment ); + } + } + + email =3D email.toLower(); + // Check that we do not have any extra characters on the end of the + // strings + unsigned int len =3D fullName.length(); + if ( fullName[ 0 ] =3D=3D QLatin1Char( '"' ) && fullName[ len - 1 ] =3D= =3D QLatin1Char( '"' ) ) { + fullName =3D fullName.mid( 1, len - 2 ); + } +} + +#ifndef KDEPIM_NO_KRESOURCES +void Addressee::setResource( Resource *resource ) +{ + d->mResource =3D resource; +} + +Resource *Addressee::resource() const +{ + return d->mResource; +} +#endif + +void Addressee::setChanged( bool value ) +{ + d->mChanged =3D value; +} + +bool Addressee::changed() const +{ + return d->mChanged; +} + +void Addressee::setSortMode( KABC::SortMode *mode ) +{ + Private::mSortMode =3D mode; +} + +bool Addressee::operator< ( const Addressee &addr ) const +{ + if ( !Private::mSortMode ) + return false; + else + return Private::mSortMode->lesser( *this, addr ); +} + +QString Addressee::mimeType() +{ + return QLatin1String( "text/directory" ); +} + +QDataStream &KABC::operator<<( QDataStream &s, const Addressee &a ) +{ + s << a.d->mUid; + + s << a.d->mName; + s << a.d->mFormattedName; + s << a.d->mFamilyName; + s << a.d->mGivenName; + s << a.d->mAdditionalName; + s << a.d->mPrefix; + s << a.d->mSuffix; + s << a.d->mNickName; + s << a.d->mBirthday; + s << a.d->mMailer; + s << a.d->mTimeZone; + s << a.d->mGeo; + s << a.d->mTitle; + s << a.d->mRole; + s << a.d->mOrganization; + s << a.d->mDepartment; + s << a.d->mNote; + s << a.d->mProductId; + s << a.d->mRevision; + s << a.d->mSortString; + s << a.d->mUrl; + s << a.d->mSecrecy; + s << a.d->mLogo; + s << a.d->mPhoto; + s << a.d->mSound; + s << a.d->mPhoneNumbers; + s << a.d->mAddresses; + s << a.d->mEmails; + s << a.d->mCategories; + s << a.d->mCustom; + s << a.d->mKeys; + return s; +} + +QDataStream &KABC::operator>>( QDataStream &s, Addressee &a ) +{ + s >> a.d->mUid; + + s >> a.d->mName; + s >> a.d->mFormattedName; + s >> a.d->mFamilyName; + s >> a.d->mGivenName; + s >> a.d->mAdditionalName; + s >> a.d->mPrefix; + s >> a.d->mSuffix; + s >> a.d->mNickName; + s >> a.d->mBirthday; + s >> a.d->mMailer; + s >> a.d->mTimeZone; + s >> a.d->mGeo; + s >> a.d->mTitle; + s >> a.d->mRole; + s >> a.d->mOrganization; + s >> a.d->mDepartment; + s >> a.d->mNote; + s >> a.d->mProductId; + s >> a.d->mRevision; + s >> a.d->mSortString; + s >> a.d->mUrl; + s >> a.d->mSecrecy; + s >> a.d->mLogo; + s >> a.d->mPhoto; + s >> a.d->mSound; + s >> a.d->mPhoneNumbers; + s >> a.d->mAddresses; + s >> a.d->mEmails; + s >> a.d->mCategories; + s >> a.d->mCustom; + s >> a.d->mKeys; + + a.d->mEmpty =3D false; + + return s; +} + +bool matchBinaryPattern( int value, int pattern ) +{ + /** + We want to match all telephonnumbers/addresses which have the bits in = the + pattern set. More are allowed. + if pattern =3D=3D 0 we have a special handling, then we want only thos= e with + exactly no bit set. + */ + if ( pattern =3D=3D 0 ) + return ( value =3D=3D 0 ); + else + return ( pattern =3D=3D ( pattern & value ) ); +} + +template +bool listEquals( const QList &list, const QList &pattern ) +{ + if ( list.count() !=3D pattern.count() ) + return false; + const int numberOfElement( list.count() ); + for ( int i =3D 0; i < numberOfElement; ++i ) { + if ( !pattern.contains( list[ i ] ) ) { + return false; + } + } + + return true; +} + +bool listEquals( const QStringList &list, const QStringList &pattern ) +{ + if ( list.count() !=3D pattern.count() ) + return false; + + const int numberOfElement( list.count() ); + for ( int i =3D 0; i < numberOfElement; ++i ) { + if ( !pattern.contains( list[ i ] ) ) { + return false; + } + } + + return true; +} + +bool emailsEquals( const QStringList &list, const QStringList &pattern ) +{ + if ( list.count() !=3D pattern.count() ) + return false; + + if ( list.isEmpty() ) + return true; + + if ( list.first() !=3D pattern.first() ) + return false; + + QStringList::ConstIterator it; + QStringList::ConstIterator end( list.constEnd() ); + for ( it =3D list.constBegin(); it !=3D end; ++it ) { + if ( !pattern.contains( *it ) ) { + return false; + } + } + + return true; +} diff --git a/kabc/addressee.h b/kabc/addressee.h new file mode 100644 index 0000000..b184bc1 --- /dev/null +++ b/kabc/addressee.h @@ -0,0 +1,992 @@ +/* + This file is part of libkabc. + Copyright (c) 2001 Cornelius Schumacher + 2013 Tobias Koenig + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public Lice= nse + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef KABC_ADDRESSEE_H +#define KABC_ADDRESSEE_H + +#include +#include +#include + +#include + +#include "kabc/address.h" +#include "kabc/geo.h" +#include "kabc/key.h" +#include "kabc/phonenumber.h" +#include "kabc/picture.h" +#include "kabc/secrecy.h" +#include "kabc/sound.h" +#include "kabc/timezone.h" +#include "kabc/addresseelist.h" // for typedef QList List; + +namespace KABC { + +#ifndef KDEPIM_NO_KRESOURCES +class Resource; +#endif +class SortMode; + +/** + @short address book entry + + This class represents an entry in the address book. + + The data of this class is implicitly shared. You can pass this class by = value. + + If you need the name of a field for presenting it to the user you should= use + the functions ending in Label(). They return a translated string which c= an be + used as label for the corresponding field. + + About the name fields: + + givenName() is the first name and familyName() the last name. In some + countries the family name comes first, that's the reason for the + naming. formattedName() is the full name with the correct formatting. + It is used as an override, when the correct formatting can't be generated + from the other name fields automatically. + + realName() returns a fully formatted name(). It uses formattedName, if s= et, + otherwise it constucts the name from the name fields. As fallback, if + nothing else is set it uses name(). + + name() is the NAME type of RFC2426. It can be used as internal name for = the + data enty, but shouldn't be used for displaying the data to the user. + */ +class KABC_EXPORT Addressee +{ + friend KABC_EXPORT QDataStream &operator<<( QDataStream &, const Address= ee & ); + friend KABC_EXPORT QDataStream &operator>>( QDataStream &, Addressee & ); + + public: + /** + A list of addressee objects + */ + typedef AddresseeList List; + /** + A map from unique identifier to addressee. + + @see uid() + */ + typedef QMap Map; + + /** + Construct an empty address book entry. + */ + Addressee(); + + /** + Destroys the address book entry. + */ + ~Addressee(); + + /** + Copy constructor. + */ + Addressee( const Addressee & ); + + /** + Assignment operator. + + @return a reference to @c this + */ + Addressee &operator=3D( const Addressee & ); + + /** + Equality operator. + + @return @c true if @c this and the given addressee are equal, + otherwise @c false + */ + bool operator=3D=3D( const Addressee & ) const; + + /** + Not-equal operator. + + @return @c true if @c this and the given addressee are not equal, + otherwise @c false + */ + bool operator!=3D( const Addressee & ) const; + + /** + Return, if the address book entry is empty. + */ + bool isEmpty() const; + + /** + Set unique identifier. + + @param uid the KABC unique identifier + */ + void setUid( const QString &uid ); + + /** + Return unique identifier. + */ + QString uid() const; + + /** + Return translated label for uid field. + */ + static QString uidLabel(); + + /** + Set name. + */ + void setName( const QString &name ); + + /** + Return name. + */ + QString name() const; + + /** + Return translated label for name field. + */ + static QString nameLabel(); + + /** + Set formatted name. + */ + void setFormattedName( const QString &formattedName ); + + /** + Return formatted name. + */ + QString formattedName() const; + + /** + Return translated label for formattedName field. + */ + static QString formattedNameLabel(); + + /** + Set family name. + */ + void setFamilyName( const QString &familyName ); + + /** + Return family name. + */ + QString familyName() const; + + /** + Return translated label for familyName field. + */ + static QString familyNameLabel(); + + /** + Set given name. + */ + void setGivenName( const QString &givenName ); + + /** + Return given name. + */ + QString givenName() const; + + /** + Return translated label for givenName field. + */ + static QString givenNameLabel(); + + /** + Set additional names. + */ + void setAdditionalName( const QString &additionalName ); + + /** + Return additional names. + */ + QString additionalName() const; + + /** + Return translated label for additionalName field. + */ + static QString additionalNameLabel(); + + /** + Set honorific prefixes. + */ + void setPrefix( const QString &prefix ); + + /** + Return honorific prefixes. + */ + QString prefix() const; + + /** + Return translated label for prefix field. + */ + static QString prefixLabel(); + + /** + Set honorific suffixes. + */ + void setSuffix( const QString &suffix ); + + /** + Return honorific suffixes. + */ + QString suffix() const; + + /** + Return translated label for suffix field. + */ + static QString suffixLabel(); + + /** + Set nick name. + */ + void setNickName( const QString &nickName ); + + /** + Return nick name. + */ + QString nickName() const; + + /** + Return translated label for nickName field. + */ + static QString nickNameLabel(); + + /** + Set birthday. + */ + void setBirthday( const QDateTime &birthday ); + + /** + Return birthday. + */ + QDateTime birthday() const; + + /** + Return translated label for birthday field. + */ + static QString birthdayLabel(); + + /** + Return translated label for homeAddressStreet field. + */ + static QString homeAddressStreetLabel(); + + /** + Return translated label for homeAddressPostOfficeBox field. + */ + static QString homeAddressPostOfficeBoxLabel(); + + /** + Return translated label for homeAddressLocality field. + */ + static QString homeAddressLocalityLabel(); + + /** + Return translated label for homeAddressRegion field. + */ + static QString homeAddressRegionLabel(); + + /** + Return translated label for homeAddressPostalCode field. + */ + static QString homeAddressPostalCodeLabel(); + + /** + Return translated label for homeAddressCountry field. + */ + static QString homeAddressCountryLabel(); + + /** + Return translated label for homeAddressLabel field. + */ + static QString homeAddressLabelLabel(); + + /** + Return translated label for businessAddressStreet field. + */ + static QString businessAddressStreetLabel(); + + /** + Return translated label for businessAddressPostOfficeBox field. + */ + static QString businessAddressPostOfficeBoxLabel(); + + /** + Return translated label for businessAddressLocality field. + */ + static QString businessAddressLocalityLabel(); + + /** + Return translated label for businessAddressRegion field. + */ + static QString businessAddressRegionLabel(); + + /** + Return translated label for businessAddressPostalCode field. + */ + static QString businessAddressPostalCodeLabel(); + + /** + Return translated label for businessAddressCountry field. + */ + static QString businessAddressCountryLabel(); + + /** + Return translated label for businessAddressLabel field. + */ + static QString businessAddressLabelLabel(); + + /** + Return translated label for homePhone field. + */ + static QString homePhoneLabel(); + + /** + Return translated label for businessPhone field. + */ + static QString businessPhoneLabel(); + + /** + Return translated label for mobilePhone field. + */ + static QString mobilePhoneLabel(); + + /** + Return translated label for homeFax field. + */ + static QString homeFaxLabel(); + + /** + Return translated label for businessFax field. + */ + static QString businessFaxLabel(); + + /** + Return translated label for carPhone field. + */ + static QString carPhoneLabel(); + + /** + Return translated label for isdn field. + */ + static QString isdnLabel(); + + /** + Return translated label for pager field. + */ + static QString pagerLabel(); + + /** + Return translated label for email field. + */ + static QString emailLabel(); + + /** + Set mail client. + */ + void setMailer( const QString &mailer ); + + /** + Return mail client. + */ + QString mailer() const; + + /** + Return translated label for mailer field. + */ + static QString mailerLabel(); + + /** + Set time zone. + */ + void setTimeZone( const TimeZone &timeZone ); + + /** + Return time zone. + */ + TimeZone timeZone() const; + + /** + Return translated label for timeZone field. + */ + static QString timeZoneLabel(); + + /** + Set geographic position. + */ + void setGeo( const Geo &geo ); + + /** + Return geographic position. + */ + Geo geo() const; + + /** + Return translated label for geo field. + */ + static QString geoLabel(); + + /** + Set title. + */ + void setTitle( const QString &title ); + + /** + Return title. + */ + QString title() const; + + /** + Return translated label for title field. + */ + static QString titleLabel(); + + /** + Set role. + */ + void setRole( const QString &role ); + + /** + Return role. + */ + QString role() const; + + /** + Return translated label for role field. + */ + static QString roleLabel(); + + /** + Set organization. + */ + void setOrganization( const QString &organization ); + + /** + Return organization. + */ + QString organization() const; + + /** + Return translated label for organization field. + */ + static QString organizationLabel(); + + /** + Set department. + */ + void setDepartment( const QString &department ); + + /** + Return department. + */ + QString department() const; + + /** + Return translated label for department field. + */ + static QString departmentLabel(); + + /** + Set note. + */ + void setNote( const QString ¬e ); + + /** + Return note. + */ + QString note() const; + + /** + Return translated label for note field. + */ + static QString noteLabel(); + + /** + Set product identifier. + */ + void setProductId( const QString &productId ); + + /** + Return product identifier. + */ + QString productId() const; + + /** + Return translated label for productId field. + */ + static QString productIdLabel(); + + /** + Set revision date. + */ + void setRevision( const QDateTime &revision ); + + /** + Return revision date. + */ + QDateTime revision() const; + + /** + Return translated label for revision field. + */ + static QString revisionLabel(); + + /** + Set sort string. + */ + void setSortString( const QString &sortString ); + + /** + Return sort string. + */ + QString sortString() const; + + /** + Return translated label for sortString field. + */ + static QString sortStringLabel(); + + /** + Set homepage. + */ + void setUrl( const KUrl &url ); + + /** + Return homepage. + */ + KUrl url() const; + + /** + Return translated label for url field. + */ + static QString urlLabel(); + + /** + Set security class. + */ + void setSecrecy( const Secrecy &secrecy ); + + /** + Return security class. + */ + Secrecy secrecy() const; + + /** + Return translated label for secrecy field. + */ + static QString secrecyLabel(); + + /** + Set logo. + */ + void setLogo( const Picture &logo ); + + /** + Return logo. + */ + Picture logo() const; + + /** + Return translated label for logo field. + */ + static QString logoLabel(); + + /** + Set photo. + */ + void setPhoto( const Picture &photo ); + + /** + Return photo. + */ + Picture photo() const; + + /** + Return translated label for photo field. + */ + static QString photoLabel(); + + /** + Set sound. + */ + void setSound( const Sound &sound ); + + /** + Return sound. + */ + Sound sound() const; + + /** + Return translated label for sound field. + */ + static QString soundLabel(); + + /** + Set name fields by parsing the given string and trying to associate = the + parts of the string with according fields. This function should prob= ably + be a bit more clever. + */ + void setNameFromString( const QString & ); + + /** + Return the name of the addressee. This is calculated from all the na= me + fields. + */ + QString realName() const; + + /** + Return the name that consists of all name parts. + */ + QString assembledName() const; + + /** + Return email address including real name. + + @param email Email address to be used to construct the full email st= ring. + If this is QString() the preferred email address is use= d. + */ + QString fullEmail( const QString &email=3DQString() ) const; + + /** + Insert an email address. If the email address already exists in this + addressee it is not duplicated. + + @param email Email address + @param preferred Set to true, if this is the preferred email address= of + the addressee. + */ + void insertEmail( const QString &email, bool preferred=3Dfalse ); + + /** + Remove email address. If the email address doesn't exist, nothing ha= ppens. + + @param email Email address to remove + */ + void removeEmail( const QString &email ); + + /** + Return preferred email address. This is the first email address or t= he + last one added with insertEmail() with a set preferred parameter. + */ + QString preferredEmail() const; + + /** + Return list of all email addresses. + */ + QStringList emails() const; + + /** + Set the emails to @p list. + The first email address gets the preferred one! + @param list The list of email addresses. + */ + void setEmails( const QStringList& list); + + /** + Insert a phone number. If a phone number with the same id already ex= ists + in this addressee it is not duplicated. + + @param phoneNumber The telephone number to insert to the addressee + */ + void insertPhoneNumber( const PhoneNumber &phoneNumber ); + + /** + Remove phone number. If no phone number with the given id exists for= this + addresse nothing happens. + + @param phoneNumber The telephone number to remove from the addressee + */ + void removePhoneNumber( const PhoneNumber &phoneNumber ); + + /** + Return phone number, which matches the given type. + + @param type The type of phone number to get + */ + PhoneNumber phoneNumber( PhoneNumber::Type type ) const; + + /** + Return list of all phone numbers. + */ + PhoneNumber::List phoneNumbers() const; + + /** + Return list of phone numbers with a special type. + + @param type The type of phone number to get + */ + PhoneNumber::List phoneNumbers( PhoneNumber::Type type ) const; + + /** + Return phone number with the given id. + + @param id The identifier of the phone number to look for. + See PhoneNumber::id() + */ + PhoneNumber findPhoneNumber( const QString &id ) const; + + /** + Insert a key. If a key with the same id already exists + in this addressee it is not duplicated. + + @param key The key to insert + */ + void insertKey( const Key &key ); + + /** + Remove a key. If no key with the given id exists for this + addresse nothing happens. + + @param key The key to remove + */ + void removeKey( const Key &key ); + + /** + Return key, which matches the given type. + If @p type =3D=3D Key::Custom you can specify a string + that should match. If you leave the string empty, the first + key with a custom value is returned. + + @param type The type of key to look for + @param customTypeString A string to match custom keys against when + @p type is @c Key::Custom + */ + Key key( Key::Type type, QString customTypeString =3D QString() ) cons= t; + + /** + Return list of all keys. + */ + Key::List keys() const; + + /** + Set the list of keys + @param keys The keys to be set. + */ + void setKeys( const Key::List& keys); + + /** + Return list of keys with a special type. + If @p type =3D=3D Key::Custom you can specify a string + that should match. If you leave the string empty, all custom + keys will be returned. + + @param type The type of key to look for + @param customTypeString A string to match custom keys against when + @p type is @c Key::Custom + */ + Key::List keys( Key::Type type, QString customTypeString =3D QString()= ) const; + + /** + Return key with the given id. + + @param id The identifier of the key to look for. See Key::id() + */ + Key findKey( const QString &id ) const; + + /** + Insert an address. If an address with the same id already exists + in this addressee it is not duplicated. + + @param address The address to insert + */ + void insertAddress( const Address &address ); + + /** + Remove address. If no address with the given id exists for this + addresse nothing happens. + + @param address The address to remove + */ + void removeAddress( const Address &address ); + + /** + Return address, which matches the given type. + + @param type The type of address to look for + */ + Address address( Address::Type type ) const; + + /** + Return list of all addresses. + */ + Address::List addresses() const; + + /** + Return list of addresses with a special type. + + @param type The type of addresses to look for + */ + Address::List addresses( Address::Type type ) const; + + /** + Return address with the given id. + + @param id The identifier of the address to look for. See Address::id= () + */ + Address findAddress( const QString &id ) const; + + /** + Insert category. If the category already exists it is not duplicated. + */ + void insertCategory( const QString & ); + + /** + Remove category. + */ + void removeCategory( const QString & ); + + /** + Return, if addressee has the given category. + */ + bool hasCategory( const QString & ) const; + + /** + Set categories to given value. + */ + void setCategories( const QStringList & ); + + /** + Return list of all set categories. + */ + QStringList categories() const; + + /** + Insert custom entry. The entry is identified by the name of the inse= rting + application and a unique name. If an entry with the given app and na= me + already exists its value is replaced with the new given value. + + An empty value isn't allowed (nothing happens if this is called with + any of the three arguments being empty) + + @param app Name of the application inserting this custom entry + @param name Name of this application specific custom entry + @param value Value of this application specific custom entry + */ + void insertCustom( const QString &app, const QString &name, + const QString &value ); + + /** + Remove custom entry. + + @param app Name of the application which has inserted this custom en= try + @param name Name of this application specific custom entry + */ + void removeCustom( const QString &app, const QString &name ); + + /** + Return value of custom entry, identified by app and entry name. + + @param app Name of the application which has inserted this custom en= try + @param name Name of this application specific custom entry + */ + QString custom( const QString &app, const QString &name ) const; + + /** + Set all custom entries. + */ + void setCustoms( const QStringList & ); + + /** + Return list of all custom entries. + */ + QStringList customs() const; + + /** + Parse full email address. The result is given back in fullName and e= mail. + + @param rawEmail The input string to parse for name and email + @param fullName The name part of the @p rawEmail input, if it contai= ned one + @param email The email part of the @p rawEmail input, if it containe= d one + */ + static void parseEmailAddress( const QString &rawEmail, QString &fullN= ame, + QString &email ); + + /** + Returns string representation of the addressee. + */ + QString toString() const; + +#ifndef KDEPIM_NO_KRESOURCES + /** + Set resource where the addressee is from. + + @param resource The Resource the addressee is from + */ + void setResource( Resource *resource ); + + /** + Return pointer to resource. + */ + Resource *resource() const; +#endif + + /** + Mark addressee as changed. + + @param value Sets the status indicating changed data + */ + void setChanged( bool value ); + + /** + Return whether the addressee is changed. + */ + bool changed() const; + + /** + Sets the sort mode implementation. + + Comparing to addressee objects is delegated to an instance + of a subclass of KABC::SortMode. + + @param mode The sort mode implementator to use + */ + static void setSortMode( KABC::SortMode *mode ); + + /** + Return whether this addressee is "less-than" a given one + + @param addr The addressee object to compare with + + @see setSortMode() + */ + bool operator< ( const Addressee &addr ) const; + + /** + Returns the MIME type used for Addressees + */ + static QString mimeType(); + + private: + class Private; + QSharedDataPointer d; +}; +#ifdef MAKE_KABC_LIB +KDE_DUMMY_QHASH_FUNCTION( Addressee ) +#endif + +KABC_EXPORT QDataStream &operator<<( QDataStream &, const Addressee & ); +KABC_EXPORT QDataStream &operator>>( QDataStream &, Addressee & ); + +} + +#define KABC_ADDRESSEE_METATYPE_DEFINED 1 +Q_DECLARE_METATYPE( KABC::Addressee ) + +#endif diff --git a/kabc/field.cpp b/kabc/field.cpp new file mode 100644 index 0000000..42e8c46 --- /dev/null +++ b/kabc/field.cpp @@ -0,0 +1,632 @@ +/* + This file is part of libkabc. + Copyright (c) 2002 Cornelius Schumacher + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public Lice= nse + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include +#include +#include +#include +#include + +#include "field.h" + +using namespace KABC; + +class Field::Private +{ + public: + Private( int fieldId, int category =3D 0, + const QString &label =3D QString(), + const QString &key =3D QString(), + const QString &app =3D QString() ) + : mFieldId( fieldId ), mCategory( category ), mLabel( label ), + mKey( key ), mApp( app ) {} + + enum FieldId + { + CustomField, + FormattedName, + FamilyName, + GivenName, + AdditionalName, + Prefix, + Suffix, + NickName, + Birthday, + HomeAddressStreet, + HomeAddressPostOfficeBox, + HomeAddressLocality, + HomeAddressRegion, + HomeAddressPostalCode, + HomeAddressCountry, + HomeAddressLabel, + BusinessAddressStreet, + BusinessAddressPostOfficeBox, + BusinessAddressLocality, + BusinessAddressRegion, + BusinessAddressPostalCode, + BusinessAddressCountry, + BusinessAddressLabel, + HomePhone, + BusinessPhone, + MobilePhone, + HomeFax, + BusinessFax, + CarPhone, + Isdn, + Pager, + Email, + Mailer, + Title, + Role, + Organization, + Department, + Note, + Url + }; + + int fieldId() { return mFieldId; } + int category() { return mCategory; } + + QString label() { return mLabel; } + QString key() { return mKey; } + QString app() { return mApp; } + + static Field::List mAllFields; + static Field::List mDefaultFields; + static Field::List mCustomFields; + + private: + int mFieldId; + int mCategory; + + QString mLabel; + QString mKey; + QString mApp; +}; + +Field::List Field::Private::mAllFields; +Field::List Field::Private::mDefaultFields; +Field::List Field::Private::mCustomFields; + +Field::Field( Private *p ) + : d( p ) +{ +} + +Field::~Field() +{ + delete d; +} + +QString Field::label() +{ + switch ( d->fieldId() ) { + case Private::FormattedName: + return Addressee::formattedNameLabel(); + case Private::FamilyName: + return Addressee::familyNameLabel(); + case Private::GivenName: + return Addressee::givenNameLabel(); + case Private::AdditionalName: + return Addressee::additionalNameLabel(); + case Private::Prefix: + return Addressee::prefixLabel(); + case Private::Suffix: + return Addressee::suffixLabel(); + case Private::NickName: + return Addressee::nickNameLabel(); + case Private::Birthday: + return Addressee::birthdayLabel(); + case Private::HomeAddressStreet: + return Addressee::homeAddressStreetLabel(); + case Private::HomeAddressPostOfficeBox: + return Addressee::homeAddressPostOfficeBoxLabel(); + case Private::HomeAddressLocality: + return Addressee::homeAddressLocalityLabel(); + case Private::HomeAddressRegion: + return Addressee::homeAddressRegionLabel(); + case Private::HomeAddressPostalCode: + return Addressee::homeAddressPostalCodeLabel(); + case Private::HomeAddressCountry: + return Addressee::homeAddressCountryLabel(); + case Private::HomeAddressLabel: + return Addressee::homeAddressLabelLabel(); + case Private::BusinessAddressStreet: + return Addressee::businessAddressStreetLabel(); + case Private::BusinessAddressPostOfficeBox: + return Addressee::businessAddressPostOfficeBoxLabel(); + case Private::BusinessAddressLocality: + return Addressee::businessAddressLocalityLabel(); + case Private::BusinessAddressRegion: + return Addressee::businessAddressRegionLabel(); + case Private::BusinessAddressPostalCode: + return Addressee::businessAddressPostalCodeLabel(); + case Private::BusinessAddressCountry: + return Addressee::businessAddressCountryLabel(); + case Private::BusinessAddressLabel: + return Addressee::businessAddressLabelLabel(); + case Private::HomePhone: + return Addressee::homePhoneLabel(); + case Private::BusinessPhone: + return Addressee::businessPhoneLabel(); + case Private::MobilePhone: + return Addressee::mobilePhoneLabel(); + case Private::HomeFax: + return Addressee::homeFaxLabel(); + case Private::BusinessFax: + return Addressee::businessFaxLabel(); + case Private::CarPhone: + return Addressee::carPhoneLabel(); + case Private::Isdn: + return Addressee::isdnLabel(); + case Private::Pager: + return Addressee::pagerLabel(); + case Private::Email: + return Addressee::emailLabel(); + case Private::Mailer: + return Addressee::mailerLabel(); + case Private::Title: + return Addressee::titleLabel(); + case Private::Role: + return Addressee::roleLabel(); + case Private::Organization: + return Addressee::organizationLabel(); + case Private::Department: + return Addressee::departmentLabel(); + case Private::Note: + return Addressee::noteLabel(); + case Private::Url: + return Addressee::urlLabel(); + case Private::CustomField: + return d->label(); + default: + return i18n( "Unknown Field" ); + } +} + +int Field::category() +{ + return d->category(); +} + +QString Field::categoryLabel( int category ) +{ + switch ( category ) { + case All: + return i18n( "All" ); + case Frequent: + return i18n( "Frequent" ); + case Address: + return i18nc( "street/postal","Address" ); + case Email: + return i18n( "Email" ); + case Personal: + return i18n( "Personal" ); + case Organization: + return i18n( "Organization" ); + case CustomCategory: + return i18n( "Custom" ); + default: + return i18n( "Undefined" ); + } +} + +QString Field::value( const KABC::Addressee &a ) +{ + switch ( d->fieldId() ) { + case Private::FormattedName: + return a.formattedName(); + case Private::FamilyName: + return a.familyName(); + case Private::GivenName: + return a.givenName(); + case Private::AdditionalName: + return a.additionalName(); + case Private::Prefix: + return a.prefix(); + case Private::Suffix: + return a.suffix(); + case Private::NickName: + return a.nickName(); + case Private::Mailer: + return a.mailer(); + case Private::Title: + return a.title(); + case Private::Role: + return a.role(); + case Private::Organization: + return a.organization(); + case Private::Department: + return a.department(); + case Private::Note: + return a.note(); + case Private::Email: + return a.preferredEmail(); + case Private::Birthday: + if ( a.birthday().isValid() ) + return a.birthday().date().toString( Qt::ISODate ); + else + return QString(); + case Private::Url: + return a.url().prettyUrl(); + case Private::HomePhone: + { + PhoneNumber::List::ConstIterator it; + + { + // check for preferred number + const PhoneNumber::List list =3D a.phoneNumbers( PhoneNumber::Home= | PhoneNumber::Pref ); + for ( it =3D list.begin(); it !=3D list.end(); ++it ) { + if ( ( ( *it ).type() & ~( PhoneNumber::Pref ) ) =3D=3D PhoneNum= ber::Home ) { + return ( *it ).number(); + } + } + } + + { + // check for normal home number + const PhoneNumber::List list =3D a.phoneNumbers( PhoneNumber::Home= ); + for ( it =3D list.begin(); it !=3D list.end(); ++it ) { + if ( ( ( *it ).type() & ~(PhoneNumber::Pref) ) =3D=3D PhoneNumbe= r::Home ) { + return ( *it ).number(); + } + } + } + + return QString(); + } + case Private::BusinessPhone: + { + PhoneNumber::List::ConstIterator it; + + { + // check for preferred number + const PhoneNumber::List list =3D a.phoneNumbers( PhoneNumber::Work= | PhoneNumber::Pref ); + for ( it =3D list.begin(); it !=3D list.end(); ++it ) { + if ( ( ( *it ).type() & ~(PhoneNumber::Pref) ) =3D=3D PhoneNumbe= r::Work ) { + return ( *it ).number(); + } + } + } + + { + // check for normal work number + const PhoneNumber::List list =3D a.phoneNumbers( PhoneNumber::Work= ); + for ( it =3D list.begin(); it !=3D list.end(); ++it ) { + if ( ( ( *it ).type() & ~(PhoneNumber::Pref) ) =3D=3D PhoneNumbe= r::Work ) { + return ( *it ).number(); + } + } + } + + return QString(); + } + case Private::MobilePhone: + return a.phoneNumber( PhoneNumber::Cell ).number(); + case Private::HomeFax: + return a.phoneNumber( PhoneNumber::Home | PhoneNumber::Fax ).number(= ); + case Private::BusinessFax: + return a.phoneNumber( PhoneNumber::Work | PhoneNumber::Fax ).number(= ); + case Private::CarPhone: + return a.phoneNumber( PhoneNumber::Car ).number(); + case Private::Isdn: + return a.phoneNumber( PhoneNumber::Isdn ).number(); + case Private::Pager: + return a.phoneNumber( PhoneNumber::Pager ).number(); + case Private::HomeAddressStreet: + return a.address( Address::Home ).street(); + case Private::HomeAddressPostOfficeBox: + return a.address( Address::Home ).postOfficeBox(); + case Private::HomeAddressLocality: + return a.address( Address::Home ).locality(); + case Private::HomeAddressRegion: + return a.address( Address::Home ).region(); + case Private::HomeAddressPostalCode: + return a.address( Address::Home ).postalCode(); + case Private::HomeAddressCountry: + return a.address( Address::Home ).country(); + case Private::BusinessAddressStreet: + return a.address( Address::Work ).street(); + case Private::BusinessAddressPostOfficeBox: + return a.address( Address::Work ).postOfficeBox(); + case Private::BusinessAddressLocality: + return a.address( Address::Work ).locality(); + case Private::BusinessAddressRegion: + return a.address( Address::Work ).region(); + case Private::BusinessAddressPostalCode: + return a.address( Address::Work ).postalCode(); + case Private::BusinessAddressCountry: + return a.address( Address::Work ).country(); + case Private::CustomField: + return a.custom( d->app(), d->key() ); + default: + return QString(); + } +} + +bool Field::setValue( KABC::Addressee &a, const QString &value ) +{ + switch ( d->fieldId() ) { + case Private::FormattedName: + a.setFormattedName( value ); + return true; + case Private::FamilyName: + a.setFamilyName( value ); + return true; + case Private::GivenName: + a.setGivenName( value ); + return true; + case Private::AdditionalName: + a.setAdditionalName( value ); + return true; + case Private::Prefix: + a.setPrefix( value ); + return true; + case Private::Suffix: + a.setSuffix( value ); + return true; + case Private::NickName: + a.setNickName( value ); + return true; + case Private::Mailer: + a.setMailer( value ); + return true; + case Private::Title: + a.setTitle( value ); + return true; + case Private::Role: + a.setRole( value ); + return true; + case Private::Organization: + a.setOrganization( value ); + return true; + case Private::Department: + a.setDepartment( value ); + return true; + case Private::Note: + a.setNote( value ); + return true; + case Private::Birthday: + a.setBirthday( QDateTime::fromString( value, Qt::ISODate ) ); + return true; + case Private::CustomField: + a.insertCustom( d->app(), d->key(), value ); + return true; + default: + return false; + } +} + +QString Field::sortKey( const KABC::Addressee &a ) +{ + switch ( d->fieldId() ) { + case Private::FormattedName: + return a.formattedName(); + case Private::FamilyName: + return a.familyName(); + case Private::GivenName: + return a.givenName(); + case Private::AdditionalName: + return a.additionalName(); + case Private::Prefix: + return a.prefix(); + case Private::Suffix: + return a.suffix(); + case Private::NickName: + return a.nickName(); + case Private::Mailer: + return a.mailer(); + case Private::Title: + return a.title(); + case Private::Role: + return a.role(); + case Private::Organization: + return a.organization(); + case Private::Department: + return a.department(); + case Private::Note: + return a.note(); + case Private::Birthday: + if ( a.birthday().isValid() ) { + QDate date =3D a.birthday().date(); + QString key; + key.sprintf( "%02d-%02d", date.month(), date.day() ); + return key; + } else + return QLatin1String( "00-00" ); + default: + return value( a ).toLower(); + } +} + +bool Field::isCustom() +{ + return d->fieldId() =3D=3D Private::CustomField; +} + +Field::List Field::allFields() +{ + if ( Private::mAllFields.isEmpty() ) { + createField( Private::FormattedName, Frequent ); + createField( Private::FamilyName, Frequent ); + createField( Private::GivenName, Frequent ); + createField( Private::AdditionalName ); + createField( Private::Prefix ); + createField( Private::Suffix ); + createField( Private::NickName, Personal ); + createField( Private::Birthday, Personal ); + createField( Private::HomeAddressStreet, Address|Personal ); + createField( Private::HomeAddressPostOfficeBox, Address|Personal ); + createField( Private::HomeAddressLocality, Address|Personal ); + createField( Private::HomeAddressRegion, Address|Personal ); + createField( Private::HomeAddressPostalCode, Address|Personal ); + createField( Private::HomeAddressCountry, Address|Personal ); + createField( Private::HomeAddressLabel, Address|Personal ); + createField( Private::BusinessAddressStreet, Address|Organization ); + createField( Private::BusinessAddressPostOfficeBox, Address|Organizati= on ); + createField( Private::BusinessAddressLocality, Address|Organization ); + createField( Private::BusinessAddressRegion, Address|Organization ); + createField( Private::BusinessAddressPostalCode, Address|Organization = ); + createField( Private::BusinessAddressCountry, Address|Organization ); + createField( Private::BusinessAddressLabel, Address|Organization ); + createField( Private::HomePhone, Personal|Frequent ); + createField( Private::BusinessPhone, Organization|Frequent ); + createField( Private::MobilePhone, Frequent ); + createField( Private::HomeFax ); + createField( Private::BusinessFax ); + createField( Private::CarPhone ); + createField( Private::Isdn ); + createField( Private::Pager ); + createField( Private::Email, Email|Frequent ); + createField( Private::Mailer, Email ); + createField( Private::Title, Organization ); + createField( Private::Role, Organization ); + createField( Private::Organization, Organization ); + createField( Private::Department, Organization ); + createField( Private::Note ); + createField( Private::Url ); + } + + return Private::mAllFields; +} + +Field::List Field::defaultFields() +{ + if ( Private::mDefaultFields.isEmpty() ) { + createDefaultField( Private::FormattedName ); + createDefaultField( Private::Email ); + } + + return Private::mDefaultFields; +} + +void Field::createField( int id, int category ) +{ + Private::mAllFields.append( new Field( new Private( id, category ) ) ); +} + +void Field::createDefaultField( int id, int category ) +{ + Private::mDefaultFields.append( new Field( new Private( id, category ) )= ); +} + +void Field::deleteFields() +{ + Field::List::ConstIterator it; + + for ( it =3D Private::mAllFields.constBegin(); it !=3D Private::mAllFiel= ds.constEnd(); ++it ) { + delete ( *it ); + } + Private::mAllFields.clear(); + + for ( it =3D Private::mDefaultFields.constBegin(); it !=3D Private::mDef= aultFields.constEnd(); ++it ) { + delete ( *it ); + } + Private::mDefaultFields.clear(); + + for ( it =3D Private::mCustomFields.constBegin(); it !=3D Private::mCust= omFields.constEnd(); ++it ) { + delete ( *it ); + } + Private::mCustomFields.clear(); +} + +void Field::saveFields( const QString &identifier, + const Field::List &fields ) +{ + KConfigGroup cg( KGlobal::config(), "KABCFields" ); + + saveFields( cg, identifier, fields ); +} + +void Field::saveFields( KConfigGroup &cfg, const QString &identifier, + const Field::List &fields ) +{ + QList fieldIds; + + int custom =3D 0; + Field::List::ConstIterator it; + for ( it =3D fields.begin(); it !=3D fields.end(); ++it ) { + fieldIds.append( ( *it )->d->fieldId() ); + if ( ( *it )->isCustom() ) { + QStringList customEntry; + customEntry << ( *it )->d->label(); + customEntry << ( *it )->d->key(); + customEntry << ( *it )->d->app(); + cfg.writeEntry( QLatin1String( "KABC_CustomEntry_" ) + identifier + = QLatin1Char( '_' ) + + QString::number( custom++ ), customEntry ); + } + } + + cfg.writeEntry( identifier, fieldIds ); +} + +Field::List Field::restoreFields( const QString &identifier ) +{ + KConfigGroup cg( KGlobal::config(), "KABCFields" ); + + return restoreFields( cg, identifier ); +} + +Field::List Field::restoreFields( const KConfigGroup &cfg, const QString &= identifier ) +{ + const QList fieldIds =3D cfg.readEntry( identifier,QList() ); + + Field::List fields; + + int custom =3D 0; + QList::ConstIterator it; + for ( it =3D fieldIds.begin(); it !=3D fieldIds.end(); ++it ) { + Private *f =3D 0; + if ( ( *it ) =3D=3D Private::CustomField ) { + QStringList customEntry =3D cfg.readEntry( QLatin1String( "KABC_Cust= omEntry_" ) + + identifier + QLatin1Char( '= _' ) + + QString::number( custom++ )= ,QStringList() ); + f =3D new Private( *it, CustomCategory, customEntry[ 0 ], + customEntry[ 1 ], customEntry[ 2 ] ); + } else { + f =3D new Private( *it ); + } + fields.append( new Field( f ) ); + } + + return fields; +} + +bool Field::equals( Field *field ) +{ + bool sameId =3D ( d->fieldId() =3D=3D field->d->fieldId() ); + + if ( !sameId ) return false; + + if ( d->fieldId() !=3D Private::CustomField ) return true; + + return d->key() =3D=3D field->d->key(); +} + +Field *Field::createCustomField( const QString &label, int category, + const QString &key, const QString &app ) +{ + Field *field =3D new Field( new Private( Private::CustomField, + category | CustomCategory, + label, key, app ) ); + Private::mCustomFields.append( field ); + + return field; +} diff --git a/kabc/scripts/addressee.src.cpp b/kabc/scripts/addressee.src.cpp deleted file mode 100644 index 99c0eb1..0000000 --- a/kabc/scripts/addressee.src.cpp +++ /dev/null @@ -1,1136 +0,0 @@ -/* - This file is part of libkabc. - Copyright (c) 2001 Cornelius Schumacher - Copyright (c) 2003 Carsten Pfeiffer - Copyright (c) 2005 Ingo Kloecker - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public Lice= nse - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#include -#include -#include - -#include -#include -#include -#include - -#include "addresseehelper.h" -#include "field.h" -#ifndef KDEPIM_NO_KRESOURCES -#include "resource.h" -#endif -#include "sortmode.h" - -#include "addressee.h" - -using namespace KABC; - -static bool matchBinaryPattern( int value, int pattern ); - -template -static bool listEquals( const QList&, const QList& ); -static bool listEquals( const QStringList&, const QStringList& ); -static bool emailsEquals( const QStringList&, const QStringList& ); - -class Addressee::Private : public QSharedData -{ - public: - Private() - : mUid( KRandom::randomString( 10 ) ), -#ifndef KDEPIM_NO_KRESOURCES - mResource( 0 ), -#endif - mEmpty( true ), mChanged( false ) - { - } - - Private( const Private &other ) - : QSharedData( other ) -#ifndef KDEPIM_NO_KRESOURCES - ,mResource( 0 ) -#endif - { - mUid =3D other.mUid; - --VARIABLES_ASSIGNMENT-- - - mPhoneNumbers =3D other.mPhoneNumbers; - mAddresses =3D other.mAddresses; - mKeys =3D other.mKeys; - mEmails =3D other.mEmails; - mCategories =3D other.mCategories; - mCustom =3D other.mCustom; - -#ifndef KDEPIM_NO_KRESOURCES - mResource =3D other.mResource; -#endif - mEmpty =3D other.mEmpty; - mChanged =3D other.mChanged; - } - - ~Private() - { - } - - QString mUid; - --VARIABLES-- - - PhoneNumber::List mPhoneNumbers; - Address::List mAddresses; - Key::List mKeys; - QStringList mEmails; - QStringList mCategories; - QStringList mCustom; - -#ifndef KDEPIM_NO_KRESOURCES - Resource *mResource; -#endif - - bool mEmpty :1; - bool mChanged :1; - - static KABC::SortMode *mSortMode; -}; - -KABC::SortMode *Addressee::Private::mSortMode =3D 0; - -Addressee::Addressee() - : d( new Private ) -{ -} - -Addressee::~Addressee() -{ -} - -Addressee::Addressee( const Addressee &other ) - : d( other.d ) -{ -} - -Addressee& Addressee::operator=3D( const Addressee &other ) -{ - if ( this !=3D &other ) - d =3D other.d; - - return *this; -} - -bool Addressee::operator=3D=3D( const Addressee &a ) const -{ - if ( d->mUid !=3D a.d->mUid ) { - kDebug() << "uid differs"; - return false; - } - --EQUALSTEST-- - if ( ( d->mUrl.isValid() || a.d->mUrl.isValid() ) && - ( d->mUrl !=3D a.d->mUrl ) ) { - kDebug() << "url differs"; - return false; - } - if ( !listEquals( d->mPhoneNumbers, a.d->mPhoneNumbers ) ) { - kDebug() << "phoneNumbers differs"; - return false; - } - if ( !listEquals( d->mAddresses, a.d->mAddresses ) ) { - kDebug() << "addresses differs"; - return false; - } - if ( !listEquals( d->mKeys, a.d->mKeys ) ) { - kDebug() << "keys differs"; - return false; - } - if ( !emailsEquals( d->mEmails, a.d->mEmails ) ) { - kDebug() << "emails differs"; - return false; - } - if ( !listEquals( d->mCategories, a.d->mCategories ) ) { - kDebug() << "categories differs"; - return false; - } - if ( !listEquals( d->mCustom, a.d->mCustom ) ) { - kDebug() << "custom differs"; - return false; - } - - return true; -} - -bool Addressee::operator!=3D( const Addressee &a ) const -{ - return !( a =3D=3D *this ); -} - -bool Addressee::isEmpty() const -{ - return d->mEmpty; -} - -void Addressee::setUid( const QString &id ) -{ - if ( id =3D=3D d->mUid ) return; - d->mEmpty =3D false; - d->mUid =3D id; -} - -QString Addressee::uid() const -{ - return d->mUid; -} - -QString Addressee::uidLabel() -{ - return i18n( "Unique Identifier" ); -} - ---DEFINITIONS-- - -void Addressee::setNameFromString( const QString &s ) -{ - QString str =3D s; - //remove enclosing quotes from string - if ( str.length() > 1 && - s[ 0 ] =3D=3D QLatin1Char( '"' ) && - s[ s.length() - 1 ] =3D=3D QLatin1Char( '"' ) ) { - str =3D s.mid( 1, s.length() - 2 ); - } - - setFormattedName( str ); - setName( str ); - - // clear all name parts - setPrefix( QString() ); - setGivenName( QString() ); - setAdditionalName( QString() ); - setFamilyName( QString() ); - setSuffix( QString() ); - - if ( str.isEmpty() ) - return; - - static QString spaceStr =3D QString::fromLatin1( " " ); - static QString emptyStr =3D QString::fromLatin1( "" ); - AddresseeHelper *helper =3D AddresseeHelper::self(); - - int i =3D str.indexOf( QLatin1Char( ',' ) ); - if ( i < 0 ) { - QStringList parts =3D str.split( spaceStr ); - int leftOffset =3D 0; - int rightOffset =3D parts.count() - 1; - - QString suffix; - while ( rightOffset >=3D 0 ) { - if ( helper->containsSuffix( parts[ rightOffset ] ) ) { - suffix.prepend( parts[ rightOffset ] + ( suffix.isEmpty() ? emptyS= tr : spaceStr ) ); - rightOffset--; - } else - break; - } - setSuffix( suffix ); - - if ( rightOffset < 0 ) - return; - - if ( rightOffset - 1 >=3D 0 && helper->containsPrefix( parts[ rightOff= set - 1 ].toLower() ) ) { - setFamilyName( parts[ rightOffset - 1 ] + spaceStr + parts[ rightOff= set ] ); - rightOffset--; - } else { - if ( helper->tradeAsFamilyName() ) - setFamilyName( parts[ rightOffset ] ); - else - setGivenName( parts[ rightOffset ] ); - } - - QString prefix; - while ( leftOffset < rightOffset ) { - if ( helper->containsTitle( parts[ leftOffset ] ) ) { - prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr ) + parts[= leftOffset ] ); - leftOffset++; - } else - break; - } - setPrefix( prefix ); - - if ( leftOffset < rightOffset ) { - setGivenName( parts[ leftOffset ] ); - leftOffset++; - } - - QString additionalName; - while ( leftOffset < rightOffset ) { - additionalName.append( ( additionalName.isEmpty() ? emptyStr : space= Str ) + parts[ leftOffset ] ); - leftOffset++; - } - setAdditionalName( additionalName ); - } else { - QString part1 =3D str.left( i ); - QString part2 =3D str.mid( i + 1 ); - - QStringList parts =3D part1.split( spaceStr ); - int leftOffset =3D 0; - int rightOffset =3D parts.count() - 1; - - if ( parts.count() > 0 ) { - - QString suffix; - while ( rightOffset >=3D 0 ) { - if ( helper->containsSuffix( parts[ rightOffset ] ) ) { - suffix.prepend( parts[ rightOffset ] + ( suffix.isEmpty() ? empt= yStr : spaceStr ) ); - rightOffset--; - } else - break; - } - setSuffix( suffix ); - - if ( rightOffset - 1 >=3D 0 && helper->containsPrefix( parts[ rightO= ffset - 1 ].toLower() ) ) { - setFamilyName( parts[ rightOffset - 1 ] + spaceStr + parts[ rightO= ffset ] ); - rightOffset--; - } else - setFamilyName( parts[ rightOffset ] ); - - QString prefix; - while ( leftOffset < rightOffset ) { - if ( helper->containsTitle( parts[ leftOffset ] ) ) { - prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr ) + part= s[ leftOffset ] ); - leftOffset++; - } else - break; - } - } else { - setPrefix( QString() ); - setFamilyName( QString() ); - setSuffix( QString() ); - } - - parts =3D part2.split( spaceStr ); - - leftOffset =3D 0; - rightOffset =3D parts.count(); - - if ( parts.count() > 0 ) { - - QString prefix; - while ( leftOffset < rightOffset ) { - if ( helper->containsTitle( parts[ leftOffset ] ) ) { - prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr ) + part= s[ leftOffset ] ); - leftOffset++; - } else - break; - } - setPrefix( prefix ); - - if ( leftOffset < rightOffset ) { - setGivenName( parts[ leftOffset ] ); - leftOffset++; - } - - QString additionalName; - while ( leftOffset < rightOffset ) { - additionalName.append( ( additionalName.isEmpty() ? emptyStr : spa= ceStr ) + parts[ leftOffset ] ); - leftOffset++; - } - setAdditionalName( additionalName ); - } else { - setGivenName( QString() ); - setAdditionalName( QString() ); - } - } -} - -QString Addressee::realName() const -{ - QString n( formattedName() ); - if ( !n.isEmpty() ) - return n; - - n =3D assembledName(); - if ( !n.isEmpty() ) - return n; - - n =3D name(); - if ( !n.isEmpty() ) - return n; - - return organization(); -} - -QString Addressee::assembledName() const -{ - const QString name =3D prefix() + QLatin1Char( ' ' ) + - givenName() + QLatin1Char( ' ' ) + - additionalName() + QLatin1Char( ' ' ) + - familyName() + QLatin1Char( ' ' ) + - suffix(); - - return name.simplified(); -} - -QString Addressee::fullEmail( const QString &email ) const -{ - QString e; - if ( email.isNull() ) { - e =3D preferredEmail(); - } else { - e =3D email; - } - if ( e.isEmpty() ) return QString(); - - QString text; - if ( realName().isEmpty() ) - text =3D e; - else { - QRegExp needQuotes( QLatin1String( "[^ 0-9A-Za-z\\x0080-\\xFFFF]" ) ); - if ( realName().indexOf( needQuotes ) !=3D -1 ) { - QString name =3D realName(); - name.replace( QLatin1String( "\"" ), QLatin1String( "\\\"" ) ); - text =3D QLatin1String( "\"" ) + name + QLatin1String( "\" <" ) + e = + QLatin1Char( '>' ); - } else - text =3D realName() + QLatin1String( " <" ) + e + QLatin1Char( '>' ); - } - - return text; -} - -void Addressee::insertEmail( const QString &email, bool preferred ) -{ - if ( email.simplified().isEmpty() ) - return; - - if ( d->mEmails.contains( email ) ) { - if ( !preferred || d->mEmails.first() =3D=3D email ) - return; - - d->mEmails.removeAll( email ); - d->mEmails.prepend( email ); - } else { - d->mEmpty =3D false; - if ( preferred ) { - d->mEmails.prepend( email ); - } else { - d->mEmails.append( email ); - } - } -} - -void Addressee::removeEmail( const QString &email ) -{ - if ( d->mEmails.contains( email ) ) { - d->mEmails.removeAll( email ); - } -} - -QString Addressee::preferredEmail() const -{ - if ( d->mEmails.count() =3D=3D 0 ) - return QString(); - else - return d->mEmails.first(); -} - -QStringList Addressee::emails() const -{ - return d->mEmails; -} - -void Addressee::setEmails( const QStringList& emails ) -{ - d->mEmails =3D emails; -} -void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber ) -{ - d->mEmpty =3D false; - - PhoneNumber::List::Iterator it; - for ( it =3D d->mPhoneNumbers.begin(); it !=3D d->mPhoneNumbers.end(); += +it ) { - if ( ( *it ).id() =3D=3D phoneNumber.id() ) { - *it =3D phoneNumber; - return; - } - } - if ( !phoneNumber.number().simplified().isEmpty() ) - d->mPhoneNumbers.append( phoneNumber ); -} - -void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber ) -{ - PhoneNumber::List::Iterator it; - for ( it =3D d->mPhoneNumbers.begin(); it !=3D d->mPhoneNumbers.end(); += +it ) { - if ( ( *it ).id() =3D=3D phoneNumber.id() ) { - d->mPhoneNumbers.erase( it ); - return; - } - } -} - -PhoneNumber Addressee::phoneNumber( PhoneNumber::Type type ) const -{ - PhoneNumber phoneNumber( QString(), type ); - PhoneNumber::List::ConstIterator it; - for ( it =3D d->mPhoneNumbers.constBegin(); it !=3D d->mPhoneNumbers.con= stEnd(); ++it ) { - if ( matchBinaryPattern( ( *it ).type(), type ) ) { - if ( ( *it ).type() & PhoneNumber::Pref ) { - return ( *it ); - } else if ( phoneNumber.number().isEmpty() ) { - phoneNumber =3D ( *it ); - } - } - } - - return phoneNumber; -} - -PhoneNumber::List Addressee::phoneNumbers() const -{ - return d->mPhoneNumbers; -} - -PhoneNumber::List Addressee::phoneNumbers( PhoneNumber::Type type ) const -{ - PhoneNumber::List list; - - PhoneNumber::List::ConstIterator it; - PhoneNumber::List::ConstIterator end( d->mPhoneNumbers.constEnd() ); - for ( it =3D d->mPhoneNumbers.constBegin(); it !=3D end; ++it ) { - if ( matchBinaryPattern( ( *it ).type(), type ) ) { - list.append( *it ); - } - } - return list; -} - -PhoneNumber Addressee::findPhoneNumber( const QString &id ) const -{ - PhoneNumber::List::ConstIterator it; - PhoneNumber::List::ConstIterator end( d->mPhoneNumbers.constEnd() ); - for ( it =3D d->mPhoneNumbers.constBegin(); it !=3D end; ++it ) { - if ( ( *it ).id() =3D=3D id ) { - return *it; - } - } - return PhoneNumber(); -} - -void Addressee::insertKey( const Key &key ) -{ - d->mEmpty =3D false; - - Key::List::Iterator it; - for ( it =3D d->mKeys.begin(); it !=3D d->mKeys.end(); ++it ) { - if ( ( *it ).id() =3D=3D key.id() ) { - *it =3D key; - return; - } - } - d->mKeys.append( key ); -} - -void Addressee::removeKey( const Key &key ) -{ - Key::List::Iterator it; - for ( it =3D d->mKeys.begin(); it !=3D d->mKeys.end(); ++it ) { - if ( ( *it ).id() =3D=3D key.id() ) { - d->mKeys.removeAll( key ); - return; - } - } -} - -Key Addressee::key( Key::Type type, QString customTypeString ) const -{ - Key::List::ConstIterator it; - Key::List::ConstIterator end( d->mKeys.constEnd() ); - for ( it =3D d->mKeys.constBegin(); it !=3D end; ++it ) { - if ( ( *it ).type() =3D=3D type ) { - if ( type =3D=3D Key::Custom ) { - if ( customTypeString.isEmpty() ) { - return *it; - } else { - if ( ( *it ).customTypeString() =3D=3D customTypeString ) - return ( *it ); - } - } else { - return *it; - } - } - } - return Key( QString(), type ); -} - -void Addressee::setKeys( const Key::List& list ) -{ - d->mKeys =3D list; -} - -Key::List Addressee::keys() const -{ - return d->mKeys; -} - -Key::List Addressee::keys( Key::Type type, QString customTypeString ) const -{ - Key::List list; - - Key::List::ConstIterator it; - Key::List::ConstIterator end( d->mKeys.constEnd() ); - for ( it =3D d->mKeys.constBegin(); it !=3D end; ++it ) { - if ( ( *it ).type() =3D=3D type ) { - if ( type =3D=3D Key::Custom ) { - if ( customTypeString.isEmpty() ) { - list.append( *it ); - } else { - if ( ( *it ).customTypeString() =3D=3D customTypeString ) - list.append( *it ); - } - } else { - list.append( *it ); - } - } - } - return list; -} - -Key Addressee::findKey( const QString &id ) const -{ - Key::List::ConstIterator it; - Key::List::ConstIterator end( d->mKeys.constEnd() ); - for ( it =3D d->mKeys.constBegin(); it !=3D end; ++it ) { - if ( ( *it ).id() =3D=3D id ) { - return *it; - } - } - return Key(); -} - -QString Addressee::toString() const -{ - QString str; - - str +=3D QLatin1String( "Addressee {\n" ); - str +=3D QString::fromLatin1( " Uid: %1\n" ).arg( uid() ); - - --DEBUG-- - - str +=3D QLatin1String( " Emails {\n" ); - const QStringList e =3D emails(); - QStringList::ConstIterator it; - for ( it =3D e.begin(); it !=3D e.end(); ++it ) { - str +=3D QString::fromLatin1( " %1\n" ).arg( *it ); - } - str +=3D QLatin1String( " }\n" ); - - str +=3D QLatin1String( " PhoneNumbers {\n" ); - const PhoneNumber::List p =3D phoneNumbers(); - PhoneNumber::List::ConstIterator it2; - for ( it2 =3D p.begin(); it2 !=3D p.end(); ++it2 ) { - str +=3D ( *it2 ).toString(); - } - str +=3D QLatin1String( " }\n" ); - - str +=3D QLatin1String( " Addresses {\n" ); - const Address::List a =3D addresses(); - Address::List::ConstIterator it3; - for ( it3 =3D a.begin(); it3 !=3D a.end(); ++it3 ) { - str +=3D ( *it3 ).toString(); - } - str +=3D QLatin1String( " }\n" ); - - str +=3D QLatin1String( " Keys {\n" ); - const Key::List k =3D keys(); - Key::List::ConstIterator it4; - for ( it4 =3D k.begin(); it4 !=3D k.end(); ++it4 ) { - str +=3D ( *it4 ).toString(); - } - str +=3D QLatin1String( " }\n" ); - - str +=3D QLatin1String( "}\n" ); - - return str; -} - - -void Addressee::insertAddress( const Address &address ) -{ - if ( address.isEmpty() ) - return; - - d->mEmpty =3D false; - - Address::List::Iterator it; - for ( it =3D d->mAddresses.begin(); it !=3D d->mAddresses.end(); ++it ) { - if ( ( *it ).id() =3D=3D address.id() ) { - *it =3D address; - return; - } - } - - d->mAddresses.append( address ); -} - -void Addressee::removeAddress( const Address &address ) -{ - Address::List::Iterator it; - for ( it =3D d->mAddresses.begin(); it !=3D d->mAddresses.end(); ++it ) { - if ( ( *it ).id() =3D=3D address.id() ) { - d->mAddresses.erase( it ); - return; - } - } -} - -Address Addressee::address( Address::Type type ) const -{ - Address address( type ); - Address::List::ConstIterator it; - Address::List::ConstIterator end( d->mAddresses.constEnd() ); - for ( it =3D d->mAddresses.constBegin(); it !=3D end; ++it ) { - if ( matchBinaryPattern( ( *it ).type(), type ) ) { - if ( ( *it ).type() & Address::Pref ) { - return ( *it ); - } else if ( address.isEmpty() ) { - address =3D ( *it ); - } - } - } - - return address; -} - -Address::List Addressee::addresses() const -{ - return d->mAddresses; -} - -Address::List Addressee::addresses( Address::Type type ) const -{ - Address::List list; - - Address::List::ConstIterator it; - Address::List::ConstIterator end( d->mAddresses.constEnd() ); - for ( it =3D d->mAddresses.constBegin(); it !=3D end; ++it ) { - if ( matchBinaryPattern( ( *it ).type(), type ) ) { - list.append( *it ); - } - } - - return list; -} - -Address Addressee::findAddress( const QString &id ) const -{ - Address::List::ConstIterator it; - Address::List::ConstIterator end( d->mAddresses.constEnd() ); - for ( it =3D d->mAddresses.constBegin(); it !=3D end; ++it ) { - if ( ( *it ).id() =3D=3D id ) { - return *it; - } - } - return Address(); -} - -void Addressee::insertCategory( const QString &c ) -{ - d->mEmpty =3D false; - - if ( d->mCategories.contains( c ) ) - return; - - d->mCategories.append( c ); -} - -void Addressee::removeCategory( const QString &category ) -{ - if ( d->mCategories.contains( category ) ) { - d->mCategories.removeAll( category ); - } -} - -bool Addressee::hasCategory( const QString &category ) const -{ - return d->mCategories.contains( category ); -} - -void Addressee::setCategories( const QStringList &c ) -{ - d->mEmpty =3D false; - - d->mCategories =3D c; -} - -QStringList Addressee::categories() const -{ - return d->mCategories; -} - -void Addressee::insertCustom( const QString &app, const QString &name, - const QString &value ) -{ - if ( value.isEmpty() || name.isEmpty() || app.isEmpty() ) { - return; - } - - d->mEmpty =3D false; - - QString qualifiedName =3D app + QLatin1Char( '-' ) + name + QLatin1Char(= ':' ); - - QStringList::Iterator it; - QStringList::Iterator end( d->mCustom.end() ); - for ( it =3D d->mCustom.begin(); it !=3D end; ++it ) { - if ( ( *it ).startsWith( qualifiedName ) ) { - ( *it ) =3D qualifiedName + value; - return; - } - } - - d->mCustom.append( qualifiedName + value ); -} - -void Addressee::removeCustom( const QString &app, const QString &name ) -{ - const QString qualifiedName =3D app + QLatin1Char( '-' ) + name + QLatin= 1Char( ':' ); - - QStringList::Iterator it; - for ( it =3D d->mCustom.begin(); it !=3D d->mCustom.end(); ++it ) { - if ( ( *it ).startsWith( qualifiedName ) ) { - d->mCustom.erase( it ); - return; - } - } -} - -QString Addressee::custom( const QString &app, const QString &name ) const -{ - QString qualifiedName =3D app + QLatin1Char( '-' ) + name + QLatin1Char(= ':' ); - QString value; - - QStringList::ConstIterator it; - QStringList::ConstIterator end( d->mCustom.constEnd() ); - for ( it =3D d->mCustom.constBegin(); it !=3D end; ++it ) { - if ( ( *it ).startsWith( qualifiedName ) ) { - value =3D ( *it ).mid( ( *it ).indexOf( QLatin1Char( ':' ) ) + 1 ); - break; - } - } - - return value; -} - -void Addressee::setCustoms( const QStringList &l ) -{ - d->mEmpty =3D false; - d->mCustom =3D l; -} - -QStringList Addressee::customs() const -{ - return d->mCustom; -} - -void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullN= ame, - QString &email ) -{ - // This is a simplified version of KPIM::splitAddress(). - - fullName.clear(); - email.clear(); - if ( rawEmail.isEmpty() ) - return; // KPIM::AddressEmpty; - - // The code works on 8-bit strings, so convert the input to UTF-8. - QByteArray address =3D rawEmail.toUtf8(); - - QByteArray displayName; - QByteArray addrSpec; - QByteArray comment; - - // The following is a primitive parser for a mailbox-list (cf. RFC 2822). - // The purpose is to extract a displayable string from the mailboxes. - // Comments in the addr-spec are not handled. No error checking is done. - - enum { TopLevel, InComment, InAngleAddress } context =3D TopLevel; - bool inQuotedString =3D false; - int commentLevel =3D 0; - bool stop =3D false; - - for ( char* p =3D address.data(); *p && !stop; ++p ) { - switch ( context ) { - case TopLevel : { - switch ( *p ) { - case '"' : inQuotedString =3D !inQuotedString; - displayName +=3D *p; - break; - case '(' : if ( !inQuotedString ) { - context =3D InComment; - commentLevel =3D 1; - } - else - displayName +=3D *p; - break; - case '<' : if ( !inQuotedString ) { - context =3D InAngleAddress; - } - else - displayName +=3D *p; - break; - case '\\' : // quoted character - displayName +=3D *p; - ++p; // skip the '\' - if ( *p ) - displayName +=3D *p; - else - //return KPIM::UnexpectedEnd; - goto ABORT_PARSING; - break; - case ',' : if ( !inQuotedString ) { - //if ( allowMultipleAddresses ) - // stop =3D true; - //else - // return KPIM::UnexpectedComma; - goto ABORT_PARSING; - } - else - displayName +=3D *p; - break; - default : displayName +=3D *p; - } - break; - } - case InComment : { - switch ( *p ) { - case '(' : ++commentLevel; - comment +=3D *p; - break; - case ')' : --commentLevel; - if ( commentLevel =3D=3D 0 ) { - context =3D TopLevel; - comment +=3D ' '; // separate the text of several comme= nts - } - else - comment +=3D *p; - break; - case '\\' : // quoted character - comment +=3D *p; - ++p; // skip the '\' - if ( *p ) - comment +=3D *p; - else - //return KPIM::UnexpectedEnd; - goto ABORT_PARSING; - break; - default : comment +=3D *p; - } - break; - } - case InAngleAddress : { - switch ( *p ) { - case '"' : inQuotedString =3D !inQuotedString; - addrSpec +=3D *p; - break; - case '>' : if ( !inQuotedString ) { - context =3D TopLevel; - } - else - addrSpec +=3D *p; - break; - case '\\' : // quoted character - addrSpec +=3D *p; - ++p; // skip the '\' - if ( *p ) - addrSpec +=3D *p; - else - //return KPIM::UnexpectedEnd; - goto ABORT_PARSING; - break; - default : addrSpec +=3D *p; - } - break; - } - } // switch ( context ) - } - -ABORT_PARSING: - displayName =3D displayName.trimmed(); - comment =3D comment.trimmed(); - addrSpec =3D addrSpec.trimmed(); - - fullName =3D QString::fromUtf8( displayName ); - email =3D QString::fromUtf8( addrSpec ); - - // check for errors - if ( inQuotedString ) - return; // KPIM::UnbalancedQuote; - if ( context =3D=3D InComment ) - return; // KPIM::UnbalancedParens; - if ( context =3D=3D InAngleAddress ) - return; // KPIM::UnclosedAngleAddr; - - if ( addrSpec.isEmpty() ) { - if ( displayName.isEmpty() ) - return; // KPIM::NoAddressSpec; - else { - //addrSpec =3D displayName; - //displayName.truncate( 0 ); - // Address of the form "foo@bar" or "foo@bar (Name)". - email =3D fullName; - fullName =3D QString::fromUtf8( comment ); - } - } - - email =3D email.toLower(); - // Check that we do not have any extra characters on the end of the - // strings - unsigned int len =3D fullName.length(); - if ( fullName[ 0 ] =3D=3D QLatin1Char( '"' ) && fullName[ len - 1 ] =3D= =3D QLatin1Char( '"' ) ) { - fullName =3D fullName.mid( 1, len - 2 ); - } -} - -#ifndef KDEPIM_NO_KRESOURCES -void Addressee::setResource( Resource *resource ) -{ - d->mResource =3D resource; -} - -Resource *Addressee::resource() const -{ - return d->mResource; -} -#endif - -void Addressee::setChanged( bool value ) -{ - d->mChanged =3D value; -} - -bool Addressee::changed() const -{ - return d->mChanged; -} - -void Addressee::setSortMode( KABC::SortMode *mode ) -{ - Private::mSortMode =3D mode; -} - -bool Addressee::operator< ( const Addressee &addr ) const -{ - if ( !Private::mSortMode ) - return false; - else - return Private::mSortMode->lesser( *this, addr ); -} - -QString Addressee::mimeType() -{ - return QLatin1String( "text/directory" ); -} - -QDataStream &KABC::operator<<( QDataStream &s, const Addressee &a ) -{ - s << a.d->mUid; - - --STREAMOUT-- - s << a.d->mPhoneNumbers; - s << a.d->mAddresses; - s << a.d->mEmails; - s << a.d->mCategories; - s << a.d->mCustom; - s << a.d->mKeys; - return s; -} - -QDataStream &KABC::operator>>( QDataStream &s, Addressee &a ) -{ - s >> a.d->mUid; - - --STREAMIN-- - s >> a.d->mPhoneNumbers; - s >> a.d->mAddresses; - s >> a.d->mEmails; - s >> a.d->mCategories; - s >> a.d->mCustom; - s >> a.d->mKeys; - - a.d->mEmpty =3D false; - - return s; -} - -bool matchBinaryPattern( int value, int pattern ) -{ - /** - We want to match all telephonnumbers/addresses which have the bits in = the - pattern set. More are allowed. - if pattern =3D=3D 0 we have a special handling, then we want only thos= e with - exactly no bit set. - */ - if ( pattern =3D=3D 0 ) - return ( value =3D=3D 0 ); - else - return ( pattern =3D=3D ( pattern & value ) ); -} - -template -bool listEquals( const QList &list, const QList &pattern ) -{ - if ( list.count() !=3D pattern.count() ) - return false; - const int numberOfElement( list.count() ); - for ( int i =3D 0; i < numberOfElement; ++i ) { - if ( !pattern.contains( list[ i ] ) ) { - return false; - } - } - - return true; -} - -bool listEquals( const QStringList &list, const QStringList &pattern ) -{ - if ( list.count() !=3D pattern.count() ) - return false; - - const int numberOfElement( list.count() ); - for ( int i =3D 0; i < numberOfElement; ++i ) { - if ( !pattern.contains( list[ i ] ) ) { - return false; - } - } - - return true; -} - -bool emailsEquals( const QStringList &list, const QStringList &pattern ) -{ - if ( list.count() !=3D pattern.count() ) - return false; - - if ( list.isEmpty() ) - return true; - - if ( list.first() !=3D pattern.first() ) - return false; - - QStringList::ConstIterator it; - QStringList::ConstIterator end( list.constEnd() ); - for ( it =3D list.constBegin(); it !=3D end; ++it ) { - if ( !pattern.contains( *it ) ) { - return false; - } - } - - return true; -} diff --git a/kabc/scripts/addressee.src.h b/kabc/scripts/addressee.src.h deleted file mode 100644 index db438e3..0000000 --- a/kabc/scripts/addressee.src.h +++ /dev/null @@ -1,500 +0,0 @@ -/* - This file is part of libkabc. - Copyright (c) 2001 Cornelius Schumacher - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public Lice= nse - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef KABC_ADDRESSEE_SRC_H -#define KABC_ADDRESSEE_SRC_H - -#include -#include -#include - -#include - -#include "kabc/address.h" -#include "kabc/geo.h" -#include "kabc/key.h" -#include "kabc/phonenumber.h" -#include "kabc/picture.h" -#include "kabc/secrecy.h" -#include "kabc/sound.h" -#include "kabc/timezone.h" -#include "kabc/addresseelist.h" // for typedef QList List; - -namespace KABC { - -#ifndef KDEPIM_NO_KRESOURCES -class Resource; -#endif -class SortMode; - -/** - @short address book entry - - This class represents an entry in the address book. - - The data of this class is implicitly shared. You can pass this class by = value. - - If you need the name of a field for presenting it to the user you should= use - the functions ending in Label(). They return a translated string which c= an be - used as label for the corresponding field. - - About the name fields: - - givenName() is the first name and familyName() the last name. In some - countries the family name comes first, that's the reason for the - naming. formattedName() is the full name with the correct formatting. - It is used as an override, when the correct formatting can't be generated - from the other name fields automatically. - - realName() returns a fully formatted name(). It uses formattedName, if s= et, - otherwise it constucts the name from the name fields. As fallback, if - nothing else is set it uses name(). - - name() is the NAME type of RFC2426. It can be used as internal name for = the - data enty, but shouldn't be used for displaying the data to the user. - */ -class KABC_EXPORT Addressee -{ - friend KABC_EXPORT QDataStream &operator<<( QDataStream &, const Address= ee & ); - friend KABC_EXPORT QDataStream &operator>>( QDataStream &, Addressee & ); - - public: - /** - A list of addressee objects - */ - typedef AddresseeList List; - /** - A map from unique identifier to addressee. - - @see uid() - */ - typedef QMap Map; - - /** - Construct an empty address book entry. - */ - Addressee(); - - /** - Destroys the address book entry. - */ - ~Addressee(); - - /** - Copy constructor. - */ - Addressee( const Addressee & ); - - /** - Assignment operator. - - @return a reference to @c this - */ - Addressee &operator=3D( const Addressee & ); - - /** - Equality operator. - - @return @c true if @c this and the given addressee are equal, - otherwise @c false - */ - bool operator=3D=3D( const Addressee & ) const; - - /** - Not-equal operator. - - @return @c true if @c this and the given addressee are not equal, - otherwise @c false - */ - bool operator!=3D( const Addressee & ) const; - - /** - Return, if the address book entry is empty. - */ - bool isEmpty() const; - - /** - Set unique identifier. - - @param uid the KABC unique identifier - */ - void setUid( const QString &uid ); - /** - Return unique identifier. - */ - QString uid() const; - /** - Return translated label for uid field. - */ - static QString uidLabel(); - - --DECLARATIONS-- - /** - Set name fields by parsing the given string and trying to associate = the - parts of the string with according fields. This function should prob= ably - be a bit more clever. - */ - void setNameFromString( const QString & ); - - /** - Return the name of the addressee. This is calculated from all the na= me - fields. - */ - QString realName() const; - - /** - Return the name that consists of all name parts. - */ - QString assembledName() const; - - /** - Return email address including real name. - - @param email Email address to be used to construct the full email st= ring. - If this is QString() the preferred email address is use= d. - */ - QString fullEmail( const QString &email=3DQString() ) const; - - /** - Insert an email address. If the email address already exists in this - addressee it is not duplicated. - - @param email Email address - @param preferred Set to true, if this is the preferred email address= of - the addressee. - */ - void insertEmail( const QString &email, bool preferred=3Dfalse ); - - /** - Remove email address. If the email address doesn't exist, nothing ha= ppens. - - @param email Email address to remove - */ - void removeEmail( const QString &email ); - - /** - Return preferred email address. This is the first email address or t= he - last one added with insertEmail() with a set preferred parameter. - */ - QString preferredEmail() const; - - /** - Return list of all email addresses. - */ - QStringList emails() const; - - /** - Set the emails to @p list. - The first email address gets the preferred one! - @param list The list of email addresses. - */ - void setEmails( const QStringList& list); - - /** - Insert a phone number. If a phone number with the same id already ex= ists - in this addressee it is not duplicated. - - @param phoneNumber The telephone number to insert to the addressee - */ - void insertPhoneNumber( const PhoneNumber &phoneNumber ); - - /** - Remove phone number. If no phone number with the given id exists for= this - addresse nothing happens. - - @param phoneNumber The telephone number to remove from the addressee - */ - void removePhoneNumber( const PhoneNumber &phoneNumber ); - - /** - Return phone number, which matches the given type. - - @param type The type of phone number to get - */ - PhoneNumber phoneNumber( PhoneNumber::Type type ) const; - - /** - Return list of all phone numbers. - */ - PhoneNumber::List phoneNumbers() const; - - /** - Return list of phone numbers with a special type. - - @param type The type of phone number to get - */ - PhoneNumber::List phoneNumbers( PhoneNumber::Type type ) const; - - /** - Return phone number with the given id. - - @param id The identifier of the phone number to look for. - See PhoneNumber::id() - */ - PhoneNumber findPhoneNumber( const QString &id ) const; - - /** - Insert a key. If a key with the same id already exists - in this addressee it is not duplicated. - - @param key The key to insert - */ - void insertKey( const Key &key ); - - /** - Remove a key. If no key with the given id exists for this - addresse nothing happens. - - @param key The key to remove - */ - void removeKey( const Key &key ); - - /** - Return key, which matches the given type. - If @p type =3D=3D Key::Custom you can specify a string - that should match. If you leave the string empty, the first - key with a custom value is returned. - - @param type The type of key to look for - @param customTypeString A string to match custom keys against when - @p type is @c Key::Custom - */ - Key key( Key::Type type, QString customTypeString =3D QString() ) cons= t; - - /** - Return list of all keys. - */ - Key::List keys() const; - - /** - Set the list of keys - @param keys The keys to be set. - */ - void setKeys( const Key::List& keys); - - /** - Return list of keys with a special type. - If @p type =3D=3D Key::Custom you can specify a string - that should match. If you leave the string empty, all custom - keys will be returned. - - @param type The type of key to look for - @param customTypeString A string to match custom keys against when - @p type is @c Key::Custom - */ - Key::List keys( Key::Type type, QString customTypeString =3D QString()= ) const; - - /** - Return key with the given id. - - @param id The identifier of the key to look for. See Key::id() - */ - Key findKey( const QString &id ) const; - - /** - Insert an address. If an address with the same id already exists - in this addressee it is not duplicated. - - @param address The address to insert - */ - void insertAddress( const Address &address ); - - /** - Remove address. If no address with the given id exists for this - addresse nothing happens. - - @param address The address to remove - */ - void removeAddress( const Address &address ); - - /** - Return address, which matches the given type. - - @param type The type of address to look for - */ - Address address( Address::Type type ) const; - - /** - Return list of all addresses. - */ - Address::List addresses() const; - - /** - Return list of addresses with a special type. - - @param type The type of addresses to look for - */ - Address::List addresses( Address::Type type ) const; - - /** - Return address with the given id. - - @param id The identifier of the address to look for. See Address::id= () - */ - Address findAddress( const QString &id ) const; - - /** - Insert category. If the category already exists it is not duplicated. - */ - void insertCategory( const QString & ); - - /** - Remove category. - */ - void removeCategory( const QString & ); - - /** - Return, if addressee has the given category. - */ - bool hasCategory( const QString & ) const; - - /** - Set categories to given value. - */ - void setCategories( const QStringList & ); - - /** - Return list of all set categories. - */ - QStringList categories() const; - - /** - Insert custom entry. The entry is identified by the name of the inse= rting - application and a unique name. If an entry with the given app and na= me - already exists its value is replaced with the new given value. - - An empty value isn't allowed (nothing happens if this is called with - any of the three arguments being empty) - - @param app Name of the application inserting this custom entry - @param name Name of this application specific custom entry - @param value Value of this application specific custom entry - */ - void insertCustom( const QString &app, const QString &name, - const QString &value ); - - /** - Remove custom entry. - - @param app Name of the application which has inserted this custom en= try - @param name Name of this application specific custom entry - */ - void removeCustom( const QString &app, const QString &name ); - - /** - Return value of custom entry, identified by app and entry name. - - @param app Name of the application which has inserted this custom en= try - @param name Name of this application specific custom entry - */ - QString custom( const QString &app, const QString &name ) const; - - /** - Set all custom entries. - */ - void setCustoms( const QStringList & ); - - /** - Return list of all custom entries. - */ - QStringList customs() const; - - /** - Parse full email address. The result is given back in fullName and e= mail. - - @param rawEmail The input string to parse for name and email - @param fullName The name part of the @p rawEmail input, if it contai= ned one - @param email The email part of the @p rawEmail input, if it containe= d one - */ - static void parseEmailAddress( const QString &rawEmail, QString &fullN= ame, - QString &email ); - - /** - Returns string representation of the addressee. - */ - QString toString() const; - -#ifndef KDEPIM_NO_KRESOURCES - /** - Set resource where the addressee is from. - - @param resource The Resource the addressee is from - */ - void setResource( Resource *resource ); - - /** - Return pointer to resource. - */ - Resource *resource() const; -#endif - - /** - Mark addressee as changed. - - @param value Sets the status indicating changed data - */ - void setChanged( bool value ); - - /** - Return whether the addressee is changed. - */ - bool changed() const; - - /** - Sets the sort mode implementation. - - Comparing to addressee objects is delegated to an instance - of a subclass of KABC::SortMode. - - @param mode The sort mode implementator to use - */ - static void setSortMode( KABC::SortMode *mode ); - - /** - Return whether this addressee is "less-than" a given one - - @param addr The addressee object to compare with - - @see setSortMode() - */ - bool operator< ( const Addressee &addr ) const; - - /** - Returns the MIME type used for Addressees - */ - static QString mimeType(); - - private: - class Private; - QSharedDataPointer d; -}; -#ifdef MAKE_KABC_LIB -KDE_DUMMY_QHASH_FUNCTION( Addressee ) -#endif - -KABC_EXPORT QDataStream &operator<<( QDataStream &, const Addressee & ); -KABC_EXPORT QDataStream &operator>>( QDataStream &, Addressee & ); - -} - -#define KABC_ADDRESSEE_METATYPE_DEFINED 1 -Q_DECLARE_METATYPE( KABC::Addressee ) - -#endif diff --git a/kabc/scripts/createisomap.pl b/kabc/scripts/createisomap.pl deleted file mode 100755 index 2726e20..0000000 --- a/kabc/scripts/createisomap.pl +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/perl -# -# Create a translation table countryname->iso-code from the entry.desktop -# files in kdebase/l10n/*/ -# -# USAGE EXAMPLE: -# ./createisomap.pl $KDEDIR/share/locale/l10n > countrytransl.map -# -# Don't laugh at me. I put this together with an old perl book, perl -# being a language I've never used before. - -@entries =3D <$ARGV[0]/*/entry.desktop>; -chomp @entries; -foreach $entry (@entries) { - local ( $entryiso, @entryfile, @mappings ); - # print "--> $entry\n"; - $entryiso =3D $entry; - $entryiso =3D~ s/$ARGV[0]\///; - $entryiso =3D~ s/\/entry\.desktop//; - # print " $entryiso\n"; - open (IN, $entry); - @entryfile =3D ; - close IN; - chomp @entryfile; - foreach $entryfileline (@entryfile) { - if ( $entryfileline =3D~ /^Name.*=3D(.*)$/ ) { - # push (@mappings, $1 . "\t" . $entryiso ); - print "$1\t$entryiso\n"; - } - } -} - diff --git a/kabc/scripts/doxygen-preprocess-addressee.sh b/kabc/scripts/do= xygen-preprocess-addressee.sh deleted file mode 100755 index a4cfc24..0000000 --- a/kabc/scripts/doxygen-preprocess-addressee.sh +++ /dev/null @@ -1,5 +0,0 @@ -if test "$1" =3D "create"; then - ./makeaddressee -elif test "$1" =3D "cleanup"; then - rm -f ../addressee.h ../addressee.cpp ../field.cpp -fi diff --git a/kabc/scripts/entrylist b/kabc/scripts/entrylist deleted file mode 100644 index 328512d..0000000 --- a/kabc/scripts/entrylist +++ /dev/null @@ -1,83 +0,0 @@ -# This file describes the fields of an address book entry. -# -# The following comma-separated fields are used: -# -# Control: A generates accessor functions. -# L generates a static function for returning a tranlsat= ed label -# F generates a Field id and object for generic field ha= ndling -# E generate an equality test in Addressee::operator=3D= =3D(). -# Field Name : A descriptive name which is shown to the user. -# Comment : A comment helping translators to understand the field = name -# Type : C++ type of field. -# Identifier : A string used in code as variable name etc. -# Field Category : Categories the field belongs to (see Field::FieldCateg= ory). -# Output function: Function used to convert type to string for debug outp= ut (optional) - -ALE,name,,QString,name - -ALFE,formatted name,,QString,formattedName,Frequent - -ALFE,family name,,QString,familyName,Frequent -ALFE,given name,,QString,givenName,Frequent -ALFE,additional names,,QString,additionalName -ALFE,honorific prefixes,,QString,prefix -ALFE,honorific suffixes,,QString,suffix - -ALFE,nick name,,QString,nickName,Personal - -ALFE,birthday,,QDateTime,birthday,Personal,.toString() - -#Address address -LF,home address street,,QString,homeAddressStreet,Address|Personal -LF,home address post office box,,QString,homeAddressPostOfficeBox,Address|= Personal -LF,home address city,,QString,homeAddressLocality,Address|Personal -LF,home address state,,QString,homeAddressRegion,Address|Personal -LF,home address zip code,,QString,homeAddressPostalCode,Address|Personal -LF,home address country,,QString,homeAddressCountry,Address|Personal -LF,home address label,,QString,homeAddressLabel,Address|Personal - -LF,business address street,,QString,businessAddressStreet,Address|Organiza= tion -LF,business address post office box,,QString,businessAddressPostOfficeBox,= Address|Organization -LF,business address city,,QString,businessAddressLocality,Address|Organiza= tion -LF,business address state,,QString,businessAddressRegion,Address|Organizat= ion -LF,business address zip code,,QString,businessAddressPostalCode,Address|Or= ganization -LF,business address country,,QString,businessAddressCountry,Address|Organi= zation -LF,business address label,,QString,businessAddressLabel,Address|Organizati= on - -#phoneNumbers -LF,home phone,,QString,homePhone,Personal|Frequent -LF,business phone,,QString,businessPhone,Organization|Frequent -LF,mobile phone,,QString,mobilePhone,Frequent -LF,home fax,,QString,homeFax -LF,business fax,,QString,businessFax -LF,car phone,,QString,carPhone -LF,ISDN,,QString,isdn -LF,pager,,QString,pager - -#emails -LF,email address,,QString,email,Email|Frequent - -ALFE,mail client,,QString,mailer,Email - -ALE,time zone,,TimeZone,timeZone,,.toString() -ALE,geographic position,,Geo,geo,,.toString() - -ALFE,title,a person's title,QString,title,Organization -ALFE,role,of a person in an organization,QString,role,Organization -ALFE,organization,,QString,organization,Organization -ALFE,department,,QString,department,Organization - -ALFE,note,,QString,note - -ALE,product identifier,,QString,productId -ALE,revision date,,QDateTime,revision,,.toString() - -ALE,sort string,,QString,sortString - -ALF,homepage,,KUrl,url,,.url() - -ALE,security class,,Secrecy,secrecy,,.toString() - -ALE,logo,,Picture,logo,,.toString() -ALE,photo,,Picture,photo,,.toString() -ALE,sound,,Sound,sound,,.toString() diff --git a/kabc/scripts/field.src.cpp b/kabc/scripts/field.src.cpp deleted file mode 100644 index 58e0845..0000000 --- a/kabc/scripts/field.src.cpp +++ /dev/null @@ -1,395 +0,0 @@ -/* - This file is part of libkabc. - Copyright (c) 2002 Cornelius Schumacher - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public Lice= nse - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#include -#include -#include -#include -#include - -#include "field.h" - -using namespace KABC; - -class Field::Private -{ - public: - Private( int fieldId, int category =3D 0, - const QString &label =3D QString(), - const QString &key =3D QString(), - const QString &app =3D QString() ) - : mFieldId( fieldId ), mCategory( category ), mLabel( label ), - mKey( key ), mApp( app ) {} - - enum FieldId - { - CustomField, - --ENUMS-- - }; - - int fieldId() { return mFieldId; } - int category() { return mCategory; } - - QString label() { return mLabel; } - QString key() { return mKey; } - QString app() { return mApp; } - - static Field::List mAllFields; - static Field::List mDefaultFields; - static Field::List mCustomFields; - - private: - int mFieldId; - int mCategory; - - QString mLabel; - QString mKey; - QString mApp; -}; - -Field::List Field::Private::mAllFields; -Field::List Field::Private::mDefaultFields; -Field::List Field::Private::mCustomFields; - -Field::Field( Private *p ) - : d( p ) -{ -} - -Field::~Field() -{ - delete d; -} - -QString Field::label() -{ - switch ( d->fieldId() ) { - --CASELABEL-- - case Private::CustomField: - return d->label(); - default: - return i18n( "Unknown Field" ); - } -} - -int Field::category() -{ - return d->category(); -} - -QString Field::categoryLabel( int category ) -{ - switch ( category ) { - case All: - return i18n( "All" ); - case Frequent: - return i18n( "Frequent" ); - case Address: - return i18nc( "street/postal","Address" ); - case Email: - return i18n( "Email" ); - case Personal: - return i18n( "Personal" ); - case Organization: - return i18n( "Organization" ); - case CustomCategory: - return i18n( "Custom" ); - default: - return i18n( "Undefined" ); - } -} - -QString Field::value( const KABC::Addressee &a ) -{ - switch ( d->fieldId() ) { - --CASEVALUE-- - case Private::Email: - return a.preferredEmail(); - case Private::Birthday: - if ( a.birthday().isValid() ) - return a.birthday().date().toString( Qt::ISODate ); - else - return QString(); - case Private::Url: - return a.url().prettyUrl(); - case Private::HomePhone: - { - PhoneNumber::List::ConstIterator it; - - { - // check for preferred number - const PhoneNumber::List list =3D a.phoneNumbers( PhoneNumber::Home= | PhoneNumber::Pref ); - for ( it =3D list.begin(); it !=3D list.end(); ++it ) { - if ( ( ( *it ).type() & ~( PhoneNumber::Pref ) ) =3D=3D PhoneNum= ber::Home ) { - return ( *it ).number(); - } - } - } - - { - // check for normal home number - const PhoneNumber::List list =3D a.phoneNumbers( PhoneNumber::Home= ); - for ( it =3D list.begin(); it !=3D list.end(); ++it ) { - if ( ( ( *it ).type() & ~(PhoneNumber::Pref) ) =3D=3D PhoneNumbe= r::Home ) { - return ( *it ).number(); - } - } - } - - return QString(); - } - case Private::BusinessPhone: - { - PhoneNumber::List::ConstIterator it; - - { - // check for preferred number - const PhoneNumber::List list =3D a.phoneNumbers( PhoneNumber::Work= | PhoneNumber::Pref ); - for ( it =3D list.begin(); it !=3D list.end(); ++it ) { - if ( ( ( *it ).type() & ~(PhoneNumber::Pref) ) =3D=3D PhoneNumbe= r::Work ) { - return ( *it ).number(); - } - } - } - - { - // check for normal work number - const PhoneNumber::List list =3D a.phoneNumbers( PhoneNumber::Work= ); - for ( it =3D list.begin(); it !=3D list.end(); ++it ) { - if ( ( ( *it ).type() & ~(PhoneNumber::Pref) ) =3D=3D PhoneNumbe= r::Work ) { - return ( *it ).number(); - } - } - } - - return QString(); - } - case Private::MobilePhone: - return a.phoneNumber( PhoneNumber::Cell ).number(); - case Private::HomeFax: - return a.phoneNumber( PhoneNumber::Home | PhoneNumber::Fax ).number(= ); - case Private::BusinessFax: - return a.phoneNumber( PhoneNumber::Work | PhoneNumber::Fax ).number(= ); - case Private::CarPhone: - return a.phoneNumber( PhoneNumber::Car ).number(); - case Private::Isdn: - return a.phoneNumber( PhoneNumber::Isdn ).number(); - case Private::Pager: - return a.phoneNumber( PhoneNumber::Pager ).number(); - case Private::HomeAddressStreet: - return a.address( Address::Home ).street(); - case Private::HomeAddressPostOfficeBox: - return a.address( Address::Home ).postOfficeBox(); - case Private::HomeAddressLocality: - return a.address( Address::Home ).locality(); - case Private::HomeAddressRegion: - return a.address( Address::Home ).region(); - case Private::HomeAddressPostalCode: - return a.address( Address::Home ).postalCode(); - case Private::HomeAddressCountry: - return a.address( Address::Home ).country(); - case Private::BusinessAddressStreet: - return a.address( Address::Work ).street(); - case Private::BusinessAddressPostOfficeBox: - return a.address( Address::Work ).postOfficeBox(); - case Private::BusinessAddressLocality: - return a.address( Address::Work ).locality(); - case Private::BusinessAddressRegion: - return a.address( Address::Work ).region(); - case Private::BusinessAddressPostalCode: - return a.address( Address::Work ).postalCode(); - case Private::BusinessAddressCountry: - return a.address( Address::Work ).country(); - case Private::CustomField: - return a.custom( d->app(), d->key() ); - default: - return QString(); - } -} - -bool Field::setValue( KABC::Addressee &a, const QString &value ) -{ - switch ( d->fieldId() ) { - --CASESETVALUE-- - case Private::Birthday: - a.setBirthday( QDateTime::fromString( value, Qt::ISODate ) ); - return true; - case Private::CustomField: - a.insertCustom( d->app(), d->key(), value ); - return true; - default: - return false; - } -} - -QString Field::sortKey( const KABC::Addressee &a ) -{ - switch ( d->fieldId() ) { - --CASEVALUE-- - case Private::Birthday: - if ( a.birthday().isValid() ) { - QDate date =3D a.birthday().date(); - QString key; - key.sprintf( "%02d-%02d", date.month(), date.day() ); - return key; - } else - return QLatin1String( "00-00" ); - default: - return value( a ).toLower(); - } -} - -bool Field::isCustom() -{ - return d->fieldId() =3D=3D Private::CustomField; -} - -Field::List Field::allFields() -{ - if ( Private::mAllFields.isEmpty() ) { - --CREATEFIELDS-- - } - - return Private::mAllFields; -} - -Field::List Field::defaultFields() -{ - if ( Private::mDefaultFields.isEmpty() ) { - createDefaultField( Private::FormattedName ); - createDefaultField( Private::Email ); - } - - return Private::mDefaultFields; -} - -void Field::createField( int id, int category ) -{ - Private::mAllFields.append( new Field( new Private( id, category ) ) ); -} - -void Field::createDefaultField( int id, int category ) -{ - Private::mDefaultFields.append( new Field( new Private( id, category ) )= ); -} - -void Field::deleteFields() -{ - Field::List::ConstIterator it; - - for ( it =3D Private::mAllFields.constBegin(); it !=3D Private::mAllFiel= ds.constEnd(); ++it ) { - delete ( *it ); - } - Private::mAllFields.clear(); - - for ( it =3D Private::mDefaultFields.constBegin(); it !=3D Private::mDef= aultFields.constEnd(); ++it ) { - delete ( *it ); - } - Private::mDefaultFields.clear(); - - for ( it =3D Private::mCustomFields.constBegin(); it !=3D Private::mCust= omFields.constEnd(); ++it ) { - delete ( *it ); - } - Private::mCustomFields.clear(); -} - -void Field::saveFields( const QString &identifier, - const Field::List &fields ) -{ - KConfigGroup cg( KGlobal::config(), "KABCFields" ); - - saveFields( cg, identifier, fields ); -} - -void Field::saveFields( KConfigGroup &cfg, const QString &identifier, - const Field::List &fields ) -{ - QList fieldIds; - - int custom =3D 0; - Field::List::ConstIterator it; - for ( it =3D fields.begin(); it !=3D fields.end(); ++it ) { - fieldIds.append( ( *it )->d->fieldId() ); - if ( ( *it )->isCustom() ) { - QStringList customEntry; - customEntry << ( *it )->d->label(); - customEntry << ( *it )->d->key(); - customEntry << ( *it )->d->app(); - cfg.writeEntry( QLatin1String( "KABC_CustomEntry_" ) + identifier + = QLatin1Char( '_' ) + - QString::number( custom++ ), customEntry ); - } - } - - cfg.writeEntry( identifier, fieldIds ); -} - -Field::List Field::restoreFields( const QString &identifier ) -{ - KConfigGroup cg( KGlobal::config(), "KABCFields" ); - - return restoreFields( cg, identifier ); -} - -Field::List Field::restoreFields( const KConfigGroup &cfg, const QString &= identifier ) -{ - const QList fieldIds =3D cfg.readEntry( identifier,QList() ); - - Field::List fields; - - int custom =3D 0; - QList::ConstIterator it; - for ( it =3D fieldIds.begin(); it !=3D fieldIds.end(); ++it ) { - Private *f =3D 0; - if ( ( *it ) =3D=3D Private::CustomField ) { - QStringList customEntry =3D cfg.readEntry( QLatin1String( "KABC_Cust= omEntry_" ) + - identifier + QLatin1Char( '= _' ) + - QString::number( custom++ )= ,QStringList() ); - f =3D new Private( *it, CustomCategory, customEntry[ 0 ], - customEntry[ 1 ], customEntry[ 2 ] ); - } else { - f =3D new Private( *it ); - } - fields.append( new Field( f ) ); - } - - return fields; -} - -bool Field::equals( Field *field ) -{ - bool sameId =3D ( d->fieldId() =3D=3D field->d->fieldId() ); - - if ( !sameId ) return false; - - if ( d->fieldId() !=3D Private::CustomField ) return true; - - return d->key() =3D=3D field->d->key(); -} - -Field *Field::createCustomField( const QString &label, int category, - const QString &key, const QString &app ) -{ - Field *field =3D new Field( new Private( Private::CustomField, - category | CustomCategory, - label, key, app ) ); - Private::mCustomFields.append( field ); - - return field; -} diff --git a/kabc/scripts/makeaddressee b/kabc/scripts/makeaddressee deleted file mode 100755 index d8c8f5b..0000000 --- a/kabc/scripts/makeaddressee +++ /dev/null @@ -1,224 +0,0 @@ -#!/usr/bin/perl -use Cwd; -use File::Basename; - -my $srcdir; -my $builddir =3D cwd(); -$srcdir =3D dirname($0) || die "Can't determine \$srcdir."; -chomp $srcdir; - -chdir $srcdir; - -if (!open( ENTRIES, "$srcdir/entrylist" ) ) { - print "Can't open $srcdir/entrylist\n"; - exit 1; -} - - while() { - if (/^#/) { next; } - chop; - @entries =3D split /,/; - if (!/^.+,(\w+),(\w+)/) { next; } - push @entryCtrl, @entries[0]; - push @entryRealNames, @entries[1]; - push @entryComments, @entries[2]; - push @entryTypes, @entries[3]; - push @entryNames, @entries[4]; - push @entryCategory, @entries[5]; - push @entryDebug, @entries[6]; - } - -close ENTRIES; - -if (!open( H_IN, "$srcdir/addressee.src.h" ) ) { - print "Can't open $srcdir/addressee.src.h\n"; - exit 1; -} -if (!open( H_OUT, ">$builddir/../addressee.h" ) ) { - print "Can't open addressee.h\n"; - exit 1; -} - print H_OUT "/*** Warning! This file has been generated by the script ma= keaddressee ***/\n"; - - while( ) { - if (/--DECLARATIONS--/) { - for( $i=3D0; $i<@entryNames; ++$i ) { - if ( $entryCtrl[$i] =3D~ /A/ ) { - print H_OUT " /**\n"; - print H_OUT " Set $entryRealNames[$i].\n"; - print H_OUT " */\n"; - print H_OUT " void set" . ucfirst($entryNames[$i]); - print H_OUT "( const $entryTypes[$i] &$entryNames[$i] );\n"; - - print H_OUT " /**\n"; - print H_OUT " Return $entryRealNames[$i].\n"; - print H_OUT " */\n"; - print H_OUT " $entryTypes[$i] $entryNames[$i]() const;\n"; - } - - if ( $entryCtrl[$i] !~ /L/ ) { next; } - print H_OUT " /**\n"; - print H_OUT " Return translated label for $entryNames[$i] fie= ld.\n"; - print H_OUT " */\n"; - print H_OUT " static QString $entryNames[$i]Label();\n\n"; - } - } else { - print H_OUT; - } - } - -close H_OUT; -close H_IN; - -if (!open( CPP_IN, "$srcdir/addressee.src.cpp" ) ) { - print "Can't open $srcdir/addressee.src.cpp\n"; - exit 1; -} -if (!open( CPP_OUT, ">$builddir/../addressee.cpp" ) ) { - print "Can't open addressee.cpp\n"; - exit 1; -} - print CPP_OUT "/*** Warning! This file has been generated by the script = makeaddressee ***/\n"; - - while( ) { - if (/--VARIABLES--/) { - for( $i=3D0; $i<@entryNames; ++$i ) { - if ( $entryCtrl[$i] !~ /A/ ) { next; } - print CPP_OUT " $entryTypes[$i] m".ucfirst($entryNames[$i]).";\= n"; - } - } elsif (/--VARIABLES_ASSIGNMENT--/) { - for( $i=3D0; $i<@entryNames; ++$i ) { - if ( $entryCtrl[$i] !~ /A/ ) { next; } - print CPP_OUT " m".ucfirst($entryNames[$i])." =3D other.m".uc= first($entryNames[$i]).";\n"; - } - } elsif (/--DEFINITIONS--/) { - for( $i=3D0; $i<@entryNames; ++$i ) { - if ( $entryCtrl[$i] =3D~ /A/ ) { - print CPP_OUT "void Addressee::set" . ucfirst($entryNames[$i]); - print CPP_OUT "( const $entryTypes[$i] &$entryNames[$i] )\n{\n"; - print CPP_OUT " if ( $entryNames[$i] =3D=3D d->m".ucfirst($entr= yNames[$i])." ) return;\n"; - print CPP_OUT " d->mEmpty =3D false;\n"; - print CPP_OUT " d->m".ucfirst($entryNames[$i])." =3D $entryName= s[$i];\n}\n\n"; - print CPP_OUT "$entryTypes[$i] Addressee::$entryNames[$i]() cons= t\n{\n"; - print CPP_OUT " return d->m".ucfirst($entryNames[$i]).";\n}\n\n= "; - } - - if ( $entryCtrl[$i] !~ /L/ ) { next; } - @labelwords =3D split ' ', $entryRealNames[$i]; - for( $j=3D0; $j < @labelwords; ++$j ) { - $labelwords[$j] =3D ucfirst $labelwords[$j]; - } - $label =3D join ' ', @labelwords; - print CPP_OUT "QString Addressee::$entryNames[$i]Label()\n{\n"; - if ( $entryComments[$i] ) { - print CPP_OUT " return i18nc(\"$entryComments[$i]\",\"$label\")= ;\n"; - } else { - print CPP_OUT " return i18n(\"$label\");\n"; - } - print CPP_OUT "}\n\n\n"; - } - } elsif (/--EQUALSTEST--/) { - for( $i=3D0; $i<@entryNames; ++$i ) { - if ( $entryCtrl[$i] =3D~ /E/ ) { - if ( $entryNames[$i] !~ "revision" ) { - if ( $entryTypes[$i] =3D~ "QString" ) { - print CPP_OUT " if ( d->m".ucfirst($entryNames[$i])." !=3D = a.d->m".ucfirst($entryNames[$i])." &&\n"; - print CPP_OUT " !( d->m".ucfirst($entryNames[$i]).".isEm= pty() && a.d->m".ucfirst($entryNames[$i]).".isEmpty() ) ) {\n"; - print CPP_OUT " kDebug(5700) << \"$entryNames[$i] differs= \";\n"; - print CPP_OUT " return false;\n"; - print CPP_OUT " }\n"; - } else { - print CPP_OUT " if ( d->m".ucfirst($entryNames[$i])." !=3D = a.d->m".ucfirst($entryNames[$i])." ) {\n"; - print CPP_OUT " kDebug(5700) << \"$entryNames[$i] differs= \";\n"; - print CPP_OUT " return false;\n"; - print CPP_OUT " }\n"; - } - } - } - } - } elsif (/--STREAMOUT--/) { - for( $i=3D0; $i<@entryNames; ++$i ) { - if ( $entryCtrl[$i] =3D~ /A/ ) { - print CPP_OUT " s << a.d->m".ucfirst($entryNames[$i]).";\n"; - } - } - } elsif (/--STREAMIN--/) { - for( $i=3D0; $i<@entryNames; ++$i ) { - if ( $entryCtrl[$i] =3D~ /A/ ) { - print CPP_OUT " s >> a.d->m".ucfirst($entryNames[$i]).";\n"; - } - } - } elsif (/--DEBUG--/) { - for( $i=3D0; $i<@entryNames; ++$i ) { - if ( $entryCtrl[$i] !~ /A/ ) { next; } - print CPP_OUT " str +=3D QString::fromLatin1( \" " . ucfirst($en= tryNames[$i]); - print CPP_OUT ": %1\\n\" ).arg( $entryNames[$i]()$entryDebug[$i] )= ;\n"; - } - } else { - print CPP_OUT; - } - } - -close CPP_OUT; -close CPP_IN; - -if (!open( CPP_IN, "$srcdir/field.src.cpp" ) ) { - print "Can't open $srcdir/field.src.cpp\n"; - exit 1; -} -if (!open( CPP_OUT, ">$builddir/../field.cpp" ) ) { - print "Can't open field.cpp\n"; - exit 1; -} - print CPP_OUT "/*** Warning! This file has been generated by the script = makeaddressee ***/\n"; - - while( ) { - if (/--ENUMS--/) { - $first =3D 1; - for( $i=3D0; $i<@entryNames; ++$i ) { - if ( $entryCtrl[$i] !~ /F/ ) { next; } - if ( $first ) { $first =3D 0; } - else { print CPP_OUT ",\n"; } - print CPP_OUT " " . ucfirst($entryNames[$i]); - } - print CPP_OUT "\n"; - } elsif (/--CASELABEL--/) { - for( $i=3D0; $i<@entryNames; ++$i ) { - if ( $entryCtrl[$i] !~ /F/ ) { next; } - if ( $entryCtrl[$i] !~ /L/ ) { next; } - print CPP_OUT " case Private::" . ucfirst($entryNames[$i]) . ":= \n"; - print CPP_OUT " return Addressee::$entryNames[$i]Label();\n"; - } - } elsif (/--CASEVALUE--/) { - for( $i=3D0; $i<@entryNames; ++$i ) { - if ( $entryCtrl[$i] !~ /A/ ) { next; } - if ( $entryCtrl[$i] !~ /F/ ) { next; } - if ( $entryTypes[$i] ne "QString" ) { next; } - print CPP_OUT " case Private::" . ucfirst($entryNames[$i]) . ":= \n"; - print CPP_OUT " return a.$entryNames[$i]();\n"; - } - } elsif (/--CASESETVALUE--/) { - for( $i=3D0; $i<@entryNames; ++$i ) { - if ( $entryCtrl[$i] !~ /A/ ) { next; } - if ( $entryCtrl[$i] !~ /F/ ) { next; } - if ( $entryTypes[$i] ne "QString" ) { next; } - print CPP_OUT " case Private::" . ucfirst($entryNames[$i]) . ":= \n"; - print CPP_OUT " a.set" . ucfirst($entryNames[$i]) . "( value = );\n"; - print CPP_OUT " return true;\n"; - } - } elsif (/--CREATEFIELDS--/) { - for( $i=3D0; $i<@entryNames; ++$i ) { - if ( $entryCtrl[$i] !~ /F/ ) { next; } - print CPP_OUT " createField( Private::" . ucfirst($entryNames[$= i]); - if ( $entryCategory[$i] ) { - print CPP_OUT ", $entryCategory[$i]"; - } - print CPP_OUT " );\n"; - } - } else { - print CPP_OUT; - } - } - -close CPP_OUT; -close CPP_IN;