closes #20, closes #21, closes #17

This commit is contained in:
Marc Wäckerlin
2011-01-19 15:04:11 +00:00
parent fbf345e75c
commit b8cb4c1489
11 changed files with 3065 additions and 498 deletions

View File

@@ -12,6 +12,7 @@
#include <QtGui/QMainWindow>
#include <QtGui/QLineEdit>
#include <QtGui/QProgressBar>
#include <QtGui/QComboBox>
#include <QtGui/QSlider>
#include <QtGui/QMessageBox>
#include <QtGui/QPrinter>
@@ -22,7 +23,6 @@
#include <QtWebKit/QWebFrame>
#include <QtWebKit/QWebHistory>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QSslError>
#include <QtNetwork/QNetworkProxy>
#include <QtCore/QTemporaryFile>
@@ -32,6 +32,8 @@
#include <smartcardauth.hxx>
#include <downloadmanager.hxx>
#include <settings.hxx>
#include <sslclientnetworkmanager.hxx>
#include <stdexcept>
#include <cassert>
@@ -43,57 +45,19 @@
extern SmartCardAuth _scAuth;
class SslClientAuthNetworkAccessManager: public QNetworkAccessManager {
Q_OBJECT;
public:
SslClientAuthNetworkAccessManager(QObject* parent = 0):
QNetworkAccessManager(parent) {
LOG;
}
virtual ~SslClientAuthNetworkAccessManager() {
LOG;
}
Q_SIGNALS:
void created(QNetworkReply*);
protected:
virtual QNetworkReply* createRequest(Operation op,
const QNetworkRequest& req,
QIODevice* outgoingData = 0 ) {
LOG<<req.url();
QNetworkReply* rep
(QNetworkAccessManager::createRequest(op, req, outgoingData));
created(rep);
LOG<<"Reply to URL: "<<rep->url().toString();
return rep;
}
};
class Browser: public QMainWindow, protected Ui::Browser {
Q_OBJECT;
public:
typedef std::map<QString, std::pair<QString, QString> > MimeTypes;
public:
Browser(const QString& url, MimeTypes mimeTypes, bool kiosk = false):
_url(0), _find(0), _home(url), _kiosk(kiosk), _mimetypes(mimeTypes) {
LOG<<url;
Browser(const QStringList& urls, Settings::MimeTypes mimeTypes,
QSettings* settings=0, bool kiosk = false):
_url(0), _clearUrl(0), _addBookmark(0), _find(0),
_home(urls.at(0)), _kiosk(kiosk),
_settings(mimeTypes, this, settings, !kiosk) {
LOG<<urls;
QNetworkProxyFactory::setUseSystemConfiguration(true);
QWebSettings::globalSettings()->setAttribute
(QWebSettings::PluginsEnabled, true);
if (!check(url))
throw std::runtime_error(tr("access to URL %1 not allowed")
.arg(url).toStdString());
setupUi(this);
statusBar()->addPermanentWidget(_progress = new QProgressBar());
statusBar()->addPermanentWidget(_zoom = new QSlider(Qt::Horizontal));
@@ -101,10 +65,14 @@ class Browser: public QMainWindow, protected Ui::Browser {
_zoom->setMaximum(100);
_zoom->setValue(10);
assert(connect(_zoom, SIGNAL(valueChanged(int)), SLOT(zoom(int))));
_toolbar->addWidget(_url = new QLineEdit(_toolbar));
_toolbar->addWidget(_url = new QComboBox(_toolbar));
on_actionNewTab_triggered();
_url->setText(url);
assert(connect(_url, SIGNAL(returnPressed()), SLOT(load())));
_url->setSizePolicy(QSizePolicy(QSizePolicy::Expanding,
QSizePolicy::Fixed));
_url->setEditable(!kiosk);
_url->addItems(urls);
assert(connect(_url, SIGNAL(currentIndexChanged(const QString&)),
SLOT(load(const QString&))));
assert(connect(&_networkManager,
SIGNAL(extendedContextInitialization(ssl_ctx_st*,
QSslSocket*)),
@@ -123,9 +91,19 @@ class Browser: public QMainWindow, protected Ui::Browser {
if (_kiosk) {
_menu->hide();
_url->setEnabled(false);
} else {
assert(connect(_url->lineEdit(), SIGNAL(returnPressed()),
SLOT(load())));
_toolbar->addWidget(_clearUrl = new QPushButton("X", _toolbar));
assert(connect(_clearUrl, SIGNAL(clicked(bool)),
_url, SLOT(clearEditText())));
assert(connect(_clearUrl, SIGNAL(clicked(bool)),
_url, SLOT(setFocus())));
_toolbar->addWidget(_addBookmark = new QPushButton("+", _toolbar));
assert(connect(_addBookmark, SIGNAL(clicked(bool)),
SLOT(addBookmark())));
}
load(url);
load();
}
~Browser() {
@@ -222,7 +200,7 @@ class Browser: public QMainWindow, protected Ui::Browser {
void load() {
LOG;
load(_url->text());
load(_url->currentText());
}
void load(QString page) {
@@ -253,6 +231,10 @@ class Browser: public QMainWindow, protected Ui::Browser {
startDownload(page);
}
void addBookmark() {
_url->addItem(_url->currentText());
}
void startDownload(QUrl url) {
LOG<<url.toString();
statusBar()->showMessage(tr("Reading: %1").arg(url.toString()));
@@ -546,8 +528,8 @@ class Browser: public QMainWindow, protected Ui::Browser {
}
void on__tabs_currentChanged(int index) {
_url->setText(dynamic_cast<QWebView*>(_tabs->currentWidget())
->url().toString());
_url->setEditText(dynamic_cast<QWebView*>(_tabs->currentWidget())
->url().toString());
activateTab();
}
@@ -652,6 +634,10 @@ class Browser: public QMainWindow, protected Ui::Browser {
QMessageBox::aboutQt(this);
}
void on_actionSettings_triggered() {
_settings.show();
}
//@name QWebView slots
//@{
@@ -659,7 +645,7 @@ class Browser: public QMainWindow, protected Ui::Browser {
LOG<<url.toString();
if (sender()!=_tabs->currentWidget()) return;
LOG<<"signal on current tab";
if (_url) _url->setText(url.toString());
if (_url) _url->setEditText(url.toString());
}
void linkClicked(const QUrl& url) { //!@todo
@@ -1044,13 +1030,14 @@ class Browser: public QMainWindow, protected Ui::Browser {
LOG<<"URL:"<<reply->url().toString();
LOG<<"File:"<<reply->url().toLocalFile();
LOG<<"Path:"<<reply->url().path();
MimeTypes::iterator it
(_mimetypes.find(reply->header(QNetworkRequest::ContentTypeHeader)
.toString()));
if (it!=_mimetypes.end()) {
Settings::MimeTypes::const_iterator it
(_settings.mimetypes().find
(reply->header(QNetworkRequest::ContentTypeHeader).toString()));
if (it!=_settings.mimetypes().end()) {
QTemporaryFile *file =
new QTemporaryFile(QDir::tempPath()+QDir::separator()
+"swisssurferXXXXXX."+it->second.first, this);
+"swisssurferXXXXXX."
+it.value().toStringList().at(0), this);
file->open();
file->write(reply->readAll());
file->close();
@@ -1058,7 +1045,7 @@ class Browser: public QMainWindow, protected Ui::Browser {
_downloadProcesses[process] = file;
assert(connect(process, SIGNAL(finished(int, QProcess::ExitStatus)),
SLOT(processFinished())));
QStringList args(it->second.second.split(" ")
QStringList args(it.value().toStringList().at(1).split(" ")
.replaceInStrings("<FILENAME>", file->fileName()));
QString prg(args.takeFirst());
LOG<<"Running:"<<prg<<args.join(" ");
@@ -1164,7 +1151,9 @@ class Browser: public QMainWindow, protected Ui::Browser {
private:
QLineEdit* _url;
QComboBox* _url;
QPushButton* _clearUrl;
QPushButton* _addBookmark;
QLineEdit* _find;
QSlider* _zoom;
QProgressBar* _progress;
@@ -1177,7 +1166,7 @@ class Browser: public QMainWindow, protected Ui::Browser {
DownloadManager _downloadManager;
typedef std::map<QProcess*, QTemporaryFile*> DownloadProcesses;
DownloadProcesses _downloadProcesses;
MimeTypes _mimetypes;
Settings _settings;
};