From 0243cbe0170a768f8f8998c6f7f234869c8c77e6 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sat, 30 Apr 2022 10:06:28 +0200 Subject: Add 4-byte size arg to socket payload. Add qookie-cast client (server really) with receiving socket. --- src/client.cc | 4 +++ src/qookie-cast-client.cc | 70 +++++++++++++++++++++++++++++++++++++++++++++++ src/qookie-cast-client.h | 34 +++++++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 src/qookie-cast-client.cc create mode 100644 src/qookie-cast-client.h (limited to 'src') 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 + #include #include @@ -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 + +#include + +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(sender()); + socket->deleteLater(); +} + +void Server::readyRead() +{ + QTcpSocket *socket = static_cast(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 +#include + +#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) +// Qt4 support +#include +using WebView = QWebView; +#else +#include +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}; +}; -- cgit v1.2.3