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)