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. --- Makefile | 6 ++++ ctor.cc | 27 ++++++++++++++++++ src/client.cc | 4 +++ src/qookie-cast-client.cc | 70 +++++++++++++++++++++++++++++++++++++++++++++++ src/qookie-cast-client.h | 34 +++++++++++++++++++++++ 5 files changed, 141 insertions(+) create mode 100644 Makefile create mode 100644 src/qookie-cast-client.cc create mode 100644 src/qookie-cast-client.h diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7689431 --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +CXXFLAGS=-I/usr/include/qt4/QtWidgets -I/usr/include/qt4/QtCore/ -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtNetwork -I/usr/include/qt4 -fPIC -I/usr/include/qt4/QtWebKit +LIBS=-L/usr/lib/qt4 -lQtCore -lQtNetwork -lQtGui -lQtWebKit +all: qookie-cast-client + +qookie-cast-client: src/qookie-cast-client.cc + g++ qookie-cast-client.cc moc_qookie-cast-client.cc $(CXXFLAGS) $(LIBS) -o qookie-cast-client diff --git a/ctor.cc b/ctor.cc index fa30fdc..2354499 100644 --- a/ctor.cc +++ b/ctor.cc @@ -40,6 +40,33 @@ BuildConfigurations myConfigs() "-lsqlite3", } }, + }, + { + .target = "qookie-cast-client", // output filename + .sources = { + "src/qookie-cast-client.cc", + "src/moc_qookie-cast-client.cc", + }, + .flags = { + .cxxflags = { + "-I/usr/include/qt5", + "-I/usr/include/qt5/QtCore", + "-I/usr/include/qt5/QtGui", + "-I/usr/include/qt5/QtWidgets", + "-I/usr/include/qt5/QtNetwork", + "-I/usr/include/qt5/QtWebKit", + "-fPIC", + "-Wall", "-Werror", "-Wextra",// "-Wconversion", + "-g", + }, + .ldflags = { + "-lQt5Core", + "-lQt5Network", + "-lQt5Gui", + "-lQt5Widgets", +// "-lQt5WebKit", + } + }, } }; } 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