comparison vamp-client/qt/ProcessQtTransport.h @ 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 590b1a1fd955
children 3398554568c7
comparison
equal deleted inserted replaced
281:c0b29d2af155 282:ce42f0bebae3
72 m_completenessChecker(0), 72 m_completenessChecker(0),
73 m_crashed(false) { 73 m_crashed(false) {
74 74
75 m_process = new QProcess(); 75 m_process = new QProcess();
76 m_process->setReadChannel(QProcess::StandardOutput); 76 m_process->setReadChannel(QProcess::StandardOutput);
77 m_process->setProcessChannelMode(QProcess::ForwardedErrorChannel); 77
78 if (m_logger) {
79 m_process->setProcessChannelMode(QProcess::SeparateChannels);
80 } else {
81 m_process->setProcessChannelMode(QProcess::ForwardedErrorChannel);
82 }
78 83
79 m_process->start(QString::fromStdString(processName), 84 m_process->start(QString::fromStdString(processName),
80 { QString::fromStdString(formatArg) }); 85 { QString::fromStdString(formatArg) });
81 86
82 if (!m_process->waitForStarted()) { 87 if (!m_process->waitForStarted()) {
89 } else { 94 } else {
90 QString e = QString("%1").arg(err); 95 QString e = QString("%1").arg(err);
91 log("Server process " + processName + 96 log("Server process " + processName +
92 " failed on startup with error code " + e.toStdString()); 97 " failed on startup with error code " + e.toStdString());
93 } 98 }
99 logServerErrors();
94 delete m_process; 100 delete m_process;
95 m_process = nullptr; 101 m_process = nullptr;
96 } 102 }
97 } 103 }
98 104
99 if (m_process) { 105 if (m_process) {
100 log("Server process " + processName + " started OK"); 106 log("Server process " + processName + " started OK");
107 logServerErrors();
101 } 108 }
102 } 109 }
103 110
104 ~ProcessQtTransport() { 111 ~ProcessQtTransport() {
105 if (m_process) { 112 if (m_process) {
108 m_process->waitForFinished(200); 115 m_process->waitForFinished(200);
109 m_process->close(); 116 m_process->close();
110 m_process->waitForFinished(); 117 m_process->waitForFinished();
111 log("Server process exited normally"); 118 log("Server process exited normally");
112 } 119 }
120 logServerErrors();
113 delete m_process; 121 delete m_process;
114 } 122 }
115 } 123 }
116 124
117 void 125 void
180 if (!byteCount) { 188 if (!byteCount) {
181 189
182 if (responseStarted) { 190 if (responseStarted) {
183 if (duringResponseTimeout > 0 && ms > duringResponseTimeout) { 191 if (duringResponseTimeout > 0 && ms > duringResponseTimeout) {
184 log("Server timed out during response"); 192 log("Server timed out during response");
193 logServerErrors();
185 m_crashed = true; 194 m_crashed = true;
186 throw RequestTimedOut(); 195 throw RequestTimedOut();
187 } 196 }
188 } else { 197 } else {
189 if (beforeResponseTimeout > 0 && ms > beforeResponseTimeout) { 198 if (beforeResponseTimeout > 0 && ms > beforeResponseTimeout) {
190 log("Server timed out before response"); 199 log("Server timed out before response");
200 logServerErrors();
191 m_crashed = true; 201 m_crashed = true;
192 throw RequestTimedOut(); 202 throw RequestTimedOut();
193 } 203 }
194 } 204 }
195 205
237 } 247 }
238 (void)t.restart(); // reset timeout when we read anything 248 (void)t.restart(); // reset timeout when we read anything
239 } 249 }
240 } 250 }
241 251
252 logServerErrors();
242 return buffer; 253 return buffer;
243 } 254 }
244 255
245 private: 256 private:
246 LogCallback *m_logger; 257 LogCallback *m_logger;
251 262
252 void log(std::string message) const { 263 void log(std::string message) const {
253 if (m_logger) m_logger->log(message); 264 if (m_logger) m_logger->log(message);
254 else std::cerr << message << std::endl; 265 else std::cerr << message << std::endl;
255 } 266 }
267
268 void logServerErrors() const {
269 if (!m_logger || !m_process) return;
270
271 m_process->setReadChannel(QProcess::StandardError);
272
273 qint64 byteCount = m_process->bytesAvailable();
274 if (byteCount == 0) {
275 m_process->setReadChannel(QProcess::StandardOutput);
276 return;
277 }
278
279 QByteArray buffer = m_process->read(byteCount);
280 std::string str(buffer.toStdString());
281 if (str.size() > 0 && str[str.size()-1] == '\n') {
282 str.resize(str.size()-1);
283 }
284 m_logger->log("Piper server stderr output follows:\n" + str);
285 m_logger->log("Piper server stderr output ends");
286
287 m_process->setReadChannel(QProcess::StandardOutput);
288 }
256 }; 289 };
257 290
258 } 291 }
259 } 292 }
260 293