/** LICENSE ********************************************************************
**
** smolbote: yet another qute browser
** Copyright (C) 2017 Xian Nox
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see .
**
******************************************************************************/
#include "blockersubscription.h"
#include "ui_subscriptionform.h"
#include "browser.h"
#include
#include
#include
BlockerSubscription::BlockerSubscription(const QString url, QWidget *parent) :
QWidget(parent),
ui(new Ui::SubscriptionForm)
{
ui->setupUi(this);
QUrl _url = QUrl::fromUserInput(url);
m_name = _url.fileName();
if(!sSettings->value("blocker.path").toString().isEmpty()) {
QString cacheName = sSettings->value("blocker.path").toString() + m_name;
QFile *cache = new QFile(cacheName);
if(cache->exists()) {
load(cache);
}
} else {
// no cache path specified - pull the subscription
QNetworkRequest request;
request.setUrl(QUrl::fromUserInput(url));
QNetworkReply *reply = sNetwork->get(request);
connect(reply, &QNetworkReply::finished, [this, reply]() {
this->load(reply);
});
}
}
BlockerSubscription::~BlockerSubscription()
{
delete ui;
}
QString BlockerSubscription::name() const
{
return m_name;
}
void BlockerSubscription::load(QIODevice *dev)
{
QTextStream subscription(dev);
QString header = subscription.readLine();
if(!header.startsWith("[Adblock Plus")) {
qDebug("Invalid format of subscription: %s", qUtf8Printable(m_name));
return;
}
// clear all lists
m_urlBlacklist.clear();
m_urlWhitelist.clear();
int rules = 0;
while(!subscription.atEnd()) {
QString line = subscription.readLine();
if(!line.isEmpty()) {
if(line.startsWith('!')) {
parseComment(line);
} else {
// The line is not a comment
rules++;
BlockerRule *rule = new BlockerRule(line, this);
if(rule->isValid()) {
if(rule->isException()) {
m_urlWhitelist.append(rule);
ui->whitelist_listWidget->addItem(rule->toString());
} else {
ui->blacklist_listWidget->addItem(rule->toString());
m_urlBlacklist.append(rule);
}
}
}
}
}
qDebug("Loaded %i/%i rules from subscription %s", m_urlBlacklist.count() + m_urlWhitelist.count(), rules, qUtf8Printable(m_name));
dev->deleteLater();
}
void BlockerSubscription::parseComment(const QString &line)
{
if(line.startsWith("! Title: ")) {
ui->title->setText(line.right(line.length() - 9));
return;
}
if(line.startsWith("! Homepage: ")) {
ui->homepage->setText(line.right(line.length() - 12));
return;
}
if(line.startsWith("! Licence: ")) {
ui->license->setText(line.right(line.length() - 11));
return;
}
if(line.startsWith("! Version: ")) {
ui->version->setText(line.right(line.length() - 11));
return;
}
if(line.startsWith("! Last modified: ")) {
ui->lastModified->setText(line.right(line.length() - 17));
return;
}
if(line.startsWith("! Expires: ")) {
ui->expires->setText(line.right(line.length() - 11).left(2));
return;
}
}