From 6c69638711e4b5505b637e1926fffda0e0534bd3 Mon Sep 17 00:00:00 2001 From: con <qtc-committer@nokia.com> Date: Wed, 8 Dec 2010 14:52:53 +0100 Subject: [PATCH] Separate std out and std err handling. --- src/plugins/coreplugin/externaltool.cpp | 61 +++++++++++++------ src/plugins/coreplugin/externaltool.h | 3 + tests/auto/externaltool/externaltool.pro | 6 ++ .../externaltool/tst_externaltooltest.cpp | 5 +- 4 files changed, 55 insertions(+), 20 deletions(-) diff --git a/src/plugins/coreplugin/externaltool.cpp b/src/plugins/coreplugin/externaltool.cpp index 71beca9b315..1a446cbcc10 100644 --- a/src/plugins/coreplugin/externaltool.cpp +++ b/src/plugins/coreplugin/externaltool.cpp @@ -28,9 +28,9 @@ **************************************************************************/ #include "externaltool.h" -#include "actionmanager.h" -#include "actioncontainer.h" -#include "command.h" +#include "actionmanager/actionmanager.h" +#include "actionmanager/actioncontainer.h" +#include "actionmanager/command.h" #include "coreconstants.h" #include "variablemanager.h" @@ -64,16 +64,19 @@ namespace { const char * const kXmlLang = "xml:lang"; const char * const kOutput = "output"; + const char * const kError = "error"; const char * const kOutputShowInPane = "showinpane"; const char * const kOutputReplaceSelection = "replaceselection"; const char * const kOutputReloadDocument = "reloaddocument"; + const char * const kOutputIgnore = "ignore"; } // #pragma mark -- ExternalTool ExternalTool::ExternalTool() : m_order(-1), - m_outputHandling(ShowInPane) + m_outputHandling(ShowInPane), + m_errorHandling(ShowInPane) { } @@ -127,6 +130,11 @@ ExternalTool::OutputHandling ExternalTool::outputHandling() const return m_outputHandling; } +ExternalTool::OutputHandling ExternalTool::errorHandling() const +{ + return m_errorHandling; +} + static QStringList splitLocale(const QString &locale) { QString value = locale; @@ -170,6 +178,24 @@ static void localizedText(const QStringList &locales, QXmlStreamReader *reader, } } +static bool parseOutputAttribute(const QString &attribute, QXmlStreamReader *reader, ExternalTool::OutputHandling *value) +{ + const QString output = reader->attributes().value(attribute).toString(); + if (output == QLatin1String(kOutputShowInPane)) { + *value = ExternalTool::ShowInPane; + } else if (output == QLatin1String(kOutputReplaceSelection)) { + *value = ExternalTool::ReplaceSelection; + } else if (output == QLatin1String(kOutputReloadDocument)) { + *value = ExternalTool::ReloadDocument; + } else if (output == QLatin1String(kOutputIgnore)) { + *value = ExternalTool::Ignore; + } else { + reader->raiseError(QLatin1String("Allowed values for output attribute are 'showinpane','replaceselection','reloaddocument'")); + return false; + } + return true; +} + ExternalTool * ExternalTool::createFromXml(const QByteArray &xml, QString *errorMessage, const QString &locale) { int descriptionLocale = -1; @@ -202,17 +228,12 @@ ExternalTool * ExternalTool::createFromXml(const QByteArray &xml, QString *error reader.raiseError(QLatin1String("<order> element requires non-negative integer value")); } else if (reader.name() == QLatin1String(kExecutable)) { if (reader.attributes().hasAttribute(QLatin1String(kOutput))) { - const QString output = reader.attributes().value(QLatin1String(kOutput)).toString(); - if (output == QLatin1String(kOutputShowInPane)) { - tool->m_outputHandling = ExternalTool::ShowInPane; - } else if (output == QLatin1String(kOutputReplaceSelection)) { - tool->m_outputHandling = ExternalTool::ReplaceSelection; - } else if (output == QLatin1String(kOutputReloadDocument)) { - tool->m_outputHandling = ExternalTool::ReloadDocument; - } else { - reader.raiseError(QLatin1String("Allowed values for output attribute are 'showinpane','replaceselection','reloaddocument'")); + if (!parseOutputAttribute(QLatin1String(kOutput), &reader, &tool->m_outputHandling)) + break; + } + if (reader.attributes().hasAttribute(QLatin1String(kError))) { + if (!parseOutputAttribute(QLatin1String(kError), &reader, &tool->m_errorHandling)) break; - } } while (reader.readNextStartElement()) { if (reader.name() == QLatin1String(kPath)) { @@ -312,21 +333,21 @@ void ExternalToolRunner::run() void ExternalToolRunner::finished() { // TODO handle the ReplaceSelection and ReloadDocument flags - delete m_process; - m_process = 0; + m_process->deleteLater(); deleteLater(); } void ExternalToolRunner::error(QProcess::ProcessError error) { // TODO inform about errors - delete m_process; - m_process = 0; + m_process->deleteLater(); deleteLater(); } void ExternalToolRunner::readStandardOutput() { + if (m_tool->outputHandling() == ExternalTool::Ignore) + return; QByteArray data = m_process->readAllStandardOutput(); QString output = m_outputCodec->toUnicode(data.constData(), data.length(), &m_outputCodecState); // TODO handle the ReplaceSelection flag @@ -337,10 +358,12 @@ void ExternalToolRunner::readStandardOutput() void ExternalToolRunner::readStandardError() { + if (m_tool->errorHandling() == ExternalTool::Ignore) + return; QByteArray data = m_process->readAllStandardError(); QString output = m_outputCodec->toUnicode(data.constData(), data.length(), &m_errorCodecState); // TODO handle the ReplaceSelection flag - if (m_tool->outputHandling() == ExternalTool::ShowInPane) { + if (m_tool->errorHandling() == ExternalTool::ShowInPane) { ICore::instance()->messageManager()->printToOutputPane(output, true); } } diff --git a/src/plugins/coreplugin/externaltool.h b/src/plugins/coreplugin/externaltool.h index b5cbb1a2042..ffb1c8a491a 100644 --- a/src/plugins/coreplugin/externaltool.h +++ b/src/plugins/coreplugin/externaltool.h @@ -47,6 +47,7 @@ class ExternalTool : public QObject public: enum OutputHandling { + Ignore, ShowInPane, ReplaceSelection, ReloadDocument @@ -61,6 +62,7 @@ public: QString displayCategory() const; int order() const; OutputHandling outputHandling() const; + OutputHandling errorHandling() const; QStringList executables() const; QString arguments() const; @@ -78,6 +80,7 @@ private: QString m_arguments; QString m_workingDirectory; OutputHandling m_outputHandling; + OutputHandling m_errorHandling; }; class ExternalToolRunner : public QObject diff --git a/tests/auto/externaltool/externaltool.pro b/tests/auto/externaltool/externaltool.pro index 5698716f169..75544ec5975 100644 --- a/tests/auto/externaltool/externaltool.pro +++ b/tests/auto/externaltool/externaltool.pro @@ -1,4 +1,10 @@ +IDE_BUILD_TREE = $$OUT_PWD/../../../ include(../qttest.pri) +include(../../../src/plugins/coreplugin/coreplugin.pri) +LIBS *= -L$$IDE_PLUGIN_PATH/Nokia +INCLUDEPATH *= $$IDE_SOURCE_TREE/src/plugins/coreplugin +INCLUDEPATH *= $$IDE_BUILD_TREE/src/plugins/coreplugin +DEPENDPATH *= $$IDE_BUILD_TREE/src/plugins/coreplugin SOURCES += tst_externaltooltest.cpp \ $$IDE_SOURCE_TREE/src/plugins/coreplugin/externaltool.cpp diff --git a/tests/auto/externaltool/tst_externaltooltest.cpp b/tests/auto/externaltool/tst_externaltooltest.cpp index 8ab64332603..72f06982643 100644 --- a/tests/auto/externaltool/tst_externaltooltest.cpp +++ b/tests/auto/externaltool/tst_externaltooltest.cpp @@ -15,7 +15,7 @@ static const char * const TEST_XML1 = " <category>Linguist</category>" " <category xml:lang=\"de\">Linguist</category>" " <order>1</order>" -" <executable>" +" <executable error=\"ignore\">" " <path>%{QT_INSTALL_BINS}/lupdate</path>" " <path>lupdate</path>" " <arguments>%{CurrentProjectFilePath}</arguments>" @@ -101,6 +101,7 @@ void ExternaltoolTest::testRead1() QCOMPARE(tool->arguments(), QString::fromLatin1("%{CurrentProjectFilePath}")); QCOMPARE(tool->workingDirectory(), QString::fromLatin1("%{CurrentProjectPath}")); QCOMPARE(tool->outputHandling(), ExternalTool::ShowInPane); + QCOMPARE(tool->errorHandling(), ExternalTool::Ignore); delete tool; } @@ -120,6 +121,7 @@ void ExternaltoolTest::testRead2() QCOMPARE(tool->arguments(), QString::fromLatin1("%{CurrentSelectionFilePath}")); QCOMPARE(tool->workingDirectory(), QString::fromLatin1("%{CurrentPath}")); QCOMPARE(tool->outputHandling(), ExternalTool::ReplaceSelection); + QCOMPARE(tool->errorHandling(), ExternalTool::ShowInPane); delete tool; } @@ -139,6 +141,7 @@ void ExternaltoolTest::testRead3() QVERIFY(tool->arguments().startsWith(QLatin1String("-geom %{"))); QCOMPARE(tool->workingDirectory(), QString::fromLatin1("%{CurrentPath}")); QCOMPARE(tool->outputHandling(), ExternalTool::ReloadDocument); + QCOMPARE(tool->errorHandling(), ExternalTool::ShowInPane); delete tool; } -- GitLab