diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2022-04-30 10:06:28 +0200 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2022-05-26 18:41:21 +0200 |
commit | 0243cbe0170a768f8f8998c6f7f234869c8c77e6 (patch) | |
tree | 9a55ed100042a82dad8489286e06c1341b06448a /src | |
parent | 5e351b7783e5ad135b6918b5f5d92d78723a4a04 (diff) |
Add 4-byte size arg to socket payload. Add qookie-cast client (server really) with receiving socket.
Diffstat (limited to 'src')
-rw-r--r-- | src/client.cc | 4 | ||||
-rw-r--r-- | src/qookie-cast-client.cc | 70 | ||||
-rw-r--r-- | src/qookie-cast-client.h | 34 |
3 files changed, 108 insertions, 0 deletions
diff --git a/src/client.cc b/src/client.cc index bcc7958..4d1bb7f 100644 --- a/src/client.cc +++ b/src/client.cc @@ -1,5 +1,7 @@ #include "client.h" +#include <cstdint> + #include <QTcpSocket> #include <QTimer> @@ -33,6 +35,8 @@ bool Client::writeData(const QByteArray& data) return false; } + std::uint32_t size = data.size(); + socket->write((char*)&size, sizeof(std::uint32_t)); socket->write(data); return socket->waitForBytesWritten(100); // wait at most 100ms } diff --git a/src/qookie-cast-client.cc b/src/qookie-cast-client.cc new file mode 100644 index 0000000..93e04c9 --- /dev/null +++ b/src/qookie-cast-client.cc @@ -0,0 +1,70 @@ +#include "qookie-cast-client.h" + +#include <cstdint> + +#include <QApplication> + +Server::Server(WebView& webview, QObject *parent) + : QObject(parent) + , webview(webview) +{ + server = new QTcpServer(this); + connect(server, SIGNAL(newConnection()), SLOT(newConnection())); + server->listen(QHostAddress::Any, 1024); +} + +void Server::newConnection() +{ + size = -1; + html = ""; + + while (server->hasPendingConnections()) + { + QTcpSocket *socket = server->nextPendingConnection(); + connect(socket, SIGNAL(readyRead()), SLOT(readyRead())); + connect(socket, SIGNAL(disconnected()), SLOT(disconnected())); + } +} + +void Server::disconnected() +{ + QTcpSocket *socket = static_cast<QTcpSocket*>(sender()); + socket->deleteLater(); +} + +void Server::readyRead() +{ + QTcpSocket *socket = static_cast<QTcpSocket*>(sender()); + + if(size < 0) + { + std::uint32_t sz; + socket->read((char*)&sz, sizeof(std::uint32_t)); + size = sz; + } + + while (socket->bytesAvailable() > 0) + { + auto data = socket->readAll(); + html.append(QString::fromUtf8(data)); + size -= data.size(); + } + + if(size <= 0) + { + webview.setHtml(html); + size = -1; + html = ""; + } +} + +int main(int argc, char *argv[]) +{ + QApplication qapp(argc, argv); + WebView webview; + webview.show();//Maximized(); + + Server server(webview); + + return qapp.exec(); +} diff --git a/src/qookie-cast-client.h b/src/qookie-cast-client.h new file mode 100644 index 0000000..766b48b --- /dev/null +++ b/src/qookie-cast-client.h @@ -0,0 +1,34 @@ +// -*- c++ -*- +#include <QtCore> +#include <QtNetwork> + +#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) +// Qt4 support +#include <QWebView> +using WebView = QWebView; +#else +#include <QTextEdit> +using WebView = QTextEdit; +#endif + +class Server + : public QObject +{ + Q_OBJECT +public: + Server(WebView& webview, QObject *parent = 0); + +signals: + void dataReceived(QByteArray); + +private slots: + void newConnection(); + void disconnected(); + void readyRead(); + +private: + QTcpServer *server; + WebView& webview; + QString html; + int size{-1}; +}; |