14 #ifndef hifi_ScriptEngines_h
15 #define hifi_ScriptEngines_h
21 #include <QtCore/QObject>
22 #include <QtCore/QMutex>
23 #include <QtCore/QReadWriteLock>
24 #include <QtCore/QUrl>
26 #include <SettingHandle.h>
27 #include <DependencyManager.h>
28 #include <shared/ScriptInitializerMixin.h>
29 #include "ScriptManager.h"
31 #include "ScriptsModel.h"
32 #include "ScriptsModelFilter.h"
33 #include "ScriptGatekeeper.h"
59 class ScriptEngines :
public QObject,
public Dependency,
public ScriptInitializerMixin<ScriptManagerPointer> {
62 Q_PROPERTY(
ScriptsModel* scriptsModel READ scriptsModel CONSTANT)
64 Q_PROPERTY(QString debugScriptUrl READ getDebugScriptUrl WRITE setDebugScriptUrl)
68 int runScriptInitializers(ScriptManagerPointer manager)
override;
73 QString getDebugScriptUrl() {
return _debugScriptUrl; };
74 void setDebugScriptUrl(
const QString& url) { _debugScriptUrl = url; };
76 void loadDefaultScripts();
77 void reloadLocalFiles();
79 QStringList getRunningScripts();
80 ScriptManagerPointer getScriptEngine(
const QUrl& scriptHash);
85 QString getDefaultScriptsLocation()
const;
97 Q_INVOKABLE
void loadOneScript(
const QString& scriptFilename);
116 Q_INVOKABLE ScriptManagerPointer loadScript(
const QUrl& scriptFilename = QString(),
117 bool isUserLoaded =
true,
bool loadScriptFromEditor =
false,
bool activateMainWindow =
false,
bool reload =
false,
bool quitWhenFinished =
false);
129 Q_INVOKABLE
bool stopScript(
const QString& scriptHash,
bool restart =
false);
136 Q_INVOKABLE
void reloadAllScripts();
144 Q_INVOKABLE
void stopAllScripts(
bool restart =
false);
158 Q_INVOKABLE QVariantList getRunning();
166 Q_INVOKABLE QVariantList getPublic();
174 Q_INVOKABLE QVariantList getLocal();
177 Q_PROPERTY(QString defaultScriptsPath READ getDefaultScriptsLocation)
179 void defaultScriptsLocationOverridden(
bool overridden) { _defaultScriptsLocationOverridden = overridden; };
182 void shutdownScripting();
183 bool isStopped()
const {
return _isStopped; }
185 void addScriptEngine(ScriptManagerPointer);
187 void removeScriptEngine(ScriptManagerPointer);
190 void requestServerEntityScriptMessages(
ScriptManager *manager);
191 void requestServerEntityScriptMessages(
ScriptManager *manager,
const QUuid& entityID);
193 void removeServerEntityScriptMessagesRequest(
ScriptManager *manager);
194 void removeServerEntityScriptMessagesRequest(
ScriptManager *manager,
const QUuid& entityID);
209 void scriptCountChanged();
218 void scriptsReloading();
227 void scriptLoadError(
const QString& filename,
const QString& error);
237 void printedMessage(
const QString& message,
const QString& engineName);
246 void errorMessage(
const QString& message,
const QString& engineName);
255 void warningMessage(
const QString& message,
const QString& engineName);
264 void infoMessage(
const QString& message,
const QString& engineName);
278 void printedEntityMessage(
const QString& message,
const QString& fileName,
int lineNumber,
const EntityItemID& entityID,
bool isServerScript);
291 void errorEntityMessage(
const QString& message,
const QString& fileName,
int lineNumber,
const EntityItemID& entityID,
bool isServerScript);
303 void warningEntityMessage(
const QString& message,
const QString& fileName,
int lineNumber,
const EntityItemID& entityID,
bool isServerScript);
315 void infoEntityMessage(
const QString& message,
const QString& fileName,
int lineNumber,
const EntityItemID& entityID,
bool isServerScript);
324 void errorLoadingScript(
const QString& url);
331 void clearDebugWindow();
348 void onPrintedMessage(
const QString& message,
const QString& scriptName);
357 void onErrorMessage(
const QString& message,
const QString& scriptName);
366 void onWarningMessage(
const QString& message,
const QString& scriptName);
375 void onInfoMessage(
const QString& message,
const QString& scriptName);
383 void onErrorLoadingScript(
const QString& url);
390 void onClearDebugWindow();
401 void onScriptFinished(
const QString& fileNameString, ScriptManagerPointer manager);
404 ScriptManagerPointer reloadScript(
const QString& scriptName,
bool isUserLoaded =
true) {
return loadScript(scriptName, isUserLoaded,
false,
false,
true); }
405 void onScriptEngineLoaded(
const QString& scriptFilename);
406 void quitWhenFinished();
407 void onScriptEngineError(
const QString& scriptFilename);
408 void launchScriptEngine(ScriptManagerPointer);
411 QReadWriteLock _scriptManagersHashLock;
412 QMultiHash<QUrl, ScriptManagerPointer> _scriptManagersHash;
413 QSet<ScriptManagerPointer> _allKnownScriptManagers;
414 QMutex _allScriptsMutex;
417 std::atomic<bool> _isStopped {
false };
418 std::atomic<bool> _isReloading {
false };
419 bool _defaultScriptsLocationOverridden {
false };
420 QString _debugScriptUrl;
423 std::mutex _subscriptionsToEntityScriptMessagesMutex;
424 QSet<ScriptManager*> _managersSubscribedToEntityScriptMessages;
426 QHash<ScriptManager*, QSet<QUuid>> _entitiesSubscribedToEntityScriptMessages;
430 const QUrl _defaultScriptsOverride { };
432 bool _defaultScriptsWasRunning {
false };
435 QUrl normalizeScriptURL(
const QUrl& rawScriptURL);
436 QString expandScriptPath(
const QString& rawPath);
437 QUrl expandScriptUrl(
const QUrl& rawScriptURL);
Abstract ID for editing model items. Used in EntityItem JS API.
Definition: EntityItemID.h:28
Provides an engine-independent interface for a scripting engine.
Definition: ScriptEngine.h:93
Provides the ScriptDiscoveryService scripting interface.
Definition: ScriptEngines.h:59
void requestingEntityScriptServerLog(bool areMessagesRequested)
Fires when script engines need entity server script messages (areMessagesRequested == true) and when ...
Manages script whitelisting in a domain.
Definition: ScriptGatekeeper.h:21
Manages a single scripting engine.
Definition: ScriptManager.h:281
Context
Context of the script.
Definition: ScriptManager.h:294
Provides script file information available from the ScriptDiscoveryService scripting interface.
Definition: ScriptsModelFilter.h:78
Provides script file information available from the ScriptDiscoveryService scripting interface.
Definition: ScriptsModel.h:128