summaryrefslogtreecommitdiffstats
path: root/src/remoteobjects/qremoteobjectsourceio.cpp
diff options
context:
space:
mode:
authorBrett Stottlemyer <bstottle@ford.com>2018-07-15 20:43:18 -0400
committerBrett Stottlemyer <bstottle@ford.com>2018-08-15 18:54:13 +0000
commite170cbe42b8f654894e4035c8ddfd6759a034be8 (patch)
treea0bf0b811aed03836f85df6acfa2414a552f0153 /src/remoteobjects/qremoteobjectsourceio.cpp
parent8761c1a282f596a64e0fc624c87added43fb47d8 (diff)
Support externally generated QIODevices
This adds the APIs that will be necessary to create SSL sockets flexibly (and outside of QtRO) and pass them in. The integration tests are extended to show everything works if the tcp/ip connection is created outside QtRO. The Registry is supported by allowing an "external schema" to be set as the HostNode's url, which is then used by the registry as the address for any remoted() source objects. The client Node calls registerExternalSchema() with a std::function callback that can create the client-side QIODevice given the registry provided url. Change-Id: I0f2d0ea270771e096a787134ef87d537769045f6 Reviewed-by: Michael Brasser <michael.brasser@live.com>
Diffstat (limited to 'src/remoteobjects/qremoteobjectsourceio.cpp')
-rw-r--r--src/remoteobjects/qremoteobjectsourceio.cpp51
1 files changed, 35 insertions, 16 deletions
diff --git a/src/remoteobjects/qremoteobjectsourceio.cpp b/src/remoteobjects/qremoteobjectsourceio.cpp
index 2ba2043..d864ed5 100644
--- a/src/remoteobjects/qremoteobjectsourceio.cpp
+++ b/src/remoteobjects/qremoteobjectsourceio.cpp
@@ -52,22 +52,31 @@ using namespace QtRemoteObjects;
QRemoteObjectSourceIo::QRemoteObjectSourceIo(const QUrl &address, QObject *parent)
: QObject(parent)
- , m_server(QtROServerFactory::instance()->create(address, this))
+ , m_server(QtROServerFactory::instance()->isValid(address) ?
+ QtROServerFactory::instance()->create(address, this) : nullptr)
{
if (m_server && m_server->listen(address)) {
qRODebug(this) << "QRemoteObjectSourceIo is Listening" << address;
} else {
- qROWarning(this) << "Listen failed for URL:" << address;
- if (m_server)
+ if (m_server) {
+ qROWarning(this) << "Listen failed for URL:" << address;
qROWarning(this) << m_server->serverError();
- else
- qROWarning(this) << "Most likely an unrecognized scheme was used.";
+ } else {
+ m_address = address;
+ qRODebug(this) << "Using" << address << "as external url.";
+ }
return;
}
connect(m_server.data(), &QConnectionAbstractServer::newConnection, this, &QRemoteObjectSourceIo::handleConnection);
}
+QRemoteObjectSourceIo::QRemoteObjectSourceIo(QObject *parent)
+ : QObject(parent)
+ , m_server(nullptr)
+{
+}
+
QRemoteObjectSourceIo::~QRemoteObjectSourceIo()
{
qDeleteAll(m_sourceRoots.values());
@@ -93,7 +102,7 @@ bool QRemoteObjectSourceIo::enableRemoting(QObject *object, const SourceApiMap *
new QRemoteObjectRootSource(object, api, adapter, this);
QRemoteObjectPackets::serializeObjectListPacket(m_packet, {QRemoteObjectPackets::ObjectInfo{api->name(), api->typeName(), api->objectSignature()}});
- foreach (ServerIoDevice *conn, m_connections)
+ for (auto conn : m_connections)
conn->write(m_packet.array, m_packet.size);
if (const int count = m_connections.size())
qRODebug(this) << "Wrote new QObjectListPacket for" << api->name() << "to" << count << "connections";
@@ -120,8 +129,10 @@ void QRemoteObjectSourceIo::registerSource(QRemoteObjectSourceBase *source)
qRODebug(this) << "Registering" << name;
m_sourceRoots[name] = root;
m_objectToSourceMap[source->m_object] = root;
- const auto &type = source->m_api->typeName();
- emit remoteObjectAdded(qMakePair(name, QRemoteObjectSourceLocationInfo(type, serverAddress())));
+ if (serverAddress().isValid()) {
+ const auto &type = source->m_api->typeName();
+ emit remoteObjectAdded(qMakePair(name, QRemoteObjectSourceLocationInfo(type, serverAddress())));
+ }
}
}
@@ -134,13 +145,14 @@ void QRemoteObjectSourceIo::unregisterSource(QRemoteObjectSourceBase *source)
const auto type = source->m_api->typeName();
m_objectToSourceMap.remove(source->m_object);
m_sourceRoots.remove(name);
- emit remoteObjectRemoved(qMakePair(name, QRemoteObjectSourceLocationInfo(type, serverAddress())));
+ if (serverAddress().isValid())
+ emit remoteObjectRemoved(qMakePair(name, QRemoteObjectSourceLocationInfo(type, serverAddress())));
}
}
void QRemoteObjectSourceIo::onServerDisconnect(QObject *conn)
{
- ServerIoDevice *connection = qobject_cast<ServerIoDevice*>(conn);
+ IoDeviceBase *connection = qobject_cast<IoDeviceBase*>(conn);
m_connections.remove(connection);
qRODebug(this) << "OnServerDisconnect";
@@ -158,7 +170,7 @@ void QRemoteObjectSourceIo::onServerDisconnect(QObject *conn)
void QRemoteObjectSourceIo::onServerRead(QObject *conn)
{
// Assert the invariant here conn is of type QIODevice
- ServerIoDevice *connection = qobject_cast<ServerIoDevice*>(conn);
+ IoDeviceBase *connection = qobject_cast<IoDeviceBase*>(conn);
QRemoteObjectPacketTypeEnum packetType;
do {
@@ -258,13 +270,18 @@ void QRemoteObjectSourceIo::handleConnection()
qRODebug(this) << "handleConnection" << m_connections;
ServerIoDevice *conn = m_server->nextPendingConnection();
+ newConnection(conn);
+}
+
+void QRemoteObjectSourceIo::newConnection(IoDeviceBase *conn)
+{
m_connections.insert(conn);
- connect(conn, &ServerIoDevice::disconnected, this, [this, conn]() {
- onServerDisconnect(conn);
- });
- connect(conn, &ServerIoDevice::readyRead, this, [this, conn]() {
+ connect(conn, &IoDeviceBase::readyRead, this, [this, conn]() {
onServerRead(conn);
});
+ connect(conn, &IoDeviceBase::disconnected, this, [this, conn]() {
+ onServerDisconnect(conn);
+ });
serializeHandshakePacket(m_packet);
conn->write(m_packet.array, m_packet.size);
@@ -280,7 +297,9 @@ void QRemoteObjectSourceIo::handleConnection()
QUrl QRemoteObjectSourceIo::serverAddress() const
{
- return m_server->address();
+ if (m_server)
+ return m_server->address();
+ return m_address;
}
QT_END_NAMESPACE