From: APTX Date: Mon, 27 Feb 2017 11:05:20 +0000 (+0100) Subject: Add cwd option X-Git-Url: https://gitweb.aptx.org/?a=commitdiff_plain;h=f339727139d3e78d188c7dfce8baf4240c1350fb;p=aniplayer.git Add cwd option This option is intended to pass correct working directory to the running instance which may have been started in a different directory. --- diff --git a/core/instancemanager.cpp b/core/instancemanager.cpp index 38d556d..fca0c20 100644 --- a/core/instancemanager.cpp +++ b/core/instancemanager.cpp @@ -1,6 +1,7 @@ #include "instancemanager.h" #include +#include #include #include #include @@ -19,13 +20,14 @@ InstanceManager::InstanceManager(QObject *parent) 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); @@ -36,8 +38,8 @@ void InstanceManager::startFirstInstance() { 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); } @@ -49,13 +51,15 @@ void InstanceManager::startFirstInstance() { 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); @@ -81,17 +85,27 @@ void InstanceManager::handleSingleInstanceMessage(const QString &message) { 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() { diff --git a/core/instancemanager.h b/core/instancemanager.h index ab68382..da36a51 100644 --- a/core/instancemanager.h +++ b/core/instancemanager.h @@ -23,6 +23,10 @@ public slots: 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", @@ -33,6 +37,8 @@ private: "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 m_instances; PluginManager *m_backendPluginManager; diff --git a/core/main.cpp b/core/main.cpp index e626ae7..be9e57b 100644 --- a/core/main.cpp +++ b/core/main.cpp @@ -21,7 +21,6 @@ int main(int argc, char *argv[]) { SLOT(handleSingleInstanceMessage(QString))); if (app.isRunning()) { - if (app.sendMessage(im.encodeCommandLine())) return 0; return 1;