File indexing completed on 2024-05-12 05:22:26
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 "emailaddress.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/Email> 0021 0022 #include <algorithm> 0023 0024 namespace KGAPI2::People 0025 { 0026 class EmailAddress::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 && metadata == other.metadata && type == other.type && displayName == other.displayName 0039 && formattedType == other.formattedType; 0040 } 0041 0042 bool operator!=(const Private &other) const 0043 { 0044 return !(*this == other); 0045 } 0046 0047 QString value{}; 0048 FieldMetadata metadata{}; 0049 QString type{}; 0050 QString displayName{}; 0051 QString formattedType{}; 0052 }; 0053 0054 EmailAddress::EmailAddress() 0055 : d(new Private) 0056 { 0057 } 0058 0059 EmailAddress::EmailAddress(const EmailAddress &) = default; 0060 EmailAddress::EmailAddress(EmailAddress &&) noexcept = default; 0061 EmailAddress &EmailAddress::operator=(const EmailAddress &) = default; 0062 EmailAddress &EmailAddress::operator=(EmailAddress &&) noexcept = default; 0063 EmailAddress::~EmailAddress() = default; 0064 0065 bool EmailAddress::operator==(const EmailAddress &other) const 0066 { 0067 return *d == *other.d; 0068 } 0069 0070 bool EmailAddress::operator!=(const EmailAddress &other) const 0071 { 0072 return !(*this == other); 0073 } 0074 0075 QString EmailAddress::value() const 0076 { 0077 return d->value; 0078 } 0079 0080 void EmailAddress::setValue(const QString &value) 0081 { 0082 d->value = value; 0083 } 0084 FieldMetadata EmailAddress::metadata() const 0085 { 0086 return d->metadata; 0087 } 0088 0089 void EmailAddress::setMetadata(const FieldMetadata &value) 0090 { 0091 d->metadata = value; 0092 } 0093 QString EmailAddress::type() const 0094 { 0095 return d->type; 0096 } 0097 0098 void EmailAddress::setType(const QString &value) 0099 { 0100 d->type = value; 0101 } 0102 QString EmailAddress::displayName() const 0103 { 0104 return d->displayName; 0105 } 0106 0107 void EmailAddress::setDisplayName(const QString &value) 0108 { 0109 d->displayName = value; 0110 } 0111 QString EmailAddress::formattedType() const 0112 { 0113 return d->formattedType; 0114 } 0115 0116 EmailAddress EmailAddress::fromJSON(const QJsonObject &obj) 0117 { 0118 EmailAddress emailAddress; 0119 0120 if(!obj.isEmpty()) { 0121 const auto metadata = obj.value(QStringLiteral("metadata")).toObject(); 0122 emailAddress.d->metadata = FieldMetadata::fromJSON(metadata); 0123 emailAddress.d->value = obj.value(QStringLiteral("value")).toString(); 0124 emailAddress.d->type = obj.value(QStringLiteral("type")).toString(); 0125 emailAddress.d->formattedType = obj.value(QStringLiteral("formattedType")).toString(); 0126 emailAddress.d->displayName = obj.value(QStringLiteral("displayName")).toString(); 0127 } 0128 0129 return emailAddress; 0130 } 0131 0132 QList<EmailAddress> EmailAddress::fromJSONArray(const QJsonArray &data) 0133 { 0134 QList<EmailAddress> emailAddresses; 0135 0136 for(const auto &emailAddress : data) { 0137 if(emailAddress.isObject()) { 0138 const auto objectifiedEmailAddress = emailAddress.toObject(); 0139 emailAddresses.append(fromJSON(objectifiedEmailAddress)); 0140 } 0141 } 0142 0143 return emailAddresses; 0144 } 0145 0146 0147 QJsonValue EmailAddress::toJSON() const 0148 { 0149 QJsonObject obj; 0150 0151 PeopleUtils::addValueToJsonObjectIfValid(obj, "value", d->value); 0152 // Skip, field metadata is only useful for receiving -> PeopleUtils::addValueToJsonObjectIfValid(obj, "metadata", d->metadata.toJSON()); 0153 PeopleUtils::addValueToJsonObjectIfValid(obj, "type", d->type); 0154 PeopleUtils::addValueToJsonObjectIfValid(obj, "displayName", d->displayName); 0155 // Output only -> PeopleUtils::addValueToJsonObjectIfValid(obj, "formattedType", d->formattedType); 0156 return obj; 0157 } 0158 0159 KContacts::Email EmailAddress::toKContactsEmail() const 0160 { 0161 KContacts::Email convertedEmail; 0162 convertedEmail.setEmail(value()); 0163 0164 const auto emailType = type(); 0165 0166 if(QString::compare(emailType, QStringLiteral("home"), Qt::CaseInsensitive)) { 0167 convertedEmail.setType(KContacts::Email::Home); 0168 } else if(QString::compare(emailType, QStringLiteral("work"), Qt::CaseInsensitive)) { 0169 convertedEmail.setType(KContacts::Email::Work); 0170 } else if(QString::compare(emailType, QStringLiteral("other"), Qt::CaseInsensitive)) { 0171 convertedEmail.setType(KContacts::Email::Other); 0172 } 0173 0174 return convertedEmail; 0175 } 0176 0177 EmailAddress EmailAddress::fromKContactsEmail(const KContacts::Email &email) 0178 { 0179 EmailAddress convertedEmail; 0180 convertedEmail.setValue(email.mail()); 0181 0182 switch(email.type()) { 0183 case KContacts::Email::Home: 0184 convertedEmail.setType(QStringLiteral("home")); 0185 break; 0186 case KContacts::Email::Work: 0187 convertedEmail.setType(QStringLiteral("work")); 0188 break; 0189 case KContacts::Email::Other: 0190 default: 0191 convertedEmail.setType(QStringLiteral("other")); 0192 break; 0193 } 0194 0195 return convertedEmail; 0196 } 0197 0198 QList<EmailAddress> EmailAddress::fromKContactsEmailList(const QList<KContacts::Email> &emailList) 0199 { 0200 QList<EmailAddress> convertedEmails; 0201 std::transform(emailList.cbegin(), 0202 emailList.cend(), 0203 std::back_inserter(convertedEmails), 0204 [](const KContacts::Email &email) { 0205 return EmailAddress::fromKContactsEmail(email); 0206 }); 0207 return convertedEmails; 0208 } 0209 0210 } // namespace KGAPI2::People