fix: handle partial lines in LoggedProcess

Fixes PrismLauncher/PrismLauncher#930

Co-authored-by: flow <flowlnlnln@gmail.com>
Signed-off-by: Sefa Eyeoglu <contact@scrumplex.net>
This commit is contained in:
Sefa Eyeoglu 2023-03-21 18:28:32 +01:00
parent 6dcf34acdc
commit 44bf32e729
No known key found for this signature in database
GPG Key ID: E13DFD4B47127951

View File

@ -1,7 +1,8 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
/* /*
* PolyMC - Minecraft Launcher * Prism Launcher - Minecraft Launcher
* Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net> * Copyright (C) 2022,2023 Sefa Eyeoglu <contact@scrumplex.net>
* Copyright (c) 2023 flowln <flowlnlnln@gmail.com>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -60,14 +61,26 @@ LoggedProcess::~LoggedProcess()
} }
} }
static QString m_leftover_line;
QStringList reprocess(const QByteArray& data, QTextDecoder& decoder) QStringList reprocess(const QByteArray& data, QTextDecoder& decoder)
{ {
auto str = decoder.toUnicode(data); auto str = decoder.toUnicode(data);
// FIXME: Flush this out when process exits
if (!m_leftover_line.isEmpty()) {
str.prepend(m_leftover_line);
m_leftover_line = "";
}
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
auto lines = str.remove(QChar::CarriageReturn).split(QChar::LineFeed, QString::SkipEmptyParts); auto lines = str.remove(QChar::CarriageReturn).split(QChar::LineFeed, QString::SkipEmptyParts);
#else #else
auto lines = str.remove(QChar::CarriageReturn).split(QChar::LineFeed, Qt::SkipEmptyParts); auto lines = str.remove(QChar::CarriageReturn).split(QChar::LineFeed, Qt::SkipEmptyParts);
#endif #endif
if (!str.endsWith(QChar::LineFeed))
m_leftover_line = lines.takeLast();
return lines; return lines;
} }