summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBogDan Vatra <bogdan@kdab.com>2018-06-23 18:27:48 -0400
committerJani Heikkinen <jani.heikkinen@qt.io>2018-11-27 04:11:23 +0000
commite4631d1a6aa20dfdd32fff2e3764223435fe427f (patch)
treedc7569aae55ee4ab280174b9734b78bc37ce245c
parent41ed53bf6603858856124f9e8593b804f4e6d1c8 (diff)
Handle null QAIM propertyv5.12.0-rc2v5.12.0
Even if a QAIM property is nullptr, we still need to treat it as a model. Task-number: QTBUG-71987 Change-Id: Iea8b3bfda88c564c561a7ab6ed293fd0540f5de4 Reviewed-by: Brett Stottlemyer <bstottle@ford.com>
-rw-r--r--src/remoteobjects/qremoteobjectnode.cpp6
-rw-r--r--src/remoteobjects/qremoteobjectpacket.cpp18
-rw-r--r--src/remoteobjects/qremoteobjectsource.cpp21
-rw-r--r--tests/auto/modelreplica/tst_modelreplicatest.cpp34
4 files changed, 64 insertions, 15 deletions
diff --git a/src/remoteobjects/qremoteobjectnode.cpp b/src/remoteobjects/qremoteobjectnode.cpp
index 9163cac..038d68e 100644
--- a/src/remoteobjects/qremoteobjectnode.cpp
+++ b/src/remoteobjects/qremoteobjectnode.cpp
@@ -1773,9 +1773,9 @@ QVariant QRemoteObjectNodePrivate::handlePointerToQObjectProperty(QConnectedRepl
const bool newReplica = !replicas.contains(childInfo.name) || rep->isInitialized();
if (newReplica) {
if (rep->isInitialized()) {
- auto rep = qSharedPointerCast<QConnectedReplicaImplementation>(replicas.take(childInfo.name));
- if (!rep->isShortCircuit())
- dynamicTypeManager.addFromReplica(static_cast<QConnectedReplicaImplementation *>(rep.data()));
+ auto childRep = qSharedPointerCast<QConnectedReplicaImplementation>(replicas.take(childInfo.name));
+ if (childRep && !childRep->isShortCircuit())
+ dynamicTypeManager.addFromReplica(static_cast<QConnectedReplicaImplementation *>(childRep.data()));
}
if (childInfo.type == ObjectType::CLASS)
retval = QVariant::fromValue(q->acquireDynamic(childInfo.name));
diff --git a/src/remoteobjects/qremoteobjectpacket.cpp b/src/remoteobjects/qremoteobjectpacket.cpp
index ecf593c..a751824 100644
--- a/src/remoteobjects/qremoteobjectpacket.cpp
+++ b/src/remoteobjects/qremoteobjectpacket.cpp
@@ -39,6 +39,8 @@
#include "qremoteobjectpacket_p.h"
+#include <QAbstractItemModel>
+
#include "qremoteobjectpendingcall.h"
#include "qremoteobjectsource.h"
#include "qremoteobjectsource_p.h"
@@ -404,10 +406,24 @@ void serializePongPacket(DataStreamPacket &ds, const QString &name)
ds.finishPacket();
}
+static ObjectType objectType(const QString &typeName)
+{
+ if (typeName == QLatin1String("QAbstractItemModelAdapter"))
+ return ObjectType::MODEL;
+ auto tid = QMetaType::type(typeName.toUtf8());
+ if (tid == QMetaType::UnknownType)
+ return ObjectType::CLASS;
+ QMetaType type(tid);
+ auto mo = type.metaObject();
+ if (mo && mo->inherits(&QAbstractItemModel::staticMetaObject))
+ return ObjectType::MODEL;
+ return ObjectType::CLASS;
+}
+
QRO_::QRO_(QRemoteObjectSourceBase *source)
: name(source->name())
, typeName(source->m_api->typeName())
- , type(source->m_adapter ? ObjectType::MODEL : ObjectType::CLASS)
+ , type(source->m_adapter ? ObjectType::MODEL : objectType(typeName))
, isNull(source->m_object == nullptr)
, classDefinition()
{}
diff --git a/src/remoteobjects/qremoteobjectsource.cpp b/src/remoteobjects/qremoteobjectsource.cpp
index 36bee20..5cbc195 100644
--- a/src/remoteobjects/qremoteobjectsource.cpp
+++ b/src/remoteobjects/qremoteobjectsource.cpp
@@ -137,9 +137,10 @@ QRemoteObjectSourceBase::QRemoteObjectSourceBase(QObject *obj, Private *d, const
QRemoteObjectSource::QRemoteObjectSource(QObject *obj, Private *d, const SourceApiMap *api, QObject *adapter)
: QRemoteObjectSourceBase(obj, d, api, adapter)
- , m_name(adapter ? MODEL().arg(api->name()) : CLASS().arg(api->name()))
+ , m_name(api->typeName() == QLatin1String("QAbstractItemModelAdapter") ? MODEL().arg(api->name()) : CLASS().arg(api->name()))
{
- d->m_sourceIo->registerSource(this);
+ if (obj)
+ d->m_sourceIo->registerSource(this);
}
QRemoteObjectRootSource::QRemoteObjectRootSource(QObject *obj, const SourceApiMap *api,
@@ -182,11 +183,21 @@ void QRemoteObjectSourceBase::setConnections()
void QRemoteObjectSourceBase::resetObject(QObject *newObject)
{
- QObject::disconnect(m_object, 0, this, 0);
- if (m_adapter)
- QObject::disconnect(m_adapter, 0, this, 0);
+ if (m_object)
+ m_object->disconnect(this);
+ if (m_adapter) {
+ m_adapter->disconnect(this);
+ delete m_adapter;
+ m_adapter = nullptr;
+ }
m_object = newObject;
+ auto model = qobject_cast<QAbstractItemModel *>(newObject);
+ if (model) {
+ d->m_sourceIo->registerSource(this);
+ m_adapter = new QAbstractItemModelSourceAdapter(model, nullptr, model->roleNames().keys().toVector());
+ }
+
setParent(newObject);
if (newObject)
setConnections();
diff --git a/tests/auto/modelreplica/tst_modelreplicatest.cpp b/tests/auto/modelreplica/tst_modelreplicatest.cpp
index 0e6b2d2..1e3f5eb 100644
--- a/tests/auto/modelreplica/tst_modelreplicatest.cpp
+++ b/tests/auto/modelreplica/tst_modelreplicatest.cpp
@@ -35,17 +35,14 @@ class ModelreplicaTest : public QObject
Q_OBJECT
public:
- ModelreplicaTest();
+ ModelreplicaTest() = default;
private Q_SLOTS:
void basicFunctions();
void basicFunctions_data();
+ void nullModel();
};
-ModelreplicaTest::ModelreplicaTest()
-{
-}
-
void ModelreplicaTest::basicFunctions_data()
{
QTest::addColumn<bool>("templated");
@@ -58,7 +55,7 @@ void ModelreplicaTest::basicFunctions()
QFETCH(bool, templated);
QRemoteObjectRegistryHost host(QUrl("tcp://localhost:5555"));
- QStringListModel *model = new QStringListModel();
+ auto model = new QStringListModel();
model->setStringList(QStringList() << "Track1" << "Track2" << "Track3");
MediaSimpleSource source;
source.setTracks(model);
@@ -91,6 +88,31 @@ void ModelreplicaTest::basicFunctions()
}
}
+void ModelreplicaTest::nullModel()
+{
+ QRemoteObjectRegistryHost host(QUrl("tcp://localhost:5555"));
+ MediaSimpleSource source;
+ host.enableRemoting(&source);
+
+ QRemoteObjectNode client(QUrl("tcp://localhost:5555"));
+ const QScopedPointer<MediaReplica> replica(client.acquire<MediaReplica>());
+ QVERIFY(replica->waitForSource(100));
+
+ auto model = new QStringListModel(this);
+ model->setStringList(QStringList() << "Track1" << "Track2" << "Track3");
+ source.setTracks(model);
+
+ QTRY_VERIFY(replica->tracks());
+ QTRY_COMPARE(replica->tracks()->rowCount(), 3);
+ QTRY_COMPARE(replica->tracks()->data(replica->tracks()->index(0, 0)), "Track1");
+
+ model = new QStringListModel(this);
+ model->setStringList(QStringList() << "New Track1" << "New Track2" << "New Track3" << "New Track4");
+ source.setTracks(model);
+ QTRY_COMPARE(replica->tracks()->rowCount(), 4);
+ QTRY_COMPARE(replica->tracks()->data(replica->tracks()->index(3, 0)), "New Track4");
+}
+
QTEST_MAIN(ModelreplicaTest)
#include "tst_modelreplicatest.moc"