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);
+    }
 };
 
 }