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