2652 lines · 112.4 KB · C++
RawDownload
} void ScriptEngine::callWithEnvironment(const EntityItemID& entityID, const QUrl& sandboxURL, QScriptValue function, QScriptValue thisObject, QScriptValueList args) {    auto operation = [&]() {        function.call(thisObject, args);    };    doWithEnvironment(entityID, sandboxURL, operation);} void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const QStringList& params, const QUuid& remoteCallerID) {    if (QThread::currentThread() != thread()) {#ifdef THREAD_DEBUGGING        qCDebug(scriptengine) << "*** WARNING *** ScriptEngine::callEntityScriptMethod() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "]  "            "entityID:" << entityID << "methodName:" << methodName;#endif         QMetaObject::invokeMethod(this, "callEntityScriptMethod",                                  Q_ARG(const EntityItemID&, entityID),                                  Q_ARG(const QString&, methodName),                                  Q_ARG(const QStringList&, params),                                  Q_ARG(const QUuid&, remoteCallerID));        return;    }#ifdef THREAD_DEBUGGING    qCDebug(scriptengine) << "ScriptEngine::callEntityScriptMethod() called on correct thread [" << thread() << "]  "        "entityID:" << entityID << "methodName:" << methodName;#endif     if (HIFI_AUTOREFRESH_FILE_SCRIPTS && methodName != "unload") {        refreshFileScript(entityID);    }    if (isEntityScriptRunning(entityID)) {        EntityScriptDetails details;        {            QWriteLocker locker { &_entityScriptsLock };            details = _entityScripts[entityID];        }        QScriptValue entityScript = details.scriptObject; // previously loaded         // If this is a remote call, we need to check to see if the function is remotely callable        // we do this by checking for the existance of the 'remotelyCallable' property on the        // entityScript. And we confirm that the method name is included. If this fails, the        // function will not be called.        bool callAllowed = false;        if (remoteCallerID == QUuid()) {            callAllowed = true;        } else {            if (entityScript.property("remotelyCallable").isArray()) {                auto callables = entityScript.property("remotelyCallable");                auto callableCount = callables.property("length").toInteger();                for (int i = 0; i < callableCount; i++) {                    auto callable = callables.property(i).toString();                    if (callable == methodName) {                        callAllowed = true;                        break;                    }                }            }            if (!callAllowed) {                qDebug() << "Method [" << methodName << "] not remotely callable.";            }        }         if (callAllowed && entityScript.property(methodName).isFunction()) {            QScriptValueList args;            args << entityID.toScriptValue(this);            args << qScriptValueFromSequence(this, params);             QScriptValue oldData = this->globalObject().property("Script").property("remoteCallerID");            this->globalObject().property("Script").setProperty("remoteCallerID", remoteCallerID.toString()); // Make the remoteCallerID available to javascript as a global.            callWithEnvironment(entityID, details.definingSandboxURL, entityScript.property(methodName), entityScript, args);            this->globalObject().property("Script").setProperty("remoteCallerID", oldData);        }    }} void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const PointerEvent& event) {    if (QThread::currentThread() != thread()) {#ifdef THREAD_DEBUGGING        qCDebug(scriptengine) << "*** WARNING *** ScriptEngine::callEntityScriptMethod() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "]  "            "entityID:" << entityID << "methodName:" << methodName << "event: mouseEvent";#endif         QMetaObject::invokeMethod(this, "callEntityScriptMethod",                                  Q_ARG(const EntityItemID&, entityID),                                  Q_ARG(const QString&, methodName),                                  Q_ARG(const PointerEvent&, event));        return;    }#ifdef THREAD_DEBUGGING    qCDebug(scriptengine) << "ScriptEngine::callEntityScriptMethod() called on correct thread [" << thread() << "]  "        "entityID:" << entityID << "methodName:" << methodName << "event: pointerEvent";#endif     if (HIFI_AUTOREFRESH_FILE_SCRIPTS) {        refreshFileScript(entityID);    }    if (isEntityScriptRunning(entityID)) {        EntityScriptDetails details;        {            QWriteLocker locker { &_entityScriptsLock };            details = _entityScripts[entityID];        }        QScriptValue entityScript = details.scriptObject; // previously loaded        if (entityScript.property(methodName).isFunction()) {            QScriptValueList args;            args << entityID.toScriptValue(this);            args << event.toScriptValue(this);            callWithEnvironment(entityID, details.definingSandboxURL, entityScript.property(methodName), entityScript, args);        }    }} void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const EntityItemID& otherID, const Collision& collision) {    if (QThread::currentThread() != thread()) {#ifdef THREAD_DEBUGGING        qCDebug(scriptengine) << "*** WARNING *** ScriptEngine::callEntityScriptMethod() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "]  "            "entityID:" << entityID << "methodName:" << methodName << "otherID:" << otherID << "collision: collision";#endif         QMetaObject::invokeMethod(this, "callEntityScriptMethod",                                  Q_ARG(const EntityItemID&, entityID),                                  Q_ARG(const QString&, methodName),                                  Q_ARG(const EntityItemID&, otherID),                                  Q_ARG(const Collision&, collision));        return;    }#ifdef THREAD_DEBUGGING    qCDebug(scriptengine) << "ScriptEngine::callEntityScriptMethod() called on correct thread [" << thread() << "]  "        "entityID:" << entityID << "methodName:" << methodName << "otherID:" << otherID << "collision: collision";#endif     if (HIFI_AUTOREFRESH_FILE_SCRIPTS) {        refreshFileScript(entityID);    }    if (isEntityScriptRunning(entityID)) {        EntityScriptDetails details;        {            QWriteLocker locker { &_entityScriptsLock };            details = _entityScripts[entityID];        }        QScriptValue entityScript = details.scriptObject; // previously loaded        if (entityScript.property(methodName).isFunction()) {            QScriptValueList args;            args << entityID.toScriptValue(this);            args << otherID.toScriptValue(this);            args << collisionToScriptValue(this, collision);            callWithEnvironment(entityID, details.definingSandboxURL, entityScript.property(methodName), entityScript, args);        }    }} 

Lines 2501–2652 of 2652. Previous lines