diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vamp-client/ProcessQtTransport.h	Thu Oct 13 14:10:55 2016 +0100
@@ -0,0 +1,96 @@
+
+#ifndef PIPER_PROCESS_QT_TRANSPORT_H
+#define PIPER_PROCESS_QT_TRANSPORT_H
+
+#include "SynchronousTransport.h"
+
+#include <QProcess>
+#include <QString>
+
+#include <iostream>
+
+namespace piper {
+namespace vampclient {
+
+class ProcessQtTransport : public SynchronousTransport
+{
+public:
+    ProcessQtTransport(QString processName) :
+        m_completenessChecker(0) {
+        m_process = new QProcess();
+        m_process->setReadChannel(QProcess::StandardOutput);
+        m_process->setProcessChannelMode(QProcess::ForwardedErrorChannel);
+        m_process->start(processName);
+        if (!m_process->waitForStarted()) {
+            std::cerr << "server failed to start" << std::endl;
+            delete m_process;
+            m_process = nullptr;
+        }
+    }
+
+    ~ProcessQtTransport() {
+        if (m_process) {
+            if (m_process->state() != QProcess::NotRunning) {
+		m_process->closeWriteChannel();
+                m_process->waitForFinished(200);
+                m_process->close();
+                m_process->waitForFinished();
+                std::cerr << "server exited" << std::endl;
+            }
+            delete m_process;
+        }
+    }
+
+    void
+    setCompletenessChecker(MessageCompletenessChecker *checker) {
+        //!!! ownership?
+        m_completenessChecker = checker;
+    }
+    
+    bool
+    isOK() const override {
+        return m_process != nullptr;
+    }
+    
+    std::vector<char>
+    call(const char *ptr, size_t size) override {
+
+        if (!m_completenessChecker) {
+            throw std::logic_error("No completeness checker set on transport");
+        }
+        
+        m_process->write(ptr, size);
+        
+        std::vector<char> buffer;
+        bool complete = false;
+        
+        while (!complete) {
+
+            m_process->waitForReadyRead(1000);
+            qint64 byteCount = m_process->bytesAvailable();
+
+            if (!byteCount) {
+                if (m_process->state() == QProcess::NotRunning) {
+                    std::cerr << "ERROR: Subprocess exited: Load failed" << std::endl;
+                    throw std::runtime_error("Piper server exited unexpectedly");
+                }
+            } else {
+                size_t formerSize = buffer.size();
+                buffer.resize(formerSize + byteCount);
+                m_process->read(buffer.data() + formerSize, byteCount);
+                complete = m_completenessChecker->isComplete(buffer);
+            }
+        }
+
+        return buffer;
+    }
+    
+private:
+    MessageCompletenessChecker *m_completenessChecker; //!!! I don't own this (currently)
+    QProcess *m_process; // I own this
+};
+
+}
+}
+
+#endif