blob: 8844a76d8ddc9ebeb700c3c820c56126fe922750 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
/*
* This file is part of smolbote. It's copyrighted by the contributors recorded
* in the version control history of the file, available from its original
* location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote
*
* SPDX-License-Identifier: GPL-3.0
*/
#include "filtertree.h"
#include "filterleaf.h"
#include <QTextStream>
#include "formats/hostlistrule.h"
bool loadHostlist(QIODevice &from, FilterTree* tree)
{
Q_ASSERT(from.isReadable());
QTextStream stream(&from);
while(!stream.atEnd()) {
const QString line = stream.readLine().trimmed();
if(line.isEmpty() || line.startsWith(QLatin1Literal("#")))
continue;
const QStringList &parts = line.split(QLatin1Literal(" "));
if(parts.length() < 2) {
#ifdef QT_DEBUG
qDebug("Cannot parse: %s", qUtf8Printable(line));
#endif
return false;
}
for(int i = 1; i < parts.length(); ++i) {
// HostlistRule(domain, redirect)
auto *rule = new HostlistRule(parts.at(i), parts.constFirst());
// addRule(rule, enable_on_domain)
const bool added = tree->addRule(rule, QString());
if(!added)
return false;
}
}
return true;
}
const QStringList FilterTree::branches() const
{
QStringList branches;
for(auto &branch : m_branches) {
branches.append(QString::fromStdString(branch.domain));
}
return branches;
}
QVector<const FilterLeaf *> FilterTree::match(const QString& domain, const QString& requestUrl) const
{
QVector<const FilterLeaf *> leaves;
for(const auto &branch : m_branches) {
if(branch.domain == domain.toStdString()) {
for(const auto leaf : branch.leaves) {
if(leaf->match(requestUrl)) {
leaves.append(leaf);
}
}
}
}
return leaves;
}
bool FilterTree::addRule(FilterLeaf *rule, const QString& domain)
{
for(auto &branch : m_branches) {
if(branch.domain == domain.toStdString()) {
branch.leaves.emplace_back(rule);
return true;
}
}
// no branch was found
Branch branch;
branch.domain = domain.toStdString();
// TODO: for some reason, can't add rule here
//branch.leaves.emplace_back(rule);
m_branches.emplace_back(std::move(branch));
return this->addRule(rule, domain);
}
|