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
39 #include "addressee.h"
43 static bool matchBinaryPattern(
int value,
int pattern );
46 static bool listEquals(
const QList<L>&,
const QList<L>& );
47 static bool listEquals(
const QStringList&,
const QStringList& );
49 class 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" );
471 void Addressee::setKind(
const QString &kind )
473 if ( kind == d->mKind )
480 void Addressee::insertCalendarUrl(
const CalendarUrl &calendarUrl)
484 if (calendarUrl.isValid()) {
485 d->mCalendarUrl.append(calendarUrl);
489 void Addressee::insertExtraSound(
const Sound &sound)
491 d->mSoundListExtra.append(
sound);
494 void Addressee::setExtraSoundList(
const KABC::Sound::List &soundList)
496 d->mSoundListExtra = soundList;
499 KABC::Sound::List Addressee::extraSoundList()
const
501 return d->mSoundListExtra;
504 void Addressee::insertExtraPhoto(
const Picture &picture)
506 d->mPhotoListExtra.append(picture);
509 void Addressee::setExtraPhotoList(
const Picture::List &pictureList)
511 d->mPhotoListExtra = pictureList;
514 Picture::List Addressee::extraPhotoList()
const
516 return d->mPhotoListExtra;
519 void Addressee::insertExtraLogo(
const Picture &logo)
521 d->mLogoListExtra.append(
logo);
524 void Addressee::setExtraLogoList(
const Picture::List &logoList)
526 d->mLogoListExtra = logoList;
529 Picture::List Addressee::extraLogoList()
const
531 return d->mLogoListExtra;
534 void Addressee::insertExtraUrl(
const KUrl &url)
536 d->mUrlListExtra.append(
url);
539 void Addressee::setExtraUrlList(
const QList<KUrl> &urlList)
541 d->mUrlListExtra = urlList;
544 QList<KUrl> Addressee::extraUrlList()
const
546 return d->mUrlListExtra;
549 void Addressee::insertSourceUrl(
const KUrl &url)
551 d->mSources.append(
url);
554 void Addressee::setSourcesUrlList(
const QList<KUrl> &urlList)
556 d->mSources = urlList;
559 QList<KUrl> Addressee::sourcesUrlList()
const
565 QString 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(
'>' );
1394 void 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();
1453 Email::List Addressee::emailList()
const
1458 void Addressee::setEmailList(
const Email::List &list)
1467 for (
int i = 0; i <
emails.size(); ++i) {
1468 d->mEmails.append(Email(
emails.at(i)));
1473 void 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);
1482 void 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 );
1500 void Addressee::setLangs(
const Lang::List &langs)
1506 Lang::List Addressee::langs()
const
1511 void Addressee::setGender(
const Gender &gender)
1513 if ( gender == d->mGender )
1517 d->mGender = gender;
1520 Gender 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 ) {
1852 void Addressee::insertMember(
const QString & member)
1856 if ( d->mMembers.contains( member ) )
1859 d->mMembers.append( member );
1862 void Addressee::setMembers(
const QStringList &m )
1868 QStringList Addressee::members()
const
1873 void Addressee::insertRelationShip(
const QString &relation)
1877 if ( d->mRelationShips.contains( relation ) )
1880 d->mRelationShips.append( relation );
1883 void Addressee::setRelationShips(
const QStringList &c)
1886 d->mRelationShips = c;
1889 QStringList 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;
2288 bool matchBinaryPattern(
int value,
int pattern )
2297 return ( value == 0 );
2299 return ( pattern == ( pattern & value ) );
2303 bool 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 ] ) ) {
2317 bool 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 ] ) ) {