summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorJake Petroules <jake.petroules@petroules.com>2013-10-23 11:32:55 +0200
committerJoerg Bornemann <joerg.bornemann@digia.com>2013-11-04 11:32:47 +0100
commit2bd54bec4e67c90350c141dc05b65ff9cdac4a1e (patch)
tree01c948e300232e94d3e633235e0a1dec9bdfc312 /src/lib
parent66819f1c33d3bb6c2e5463f690b69ff5649a6258 (diff)
downloadqbs-2bd54bec4e67c90350c141dc05b65ff9cdac4a1e.tar.gz
Add support for accessing native settings.
On Windows, provides access to the registry. On OS X, provides access to arbitrary property list files. On other operating systems, provides access to arbitrary .ini files. Task-number: QBS-422 Change-Id: I37aa657db01009d9bd577f51445709957d1fe630 Reviewed-by: Jake Petroules <jake.petroules@petroules.com> Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/language/builtinvalue.h1
-rw-r--r--src/lib/language/evaluatorscriptclass.cpp26
-rw-r--r--src/lib/language/evaluatorscriptclass.h2
-rw-r--r--src/lib/language/moduleloader.cpp2
-rw-r--r--src/lib/language/testdata/getNativeSetting.qbs23
-rw-r--r--src/lib/language/testdata/nativesettings.ini1
-rw-r--r--src/lib/language/tst_language.cpp29
-rw-r--r--src/lib/language/tst_language.h1
8 files changed, 85 insertions, 0 deletions
diff --git a/src/lib/language/builtinvalue.h b/src/lib/language/builtinvalue.h
index f10dbcf2e..429cb276b 100644
--- a/src/lib/language/builtinvalue.h
+++ b/src/lib/language/builtinvalue.h
@@ -40,6 +40,7 @@ class BuiltinValue : public Value
public:
enum Builtin
{
+ GetNativeSettingFunction,
GetEnvFunction,
GetHostOSFunction
};
diff --git a/src/lib/language/evaluatorscriptclass.cpp b/src/lib/language/evaluatorscriptclass.cpp
index e1026e8a3..55782aa53 100644
--- a/src/lib/language/evaluatorscriptclass.cpp
+++ b/src/lib/language/evaluatorscriptclass.cpp
@@ -35,12 +35,15 @@
#include "filecontext.h"
#include "item.h"
#include "propertydeclaration.h"
+#include <tools/hostosinfo.h>
#include <tools/qbsassert.h>
+#include <tools/scripttools.h>
#include <QScriptEngine>
#include <QScriptString>
#include <QScriptValue>
#include <QDebug>
+#include <QSettings>
namespace qbs {
namespace Internal {
@@ -220,6 +223,7 @@ EvaluatorScriptClass::EvaluatorScriptClass(QScriptEngine *scriptEngine, const Lo
: QScriptClass(scriptEngine)
, m_logger(logger)
{
+ m_getNativeSettingBuiltin = scriptEngine->newFunction(js_getNativeSetting, 3);
m_getenvBuiltin = scriptEngine->newFunction(js_getenv, 1);
m_getHostOSBuiltin = scriptEngine->newFunction(js_getHostOS, 1);
}
@@ -386,6 +390,8 @@ QScriptValue EvaluatorScriptClass::property(const QScriptValue &object, const QS
QScriptValue EvaluatorScriptClass::scriptValueForBuiltin(BuiltinValue::Builtin builtin) const
{
switch (builtin) {
+ case BuiltinValue::GetNativeSettingFunction:
+ return m_getNativeSettingBuiltin;
case BuiltinValue::GetEnvFunction:
return m_getenvBuiltin;
case BuiltinValue::GetHostOSFunction:
@@ -395,6 +401,26 @@ QScriptValue EvaluatorScriptClass::scriptValueForBuiltin(BuiltinValue::Builtin b
return QScriptValue();
}
+QScriptValue EvaluatorScriptClass::js_getNativeSetting(QScriptContext *context, QScriptEngine *engine)
+{
+ if (Q_UNLIKELY(context->argumentCount() < 1 || context->argumentCount() > 3)) {
+ return context->throwError(QScriptContext::SyntaxError,
+ QLatin1String("getNativeSetting expects between 1 and 3 arguments"));
+ }
+
+ QString key = context->argumentCount() > 1 ? context->argument(1).toString() : QString();
+
+ // We'll let empty string represent the default registry value
+ if (HostOsInfo::isWindowsHost() && key.isEmpty())
+ key = QLatin1String(".");
+
+ QVariant defaultValue = context->argumentCount() > 2 ? context->argument(2).toVariant() : QVariant();
+
+ QSettings settings(context->argument(0).toString(), QSettings::NativeFormat);
+ QVariant value = settings.value(key, defaultValue);
+ return value.isNull() ? engine->undefinedValue() : engine->toScriptValue(value);
+}
+
QScriptValue EvaluatorScriptClass::js_getenv(QScriptContext *context, QScriptEngine *engine)
{
if (Q_UNLIKELY(context->argumentCount() < 1)) {
diff --git a/src/lib/language/evaluatorscriptclass.h b/src/lib/language/evaluatorscriptclass.h
index dbf56c11f..d22d2a398 100644
--- a/src/lib/language/evaluatorscriptclass.h
+++ b/src/lib/language/evaluatorscriptclass.h
@@ -64,6 +64,7 @@ private:
bool ignoreParent = false);
static QString resultToString(const QScriptValue &scriptValue);
static Item *findParentOfType(const Item *item, const QString &typeName);
+ static QScriptValue js_getNativeSetting(QScriptContext *context, QScriptEngine *engine);
static QScriptValue js_getenv(QScriptContext *context, QScriptEngine *engine);
static QScriptValue js_getHostOS(QScriptContext *context, QScriptEngine *engine);
@@ -84,6 +85,7 @@ private:
};
QueryResult m_queryResult;
Logger m_logger;
+ QScriptValue m_getNativeSettingBuiltin;
QScriptValue m_getenvBuiltin;
QScriptValue m_getHostOSBuiltin;
};
diff --git a/src/lib/language/moduleloader.cpp b/src/lib/language/moduleloader.cpp
index d614ab584..46d5102ca 100644
--- a/src/lib/language/moduleloader.cpp
+++ b/src/lib/language/moduleloader.cpp
@@ -781,6 +781,8 @@ void ModuleLoader::loadBaseModule(ProductContext *productContext, Item *item)
void ModuleLoader::setupBaseModulePrototype(Item *prototype)
{
+ prototype->setProperty(QLatin1String("getNativeSetting"),
+ BuiltinValue::create(BuiltinValue::GetNativeSettingFunction));
prototype->setProperty(QLatin1String("getenv"),
BuiltinValue::create(BuiltinValue::GetEnvFunction));
prototype->setProperty(QLatin1String("getHostOS"),
diff --git a/src/lib/language/testdata/getNativeSetting.qbs b/src/lib/language/testdata/getNativeSetting.qbs
new file mode 100644
index 000000000..c414c79f9
--- /dev/null
+++ b/src/lib/language/testdata/getNativeSetting.qbs
@@ -0,0 +1,23 @@
+import qbs.FileInfo
+
+Project {
+ Product {
+ name: {
+ if (qbs.hostOS.contains("osx")) {
+ return qbs.getNativeSetting("/System/Library/CoreServices/SystemVersion.plist", "ProductName");
+ } else if (qbs.hostOS.contains("windows")) {
+ var productName = qbs.getNativeSetting("HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion", "ProductName");
+ if (productName.contains("Windows")) {
+ return "Windows";
+ }
+ return undefined;
+ } else {
+ return qbs.getNativeSetting(FileInfo.joinPaths(path, "nativesettings.ini"), "osname");
+ }
+ }
+ }
+
+ Product {
+ name: qbs.getNativeSetting("/dev/null", undefined, "fallback");
+ }
+}
diff --git a/src/lib/language/testdata/nativesettings.ini b/src/lib/language/testdata/nativesettings.ini
new file mode 100644
index 000000000..4caf32e56
--- /dev/null
+++ b/src/lib/language/testdata/nativesettings.ini
@@ -0,0 +1 @@
+osname = Unix
diff --git a/src/lib/language/tst_language.cpp b/src/lib/language/tst_language.cpp
index 45cb3a141..478423032 100644
--- a/src/lib/language/tst_language.cpp
+++ b/src/lib/language/tst_language.cpp
@@ -39,6 +39,7 @@
#include <parser/qmljsparser_p.h>
#include <tools/scripttools.h>
#include <tools/error.h>
+#include <tools/hostosinfo.h>
#include <tools/propertyfinder.h>
#include <QProcessEnvironment>
@@ -426,6 +427,34 @@ void TestLanguage::fileContextProperties()
QCOMPARE(exceptionCaught, false);
}
+void TestLanguage::getNativeSetting()
+{
+ bool exceptionCaught = false;
+ try {
+ defaultParameters.setProjectFilePath(testProject("getNativeSetting.qbs"));
+ project = loader->loadProject(defaultParameters);
+
+ QString expectedProductName;
+ if (HostOsInfo::isOsxHost())
+ expectedProductName = QLatin1String("Mac OS X");
+ else if (HostOsInfo::isWindowsHost())
+ expectedProductName = QLatin1String("Windows");
+ else
+ expectedProductName = QLatin1String("Unix");
+
+ QVERIFY(project);
+ QHash<QString, ResolvedProductPtr> products = productsFromProject(project);
+ ResolvedProductPtr product = products.value(expectedProductName);
+ QVERIFY(product);
+ ResolvedProductPtr product2 = products.value(QLatin1String("fallback"));
+ QVERIFY(product2);
+ } catch (const ErrorInfo &e) {
+ exceptionCaught = true;
+ qDebug() << e.toString();
+ }
+ QCOMPARE(exceptionCaught, false);
+}
+
void TestLanguage::groupConditions_data()
{
QTest::addColumn<int>("groupCount");
diff --git a/src/lib/language/tst_language.h b/src/lib/language/tst_language.h
index bf2b49bcc..87e305282 100644
--- a/src/lib/language/tst_language.h
+++ b/src/lib/language/tst_language.h
@@ -74,6 +74,7 @@ private slots:
void erroneousFiles();
void exports();
void fileContextProperties();
+ void getNativeSetting();
void groupConditions_data();
void groupConditions();
void groupName();