From c4a7d1647879176c2a5849eb55846e383078d867 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Sat, 24 May 2025 02:39:01 -0700 Subject: [PATCH] io/process: emit read for data remaining in buffer on exit --- src/io/datastream.cpp | 4 ++++ src/io/datastream.hpp | 2 ++ src/io/process.cpp | 2 ++ 3 files changed, 8 insertions(+) diff --git a/src/io/datastream.cpp b/src/io/datastream.cpp index c6559215..b30b0ac3 100644 --- a/src/io/datastream.cpp +++ b/src/io/datastream.cpp @@ -98,6 +98,10 @@ void SplitParser::parseBytes(QByteArray& incoming, QByteArray& buffer) { } } +void SplitParser::streamEnded(QByteArray& buffer) { + if (!buffer.isEmpty()) emit this->read(QString(buffer)); +} + QString SplitParser::splitMarker() const { return this->mSplitMarker; } void SplitParser::setSplitMarker(QString marker) { diff --git a/src/io/datastream.hpp b/src/io/datastream.hpp index b30800ac..57ddd658 100644 --- a/src/io/datastream.hpp +++ b/src/io/datastream.hpp @@ -54,6 +54,7 @@ public: // the buffer will be sent in both slots if there is data remaining from a previous parser virtual void parseBytes(QByteArray& incoming, QByteArray& buffer) = 0; + virtual void streamEnded(QByteArray& /*buffer*/) {}; signals: /// Emitted when data is read from the stream. @@ -75,6 +76,7 @@ public: explicit SplitParser(QObject* parent = nullptr): DataStreamParser(parent) {} void parseBytes(QByteArray& incoming, QByteArray& buffer) override; + void streamEnded(QByteArray& buffer) override; [[nodiscard]] QString splitMarker() const; void setSplitMarker(QString marker); diff --git a/src/io/process.cpp b/src/io/process.cpp index 6b1ab5d6..a532ac8f 100644 --- a/src/io/process.cpp +++ b/src/io/process.cpp @@ -254,6 +254,8 @@ void Process::onStarted() { void Process::onFinished(qint32 exitCode, QProcess::ExitStatus exitStatus) { this->process->deleteLater(); this->process = nullptr; + if (this->mStdoutParser) this->mStdoutParser->streamEnded(this->stdoutBuffer); + if (this->mStderrParser) this->mStderrParser->streamEnded(this->stderrBuffer); this->stdoutBuffer.clear(); this->stderrBuffer.clear();