/* * 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 */ #ifndef SMOLBOTE_FILTERTREE_H #define SMOLBOTE_FILTERTREE_H #include "domain.h" #include "filterleaf.h" #include #include #include #include #include /** FilterTree: B+ tree of filter rules * The tree contains branches that represent domains * Each domain-branch contains leaves (rules) that are to be applied to it. * Rules may be applied to multiple branches. */ class FilterTree : public QObject { Q_OBJECT public: ~FilterTree(); const QStringList branches() const; QVector match(const QUrl &domain, const QUrl &requestUrl) const; bool addRule(FilterLeaf *rule, const QString &domain); private: struct Branch { explicit Branch(const QString &host) : domain(host) { } explicit Branch(Branch &&other) : domain(std::move(other.domain)) , leaves(std::move(other.leaves)) { } Domain domain; std::vector leaves; }; Branch& branch(const QString &domain); QMutex branchLock; std::vector m_branches; }; bool loadHostlist(QIODevice &from, FilterTree *tree); #endif // SMOLBOTE_FILTERTREE_H