diff options
| author | Felix (xq) Queißner <git@mq32.de> | 2020-06-08 20:45:08 +0200 |
|---|---|---|
| committer | Felix (xq) Queißner <git@mq32.de> | 2020-06-08 20:45:08 +0200 |
| commit | 4276fd7662167fbabf78edf75e75a85218dff4a5 (patch) | |
| tree | f7009b55f9bbdecc77477d3f3191e5aef8356a86 /src | |
| parent | 24adf0b41746449a163cfd2daaa2feefd67e9d57 (diff) | |
| download | kristall-4276fd7662167fbabf78edf75e75a85218dff4a5.tar.gz | |
Adds support for finger protocol.
Diffstat (limited to 'src')
| -rw-r--r-- | src/browsertab.cpp | 14 | ||||
| -rw-r--r-- | src/browsertab.hpp | 5 | ||||
| -rw-r--r-- | src/fingerclient.cpp | 65 | ||||
| -rw-r--r-- | src/fingerclient.hpp | 41 | ||||
| -rw-r--r-- | src/kristall.pro | 2 | ||||
| -rw-r--r-- | src/settingsdialog.ui | 2 |
6 files changed, 127 insertions, 2 deletions
diff --git a/src/browsertab.cpp b/src/browsertab.cpp index 33d67e6..7f6c642 100644 --- a/src/browsertab.cpp +++ b/src/browsertab.cpp @@ -51,6 +51,10 @@ BrowserTab::BrowserTab(MainWindow * mainWindow) : connect(&gopher_client, &GopherClient::requestFailed, this, &BrowserTab::on_requestFailed); connect(&gopher_client, &GopherClient::requestProgress, this, &BrowserTab::on_requestProgress); + connect(&finger_client, &FingerClient::requestComplete, this, &BrowserTab::on_requestComplete); + connect(&finger_client, &FingerClient::requestFailed, this, &BrowserTab::on_requestFailed); + connect(&finger_client, &FingerClient::requestProgress, this, &BrowserTab::on_requestProgress); + this->updateUI(); this->ui->media_browser->setVisible(false); @@ -93,6 +97,11 @@ void BrowserTab::navigateTo(const QUrl &url, PushToHistory mode) return; } + if(not finger_client.cancelRequest()) { + QMessageBox::warning(this, "Kristall", "Failed to cancel running finger request!"); + return; + } + this->redirection_count = 0; this->successfully_loaded = false; this->push_to_history_after_load = (mode == PushAfterSuccess); @@ -109,6 +118,10 @@ void BrowserTab::navigateTo(const QUrl &url, PushToHistory mode) { gopher_client.startRequest(url); } + else if(url.scheme() == "finger") + { + finger_client.startRequest(url); + } else if(url.scheme() == "file") { QFile file { url.path() }; @@ -531,6 +544,7 @@ void BrowserTab::on_stop_button_clicked() gemini_client.cancelRequest(); web_client.cancelRequest(); gopher_client.cancelRequest(); + finger_client.cancelRequest(); } void BrowserTab::on_requestProgress(qint64 transferred) diff --git a/src/browsertab.hpp b/src/browsertab.hpp index 7554a7c..92676d5 100644 --- a/src/browsertab.hpp +++ b/src/browsertab.hpp @@ -9,12 +9,14 @@ #include <QNetworkAccessManager> #include <QElapsedTimer> -#include "geminiclient.hpp" #include "documentoutlinemodel.hpp" #include "tabbrowsinghistory.hpp" #include "geminirenderer.hpp" + +#include "geminiclient.hpp" #include "webclient.hpp" #include "gopherclient.hpp" +#include "fingerclient.hpp" namespace Ui { class BrowserTab; @@ -113,6 +115,7 @@ public: GeminiClient gemini_client; WebClient web_client; GopherClient gopher_client; + FingerClient finger_client; int redirection_count = 0; bool push_to_history_after_load = false; diff --git a/src/fingerclient.cpp b/src/fingerclient.cpp new file mode 100644 index 0000000..b696341 --- /dev/null +++ b/src/fingerclient.cpp @@ -0,0 +1,65 @@ +#include "fingerclient.hpp" +#include "ioutil.hpp" + +FingerClient::FingerClient(QObject *parent) : QObject(parent) +{ + connect(&socket, &QTcpSocket::connected, this, &FingerClient::on_connected); + connect(&socket, &QTcpSocket::readyRead, this, &FingerClient::on_readRead); + connect(&socket, &QTcpSocket::disconnected, this, &FingerClient::on_finished); +} + +FingerClient::~FingerClient() +{ + +} + +bool FingerClient::startRequest(const QUrl &url) +{ + if(isInProgress()) + return false; + + if(url.scheme() != "finger") + return false; + + this->requested_user = url.userName(); + this->was_cancelled = false; + socket.connectToHost(url.host(), url.port(79)); + + return true; +} + +bool FingerClient::isInProgress() const +{ + return socket.isOpen(); +} + +bool FingerClient::cancelRequest() +{ + was_cancelled = true; + socket.close(); + body.clear(); + return true; +} + +void FingerClient::on_connected() +{ + auto blob = (requested_user + "\r\n").toUtf8(); + + IoUtil::writeAll(socket, blob); +} + +void FingerClient::on_readRead() +{ + body.append(socket.readAll()); + emit this->requestProgress(body.size()); +} + +void FingerClient::on_finished() +{ + if(not was_cancelled) + { + emit this->requestComplete(this->body, "text/plain"); + was_cancelled = true; + } + body.clear(); +} diff --git a/src/fingerclient.hpp b/src/fingerclient.hpp new file mode 100644 index 0000000..7fd2ae5 --- /dev/null +++ b/src/fingerclient.hpp @@ -0,0 +1,41 @@ +#ifndef FINGERCLIENT_HPP +#define FINGERCLIENT_HPP + +#include <QObject> +#include <QTcpSocket> +#include <QUrl> + +class FingerClient : public QObject +{ + Q_OBJECT +public: + explicit FingerClient(QObject *parent = nullptr); + + ~FingerClient() override; + + bool startRequest(QUrl const & url); + + bool isInProgress() const; + + bool cancelRequest(); + +signals: + void requestProgress(qint64 transferred); + + void requestComplete(QByteArray const & data, QString const & mime); + + void requestFailed(QString const & message); + +private slots: + void on_connected(); + void on_readRead(); + void on_finished(); + +private: + QTcpSocket socket; + QByteArray body; + bool was_cancelled; + QString requested_user; +}; + +#endif // FINGERCLIENT_HPP diff --git a/src/kristall.pro b/src/kristall.pro index 52afd74..9610998 100644 --- a/src/kristall.pro +++ b/src/kristall.pro @@ -23,6 +23,7 @@ SOURCES += \ documentoutlinemodel.cpp \ documentstyle.cpp \ favouritecollection.cpp \ + fingerclient.cpp \ geminiclient.cpp \ geminirenderer.cpp \ gopherclient.cpp \ @@ -41,6 +42,7 @@ HEADERS += \ documentoutlinemodel.hpp \ documentstyle.hpp \ favouritecollection.hpp \ + fingerclient.hpp \ geminiclient.hpp \ geminirenderer.hpp \ gopherclient.hpp \ diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index 2b8b967..57c5674 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -77,7 +77,7 @@ <item> <widget class="QCheckBox" name="enable_finger"> <property name="enabled"> - <bool>false</bool> + <bool>true</bool> </property> <property name="text"> <string>Finger</string> |
