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