1 | /* |
2 | This file is part of libkabc. |
3 | SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org> |
4 | |
5 | SPDX-License-Identifier: LGPL-2.0-or-later |
6 | */ |
7 | |
8 | #include "impp.h" |
9 | #include "kcontacts_debug.h" |
10 | #include "parametermap_p.h" |
11 | |
12 | #include <KDesktopFile> |
13 | |
14 | #include <QDataStream> |
15 | #include <QDirIterator> |
16 | #include <QStandardPaths> |
17 | #include <QStringList> |
18 | #include <QUrl> |
19 | |
20 | using namespace KContacts; |
21 | |
22 | class Q_DECL_HIDDEN Impp::Private : public QSharedData |
23 | { |
24 | public: |
25 | Private() = default; |
26 | Private(const Private &other) |
27 | : QSharedData(other) |
28 | { |
29 | mParamMap = other.mParamMap; |
30 | } |
31 | |
32 | ParameterMap mParamMap; |
33 | QUrl address; |
34 | }; |
35 | |
36 | Impp::Impp() |
37 | : d(new Private) |
38 | { |
39 | } |
40 | |
41 | Impp::Impp(const Impp &other) |
42 | : d(other.d) |
43 | { |
44 | } |
45 | |
46 | Impp::Impp(const QUrl &address) |
47 | : d(new Private) |
48 | { |
49 | d->address = address; |
50 | } |
51 | |
52 | Impp::~Impp() |
53 | { |
54 | } |
55 | |
56 | bool Impp::isValid() const |
57 | { |
58 | return !d->address.isEmpty() && !d->address.scheme().isEmpty(); |
59 | } |
60 | |
61 | void Impp::setAddress(const QUrl &address) |
62 | { |
63 | d->address = address; |
64 | } |
65 | |
66 | QUrl Impp::address() const |
67 | { |
68 | return d->address; |
69 | } |
70 | |
71 | QString Impp::serviceType() const |
72 | { |
73 | return d->address.scheme(); |
74 | } |
75 | |
76 | QString Impp::serviceLabel() const |
77 | { |
78 | return serviceLabel(serviceType: serviceType()); |
79 | } |
80 | |
81 | QString Impp::serviceIcon() const |
82 | { |
83 | return serviceIcon(serviceType: serviceType()); |
84 | } |
85 | |
86 | bool Impp::isPreferred() const |
87 | { |
88 | const auto it = d->mParamMap.findParam(param: QLatin1String("pref" )); |
89 | if (it != d->mParamMap.cend()) { |
90 | return !it->paramValues.isEmpty() && it->paramValues.at(i: 0) == QLatin1Char('1'); |
91 | } |
92 | return false; |
93 | } |
94 | |
95 | void Impp::setPreferred(bool preferred) |
96 | { |
97 | if (!preferred) { |
98 | auto paramIt = d->mParamMap.findParam(QStringLiteral("pref" )); |
99 | if (paramIt != d->mParamMap.end()) { |
100 | d->mParamMap.erase(position: paramIt); |
101 | } |
102 | } else { |
103 | auto paramIt = d->mParamMap.findParam(QStringLiteral("pref" )); |
104 | if (paramIt != d->mParamMap.end()) { |
105 | paramIt->paramValues = QStringList{QStringLiteral("1" )}; |
106 | } else { |
107 | d->mParamMap.insertParam(newdata: {QStringLiteral("pref" ), .paramValues: {QStringLiteral("1" )}}); |
108 | } |
109 | } |
110 | } |
111 | |
112 | void Impp::setParams(const ParameterMap ¶ms) |
113 | { |
114 | d->mParamMap = params; |
115 | } |
116 | |
117 | ParameterMap Impp::params() const |
118 | { |
119 | return d->mParamMap; |
120 | } |
121 | |
122 | bool Impp::operator==(const Impp &other) const |
123 | { |
124 | return (d->mParamMap == other.d->mParamMap) && (d->address == other.address()); |
125 | } |
126 | |
127 | bool Impp::operator!=(const Impp &other) const |
128 | { |
129 | return !(other == *this); |
130 | } |
131 | |
132 | Impp &Impp::operator=(const Impp &other) |
133 | { |
134 | if (this != &other) { |
135 | d = other.d; |
136 | } |
137 | |
138 | return *this; |
139 | } |
140 | |
141 | QString Impp::toString() const |
142 | { |
143 | QString str = QLatin1String("Impp {\n" ); |
144 | str += QStringLiteral(" type: %1\n" ).arg(a: serviceType()); |
145 | str += QStringLiteral(" address: %1\n" ).arg(a: d->address.url()); |
146 | str += d->mParamMap.toString(); |
147 | str += QLatin1String("}\n" ); |
148 | return str; |
149 | } |
150 | |
151 | QDataStream &KContacts::operator<<(QDataStream &s, const Impp &impp) |
152 | { |
153 | return s << impp.d->mParamMap << impp.d->address << (uint32_t)(0); |
154 | } |
155 | |
156 | QDataStream &KContacts::operator>>(QDataStream &s, Impp &impp) |
157 | { |
158 | int i; |
159 | s >> impp.d->mParamMap >> impp.d->address >> i; |
160 | return s; |
161 | } |
162 | |
163 | static QString improtcolFile(const QString &serviceType) |
164 | { |
165 | const auto path = |
166 | QStandardPaths::locate(type: QStandardPaths::GenericDataLocation, QStringLiteral("kf5/kcontacts/improtocols/" ) + serviceType + QStringLiteral(".desktop" )); |
167 | if (!path.isEmpty()) { |
168 | return path; |
169 | } |
170 | return QStringLiteral(":/org.kde.kcontacts/improtocols/" ) + serviceType + QStringLiteral(".desktop" ); |
171 | } |
172 | |
173 | QString Impp::serviceLabel(const QString &serviceType) |
174 | { |
175 | const auto path = improtcolFile(serviceType); |
176 | KDesktopFile df(path); |
177 | return df.readName(); |
178 | } |
179 | |
180 | QString Impp::serviceIcon(const QString &serviceType) |
181 | { |
182 | const auto path = improtcolFile(serviceType); |
183 | KDesktopFile df(path); |
184 | return df.readIcon(); |
185 | } |
186 | |
187 | QList<QString> Impp::serviceTypes() |
188 | { |
189 | QList<QString> types; |
190 | auto paths = QStandardPaths::locateAll(type: QStandardPaths::GenericDataLocation, QStringLiteral("kf5/kcontacts/improtocols" ), options: QStandardPaths::LocateDirectory); |
191 | paths.push_back(QStringLiteral(":/org.kde.kcontacts/improtocols/" )); |
192 | for (const auto &path : paths) { |
193 | QDirIterator it(path, QDir::Files); |
194 | while (it.hasNext()) { |
195 | it.next(); |
196 | const auto fi = it.fileInfo(); |
197 | if (fi.suffix() == QLatin1String("desktop" )) { |
198 | types.push_back(t: fi.baseName()); |
199 | } |
200 | } |
201 | } |
202 | |
203 | std::sort(first: types.begin(), last: types.end()); |
204 | types.erase(abegin: std::unique(first: types.begin(), last: types.end()), aend: types.end()); |
205 | return types; |
206 | } |
207 | |
208 | #include "moc_impp.cpp" |
209 | |