// // ScriptManagerScriptingInterface.h // libraries/script-engine/src // // Created by Dale Glass on 24/02/2023. // Copyright 2023 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // SPDX-License-Identifier: Apache-2.0 // #include "ScriptManager.h" #include "ScriptManagerScriptingInterface.h" #include "ScriptEngines.h" #include "ScriptEngine.h" #include ScriptManagerScriptingInterface::ScriptManagerScriptingInterface(ScriptManager *parent): QObject(parent), _manager(parent) { qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType>(); qRegisterMetaType>(); qRegisterMetaType>(); connect(_manager, &ScriptManager::scriptLoaded, this, &ScriptManagerScriptingInterface::scriptLoaded); connect(_manager, &ScriptManager::errorLoadingScript, this, &ScriptManagerScriptingInterface::errorLoadingScript); connect(_manager, &ScriptManager::update, this, &ScriptManagerScriptingInterface::update); connect(_manager, &ScriptManager::scriptEnding, this, &ScriptManagerScriptingInterface::scriptEnding); connect(_manager, &ScriptManager::printedMessage, this, &ScriptManagerScriptingInterface::printedMessage); connect(_manager, &ScriptManager::errorMessage, this, &ScriptManagerScriptingInterface::errorMessage); connect(_manager, &ScriptManager::warningMessage, this, &ScriptManagerScriptingInterface::warningMessage); connect(_manager, &ScriptManager::infoMessage, this, &ScriptManagerScriptingInterface::infoMessage); connect(_manager, &ScriptManager::runningStateChanged, this, &ScriptManagerScriptingInterface::runningStateChanged); connect(_manager, &ScriptManager::clearDebugWindow, this, &ScriptManagerScriptingInterface::clearDebugWindow); connect(_manager, &ScriptManager::loadScript, this, &ScriptManagerScriptingInterface::loadScript); connect(_manager, &ScriptManager::doneRunning, this, &ScriptManagerScriptingInterface::doneRunning); connect(_manager, &ScriptManager::entityScriptDetailsUpdated, this, &ScriptManagerScriptingInterface::entityScriptDetailsUpdated); connect(_manager, &ScriptManager::entityScriptPreloadFinished, this, &ScriptManagerScriptingInterface::entityScriptPreloadFinished); connect(_manager, &ScriptManager::unhandledException, this, &ScriptManagerScriptingInterface::scriptManagerException); } void ScriptManagerScriptingInterface::scriptManagerException(std::shared_ptr exception) { // V8TODO: What should we actually handle here? // emit unhandledException(exception.thrownValue); } QVariantMap ScriptManagerScriptingInterface::getMemoryUsageStatistics() { auto statistics = _manager->engine()->getMemoryUsageStatistics(); QVariantMap map; map.insert("totalHeapSize", QVariant((qulonglong)(statistics.totalHeapSize))); map.insert("usedHeapSize", QVariant((qulonglong)(statistics.usedHeapSize))); map.insert("totalAvailableSize", QVariant((qulonglong)(statistics.totalAvailableSize))); map.insert("totalGlobalHandlesSize", QVariant((qulonglong)(statistics.totalGlobalHandlesSize))); map.insert("usedGlobalHandlesSize", QVariant((qulonglong)(statistics.usedGlobalHandlesSize))); #ifdef OVERTE_V8_MEMORY_DEBUG map.insert("scriptValueCount", QVariant((qulonglong)(statistics.scriptValueCount))); map.insert("scriptValueProxyCount", QVariant((qulonglong)(statistics.scriptValueProxyCount))); map.insert("qObjectCount", QVariant((qulonglong)(statistics.qObjectCount))); #endif return map; } void ScriptManagerScriptingInterface::startCollectingObjectStatistics() { _manager->engine()->startCollectingObjectStatistics(); } void ScriptManagerScriptingInterface::dumpHeapObjectStatistics() { _manager->engine()->dumpHeapObjectStatistics(); } ScriptValue ScriptManagerScriptingInterface::createGarbageCollectorDebuggingObject() { //auto value = _manager->engine()->newQObject(new TestQObject, ScriptEngine::ScriptOwnership); return _manager->engine()->newQObject(new TestQObject, ScriptEngine::ScriptOwnership); //return _manager->engine()->newValue(1); } void ScriptManagerScriptingInterface::startProfiling() { _manager->engine()->startProfiling(); } void ScriptManagerScriptingInterface::stopProfilingAndSave() { _manager->engine()->stopProfilingAndSave(); } void ScriptManagerScriptingInterface::requestServerEntityScriptMessages() { if (_manager->isEntityServerScript() || _manager->isEntityServerScript()) { _manager->engine()->raiseException("Uuid needs to be specified when requestServerEntityScriptMessages is invoked from entity script"); } else { auto scriptEngines = DependencyManager::get().data(); scriptEngines->requestServerEntityScriptMessages(_manager); } } void ScriptManagerScriptingInterface::requestServerEntityScriptMessages(const QUuid& entityID) { if (_manager->isEntityServerScript() || _manager->isEntityServerScript()) { auto scriptEngines = DependencyManager::get().data(); scriptEngines->requestServerEntityScriptMessages(_manager, entityID); } else { _manager->engine()->raiseException("Uuid must not be specified when requestServerEntityScriptMessages is invoked from entity script"); } } void ScriptManagerScriptingInterface::removeServerEntityScriptMessagesRequest() { if (_manager->isEntityServerScript() || _manager->isEntityServerScript()) { _manager->engine()->raiseException("Uuid needs to be specified when removeServerEntityScriptMessagesRequest is invoked from entity script"); } else { auto scriptEngines = DependencyManager::get().data(); scriptEngines->removeServerEntityScriptMessagesRequest(_manager); } } void ScriptManagerScriptingInterface::removeServerEntityScriptMessagesRequest(const QUuid& entityID) { if (_manager->isEntityServerScript() || _manager->isEntityServerScript()) { auto scriptEngines = DependencyManager::get().data(); scriptEngines->removeServerEntityScriptMessagesRequest(_manager, entityID); } else { _manager->engine()->raiseException("Uuid must not be specified when removeServerEntityScriptMessagesRequest is invoked from entity script"); } }