annotate 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
rev   line source
c@90 1
c@90 2 #ifndef PIPER_PIPED_QPROCESS_TRANSPORT_H
c@90 3 #define PIPER_PIPED_QPROCESS_TRANSPORT_H
c@90 4
c@90 5 #include "SynchronousTransport.h"
c@90 6
c@90 7 #include <QProcess>
c@90 8 #include <QString>
c@90 9
c@90 10 #include <iostream>
c@90 11
c@90 12 namespace piper { //!!! change
c@90 13
c@90 14 class PipedQProcessTransport : public SynchronousTransport
c@90 15 {
c@90 16 public:
c@92 17 PipedQProcessTransport(QString processName) :
c@92 18 m_completenessChecker(0) {
c@90 19 m_process = new QProcess();
c@90 20 m_process->setReadChannel(QProcess::StandardOutput);
c@90 21 m_process->setProcessChannelMode(QProcess::ForwardedErrorChannel);
c@90 22 m_process->start(processName);
c@90 23 if (!m_process->waitForStarted()) {
c@90 24 std::cerr << "server failed to start" << std::endl;
c@90 25 delete m_process;
c@90 26 m_process = nullptr;
c@90 27 }
c@90 28 }
c@90 29
c@90 30 ~PipedQProcessTransport() {
c@90 31 if (m_process) {
c@90 32 if (m_process->state() != QProcess::NotRunning) {
c@90 33 m_process->closeWriteChannel();
c@90 34 m_process->waitForFinished(200);
c@90 35 m_process->close();
c@90 36 m_process->waitForFinished();
c@90 37 std::cerr << "server exited" << std::endl;
c@90 38 }
c@90 39 delete m_process;
c@90 40 }
c@90 41 }
c@90 42
c@92 43 void
c@92 44 setCompletenessChecker(MessageCompletenessChecker *checker) {
c@92 45 //!!! ownership?
c@92 46 m_completenessChecker = checker;
c@92 47 }
c@92 48
c@92 49 bool
c@92 50 isOK() const override {
c@90 51 return m_process != nullptr;
c@90 52 }
c@90 53
c@90 54 std::vector<char>
c@90 55 call(const char *ptr, size_t size) override {
c@90 56
c@92 57 if (!m_completenessChecker) {
c@92 58 throw std::logic_error("No completeness checker set on transport");
c@92 59 }
c@92 60
c@90 61 m_process->write(ptr, size);
c@90 62
c@90 63 std::vector<char> buffer;
c@90 64 bool complete = false;
c@90 65
c@90 66 while (!complete) {
c@90 67
c@90 68 m_process->waitForReadyRead(1000);
c@90 69 qint64 byteCount = m_process->bytesAvailable();
c@90 70
c@92 71 if (!byteCount) {
c@90 72 if (m_process->state() == QProcess::NotRunning) {
c@90 73 std::cerr << "ERROR: Subprocess exited: Load failed" << std::endl;
c@90 74 throw std::runtime_error("Piper server exited unexpectedly");
c@90 75 }
c@90 76 } else {
c@90 77 size_t formerSize = buffer.size();
c@90 78 buffer.resize(formerSize + byteCount);
c@90 79 m_process->read(buffer.data() + formerSize, byteCount);
c@90 80 complete = m_completenessChecker->isComplete(buffer);
c@90 81 }
c@90 82 }
c@92 83
c@90 84 return buffer;
c@90 85 }
c@90 86
c@90 87 private:
c@90 88 MessageCompletenessChecker *m_completenessChecker; //!!! I don't own this (currently)
c@90 89 QProcess *m_process; // I own this
c@90 90 };
c@90 91
c@90 92 }
c@90 93
c@90 94 #endif