diff options
author | Noam Rosenthal <nrosenth@nokia.com> | 2009-06-08 12:28:41 -0700 |
---|---|---|
committer | Noam Rosenthal <nrosenth@nokia.com> | 2009-06-08 12:28:41 -0700 |
commit | 7a41ce5b7a595c67c16ae5ef1711927623602b6a (patch) | |
tree | 5a6917940daa31c04f21bbb67417504674b6418a /src/qscxml.cpp | |
parent | d0441f605434a89b53735427e4e81182c65debbd (diff) |
some missing files
Diffstat (limited to 'src/qscxml.cpp')
-rw-r--r-- | src/qscxml.cpp | 125 |
1 files changed, 66 insertions, 59 deletions
diff --git a/src/qscxml.cpp b/src/qscxml.cpp index 8190056..0651ade 100644 --- a/src/qscxml.cpp +++ b/src/qscxml.cpp @@ -52,6 +52,7 @@ \sa QStateMachine */ +#ifndef QT_NO_STATEMACHINE #include "qscxml.h" #include <QScriptEngine> @@ -111,15 +112,16 @@ class QScxmlTimer : public QObject public: QScxmlTimer(QScriptEngine* engine, const QScriptValue & scr, int delay) : QObject(engine),script(scr) { - startTimer(delay); + QTimer::singleShot(delay,this,SLOT(exec())); } - protected: - void timerEvent(QTimerEvent*) + protected Q_SLOTS: + void exec() { if (script.isFunction()) script.call(); else if (script.isString()) script.engine()->evaluate(script.toString()); + deleteLater(); } private: @@ -198,7 +200,7 @@ static QScriptValue receiveSignal(QScriptContext *context, QScriptEngine *engine { QString eventName = context->thisObject().property("e").toString(); if (!eventName.isEmpty()) { - QScxml* scxml = qobject_cast<QScxml*>(engine->globalObject().property("scxml.stateMachine").toQObject()); + QScxml* scxml = qobject_cast<QScxml*>(engine->globalObject().property("scxml").toQObject()); if (scxml) { QStringList pnames; QVariantList pvals; @@ -216,7 +218,7 @@ static QScriptValue receiveSignal(QScriptContext *context, QScriptEngine *engine static QScriptValue postEvent(QScriptContext *context, QScriptEngine *engine) { - QScxml* scxml = qobject_cast<QScxml*>(engine->globalObject().property("scxml").toQObject()); + QScxml* scxml = qobject_cast<QScxml*>(context->thisObject().toQObject()); if (scxml) { QString eventName,target,type; QStringList pnames; @@ -276,7 +278,7 @@ static QScriptValue postEvent(QScriptContext *context, QScriptEngine *engine) // scxml.invoke (type, target, paramNames, paramValues, content) static QScriptValue invoke(QScriptContext *context, QScriptEngine *engine) { - QScxml* scxml = qobject_cast<QScxml*>(engine->globalObject().property("scxml.stateMachine").toQObject()); + QScxml* scxml = qobject_cast<QScxml*>(context->thisObject().toQObject()); if (scxml) { QString type,target; QStringList pnames; @@ -300,7 +302,6 @@ static QScriptValue invoke(QScriptContext *context, QScriptEngine *engine) cnt = context->argument(4); - QScxmlInvokerFactory* invf = NULL; for (int i=0; i < scxml->pvt->invokerFactories.count() && invf == NULL; ++i) if (scxml->pvt->invokerFactories[i]->isTypeSupported(type)) @@ -327,7 +328,7 @@ static QScriptValue invoke(QScriptContext *context, QScriptEngine *engine) static QScriptValue isInState(QScriptContext *context, QScriptEngine *engine) { - QScxml* scxml = qobject_cast<QScxml*>(engine->globalObject().property("scxml.stateMachine").toQObject()); + QScxml* scxml = qobject_cast<QScxml*>(context->thisObject().toQObject()); if (scxml) { if (context->argumentCount() > 0) { QString name = context->argument(0).toString(); @@ -457,10 +458,10 @@ bool QScxmlTransition::eventTest(QEvent *e) if (!conditionExpression().isEmpty()) { + QScriptValue v = engine->evaluate(conditionExpression(),scxml->baseUrl().toLocalFile()); if (engine->hasUncaughtException()) { - qDebug() << engine->uncaughtException().toString(); QScxmlEvent* e = new QScxmlEvent("error.illegalcond", QStringList()<< "error" << "expr" << "line" << "backtrace", QVariantList() @@ -468,6 +469,7 @@ bool QScxmlTransition::eventTest(QEvent *e) << QVariant(conditionExpression()) << QVariant(engine->uncaughtExceptionLineNumber()) << QVariant(engine->uncaughtExceptionBacktrace())); + qDebug() << engine->uncaughtException().toString(); e->metaData.kind = QScxmlEvent::MetaData::Platform; scxml->postEvent(e); engine->clearExceptions(); @@ -482,7 +484,7 @@ bool QScxmlTransition::eventTest(QEvent *e) class QScxmlDefaultInvoker : public QScxmlInvoker { Q_OBJECT - + public: QScxmlDefaultInvoker(QScxmlEvent* ievent, QScxml* p) : QScxmlInvoker(ievent,p),cancelled(false),childSm(0) @@ -495,8 +497,8 @@ class QScxmlDefaultInvoker : public QScxmlInvoker } } - - + + static void initInvokerFactory(QScxml*) {} @@ -511,14 +513,14 @@ class QScxmlDefaultInvoker : public QScxmlInvoker void cancel () { - cancelled = true; + cancelled = true; if (childSm) childSm->stop(); } - + private: - bool cancelled; + bool cancelled; QScxml* childSm; }; class QScxmlBindingInvoker : public QScxmlInvoker @@ -611,21 +613,20 @@ QScxml::QScxml(QObject* parent) pvt = new QScxmlPrivate; pvt->scriptEng = new QScriptEngine(this); QScriptValue glob = pvt->scriptEng->globalObject(); - QScriptValue utilObj = pvt->scriptEng->newObject(); + QScriptValue scxmlObj = pvt->scriptEng->newQObject(this); glob.setProperty("In",pvt->scriptEng->newFunction(QScxmlFunctions::isInState)); glob.setProperty("_rcvSig",pvt->scriptEng->newFunction(QScxmlFunctions::receiveSignal)); glob.setProperty("print",pvt->scriptEng->newFunction(QScxmlFunctions::script_print)); - utilObj.setProperty("postEvent",pvt->scriptEng->newFunction(QScxmlFunctions::postEvent)); - utilObj.setProperty("invoke",pvt->scriptEng->newFunction(QScxmlFunctions::invoke)); - utilObj.setProperty("cssTime",pvt->scriptEng->newFunction(QScxmlFunctions::cssTime)); - utilObj.setProperty("stateMachine",pvt->scriptEng->newQObject(this)); - utilObj.setProperty("clone",pvt->scriptEng->newFunction(QScxmlFunctions::deepCopy)); - utilObj.setProperty("setTimeout",pvt->scriptEng->newFunction(QScxmlFunctions::setTimeout)); - utilObj.setProperty("clearTimeout",pvt->scriptEng->newFunction(QScxmlFunctions::clearTimeout)); + 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)); QScriptValue dmObj = pvt->scriptEng->newObject(); glob.setProperty("_data",pvt->scriptEng->newObject()); glob.setProperty("_global",pvt->scriptEng->globalObject()); - glob.setProperty("scxml",utilObj); + glob.setProperty("scxml",scxmlObj); glob.setProperty("connectSignalToEvent",pvt->scriptEng->evaluate("function(sig,ev) {sig.connect({'e':ev},_rcvSig);}")); static QScxmlAutoInvokerFactory<QScxmlDefaultInvoker> _s_defaultInvokerFactory; static QScxmlAutoInvokerFactory<QScxmlBindingInvoker> _s_bindingInvokerFactory; @@ -710,6 +711,7 @@ void QScxml::endMicrostep(QEvent*) pvt->snapshotStack.remove(0,pvt->snapshotStack.size()-100); } pvt->curSnapshot.clear(); +// qDebug() << configuration(); } /*! Returns the script engine attached to the state-machine. */ @@ -757,6 +759,7 @@ void QScxml::postNamedEvent(const QString & event) void QScxml::executeScript (const QString & s) { +// qDebug() << "Executing\n-----------------------------\n"<<s; pvt->scriptEng->evaluate (s,baseUrl().toLocalFile()); if (pvt->scriptEng->hasUncaughtException()) { QScxmlEvent* e = new QScxmlEvent("error.illegalvalue", @@ -770,6 +773,7 @@ void QScxml::executeScript (const QString & s) postEvent(e); pvt->scriptEng->clearExceptions(); } +// qDebug() <<"\n--------------------\n"; } /*! @@ -845,19 +849,19 @@ QScxml::~QScxml() QString QScxmlInvoker::id () const { - return initEvent->metaData.invokeID; + return initEvent->metaData.invokeID; } void QScxmlInvoker::setID(const QString & id) { - initEvent->metaData.invokeID = id; + initEvent->metaData.invokeID = id; } QScxmlInvoker::~QScxmlInvoker() { - if (cancelled) - postParentEvent("CancelResponse"); - else - postParentEvent(QString("done.invoke.%1").arg(initEvent->metaData.invokeID)); + if (cancelled) + postParentEvent("CancelResponse"); + else + postParentEvent(QString("done.invoke.%1").arg(initEvent->metaData.invokeID)); } /*! \property QScxml::baseUrl @@ -911,18 +915,18 @@ struct ScTransitionInfo class QScxmlScriptExec : public QObject { - Q_OBJECT - QString script; - QScxml* scxml; - public: - QScxmlScriptExec(const QString & scr, QScxml* scx) : script(scr),scxml(scx) - { - } - public Q_SLOTS: - void exec() - { - scxml->executeScript(script); - } + Q_OBJECT + QString script; + QScxml* scxml; + public: + QScxmlScriptExec(const QString & scr, QScxml* scx) : script(scr),scxml(scx) + { + } + public Q_SLOTS: + void exec() + { + scxml->executeScript(script); + } }; struct ScStateInfo @@ -979,7 +983,7 @@ class QScxmlLoader QList<ScHistoryInfo> historyInfo; QHash<QString,QAbstractState*> stateByID; QSet<QString> signalEvents; - QSet<QState*> statesWithFinal; + QSet<QState*> statesWithFinal; void loadState (QState* state, QIODevice* dev, const QString & stateID,const QString & filename); QScxml* load (QIODevice* device, QObject* obj = NULL, const QString & filename = ""); @@ -1156,11 +1160,13 @@ void QScxmlLoader::loadState ( QFinalState* f = new QFinalState(curState); f->setObjectName(id); curExecContext.state = f; - statesWithFinal.insert(curState); - QState* gp = qobject_cast<QState*>(curState->parentState()); - if (gp->childMode() == QState::ParallelStates) { - statesWithFinal.insert(gp); - } + statesWithFinal.insert(curState); + QState* gp = qobject_cast<QState*>(curState->parentState()); + if (gp) { + if (gp->childMode() == QState::ParallelStates) { + statesWithFinal.insert(gp); + } + } stateByID[id] = f; } } else if (r.name().toString().compare("script",Qt::CaseInsensitive) == 0) { @@ -1234,7 +1240,7 @@ void QScxmlLoader::loadState ( idLocation = r.attributes().value("idlocation").toString(); if (idLocation.isEmpty()) idLocation = r.attributes().value("invokeid").toString(); - QObject::connect (curState, SIGNAL(exited()),new QScxmlScriptExec(QString("invoke_%1.cancel();").arg(curState->objectName()),stateMachine),SLOT(exec())); + QObject::connect (curState, SIGNAL(exited()),new QScxmlScriptExec(QString("_data.invoke_%1.cancel();").arg(curState->objectName()),stateMachine),SLOT(exec())); QString type = r.attributes().value("type").toString(); if (type.isEmpty()) @@ -1349,9 +1355,9 @@ void QScxmlLoader::loadState ( ti->script = curExecContext.script; curExecContext.type = ScExecContext::None; } else if (r.name().toString().compare("invoke",Qt::CaseInsensitive) == 0) { - curExecContext.script += QString("invoke_%1 = scxml.invoke(srcType,src,paramNames,paramValues,content); }").arg(curState->objectName()); + curExecContext.script += QString("_data.invoke_%1 = scxml.invoke(srcType,src,paramNames,paramValues,content); }").arg(curState->objectName()); if (!idLocation.isEmpty()) { - curExecContext.script += QString("%1 = invoke_%2;").arg(idLocation).arg(curState->objectName()); + curExecContext.script += QString("%1 = _data.invoke_%2;").arg(idLocation).arg(curState->objectName()); } curExecContext.state = curState; curExecContext.type = ScExecContext::StateEntry; @@ -1382,10 +1388,10 @@ QScxml* QScxmlLoader::load(QIODevice* device, QObject* obj, const QString & file QString scr = QString("%1.connect({e:\"%2\"},_rcvSig);\n").arg(sig).arg(s); stateMachine->pvt->startScript += scr; } - - foreach (QState* s, statesWithFinal) { - QObject::connect(s,SIGNAL(finished()),stateMachine,SLOT(handleStateFinished())); - } + + foreach (QState* s, statesWithFinal) { + QObject::connect(s,SIGNAL(finished()),stateMachine,SLOT(handleStateFinished())); + } // resolve transitions @@ -1408,10 +1414,10 @@ QScxml* QScxmlLoader::load(QIODevice* device, QObject* obj, const QString & file void QScxml::handleStateFinished() { - QState* state = qobject_cast<QState*>(sender()); - if (state) { - postEvent(new QScxmlEvent("done.state." + state->objectName())); - } + QState* state = qobject_cast<QState*>(sender()); + if (state) { + postEvent(new QScxmlEvent("done.state." + state->objectName())); + } } /*! @@ -1426,3 +1432,4 @@ QScxml* QScxml::load (const QString & filename, QObject* o) } #include "qscxml.moc" +#endif
\ No newline at end of file |