summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2022-04-30 10:06:28 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2022-05-26 18:41:21 +0200
commit0243cbe0170a768f8f8998c6f7f234869c8c77e6 (patch)
tree9a55ed100042a82dad8489286e06c1341b06448a
parent5e351b7783e5ad135b6918b5f5d92d78723a4a04 (diff)
Add 4-byte size arg to socket payload. Add qookie-cast client (server really) with receiving socket.
-rw-r--r--Makefile6
-rw-r--r--ctor.cc27
-rw-r--r--src/client.cc4
-rw-r--r--src/qookie-cast-client.cc70
-rw-r--r--src/qookie-cast-client.h34
5 files changed, 141 insertions, 0 deletions
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 <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};
+};