File indexing completed on 2024-04-21 14:54:33

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