/* * 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 #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 FilterTree::match(const QString& domain, const QString& requestUrl) const { QVector 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); }