comparison vamp-client/PipedQProcessTransport.h @ 90:6429a99abcad

Split out classes
author Chris Cannam <c.cannam@qmul.ac.uk>
date Thu, 13 Oct 2016 10:17:59 +0100
parents
children 21f8af53eaf0
comparison
equal deleted inserted replaced
89:03ed2e0a6c8f 90:6429a99abcad
1
2 #ifndef PIPER_PIPED_QPROCESS_TRANSPORT_H
3 #define PIPER_PIPED_QPROCESS_TRANSPORT_H
4
5 #include "SynchronousTransport.h"
6
7 #include <QProcess>
8 #include <QString>
9
10 #include <iostream>
11
12 namespace piper { //!!! change
13
14 class PipedQProcessTransport : public SynchronousTransport
15 {
16 public:
17 PipedQProcessTransport(QString processName,
18 MessageCompletenessChecker *checker) : //!!! ownership
19 m_completenessChecker(checker) {
20 m_process = new QProcess();
21 m_process->setReadChannel(QProcess::StandardOutput);
22 m_process->setProcessChannelMode(QProcess::ForwardedErrorChannel);
23 m_process->start(processName);
24 if (!m_process->waitForStarted()) {
25 std::cerr << "server failed to start" << std::endl;
26 delete m_process;
27 m_process = nullptr;
28 }
29 }
30
31 ~PipedQProcessTransport() {
32 if (m_process) {
33 if (m_process->state() != QProcess::NotRunning) {
34 m_process->closeWriteChannel();
35 m_process->waitForFinished(200);
36 m_process->close();
37 m_process->waitForFinished();
38 std::cerr << "server exited" << std::endl;
39 }
40 delete m_process;
41 }
42 }
43
44 bool isOK() const override {
45 return m_process != nullptr;
46 }
47
48 std::vector<char>
49 call(const char *ptr, size_t size) override {
50
51 m_process->write(ptr, size);
52
53 std::vector<char> buffer;
54 size_t wordSize = sizeof(capnp::word);
55 bool complete = false;
56
57 while (!complete) {
58
59 m_process->waitForReadyRead(1000);
60 qint64 byteCount = m_process->bytesAvailable();
61 qint64 wordCount = byteCount / wordSize;
62
63 if (!wordCount) {
64 if (m_process->state() == QProcess::NotRunning) {
65 std::cerr << "ERROR: Subprocess exited: Load failed" << std::endl;
66 throw std::runtime_error("Piper server exited unexpectedly");
67 }
68 } else {
69 // only read whole words
70 byteCount = wordCount * wordSize;
71 size_t formerSize = buffer.size();
72 buffer.resize(formerSize + byteCount);
73 m_process->read(buffer.data() + formerSize, byteCount);
74 complete = m_completenessChecker->isComplete(buffer);
75 }
76 }
77 /*
78 cerr << "buffer = ";
79 for (int i = 0; i < buffer.size(); ++i) {
80 if (i % 16 == 0) cerr << "\n";
81 cerr << int(buffer[i]) << " ";
82 }
83 cerr << "\n";
84 */
85 return buffer;
86 }
87
88 private:
89 MessageCompletenessChecker *m_completenessChecker; //!!! I don't own this (currently)
90 QProcess *m_process; // I own this
91 };
92
93 }
94
95 #endif