File indexing completed on 2025-02-16 09:56:45
0001 /* 0002 This file is part of the KContacts framework. 0003 SPDX-FileCopyrightText: 2002 Cornelius Schumacher <schumacher@kde.org> 0004 0005 SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 #include "field.h" 0009 0010 #if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88) 0011 #include <KConfig> 0012 #include <KLocalizedString> 0013 #include <KConfigGroup> 0014 #include <KSharedConfig> 0015 0016 using namespace KContacts; 0017 0018 class Q_DECL_HIDDEN Field::Private 0019 { 0020 public: 0021 Private(int fieldId, int category = 0, const QString &label = QString(), const QString &key = QString(), const QString &app = QString()) 0022 : mFieldId(fieldId) 0023 , mCategory(category) 0024 , mLabel(label) 0025 , mKey(key) 0026 , mApp(app) 0027 { 0028 } 0029 0030 enum FieldId { 0031 CustomField, 0032 FormattedName, 0033 FamilyName, 0034 GivenName, 0035 AdditionalName, 0036 Prefix, 0037 Suffix, 0038 NickName, 0039 Birthday, 0040 HomeAddressStreet, 0041 HomeAddressPostOfficeBox, 0042 HomeAddressLocality, 0043 HomeAddressRegion, 0044 HomeAddressPostalCode, 0045 HomeAddressCountry, 0046 HomeAddressLabel, 0047 BusinessAddressStreet, 0048 BusinessAddressPostOfficeBox, 0049 BusinessAddressLocality, 0050 BusinessAddressRegion, 0051 BusinessAddressPostalCode, 0052 BusinessAddressCountry, 0053 BusinessAddressLabel, 0054 HomePhone, 0055 BusinessPhone, 0056 MobilePhone, 0057 HomeFax, 0058 BusinessFax, 0059 CarPhone, 0060 Isdn, 0061 Pager, 0062 Email, 0063 Mailer, 0064 Title, 0065 Role, 0066 Organization, 0067 Department, 0068 Note, 0069 Url, 0070 }; 0071 0072 int fieldId() const 0073 { 0074 return mFieldId; 0075 } 0076 0077 int category() const 0078 { 0079 return mCategory; 0080 } 0081 0082 QString label() const 0083 { 0084 return mLabel; 0085 } 0086 0087 QString key() const 0088 { 0089 return mKey; 0090 } 0091 0092 QString app() const 0093 { 0094 return mApp; 0095 } 0096 0097 static Field::List mAllFields; 0098 static Field::List mDefaultFields; 0099 static Field::List mCustomFields; 0100 0101 private: 0102 int mFieldId; 0103 int mCategory; 0104 0105 QString mLabel; 0106 QString mKey; 0107 QString mApp; 0108 }; 0109 0110 Field::List Field::Private::mAllFields; 0111 Field::List Field::Private::mDefaultFields; 0112 Field::List Field::Private::mCustomFields; 0113 0114 Field::Field(Private *p) 0115 : d(p) 0116 { 0117 } 0118 0119 Field::~Field() 0120 { 0121 delete d; 0122 } 0123 0124 QString Field::label() 0125 { 0126 switch (d->fieldId()) { 0127 case Private::FormattedName: 0128 return Addressee::formattedNameLabel(); 0129 case Private::FamilyName: 0130 return Addressee::familyNameLabel(); 0131 case Private::GivenName: 0132 return Addressee::givenNameLabel(); 0133 case Private::AdditionalName: 0134 return Addressee::additionalNameLabel(); 0135 case Private::Prefix: 0136 return Addressee::prefixLabel(); 0137 case Private::Suffix: 0138 return Addressee::suffixLabel(); 0139 case Private::NickName: 0140 return Addressee::nickNameLabel(); 0141 case Private::Birthday: 0142 return Addressee::birthdayLabel(); 0143 case Private::HomeAddressStreet: 0144 return Addressee::homeAddressStreetLabel(); 0145 case Private::HomeAddressPostOfficeBox: 0146 return Addressee::homeAddressPostOfficeBoxLabel(); 0147 case Private::HomeAddressLocality: 0148 return Addressee::homeAddressLocalityLabel(); 0149 case Private::HomeAddressRegion: 0150 return Addressee::homeAddressRegionLabel(); 0151 case Private::HomeAddressPostalCode: 0152 return Addressee::homeAddressPostalCodeLabel(); 0153 case Private::HomeAddressCountry: 0154 return Addressee::homeAddressCountryLabel(); 0155 case Private::HomeAddressLabel: 0156 return Addressee::homeAddressLabelLabel(); 0157 case Private::BusinessAddressStreet: 0158 return Addressee::businessAddressStreetLabel(); 0159 case Private::BusinessAddressPostOfficeBox: 0160 return Addressee::businessAddressPostOfficeBoxLabel(); 0161 case Private::BusinessAddressLocality: 0162 return Addressee::businessAddressLocalityLabel(); 0163 case Private::BusinessAddressRegion: 0164 return Addressee::businessAddressRegionLabel(); 0165 case Private::BusinessAddressPostalCode: 0166 return Addressee::businessAddressPostalCodeLabel(); 0167 case Private::BusinessAddressCountry: 0168 return Addressee::businessAddressCountryLabel(); 0169 case Private::BusinessAddressLabel: 0170 return Addressee::businessAddressLabelLabel(); 0171 case Private::HomePhone: 0172 return Addressee::homePhoneLabel(); 0173 case Private::BusinessPhone: 0174 return Addressee::businessPhoneLabel(); 0175 case Private::MobilePhone: 0176 return Addressee::mobilePhoneLabel(); 0177 case Private::HomeFax: 0178 return Addressee::homeFaxLabel(); 0179 case Private::BusinessFax: 0180 return Addressee::businessFaxLabel(); 0181 case Private::CarPhone: 0182 return Addressee::carPhoneLabel(); 0183 case Private::Isdn: 0184 return Addressee::isdnLabel(); 0185 case Private::Pager: 0186 return Addressee::pagerLabel(); 0187 case Private::Email: 0188 return Addressee::emailLabel(); 0189 case Private::Mailer: 0190 return Addressee::mailerLabel(); 0191 case Private::Title: 0192 return Addressee::titleLabel(); 0193 case Private::Role: 0194 return Addressee::roleLabel(); 0195 case Private::Organization: 0196 return Addressee::organizationLabel(); 0197 case Private::Department: 0198 return Addressee::departmentLabel(); 0199 case Private::Note: 0200 return Addressee::noteLabel(); 0201 case Private::Url: 0202 return Addressee::urlLabel(); 0203 case Private::CustomField: 0204 return d->label(); 0205 default: 0206 return i18n("Unknown Field"); 0207 } 0208 } 0209 0210 int Field::category() 0211 { 0212 return d->category(); 0213 } 0214 0215 QString Field::categoryLabel(int category) 0216 { 0217 switch (category) { 0218 case All: 0219 return i18n("All"); 0220 case Frequent: 0221 return i18n("Frequent"); 0222 case Address: 0223 return i18nc("street/postal", "Address"); 0224 case Email: 0225 return i18n("Email"); 0226 case Personal: 0227 return i18n("Personal"); 0228 case Organization: 0229 return i18n("Organization"); 0230 case CustomCategory: 0231 return i18n("Custom"); 0232 default: 0233 return i18n("Undefined"); 0234 } 0235 } 0236 0237 QString Field::value(const KContacts::Addressee &a) 0238 { 0239 0240 auto findPhone = [](const PhoneNumber::List &list, PhoneNumber::TypeFlag compareFlag) { 0241 auto it = std::find_if(list.cbegin(), list.cend(), [=](const PhoneNumber &phone) { 0242 return (phone.type() & ~(PhoneNumber::Pref)) == compareFlag; 0243 }); 0244 return it; 0245 }; 0246 0247 switch (d->fieldId()) { 0248 case Private::FormattedName: 0249 return a.formattedName(); 0250 case Private::FamilyName: 0251 return a.familyName(); 0252 case Private::GivenName: 0253 return a.givenName(); 0254 case Private::AdditionalName: 0255 return a.additionalName(); 0256 case Private::Prefix: 0257 return a.prefix(); 0258 case Private::Suffix: 0259 return a.suffix(); 0260 case Private::NickName: 0261 return a.nickName(); 0262 case Private::Mailer: 0263 return a.mailer(); 0264 case Private::Title: 0265 return a.title(); 0266 case Private::Role: 0267 return a.role(); 0268 case Private::Organization: 0269 return a.organization(); 0270 case Private::Department: 0271 return a.department(); 0272 case Private::Note: 0273 return a.note(); 0274 case Private::Email: 0275 return a.preferredEmail(); 0276 case Private::Birthday: 0277 if (a.birthday().isValid()) { 0278 return a.birthday().date().toString(Qt::ISODate); 0279 } else { 0280 return QString(); 0281 } 0282 case Private::Url: 0283 return a.url().url().toDisplayString(); 0284 case Private::HomePhone: { 0285 PhoneNumber::List::ConstIterator it; 0286 0287 { 0288 // check for preferred number 0289 const PhoneNumber::List list = a.phoneNumbers(PhoneNumber::Home | PhoneNumber::Pref); 0290 auto it = findPhone(list, PhoneNumber::Home); 0291 if (it != list.cend()) { 0292 return it->number(); 0293 } 0294 } 0295 0296 { 0297 // check for normal home number 0298 const PhoneNumber::List list = a.phoneNumbers(PhoneNumber::Home); 0299 auto it = findPhone(list, PhoneNumber::Home); 0300 if (it != list.cend()) { 0301 return it->number(); 0302 } 0303 } 0304 0305 return QString(); 0306 } 0307 case Private::BusinessPhone: { 0308 PhoneNumber::List::ConstIterator it; 0309 0310 { 0311 // check for preferred number 0312 const PhoneNumber::List list = a.phoneNumbers(PhoneNumber::Work | PhoneNumber::Pref); 0313 auto it = findPhone(list, PhoneNumber::Work); 0314 if (it != list.cend()) { 0315 return it->number(); 0316 } 0317 } 0318 0319 { 0320 // check for normal work number 0321 const PhoneNumber::List list = a.phoneNumbers(PhoneNumber::Work); 0322 auto it = findPhone(list, PhoneNumber::Work); 0323 if (it != list.cend()) { 0324 return it->number(); 0325 } 0326 } 0327 0328 return QString(); 0329 } 0330 case Private::MobilePhone: 0331 return a.phoneNumber(PhoneNumber::Cell).number(); 0332 case Private::HomeFax: 0333 return a.phoneNumber(PhoneNumber::Home | PhoneNumber::Fax).number(); 0334 case Private::BusinessFax: 0335 return a.phoneNumber(PhoneNumber::Work | PhoneNumber::Fax).number(); 0336 case Private::CarPhone: 0337 return a.phoneNumber(PhoneNumber::Car).number(); 0338 case Private::Isdn: 0339 return a.phoneNumber(PhoneNumber::Isdn).number(); 0340 case Private::Pager: 0341 return a.phoneNumber(PhoneNumber::Pager).number(); 0342 case Private::HomeAddressStreet: 0343 return a.address(Address::Home).street(); 0344 case Private::HomeAddressPostOfficeBox: 0345 return a.address(Address::Home).postOfficeBox(); 0346 case Private::HomeAddressLocality: 0347 return a.address(Address::Home).locality(); 0348 case Private::HomeAddressRegion: 0349 return a.address(Address::Home).region(); 0350 case Private::HomeAddressPostalCode: 0351 return a.address(Address::Home).postalCode(); 0352 case Private::HomeAddressCountry: 0353 return a.address(Address::Home).country(); 0354 case Private::BusinessAddressStreet: 0355 return a.address(Address::Work).street(); 0356 case Private::BusinessAddressPostOfficeBox: 0357 return a.address(Address::Work).postOfficeBox(); 0358 case Private::BusinessAddressLocality: 0359 return a.address(Address::Work).locality(); 0360 case Private::BusinessAddressRegion: 0361 return a.address(Address::Work).region(); 0362 case Private::BusinessAddressPostalCode: 0363 return a.address(Address::Work).postalCode(); 0364 case Private::BusinessAddressCountry: 0365 return a.address(Address::Work).country(); 0366 case Private::CustomField: 0367 return a.custom(d->app(), d->key()); 0368 default: 0369 return QString(); 0370 } 0371 } 0372 0373 bool Field::setValue(KContacts::Addressee &a, const QString &value) 0374 { 0375 switch (d->fieldId()) { 0376 case Private::FormattedName: 0377 a.setFormattedName(value); 0378 return true; 0379 case Private::FamilyName: 0380 a.setFamilyName(value); 0381 return true; 0382 case Private::GivenName: 0383 a.setGivenName(value); 0384 return true; 0385 case Private::AdditionalName: 0386 a.setAdditionalName(value); 0387 return true; 0388 case Private::Prefix: 0389 a.setPrefix(value); 0390 return true; 0391 case Private::Suffix: 0392 a.setSuffix(value); 0393 return true; 0394 case Private::NickName: 0395 a.setNickName(value); 0396 return true; 0397 case Private::Mailer: 0398 a.setMailer(value); 0399 return true; 0400 case Private::Title: 0401 a.setTitle(value); 0402 return true; 0403 case Private::Role: 0404 a.setRole(value); 0405 return true; 0406 case Private::Organization: 0407 a.setOrganization(value); 0408 return true; 0409 case Private::Department: 0410 a.setDepartment(value); 0411 return true; 0412 case Private::Note: 0413 a.setNote(value); 0414 return true; 0415 case Private::Birthday: 0416 a.setBirthday(QDate::fromString(value, Qt::ISODate)); 0417 return true; 0418 case Private::CustomField: 0419 a.insertCustom(d->app(), d->key(), value); 0420 return true; 0421 default: 0422 return false; 0423 } 0424 } 0425 0426 QString Field::sortKey(const KContacts::Addressee &a) 0427 { 0428 switch (d->fieldId()) { 0429 case Private::FormattedName: 0430 return a.formattedName(); 0431 case Private::FamilyName: 0432 return a.familyName(); 0433 case Private::GivenName: 0434 return a.givenName(); 0435 case Private::AdditionalName: 0436 return a.additionalName(); 0437 case Private::Prefix: 0438 return a.prefix(); 0439 case Private::Suffix: 0440 return a.suffix(); 0441 case Private::NickName: 0442 return a.nickName(); 0443 case Private::Mailer: 0444 return a.mailer(); 0445 case Private::Title: 0446 return a.title(); 0447 case Private::Role: 0448 return a.role(); 0449 case Private::Organization: 0450 return a.organization(); 0451 case Private::Department: 0452 return a.department(); 0453 case Private::Note: 0454 return a.note(); 0455 case Private::Birthday: 0456 if (a.birthday().isValid()) { 0457 QDate date = a.birthday().date(); 0458 return QString::asprintf("%02d-%02d", date.month(), date.day()); 0459 } else { 0460 return QStringLiteral("00-00"); 0461 } 0462 default: 0463 return value(a).toLower(); 0464 } 0465 } 0466 0467 bool Field::isCustom() 0468 { 0469 return d->fieldId() == Private::CustomField; 0470 } 0471 0472 Field::List Field::allFields() 0473 { 0474 if (Private::mAllFields.isEmpty()) { 0475 createField(Private::FormattedName, Frequent); 0476 createField(Private::FamilyName, Frequent); 0477 createField(Private::GivenName, Frequent); 0478 createField(Private::AdditionalName); 0479 createField(Private::Prefix); 0480 createField(Private::Suffix); 0481 createField(Private::NickName, Personal); 0482 createField(Private::Birthday, Personal); 0483 createField(Private::HomeAddressStreet, Address | Personal); 0484 createField(Private::HomeAddressPostOfficeBox, Address | Personal); 0485 createField(Private::HomeAddressLocality, Address | Personal); 0486 createField(Private::HomeAddressRegion, Address | Personal); 0487 createField(Private::HomeAddressPostalCode, Address | Personal); 0488 createField(Private::HomeAddressCountry, Address | Personal); 0489 createField(Private::HomeAddressLabel, Address | Personal); 0490 createField(Private::BusinessAddressStreet, Address | Organization); 0491 createField(Private::BusinessAddressPostOfficeBox, Address | Organization); 0492 createField(Private::BusinessAddressLocality, Address | Organization); 0493 createField(Private::BusinessAddressRegion, Address | Organization); 0494 createField(Private::BusinessAddressPostalCode, Address | Organization); 0495 createField(Private::BusinessAddressCountry, Address | Organization); 0496 createField(Private::BusinessAddressLabel, Address | Organization); 0497 createField(Private::HomePhone, Personal | Frequent); 0498 createField(Private::BusinessPhone, Organization | Frequent); 0499 createField(Private::MobilePhone, Frequent); 0500 createField(Private::HomeFax); 0501 createField(Private::BusinessFax); 0502 createField(Private::CarPhone); 0503 createField(Private::Isdn); 0504 createField(Private::Pager); 0505 createField(Private::Email, Email | Frequent); 0506 createField(Private::Mailer, Email); 0507 createField(Private::Title, Organization); 0508 createField(Private::Role, Organization); 0509 createField(Private::Organization, Organization); 0510 createField(Private::Department, Organization); 0511 createField(Private::Note); 0512 createField(Private::Url); 0513 } 0514 0515 return Private::mAllFields; 0516 } 0517 0518 Field::List Field::defaultFields() 0519 { 0520 if (Private::mDefaultFields.isEmpty()) { 0521 createDefaultField(Private::FormattedName); 0522 createDefaultField(Private::Email); 0523 } 0524 0525 return Private::mDefaultFields; 0526 } 0527 0528 void Field::createField(int id, int category) 0529 { 0530 Private::mAllFields.append(new Field(new Private(id, category))); 0531 } 0532 0533 void Field::createDefaultField(int id, int category) 0534 { 0535 Private::mDefaultFields.append(new Field(new Private(id, category))); 0536 } 0537 0538 void Field::deleteFields() 0539 { 0540 Field::List::ConstIterator it; 0541 0542 for (it = Private::mAllFields.constBegin(); it != Private::mAllFields.constEnd(); ++it) { 0543 delete (*it); 0544 } 0545 Private::mAllFields.clear(); 0546 0547 for (it = Private::mDefaultFields.constBegin(); it != Private::mDefaultFields.constEnd(); ++it) { 0548 delete (*it); 0549 } 0550 Private::mDefaultFields.clear(); 0551 0552 for (it = Private::mCustomFields.constBegin(); it != Private::mCustomFields.constEnd(); ++it) { 0553 delete (*it); 0554 } 0555 Private::mCustomFields.clear(); 0556 } 0557 0558 void Field::saveFields(const QString &identifier, const Field::List &fields) 0559 { 0560 KConfigGroup cg(KSharedConfig::openConfig(), "KABCFields"); 0561 0562 saveFields(cg, identifier, fields); 0563 } 0564 0565 void Field::saveFields(KConfigGroup &cfg, const QString &identifier, const Field::List &fields) 0566 { 0567 QList<int> fieldIds; 0568 0569 int custom = 0; 0570 Field::List::ConstIterator it; 0571 fieldIds.reserve(fields.count()); 0572 for (it = fields.begin(); it != fields.end(); ++it) { 0573 fieldIds.append((*it)->d->fieldId()); 0574 if ((*it)->isCustom()) { 0575 QStringList customEntry; 0576 customEntry << (*it)->d->label(); 0577 customEntry << (*it)->d->key(); 0578 customEntry << (*it)->d->app(); 0579 cfg.writeEntry(QLatin1String("KCONTACTS_CustomEntry_") + identifier + QLatin1Char('_') + QString::number(custom++), customEntry); 0580 } 0581 } 0582 0583 cfg.writeEntry(identifier, fieldIds); 0584 } 0585 0586 Field::List Field::restoreFields(const QString &identifier) 0587 { 0588 KConfigGroup cg(KSharedConfig::openConfig(), "KABCFields"); 0589 0590 return restoreFields(cg, identifier); 0591 } 0592 0593 Field::List Field::restoreFields(const KConfigGroup &cfg, const QString &identifier) 0594 { 0595 const QList<int> fieldIds = cfg.readEntry(identifier, QList<int>()); 0596 0597 Field::List fields; 0598 0599 int custom = 0; 0600 QList<int>::ConstIterator it; 0601 fields.reserve(fieldIds.count()); 0602 for (it = fieldIds.begin(); it != fieldIds.end(); ++it) { 0603 Private *f = nullptr; 0604 if ((*it) == Private::CustomField) { 0605 QStringList customEntry = 0606 cfg.readEntry(QLatin1String("KCONTACTS_CustomEntry_") + identifier + QLatin1Char('_') + QString::number(custom++), QStringList()); 0607 f = new Private(*it, CustomCategory, customEntry[0], customEntry[1], customEntry[2]); 0608 } else { 0609 f = new Private(*it); 0610 } 0611 fields.append(new Field(f)); 0612 } 0613 0614 return fields; 0615 } 0616 0617 bool Field::equals(Field *field) 0618 { 0619 bool sameId = (d->fieldId() == field->d->fieldId()); 0620 0621 if (!sameId) { 0622 return false; 0623 } 0624 0625 if (d->fieldId() != Private::CustomField) { 0626 return true; 0627 } 0628 0629 return d->key() == field->d->key(); 0630 } 0631 0632 Field *Field::createCustomField(const QString &label, int category, const QString &key, const QString &app) 0633 { 0634 Field *field = new Field(new Private(Private::CustomField, category | CustomCategory, label, key, app)); 0635 Private::mCustomFields.append(field); 0636 0637 return field; 0638 } 0639 #endif