]> Some of my projects - aniplayer.git/commitdiff
Add cwd option
authorAPTX <marek321@gmail.com>
Mon, 27 Feb 2017 11:05:20 +0000 (12:05 +0100)
committerAPTX <marek321@gmail.com>
Mon, 27 Feb 2017 11:20:52 +0000 (12:20 +0100)
This option is intended to pass correct working
directory to the running instance which may have
been started in a different directory.

core/instancemanager.cpp
core/instancemanager.h
core/main.cpp

index 38d556d404f728335440eb65eb800b145659aafb..fca0c20c6a1d92f0ab7809ee3b8d125a4f137750 100644 (file)
@@ -1,6 +1,7 @@
 #include "instancemanager.h"
 
 #include <QDataStream>
+#include <QDir>
 #include <QLoggingCategory>
 #include <QQmlApplicationEngine>
 #include <QQmlContext>
@@ -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() {
index ab6838229baeba616d177e950fb49259dee11f62..da36a511e0cead02255e909897f1e2af50c00b05 100644 (file)
@@ -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<Player *> m_instances;
   PluginManager *m_backendPluginManager;
index e626ae79670e4e28f47c7c9fe3074a19b6cc263d..be9e57bc512cd6efc2411ec50c9f1e65634d9136 100644 (file)
@@ -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;