diff options
author | Brett Stottlemyer <bstottle@ford.com> | 2015-11-29 10:33:02 -0600 |
---|---|---|
committer | Brett Stottlemyer <bstottle@ford.com> | 2015-11-30 15:54:44 +0000 |
commit | 5cd81f0e152ca3132cd2cbde9fe3331d379d9b0c (patch) | |
tree | 66ba76a9924124beb2c5f777560975a8ba0e29a6 | |
parent | c482cfcf337d55a95f93058bf6b48eac9c011a1c (diff) |
Fix handling of invalid urls
Unhappy paths for invalid urls cleaned up.
Change-Id: I8b979f00cc7bd108cf342980201b3a09b5a82763
Reviewed-by: Brett Stottlemyer <bstottle@ford.com>
Reviewed-by: Kevin Funk <kevin.funk@kdab.com>
Reviewed-by: Continuous Integration (KDAB) <build@kdab.com>
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-rw-r--r-- | src/remoteobjects/qconnectionclientfactory.cpp | 3 | ||||
-rw-r--r-- | src/remoteobjects/qremoteobjectnode.cpp | 38 | ||||
-rw-r--r-- | src/remoteobjects/qremoteobjectnode.h | 5 | ||||
-rw-r--r-- | src/remoteobjects/qremoteobjectnode_p.h | 2 | ||||
-rw-r--r-- | src/remoteobjects/qremoteobjectsourceio.cpp | 8 | ||||
-rw-r--r-- | src/remoteobjects/qremoteobjectsourceio_p.h | 1 | ||||
-rw-r--r-- | tests/auto/integration/tst_integration.cpp | 10 |
7 files changed, 51 insertions, 16 deletions
diff --git a/src/remoteobjects/qconnectionclientfactory.cpp b/src/remoteobjects/qconnectionclientfactory.cpp index 3593aef..0a58d5e 100644 --- a/src/remoteobjects/qconnectionclientfactory.cpp +++ b/src/remoteobjects/qconnectionclientfactory.cpp @@ -280,7 +280,8 @@ QConnectionClientFactory::QConnectionClientFactory() ClientIoDevice *QConnectionClientFactory::createDevice(const QUrl &url, QObject *parent) { ClientIoDevice *res = QConnectionAbstractFactory<ClientIoDevice>::create(url.scheme(), parent); - res->m_url = url; + if (res) + res->m_url = url; return res; } diff --git a/src/remoteobjects/qremoteobjectnode.cpp b/src/remoteobjects/qremoteobjectnode.cpp index a53d91e..6d9d020 100644 --- a/src/remoteobjects/qremoteobjectnode.cpp +++ b/src/remoteobjects/qremoteobjectnode.cpp @@ -194,22 +194,27 @@ void QRemoteObjectNodePrivate::openConnectionIfNeeded(const QString &name) { qRODebug(this) << Q_FUNC_INFO << name << this; if (remoteObjectAddresses().contains(name)) { - initConnection(remoteObjectAddresses()[name]); - qRODebug(this) << "openedConnection" << remoteObjectAddresses()[name]; + if (initConnection(remoteObjectAddresses()[name])) + qRODebug(this) << "openedConnection" << remoteObjectAddresses()[name]; + else + qROWarning(this) << "failed to open connection to" << name; } } -void QRemoteObjectNodePrivate::initConnection(const QUrl &address) +bool QRemoteObjectNodePrivate::initConnection(const QUrl &address) { if (requestedUrls.contains(address)) { qROWarning(this) << "Connection already initialized for " << address.toString(); - return; + return false; } requestedUrls.insert(address); ClientIoDevice *connection = m_factory.createDevice(address, this); - Q_ASSERT_X(connection, Q_FUNC_INFO, "Could not create IODevice for client"); + if (!connection) { + qROWarning(this) << "Could not create ClientIoDevice for client. Invalid url/scheme provided?" << address; + return false; + } knownNodes.insert(connection); qRODebug(this) << "Replica Connection isValid" << connection->isOpen(); @@ -217,6 +222,7 @@ void QRemoteObjectNodePrivate::initConnection(const QUrl &address) connection->connectToServer(); connect(connection, SIGNAL(readyRead()), &clientRead, SLOT(map())); clientRead.setMapping(connection, connection); + return true; } bool QRemoteObjectNodePrivate::hasInstance(const QString &name) @@ -527,7 +533,8 @@ QRemoteObjectNode::QRemoteObjectNode(const QUrl &hostAddress, const QUrl ®ist { qRegisterMetaTypeStreamOperators<QVector<int> >(); if (!hostAddress.isEmpty()) { - setHostUrl(hostAddress); + if (!setHostUrl(hostAddress)) + return; if (hostAddress == registryAddress) { hostRegistry(); return; @@ -592,6 +599,12 @@ bool QRemoteObjectNode::setHostUrl(const QUrl &hostAddress) } d_ptr->remoteObjectIo.reset(new QRemoteObjectSourceIo(hostAddress)); + if (d_ptr->remoteObjectIo->m_server.isNull()) { //Invalid url/scheme + d_ptr->m_lastError = HostUrlInvalid; + d_ptr->remoteObjectIo.reset(); + return false; + } + //If we've given a name to the node, set it on the sourceIo as well if (!d_ptr->objectName().isEmpty()) d_ptr->remoteObjectIo->setObjectName(d_ptr->objectName()); @@ -639,7 +652,11 @@ bool QRemoteObjectNode::setRegistryUrl(const QUrl ®istryAddress) return false; } - connect(registryAddress); + if (!connect(registryAddress)) { + d_ptr->m_lastError = RegistryNotAcquired; + return false; + } + d_ptr->registryAddress = registryAddress; d_ptr->setRegistry(acquire<QRemoteObjectRegistry>()); //Connect remoteObject[Added/Removed] to the registry Slot @@ -747,10 +764,13 @@ QRemoteObjectNode QRemoteObjectNode::createHostNodeConnectedToRegistry(const QUr Once a client is connected to a host, valid Replicas can then be acquired if the corresponding Source is being remoted. + + Return \a true on success, \a false otherwise (usually an unrecognized url, + or connecting to already connected address). */ -void QRemoteObjectNode::connect(const QUrl &address) +bool QRemoteObjectNode::connect(const QUrl &address) { - d_ptr->initConnection(address); + return d_ptr->initConnection(address); } /*! diff --git a/src/remoteobjects/qremoteobjectnode.h b/src/remoteobjects/qremoteobjectnode.h index 5e42248..fa90ea5 100644 --- a/src/remoteobjects/qremoteobjectnode.h +++ b/src/remoteobjects/qremoteobjectnode.h @@ -69,7 +69,8 @@ public: UnintendedRegistryHosting, OperationNotValidOnClientNode, SourceNotRegistered, - MissingObjectName + MissingObjectName, + HostUrlInvalid }; QRemoteObjectNode(); @@ -87,7 +88,7 @@ public: bool setRegistryUrl(const QUrl ®istryAddress); bool hostRegistry(); bool waitForRegistry(int timeout = 30000); - void connect(const QUrl &address=QUrl(QString::fromLatin1("local:replica"))); + bool connect(const QUrl &address=QUrl(QString::fromLatin1("local:replica"))); const QRemoteObjectRegistry *registry() const; void setName(const QString &name); template < class ObjectType > diff --git a/src/remoteobjects/qremoteobjectnode_p.h b/src/remoteobjects/qremoteobjectnode_p.h index e5aed53..0f6b688 100644 --- a/src/remoteobjects/qremoteobjectnode_p.h +++ b/src/remoteobjects/qremoteobjectnode_p.h @@ -78,7 +78,7 @@ public: void connectReplica(QObject *object, QRemoteObjectReplica *instance); void openConnectionIfNeeded(const QString &name); - void initConnection(const QUrl &address); + bool initConnection(const QUrl &address); bool hasInstance(const QString &name); void setRegistry(QRemoteObjectRegistry *); diff --git a/src/remoteobjects/qremoteobjectsourceio.cpp b/src/remoteobjects/qremoteobjectsourceio.cpp index af2a5cf..cfb3b4a 100644 --- a/src/remoteobjects/qremoteobjectsourceio.cpp +++ b/src/remoteobjects/qremoteobjectsourceio.cpp @@ -56,10 +56,12 @@ QRemoteObjectSourceIo::QRemoteObjectSourceIo(const QUrl &address) if (m_server && m_server->listen(address)) { qRODebug(this) << "QRemoteObjectSourceIo is Listening" << address; } else { - qRODebug(this) << "Listen failed"; - qRODebug(this) << address; + qROWarning(this) << "Listen failed for URL:" << address; if (m_server) - qRODebug(this) << m_server->serverError(); + qROWarning(this) << m_server->serverError(); + else + qROWarning(this) << "Most likely an unrecognized scheme was used."; + return; } connect(m_server.data(), &QConnectionAbstractServer::newConnection, this, &QRemoteObjectSourceIo::handleConnection); diff --git a/src/remoteobjects/qremoteobjectsourceio_p.h b/src/remoteobjects/qremoteobjectsourceio_p.h index b22b56b..0c191e0 100644 --- a/src/remoteobjects/qremoteobjectsourceio_p.h +++ b/src/remoteobjects/qremoteobjectsourceio_p.h @@ -79,6 +79,7 @@ Q_SIGNALS: void serverRemoved(const QUrl& url); private: + friend class QRemoteObjectNode; friend class QRemoteObjectNodePrivate; friend class QRemoteObjectSource; diff --git a/tests/auto/integration/tst_integration.cpp b/tests/auto/integration/tst_integration.cpp index 1f737b4..7d16407 100644 --- a/tests/auto/integration/tst_integration.cpp +++ b/tests/auto/integration/tst_integration.cpp @@ -737,6 +737,16 @@ private slots: QVERIFY(myclass_r->myPOD() != shouldFail); } + void SchemeTest() + { + QRemoteObjectNode valid = QRemoteObjectNode::createHostNode(QUrl(QLatin1String("local:valid"))); + QVERIFY(valid.lastError() == QRemoteObjectNode::NoError); + QRemoteObjectNode invalid = QRemoteObjectNode::createHostNode(QUrl(QLatin1String("invalid:invalid"))); + QVERIFY(invalid.lastError() == QRemoteObjectNode::HostUrlInvalid); + QRemoteObjectNode invalidRegistry = QRemoteObjectNode::createNodeConnectedToRegistry(QUrl(QLatin1String("invalid:invalid"))); + QVERIFY(invalidRegistry.lastError() == QRemoteObjectNode::RegistryNotAcquired); + } + //TODO check Mac support #ifdef Q_OS_LINUX void localServerConnectionTest() |