summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrett Stottlemyer <bstottle@ford.com>2015-11-29 10:33:02 -0600
committerBrett Stottlemyer <bstottle@ford.com>2015-11-30 15:54:44 +0000
commit5cd81f0e152ca3132cd2cbde9fe3331d379d9b0c (patch)
tree66ba76a9924124beb2c5f777560975a8ba0e29a6
parentc482cfcf337d55a95f93058bf6b48eac9c011a1c (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.cpp3
-rw-r--r--src/remoteobjects/qremoteobjectnode.cpp38
-rw-r--r--src/remoteobjects/qremoteobjectnode.h5
-rw-r--r--src/remoteobjects/qremoteobjectnode_p.h2
-rw-r--r--src/remoteobjects/qremoteobjectsourceio.cpp8
-rw-r--r--src/remoteobjects/qremoteobjectsourceio_p.h1
-rw-r--r--tests/auto/integration/tst_integration.cpp10
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 &regist
{
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 &registryAddress)
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 &registryAddress);
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()