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