diff options
Diffstat (limited to 'examples/standalone/main.cpp')
-rw-r--r-- | examples/standalone/main.cpp | 60 |
1 files changed, 46 insertions, 14 deletions
diff --git a/examples/standalone/main.cpp b/examples/standalone/main.cpp index 47f7ea2..05deb24 100644 --- a/examples/standalone/main.cpp +++ b/examples/standalone/main.cpp @@ -40,7 +40,6 @@ ****************************************************************************/ #include "qwebchannel.h" -#include "qwebsockettransport.h" #include <QApplication> #include <QDialog> @@ -49,6 +48,10 @@ #include <QUrl> #include <QDebug> +#include <QtWebSockets/QWebSocketServer> +#include <QtWebSockets/QWebSocket> +#include <QtWebChannel/QWebChannelWebSocketTransport> + #include "ui_dialog.h" class Dialog : public QObject @@ -56,15 +59,18 @@ class Dialog : public QObject Q_OBJECT public: - explicit Dialog(QWebSocketTransport *transport, QObject *parent = 0) + explicit Dialog(const QString &baseUrl, QObject *parent = 0) : QObject(parent) { ui.setupUi(&dialog); dialog.show(); connect(ui.send, SIGNAL(clicked()), SLOT(clicked())); - connect(transport, SIGNAL(baseUrlChanged(QString)), - SLOT(baseUrlChanged(QString))); + + QUrl url = QUrl::fromLocalFile(SOURCE_DIR "/index.html"); + url.setQuery(QStringLiteral("webChannelBaseUrl=") + baseUrl); + ui.output->appendPlainText(tr("Initialization complete, opening browser at %1.").arg(url.toDisplayString())); + QDesktopServices::openUrl(url); } signals: @@ -91,29 +97,55 @@ private slots: ui.input->clear(); } - void baseUrlChanged(const QString &baseUrl) +private: + QDialog dialog; + Ui::Dialog ui; +}; + +// boiler plate code to connect incoming WebSockets to the WebChannel, such that they receive +// messages and can access the published objects. +class TransportHandler : public QObject +{ + Q_OBJECT + +public: + TransportHandler(QWebChannel *channel, QObject *parent = 0) + : QObject(parent) + , m_server(QStringLiteral("QWebChannel Standalone Example Server"), QWebSocketServer::NonSecureMode) + , m_channel(channel) + { + if (!m_server.listen(QHostAddress::LocalHost)) { + qFatal("Failed to open web socket server."); + } + + connect(&m_server, &QWebSocketServer::newConnection, + this, &TransportHandler::handleNewConnection); + } + + QString baseUrl() const { - ui.output->appendPlainText(tr("Initialization complete, opening browser.")); + return m_server.serverUrl().toString(); + } - QUrl url = QUrl::fromLocalFile(SOURCE_DIR "/index.html"); - url.setQuery(QStringLiteral("webChannelBaseUrl=") + baseUrl); - QDesktopServices::openUrl(url); +private slots: + void handleNewConnection() + { + m_channel->connectTo(new QWebChannelWebSocketTransport(m_server.nextPendingConnection())); } private: - QDialog dialog; - Ui::Dialog ui; + QWebSocketServer m_server; + QWebChannel *m_channel; }; int main(int argc, char** argv) { QApplication app(argc, argv); - QWebSocketTransport transport; QWebChannel channel; - channel.connectTo(&transport); + TransportHandler transportHandler(&channel); - Dialog dialog(&transport); + Dialog dialog(transportHandler.baseUrl()); channel.registerObject(QStringLiteral("dialog"), &dialog); |