Mercurial > hg > piper-cpp
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 |