From 9b1cd52fb493162f6ced94a50e3585a6e3ea8485 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 12 Jan 2017 15:08:27 -0800 Subject: [PATCH 1/3] Add the ability to get the context that a script is running in --- assignment-client/src/Agent.cpp | 4 ++-- interface/src/Application.cpp | 2 +- .../src/EntityTreeRenderer.cpp | 2 +- libraries/script-engine/src/ScriptEngine.cpp | 19 ++++++++++++++++++- libraries/script-engine/src/ScriptEngine.h | 19 ++++++++++++++++++- libraries/script-engine/src/ScriptEngines.cpp | 7 ++++--- libraries/script-engine/src/ScriptEngines.h | 4 +++- 7 files changed, 47 insertions(+), 10 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index c462139ae9..1a034e5c8a 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -68,7 +68,7 @@ Agent::Agent(ReceivedMessage& message) : DependencyManager::set(); DependencyManager::set(); DependencyManager::set(); - DependencyManager::set(); + DependencyManager::set(ScriptEngine::AGENT_SCRIPT); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); @@ -321,7 +321,7 @@ void Agent::scriptRequestFinished() { } void Agent::executeScript() { - _scriptEngine = std::unique_ptr(new ScriptEngine(_scriptContents, _payload)); + _scriptEngine = std::unique_ptr(new ScriptEngine(ScriptEngine::AGENT_SCRIPT, _scriptContents, _payload)); _scriptEngine->setParent(this); // be the parent of the script engine so it gets moved when we do // setup an Avatar for the script to use diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a0a77a9d7d..9a452e3d63 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -459,7 +459,7 @@ bool setupEssentials(int& argc, char** argv) { // Set dependencies DependencyManager::set(std::bind(&Application::getUserAgent, qApp)); DependencyManager::set(); - DependencyManager::set(); + DependencyManager::set(ScriptEngine::CLIENT_SCRIPT); DependencyManager::set(); DependencyManager::set(); DependencyManager::set(); diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index a5d2970c98..d277fd540f 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -101,7 +101,7 @@ void EntityTreeRenderer::resetEntitiesScriptEngine() { // Keep a ref to oldEngine until newEngine is ready so EntityScriptingInterface has something to use auto oldEngine = _entitiesScriptEngine; - auto newEngine = new ScriptEngine(NO_SCRIPT, QString("Entities %1").arg(++_entitiesScriptEngineCount)); + auto newEngine = new ScriptEngine(ScriptEngine::ENTITY_CLIENT_SCRIPT, NO_SCRIPT, QString("Entities %1").arg(++_entitiesScriptEngineCount)); _entitiesScriptEngine = QSharedPointer(newEngine, entitiesScriptEngineDeleter); _scriptingServices->registerScriptEngineWithApplicationServices(_entitiesScriptEngine.data()); diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index ab9d4af417..b823ce858b 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -168,7 +168,8 @@ static bool hadUncaughtExceptions(QScriptEngine& engine, const QString& fileName return false; } -ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNameString) : +ScriptEngine::ScriptEngine(Context context, const QString& scriptContents, const QString& fileNameString) : + _context(context), _scriptContents(scriptContents), _timerFunctionMap(), _fileNameString(fileNameString), @@ -183,6 +184,22 @@ ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNam setProcessEventsInterval(MSECS_PER_SECOND); } +QString ScriptEngine::getContext() const { + switch (_context) { + case CLIENT_SCRIPT: + return "client"; + case ENTITY_CLIENT_SCRIPT: + return "entity_client"; + case ENTITY_SERVER_SCRIPT: + return "entity_server"; + case AGENT_SCRIPT: + return "agent"; + default: + return "unknown"; + } + return "unknown"; +} + ScriptEngine::~ScriptEngine() { scriptInfoMessage("Script Engine shutting down:" + getFilename()); diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index e266ff3bc9..32d81b9511 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -72,8 +72,17 @@ public: class ScriptEngine : public QScriptEngine, public ScriptUser, public EntitiesScriptEngineProvider { Q_OBJECT + Q_PROPERTY(QString context READ getContext) public: - ScriptEngine(const QString& scriptContents = NO_SCRIPT, const QString& fileNameString = QString("")); + + enum Context { + CLIENT_SCRIPT, + ENTITY_CLIENT_SCRIPT, + ENTITY_SERVER_SCRIPT, + AGENT_SCRIPT + }; + + ScriptEngine(Context context, const QString& scriptContents = NO_SCRIPT, const QString& fileNameString = QString("")); ~ScriptEngine(); /// run the script in a dedicated thread. This will have the side effect of evalulating @@ -124,6 +133,12 @@ public: /// to scripts. we may not need this to be invokable void loadURL(const QUrl& scriptURL, bool reload); + Q_INVOKABLE QString getContext() const; + Q_INVOKABLE bool isClientScript() const { return _context == CLIENT_SCRIPT; } + Q_INVOKABLE bool isEntityClientScript() const { return _context == ENTITY_CLIENT_SCRIPT; } + Q_INVOKABLE bool isEntityServerScript() const { return _context == ENTITY_SERVER_SCRIPT; } + Q_INVOKABLE bool isAgentScript() const { return _context == AGENT_SCRIPT; } + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // NOTE - these are intended to be public interfaces available to scripts Q_INVOKABLE void addEventHandler(const EntityItemID& entityID, const QString& eventName, QScriptValue handler); @@ -230,6 +245,8 @@ protected: void doWithEnvironment(const EntityItemID& entityID, const QUrl& sandboxURL, std::function operation); void callWithEnvironment(const EntityItemID& entityID, const QUrl& sandboxURL, QScriptValue function, QScriptValue thisObject, QScriptValueList args); + Context _context; + QString _scriptContents; QString _parentURL; std::atomic _isFinished { false }; diff --git a/libraries/script-engine/src/ScriptEngines.cpp b/libraries/script-engine/src/ScriptEngines.cpp index 74acb2ae6a..eb3ab4abec 100644 --- a/libraries/script-engine/src/ScriptEngines.cpp +++ b/libraries/script-engine/src/ScriptEngines.cpp @@ -62,8 +62,9 @@ void ScriptEngines::onErrorLoadingScript(const QString& url) { emit errorLoadingScript(url, scriptName); } -ScriptEngines::ScriptEngines() - : _scriptsLocationHandle("scriptsLocation", DESKTOP_LOCATION) +ScriptEngines::ScriptEngines(ScriptEngine::Context context) + : _context(context), + _scriptsLocationHandle("scriptsLocation", DESKTOP_LOCATION) { _scriptsModelFilter.setSourceModel(&_scriptsModel); _scriptsModelFilter.sort(0, Qt::AscendingOrder); @@ -453,7 +454,7 @@ ScriptEngine* ScriptEngines::loadScript(const QUrl& scriptFilename, bool isUserL return scriptEngine; } - scriptEngine = new ScriptEngine(NO_SCRIPT, ""); + scriptEngine = new ScriptEngine(_context, NO_SCRIPT, ""); scriptEngine->setUserLoaded(isUserLoaded); connect(scriptEngine, &ScriptEngine::doneRunning, this, [scriptEngine] { scriptEngine->deleteLater(); diff --git a/libraries/script-engine/src/ScriptEngines.h b/libraries/script-engine/src/ScriptEngines.h index b0f0e24ac6..2fadfc81f8 100644 --- a/libraries/script-engine/src/ScriptEngines.h +++ b/libraries/script-engine/src/ScriptEngines.h @@ -20,6 +20,7 @@ #include #include +#include "ScriptEngine.h" #include "ScriptsModel.h" #include "ScriptsModelFilter.h" @@ -34,7 +35,7 @@ class ScriptEngines : public QObject, public Dependency { public: using ScriptInitializer = std::function; - ScriptEngines(); + ScriptEngines(ScriptEngine::Context context); void registerScriptInitializer(ScriptInitializer initializer); void loadScripts(); @@ -100,6 +101,7 @@ protected: void onScriptEngineError(const QString& scriptFilename); void launchScriptEngine(ScriptEngine* engine); + ScriptEngine::Context _context; QReadWriteLock _scriptEnginesHashLock; QHash _scriptEnginesHash; QSet _allKnownScriptEngines; From 95024d2b8092f2798f49a251778699682ffb1d25 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 23 Jan 2017 09:30:30 -0800 Subject: [PATCH 2/3] Add ENTITY_SERVER_SCRIPT context to ac server --- assignment-client/src/scripts/EntityScriptServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/scripts/EntityScriptServer.cpp b/assignment-client/src/scripts/EntityScriptServer.cpp index c1e53dda17..b798536ab2 100644 --- a/assignment-client/src/scripts/EntityScriptServer.cpp +++ b/assignment-client/src/scripts/EntityScriptServer.cpp @@ -41,7 +41,7 @@ EntityScriptServer::EntityScriptServer(ReceivedMessage& message) : ThreadedAssig DependencyManager::set(); DependencyManager::set(); - DependencyManager::set(); + DependencyManager::set(ENTITY_SERVER_SCRIPT); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); From fcaca8930a3a42a43e897076d78a0ea7625e04c4 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 24 Jan 2017 08:31:58 -0800 Subject: [PATCH 3/3] Fix enum name in EntityScriptServer --- assignment-client/src/scripts/EntityScriptServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/scripts/EntityScriptServer.cpp b/assignment-client/src/scripts/EntityScriptServer.cpp index b798536ab2..4b7ae2562c 100644 --- a/assignment-client/src/scripts/EntityScriptServer.cpp +++ b/assignment-client/src/scripts/EntityScriptServer.cpp @@ -41,7 +41,7 @@ EntityScriptServer::EntityScriptServer(ReceivedMessage& message) : ThreadedAssig DependencyManager::set(); DependencyManager::set(); - DependencyManager::set(ENTITY_SERVER_SCRIPT); + DependencyManager::set(ScriptEngine::ENTITY_SERVER_SCRIPT); auto& packetReceiver = DependencyManager::get()->getPacketReceiver();