LeechCraft 0.6.70-19214-g121e5318a7
Modular cross-platform feature rich live environment.
Loading...
Searching...
No Matches
anutil.cpp
Go to the documentation of this file.
1/**********************************************************************
2 * LeechCraft - modular cross-platform feature rich internet client.
3 * Copyright (C) 2006-2014 Georg Rudoy
4 *
5 * Distributed under the Boost Software License, Version 1.0.
6 * (See accompanying file LICENSE or copy at https://www.boost.org/LICENSE_1_0.txt)
7 **********************************************************************/
8
9#include "anutil.h"
10#include <algorithm>
11#include <QObject>
12#include <QMap>
15#include <util/sll/qtutil.h>
16#include <util/sll/visitor.h>
17
18namespace LC::Util::AN
19{
20 namespace LAN = LC::AN;
21
22 QMap<QString, QString> GetCategoryNameMap ()
23 {
24 static const QMap<QString, QString> cat2hr
25 {
26 { LAN::CatIM, QObject::tr ("Instant messaging") },
27 { LAN::CatOrganizer, QObject::tr ("Organizer") },
28 { LAN::CatDownloads, QObject::tr ("Downloads") },
29 { LAN::CatPackageManager, QObject::tr ("Package manager") },
30 { LAN::CatMediaPlayer, QObject::tr ("Media player") },
31 { LAN::CatTerminal, QObject::tr ("Terminal") },
32 { LAN::CatNews, QObject::tr ("News") },
33 { LAN::CatGeneric, QObject::tr ("Generic") }
34 };
35 return cat2hr;
36 }
37
38 QStringList GetKnownEventTypes (const QString& category)
39 {
40 static const QMap<QString, QStringList> cat2types
41 {
42 {
43 LAN::CatIM,
44 {
45 LAN::TypeIMAttention,
46 LAN::TypeIMIncFile,
47 LAN::TypeIMIncMsg,
48 LAN::TypeIMMUCHighlight,
49 LAN::TypeIMMUCInvite,
50 LAN::TypeIMMUCMsg,
51 LAN::TypeIMStatusChange,
52 LAN::TypeIMSubscrGrant,
53 LAN::TypeIMSubscrRequest,
54 LAN::TypeIMSubscrRevoke,
55 LAN::TypeIMSubscrSub,
56 LAN::TypeIMSubscrUnsub,
57 LAN::TypeIMEventTuneChange,
58 LAN::TypeIMEventMoodChange,
59 LAN::TypeIMEventActivityChange,
60 LAN::TypeIMEventLocationChange
61 }
62 },
63 {
64 LAN::CatOrganizer,
65 {
66 LAN::TypeOrganizerEventDue
67 }
68 },
69 {
70 LAN::CatDownloads,
71 {
72 LAN::TypeDownloadError,
73 LAN::TypeDownloadFinished
74 }
75 },
76 {
77 LAN::CatPackageManager,
78 {
79 LAN::TypePackageUpdated
80 }
81 },
82 {
83 LAN::CatMediaPlayer,
84 {
85 LAN::TypeMediaPlaybackStatus
86 }
87 },
88 {
89 LAN::CatTerminal,
90 {
91 LAN::TypeTerminalActivity,
92 LAN::TypeTerminalInactivity,
93 LAN::TypeTerminalBell
94 }
95 },
96 {
97 LAN::CatNews,
98 {
99 LAN::TypeNewsSourceUpdated,
100 LAN::TypeNewsSourceBroken
101 }
102 },
103 {
104 LAN::CatGeneric,
105 {
106 LAN::TypeGeneric
107 }
108 }
109 };
110 return cat2types.value (category);
111 }
112
113 QString GetCategoryName (const QString& category)
114 {
115 return GetCategoryNameMap ().value (category, category);
116 }
117
118 QString GetTypeName (const QString& type)
119 {
120 static const QMap<QString, QString> type2hr
121 {
122 { LAN::TypeIMAttention, QObject::tr ("Attention request") },
123 { LAN::TypeIMIncFile, QObject::tr ("Incoming file transfer request") },
124 { LAN::TypeIMIncMsg, QObject::tr ("Incoming chat message") },
125 { LAN::TypeIMMUCHighlight, QObject::tr ("MUC highlight") },
126 { LAN::TypeIMMUCInvite, QObject::tr ("MUC invitation") },
127 { LAN::TypeIMMUCMsg, QObject::tr ("General MUC message") },
128 { LAN::TypeIMStatusChange, QObject::tr ("Contact status change") },
129 { LAN::TypeIMSubscrGrant, QObject::tr ("Authorization granted") },
130 { LAN::TypeIMSubscrRevoke, QObject::tr ("Authorization revoked") },
131 { LAN::TypeIMSubscrRequest, QObject::tr ("Authorization requested") },
132 { LAN::TypeIMSubscrSub, QObject::tr ("Contact subscribed") },
133 { LAN::TypeIMSubscrUnsub, QObject::tr ("Contact unsubscribed") },
134 { LAN::TypeIMEventTuneChange, QObject::tr ("Contact's tune changed") },
135 { LAN::TypeIMEventMoodChange, QObject::tr ("Contact's mood changed") },
136 { LAN::TypeIMEventActivityChange, QObject::tr ("Contact's activity changed") },
137 { LAN::TypeIMEventLocationChange, QObject::tr ("Contact's location changed") },
138
139 { LAN::TypeOrganizerEventDue, QObject::tr ("Event is due") },
140
141 { LAN::TypeDownloadError, QObject::tr ("Download error") },
142 { LAN::TypeDownloadFinished, QObject::tr ("Download finished") },
143
144 { LAN::TypePackageUpdated, QObject::tr ("Package updated") },
145
146 { LAN::TypeMediaPlaybackStatus, QObject::tr ("Media playback status changed") },
147
148 { LAN::TypeTerminalBell, QObject::tr ("Bell in a terminal") },
149 { LAN::TypeTerminalActivity, QObject::tr ("Activity in a terminal") },
150 { LAN::TypeTerminalInactivity, QObject::tr ("Inactivity in a terminal") },
151
152 { LAN::TypeNewsSourceUpdated, QObject::tr ("News source got updated") },
153 { LAN::TypeNewsSourceBroken, QObject::tr ("News source is detected to be broken") },
154
155 { LAN::TypeGeneric, QObject::tr ("Generic") }
156 };
157 return type2hr.value (type, type);
158 }
159
161
162 QVariant ToVariant (const SVM::Pattern& matcher)
163 {
164 const auto value = Visit (matcher,
165 [] (const QRegularExpression& expr) { return QVariant { expr }; },
166 [] (const auto& wrapper) { return QVariant { wrapper.Pattern_ }; });
167 return QVariantMap
168 {
169 { "index"_qs, static_cast<int> (matcher.index ()) },
170 { "value"_qs, value },
171 };
172 }
173
174 std::optional<SVM::Pattern> StringPatternFromVariant (const QVariant& var)
175 {
176 const auto& map = var.toMap ();
177 const auto idx = map ["index"_qs].toInt ();
178 const auto value = map ["value"_qs];
179 switch (idx)
180 {
181 case 0:
182 return SVM::Substring { value.toString () };
183 case 1:
184 return SVM::Wildcard { value.toString () };
185 case 2:
186 return value.toRegularExpression ();
187 case 3:
188 return SVM::Exact { value.toString () };
189 default:
190 return {};
191 }
192 }
193
194 namespace
195 {
196 bool MatchStringPattern (const QString& string, const SVM::Pattern& matcher)
197 {
198 return Visit (matcher,
199 [&] (const QRegularExpression& rx) { return string.contains (rx); },
200 [&] (const SVM::Substring& em) { return string.contains (em.Pattern_); },
201 [&] (const SVM::Wildcard& wc) { return string.contains (wc.Compiled_); },
202 [&] (const SVM::Exact& em) { return string == em.Pattern_; });
203 }
204 }
205
206 bool Matches (const QString& string, const LC::AN::StringValueMatcher& matcher)
207 {
208 return MatchStringPattern (string, matcher.Pattern_) == matcher.Positive_;
209 }
210
211 bool Matches (const QStringList& strings, const LC::AN::StringValueMatcher& matcher)
212 {
213 return std::ranges::any_of (strings, [&matcher] (const QString& str) { return MatchStringPattern (str, matcher.Pattern_); }) == matcher.Positive_;
214 }
215
216 bool Matches (const QUrl& url, const LC::AN::StringValueMatcher& matcher)
217 {
218 const auto strMatches = MatchStringPattern (url.toString (), matcher.Pattern_)
219 || MatchStringPattern (QString::fromLatin1 (url.toEncoded ()), matcher.Pattern_);
220 return strMatches == matcher.Positive_;
221 }
222
223 bool Matches (bool value, const LC::AN::BoolValueMatcher& matcher)
224 {
225 return value == matcher.Value_;
226 }
227
228 bool Matches (int value, const LC::AN::IntValueMatcher& matcher)
229 {
231
232 if ((matcher.Ops_ & OEqual) && value == matcher.Boundary_)
233 return true;
234 if ((matcher.Ops_ & OGreater) && value > matcher.Boundary_)
235 return true;
236 if ((matcher.Ops_ & OLess) && value < matcher.Boundary_)
237 return true;
238
239 return false;
240 }
241
242 bool Matches (const QVariant& var, QMetaType::Type expected, const LC::AN::ValueMatcher& matcher)
243 {
244 if (!var.isValid ())
245 return false;
246
247 if (var.metaType ().id () != expected)
248 {
249 qCritical () << "expected" << QMetaType { expected } << "; got" << var.metaType () << var;
250 return false;
251 }
252
253 const auto ensureExpected = [&] (auto... types)
254 {
255 if (((expected == types) || ...))
256 return true;
257 ((qCritical () << "expected metatype" << QMetaType { expected } << "for matcher supporting") << ... << QMetaType { types });
258 return false;
259 };
260
261 using namespace LC::AN;
262 return Visit (matcher,
263 [&] (const BoolValueMatcher& m) { return ensureExpected (QMetaType::Bool) && Matches (var.toBool (), m); },
264 [&] (const IntValueMatcher& m) { return ensureExpected (QMetaType::Int) && Matches (var.toInt (), m); },
265 [&] (const StringValueMatcher& m)
266 {
267 switch (expected)
268 {
269 case QMetaType::QString:
270 return Matches (var.toString (), m);
271 case QMetaType::QStringList:
272 return Matches (var.toStringList (), m);
273 case QMetaType::QUrl:
274 return Matches (var.toUrl (), m);
275 default:
276 qCritical () << "unexpected metatype" << QMetaType { expected } << "for string matcher";
277 return false;
278 }
279 });
280 }
281}
std::variant< BoolValueMatcher, IntValueMatcher, StringValueMatcher > ValueMatcher
A matcher for a value of any supported type.
Definition ianemitter.h:194
QMap< QString, QString > GetCategoryNameMap()
Returns the map from the category ID to its name.
Definition anutil.cpp:22
bool Matches(const QString &string, const LC::AN::StringValueMatcher &matcher)
Definition anutil.cpp:206
QVariant ToVariant(const SVM::Pattern &matcher)
Definition anutil.cpp:162
std::optional< SVM::Pattern > StringPatternFromVariant(const QVariant &var)
Definition anutil.cpp:174
QStringList GetKnownEventTypes(const QString &category)
Returns the known events types for the given category.
Definition anutil.cpp:38
LC::AN::StringValueMatcher SVM
Definition anutil.cpp:160
QString GetTypeName(const QString &type)
Returns the human-readable name of the event type.
Definition anutil.cpp:118
QString GetCategoryName(const QString &category)
Returns the human-readable name of the event category.
Definition anutil.cpp:113
auto Visit(const Either< Left, Right > &either, Args &&... args)
Definition either.h:189
Matches boolean values.
Definition ianemitter.h:98
bool Value_
The value to match.
Definition ianemitter.h:101
Matches integer values.
Definition ianemitter.h:109
Operation
Describes the elementary semantics of Boundary_.
Definition ianemitter.h:117
int Boundary_
The boundary to compare the matched values against.
Definition ianemitter.h:112
Operations Ops_
Describe the semantics of Boundary_.
Definition ianemitter.h:137
Matches string values.
Definition ianemitter.h:145
bool Positive_
Whether the values should match or not match Pattern_.
Definition ianemitter.h:187
Pattern Pattern_
The pattern the values should (not) match.
Definition ianemitter.h:180