#include "instancemanager.h"
#include <QDataStream>
+#include <QDir>
#include <QLoggingCategory>
#include <QQmlApplicationEngine>
#include <QQmlContext>
m_parser.addOption(backendOption);
m_parser.addOption(uiOption);
m_parser.addOption(positionOption);
+ m_parser.addOption(multiInstanceOption);
+ m_parser.addOption(cwdOption);
}
void InstanceManager::startFirstInstance() {
m_parser.process(*qApp);
const auto positionalArgs = m_parser.positionalArguments();
- qDebug() << "ARGS" << positionalArgs;
QQmlApplicationEngine *engine = new QQmlApplicationEngine{this};
Q_CHECK_PTR(engine);
m_instances.insert(player);
if (!positionalArgs.empty()) {
- auto url =
- QUrl::fromUserInput(positionalArgs[0], ".", QUrl::AssumeLocalFile);
+ auto url = parseUserInput(positionalArgs[0], m_parser.value(cwdOption));
+ qCDebug(imCategory) << "Parsed positional argument as" << url;
qCDebug(imCategory) << "Parsed positional argument as" << url;
player->setNextSource(url);
}
qCDebug(imCategory, "QML engine loaded");
}
-void InstanceManager::startInstance() {}
-
QString InstanceManager::encodeCommandLine() const {
+ auto args = qApp->arguments();
+ // TODO remove this hack for fixing the cwd when opening files from a second
+ // instance
+ args << "--cwd" << QDir::currentPath();
QByteArray arr;
{
QDataStream stream{&arr, QIODevice::WriteOnly};
- stream << qApp->arguments();
+ stream << args;
}
const auto base64 = arr.toBase64();
return QString::fromLatin1(base64);
const auto positionalArgs = m_parser.positionalArguments();
if (positionalArgs.empty()) {
- qCInfo(imCategory()) << "No new file to open";
+ qCInfo(imCategory) << "No new file to open";
return;
}
- const auto it = m_instances.cbegin();
+ if (m_instances.size() == 1 && !m_parser.isSet(multiInstanceOption)) {
+ const auto it = m_instances.cbegin();
+
+ Q_ASSERT(it != m_instances.cend());
- Q_ASSERT(it != m_instances.cend());
+ auto player = *it;
- auto player = *it;
+ player->loadAndPlay(
+ parseUserInput(positionalArgs[0], m_parser.value(cwdOption)));
+ return;
+ }
+ qCWarning(imCategory) << "Multiple instances not implemented yet!";
+}
- player->loadAndPlay(QUrl::fromUserInput(positionalArgs[0]));
+QUrl InstanceManager::parseUserInput(const QString &arg,
+ const QString &workingDirectory) {
+ return QUrl::fromUserInput(arg, workingDirectory, QUrl::AssumeLocalFile);
}
Player *InstanceManager::createInstance() {
QString encodeCommandLine() const;
void handleSingleInstanceMessage(const QString &message);
+public:
+ static QUrl parseUserInput(const QString &arg,
+ const QString &workingDirectory);
+
private:
Player *createInstance();
const QCommandLineOption backendOption{"backend", "Use backend",
"position in seconds", "0"};
const QCommandLineOption multiInstanceOption{
QStringList{"m", "multi-instance"}, "Open more than one player instance"};
+ const QCommandLineOption cwdOption{
+ "cwd", "Current directory used for file lookups.", "path", "."};
QCommandLineParser m_parser;
QSet<Player *> m_instances;
PluginManager *m_backendPluginManager;