ArnLib  4.0.x
Active Registry Network
ArnScript.hpp
Go to the documentation of this file.
1 // Copyright (C) 2010-2022 Michael Wiklund.
2 // All rights reserved.
3 // Contact: arnlib@wiklunden.se
4 //
5 // This file is part of the ArnLib - Active Registry Network.
6 // Parts of ArnLib depend on Qt and/or other libraries that have their own
7 // licenses. Usage of these other libraries is subject to their respective
8 // license agreements.
9 //
10 // GNU Lesser General Public License Usage
11 // This file may be used under the terms of the GNU Lesser General Public
12 // License version 2.1 as published by the Free Software Foundation and
13 // appearing in the file LICENSE_LGPL.txt included in the packaging of this
14 // file. In addition, as a special exception, you may use the rights described
15 // in the Nokia Qt LGPL Exception version 1.1, included in the file
16 // LGPL_EXCEPTION.txt in this package.
17 //
18 // GNU General Public License Usage
19 // Alternatively, this file may be used under the terms of the GNU General Public
20 // License version 3.0 as published by the Free Software Foundation and appearing
21 // in the file LICENSE_GPL.txt included in the packaging of this file.
22 //
23 // Other Usage
24 // Alternatively, this file may be used in accordance with the terms and conditions
25 // contained in a signed written agreement between you and Michael Wiklund.
26 //
27 // This program is distributed in the hope that it will be useful, but WITHOUT ANY
28 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
29 // PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
30 //
31 
32 #ifndef ARNSCRIPT_HPP
33 #define ARNSCRIPT_HPP
34 
35 // #define ARN_JSENGINE_VER 0x050e00 // Full support
36 
37 #include "ArnLib_global.hpp"
38 #include "ArnInterface.hpp"
39 #include "ArnM.hpp"
40 #include <QObject>
41 
42 #ifdef ARNUSE_SCRIPTJS
43  #include <QJSValue>
44  #include "ArnMonitor.hpp"
45  #include "ArnItem.hpp"
46  #include "ArnDepend.hpp"
47  #define ARN_JSENGINE QJSEngine
48  #define ARN_JSVALUE QJSValue
49  #define ARN_JSVALUE_LIST QJSValueList
50  #define ARN_JSCONTEXT QJSContext
51 #else
52  #include <QScriptable>
53  #include <QScriptValue>
54  #define ARN_JSENGINE QScriptEngine
55  #define ARN_JSVALUE QScriptValue
56  #define ARN_JSVALUE_LIST QScriptValueList
57  #define ARN_JSCONTEXT QScriptContext
58 #endif
59 
60 class ARN_JSENGINE;
61 class ArnClient;
62 class ArnScript;
63 
64 
66 #ifdef ARNUSE_SCRIPTJS
67 class ARNLIBSHARED_EXPORT ArnItemJs : public ArnItem
68 {
69  Q_OBJECT
71  Q_PROPERTY( QString variantType READ variantType WRITE setVariantType)
72  Q_PROPERTY( QString defaultType READ variantType WRITE setVariantType) // Legacy
74  Q_PROPERTY( bool useUuid READ useUuid WRITE setUseUuid)
76  Q_PROPERTY( QString path READ path WRITE setPath)
78  Q_PROPERTY( ArnInterface::DataType type
79  READ type)
81  Q_PROPERTY( QVariant variant READ toVariant WRITE setVariant)
82  Q_PROPERTY( QVariant value READ toVariant WRITE setVariant) // Legacy
84  Q_PROPERTY( QString string READ toString WRITE setValue)
86  Q_PROPERTY( QByteArray bytes READ toByteArray WRITE setValue)
88 #ifdef ARNREAL_FLOAT
89  Q_PROPERTY( float num READ toReal WRITE setValue)
90 #else
91  Q_PROPERTY( double num READ toReal WRITE setValue)
92 #endif
93  Q_PROPERTY( int intNum READ toInt WRITE setValue)
96  Q_PROPERTY( bool biDirMode READ isBiDirMode WRITE setBiDirMode)
98  Q_PROPERTY( bool pipeMode READ isPipeMode WRITE setPipeMode)
100  Q_PROPERTY( bool saveMode READ isSaveMode WRITE setSaveMode)
102  Q_PROPERTY( bool masterMode READ isMaster WRITE setMaster)
103  Q_PROPERTY( bool smMaster READ isMaster WRITE setMaster) // Legacy
105  Q_PROPERTY( bool autoDestroyMode READ isAutoDestroy WRITE setAutoDestroy)
106  Q_PROPERTY( bool smAutoDestroy READ isAutoDestroy WRITE setAutoDestroy) // Legacy
108  Q_PROPERTY( bool atomicOpProvider
109  READ isAtomicOpProvider WRITE setAtomicOpProvider)
111  Q_PROPERTY( bool ignoreSameValue READ isIgnoreSameValue WRITE setIgnoreSameValue)
113  Q_PROPERTY( int delay READ delay WRITE setDelay)
114  Q_PROPERTY( bool templateMode READ isTemplate WRITE setTemplate)
115  Q_PROPERTY( bool smTemplate READ isTemplate WRITE setTemplate) // Legacy
116 
117 public slots:
119 
121  void setBits( int mask, int value)
122  {ArnItemB::setBits( mask, value);}
123 
125 
127  void addIntNum( int value)
128  {ArnItemB::addValue( value);}
129 
131 
133 #ifdef ARNREAL_FLOAT
134  void addNum( float value)
135 #else
136  void addNum( double value)
137 #endif
138  {ArnItemB::addValue( value);}
139 
140 public:
141  Q_INVOKABLE ArnItemJs( QObject* parent = arnNullptr);
142  Q_INVOKABLE ArnItemJs( const QString& path, QObject* parent = arnNullptr);
143  Q_INVOKABLE ArnItemJs( const QJSValue& itemTemplate, const QString& path, QObject* parent = arnNullptr);
144 
145  QString variantType() const;
146  void setVariantType( const QString& typeName);
147 
148  QString path() const;
149 
152 
153  void setPath( const QString& path);
154 
155  void setVariant( const QVariant& value);
156 
157  void setBiDirMode( bool isBiDirMode);
158  void setPipeMode( bool isPipeMode);
159  void setMaster( bool isMaster);
160  void setAutoDestroy( bool isAutoDestroy);
161  void setSaveMode( bool isSaveMode);
162  void setAtomicOpProvider( bool isAtomicOpPv);
163 
164  bool useUuid() const;
165  void setUseUuid( bool useUuid);
166 
167 signals:
168  void changedVoid();
169 #ifdef ARNREAL_FLOAT
170  void changedNum( float value);
171 #else
172  void changedNum( double value);
173 #endif
174  void changedString( const QString& value);
175 
176 private:
177  void init();
178  const ArnItem& arnItemFromJsValue( const QJSValue& jsValue, QObject& defParent);
179 
180  QString _path;
181  int _variantType = 0;
182  bool _useUuid = false;
183 };
184 
185 
186 class ARNLIBSHARED_EXPORT ArnMonitorJs : public ArnMonitor
187 {
188  Q_OBJECT
190  Q_PROPERTY( QString clientId READ clientId WRITE setClient)
192  Q_PROPERTY( QString monitorPath READ monitorPath WRITE setMonitorPath)
193 public slots:
195 
197  void reStart();
198 
199 public:
200  Q_INVOKABLE ArnMonitorJs( QObject* parent = arnNullptr);
201 };
202 
203 
204 class ARNLIBSHARED_EXPORT ArnDepOfferJs : public ArnDependOffer
205 {
206  Q_OBJECT
207  Q_PROPERTY( QString stateName READ stateName WRITE setStateName)
208  Q_PROPERTY( int stateId READ stateId WRITE setStateId)
209 public slots:
210  void advertise( const QString& serviceName);
211 
212 public:
213  Q_INVOKABLE ArnDepOfferJs( QObject* parent = arnNullptr);
214 };
215 
216 
217 class ARNLIBSHARED_EXPORT ArnDepJs : public ArnDepend
218 {
219  Q_OBJECT
220 public slots:
221  void add( const QString& serviceName, int stateId = -1);
222  void add( const QString& serviceName, const QString& stateName);
223  void setMonitorName( const QString& name);
224  void startMonitor();
225 
226 public:
227  Q_INVOKABLE ArnDepJs( QObject* parent = arnNullptr);
228 };
229 
230 
231 class ARNLIBSHARED_EXPORT ArnScript : public QObject
232 {
233  friend class ArnJsGlobal;
234  Q_OBJECT
235 public:
236  explicit ArnScript( QObject* parent = arnNullptr);
237  ArnScript( ARN_JSENGINE* engine, QObject* parent = arnNullptr);
238  ARN_JSENGINE& engine() const;
239  void addObject( const QString& id, QObject* obj);
240 
241  bool evaluate( const QByteArray& script, const QString& idName, const QString& typeName = QString());
242  bool evaluateFile( const QString& fileName);
243  ARN_JSVALUE globalProperty( const QString& id);
244  ARN_JSVALUE callFunc( ARN_JSVALUE& func, const ARN_JSVALUE& thisObj, const ARN_JSVALUE_LIST& args);
245 
246  QString idName() const;
247  void setInterruptedText( const QString& interruptedText);
248 
249 signals:
250  void errorText( QString txt);
251 
252 public slots:
253 
254 private slots:
255 
256 protected:
257  void errorLog( const QString& errText, ArnError err = ArnError::Undef, void* reference = arnNullptr);
258 
259  ARN_JSENGINE* _engine;
260 
261 private:
262  void init( ARN_JSENGINE* engine);
263  bool doJsResult( const ARN_JSVALUE& jsResult, const QString& typeName = QString());
264 
265  QString _idName;
266  QString _interruptedText;
267 };
268 
269 
270 class ArnJsGlobal : public QObject
271 {
272  Q_OBJECT
273 public:
274  explicit ArnJsGlobal( ArnScript& arnScript, QObject* parent = arnNullptr);
275 
276 public slots:
277  void print( const QString& txt);
278 
279 private:
280  ArnScript& _arnScript;
281 };
282 
283 #else
284 class ArnItemScr : public ArnItem
285 {
286  Q_OBJECT
287 public:
288  ArnItemScr( QObject* parent = arnNullptr);
289  ArnItemScr( const QString& path, QObject* parent = arnNullptr);
290  ArnItemScr( const ArnItem& itemTemplate, const QString& path, QObject* parent = arnNullptr);
291  virtual ~ArnItemScr();
292 
293  int _defaultType;
294 
295 signals:
296  void changedVoid();
297 #ifdef ARNREAL_FLOAT
298  void changedNum( float value);
299 #else
300  void changedNum( double value);
301 #endif
302  void changedString( const QString& value);
303 
304 private:
305  void init();
306 };
307 
308 
309 class ARNLIBSHARED_EXPORT ArnItemProto : public QObject, public QScriptable
310 {
311  Q_OBJECT
312  Q_PROPERTY( QString defaultType READ defaultType WRITE setDefaultType)
313  Q_PROPERTY( QString path READ path WRITE setPath)
314  Q_PROPERTY( QVariant value READ value WRITE setValue)
315  Q_PROPERTY( QString string READ string WRITE setString)
316  // Property num is set manually
317  Q_PROPERTY( bool pipeMode READ isPipeMode WRITE setPipeMode)
318  Q_PROPERTY( bool saveMode READ isSaveMode WRITE setSaveMode)
319  Q_PROPERTY( bool smMaster READ isMaster WRITE setMaster)
320  Q_PROPERTY( bool smAutoDestroy READ isAutoDestroy WRITE setAutoDestroy)
321  Q_PROPERTY( bool smTemplate READ isTemplate WRITE setTemplate)
322 public:
323  ArnItemProto( ArnScript* parent = arnNullptr);
324 
325  QString defaultType() const;
326  void setDefaultType( const QString& typeName);
327  QString path() const;
328  void setPath( const QString& path);
329  QVariant value() const;
330  void setValue( const QVariant& value);
331  QString string() const;
332  void setString( const QString& value);
333  bool isPipeMode() const;
334  void setPipeMode( bool isPipeMode);
335  bool isMaster() const;
336  void setMaster( bool isMaster);
337  bool isAutoDestroy() const;
338  void setAutoDestroy( bool isAutoDestroy);
339  bool isSaveMode() const;
340  void setSaveMode( bool isSaveMode);
341  bool isTemplate() const;
342  void setTemplate( bool isTemplate);
343  // Manually defining property "num", due to bugg in QT
344  static QScriptValue getSetNum( QScriptContext* context, QScriptEngine* engine);
345 
346  static QScriptValue constructor( QScriptContext* context, QScriptEngine* engine);
347 };
348 
349 
350 class ARNLIBSHARED_EXPORT ArnMonitorProto : public QObject, public QScriptable
351 {
352  Q_OBJECT
353  Q_PROPERTY( QString clientId READ clientId WRITE setClientId)
354  Q_PROPERTY( QString monitorPath READ monitorPath WRITE setMonitorPath)
355 public slots:
356  void reStart();
357 
358 public:
359  ArnMonitorProto( ArnScript* parent = arnNullptr);
360  void setClientId( const QString& id);
361  QString clientId() const;
362  void setMonitorPath( const QString& name);
363  QString monitorPath() const;
364 
365  static QScriptValue constructor( QScriptContext* context, QScriptEngine* engine);
366 };
367 
368 
369 class ARNLIBSHARED_EXPORT ArnDepOfferProto : public QObject, public QScriptable
370 {
371  Q_OBJECT
372  Q_PROPERTY( QString stateName READ stateName WRITE setStateName)
373  Q_PROPERTY( int stateId READ stateId WRITE setStateId)
374 public slots:
375  void advertise( const QString& serviceName);
376 
377 public:
378  ArnDepOfferProto( ArnScript* parent = arnNullptr);
379  void setStateName( const QString& name);
380  QString stateName() const;
381  void setStateId( int id);
382  int stateId() const;
383 
384  static QScriptValue constructor( QScriptContext* context, QScriptEngine* engine);
385 };
386 
387 
388 class ARNLIBSHARED_EXPORT ArnDepProto : public QObject, public QScriptable
389 {
390  Q_OBJECT
391 public slots:
392  void add( const QString& serviceName, int stateId = -1);
393  void add( const QString& serviceName, const QString& stateName);
394  void setMonitorName( const QString& name);
395  void startMonitor();
396 
397 public:
398  ArnDepProto( ArnScript* parent = arnNullptr);
399 
400  static QScriptValue constructor( QScriptContext* context, QScriptEngine* engine);
401 };
403 
404 
405 class ARNLIBSHARED_EXPORT ArnScript : public QObject
406 {
407  Q_OBJECT
408 public:
409  explicit ArnScript( QObject* parent = arnNullptr);
410  ArnScript( QScriptEngine* engine, QObject* parent = arnNullptr);
411  QScriptEngine& engine() const;
412  void addObject( const QString& id, QObject* obj);
413 
414  bool evaluate( const QByteArray& script, const QString& idName, const QString& typeName = QString());
415  bool evaluateFile( const QString& fileName);
416  ARN_JSVALUE globalProperty( const QString& id);
417  ARN_JSVALUE callFunc( ARN_JSVALUE& func, const ARN_JSVALUE& thisObj, const ARN_JSVALUE_LIST& args);
418 
419  bool logUncaughtError( QScriptValue& scriptValue, const QString& typeName = QString());
420  QString idName() const;
421 
422  void setInterruptedText( const QString& interruptedText);
423 
424 signals:
425  void errorText( QString txt);
426 
427 public slots:
428 
429 private slots:
430  void doSignalException( const QScriptValue& exception);
431 
432 protected:
433  void errorLog( const QString& errText, ArnError err = ArnError::Undef, void* reference = arnNullptr);
434  static QScriptValue printFunction( QScriptContext* context, QScriptEngine* engine);
435 
436  QScriptEngine* _engine;
437  ArnItemProto* _itemProto;
438  ArnMonitorProto* _monitorProto;
439  ArnDepOfferProto* _depOfferProto;
440  ArnDepProto* _depProto;
441 
442 private:
443  void init( QScriptEngine* engine);
444 
445  QString _idName;
446 };
447 #endif
448 
449 #endif // ARNSCRIPT_HPP
void reStart()
The monitor is restarted.
Definition: ArnMonitor.cpp:222
void add(const QString &serviceName, int stateId=-1)
Add a dependency for a service
Definition: ArnDepend.cpp:221
ArnItem & setAutoDestroy()
Set client session sync mode as AutoDestroy for this ArnItem.
Definition: ArnItem.hpp:258
QScriptEngine * _engine
Definition: ArnScript.hpp:436
Class for advertising that a service is available.
Definition: ArnDepend.hpp:59
ArnItem & setPipeMode()
Set general mode as Pipe for this Arn Data Object
Definition: ArnItem.hpp:211
Arn::DataType type() const
The type stored in the Arn Data Object
Definition: ArnItem.hpp:135
ArnItem & setMaster()
Set client session sync mode as Master for this ArnItem.
Definition: ArnItem.hpp:244
DataType
Data type of an Arn Data Object
ArnItem & setBiDirMode()
Set general mode as Bidirectional for this Arn Data Object
Definition: ArnItem.hpp:195
void setAtomicOpProvider()
Set this Arn Data Object as Atomic Operator Provider
#define ARN_JSVALUE
Definition: ArnScript.hpp:55
void addValue(int value)
AtomicOp adds an integer to an Arn Data Object
#define ARN_JSENGINE
Definition: ArnScript.hpp:54
void setBits(int mask, int value, int ignoreSame=Arn::SameValue::DefaultAction)
AtomicOp assign an integer to specified bits in an Arn Data Object
void setMonitorName(const QString &name)
Set an optional monitor name for debugging.
Definition: ArnDepend.cpp:229
Class for setting up dependencis to needed services.
Definition: ArnDepend.hpp:132
Class for connecting to an Arn Server.
Definition: ArnClient.hpp:104
ArnDepProto * _depProto
Definition: ArnScript.hpp:440
ArnItem & setSaveMode()
Set general mode as Save for this Arn Data Object
Definition: ArnItem.hpp:228
void setBits(int mask, int value, int ignoreSame=Arn::SameValue::DefaultAction)
AtomicOp assign an integer to specified bits in an Arn Data Object
Definition: ArnItem.hpp:539
QString path(Arn::NameF nameF=Arn::NameF::EmptyOk) const
Path of the Arn Data Object
ArnDepOfferProto * _depOfferProto
Definition: ArnScript.hpp:439
void advertise(const QString &serviceName)
Advertise an available service
Definition: ArnDepend.cpp:76
ArnMonitorProto * _monitorProto
Definition: ArnScript.hpp:438
#define ARN_JSVALUE_LIST
Definition: ArnScript.hpp:56
#define ARNLIBSHARED_EXPORT
int toInt(bool *isOk=arnNullptr) const
Definition: ArnItem.hpp:352
ArnItemProto * _itemProto
Definition: ArnScript.hpp:437
A client remote monitor to detect changes at server.
Definition: ArnMonitor.hpp:65
Handle for an Arn Data Object.
Definition: ArnItem.hpp:72
void startMonitor()
Starting the dependency monitor.
Definition: ArnDepend.cpp:237