Mercurial > hg > piper-cpp
comparison vamp-client/ProcessQtTransport.h @ 94:a660dca988f8
More renaming
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Thu, 13 Oct 2016 14:10:55 +0100 |
parents | |
children | 427c4c725085 |
comparison
equal
deleted
inserted
replaced
93:fbce91785d35 | 94:a660dca988f8 |
---|---|
1 | |
2 #ifndef PIPER_PROCESS_QT_TRANSPORT_H | |
3 #define PIPER_PROCESS_QT_TRANSPORT_H | |
4 | |
5 #include "SynchronousTransport.h" | |
6 | |
7 #include <QProcess> | |
8 #include <QString> | |
9 | |
10 #include <iostream> | |
11 | |
12 namespace piper { | |
13 namespace vampclient { | |
14 | |
15 class ProcessQtTransport : public SynchronousTransport | |
16 { | |
17 public: | |
18 ProcessQtTransport(QString processName) : | |
19 m_completenessChecker(0) { | |
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 ~ProcessQtTransport() { | |
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 void | |
45 setCompletenessChecker(MessageCompletenessChecker *checker) { | |
46 //!!! ownership? | |
47 m_completenessChecker = checker; | |
48 } | |
49 | |
50 bool | |
51 isOK() const override { | |
52 return m_process != nullptr; | |
53 } | |
54 | |
55 std::vector<char> | |
56 call(const char *ptr, size_t size) override { | |
57 | |
58 if (!m_completenessChecker) { | |
59 throw std::logic_error("No completeness checker set on transport"); | |
60 } | |
61 | |
62 m_process->write(ptr, size); | |
63 | |
64 std::vector<char> buffer; | |
65 bool complete = false; | |
66 | |
67 while (!complete) { | |
68 | |
69 m_process->waitForReadyRead(1000); | |
70 qint64 byteCount = m_process->bytesAvailable(); | |
71 | |
72 if (!byteCount) { | |
73 if (m_process->state() == QProcess::NotRunning) { | |
74 std::cerr << "ERROR: Subprocess exited: Load failed" << std::endl; | |
75 throw std::runtime_error("Piper server exited unexpectedly"); | |
76 } | |
77 } else { | |
78 size_t formerSize = buffer.size(); | |
79 buffer.resize(formerSize + byteCount); | |
80 m_process->read(buffer.data() + formerSize, byteCount); | |
81 complete = m_completenessChecker->isComplete(buffer); | |
82 } | |
83 } | |
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 | |
96 #endif |