Mercurial > hg > piper-cpp
comparison vamp-client/PipedQProcessTransport.h @ 92:21f8af53eaf0
Reorganise some classes
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Thu, 13 Oct 2016 12:02:44 +0100 |
parents | 6429a99abcad |
children |
comparison
equal
deleted
inserted
replaced
91:c897c9a8daf1 | 92:21f8af53eaf0 |
---|---|
12 namespace piper { //!!! change | 12 namespace piper { //!!! change |
13 | 13 |
14 class PipedQProcessTransport : public SynchronousTransport | 14 class PipedQProcessTransport : public SynchronousTransport |
15 { | 15 { |
16 public: | 16 public: |
17 PipedQProcessTransport(QString processName, | 17 PipedQProcessTransport(QString processName) : |
18 MessageCompletenessChecker *checker) : //!!! ownership | 18 m_completenessChecker(0) { |
19 m_completenessChecker(checker) { | |
20 m_process = new QProcess(); | 19 m_process = new QProcess(); |
21 m_process->setReadChannel(QProcess::StandardOutput); | 20 m_process->setReadChannel(QProcess::StandardOutput); |
22 m_process->setProcessChannelMode(QProcess::ForwardedErrorChannel); | 21 m_process->setProcessChannelMode(QProcess::ForwardedErrorChannel); |
23 m_process->start(processName); | 22 m_process->start(processName); |
24 if (!m_process->waitForStarted()) { | 23 if (!m_process->waitForStarted()) { |
39 } | 38 } |
40 delete m_process; | 39 delete m_process; |
41 } | 40 } |
42 } | 41 } |
43 | 42 |
44 bool isOK() const override { | 43 void |
44 setCompletenessChecker(MessageCompletenessChecker *checker) { | |
45 //!!! ownership? | |
46 m_completenessChecker = checker; | |
47 } | |
48 | |
49 bool | |
50 isOK() const override { | |
45 return m_process != nullptr; | 51 return m_process != nullptr; |
46 } | 52 } |
47 | 53 |
48 std::vector<char> | 54 std::vector<char> |
49 call(const char *ptr, size_t size) override { | 55 call(const char *ptr, size_t size) override { |
50 | 56 |
57 if (!m_completenessChecker) { | |
58 throw std::logic_error("No completeness checker set on transport"); | |
59 } | |
60 | |
51 m_process->write(ptr, size); | 61 m_process->write(ptr, size); |
52 | 62 |
53 std::vector<char> buffer; | 63 std::vector<char> buffer; |
54 size_t wordSize = sizeof(capnp::word); | |
55 bool complete = false; | 64 bool complete = false; |
56 | 65 |
57 while (!complete) { | 66 while (!complete) { |
58 | 67 |
59 m_process->waitForReadyRead(1000); | 68 m_process->waitForReadyRead(1000); |
60 qint64 byteCount = m_process->bytesAvailable(); | 69 qint64 byteCount = m_process->bytesAvailable(); |
61 qint64 wordCount = byteCount / wordSize; | |
62 | 70 |
63 if (!wordCount) { | 71 if (!byteCount) { |
64 if (m_process->state() == QProcess::NotRunning) { | 72 if (m_process->state() == QProcess::NotRunning) { |
65 std::cerr << "ERROR: Subprocess exited: Load failed" << std::endl; | 73 std::cerr << "ERROR: Subprocess exited: Load failed" << std::endl; |
66 throw std::runtime_error("Piper server exited unexpectedly"); | 74 throw std::runtime_error("Piper server exited unexpectedly"); |
67 } | 75 } |
68 } else { | 76 } else { |
69 // only read whole words | |
70 byteCount = wordCount * wordSize; | |
71 size_t formerSize = buffer.size(); | 77 size_t formerSize = buffer.size(); |
72 buffer.resize(formerSize + byteCount); | 78 buffer.resize(formerSize + byteCount); |
73 m_process->read(buffer.data() + formerSize, byteCount); | 79 m_process->read(buffer.data() + formerSize, byteCount); |
74 complete = m_completenessChecker->isComplete(buffer); | 80 complete = m_completenessChecker->isComplete(buffer); |
75 } | 81 } |
76 } | 82 } |
77 /* | 83 |
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; | 84 return buffer; |
86 } | 85 } |
87 | 86 |
88 private: | 87 private: |
89 MessageCompletenessChecker *m_completenessChecker; //!!! I don't own this (currently) | 88 MessageCompletenessChecker *m_completenessChecker; //!!! I don't own this (currently) |