39 #ifdef ARNUSE_SCRIPTJS 45 ArnJsGlobal::ArnJsGlobal(
ArnScript& arnScript, QObject* parent)
47 , _arnScript( arnScript)
52 void ArnJsGlobal::print(
const QString &txt)
82 if ((
id.isEmpty()) || (obj == arnNullptr))
return;
84 if ((obj !=
this) && (!obj->parent()))
85 obj->setParent(
this);
88 _engine->globalObject().setProperty(
id, jsObj);
92 bool ArnScript::evaluate(
const QByteArray& script,
const QString& idName,
const QString& typeName)
96 bool isOk = doJsResult( result, typeName);
103 QFile file( fileName);
104 file.open( QIODevice::ReadOnly);
106 return evaluate( file.readAll(), fileName);
112 return _engine->globalObject().property(
id);;
116 QJSValue
ArnScript::callFunc( QJSValue& func,
const QJSValue& thisObj,
const QJSValueList& args)
118 QJSValue result = func.callWithInstance( thisObj, args);
133 _interruptedText = interruptedText;
137 bool ArnScript::doJsResult(
const ARN_JSVALUE& jsResult,
const QString& typeName)
139 bool isAborted =
_engine->isInterrupted();
141 _engine->setInterrupted(
false);
143 bool isError = jsResult.isError();
144 if (!isError && !isAborted)
return true;
147 int lineNo = jsResult.property(
"lineNumber").toInt();
148 QString lineTxt = lineNo > 0 ?
" @line:" + QString::number( lineNo) : QString();
150 if (!typeName.isEmpty()) errTxt +=
"From type " + typeName +
": ";
151 errTxt += isAborted ? _interruptedText : jsResult.toString();
161 _interruptedText =
"JS-Engine interrupted";
172 ArnJsGlobal* arnJsGlobal =
new ArnJsGlobal( *
this,
this);
173 QJSValue jsGlobalAdd =
_engine->newQObject( arnJsGlobal);
174 QJSValue jsPrintFunc = jsGlobalAdd.property(
"print");
175 _engine->globalObject().setProperty(
"print", jsPrintFunc);
178 QJSValue jsMetaObject;
179 jsMetaObject =
_engine->newQMetaObject( &ArnItemJs::staticMetaObject);
180 _engine->globalObject().setProperty(
"ArnItem", jsMetaObject);
182 jsMetaObject =
_engine->newQMetaObject( &ArnMonitorJs::staticMetaObject);
183 _engine->globalObject().setProperty(
"ArnMonitor", jsMetaObject);
185 jsMetaObject =
_engine->newQMetaObject( &ArnDepOfferJs::staticMetaObject);
186 _engine->globalObject().setProperty(
"ArnDependOffer", jsMetaObject);
188 jsMetaObject =
_engine->newQMetaObject( &ArnDepJs::staticMetaObject);
189 _engine->globalObject().setProperty(
"ArnDepend", jsMetaObject);
198 QString scriptText =
" Script:" + _idName;
207 void ArnItemJs::init()
210 this,
static_cast<void(ArnItemJs::*)(
void)
>(&ArnItemJs::changedVoid));
212 this,
static_cast<void(ArnItemJs::*)(
ARNREAL)
>(&ArnItemJs::changedNum));
214 this,
static_cast<void(ArnItemJs::*)(
const QString&)
>(&ArnItemJs::changedString));
218 ArnItemJs::ArnItemJs( QObject* parent)
225 ArnItemJs::ArnItemJs(
const QString& path, QObject* parent)
233 ArnItemJs::ArnItemJs(
const QJSValue& itemTemplate,
const QString& path, QObject* parent)
234 :
ArnItem( arnItemFromJsValue( itemTemplate, *this), path, parent)
241 QString ArnItemJs::variantType()
const 243 if (!_variantType)
return QString();
245 const char* typeName = QMetaType::typeName(_variantType);
246 if (!typeName)
return QString();
252 void ArnItemJs::setVariantType(
const QString& typeName)
254 if (typeName.isEmpty()) {
258 int type = QMetaType::type( typeName.toLatin1().constData());
260 qWarning() <<
"ItemJS setVariantType, Unknown: type=" + typeName +
" path=" + path();
269 QString ArnItemJs::path()
const 275 void ArnItemJs::setPath(
const QString& path)
285 void ArnItemJs::setVariant(
const QVariant& value)
290 QVariant val = value;
291 if (val.convert( QVariant::Type( _variantType))) {
295 qWarning() <<
"ItemJS setVariant, Can't convert: type=" 296 << _variantType <<
" path=" + path();
302 void ArnItemJs::setBiDirMode(
bool isBiDirMode)
309 void ArnItemJs::setPipeMode(
bool isPipeMode)
316 void ArnItemJs::setMaster(
bool isMaster)
323 void ArnItemJs::setAutoDestroy(
bool isAutoDestroy)
330 void ArnItemJs::setSaveMode(
bool isSaveMode)
337 void ArnItemJs::setAtomicOpProvider(
bool isAtomicOpPv)
344 bool ArnItemJs::useUuid()
const 350 void ArnItemJs::setUseUuid(
bool useUuid)
358 ArnMonitorJs::ArnMonitorJs( QObject* parent)
364 void ArnMonitorJs::reStart()
372 ArnDepOfferJs::ArnDepOfferJs( QObject *parent)
378 void ArnDepOfferJs::advertise(
const QString &serviceName)
386 ArnDepJs::ArnDepJs( QObject *parent)
392 void ArnDepJs::add(
const QString &serviceName,
int stateId)
398 void ArnDepJs::add(
const QString &serviceName,
const QString &stateName)
404 void ArnDepJs::setMonitorName(
const QString &name)
410 void ArnDepJs::startMonitor()
416 const ArnItem& ArnItemJs::arnItemFromJsValue(
const QJSValue& jsValue, QObject& defParent)
419 const ArnItem* arnItem = qobject_cast<
const ArnItem*>( jsValue.toQObject());
420 return arnItem ? *arnItem : *
new ArnItem( &defParent);
425 #include <QScriptValue> 426 #include <QScriptEngine> 428 Q_DECLARE_METATYPE(ArnItemScr*)
434 void ArnItemScr::init()
437 #if QT_VERSION >= 0x050200 439 this,
static_cast<void(ArnItemScr::*)(
void)
>(&ArnItemScr::changedVoid));
441 this,
static_cast<void(ArnItemScr::*)(
ARNREAL)
>(&ArnItemScr::changedNum));
443 this,
static_cast<void(ArnItemScr::*)(
const QString&)
>(&ArnItemScr::changedString));
445 connect(
this, SIGNAL(changed()),
this, SIGNAL(changedVoid()));
447 connect(
this, SIGNAL(changed(
float)),
this, SIGNAL(changedNum(
float)));
449 connect(
this, SIGNAL(changed(
double)),
this, SIGNAL(changedNum(
double)));
451 connect(
this, SIGNAL(changed(QString)),
this, SIGNAL(changedString(QString)));
456 ArnItemScr::ArnItemScr( QObject* parent) :
463 ArnItemScr::ArnItemScr(
const QString& path, QObject* parent) :
470 ArnItemScr::ArnItemScr(
const ArnItem& itemTemplate,
const QString& path, QObject* parent) :
471 ArnItem( itemTemplate, path, parent)
477 ArnItemScr::~ArnItemScr()
504 if ((
id.isEmpty()) || (obj == arnNullptr))
return;
506 if ((obj !=
this) && (!obj->parent()))
507 obj->setParent(
this);
510 QScriptEngine::ExcludeSuperClassContents);
511 _engine->globalObject().setProperty(
id, objScr);
518 QScriptValue result =
_engine->evaluate( QString::fromUtf8( script.constData()));
528 QFile file( fileName);
529 file.open( QIODevice::ReadOnly);
531 return evaluate( file.readAll(), fileName);
537 return _engine->globalObject().property(
id);;
541 QScriptValue
ArnScript::callFunc( QScriptValue& func,
const QScriptValue& thisObj,
const QScriptValueList& args)
543 QScriptValue result = func.call( thisObj, args);
553 if (
_engine->hasUncaughtException()) {
554 QString errDesc = scriptValue.toString();
556 if (!errDesc.isEmpty()) {
557 QString preTxt = typeName.isEmpty() ? QString() : (
"From type " + typeName +
": ");
558 int lineNo =
_engine->uncaughtExceptionLineNumber();
559 errorLog( preTxt + errDesc +
" @line:" + QString::number( lineNo),
574 void ArnScript::doSignalException(
const QScriptValue& exception)
576 int lineNo =
_engine->uncaughtExceptionLineNumber();
577 errorLog( exception.toString() +
" sig@line:" + QString::number( lineNo),
585 for (
int i = 0; i < context->argumentCount(); ++i) {
588 result.append( context->argument(i).toString());
591 QScriptValue calleeData = context->callee().data();
593 Q_ASSERT( arnScript);
596 return engine->undefinedValue();
600 void ArnScript::init( QScriptEngine* engine)
605 _engine =
new QScriptEngine(
this);
606 connect(
_engine, SIGNAL(signalHandlerException(QScriptValue)),
this, SLOT(doSignalException(QScriptValue)));
610 printFunc.setData(
_engine->newQObject(
this));
611 _engine->globalObject().setProperty(
"print", printFunc);
625 _engine->setDefaultPrototype( qMetaTypeId<ArnItemScr*>(), itemProtoScr);
626 _engine->setDefaultPrototype( qMetaTypeId<ArnMonitor*>(), monitorProtoScr);
627 _engine->setDefaultPrototype( qMetaTypeId<ArnDependOffer*>(), depOfferProtoScr);
628 _engine->setDefaultPrototype( qMetaTypeId<ArnDepend*>(), depProtoScr);
630 QScriptValue itemConstrScr =
_engine->newFunction( ArnItemProto::constructor, itemProtoScr);
631 QScriptValue monitorConstrScr =
_engine->newFunction( ArnMonitorProto::constructor, monitorProtoScr);
632 QScriptValue depOfferConstrScr =
_engine->newFunction( ArnDepOfferProto::constructor, depOfferProtoScr);
633 QScriptValue depConstrScr =
_engine->newFunction( ArnDepProto::constructor, depProtoScr);
635 _engine->globalObject().setProperty(
"ArnItem", itemConstrScr);
636 _engine->globalObject().setProperty(
"ArnMonitor", monitorConstrScr);
637 _engine->globalObject().setProperty(
"ArnDependOffer", depOfferConstrScr);
638 _engine->globalObject().setProperty(
"ArnDepend", depConstrScr);
641 itemProtoScr.setProperty(
"num",
_engine->newFunction( ArnItemProto::getSetNum),
642 QScriptValue::PropertyGetter|QScriptValue::PropertySetter);
646 QScriptEngine::QtOwnership, QScriptEngine::ExcludeSuperClassContents));
652 QString scriptText =
" Script:" + _idName;
661 ArnItemProto::ArnItemProto(
ArnScript* parent)
667 QString ArnItemProto::defaultType()
const 669 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
670 if (!item)
return QString();
671 if (!item->_defaultType)
return QString();
673 const char* typeName = QMetaType::typeName( item->_defaultType);
674 if (!typeName)
return QString();
680 void ArnItemProto::setDefaultType(
const QString &typeName)
682 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
685 if (typeName.isEmpty()) {
686 item->_defaultType = 0;
690 int type = QMetaType::type( typeName.toLatin1().constData());
692 context()->throwError( QScriptContext::TypeError,
693 "Setting unknown defaultType=" + typeName);
698 item->_defaultType = type;
702 QString ArnItemProto::path()
const 704 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
705 if (item)
return item->path();
710 void ArnItemProto::setPath(
const QString &path)
712 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
713 if (item) item->open( path);
717 QVariant ArnItemProto::value()
const 719 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
720 if (!item)
return QVariant();
722 QVariant val = item->toVariant();
723 int type = val.type();
726 case QMetaType::QTime:
727 val = QVariant( QDateTime( QDate( 1, 1, 1), val.toTime()));
737 void ArnItemProto::setValue(
const QVariant &value)
739 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
742 if (!item->_defaultType)
743 item->setValue( value);
745 QVariant val = value;
746 if (val.convert( QVariant::Type( item->_defaultType))) {
747 item->setValue( val);
750 context()->throwError( QScriptContext::TypeError,
751 "Can't convert to defaultType=" + defaultType());
757 QString ArnItemProto::string()
const 759 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
760 if (item)
return item->toString();
765 void ArnItemProto::setString(
const QString &value)
767 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
768 if (item) item->setValue( value);
772 bool ArnItemProto::isPipeMode()
const 774 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
775 if (item)
return item->isPipeMode();
780 void ArnItemProto::setPipeMode(
bool )
782 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
783 if (item) item->setPipeMode();
787 bool ArnItemProto::isMaster()
const 789 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
790 if (item)
return item->isMaster();
795 void ArnItemProto::setMaster(
bool )
797 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
803 bool ArnItemProto::isAutoDestroy()
const 805 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
806 if (item)
return item->isAutoDestroy();
811 void ArnItemProto::setAutoDestroy(
bool )
813 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
814 if (item) item->setAutoDestroy();
818 bool ArnItemProto::isSaveMode()
const 820 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
821 if (item)
return item->isSaveMode();
826 void ArnItemProto::setSaveMode(
bool )
828 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
829 if (item) item->setSaveMode();
833 bool ArnItemProto::isTemplate()
const 835 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
836 if (item)
return item->isTemplate();
841 void ArnItemProto::setTemplate(
bool isTemplate)
843 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( thisObject());
844 if (item) item->setTemplate( isTemplate);
848 QScriptValue ArnItemProto::getSetNum(QScriptContext* context, QScriptEngine* engine)
850 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( context->thisObject());
852 if (context->argumentCount() == 1) {
853 result = context->argument(0);
855 item->setValue( result.toString());
859 result = QScriptValue( engine, qsreal( item->toDouble()));
865 QScriptValue ArnItemProto::constructor( QScriptContext* context, QScriptEngine* engine)
867 if (!context->isCalledAsConstructor()) {
868 return context->throwError( QScriptContext::SyntaxError,
869 "use the 'new' operator");
873 if (context->argumentCount() >= 2) {
874 ArnItemScr* item = qscriptvalue_cast<ArnItemScr*>( context->argument(0));
876 return context->throwError(QScriptContext::TypeError,
877 "is not ArnItem as first argument");
879 QString path = qscriptvalue_cast<QString>( context->argument(1));
881 return context->throwError(QScriptContext::TypeError,
882 "is not String (path) as second argument");
884 arnItem =
new ArnItemScr( *item, path);
886 else if (context->argumentCount() >= 1) {
887 QString path = qscriptvalue_cast<QString>( context->argument(0));
889 return context->throwError(QScriptContext::TypeError,
890 "is not String (path) as first argument");
892 arnItem =
new ArnItemScr( path);
895 arnItem =
new ArnItemScr;
899 return engine->newQObject( arnItem, QScriptEngine::ScriptOwnership);
905 ArnMonitorProto::ArnMonitorProto(
ArnScript* parent)
911 void ArnMonitorProto::reStart()
918 void ArnMonitorProto::setClientId(
const QString&
id)
922 if (arnMon && arnScr) {
928 QString ArnMonitorProto::clientId()
const 931 if (arnMon)
return arnMon->
clientId();
936 void ArnMonitorProto::setMonitorPath(
const QString& name)
939 if (arnMon) arnMon->
start( name, arnMon->
client());
943 QString ArnMonitorProto::monitorPath()
const 951 QScriptValue ArnMonitorProto::constructor( QScriptContext* context, QScriptEngine* engine)
953 if (!context->isCalledAsConstructor()) {
954 return context->throwError( QScriptContext::SyntaxError,
955 "use the 'new' operator");
959 return engine->newQObject( arnMon, QScriptEngine::ScriptOwnership);
965 ArnDepOfferProto::ArnDepOfferProto(
ArnScript* parent)
971 void ArnDepOfferProto::advertise(
const QString& serviceName)
974 if (depOffer) depOffer->
advertise( serviceName);
978 void ArnDepOfferProto::setStateName(
const QString& name)
985 QString ArnDepOfferProto::stateName()
const 988 if (depOffer)
return depOffer->
stateName();
993 void ArnDepOfferProto::setStateId(
int id)
1000 int ArnDepOfferProto::stateId()
const 1003 if (depOffer)
return depOffer->
stateId();
1008 QScriptValue ArnDepOfferProto::constructor( QScriptContext* context, QScriptEngine* engine)
1010 if (!context->isCalledAsConstructor()) {
1011 return context->throwError( QScriptContext::SyntaxError,
1012 "use the 'new' operator");
1016 return engine->newQObject( depOffer, QScriptEngine::ScriptOwnership);
1022 ArnDepProto::ArnDepProto(
ArnScript* parent)
1028 void ArnDepProto::add(
const QString& serviceName,
const QString& stateName)
1032 if (dep) dep->
add( serviceName, stateName);
1036 void ArnDepProto::add(
const QString& serviceName,
int stateId)
1040 if (dep) dep->
add( serviceName, stateId);
1044 void ArnDepProto::setMonitorName(
const QString& name)
1052 void ArnDepProto::startMonitor()
1059 QScriptValue ArnDepProto::constructor( QScriptContext* context, QScriptEngine* engine)
1061 if (!context->isCalledAsConstructor()) {
1062 return context->throwError( QScriptContext::SyntaxError,
1063 "use the 'new' operator");
1067 return engine->newQObject( dep, QScriptEngine::ScriptOwnership);
QString stateName() const
void reStart()
The monitor is restarted.
ARN_JSVALUE globalProperty(const QString &id)
void setValue(const ArnItem &other, int ignoreSame=Arn::SameValue::DefaultAction)
Assign the value of an other ArnItem to an Arn Data Object
void add(const QString &serviceName, int stateId=-1)
Add a dependency for a service
ArnItem & setAutoDestroy()
Set client session sync mode as AutoDestroy for this ArnItem.
bool evaluate(const QByteArray &script, const QString &idName, const QString &typeName=QString())
void setStateId(int id)
Set the state of the service by an id number.
Class for advertising that a service is available.
ArnItem & setPipeMode()
Set general mode as Pipe for this Arn Data Object
void addObject(const QString &id, QObject *obj)
void setClient(ArnClient *client)
Set the client to be used.
static QScriptValue printFunction(QScriptContext *context, QScriptEngine *engine)
void setInterruptedText(const QString &interruptedText)
ArnItem & setMaster()
Set client session sync mode as Master for this ArnItem.
ArnItem & setBiDirMode()
Set general mode as Bidirectional for this Arn Data Object
QString monitorPath() const
Get the monitored path
void setAtomicOpProvider()
Set this Arn Data Object as Atomic Operator Provider
bool start(const QString &path, ArnClient *client)
Starts the monitoring.
void changed()
Signals emitted when data in Arn Data Object is changed.
ArnClient * client() const
Get the used client
void setMonitorName(const QString &name)
Set an optional monitor name for debugging.
Class for setting up dependencis to needed services.
ArnItem & setSaveMode()
Set general mode as Save for this Arn Data Object
ArnDepOfferProto * _depOfferProto
void setStateName(const QString &name)
Set the state of the service by a logic name.
void advertise(const QString &serviceName)
Advertise an available service
QScriptEngine & engine() const
ArnMonitorProto * _monitorProto
void errorLog(const QString &errText, ArnError err=ArnError::Undef, void *reference=arnNullptr)
ArnScript(QObject *parent=arnNullptr)
bool evaluateFile(const QString &fileName)
bool logUncaughtError(QScriptValue &scriptValue, const QString &typeName=QString())
static void errorLog(QString errText, ArnError err=ArnError::Undef, void *reference=arnNullptr)
void errorText(QString txt)
ArnItemProto * _itemProto
ARN_JSVALUE callFunc(ARN_JSVALUE &func, const ARN_JSVALUE &thisObj, const ARN_JSVALUE_LIST &args)
A client remote monitor to detect changes at server.
QString clientId() const
Get the id name of the used client
Handle for an Arn Data Object.
void startMonitor()
Starting the dependency monitor.