diff --git a/src/libs/extensionsystem/iplugin.h b/src/libs/extensionsystem/iplugin.h index 32440880538..9532e757792 100644 --- a/src/libs/extensionsystem/iplugin.h +++ b/src/libs/extensionsystem/iplugin.h @@ -63,7 +63,9 @@ public: virtual void extensionsInitialized() = 0; virtual bool delayedInitialize() { return false; } virtual ShutdownFlag aboutToShutdown() { return SynchronousShutdown; } - virtual QObject *remoteCommand(const QStringList & /* options */, const QStringList & /* arguments */) { return 0; } + virtual QObject *remoteCommand(const QStringList & /* options */, + const QString & /* workingDirectory */, + const QStringList & /* arguments */) { return 0; } virtual QList createTestObjects() const; PluginSpec *pluginSpec() const; diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp index 20da164208b..5c2fd958d31 100644 --- a/src/libs/extensionsystem/pluginmanager.cpp +++ b/src/libs/extensionsystem/pluginmanager.cpp @@ -505,6 +505,7 @@ QHash PluginManager::pluginCollections() } static const char argumentKeywordC[] = ":arguments"; +static const char pwdKeywordC[] = ":pwd"; /*! Serializes plugin options and arguments for sending in a single string @@ -528,20 +529,15 @@ QString PluginManager::serializedArguments() rc += ps->arguments().join(separator); } } + if (!rc.isEmpty()) + rc += separator; + rc += QLatin1String(pwdKeywordC) + separator + QDir::currentPath(); if (!d->arguments.isEmpty()) { if (!rc.isEmpty()) rc += separator; rc += QLatin1String(argumentKeywordC); - // If the argument appears to be a file, make it absolute - // when sending to another instance. - foreach (const QString &argument, d->arguments) { - rc += separator; - const QFileInfo fi(argument); - if (fi.exists() && fi.isRelative()) - rc += fi.absoluteFilePath(); - else - rc += argument; - } + foreach (const QString &argument, d->arguments) + rc += separator + argument; } return rc; } @@ -577,11 +573,14 @@ void PluginManager::remoteArguments(const QString &serializedArgument, QObject * if (serializedArgument.isEmpty()) return; QStringList serializedArguments = serializedArgument.split(QLatin1Char('|')); + const QStringList pwdValue = subList(serializedArguments, QLatin1String(pwdKeywordC)); + const QString workingDirectory = pwdValue.isEmpty() ? QString() : pwdValue.first(); const QStringList arguments = subList(serializedArguments, QLatin1String(argumentKeywordC)); foreach (const PluginSpec *ps, plugins()) { if (ps->state() == PluginSpec::Running) { const QStringList pluginOptions = subList(serializedArguments, QLatin1Char(':') + ps->name()); - QObject *socketParent = ps->plugin()->remoteCommand(pluginOptions, arguments); + QObject *socketParent = ps->plugin()->remoteCommand(pluginOptions, workingDirectory, + arguments); if (socketParent && socket) { socket->setParent(socketParent); socket = 0; diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp index 4246dfe7295..43731dd3723 100644 --- a/src/plugins/coreplugin/coreplugin.cpp +++ b/src/plugins/coreplugin/coreplugin.cpp @@ -226,17 +226,20 @@ bool CorePlugin::delayedInitialize() return true; } -QObject *CorePlugin::remoteCommand(const QStringList & /* options */, const QStringList &args) +QObject *CorePlugin::remoteCommand(const QStringList & /* options */, + const QString &workingDirectory, + const QStringList &args) { IDocument *res = m_mainWindow->openFiles( - args, ICore::OpenFilesFlags(ICore::SwitchMode | ICore::CanContainLineNumbers)); + args, ICore::OpenFilesFlags(ICore::SwitchMode | ICore::CanContainLineNumbers), + workingDirectory); m_mainWindow->raiseWindow(); return res; } void CorePlugin::fileOpenRequest(const QString &f) { - remoteCommand(QStringList(), QStringList(f)); + remoteCommand(QStringList(), QString(), QStringList(f)); } ExtensionSystem::IPlugin::ShutdownFlag CorePlugin::aboutToShutdown() diff --git a/src/plugins/coreplugin/coreplugin.h b/src/plugins/coreplugin/coreplugin.h index b07d04d865b..fd82e709d61 100644 --- a/src/plugins/coreplugin/coreplugin.h +++ b/src/plugins/coreplugin/coreplugin.h @@ -59,7 +59,9 @@ public: void extensionsInitialized(); bool delayedInitialize(); ShutdownFlag aboutToShutdown(); - QObject *remoteCommand(const QStringList & /* options */, const QStringList &args); + QObject *remoteCommand(const QStringList & /* options */, + const QString &workingDirectory, + const QStringList &args); public slots: void fileOpenRequest(const QString&); diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index c8e61cb901b..e7423ae3d03 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -761,18 +761,24 @@ static IDocumentFactory *findDocumentFactory(const QList &fil * \a flags can be used to stop on first failure, indicate that a file name * might include line numbers and/or switch mode to edit mode. * + * \a workingDirectory is used when files are opened by a remote client, since + * the file names are relative to the client working directory. + * * \returns the first opened document. Required to support the -block flag * for client mode. * * \sa IPlugin::remoteArguments() */ -IDocument *MainWindow::openFiles(const QStringList &fileNames, ICore::OpenFilesFlags flags) +IDocument *MainWindow::openFiles(const QStringList &fileNames, + ICore::OpenFilesFlags flags, + const QString &workingDirectory) { QList documentFactories = PluginManager::getObjects(); IDocument *res = 0; foreach (const QString &fileName, fileNames) { - const QFileInfo fi(fileName); + const QDir workingDir(workingDirectory.isEmpty() ? QDir::currentPath() : workingDirectory); + const QFileInfo fi(workingDir, fileName); const QString absoluteFilePath = fi.absoluteFilePath(); if (IDocumentFactory *documentFactory = findDocumentFactory(documentFactories, fi)) { IDocument *document = documentFactory->open(absoluteFilePath); diff --git a/src/plugins/coreplugin/mainwindow.h b/src/plugins/coreplugin/mainwindow.h index 17b8f88457c..6f047ca9041 100644 --- a/src/plugins/coreplugin/mainwindow.h +++ b/src/plugins/coreplugin/mainwindow.h @@ -94,7 +94,9 @@ public: void addContextObject(IContext *context); void removeContextObject(IContext *context); - IDocument *openFiles(const QStringList &fileNames, ICore::OpenFilesFlags flags); + IDocument *openFiles(const QStringList &fileNames, + ICore::OpenFilesFlags flags, + const QString &workingDirectory = QString()); inline SettingsDatabase *settingsDatabase() const { return m_settingsDatabase; } virtual QPrinter *printer() const; diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 6911f3df0e4..76c7a0add5d 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -737,7 +737,7 @@ public: void runControlStarted(DebuggerEngine *engine); void runControlFinished(DebuggerEngine *engine); - void remoteCommand(const QStringList &options, const QStringList &); + void remoteCommand(const QStringList &options); void displayDebugger(DebuggerEngine *engine, bool updateEngine = true); @@ -2370,8 +2370,7 @@ void DebuggerPluginPrivate::runControlFinished(DebuggerEngine *engine) m_logWindow->clearUndoRedoStacks(); } -void DebuggerPluginPrivate::remoteCommand(const QStringList &options, - const QStringList &) +void DebuggerPluginPrivate::remoteCommand(const QStringList &options) { if (options.isEmpty()) return; @@ -3295,9 +3294,12 @@ IPlugin::ShutdownFlag DebuggerPlugin::aboutToShutdown() } QObject *DebuggerPlugin::remoteCommand(const QStringList &options, - const QStringList &list) + const QString &workingDirectory, + const QStringList &list) { - dd->remoteCommand(options, list); + Q_UNUSED(workingDirectory); + Q_UNUSED(list); + dd->remoteCommand(options); return 0; } diff --git a/src/plugins/debugger/debuggerplugin.h b/src/plugins/debugger/debuggerplugin.h index ba8241cb03b..ba7ca8bdcef 100644 --- a/src/plugins/debugger/debuggerplugin.h +++ b/src/plugins/debugger/debuggerplugin.h @@ -51,7 +51,9 @@ public: private: // IPlugin implementation. bool initialize(const QStringList &arguments, QString *errorMessage); - QObject *remoteCommand(const QStringList &options, const QStringList &arguments); + QObject *remoteCommand(const QStringList &options, + const QString &workingDirectory, + const QStringList &arguments); ShutdownFlag aboutToShutdown(); void extensionsInitialized();