192 lines
5.8 KiB
C++
Executable file
192 lines
5.8 KiB
C++
Executable file
#include "network-web/webfactory.h"
|
||
|
||
#include "miscellaneous/application.h"
|
||
|
||
#include <QRegExp>
|
||
#include <QWebSettings>
|
||
#include <QProcess>
|
||
#include <QUrl>
|
||
#include <QDesktopServices>
|
||
|
||
|
||
QPointer<WebFactory> WebFactory::s_instance;
|
||
|
||
WebFactory::WebFactory(QObject *parent)
|
||
: QObject(parent), m_escapes(QMap<QString, QString>()),
|
||
m_deEscapes(QMap<QString, QString>()),
|
||
m_globalSettings(QWebSettings::globalSettings()) {
|
||
}
|
||
|
||
WebFactory::~WebFactory() {
|
||
}
|
||
|
||
void WebFactory::loadState() {
|
||
Settings *settings = qApp->settings();
|
||
|
||
switchJavascript(settings->value(GROUP(Browser), SETTING(Browser::JavascriptEnabled)).toBool(), false);
|
||
switchImages(settings->value(GROUP(Browser), SETTING(Browser::ImagesEnabled)).toBool(), false);
|
||
switchPlugins(settings->value(GROUP(Browser), SETTING(Browser::PluginsEnabled)).toBool(), false);
|
||
}
|
||
|
||
bool WebFactory::sendMessageViaEmail(const Message &message) {
|
||
if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailEnabled)).toBool()) {
|
||
QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailExecutable)).toString();
|
||
QString arguments = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailArguments)).toString();
|
||
|
||
return QProcess::startDetached(QString("\"") + browser + "\" " + arguments.arg(message.m_title,
|
||
stripTags(message.m_contents)));
|
||
}
|
||
else {
|
||
// Send it via mailto protocol.
|
||
// NOTE: http://en.wikipedia.org/wiki/Mailto
|
||
return QDesktopServices::openUrl(QString("mailto:?subject=%1&body=%2").arg(QString(QUrl::toPercentEncoding(message.m_title)),
|
||
QString(QUrl::toPercentEncoding(stripTags(message.m_contents)))));
|
||
}
|
||
}
|
||
|
||
bool WebFactory::openUrlInExternalBrowser(const QString &url) {
|
||
if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserEnabled)).toBool()) {
|
||
QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserExecutable)).toString();
|
||
QString arguments = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserArguments)).toString();
|
||
|
||
return QProcess::startDetached(QString("\"") + browser + "\"", QStringList() << arguments.arg(url));
|
||
}
|
||
else {
|
||
return QDesktopServices::openUrl(url);
|
||
}
|
||
}
|
||
|
||
void WebFactory::switchJavascript(bool enable, bool save_settings) {
|
||
if (save_settings) {
|
||
qApp->settings()->setValue(GROUP(Browser), Browser::JavascriptEnabled, enable);
|
||
}
|
||
|
||
m_globalSettings->setAttribute(QWebSettings::JavascriptEnabled, enable);
|
||
emit javascriptSwitched(enable);
|
||
}
|
||
|
||
void WebFactory::switchPlugins(bool enable, bool save_settings) {
|
||
if (save_settings) {
|
||
qApp->settings()->setValue(GROUP(Browser), Browser::PluginsEnabled, enable);
|
||
}
|
||
|
||
m_globalSettings->setAttribute(QWebSettings::PluginsEnabled, enable);
|
||
emit pluginsSwitched(enable);
|
||
}
|
||
|
||
void WebFactory::switchImages(bool enable, bool save_settings) {
|
||
if (save_settings) {
|
||
qApp->settings()->setValue(GROUP(Browser), Browser::ImagesEnabled, enable);
|
||
}
|
||
|
||
m_globalSettings->setAttribute(QWebSettings::AutoLoadImages, enable);
|
||
emit imagesLoadingSwitched(enable);
|
||
}
|
||
|
||
WebFactory *WebFactory::instance() {
|
||
if (s_instance.isNull()) {
|
||
s_instance = new WebFactory(qApp);
|
||
}
|
||
|
||
return s_instance;
|
||
}
|
||
|
||
bool WebFactory::javascriptEnabled() const {
|
||
return m_globalSettings->testAttribute(QWebSettings::JavascriptEnabled);
|
||
}
|
||
|
||
bool WebFactory::pluginsEnabled() const {
|
||
return m_globalSettings->testAttribute(QWebSettings::PluginsEnabled);
|
||
}
|
||
|
||
bool WebFactory::autoloadImages() const {
|
||
return m_globalSettings->testAttribute(QWebSettings::AutoLoadImages);
|
||
}
|
||
|
||
QString WebFactory::stripTags(QString text) {
|
||
return text.remove(QRegExp("<[^>]*>"));
|
||
}
|
||
|
||
QString WebFactory::escapeHtml(const QString &html) {
|
||
if (m_escapes.isEmpty()) {
|
||
generetaEscapes();
|
||
}
|
||
|
||
QString output = html;
|
||
|
||
foreach (const QString &key, m_escapes.keys()) {
|
||
output = output.replace(key, m_escapes.value(key));
|
||
}
|
||
|
||
return output;
|
||
}
|
||
|
||
QString WebFactory::deEscapeHtml(const QString &text) {
|
||
if (m_deEscapes.isEmpty()) {
|
||
generateDeescapes();
|
||
}
|
||
|
||
QString output = text;
|
||
|
||
foreach (const QString &key, m_deEscapes.keys()) {
|
||
output = output.replace(key, m_deEscapes.value(key));
|
||
}
|
||
|
||
return output;
|
||
}
|
||
|
||
QString WebFactory::toSecondLevelDomain(const QUrl &url) {
|
||
#if QT_VERSION >= 0x040800
|
||
const QString top_level_domain = url.topLevelDomain();
|
||
const QString url_host = url.host();
|
||
|
||
if (top_level_domain.isEmpty() || url_host.isEmpty()) {
|
||
return QString();
|
||
}
|
||
|
||
QString domain = url_host.left(url_host.size() - top_level_domain.size());
|
||
|
||
if (domain.count(QL1C('.')) == 0) {
|
||
return url_host;
|
||
}
|
||
|
||
while (domain.count(QL1C('.')) != 0) {
|
||
domain = domain.mid(domain.indexOf(QL1C('.')) + 1);
|
||
}
|
||
|
||
return domain + top_level_domain;
|
||
#else
|
||
QString domain = url.host();
|
||
|
||
if (domain.count(QL1C('.')) == 0) {
|
||
return QString();
|
||
}
|
||
|
||
while (domain.count(QL1C('.')) != 1) {
|
||
domain = domain.mid(domain.indexOf(QL1C('.')) + 1);
|
||
}
|
||
|
||
return domain;
|
||
#endif
|
||
}
|
||
|
||
void WebFactory::generetaEscapes() {
|
||
m_escapes["<"] = '<';
|
||
m_escapes[">"] = '>';
|
||
m_escapes["&"] = '&';
|
||
m_escapes["""] = '\"';
|
||
m_escapes[" "] = ' ';
|
||
m_escapes["±"] = "±";
|
||
m_escapes["×"] = "×";
|
||
m_escapes["'"] = '\'';
|
||
}
|
||
|
||
void WebFactory::generateDeescapes() {
|
||
m_deEscapes["<"] = "<";
|
||
m_deEscapes[">"] = ">";
|
||
m_deEscapes["&"] = "&";
|
||
m_deEscapes["\""] = """;
|
||
m_deEscapes["±"] = "±";
|
||
m_deEscapes["×"] = "×";
|
||
m_deEscapes["\'"] = "'";
|
||
}
|