diff options
author | No'am Rosenthal <noam.rosenthal@nokia.com> | 2009-07-12 18:32:08 -0700 |
---|---|---|
committer | No'am Rosenthal <noam.rosenthal@nokia.com> | 2009-07-12 18:32:08 -0700 |
commit | 084833d82e280f505088a278250bfb395a3a67ef (patch) | |
tree | d1d204a8df16e4037fc6187f67a38ccea7f29ca6 /src/qscxml.cpp | |
parent | 6a9f40cb8ef0eb692aec1024002027fa25414e4b (diff) |
Enabled using SCXML with an existing QScriptEngine
Diffstat (limited to 'src/qscxml.cpp')
-rw-r--r-- | src/qscxml.cpp | 82 |
1 files changed, 53 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<QScxmlInvokerFactory*> 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<QScxml*>(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<QScxml*>(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<QScxmlDefaultInvoker> _s_defaultInvokerFactory; static QScxmlAutoInvokerFactory<QScxmlBindingInvoker> _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<QScxmlMenuInvoker> _s_msgboxInvokerFactory; - static QScxmlAutoInvokerFactory<QScxmlMessageBoxInvoker> _s_menuInvokerFactory; + static QScxmlAutoInvokerFactory<QScxmlMenuInvoker> _s_menuInvokerFactory; + static QScxmlAutoInvokerFactory<QScxmlMessageBoxInvoker> _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 QSet<QAb /*! \internal */ -void QScxml::endMicrostep(QEvent* e) +void QScxml::endMicrostep(QEvent*) { scriptEngine()->globalObject().setProperty("_event",QScriptValue()); for (QHash<QString,QScxmlPrivate::AnchorSnapshot>::iterator |