Mercurial > hg > piper-cpp
changeset 282:ce42f0bebae3
Send any stderr output to the logger (if defined)
author | Chris Cannam <cannam@all-day-breakfast.com> |
---|---|
date | Fri, 11 Jan 2019 15:55:45 +0000 |
parents | c0b29d2af155 |
children | b0f0e257d8af |
files | vamp-client/SynchronousTransport.h vamp-client/qt/ProcessQtTransport.h |
diffstat | 2 files changed, 40 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/vamp-client/SynchronousTransport.h Fri Jan 11 15:55:04 2019 +0000 +++ b/vamp-client/SynchronousTransport.h Fri Jan 11 15:55:45 2019 +0000 @@ -56,6 +56,12 @@ { public: virtual ~LogCallback() { } + + /** + * Log a message. The logger should terminate the message + * appropriately after logging; the caller is not expected to end + * it with \n or similar. + */ virtual void log(std::string) const = 0; };
--- a/vamp-client/qt/ProcessQtTransport.h Fri Jan 11 15:55:04 2019 +0000 +++ b/vamp-client/qt/ProcessQtTransport.h Fri Jan 11 15:55:45 2019 +0000 @@ -74,7 +74,12 @@ m_process = new QProcess(); m_process->setReadChannel(QProcess::StandardOutput); - m_process->setProcessChannelMode(QProcess::ForwardedErrorChannel); + + if (m_logger) { + m_process->setProcessChannelMode(QProcess::SeparateChannels); + } else { + m_process->setProcessChannelMode(QProcess::ForwardedErrorChannel); + } m_process->start(QString::fromStdString(processName), { QString::fromStdString(formatArg) }); @@ -91,6 +96,7 @@ log("Server process " + processName + " failed on startup with error code " + e.toStdString()); } + logServerErrors(); delete m_process; m_process = nullptr; } @@ -98,6 +104,7 @@ if (m_process) { log("Server process " + processName + " started OK"); + logServerErrors(); } } @@ -110,6 +117,7 @@ m_process->waitForFinished(); log("Server process exited normally"); } + logServerErrors(); delete m_process; } } @@ -182,12 +190,14 @@ if (responseStarted) { if (duringResponseTimeout > 0 && ms > duringResponseTimeout) { log("Server timed out during response"); + logServerErrors(); m_crashed = true; throw RequestTimedOut(); } } else { if (beforeResponseTimeout > 0 && ms > beforeResponseTimeout) { log("Server timed out before response"); + logServerErrors(); m_crashed = true; throw RequestTimedOut(); } @@ -239,6 +249,7 @@ } } + logServerErrors(); return buffer; } @@ -253,6 +264,28 @@ if (m_logger) m_logger->log(message); else std::cerr << message << std::endl; } + + void logServerErrors() const { + if (!m_logger || !m_process) return; + + m_process->setReadChannel(QProcess::StandardError); + + qint64 byteCount = m_process->bytesAvailable(); + if (byteCount == 0) { + m_process->setReadChannel(QProcess::StandardOutput); + return; + } + + QByteArray buffer = m_process->read(byteCount); + std::string str(buffer.toStdString()); + if (str.size() > 0 && str[str.size()-1] == '\n') { + str.resize(str.size()-1); + } + m_logger->log("Piper server stderr output follows:\n" + str); + m_logger->log("Piper server stderr output ends"); + + m_process->setReadChannel(QProcess::StandardOutput); + } }; }