diff options
author | BogDan Vatra <bogdan@kdab.com> | 2018-06-23 18:27:48 -0400 |
---|---|---|
committer | Jani Heikkinen <jani.heikkinen@qt.io> | 2018-11-27 04:11:23 +0000 |
commit | e4631d1a6aa20dfdd32fff2e3764223435fe427f (patch) | |
tree | dc7569aae55ee4ab280174b9734b78bc37ce245c | |
parent | 41ed53bf6603858856124f9e8593b804f4e6d1c8 (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.cpp | 6 | ||||
-rw-r--r-- | src/remoteobjects/qremoteobjectpacket.cpp | 18 | ||||
-rw-r--r-- | src/remoteobjects/qremoteobjectsource.cpp | 21 | ||||
-rw-r--r-- | tests/auto/modelreplica/tst_modelreplicatest.cpp | 34 |
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" |