1/*
2 This file is part of the KContacts framework.
3 SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
4
5 SPDX-License-Identifier: LGPL-2.0-or-later
6*/
7
8#include "email.h"
9#include "parametermap_p.h"
10
11#include <QDataStream>
12#include <QStringList>
13
14using namespace KContacts;
15
16class Q_DECL_HIDDEN Email::Private : public QSharedData
17{
18public:
19 Private()
20 {
21 }
22
23 Private(const Private &other)
24 : QSharedData(other)
25 {
26 mParamMap = other.mParamMap;
27 mail = other.mail;
28 }
29
30 ParameterMap mParamMap;
31
32 QString mail;
33};
34
35Email::Email()
36 : d(new Private)
37{
38}
39
40Email::Email(const QString &mail)
41 : d(new Private)
42{
43 d->mail = mail;
44}
45
46Email::Email(const Email &other)
47 : d(other.d)
48{
49}
50
51Email::~Email()
52{
53}
54
55bool Email::operator==(const Email &other) const
56{
57 return (d->mParamMap == other.d->mParamMap) && (d->mail == other.mail());
58}
59
60bool Email::operator!=(const Email &other) const
61{
62 return !(other == *this);
63}
64
65Email &Email::operator=(const Email &other)
66{
67 if (this != &other) {
68 d = other.d;
69 }
70
71 return *this;
72}
73
74QString Email::toString() const
75{
76 QString str = QLatin1String("Email {\n");
77 str += QStringLiteral(" mail: %1\n").arg(a: d->mail);
78 str += d->mParamMap.toString();
79 str += QLatin1String("}\n");
80 return str;
81}
82
83void Email::setParams(const ParameterMap &params)
84{
85 d->mParamMap = params;
86}
87
88ParameterMap Email::params() const
89{
90 return d->mParamMap;
91}
92
93void Email::setEmail(const QString &mail)
94{
95 d->mail = mail;
96}
97
98QString Email::mail() const
99{
100 return d->mail;
101}
102
103bool Email::isValid() const
104{
105 return !d->mail.isEmpty();
106}
107
108struct email_type_name {
109 const char *name;
110 Email::Type type;
111};
112
113static const email_type_name email_type_names[] = {
114 {.name: "HOME", .type: Email::Home},
115 {.name: "WORK", .type: Email::Work},
116 {.name: "OTHER", .type: Email::Other},
117};
118
119Email::Type Email::type() const
120{
121 const auto it = d->mParamMap.findParam(param: QLatin1String("type"));
122 if (it == d->mParamMap.end()) {
123 return Unknown;
124 }
125
126 Type type = Unknown;
127 for (const auto &s : it->paramValues) {
128 const auto it = std::find_if(first: std::begin(arr: email_type_names), last: std::end(arr: email_type_names), pred: [&s](const email_type_name &t) {
129 const QString tName = QLatin1String(t.name);
130 return tName == s.toUpper();
131 });
132 if (it != std::end(arr: email_type_names)) {
133 type |= (*it).type;
134 }
135 }
136 return type;
137}
138
139void Email::setType(Type type)
140{
141 const auto oldType = this->type();
142
143 const QString paramName(QStringLiteral("type"));
144
145 ParameterMap::iterator theIt;
146
147 auto it = d->mParamMap.findParam(param: paramName);
148 if (it != d->mParamMap.end()) {
149 theIt = it;
150 } else {
151 theIt = d->mParamMap.insertParam(newdata: {.param: paramName, .paramValues: {}});
152 }
153
154 for (const auto &t : email_type_names) {
155 if (((type ^ oldType) & t.type) == 0) {
156 continue; // no change
157 }
158
159 if (type & t.type) {
160 theIt->paramValues.push_back(t: QLatin1String(t.name));
161 } else {
162 theIt->paramValues.removeAll(t: QLatin1String(t.name));
163 }
164 }
165}
166
167bool Email::isPreferred() const
168{
169 auto it = d->mParamMap.findParam(param: QLatin1String("pref"));
170 if (it != d->mParamMap.end()) {
171 return !it->paramValues.isEmpty() && it->paramValues.at(i: 0) == QLatin1Char('1');
172 }
173
174 it = d->mParamMap.findParam(param: QLatin1String("type"));
175 if (it != d->mParamMap.end()) {
176 return it->paramValues.contains(str: QLatin1String("PREF"), cs: Qt::CaseInsensitive);
177 }
178
179 return false;
180}
181
182void Email::setPreferred(bool preferred)
183{
184 if (preferred == isPreferred()) {
185 return;
186 }
187
188 const QString paramName(QStringLiteral("type"));
189
190 auto typeIt = d->mParamMap.findParam(param: paramName);
191 QStringList types = typeIt != d->mParamMap.end() ? typeIt->paramValues : QStringList{};
192
193 if (!preferred) {
194 auto prefIt = d->mParamMap.findParam(param: QLatin1String("pref"));
195 if (prefIt != d->mParamMap.end()) {
196 d->mParamMap.erase(position: prefIt);
197 }
198
199 types.removeAll(t: QLatin1String("PREF"));
200 } else {
201 types.push_back(QStringLiteral("PREF"));
202 }
203
204 typeIt = d->mParamMap.findParam(param: paramName);
205 if (typeIt != d->mParamMap.end()) {
206 typeIt->paramValues = types;
207 } else {
208 d->mParamMap.insertParam(newdata: {.param: paramName, .paramValues: types});
209 }
210}
211
212QDataStream &KContacts::operator<<(QDataStream &s, const Email &email)
213{
214 return s << email.d->mParamMap << email.d->mail;
215}
216
217QDataStream &KContacts::operator>>(QDataStream &s, Email &email)
218{
219 s >> email.d->mParamMap >> email.d->mail;
220 return s;
221}
222
223#include "moc_email.cpp"
224

source code of kcontacts/src/email.cpp