File indexing completed on 2024-05-12 05:22:30

0001 /*
0002  * SPDX-FileCopyrightText: 2021 Daniel Vrátil <dvratil@kde.org>
0003  * SPDX-FileCopyrightText: 2022 Claudio Cambra <claudio.cambra@kde.org>
0004  *
0005  * SPDX-License-Identifier: LGPL-2.1-only
0006  * SPDX-License-Identifier: LGPL-3.0-only
0007  * SPDX-License-Identifier: LicenseRef-KDE-Accepted-LGPL
0008  */
0009 
0010 #include "phonenumber.h"
0011 
0012 #include "fieldmetadata.h"
0013 #include "peopleservice.h"
0014 
0015 #include <QJsonArray>
0016 #include <QJsonObject>
0017 #include <QJsonValue>
0018 #include <QSharedData>
0019 
0020 #include <KContacts/PhoneNumber>
0021 
0022 #include <algorithm>
0023 
0024 namespace KGAPI2::People
0025 {
0026 class PhoneNumber::Private : public QSharedData
0027 {
0028 public:
0029     explicit Private() = default;
0030     Private(const Private &) = default;
0031     Private(Private &&) noexcept = delete;
0032     Private &operator=(const Private &) = delete;
0033     Private &operator=(Private &&) noexcept = delete;
0034     ~Private() = default;
0035 
0036     bool operator==(const Private &other) const
0037     {
0038         return value == other.value && formattedType == other.formattedType && canonicalForm == other.canonicalForm && type == other.type
0039             && metadata == other.metadata;
0040     }
0041 
0042     bool operator!=(const Private &other) const
0043     {
0044         return !(*this == other);
0045     }
0046 
0047     QString value{};
0048     QString formattedType{};
0049     QString canonicalForm{};
0050     QString type{};
0051     FieldMetadata metadata{};
0052 };
0053 
0054 PhoneNumber::PhoneNumber()
0055     : d(new Private)
0056 {
0057 }
0058 
0059 PhoneNumber::PhoneNumber(const PhoneNumber &) = default;
0060 PhoneNumber::PhoneNumber(PhoneNumber &&) noexcept = default;
0061 PhoneNumber &PhoneNumber::operator=(const PhoneNumber &) = default;
0062 PhoneNumber &PhoneNumber::operator=(PhoneNumber &&) noexcept = default;
0063 PhoneNumber::~PhoneNumber() = default;
0064 
0065 bool PhoneNumber::operator==(const PhoneNumber &other) const
0066 {
0067     return *d == *other.d;
0068 }
0069 
0070 bool PhoneNumber::operator!=(const PhoneNumber &other) const
0071 {
0072     return !(*this == other);
0073 }
0074 
0075 QString PhoneNumber::value() const
0076 {
0077     return d->value;
0078 }
0079 
0080 void PhoneNumber::setValue(const QString &value)
0081 {
0082     d->value = value;
0083 }
0084 QString PhoneNumber::formattedType() const
0085 {
0086     return d->formattedType;
0087 }
0088 QString PhoneNumber::canonicalForm() const
0089 {
0090     return d->canonicalForm;
0091 }
0092 QString PhoneNumber::type() const
0093 {
0094     return d->type;
0095 }
0096 
0097 void PhoneNumber::setType(const QString &value)
0098 {
0099     d->type = value;
0100 }
0101 FieldMetadata PhoneNumber::metadata() const
0102 {
0103     return d->metadata;
0104 }
0105 
0106 void PhoneNumber::setMetadata(const FieldMetadata &value)
0107 {
0108     d->metadata = value;
0109 }
0110 
0111 PhoneNumber PhoneNumber::fromJSON(const QJsonObject &obj)
0112 {
0113     PhoneNumber phoneNumber;
0114 
0115     if(!obj.isEmpty()) {
0116         const auto metadata = obj.value(QStringLiteral("metadata")).toObject();
0117         phoneNumber.d->metadata = FieldMetadata::fromJSON(metadata);
0118         phoneNumber.d->value = obj.value(QStringLiteral("value")).toString();
0119         phoneNumber.d->canonicalForm = obj.value(QStringLiteral("canonicalForm")).toString();
0120         phoneNumber.d->type = obj.value(QStringLiteral("type")).toString();
0121         phoneNumber.d->formattedType = obj.value(QStringLiteral("formattedType")).toString();
0122     }
0123 
0124     return phoneNumber;
0125 }
0126 
0127 QList<PhoneNumber> PhoneNumber::fromJSONArray(const QJsonArray &data)
0128 {
0129     QList<PhoneNumber> phoneNumbers;
0130 
0131     for(const auto &phoneNumber : data) {
0132         if(phoneNumber.isObject()) {
0133             const auto objectifiedPhoneNumber = phoneNumber.toObject();
0134             phoneNumbers.append(fromJSON(objectifiedPhoneNumber));
0135         }
0136     }
0137 
0138     return phoneNumbers;
0139 }
0140 
0141 QJsonValue PhoneNumber::toJSON() const
0142 {
0143     QJsonObject obj;
0144 
0145     PeopleUtils::addValueToJsonObjectIfValid(obj, "value", d->value);
0146     // Output only -> PeopleUtils::addValueToJsonObjectIfValid(obj, "formattedType", d->formattedType);
0147     // Output only -> PeopleUtils::addValueToJsonObjectIfValid(obj, "canonicalForm", d->canonicalForm);
0148     PeopleUtils::addValueToJsonObjectIfValid(obj, "type", d->type);
0149     // Skip, field metadata is only useful for receiving -> PeopleUtils::addValueToJsonObjectIfValid(obj, "metadata", d->metadata.toJSON());
0150     return obj;
0151 }
0152 
0153 PhoneNumber PhoneNumber::fromKContactsPhoneNumber(const KContacts::PhoneNumber &phoneNumber)
0154 {
0155     PhoneNumber convertedPhoneNumber;
0156     convertedPhoneNumber.setValue(phoneNumber.number());
0157 
0158     switch(phoneNumber.type()) {
0159     case KContacts::PhoneNumber::Home:
0160         convertedPhoneNumber.setType(QStringLiteral("home"));
0161         break;
0162     case KContacts::PhoneNumber::Work:
0163         convertedPhoneNumber.setType(QStringLiteral("work"));
0164         break;
0165     case KContacts::PhoneNumber::Cell:
0166         convertedPhoneNumber.setType(QStringLiteral("mobile"));
0167         break;
0168     case KContacts::PhoneNumber::Fax:
0169         convertedPhoneNumber.setType(QStringLiteral("otherFax"));
0170         break;
0171     case KContacts::PhoneNumber::Pager:
0172         convertedPhoneNumber.setType(QStringLiteral("pager"));
0173         break;
0174     case KContacts::PhoneNumber::Pref:
0175         convertedPhoneNumber.setType(QStringLiteral("main"));
0176         break;
0177     case KContacts::PhoneNumber::Voice: // Unclear if it would be Google Voice
0178     default:
0179         break;
0180     }
0181 
0182     return convertedPhoneNumber;
0183 }
0184 
0185 QList<PhoneNumber> PhoneNumber::fromKContactsPhoneNumberList(const QList<KContacts::PhoneNumber> &phoneNumberList)
0186 {
0187     QList<PhoneNumber> convertedPhoneNumbers;
0188     std::transform(phoneNumberList.cbegin(),
0189                    phoneNumberList.cend(),
0190                    std::back_inserter(convertedPhoneNumbers),
0191                    [](const KContacts::PhoneNumber &phoneNumber) {
0192                        return PhoneNumber::fromKContactsPhoneNumber(phoneNumber);
0193                    });
0194     return convertedPhoneNumbers;
0195 }
0196 
0197 KContacts::PhoneNumber PhoneNumber::toKContactsPhoneNumber() const
0198 {
0199     KContacts::PhoneNumber convertedPhoneNumber;
0200     convertedPhoneNumber.setNumber(value());
0201 
0202     if(QString::compare(type(), QStringLiteral("home"), Qt::CaseInsensitive)) {
0203         convertedPhoneNumber.setType(KContacts::PhoneNumber::Home);
0204     } else if(QString::compare(type(), QStringLiteral("work"), Qt::CaseInsensitive) ||
0205                QString::compare(type(), QStringLiteral("workMobile"), Qt::CaseInsensitive) ||
0206                QString::compare(type(), QStringLiteral("workPager"), Qt::CaseInsensitive)) {
0207         convertedPhoneNumber.setType(KContacts::PhoneNumber::Work);
0208     } else if(QString::compare(type(), QStringLiteral("mobile"), Qt::CaseInsensitive)) {
0209         convertedPhoneNumber.setType(KContacts::PhoneNumber::Cell);
0210     } else if(QString::compare(type(), QStringLiteral("homeFax"), Qt::CaseInsensitive) ||
0211                QString::compare(type(), QStringLiteral("workFax"), Qt::CaseInsensitive) ||
0212                QString::compare(type(), QStringLiteral("otherFax"), Qt::CaseInsensitive)) {
0213         convertedPhoneNumber.setType(KContacts::PhoneNumber::Fax);
0214     } else if(QString::compare(type(), QStringLiteral("pager"), Qt::CaseInsensitive)) {
0215         convertedPhoneNumber.setType(KContacts::PhoneNumber::Pager);
0216     } else if(QString::compare(type(), QStringLiteral("main"), Qt::CaseInsensitive)) {
0217         convertedPhoneNumber.setType(KContacts::PhoneNumber::Pref);
0218     } else if(QString::compare(type(), QStringLiteral("googleVoice"), Qt::CaseInsensitive)) {
0219         convertedPhoneNumber.setType(KContacts::PhoneNumber::Voice);
0220     }
0221 
0222     return convertedPhoneNumber;
0223 }
0224 
0225 } // namespace KGAPI2::People