From 63904309552bc6dd39fcfda086b81c1b9bee0a08 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Thu, 23 Feb 2017 16:02:31 +0100 Subject: Make QScxmlScxmlService::stateMachine a Q_PROPERTY Without this, the invoke example doesn't work. Change-Id: I8c4ae9b21e1164946f2a60777b9e9905f2b51237 Reviewed-by: Andy Shaw Reviewed-by: Erik Verbruggen --- src/scxml/qscxmlinvokableservice.cpp | 29 ++++++----- src/scxml/qscxmlinvokableservice_p.h | 5 +- tests/auto/statemachine/invoke.scxml | 73 ++++++++++++++++++++++++++++ tests/auto/statemachine/tst_statemachine.cpp | 22 +++++++++ tests/auto/statemachine/tst_statemachine.qrc | 1 + 5 files changed, 117 insertions(+), 13 deletions(-) create mode 100644 tests/auto/statemachine/invoke.scxml diff --git a/src/scxml/qscxmlinvokableservice.cpp b/src/scxml/qscxmlinvokableservice.cpp index a897eaa..4cf9bd9 100644 --- a/src/scxml/qscxmlinvokableservice.cpp +++ b/src/scxml/qscxmlinvokableservice.cpp @@ -319,7 +319,7 @@ QVariantMap QScxmlInvokableServicePrivate::calculateData( QScxmlScxmlService::~QScxmlScxmlService() { - delete stateMachine; + delete m_stateMachine; } /*! @@ -329,7 +329,7 @@ QScxmlScxmlService::~QScxmlScxmlService() QScxmlScxmlService::QScxmlScxmlService(QScxmlStateMachine *stateMachine, QScxmlStateMachine *parentStateMachine, QScxmlInvokableServiceFactory *factory) - : QScxmlInvokableService(parentStateMachine, factory), stateMachine(stateMachine) + : QScxmlInvokableService(parentStateMachine, factory), m_stateMachine(stateMachine) { QScxmlStateMachinePrivate::get(stateMachine)->m_parentStateMachine = parentStateMachine; } @@ -340,7 +340,7 @@ QScxmlScxmlService::QScxmlScxmlService(QScxmlStateMachine *stateMachine, bool QScxmlScxmlService::start() { Q_D(QScxmlInvokableService); - qCDebug(qscxmlLog) << parentStateMachine() << "preparing to start" << stateMachine; + qCDebug(qscxmlLog) << parentStateMachine() << "preparing to start" << m_stateMachine; const QScxmlInvokableServiceFactory *factory = qobject_cast(parent()); @@ -355,15 +355,15 @@ bool QScxmlScxmlService::start() if (!ok) return false; - QScxmlStateMachinePrivate::get(stateMachine)->m_sessionId = id; - stateMachine->setInitialValues(data); - if (stateMachine->init()) { - qCDebug(qscxmlLog) << parentStateMachine() << "starting" << stateMachine; - stateMachine->start(); + QScxmlStateMachinePrivate::get(m_stateMachine)->m_sessionId = id; + m_stateMachine->setInitialValues(data); + if (m_stateMachine->init()) { + qCDebug(qscxmlLog) << parentStateMachine() << "starting" << m_stateMachine; + m_stateMachine->start(); return true; } - qCDebug(qscxmlLog) << parentStateMachine() << "failed to start" << stateMachine; + qCDebug(qscxmlLog) << parentStateMachine() << "failed to start" << m_stateMachine; return false; } @@ -372,7 +372,7 @@ bool QScxmlScxmlService::start() */ QString QScxmlScxmlService::id() const { - return stateMachine->sessionId(); + return m_stateMachine->sessionId(); } /*! @@ -380,7 +380,7 @@ QString QScxmlScxmlService::id() const */ QString QScxmlScxmlService::name() const { - return stateMachine->name(); + return m_stateMachine->name(); } /*! @@ -388,7 +388,12 @@ QString QScxmlScxmlService::name() const */ void QScxmlScxmlService::postEvent(QScxmlEvent *event) { - QScxmlStateMachinePrivate::get(stateMachine)->postEvent(event); + QScxmlStateMachinePrivate::get(m_stateMachine)->postEvent(event); +} + +QScxmlStateMachine *QScxmlScxmlService::stateMachine() const +{ + return m_stateMachine; } /*! diff --git a/src/scxml/qscxmlinvokableservice_p.h b/src/scxml/qscxmlinvokableservice_p.h index e2a9e7b..37ca870 100644 --- a/src/scxml/qscxmlinvokableservice_p.h +++ b/src/scxml/qscxmlinvokableservice_p.h @@ -88,6 +88,7 @@ class Q_SCXML_EXPORT QScxmlScxmlService: public QScxmlInvokableService { Q_OBJECT Q_DECLARE_PRIVATE(QScxmlInvokableService) + Q_PROPERTY(QScxmlStateMachine *stateMachine READ stateMachine CONSTANT) public: QScxmlScxmlService(QScxmlStateMachine *stateMachine, QScxmlStateMachine *parentStateMachine, @@ -98,8 +99,10 @@ public: QString id() const Q_DECL_OVERRIDE; QString name() const Q_DECL_OVERRIDE; void postEvent(QScxmlEvent *event) Q_DECL_OVERRIDE; + QScxmlStateMachine *stateMachine() const; - QScxmlStateMachine *stateMachine; +private: + QScxmlStateMachine *m_stateMachine; }; class QScxmlStaticScxmlServiceFactoryPrivate : public QScxmlInvokableServiceFactoryPrivate diff --git a/tests/auto/statemachine/invoke.scxml b/tests/auto/statemachine/invoke.scxml new file mode 100644 index 0000000..1bac47a --- /dev/null +++ b/tests/auto/statemachine/invoke.scxml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + diff --git a/tests/auto/statemachine/tst_statemachine.cpp b/tests/auto/statemachine/tst_statemachine.cpp index 99d6661..ed1f424 100644 --- a/tests/auto/statemachine/tst_statemachine.cpp +++ b/tests/auto/statemachine/tst_statemachine.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include Q_DECLARE_METATYPE(QScxmlError); @@ -52,6 +53,8 @@ private Q_SLOTS: void doneDotStateEvent(); void running(); + + void invokeStateMachine(); }; void tst_StateMachine::stateNames_data() @@ -387,6 +390,25 @@ void tst_StateMachine::running() QCOMPARE(stateMachine->isRunning(), false); } +void tst_StateMachine::invokeStateMachine() +{ + QScopedPointer stateMachine( + QScxmlStateMachine::fromFile(QString(":/tst_statemachine/invoke.scxml"))); + QVERIFY(!stateMachine.isNull()); + + stateMachine->start(); + QCOMPARE(stateMachine->isRunning(), true); + QTRY_VERIFY(stateMachine->activeStateNames().contains(QString("anyplace"))); + + QVector services = stateMachine->invokedServices(); + QCOMPARE(services.length(), 1); + QVariant subMachineVariant = services[0]->property("stateMachine"); + QVERIFY(subMachineVariant.isValid()); + QScxmlStateMachine *subMachine = qvariant_cast(subMachineVariant); + QVERIFY(subMachine); + QTRY_VERIFY(subMachine->activeStateNames().contains("here")); +} + QTEST_MAIN(tst_StateMachine) #include "tst_statemachine.moc" diff --git a/tests/auto/statemachine/tst_statemachine.qrc b/tests/auto/statemachine/tst_statemachine.qrc index 9ded2d0..c31fe4c 100644 --- a/tests/auto/statemachine/tst_statemachine.qrc +++ b/tests/auto/statemachine/tst_statemachine.qrc @@ -5,5 +5,6 @@ statenamesnested.scxml ids1.scxml stateDotDoneEvent.scxml + invoke.scxml -- cgit v1.2.3