aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFelix (xq) Queißner <git@mq32.de>2020-06-08 20:45:08 +0200
committerFelix (xq) Queißner <git@mq32.de>2020-06-08 20:45:08 +0200
commit4276fd7662167fbabf78edf75e75a85218dff4a5 (patch)
treef7009b55f9bbdecc77477d3f3191e5aef8356a86 /src
parent24adf0b41746449a163cfd2daaa2feefd67e9d57 (diff)
downloadkristall-4276fd7662167fbabf78edf75e75a85218dff4a5.tar.gz
Adds support for finger protocol.
Diffstat (limited to 'src')
-rw-r--r--src/browsertab.cpp14
-rw-r--r--src/browsertab.hpp5
-rw-r--r--src/fingerclient.cpp65
-rw-r--r--src/fingerclient.hpp41
-rw-r--r--src/kristall.pro2
-rw-r--r--src/settingsdialog.ui2
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>