From 084833d82e280f505088a278250bfb395a3a67ef Mon Sep 17 00:00:00 2001 From: No'am Rosenthal Date: Sun, 12 Jul 2009 18:32:08 -0700 Subject: Enabled using SCXML with an existing QScriptEngine --- src/qscxml.cpp | 82 +++++++++++++++++++++++++++++++++++++--------------------- src/qscxml.h | 2 ++ 2 files changed, 55 insertions(+), 29 deletions(-) diff --git a/src/qscxml.cpp b/src/qscxml.cpp index 5e3aff7..c6cf8da 100644 --- a/src/qscxml.cpp +++ b/src/qscxml.cpp @@ -166,6 +166,8 @@ class QScxmlPrivate QString anchorType; }; + void initScriptEngine(QScxml* thiz); + QScriptEngine* scriptEng; QList invokerFactories; @@ -243,7 +245,7 @@ class QScxmlSignalReceiver : public QObject }; struct QScxmlFunctions { -static QScriptValue connectSignalToEvent(QScriptContext* context, QScriptEngine* engine) +static QScriptValue connectSignalToEvent(QScriptContext* context, QScriptEngine*) { QScxml* scxml = qobject_cast(context->thisObject().toQObject()); if (scxml) { @@ -308,7 +310,7 @@ static QScriptValue deepCopy(QScriptContext *context, QScriptEngine *) return _q_deepCopy(context->argument(0)); } -static QScriptValue postEvent(QScriptContext *context, QScriptEngine *engine) +static QScriptValue postEvent(QScriptContext *context, QScriptEngine *) { QScxml* scxml = qobject_cast(context->thisObject().toQObject()); if (scxml) { @@ -437,6 +439,27 @@ static QScriptValue isInState(QScriptContext *context, QScriptEngine *engine) } }; + +void QScxmlPrivate::initScriptEngine(QScxml* thiz) +{ + QScriptValue glob = scriptEng->globalObject(); + QScriptValue scxmlObj = scriptEng->newQObject(thiz); + glob.setProperty("In",scriptEng->newFunction(QScxmlFunctions::isInState)); +// glob.setProperty("_rcvSig",scriptEng->newFunction(QScxmlFunctions::receiveSignal)); + scxmlObj.setProperty("print",scriptEng->newFunction(QScxmlFunctions::script_print)); + scxmlObj.setProperty("postEvent",scriptEng->newFunction(QScxmlFunctions::postEvent)); + scxmlObj.setProperty("invoke",scriptEng->newFunction(QScxmlFunctions::invoke)); + scxmlObj.setProperty("cssTime",scriptEng->newFunction(QScxmlFunctions::cssTime)); + scxmlObj.setProperty("clone",scriptEng->newFunction(QScxmlFunctions::deepCopy)); + scxmlObj.setProperty("setTimeout",scriptEng->newFunction(QScxmlFunctions::setTimeout)); + scxmlObj.setProperty("clearTimeout",scriptEng->newFunction(QScxmlFunctions::clearTimeout)); + scxmlObj.setProperty("connectSignalToEvent",scriptEng->newFunction(QScxmlFunctions::connectSignalToEvent)); + QScriptValue dmObj = scriptEng->newObject(); + glob.setProperty("_data",scriptEng->newObject()); + glob.setProperty("_global",scriptEng->globalObject()); + glob.setProperty("scxml",scxmlObj); +} + /*! \class QScxmlEvent \brief The QScxmlEvent class stands for a general named event with a list of parameter names and parameter values. @@ -700,44 +723,45 @@ class QScxmlBindingInvoker : public QScxmlInvoker This signal is emitted when external event \a name is handled in the state machine. */ -/*! - Creates a new QScxml object, with parent \a parent. - */ - -QScxml::QScxml(QObject* parent) - : QStateMachine(parent) +void QScxml::init() { - pvt = new QScxmlPrivate; - pvt->scriptEng = new QScriptEngine(this); - QScriptValue glob = pvt->scriptEng->globalObject(); - QScriptValue scxmlObj = pvt->scriptEng->newQObject(this); - glob.setProperty("In",pvt->scriptEng->newFunction(QScxmlFunctions::isInState)); -// glob.setProperty("_rcvSig",pvt->scriptEng->newFunction(QScxmlFunctions::receiveSignal)); - scxmlObj.setProperty("print",pvt->scriptEng->newFunction(QScxmlFunctions::script_print)); - scxmlObj.setProperty("postEvent",pvt->scriptEng->newFunction(QScxmlFunctions::postEvent)); - scxmlObj.setProperty("invoke",pvt->scriptEng->newFunction(QScxmlFunctions::invoke)); - scxmlObj.setProperty("cssTime",pvt->scriptEng->newFunction(QScxmlFunctions::cssTime)); - scxmlObj.setProperty("clone",pvt->scriptEng->newFunction(QScxmlFunctions::deepCopy)); - scxmlObj.setProperty("setTimeout",pvt->scriptEng->newFunction(QScxmlFunctions::setTimeout)); - scxmlObj.setProperty("clearTimeout",pvt->scriptEng->newFunction(QScxmlFunctions::clearTimeout)); - scxmlObj.setProperty("connectSignalToEvent",pvt->scriptEng->newFunction(QScxmlFunctions::connectSignalToEvent)); - QScriptValue dmObj = pvt->scriptEng->newObject(); - glob.setProperty("_data",pvt->scriptEng->newObject()); - glob.setProperty("_global",pvt->scriptEng->globalObject()); - glob.setProperty("scxml",scxmlObj); static QScxmlAutoInvokerFactory _s_defaultInvokerFactory; static QScxmlAutoInvokerFactory _s_bindingInvokerFactory; registerInvokerFactory(&_s_defaultInvokerFactory); registerInvokerFactory(&_s_bindingInvokerFactory); connect(this,SIGNAL(started()),this,SLOT(registerSession())); connect(this,SIGNAL(stopped()),this,SLOT(unregisterSession())); + pvt->initScriptEngine(this); #ifdef QT_GUI_LIB - static QScxmlAutoInvokerFactory _s_msgboxInvokerFactory; - static QScxmlAutoInvokerFactory _s_menuInvokerFactory; + static QScxmlAutoInvokerFactory _s_menuInvokerFactory; + static QScxmlAutoInvokerFactory _s_msgboxInvokerFactory; registerInvokerFactory(&_s_msgboxInvokerFactory); registerInvokerFactory(&_s_menuInvokerFactory); #endif } +/*! + Creates a new QScxml object, with parent \a parent. + */ + +QScxml::QScxml(QObject* parent) + : QStateMachine(parent) +{ + pvt = new QScxmlPrivate; + pvt->scriptEng = new QScriptEngine(this); + init(); + +} +/*! + Creates a new QScxml object, with parent \a parent. The state machine will operate on script-engine \a eng. + */ + +QScxml::QScxml(QScriptEngine* eng, QObject* parent) + : QStateMachine(parent) +{ + pvt = new QScxmlPrivate; + pvt->scriptEng = eng; + init(); +} /*! \internal */ void QScxml::beginSelectTransitions(QEvent* ev) @@ -824,7 +848,7 @@ static QString _q_configToString (QAbstractState* from,int level, const QSetglobalObject().setProperty("_event",QScriptValue()); for (QHash::iterator diff --git a/src/qscxml.h b/src/qscxml.h index 09d9243..fc6b590 100644 --- a/src/qscxml.h +++ b/src/qscxml.h @@ -131,6 +131,7 @@ class QScxml : public QStateMachine public: + QScxml(QScriptEngine* engine, QObject* o = NULL); QScxml(QObject* o = NULL); virtual ~QScxml(); protected: @@ -163,6 +164,7 @@ class QScxml : public QStateMachine class QScxmlPrivate* pvt; friend class QScxmlLoader; friend struct QScxmlFunctions; + void init(); }; #endif #endif // QSCXML_H -- cgit v1.2.3