aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/jsextensions/environmentextension.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/corelib/jsextensions/environmentextension.cpp')
-rw-r--r--src/lib/corelib/jsextensions/environmentextension.cpp130
1 files changed, 56 insertions, 74 deletions
diff --git a/src/lib/corelib/jsextensions/environmentextension.cpp b/src/lib/corelib/jsextensions/environmentextension.cpp
index cf17c938b..e973072d0 100644
--- a/src/lib/corelib/jsextensions/environmentextension.cpp
+++ b/src/lib/corelib/jsextensions/environmentextension.cpp
@@ -37,6 +37,8 @@
**
****************************************************************************/
+#include "jsextension.h"
+
#include <language/scriptengine.h>
#include <logging/translator.h>
#include <tools/hostosinfo.h>
@@ -44,93 +46,89 @@
#include <QtCore/qdir.h>
-#include <QtScript/qscriptable.h>
-#include <QtScript/qscriptengine.h>
-
namespace qbs {
namespace Internal {
-class EnvironmentExtension : public QObject, QScriptable
+class EnvironmentExtension : public JsExtension<EnvironmentExtension>
{
- Q_OBJECT
public:
- void initializeJsExtensionEnvironment(QScriptValue extensionObject);
- static QScriptValue js_ctor(QScriptContext *context, QScriptEngine *engine);
- static QScriptValue js_getEnv(QScriptContext *context, QScriptEngine *engine);
- static QScriptValue js_putEnv(QScriptContext *context, QScriptEngine *engine);
- static QScriptValue js_unsetEnv(QScriptContext *context, QScriptEngine *engine);
- static QScriptValue js_currentEnv(QScriptContext *context, QScriptEngine *engine);
+ static const char *name() { return "Environment"; }
+ static void setupStaticMethods(JSContext *ctx, JSValue classObj);
+ static JSValue jsGetEnv(JSContext *ctx, JSValueConst, int argc, JSValueConst *argv);
+ static JSValue jsPutEnv(JSContext *ctx, JSValueConst, int argc, JSValueConst *argv);
+ static JSValue jsUnsetEnv(JSContext *ctx, JSValueConst, int argc, JSValueConst *argv);
+ static JSValue jsCurrentEnv(JSContext *ctx, JSValueConst, int, JSValueConst *);
};
-QScriptValue EnvironmentExtension::js_ctor(QScriptContext *context, QScriptEngine *engine)
+void EnvironmentExtension::setupStaticMethods(JSContext *ctx, JSValue classObj)
{
- Q_UNUSED(engine);
- return context->throwError(Tr::tr("'Environment' cannot be instantiated."));
+ setupMethod(ctx, classObj, "getEnv", &EnvironmentExtension::jsGetEnv, 1);
+ setupMethod(ctx, classObj, "putEnv", &EnvironmentExtension::jsPutEnv, 2);
+ setupMethod(ctx, classObj, "unsetEnv", &EnvironmentExtension::jsUnsetEnv, 1);
+ setupMethod(ctx, classObj, "currentEnv", &EnvironmentExtension::jsCurrentEnv, 0);
}
-static QProcessEnvironment *getProcessEnvironment(QScriptContext *context, QScriptEngine *engine,
- const QString &func, bool doThrow = true)
+static QProcessEnvironment *getProcessEnvironment(ScriptEngine *engine, const QString &func,
+ bool doThrow = true)
{
QVariant v = engine->property(StringConstants::qbsProcEnvVarInternal());
auto procenv = reinterpret_cast<QProcessEnvironment *>(v.value<void *>());
- if (!procenv && doThrow)
- throw context->throwError(QScriptContext::UnknownError,
- QStringLiteral("%1 can only be called from ").arg(func) +
- QStringLiteral("Module.setupBuildEnvironment and ") +
- QStringLiteral("Module.setupRunEnvironment"));
+ if (!procenv && doThrow) {
+ throw QStringLiteral("%1 can only be called from "
+ "Module.setupBuildEnvironment and "
+ "Module.setupRunEnvironment").arg(func);
+ }
return procenv;
}
-QScriptValue EnvironmentExtension::js_getEnv(QScriptContext *context, QScriptEngine *engine)
+JSValue EnvironmentExtension::jsGetEnv(JSContext *ctx, JSValueConst, int argc, JSValueConst *argv)
{
- if (Q_UNLIKELY(context->argumentCount() != 1))
- return context->throwError(QScriptContext::SyntaxError,
- QStringLiteral("getEnv expects 1 argument"));
- const QProcessEnvironment env = static_cast<ScriptEngine *>(engine)->environment();
- const QProcessEnvironment *procenv = getProcessEnvironment(context, engine,
- QStringLiteral("getEnv"), false);
- if (!procenv)
- procenv = &env;
-
- const QString name = context->argument(0).toString();
- const QString value = procenv->value(name);
- return value.isNull() ? engine->undefinedValue() : value;
+ try {
+ const auto name = getArgument<QString>(ctx, "Environment.getEnv", argc, argv);
+ ScriptEngine * const engine = ScriptEngine::engineForContext(ctx);
+ const QProcessEnvironment env = engine->environment();
+ const QProcessEnvironment *procenv = getProcessEnvironment(engine, QStringLiteral("getEnv"),
+ false);
+ if (!procenv)
+ procenv = &env;
+ const QString value = procenv->value(name);
+ return value.isNull() ? engine->undefinedValue() : makeJsString(ctx, value);
+ } catch (const QString &error) { return throwError(ctx, error); }
}
-QScriptValue EnvironmentExtension::js_putEnv(QScriptContext *context, QScriptEngine *engine)
+JSValue EnvironmentExtension::jsPutEnv(JSContext *ctx, JSValue, int argc, JSValue *argv)
{
- if (Q_UNLIKELY(context->argumentCount() != 2))
- return context->throwError(QScriptContext::SyntaxError,
- QStringLiteral("putEnv expects 2 arguments"));
- getProcessEnvironment(context, engine, QStringLiteral("putEnv"))->insert(
- context->argument(0).toString(),
- context->argument(1).toString());
- return engine->undefinedValue();
+ try {
+ const auto args = getArguments<QString, QString>(ctx, "Environment.putEnv", argc, argv);
+ getProcessEnvironment(ScriptEngine::engineForContext(ctx), QStringLiteral("putEnv"))
+ ->insert(std::get<0>(args), std::get<1>(args));
+ return JS_UNDEFINED;
+ } catch (const QString &error) { return throwError(ctx, error); }
}
-QScriptValue EnvironmentExtension::js_unsetEnv(QScriptContext *context, QScriptEngine *engine)
+JSValue EnvironmentExtension::jsUnsetEnv(JSContext *ctx, JSValue, int argc, JSValue *argv)
{
- if (Q_UNLIKELY(context->argumentCount() != 1))
- return context->throwError(QScriptContext::SyntaxError,
- QStringLiteral("unsetEnv expects 1 argument"));
- getProcessEnvironment(context, engine, QStringLiteral("unsetEnv"))->remove(
- context->argument(0).toString());
- return engine->undefinedValue();
+ try {
+ const auto name = getArgument<QString>(ctx, "Environment.unsetEnv", argc, argv);
+ getProcessEnvironment(ScriptEngine::engineForContext(ctx), QStringLiteral("unsetEnv"))
+ ->remove(name);
+ return JS_UNDEFINED;
+ } catch (const QString &error) { return throwError(ctx, error); }
}
-QScriptValue EnvironmentExtension::js_currentEnv(QScriptContext *context, QScriptEngine *engine)
+JSValue EnvironmentExtension::jsCurrentEnv(JSContext *ctx, JSValue, int, JSValue *)
{
- Q_UNUSED(context);
- const QProcessEnvironment env = static_cast<ScriptEngine *>(engine)->environment();
- const QProcessEnvironment *procenv = getProcessEnvironment(context, engine,
- QStringLiteral("currentEnv"), false);
+ ScriptEngine * const engine = ScriptEngine::engineForContext(ctx);
+ const QProcessEnvironment env = engine->environment();
+ const QProcessEnvironment *procenv = getProcessEnvironment(engine, QStringLiteral("currentEnv"),
+ false);
if (!procenv)
procenv = &env;
- QScriptValue envObject = engine->newObject();
+ JSValue envObject = engine->newObject();
const auto keys = procenv->keys();
for (const QString &key : keys) {
const QString keyName = HostOsInfo::isWindowsHost() ? key.toUpper() : key;
- envObject.setProperty(keyName, QScriptValue(procenv->value(key)));
+ setJsProperty(ctx, envObject, keyName, procenv->value(key));
}
return envObject;
}
@@ -138,23 +136,7 @@ QScriptValue EnvironmentExtension::js_currentEnv(QScriptContext *context, QScrip
} // namespace Internal
} // namespace qbs
-void initializeJsExtensionEnvironment(QScriptValue extensionObject)
+void initializeJsExtensionEnvironment(qbs::Internal::ScriptEngine *engine, JSValue extensionObject)
{
- using namespace qbs::Internal;
- QScriptEngine *engine = extensionObject.engine();
- QScriptValue environmentObj = engine->newQMetaObject(&EnvironmentExtension::staticMetaObject,
- engine->newFunction(&EnvironmentExtension::js_ctor));
- environmentObj.setProperty(QStringLiteral("getEnv"),
- engine->newFunction(EnvironmentExtension::js_getEnv, 1));
- environmentObj.setProperty(QStringLiteral("putEnv"),
- engine->newFunction(EnvironmentExtension::js_putEnv, 2));
- environmentObj.setProperty(QStringLiteral("unsetEnv"),
- engine->newFunction(EnvironmentExtension::js_unsetEnv, 1));
- environmentObj.setProperty(QStringLiteral("currentEnv"),
- engine->newFunction(EnvironmentExtension::js_currentEnv, 0));
- extensionObject.setProperty(QStringLiteral("Environment"), environmentObj);
+ qbs::Internal::EnvironmentExtension::registerClass(engine, extensionObject);
}
-
-Q_DECLARE_METATYPE(qbs::Internal::EnvironmentExtension *)
-
-#include "environmentextension.moc"