Mercurial > hg > piper-cpp
comparison vamp-client/PiperQProcessTransport.h @ 93:fbce91785d35
Having a class called PipedXX is too confusing with all the Piper classes; give up and rename it
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Thu, 13 Oct 2016 12:07:41 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
92:21f8af53eaf0 | 93:fbce91785d35 |
---|---|
1 | |
2 #ifndef PIPER_QPROCESS_TRANSPORT_H | |
3 #define PIPER_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 PiperQProcessTransport : public SynchronousTransport | |
15 { | |
16 public: | |
17 PiperQProcessTransport(QString processName) : | |
18 m_completenessChecker(0) { | |
19 m_process = new QProcess(); | |
20 m_process->setReadChannel(QProcess::StandardOutput); | |
21 m_process->setProcessChannelMode(QProcess::ForwardedErrorChannel); | |
22 m_process->start(processName); | |
23 if (!m_process->waitForStarted()) { | |
24 std::cerr << "server failed to start" << std::endl; | |
25 delete m_process; | |
26 m_process = nullptr; | |
27 } | |
28 } | |
29 | |
30 ~PiperQProcessTransport() { | |
31 if (m_process) { | |
32 if (m_process->state() != QProcess::NotRunning) { | |
33 m_process->closeWriteChannel(); | |
34 m_process->waitForFinished(200); | |
35 m_process->close(); | |
36 m_process->waitForFinished(); | |
37 std::cerr << "server exited" << std::endl; | |
38 } | |
39 delete m_process; | |
40 } | |
41 } | |
42 | |
43 void | |
44 setCompletenessChecker(MessageCompletenessChecker *checker) { | |
45 //!!! ownership? | |
46 m_completenessChecker = checker; | |
47 } | |
48 | |
49 bool | |
50 isOK() const override { | |
51 return m_process != nullptr; | |
52 } | |
53 | |
54 std::vector<char> | |
55 call(const char *ptr, size_t size) override { | |
56 | |
57 if (!m_completenessChecker) { | |
58 throw std::logic_error("No completeness checker set on transport"); | |
59 } | |
60 | |
61 m_process->write(ptr, size); | |
62 | |
63 std::vector<char> buffer; | |
64 bool complete = false; | |
65 | |
66 while (!complete) { | |
67 | |
68 m_process->waitForReadyRead(1000); | |
69 qint64 byteCount = m_process->bytesAvailable(); | |
70 | |
71 if (!byteCount) { | |
72 if (m_process->state() == QProcess::NotRunning) { | |
73 std::cerr << "ERROR: Subprocess exited: Load failed" << std::endl; | |
74 throw std::runtime_error("Piper server exited unexpectedly"); | |
75 } | |
76 } else { | |
77 size_t formerSize = buffer.size(); | |
78 buffer.resize(formerSize + byteCount); | |
79 m_process->read(buffer.data() + formerSize, byteCount); | |
80 complete = m_completenessChecker->isComplete(buffer); | |
81 } | |
82 } | |
83 | |
84 return buffer; | |
85 } | |
86 | |
87 private: | |
88 MessageCompletenessChecker *m_completenessChecker; //!!! I don't own this (currently) | |
89 QProcess *m_process; // I own this | |
90 }; | |
91 | |
92 } | |
93 | |
94 #endif |