23#include <QtCore/QList>
24#include <QtCore/QRegExp>
25#include <QtCore/QSharedData>
26#include <QtCore/QUuid>
30#include <klocalizedstring.h>
32#include "addresseehelper.h"
34#ifndef KDEPIM_NO_KRESOURCES
43static bool matchBinaryPattern(
int value,
int pattern );
46static bool listEquals(
const QList<L>&,
const QList<L>& );
47static bool listEquals(
const QStringList&,
const QStringList& );
49class Addressee::Private :
public QSharedData
53 : mUid( QUuid::createUuid().
toString().mid(1, 36) ),
54#ifndef KDEPIM_NO_KRESOURCES
57 mEmpty( true ), mChanged( false )
61 Private(
const Private &other )
62 : QSharedData( other )
63#ifndef KDEPIM_NO_KRESOURCES
69 mFormattedName = other.mFormattedName;
70 mFamilyName = other.mFamilyName;
71 mGivenName = other.mGivenName;
72 mAdditionalName = other.mAdditionalName;
73 mPrefix = other.mPrefix;
74 mSuffix = other.mSuffix;
75 mNickName = other.mNickName;
76 mBirthday = other.mBirthday;
77 mMailer = other.mMailer;
78 mTimeZone = other.mTimeZone;
80 mTitle = other.mTitle;
82 mOrganization = other.mOrganization;
83 mDepartment = other.mDepartment;
85 mProductId = other.mProductId;
86 mRevision = other.mRevision;
87 mSortString = other.mSortString;
89 mSecrecy = other.mSecrecy;
91 mPhoto = other.mPhoto;
92 mSound = other.mSound;
94 mPhoneNumbers = other.mPhoneNumbers;
95 mAddresses = other.mAddresses;
97 mEmails = other.mEmails;
98 mLangs = other.mLangs;
99 mGender = other.mGender;
100 mCategories = other.mCategories;
101 mCustomFields = other.mCustomFields;
102 mCalendarUrl = other.mCalendarUrl;
103 mSoundListExtra = other.mSoundListExtra;
104 mPhotoListExtra = other.mPhotoListExtra;
105 mLogoListExtra = other.mLogoListExtra;
106 mUrlListExtra = other.mUrlListExtra;
107 mSources = other.mSources;
108 mMembers = other.mMembers;
109 mRelationShips = other.mRelationShips;
111#ifndef KDEPIM_NO_KRESOURCES
112 mResource = other.mResource;
114 mEmpty = other.mEmpty;
115 mChanged = other.mChanged;
124 QString mFormattedName;
127 QString mAdditionalName;
137 QString mOrganization;
156 QStringList mCategories;
157 QMap<QString, QString> mCustomFields;
158 CalendarUrl::List mCalendarUrl;
160 Sound::List mSoundListExtra;
161 Picture::List mPhotoListExtra;
162 Picture::List mLogoListExtra;
163 QList<KUrl> mUrlListExtra;
164 QStringList mMembers;
165 QStringList mRelationShips;
166 QList<KUrl> mSources;
168#ifndef KDEPIM_NO_KRESOURCES
196 if (
this != &other )
204 if ( d->mUid != addressee.d->mUid ) {
205 kDebug() <<
"uid differs";
209 if ( d->mName != addressee.d->mName &&
210 !( d->mName.isEmpty() && addressee.d->mName.isEmpty() ) ) {
211 kDebug(5700) <<
"name differs";
215 if ( d->mFormattedName != addressee.d->mFormattedName &&
216 !( d->mFormattedName.isEmpty() && addressee.d->mFormattedName.isEmpty() ) ) {
217 kDebug(5700) <<
"formattedName differs";
221 if ( d->mFamilyName != addressee.d->mFamilyName &&
222 !( d->mFamilyName.isEmpty() && addressee.d->mFamilyName.isEmpty() ) ) {
223 kDebug(5700) <<
"familyName differs";
227 if ( d->mGivenName != addressee.d->mGivenName &&
228 !( d->mGivenName.isEmpty() && addressee.d->mGivenName.isEmpty() ) ) {
229 kDebug(5700) <<
"givenName differs";
233 if ( d->mAdditionalName != addressee.d->mAdditionalName &&
234 !( d->mAdditionalName.isEmpty() && addressee.d->mAdditionalName.isEmpty() ) ) {
235 kDebug(5700) <<
"additionalName differs";
239 if ( d->mPrefix != addressee.d->mPrefix &&
240 !( d->mPrefix.isEmpty() && addressee.d->mPrefix.isEmpty() ) ) {
241 kDebug(5700) <<
"prefix differs";
245 if ( d->mSuffix != addressee.d->mSuffix &&
246 !( d->mSuffix.isEmpty() && addressee.d->mSuffix.isEmpty() ) ) {
247 kDebug(5700) <<
"suffix differs";
251 if ( d->mNickName != addressee.d->mNickName &&
252 !( d->mNickName.isEmpty() && addressee.d->mNickName.isEmpty() ) ) {
253 kDebug(5700) <<
"nickName differs";
257 if ( d->mBirthday != addressee.d->mBirthday ) {
258 kDebug(5700) <<
"birthday differs";
262 if ( d->mMailer != addressee.d->mMailer &&
263 !( d->mMailer.isEmpty() && addressee.d->mMailer.isEmpty() ) ) {
264 kDebug(5700) <<
"mailer differs";
268 if ( d->mTimeZone != addressee.d->mTimeZone ) {
269 kDebug(5700) <<
"timeZone differs";
273 if ( d->mGeo != addressee.d->mGeo ) {
274 kDebug(5700) <<
"geo differs";
278 if ( d->mTitle != addressee.d->mTitle &&
279 !( d->mTitle.isEmpty() && addressee.d->mTitle.isEmpty() ) ) {
280 kDebug(5700) <<
"title differs";
284 if ( d->mRole != addressee.d->mRole &&
285 !( d->mRole.isEmpty() && addressee.d->mRole.isEmpty() ) ) {
286 kDebug(5700) <<
"role differs";
290 if ( d->mOrganization != addressee.d->mOrganization &&
291 !( d->mOrganization.isEmpty() && addressee.d->mOrganization.isEmpty() ) ) {
292 kDebug(5700) <<
"organization differs";
296 if ( d->mDepartment != addressee.d->mDepartment &&
297 !( d->mDepartment.isEmpty() && addressee.d->mDepartment.isEmpty() ) ) {
298 kDebug(5700) <<
"department differs";
302 if ( d->mNote != addressee.d->mNote &&
303 !( d->mNote.isEmpty() && addressee.d->mNote.isEmpty() ) ) {
304 kDebug(5700) <<
"note differs";
308 if ( d->mProductId != addressee.d->mProductId &&
309 !( d->mProductId.isEmpty() && addressee.d->mProductId.isEmpty() ) ) {
310 kDebug(5700) <<
"productId differs";
314 if ( d->mSortString != addressee.d->mSortString &&
315 !( d->mSortString.isEmpty() && addressee.d->mSortString.isEmpty() ) ) {
316 kDebug(5700) <<
"sortString differs";
320 if ( d->mSecrecy != addressee.d->mSecrecy ) {
321 kDebug(5700) <<
"secrecy differs";
325 if ( d->mLogo != addressee.d->mLogo ) {
326 kDebug(5700) <<
"logo differs";
330 if ( d->mPhoto != addressee.d->mPhoto ) {
331 kDebug(5700) <<
"photo differs";
335 if ( d->mSound != addressee.d->mSound ) {
336 kDebug(5700) <<
"sound differs";
340 if ( ( d->mUrl.isValid() || addressee.d->mUrl.isValid() ) &&
341 ( d->mUrl != addressee.d->mUrl ) ) {
342 kDebug() <<
"url differs";
346 if ( !listEquals( d->mPhoneNumbers, addressee.d->mPhoneNumbers ) ) {
347 kDebug() <<
"phoneNumbers differs";
351 if ( !listEquals( d->mAddresses, addressee.d->mAddresses ) ) {
352 kDebug() <<
"addresses differs";
356 if ( !listEquals( d->mKeys, addressee.d->mKeys ) ) {
357 kDebug() <<
"keys differs";
361 if ( !listEquals( d->mEmails, addressee.d->mEmails ) ) {
362 kDebug() <<
"emails differs";
366 if ( !listEquals( d->mCategories, addressee.d->mCategories ) ) {
367 kDebug() <<
"categories differs";
371 if ( d->mCustomFields != addressee.d->mCustomFields ) {
372 kDebug() <<
"custom differs";
376 if (d->mLangs != addressee.d->mLangs) {
377 kDebug() <<
"langs differs";
380 if (d->mGender != addressee.d->mGender) {
381 kDebug() <<
"gender differs";
384 if ( d->mKind != addressee.d->mKind ) {
385 kDebug() <<
"kind differs";
388 if ( !listEquals( d->mCalendarUrl, addressee.d->mCalendarUrl ) ) {
389 kDebug() <<
"calendarUrl differs";
392 if ( !listEquals( d->mSoundListExtra, addressee.d->mSoundListExtra ) ) {
393 kDebug() <<
"Extra sound differs";
396 if ( !listEquals( d->mPhotoListExtra, addressee.d->mPhotoListExtra ) ) {
397 kDebug() <<
"Extra photo differs";
400 if ( !listEquals( d->mLogoListExtra, addressee.d->mLogoListExtra ) ) {
401 kDebug() <<
"Extra logo differs";
404 if ( !listEquals( d->mUrlListExtra, addressee.d->mUrlListExtra ) ) {
405 kDebug() <<
"Extra url differs";
408 if (!listEquals( d->mMembers, addressee.d->mMembers)) {
409 kDebug() <<
"Members differs";
412 if (!listEquals( d->mRelationShips, addressee.d->mRelationShips)) {
413 kDebug() <<
"RelationShips differs";
416 if (!listEquals( d->mSources, addressee.d->mSources)) {
417 kDebug() <<
"Sources differs";
425 return !( a == *this );
449 return i18n(
"Unique Identifier" );
454 if (
name == d->mName )
468 return i18n(
"Name" );
471void Addressee::setKind(
const QString &kind )
473 if ( kind == d->mKind )
480void Addressee::insertCalendarUrl(
const CalendarUrl &calendarUrl)
484 if (calendarUrl.isValid()) {
485 d->mCalendarUrl.append(calendarUrl);
489void Addressee::insertExtraSound(
const Sound &sound)
491 d->mSoundListExtra.append(
sound);
494void Addressee::setExtraSoundList(
const KABC::Sound::List &soundList)
496 d->mSoundListExtra = soundList;
499KABC::Sound::List Addressee::extraSoundList()
const
501 return d->mSoundListExtra;
504void Addressee::insertExtraPhoto(
const Picture &picture)
506 d->mPhotoListExtra.append(picture);
509void Addressee::setExtraPhotoList(
const Picture::List &pictureList)
511 d->mPhotoListExtra = pictureList;
514Picture::List Addressee::extraPhotoList()
const
516 return d->mPhotoListExtra;
519void Addressee::insertExtraLogo(
const Picture &logo)
521 d->mLogoListExtra.append(
logo);
524void Addressee::setExtraLogoList(
const Picture::List &logoList)
526 d->mLogoListExtra = logoList;
529Picture::List Addressee::extraLogoList()
const
531 return d->mLogoListExtra;
534void Addressee::insertExtraUrl(
const KUrl &url)
536 d->mUrlListExtra.append(
url);
539void Addressee::setExtraUrlList(
const QList<KUrl> &urlList)
541 d->mUrlListExtra = urlList;
544QList<KUrl> Addressee::extraUrlList()
const
546 return d->mUrlListExtra;
549void Addressee::insertSourceUrl(
const KUrl &url)
551 d->mSources.append(
url);
554void Addressee::setSourcesUrlList(
const QList<KUrl> &urlList)
556 d->mSources = urlList;
559QList<KUrl> Addressee::sourcesUrlList()
const
565QString Addressee::kind()
const
581 return d->mFormattedName;
586 return i18n(
"Formatted Name" );
601 return d->mFamilyName;
606 return i18n(
"Family Name" );
621 return d->mGivenName;
626 return i18n(
"Given Name" );
641 return d->mAdditionalName;
646 return i18n(
"Additional Names" );
652 if (
prefix == d->mPrefix )
666 return i18n(
"Honorific Prefixes" );
672 if (
suffix == d->mSuffix )
686 return i18n(
"Honorific Suffixes" );
706 return i18n(
"Nick Name" );
726 return i18n(
"Birthday" );
732 return i18n(
"Home Address Street" );
738 return i18n(
"Home Address Post Office Box" );
744 return i18n(
"Home Address City" );
750 return i18n(
"Home Address State" );
756 return i18n(
"Home Address Zip Code" );
762 return i18n(
"Home Address Country" );
768 return i18n(
"Home Address Label" );
774 return i18n(
"Business Address Street" );
780 return i18n(
"Business Address Post Office Box" );
786 return i18n(
"Business Address City" );
792 return i18n(
"Business Address State" );
798 return i18n(
"Business Address Zip Code" );
804 return i18n(
"Business Address Country" );
810 return i18n(
"Business Address Label" );
816 return i18n(
"Home Phone" );
822 return i18n(
"Business Phone" );
828 return i18n(
"Mobile Phone" );
834 return i18n(
"Home Fax" );
840 return i18n(
"Business Fax" );
846 return i18n(
"Car Phone" );
852 return i18n(
"ISDN" );
858 return i18n(
"Pager" );
864 return i18n(
"Email Address" );
870 if (
mailer == d->mMailer )
884 return i18n(
"Mail Client" );
904 return i18n(
"Time Zone" );
910 if (
geo == d->mGeo )
924 return i18n(
"Geographic Position" );
930 if (
title == d->mTitle )
944 return i18nc(
"a person's title",
"Title" );
950 if (
role == d->mRole )
964 return i18nc(
"of a person in an organization",
"Role" );
979 return d->mOrganization;
984 return i18n(
"Organization" );
999 return d->mDepartment;
1004 return i18n(
"Department" );
1010 if (
note == d->mNote )
1024 return i18n(
"Note" );
1039 return d->mProductId;
1044 return i18n(
"Product Identifier" );
1059 return d->mRevision;
1064 return i18n(
"Revision Date" );
1079 return d->mSortString;
1084 return i18n(
"Sort String" );
1090 if (
url == d->mUrl )
1104 return i18n(
"Homepage" );
1124 return i18n(
"Security Class" );
1130 if (
logo == d->mLogo )
1144 return i18n(
"Logo" );
1150 if (
photo == d->mPhoto )
1164 return i18n(
"Photo" );
1170 if (
sound == d->mSound )
1184 return i18n(
"Sound" );
1192 if ( str.length() > 1 &&
1193 s[ 0 ] == QLatin1Char(
'"' ) &&
1194 s[ s.length() - 1 ] == QLatin1Char(
'"' ) ) {
1195 str = s.mid( 1, s.length() - 2 );
1208 if ( str.isEmpty() )
1211 static QString spaceStr = QString::fromLatin1(
" " );
1212 static QString emptyStr = QString::fromLatin1(
"" );
1215 int i = str.indexOf( QLatin1Char(
',' ) );
1217 QStringList parts = str.split( spaceStr );
1219 int rightOffset = parts.count() - 1;
1222 while ( rightOffset >= 0 ) {
1224 suffix.prepend( parts[ rightOffset ] + (
suffix.isEmpty() ? emptyStr : spaceStr ) );
1231 if ( rightOffset < 0 )
1234 if ( rightOffset - 1 >= 0 && helper->
containsPrefix( parts[ rightOffset - 1 ].toLower() ) ) {
1235 setFamilyName( parts[ rightOffset - 1 ] + spaceStr + parts[ rightOffset ] );
1245 while ( leftOffset < rightOffset ) {
1247 prefix.append( (
prefix.isEmpty() ? emptyStr : spaceStr ) + parts[ leftOffset ] );
1254 if ( leftOffset < rightOffset ) {
1260 while ( leftOffset < rightOffset ) {
1266 QString part1 = str.left( i );
1267 QString part2 = str.mid( i + 1 );
1269 QStringList parts = part1.split( spaceStr );
1271 int rightOffset = parts.count() - 1;
1273 if ( parts.count() > 0 ) {
1276 while ( rightOffset >= 0 ) {
1278 suffix.prepend( parts[ rightOffset ] + (
suffix.isEmpty() ? emptyStr : spaceStr ) );
1285 if ( rightOffset - 1 >= 0 && helper->
containsPrefix( parts[ rightOffset - 1 ].toLower() ) ) {
1286 setFamilyName( parts[ rightOffset - 1 ] + spaceStr + parts[ rightOffset ] );
1292 while ( leftOffset < rightOffset ) {
1294 prefix.append( (
prefix.isEmpty() ? emptyStr : spaceStr ) + parts[ leftOffset ] );
1305 parts = part2.split( spaceStr );
1308 rightOffset = parts.count();
1310 if ( parts.count() > 0 ) {
1313 while ( leftOffset < rightOffset ) {
1315 prefix.append( (
prefix.isEmpty() ? emptyStr : spaceStr ) + parts[ leftOffset ] );
1322 if ( leftOffset < rightOffset ) {
1328 while ( leftOffset < rightOffset ) {
1359 const QString
name =
prefix() + QLatin1Char(
' ' ) +
1365 return name.simplified();
1371 if ( email.isNull() ) {
1376 if ( e.isEmpty() )
return QString();
1382 QRegExp needQuotes( QLatin1String(
"[^ 0-9A-Za-z\\x0080-\\xFFFF]" ) );
1383 if (
realName().indexOf( needQuotes ) != -1 ) {
1385 name.replace( QLatin1String(
"\"" ), QLatin1String(
"\\\"" ) );
1386 text = QLatin1String(
"\"" ) +
name + QLatin1String(
"\" <" ) + e + QLatin1Char(
'>' );
1388 text =
realName() + QLatin1String(
" <" ) + e + QLatin1Char(
'>' );
1394void Addressee::insertEmail(
const QString &email,
bool preferred,
const QMap<QString, QStringList> ¶m )
1396 if ( email.simplified().isEmpty() )
1399 for (
int i = 0; i < d->mEmails.size(); ++i) {
1400 if (d->mEmails.at(i).mail() == email) {
1401 if (!preferred || i == 0) {
1404 Email tempMail = d->mEmails.takeAt(i);
1405 d->mEmails.prepend( tempMail );
1411 mail.setParameters(param);
1414 d->mEmails.prepend( mail );
1416 d->mEmails.append( mail );
1422 insertEmail(email, preferred, QMap<QString, QStringList>());
1427 for (
int i = 0; i < d->mEmails.size(); ++i) {
1428 if (d->mEmails.at(i).mail() == email) {
1429 d->mEmails.removeAt(i);
1436 if ( d->mEmails.count() == 0 )
1439 return d->mEmails.first().mail();
1445 const int numberOfEmail(d->mEmails.size());
1446 for (
int i = 0; i < numberOfEmail; ++i) {
1447 list << d->mEmails.at(i).mail();
1453Email::List Addressee::emailList()
const
1458void Addressee::setEmailList(
const Email::List &list)
1467 for (
int i = 0; i <
emails.size(); ++i) {
1468 d->mEmails.append(Email(
emails.at(i)));
1473void Addressee::removeLang(
const QString &language )
1475 for (
int i = 0; i < d->mLangs.size(); ++i) {
1476 if (d->mLangs.at(i).language() == language) {
1477 d->mLangs.removeAt(i);
1482void Addressee::insertLang(
const Lang &language )
1484 const QString languageStr = language.language();
1485 if (languageStr.simplified().isEmpty())
1489 Lang::List::Iterator it;
1490 Lang::List::Iterator end(d->mLangs.end());
1491 for ( it = d->mLangs.begin(); it != end; ++it ) {
1492 if ( ( *it ).language() == languageStr ) {
1493 (*it).setParameters(language.parameters());
1497 d->mLangs.append( language );
1500void Addressee::setLangs(
const Lang::List &langs)
1506Lang::List Addressee::langs()
const
1511void Addressee::setGender(
const Gender &gender)
1513 if ( gender == d->mGender )
1517 d->mGender = gender;
1520Gender Addressee::gender()
const
1529 PhoneNumber::List::Iterator it;
1530 for ( it = d->mPhoneNumbers.begin(); it != d->mPhoneNumbers.end(); ++it ) {
1542 PhoneNumber::List::Iterator it;
1543 for ( it = d->mPhoneNumbers.begin(); it != d->mPhoneNumbers.end(); ++it ) {
1545 d->mPhoneNumbers.erase( it );
1554 PhoneNumber::List::ConstIterator it;
1555 for ( it = d->mPhoneNumbers.constBegin(); it != d->mPhoneNumbers.constEnd(); ++it ) {
1556 if ( matchBinaryPattern( ( *it ).type(), type ) ) {
1570 return d->mPhoneNumbers;
1577 PhoneNumber::List::ConstIterator it;
1578 PhoneNumber::List::ConstIterator end( d->mPhoneNumbers.constEnd() );
1579 for ( it = d->mPhoneNumbers.constBegin(); it != end; ++it ) {
1580 if ( matchBinaryPattern( ( *it ).type(), type ) ) {
1589 PhoneNumber::List::ConstIterator it;
1590 PhoneNumber::List::ConstIterator end( d->mPhoneNumbers.constEnd() );
1591 for ( it = d->mPhoneNumbers.constBegin(); it != end; ++it ) {
1592 if ( ( *it ).id() ==
id ) {
1603 Key::List::Iterator it;
1604 for ( it = d->mKeys.begin(); it != d->mKeys.end(); ++it ) {
1605 if ( ( *it ).id() ==
key.
id() ) {
1610 d->mKeys.append(
key );
1615 Key::List::Iterator it;
1616 for ( it = d->mKeys.begin(); it != d->mKeys.end(); ++it ) {
1617 if ( ( *it ).id() ==
key.
id() ) {
1618 d->mKeys.removeAll(
key );
1626 Key::List::ConstIterator it;
1627 Key::List::ConstIterator end( d->mKeys.constEnd() );
1628 for ( it = d->mKeys.constBegin(); it != end; ++it ) {
1629 if ( ( *it ).type() == type ) {
1631 if ( customTypeString.isEmpty() ) {
1634 if ( ( *it ).customTypeString() == customTypeString )
1642 return Key( QString(), type );
1660 Key::List::ConstIterator it;
1661 Key::List::ConstIterator end( d->mKeys.constEnd() );
1662 for ( it = d->mKeys.constBegin(); it != end; ++it ) {
1663 if ( ( *it ).type() == type ) {
1665 if ( customTypeString.isEmpty() ) {
1668 if ( ( *it ).customTypeString() == customTypeString )
1681 Key::List::ConstIterator it;
1682 Key::List::ConstIterator end( d->mKeys.constEnd() );
1683 for ( it = d->mKeys.constBegin(); it != end; ++it ) {
1684 if ( ( *it ).id() ==
id ) {
1695 str += QLatin1String(
"Addressee {\n" );
1696 str += QString::fromLatin1(
" Uid: %1\n" ).arg(
uid() );
1698 str += QString::fromLatin1(
" Name: %1\n" ).arg(
name() );
1699 str += QString::fromLatin1(
" FormattedName: %1\n" ).arg(
formattedName() );
1700 str += QString::fromLatin1(
" FamilyName: %1\n" ).arg(
familyName() );
1701 str += QString::fromLatin1(
" GivenName: %1\n" ).arg(
givenName() );
1702 str += QString::fromLatin1(
" AdditionalName: %1\n" ).arg(
additionalName() );
1703 str += QString::fromLatin1(
" Prefix: %1\n" ).arg(
prefix() );
1704 str += QString::fromLatin1(
" Suffix: %1\n" ).arg(
suffix() );
1705 str += QString::fromLatin1(
" NickName: %1\n" ).arg(
nickName() );
1706 str += QString::fromLatin1(
" Birthday: %1\n" ).arg(
birthday().
toString() );
1707 str += QString::fromLatin1(
" Mailer: %1\n" ).arg(
mailer() );
1708 str += QString::fromLatin1(
" TimeZone: %1\n" ).arg(
timeZone().
toString() );
1709 str += QString::fromLatin1(
" Geo: %1\n" ).arg(
geo().
toString() );
1710 str += QString::fromLatin1(
" Title: %1\n" ).arg(
title() );
1711 str += QString::fromLatin1(
" Role: %1\n" ).arg(
role() );
1712 str += QString::fromLatin1(
" Organization: %1\n" ).arg(
organization() );
1713 str += QString::fromLatin1(
" Department: %1\n" ).arg(
department() );
1714 str += QString::fromLatin1(
" Note: %1\n" ).arg(
note() );
1715 str += QString::fromLatin1(
" ProductId: %1\n" ).arg(
productId() );
1716 str += QString::fromLatin1(
" Revision: %1\n" ).arg(
revision().
toString() );
1717 str += QString::fromLatin1(
" SortString: %1\n" ).arg(
sortString() );
1718 str += QString::fromLatin1(
" Url: %1\n" ).arg(
url().
url() );
1719 str += QString::fromLatin1(
" Secrecy: %1\n" ).arg(
secrecy().
toString() );
1720 str += QString::fromLatin1(
" Logo: %1\n" ).arg(
logo().
toString() );
1721 str += QString::fromLatin1(
" Photo: %1\n" ).arg(
photo().
toString() );
1722 str += QString::fromLatin1(
" Sound: %1\n" ).arg(
sound().
toString() );
1723 str += QString::fromLatin1(
" Gender: %1\n" ).arg( gender().
toString() );
1724 str += QString::fromLatin1(
" Kind: %1\n" ).arg(kind());
1726 str += QLatin1String(
" Emails {\n" );
1727 const Email::List listEmail = d->mEmails;
1728 Email::List::ConstIterator it5;
1729 for ( it5 = listEmail.begin(); it5 != listEmail.end(); ++it5 ) {
1730 str += ( *it5 ).toString();
1732 str += QLatin1String(
" }\n" );
1734 str += QLatin1String(
" Langs {\n" );
1735 const Lang::List listLang = d->mLangs;
1736 Lang::List::ConstIterator it6;
1737 for ( it6 = listLang.begin(); it6 != listLang.end(); ++it6 ) {
1738 str += ( *it6 ).toString();
1740 str += QLatin1String(
" }\n" );
1743 str += QLatin1String(
" PhoneNumbers {\n" );
1745 PhoneNumber::List::ConstIterator it2;
1746 for ( it2 = p.begin(); it2 != p.end(); ++it2 ) {
1747 str += ( *it2 ).toString();
1749 str += QLatin1String(
" }\n" );
1751 str += QLatin1String(
" Addresses {\n" );
1753 Address::List::ConstIterator it3;
1754 for ( it3 = a.begin(); it3 != a.end(); ++it3 ) {
1755 str += ( *it3 ).toString();
1757 str += QLatin1String(
" }\n" );
1759 str += QLatin1String(
" Keys {\n" );
1761 Key::List::ConstIterator it4;
1762 for ( it4 = k.begin(); it4 != k.end(); ++it4 ) {
1763 str += ( *it4 ).toString();
1765 str += QLatin1String(
" }\n" );
1767 str += QLatin1String(
"}\n" );
1780 Address::List::Iterator it;
1781 for ( it = d->mAddresses.begin(); it != d->mAddresses.end(); ++it ) {
1788 d->mAddresses.append(
address );
1793 Address::List::Iterator it;
1794 for ( it = d->mAddresses.begin(); it != d->mAddresses.end(); ++it ) {
1796 d->mAddresses.erase( it );
1805 Address::List::ConstIterator it;
1806 Address::List::ConstIterator end( d->mAddresses.constEnd() );
1807 for ( it = d->mAddresses.constBegin(); it != end; ++it ) {
1808 if ( matchBinaryPattern( ( *it ).type(), type ) ) {
1822 return d->mAddresses;
1829 Address::List::ConstIterator it;
1830 Address::List::ConstIterator end( d->mAddresses.constEnd() );
1831 for ( it = d->mAddresses.constBegin(); it != end; ++it ) {
1832 if ( matchBinaryPattern( ( *it ).type(), type ) ) {
1842 Address::List::ConstIterator it;
1843 Address::List::ConstIterator end( d->mAddresses.constEnd() );
1844 for ( it = d->mAddresses.constBegin(); it != end; ++it ) {
1845 if ( ( *it ).id() ==
id ) {
1852void Addressee::insertMember(
const QString & member)
1856 if ( d->mMembers.contains( member ) )
1859 d->mMembers.append( member );
1862void Addressee::setMembers(
const QStringList &m )
1868QStringList Addressee::members()
const
1873void Addressee::insertRelationShip(
const QString &relation)
1877 if ( d->mRelationShips.contains( relation ) )
1880 d->mRelationShips.append( relation );
1883void Addressee::setRelationShips(
const QStringList &c)
1886 d->mRelationShips = c;
1889QStringList Addressee::relationShips()
const
1891 return d->mRelationShips;
1898 if ( d->mCategories.contains( c ) )
1901 d->mCategories.append( c );
1906 if ( d->mCategories.contains( category ) ) {
1907 d->mCategories.removeAll( category );
1913 return d->mCategories.contains( category );
1925 return d->mCategories;
1929 const QString &value )
1931 if ( value.isEmpty() ||
name.isEmpty() || app.isEmpty() ) {
1937 const QString qualifiedName = app + QLatin1Char(
'-' ) +
name;
1939 d->mCustomFields.insert( qualifiedName, value );
1944 const QString qualifiedName = app + QLatin1Char(
'-' ) +
name;
1946 d->mCustomFields.remove( qualifiedName );
1951 const QString qualifiedName = app + QLatin1Char(
'-' ) +
name;
1953 return d->mCustomFields.value( qualifiedName );
1960 d->mCustomFields.clear();
1963 const int index =
custom.indexOf( QLatin1Char(
':' ) );
1967 const QString qualifiedName =
custom.left( index );
1968 const QString value =
custom.mid( index + 1 );
1970 d->mCustomFields.insert( qualifiedName, value );
1978 QMapIterator<QString, QString> it( d->mCustomFields );
1979 while ( it.hasNext() ) {
1981 result << it.key() + QLatin1Char(
':' ) + it.value();
1994 if ( rawEmail.isEmpty() )
1998 QByteArray
address = rawEmail.toUtf8();
2000 QByteArray displayName;
2001 QByteArray addrSpec;
2008 enum { TopLevel, InComment, InAngleAddress } context = TopLevel;
2009 bool inQuotedString =
false;
2010 int commentLevel = 0;
2013 for (
char* p =
address.data(); *p && !stop; ++p ) {
2014 switch ( context ) {
2017 case '"' : inQuotedString = !inQuotedString;
2020 case '(' :
if ( !inQuotedString ) {
2021 context = InComment;
2027 case '<' :
if ( !inQuotedString ) {
2028 context = InAngleAddress;
2042 case ',' :
if ( !inQuotedString ) {
2052 default : displayName += *p;
2058 case '(' : ++commentLevel;
2061 case ')' : --commentLevel;
2062 if ( commentLevel == 0 ) {
2078 default : comment += *p;
2082 case InAngleAddress : {
2084 case '"' : inQuotedString = !inQuotedString;
2087 case '>' :
if ( !inQuotedString ) {
2102 default : addrSpec += *p;
2110 displayName = displayName.trimmed();
2111 comment = comment.trimmed();
2112 addrSpec = addrSpec.trimmed();
2114 fullName = QString::fromUtf8( displayName );
2115 email = QString::fromUtf8( addrSpec );
2118 if ( inQuotedString )
2120 if ( context == InComment )
2122 if ( context == InAngleAddress )
2125 if ( addrSpec.isEmpty() ) {
2126 if ( displayName.isEmpty() )
2133 fullName = QString::fromUtf8( comment );
2137 email = email.toLower();
2140 unsigned int len = fullName.length();
2141 if ( fullName[ 0 ] == QLatin1Char(
'"' ) && fullName[ len - 1 ] == QLatin1Char(
'"' ) ) {
2142 fullName = fullName.mid( 1, len - 2 );
2146#ifndef KDEPIM_NO_KRESOURCES
2154 return d->mResource;
2160 d->mChanged = value;
2170 Private::mSortMode = mode;
2175 if ( !Private::mSortMode )
2178 return Private::mSortMode->lesser( *
this, addr );
2183 return QLatin1String(
"text/directory" );
2191 s << a.d->mFormattedName;
2192 s << a.d->mFamilyName;
2193 s << a.d->mGivenName;
2194 s << a.d->mAdditionalName;
2197 s << a.d->mNickName;
2198 s << a.d->mBirthday;
2200 s << a.d->mTimeZone;
2204 s << a.d->mOrganization;
2205 s << a.d->mDepartment;
2207 s << a.d->mProductId;
2208 s << a.d->mRevision;
2209 s << a.d->mSortString;
2215 s << a.d->mPhoneNumbers;
2216 s << a.d->mAddresses;
2218 s << a.d->mCategories;
2224 s << a.d->mCalendarUrl;
2225 s << a.d->mSoundListExtra;
2226 s << a.d->mPhotoListExtra;
2227 s << a.d->mLogoListExtra;
2228 s << a.d->mUrlListExtra;
2230 s << a.d->mRelationShips;
2240 s >> a.d->mFormattedName;
2241 s >> a.d->mFamilyName;
2242 s >> a.d->mGivenName;
2243 s >> a.d->mAdditionalName;
2246 s >> a.d->mNickName;
2247 s >> a.d->mBirthday;
2249 s >> a.d->mTimeZone;
2253 s >> a.d->mOrganization;
2254 s >> a.d->mDepartment;
2256 s >> a.d->mProductId;
2257 s >> a.d->mRevision;
2258 s >> a.d->mSortString;
2264 s >> a.d->mPhoneNumbers;
2265 s >> a.d->mAddresses;
2267 s >> a.d->mCategories;
2268 QStringList customFields;
2275 s >> a.d->mCalendarUrl;
2276 s >> a.d->mSoundListExtra;
2277 s >> a.d->mPhotoListExtra;
2278 s >> a.d->mLogoListExtra;
2279 s >> a.d->mUrlListExtra;
2281 s >> a.d->mRelationShips;
2283 a.d->mEmpty =
false;
2288bool matchBinaryPattern(
int value,
int pattern )
2297 return ( value == 0 );
2299 return ( pattern == ( pattern & value ) );
2303bool listEquals(
const QList<L> &list,
const QList<L> &pattern )
2305 if ( list.count() != pattern.count() )
2307 const int numberOfElement( list.count() );
2308 for (
int i = 0; i < numberOfElement; ++i ) {
2309 if ( !pattern.contains( list[ i ] ) ) {
2317bool listEquals(
const QStringList &list,
const QStringList &pattern )
2319 if ( list.count() != pattern.count() )
2322 const int numberOfElement( list.count() );
2323 for (
int i = 0; i < numberOfElement; ++i ) {
2324 if ( !pattern.contains( list[ i ] ) ) {
Postal address information.
bool isEmpty() const
Returns true, if the address is empty.
QList< Address > List
List of addresses.
QString id() const
Returns the unique identifier.
This singleton class stores static data, which is shared by all Addressee objects.
bool containsSuffix(const QString &suffix) const
Queries the list of honoric suffixes.
static AddresseeHelper * self()
Singleton interface to this class.
bool tradeAsFamilyName() const
Returns whether or not a single name component should be interpreted as a family name.
bool containsPrefix(const QString &prefix) const
Queries the list of inclusions.
bool containsTitle(const QString &title) const
Queries the list of honoric prefixes.
static QString businessAddressRegionLabel()
Return translated label for businessAddressRegion field.
static QString sortStringLabel()
Return translated label for sortString field.
bool hasCategory(const QString &) const
Return, if addressee has the given category.
void setMailer(const QString &mailer)
Set mail client.
void removeKey(const Key &key)
Remove a key.
static QString businessAddressPostOfficeBoxLabel()
Return translated label for businessAddressPostOfficeBox field.
static QString homeAddressPostalCodeLabel()
Return translated label for homeAddressPostalCode field.
void setLogo(const Picture &logo)
Set logo.
static QString givenNameLabel()
Return translated label for givenName field.
static QString noteLabel()
Return translated label for note field.
~Addressee()
Destroys the address book entry.
void setAdditionalName(const QString &additionalName)
Set additional names.
QString familyName() const
Return family name.
QString mailer() const
Return mail client.
void removePhoneNumber(const PhoneNumber &phoneNumber)
Remove phone number.
void setSecrecy(const Secrecy &secrecy)
Set security class.
static QString additionalNameLabel()
Return translated label for additionalName field.
bool operator==(const Addressee &) const
Equality operator.
void setCustoms(const QStringList &)
Set all custom entries.
void setBirthday(const QDateTime &birthday)
Set birthday.
void setOrganization(const QString &organization)
Set organization.
QStringList emails() const
Return list of all email addresses.
static QString organizationLabel()
Return translated label for organization field.
void setKeys(const Key::List &keys)
Set the list of keys.
void insertPhoneNumber(const PhoneNumber &phoneNumber)
Insert a phone number.
static QString homeAddressPostOfficeBoxLabel()
Return translated label for homeAddressPostOfficeBox field.
void setPrefix(const QString &prefix)
Set honorific prefixes.
QString nickName() const
Return nick name.
void insertCustom(const QString &app, const QString &name, const QString &value)
Insert custom entry.
void setProductId(const QString &productId)
Set product identifier.
QString sortString() const
Return sort string.
static QString businessAddressLabelLabel()
Return translated label for businessAddressLabel field.
KUrl url() const
Return homepage.
void setNameFromString(const QString &)
Set name fields by parsing the given string and trying to associate the parts of the string with acco...
static QString mimeType()
Returns the MIME type used for Addressees.
Addressee & operator=(const Addressee &)
Assignment operator.
static QString businessAddressStreetLabel()
Return translated label for businessAddressStreet field.
static QString businessAddressLocalityLabel()
Return translated label for businessAddressLocality field.
static QString mailerLabel()
Return translated label for mailer field.
Key::List keys() const
Return list of all keys.
QString custom(const QString &app, const QString &name) const
Return value of custom entry, identified by app and entry name.
QString prefix() const
Return honorific prefixes.
QString organization() const
Return organization.
static QString homeAddressCountryLabel()
Return translated label for homeAddressCountry field.
static QString logoLabel()
Return translated label for logo field.
static QString photoLabel()
Return translated label for photo field.
QStringList customs() const
Return list of all custom entries.
static QString secrecyLabel()
Return translated label for secrecy field.
void setRevision(const QDateTime &revision)
Set revision date.
Geo geo() const
Return geographic position.
void setSuffix(const QString &suffix)
Set honorific suffixes.
static QString homePhoneLabel()
Return translated label for homePhone field.
static QString soundLabel()
Return translated label for sound field.
void removeEmail(const QString &email)
Remove email address.
static QString homeAddressLabelLabel()
Return translated label for homeAddressLabel field.
void removeAddress(const Address &address)
Remove address.
Sound sound() const
Return sound.
static QString urlLabel()
Return translated label for url field.
QString toString() const
Returns string representation of the addressee.
Picture photo() const
Return photo.
Secrecy secrecy() const
Return security class.
Addressee()
Construct an empty address book entry.
static QString businessAddressPostalCodeLabel()
Return translated label for businessAddressPostalCode field.
static QString carPhoneLabel()
Return translated label for carPhone field.
QString suffix() const
Return honorific suffixes.
Address address(Address::Type type) const
Return address, which matches the given type.
static QString titleLabel()
Return translated label for title field.
void setGivenName(const QString &givenName)
Set given name.
static QString prefixLabel()
Return translated label for prefix field.
static QString nameLabel()
Return translated label for name field.
QString note() const
Return note.
static QString homeAddressStreetLabel()
Return translated label for homeAddressStreet field.
static QString uidLabel()
Return translated label for uid field.
PhoneNumber phoneNumber(PhoneNumber::Type type) const
Return phone number, which matches the given type.
static QString pagerLabel()
Return translated label for pager field.
bool operator!=(const Addressee &) const
Not-equal operator.
QDateTime birthday() const
Return birthday.
void setEmails(const QStringList &list)
Set the emails to list.
void setNickName(const QString &nickName)
Set nick name.
Key findKey(const QString &id) const
Return key with the given id.
QString additionalName() const
Return additional names.
static void parseEmailAddress(const QString &rawEmail, QString &fullName, QString &email)
Parse full email address.
bool isEmpty() const
Return, if the address book entry is empty.
void setDepartment(const QString &department)
Set department.
void insertEmail(const QString &email, bool preferred=false)
Insert an email address.
QString preferredEmail() const
Return preferred email address.
QString role() const
Return role.
static QString homeFaxLabel()
Return translated label for homeFax field.
static QString timeZoneLabel()
Return translated label for timeZone field.
QString productId() const
Return product identifier.
QDateTime revision() const
Return revision date.
void setSound(const Sound &sound)
Set sound.
void removeCategory(const QString &)
Remove category.
void setChanged(bool value)
Mark addressee as changed.
void removeCustom(const QString &app, const QString &name)
Remove custom entry.
void setCategories(const QStringList &)
Set categories to given value.
void setTimeZone(const TimeZone &timeZone)
Set time zone.
QString realName() const
Return the name of the addressee.
QString title() const
Return title.
Picture logo() const
Return logo.
QString assembledName() const
Return the name that consists of all name parts.
void setNote(const QString ¬e)
Set note.
QString formattedName() const
Return formatted name.
static QString suffixLabel()
Return translated label for suffix field.
static QString geoLabel()
Return translated label for geo field.
QString fullEmail(const QString &email=QString()) const
Return email address including real name.
static QString homeAddressLocalityLabel()
Return translated label for homeAddressLocality field.
static QString roleLabel()
Return translated label for role field.
void setPhoto(const Picture &photo)
Set photo.
void setName(const QString &name)
Set name.
void insertAddress(const Address &address)
Insert an address.
static QString birthdayLabel()
Return translated label for birthday field.
Address::List addresses() const
Return list of all addresses.
bool changed() const
Return whether the addressee is changed.
TimeZone timeZone() const
Return time zone.
static void setSortMode(KABC::SortMode *mode)
Sets the sort mode implementation.
void insertKey(const Key &key)
Insert a key.
void setRole(const QString &role)
Set role.
void setResource(Resource *resource)
Set resource where the addressee is from.
static QString businessPhoneLabel()
Return translated label for businessPhone field.
Resource * resource() const
Return pointer to resource.
QString name() const
Return name.
QString givenName() const
Return given name.
static QString revisionLabel()
Return translated label for revision field.
void setUrl(const KUrl &url)
Set homepage.
void setFormattedName(const QString &formattedName)
Set formatted name.
static QString businessAddressCountryLabel()
Return translated label for businessAddressCountry field.
static QString homeAddressRegionLabel()
Return translated label for homeAddressRegion field.
static QString departmentLabel()
Return translated label for department field.
Address findAddress(const QString &id) const
Return address with the given id.
static QString familyNameLabel()
Return translated label for familyName field.
void setFamilyName(const QString &familyName)
Set family name.
QStringList categories() const
Return list of all set categories.
void setTitle(const QString &title)
Set title.
static QString nickNameLabel()
Return translated label for nickName field.
static QString isdnLabel()
Return translated label for isdn field.
static QString productIdLabel()
Return translated label for productId field.
PhoneNumber findPhoneNumber(const QString &id) const
Return phone number with the given id.
QString department() const
Return department.
bool operator<(const Addressee &addr) const
Return whether this addressee is "less-than" a given one.
void setUid(const QString &uid)
Set unique identifier.
static QString mobilePhoneLabel()
Return translated label for mobilePhone field.
QString uid() const
Return unique identifier.
void setGeo(const Geo &geo)
Set geographic position.
static QString formattedNameLabel()
Return translated label for formattedName field.
PhoneNumber::List phoneNumbers() const
Return list of all phone numbers.
static QString emailLabel()
Return translated label for email field.
static QString businessFaxLabel()
Return translated label for businessFax field.
void setSortString(const QString &sortString)
Set sort string.
void insertCategory(const QString &)
Insert category.
Key key(Key::Type type, QString customTypeString=QString()) const
Return key, which matches the given type.
A class to store an encryption key.
@ Custom
Custom or IANA conform key.
QString id() const
Returns the unique identifier.
QList< Key > List
List of keys.
QString id() const
Returns the unique identifier.
QList< PhoneNumber > List
List of phone numbers.
QString number() const
Returns the phone number.
A class to store a picture of an addressee.
Sort method for sorting an addressee list.
Class that holds a Sound clip for a contact.
Class that holds a Calendar Url (FBURL/CALADRURI/CALURI)
QDataStream & operator<<(QDataStream &stream, const Address &address)
Serializes the address object into the stream.
QDataStream & operator>>(QDataStream &stream, Address &address)
Initializes the address object from the stream.