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