summaryrefslogtreecommitdiff
path: root/src/webchannel/qwebchannel.cpp
diff options
context:
space:
mode:
authorMilian Wolff <milian.wolff@kdab.com>2013-12-28 19:20:58 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-08 15:59:28 +0100
commit66c0d916131c1e9e896705971f20385c75e753a2 (patch)
tree59b25cd7b9bc1ff688ff46c2b4f4c21fa60019cf /src/webchannel/qwebchannel.cpp
parent318576f0cc0ebef78c5b27106b1a8429eb54fac8 (diff)
downloadqtwebchannel-66c0d916131c1e9e896705971f20385c75e753a2.tar.gz
Simplify usage of QWebChannel on the server side.
This is achieved by hiding the MetaObjectPublisher completely as private API. The QWebChannel is the only publisher API and now handles both the socket as well as the publisher internally. This now allows us to create a proper QML api in the new QmlWebChannel. Change-Id: I3096364af8485353ca9bc19df4a81a8e4552c3d7 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/webchannel/qwebchannel.cpp')
-rw-r--r--src/webchannel/qwebchannel.cpp149
1 files changed, 51 insertions, 98 deletions
diff --git a/src/webchannel/qwebchannel.cpp b/src/webchannel/qwebchannel.cpp
index 8dc7e5e..026b31e 100644
--- a/src/webchannel/qwebchannel.cpp
+++ b/src/webchannel/qwebchannel.cpp
@@ -41,93 +41,14 @@
****************************************************************************/
#include "qwebchannel.h"
+#include "qwebchannel_p.h"
+#include "qmetaobjectpublisher_p.h"
+#include "qwebchannelsocket_p.h"
-#include <QUuid>
-#include <QStringList>
-#include <QDebug>
#include <QJsonDocument>
#include <QJsonObject>
-#include "qwebsocketserver_p.h"
-
-class QWebChannelPrivate : public QWebSocketServer
-{
- Q_OBJECT
-public:
- QByteArray m_secret;
- bool m_useSecret;
-
- QString m_baseUrl;
- bool m_starting;
-
- QWebChannelPrivate(QObject* parent)
- : QWebSocketServer(parent)
- , m_useSecret(true)
- , m_starting(false)
- {
- connect(this, SIGNAL(error(QAbstractSocket::SocketError)),
- SLOT(socketError()));
- }
-
- void initLater()
- {
- if (m_starting)
- return;
- metaObject()->invokeMethod(this, "init", Qt::QueuedConnection);
- m_starting = true;
- }
-
- void sendJSONMessage(const QJsonValue& id, const QJsonValue& data, bool response) const;
-
-signals:
- void failed(const QString& reason);
- void initialized();
-
-protected:
- bool isValid(const HeaderData& connection) Q_DECL_OVERRIDE;
-
-private slots:
- void init();
- void socketError();
-};
-
-bool QWebChannelPrivate::isValid(const HeaderData& connection)
-{
- if (!QWebSocketServer::isValid(connection)) {
- return false;
- }
- return connection.protocol == QByteArrayLiteral("QWebChannel")
- && connection.path == m_secret;
-}
-
-void QWebChannelPrivate::init()
-{
- close();
-
- m_starting = false;
- if (m_useSecret) {
- m_secret = QUuid::createUuid().toByteArray();
- // replace { by /
- m_secret[0] = '/';
- // chop of trailing }
- m_secret.chop(1);
- }
-
- if (!listen(QHostAddress::LocalHost)) {
- emit failed(errorString());
- return;
- }
-
- m_baseUrl = QStringLiteral("127.0.0.1:%1%2").arg(port()).arg(QString::fromLatin1(m_secret));
- emit initialized();
-}
-
-void QWebChannelPrivate::socketError()
-{
- emit failed(errorString());
-}
-
-void QWebChannelPrivate::sendJSONMessage(const QJsonValue& id, const QJsonValue& data, bool response) const
+void QWebChannelPrivate::sendJSONMessage(const QJsonValue &id, const QJsonValue &data, bool response) const
{
QJsonObject obj;
if (response) {
@@ -138,22 +59,31 @@ void QWebChannelPrivate::sendJSONMessage(const QJsonValue& id, const QJsonValue&
obj[QStringLiteral("data")] = data;
}
QJsonDocument doc(obj);
- sendMessage(doc.toJson(QJsonDocument::Compact));
+ socket->sendMessage(doc.toJson(QJsonDocument::Compact));
}
QWebChannel::QWebChannel(QObject *parent)
: QObject(parent)
-, d(new QWebChannelPrivate(this))
+, d(new QWebChannelPrivate)
{
- connect(d, SIGNAL(textDataReceived(QString)),
+ d->socket = new QWebChannelSocket(this);
+
+ connect(d->socket, SIGNAL(textDataReceived(QString)),
SIGNAL(rawMessageReceived(QString)));
- connect(d, SIGNAL(failed(QString)),
+ connect(d->socket, SIGNAL(failed(QString)),
SIGNAL(failed(QString)));
- connect(d, SIGNAL(initialized()),
+ connect(d->socket, SIGNAL(initialized()),
SLOT(onInitialized()));
- connect(d, SIGNAL(pongReceived()),
+ connect(d->socket, SIGNAL(pongReceived()),
SIGNAL(pongReceived()));
- d->initLater();
+
+ d->socket->initLater();
+
+ d->publisher = new QMetaObjectPublisher(this);
+ connect(d->publisher, SIGNAL(blockUpdatesChanged(bool)),
+ SIGNAL(blockUpdatesChanged(bool)));
+ connect(d->socket, SIGNAL(textDataReceived(QString)),
+ d->publisher, SLOT(handleRawMessage(QString)));
}
QWebChannel::~QWebChannel()
@@ -162,26 +92,49 @@ QWebChannel::~QWebChannel()
QString QWebChannel::baseUrl() const
{
- return d->m_baseUrl;
+ return d->socket->m_baseUrl;
}
void QWebChannel::setUseSecret(bool s)
{
- if (d->m_useSecret == s)
+ if (d->socket->m_useSecret == s)
return;
- d->m_useSecret = s;
- d->initLater();
+ d->socket->m_useSecret = s;
+ d->socket->initLater();
}
bool QWebChannel::useSecret() const
{
- return d->m_useSecret;
+ return d->socket->m_useSecret;
+}
+
+void QWebChannel::registerObjects(const QHash< QString, QObject * > &objects)
+{
+ const QHash<QString, QObject *>::const_iterator end = objects.constEnd();
+ for (QHash<QString, QObject *>::const_iterator it = objects.constBegin(); it != end; ++it) {
+ d->publisher->registerObject(it.key(), it.value());
+ }
+}
+
+void QWebChannel::registerObject(const QString &id, QObject *object)
+{
+ d->publisher->registerObject(id, object);
+}
+
+bool QWebChannel::blockUpdates() const
+{
+ return d->publisher->blockUpdates;
+}
+
+void QWebChannel::setBlockUpdates(bool block)
+{
+ d->publisher->setBlockUpdates(block);
}
void QWebChannel::onInitialized()
{
emit initialized();
- emit baseUrlChanged(d->m_baseUrl);
+ emit baseUrlChanged(d->socket->m_baseUrl);
}
void QWebChannel::respond(const QJsonValue& messageId, const QJsonValue& data) const
@@ -196,12 +149,12 @@ void QWebChannel::sendMessage(const QJsonValue& id, const QJsonValue& data) cons
void QWebChannel::sendRawMessage(const QString& message) const
{
- d->sendMessage(message.toUtf8());
+ d->socket->sendMessage(message.toUtf8());
}
void QWebChannel::ping() const
{
- d->ping();
+ d->socket->ping();
}
#include "qwebchannel.moc"