summaryrefslogtreecommitdiffstats
path: root/src/qscxml.cpp
diff options
context:
space:
mode:
authorNoam Rosenthal <nrosenth@nokia.com>2009-06-08 12:28:41 -0700
committerNoam Rosenthal <nrosenth@nokia.com>2009-06-08 12:28:41 -0700
commit7a41ce5b7a595c67c16ae5ef1711927623602b6a (patch)
tree5a6917940daa31c04f21bbb67417504674b6418a /src/qscxml.cpp
parentd0441f605434a89b53735427e4e81182c65debbd (diff)
some missing files
Diffstat (limited to 'src/qscxml.cpp')
-rw-r--r--src/qscxml.cpp125
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