aboutsummaryrefslogtreecommitdiffstats
path: root/src/bench/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/bench/main.cpp')
-rw-r--r--src/bench/main.cpp137
1 files changed, 107 insertions, 30 deletions
diff --git a/src/bench/main.cpp b/src/bench/main.cpp
index 728cf9b..5b9c2f9 100644
--- a/src/bench/main.cpp
+++ b/src/bench/main.cpp
@@ -1,6 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2016 Pelagicore AG
+** Copyright (C) 2019 Luxoft Sweden AB
+** Copyright (C) 2018 Pelagicore AG
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QmlLive tool.
@@ -36,9 +37,11 @@
#include "hostmanager.h"
#include "hostmodel.h"
+#include "livehubengine.h"
#include "options.h"
#include "mainwindow.h"
#include "qmllive_version.h"
+#include "projectmanager.h"
class Application : public QApplication
{
@@ -46,6 +49,7 @@ class Application : public QApplication
public:
static Application *create(int &argc, char **argv);
+ ~Application() override;
protected:
Application(int &argc, char **argv);
@@ -53,7 +57,14 @@ protected:
QString serverName() const;
void setDarkStyle();
- void parseArguments(const QStringList &arguments, Options *options);
+ static void parseArguments(const QStringList &arguments, Options *options);
+ static const Options *options() { return s_options; }
+
+private:
+ static QString userName();
+
+private:
+ static Options *s_options;
};
class MasterApplication : public Application
@@ -62,6 +73,7 @@ class MasterApplication : public Application
public:
MasterApplication(int &argc, char **argv);
+ ~MasterApplication();
private:
void listenForArguments();
@@ -83,16 +95,18 @@ private:
void forwardArguments();
};
+Options *Application::s_options = 0;
+
Application *Application::create(int &argc, char **argv)
{
setApplicationName("QmlLiveBench");
setOrganizationDomain(QLatin1String(QMLLIVE_ORGANIZATION_DOMAIN));
setOrganizationName(QLatin1String(QMLLIVE_ORGANIZATION_NAME));
- // Workaround: Cannot use QCoreApplication::arguments before app is instantiated
- const bool hasNoRemoteOption = argc >= 2 && QString::fromLocal8Bit(argv[1]) == QLatin1String("--noremote");
+ // Cannot instantiate the actual application yet
+ parseArguments(QCoreApplication(argc, argv).arguments(), s_options = new Options);
- if (hasNoRemoteOption || isMaster())
+ if (isMaster())
return new MasterApplication(argc, argv);
else
return new SlaveApplication(argc, argv);
@@ -107,10 +121,19 @@ Application::Application(int &argc, char **argv)
setDarkStyle();
}
+Application::~Application()
+{
+ delete s_options, s_options = 0;
+}
+
bool Application::isMaster()
{
Q_ASSERT(!applicationName().isEmpty());
Q_ASSERT(!organizationDomain().isEmpty() || !organizationName().isEmpty());
+ Q_ASSERT(s_options);
+
+ if (s_options->noRemote())
+ return true;
static QSharedMemory *lock = 0;
static bool retv = false;
@@ -118,9 +141,10 @@ bool Application::isMaster()
if (lock != 0)
return retv;
- const QString key = QString::fromLatin1("%1.%2-lock")
+ const QString key = QString::fromLatin1("%1.%2-%3-lock")
.arg(organizationDomain().isEmpty() ? organizationName() : organizationDomain())
- .arg(applicationName());
+ .arg(applicationName())
+ .arg(userName());
lock = new QSharedMemory(key, qApp);
@@ -145,9 +169,10 @@ QString Application::serverName() const
Q_ASSERT(!applicationName().isEmpty());
Q_ASSERT(!organizationDomain().isEmpty() || !organizationName().isEmpty());
- return QString::fromLatin1("%1.%2-app")
+ return QString::fromLatin1("%1.%2-%3-app")
.arg(organizationDomain().isEmpty() ? organizationName() : organizationDomain())
- .arg(applicationName());
+ .arg(applicationName())
+ .arg(userName());
}
void Application::setDarkStyle()
@@ -199,12 +224,16 @@ void Application::parseArguments(const QStringList &arguments, Options *options)
"(implies --remoteonly)", "name");
parser.addOption(probeHostOption);
QCommandLineOption noRemoteOption("noremote", "do not try to talk to a running bench, do not listen for remote "
- "connections. It MUST BE the VERY FIRST argument on command line.");
+ "connections.");
parser.addOption(noRemoteOption);
QCommandLineOption remoteOnlyOption("remoteonly", "talk to a running bench, do nothing if none is running.");
parser.addOption(remoteOnlyOption);
QCommandLineOption pingOption("ping", "just check if there is a bench running and accepting remote connections.");
parser.addOption(pingOption);
+ QCommandLineOption maxWatchesOption("maxdirwatch", "limit the number of directories to watch for changes", "number", QString::number(options->maximumWatches()));
+ parser.addOption(maxWatchesOption);
+ QCommandLineOption projectOption("project", "loads project document .qmllive containing workspace path, imports paths, main document in JSON format");
+ parser.addOption(projectOption);
parser.process(arguments);
@@ -231,6 +260,15 @@ void Application::parseArguments(const QStringList &arguments, Options *options)
parser.showHelp(-1);
}
+ if (parser.isSet(maxWatchesOption)) {
+ bool ok;
+ int value = parser.value(maxWatchesOption).toInt(&ok);
+ if (!ok) {
+ qWarning() << "Invalid argument to --maxdirwatch option";
+ parser.showHelp(-1);
+ }
+ options->setMaximumWatches(value);
+ }
options->setPluginPath(parser.value(pluginPathOption));
options->setImportPaths(parser.values(importPathOption));
@@ -263,12 +301,16 @@ void Application::parseArguments(const QStringList &arguments, Options *options)
options->setHostsToRemove(parser.values(rmHostOption));
options->setHostsToProbe(parser.values(probeHostOption));
+ if (parser.isSet(projectOption)){
+ options->setProject(parser.value(projectOption));
+ }
+
const QStringList positionalArguments = parser.positionalArguments();
if (positionalArguments.count() >= 1) {
QString argument = positionalArguments.value(0);
QFileInfo fi(argument);
if (argument.endsWith(".qml")) {
- qDebug() << "First argument ends with \".qml\". Assuming it is a file.";
+ qInfo() << "First argument ends with \".qml\". Assuming it is a file.";
if (!fi.exists() || !fi.isFile()) {
qWarning() << "Document does not exist or is not a file: " << fi.absoluteFilePath();
parser.showHelp(-1);
@@ -276,12 +318,17 @@ void Application::parseArguments(const QStringList &arguments, Options *options)
options->setWorkspace(fi.absolutePath());
options->setActiveDocument(LiveDocument(fi.absoluteFilePath()));
} else {
- qDebug() << "First argument does not ending with \".qml\". Assuming it is a workspace.";
- if (!fi.exists() || !fi.isDir()) {
- qWarning() << "Workspace does not exist or is not a directory: " << fi.absoluteFilePath();
- parser.showHelp(-1);
+ if (argument.endsWith(".qmllive") && parser.isSet(projectOption)){
+ qInfo() << "First argument is ending with \".qmllive\". Assuming it is a project.";
+ options->setProject(fi.absoluteFilePath());
+ } else {
+ qInfo() << "First argument does not ending with \".qml\". Assuming it is a workspace.";
+ if (!fi.exists() || !fi.isDir()) {
+ qWarning() << "Workspace does not exist or is not a directory: " << fi.absoluteFilePath();
+ parser.showHelp(-1);
+ }
+ options->setWorkspace(fi.absoluteFilePath());
}
- options->setWorkspace(fi.absoluteFilePath());
}
}
if (positionalArguments.count() == 2) {
@@ -302,6 +349,22 @@ void Application::parseArguments(const QStringList &arguments, Options *options)
}
}
+QString Application::userName()
+{
+ QString retv;
+
+#if defined(Q_OS_UNIX)
+ retv = QString::fromLocal8Bit(qgetenv("USER"));
+#elif defined(Q_OS_WIN)
+ retv = QString::fromLocal8Bit(qgetenv("USERNAME"));
+#endif
+
+ if (retv.isEmpty())
+ qWarning("Failed to determine system user name");
+
+ return retv;
+}
+
/*
* class MasterApplication
*/
@@ -310,31 +373,33 @@ MasterApplication::MasterApplication(int &argc, char **argv)
: Application(argc, argv)
, m_window(new MainWindow)
{
- Options options;
- parseArguments(arguments(), &options);
-
- if (options.ping()) {
+ if (options()->ping()) {
QTimer::singleShot(0, [] { QCoreApplication::exit(1); });
return;
}
- if (options.remoteOnly()) {
+ if (options()->remoteOnly()) {
QTimer::singleShot(0, this, &QCoreApplication::quit);
return;
}
- applyOptions(options);
+ applyOptions(*options());
- if (options.hasNoninteractiveOptions()) {
+ if (options()->hasNoninteractiveOptions()) {
QTimer::singleShot(0, this, &QCoreApplication::quit);
} else {
m_window->init();
m_window->show();
- if (!options.noRemote())
+ if (!options()->noRemote())
listenForArguments();
}
}
+MasterApplication::~MasterApplication()
+{
+ delete m_window;
+}
+
void MasterApplication::listenForArguments()
{
QLocalServer *server = new QLocalServer(this);
@@ -390,6 +455,21 @@ void MasterApplication::listenForArguments()
void MasterApplication::applyOptions(const Options &options)
{
+ LiveHubEngine::setMaximumWatches(options.maximumWatches());
+
+ if (!options.project().isEmpty()) {
+ if (m_window->isInitialized())
+ m_window->setProject(options.project());
+ else {
+ ProjectManager pr;
+ if (pr.read(options.project())) {
+ m_window->setWorkspace(pr.workspace());
+ m_window->setImportPaths(pr.imports());
+ m_window->activateDocument(LiveDocument(pr.mainDocument()));
+ }
+ }
+ }
+
if (!options.workspace().isEmpty())
m_window->setWorkspace(QDir(options.workspace()).absolutePath(), false);
@@ -474,18 +554,15 @@ void MasterApplication::applyOptions(const Options &options)
SlaveApplication::SlaveApplication(int &argc, char **argv)
: Application(argc, argv)
{
- Options options;
- parseArguments(arguments(), &options);
-
- if (options.ping()) {
+ if (options()->ping()) {
QTimer::singleShot(0, &QCoreApplication::quit);
return;
}
- if (!options.remoteOnly() && !options.hasNoninteractiveOptions())
+ if (!options()->remoteOnly() && !options()->hasNoninteractiveOptions())
qInfo() << "Another instance running. Activating...";
- warnAboutIgnoredOptions(options);
+ warnAboutIgnoredOptions(*options());
forwardArguments();
}