From f0a2185e2fcac36f222ee758daff2481d021cc0c Mon Sep 17 00:00:00 2001 From: Levi Neely <141506390+lneely@users.noreply.github.com> Date: Sat, 1 Aug 2026 20:18:26 +0200 Subject: [PATCH] fix(gui): trailing tabs stripped by trimmed() dropping empty sessions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refreshSessions() and onEventReadyRead() called .trimmed() on the full session/idx output, which stripped trailing tab characters from the last line. An empty session line ("testsession2\t\t\t\t\t") became just "testsession2" — a single field that failed the size>=2 check and was silently dropped from the session list. --- gui/ollie9pclient.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/gui/ollie9pclient.cpp b/gui/ollie9pclient.cpp index 383f6b8..9bc6fe7 100644 --- a/gui/ollie9pclient.cpp +++ b/gui/ollie9pclient.cpp @@ -87,13 +87,15 @@ void Ollie9pClient::setActiveSessionId(const QString &id) void Ollie9pClient::refreshSessions() { QByteArray out = run9p({"read", "session/idx"}); - QString raw = QString::fromUtf8(out).trimmed(); - qDebug() << "refreshSessions: output length =" << out.length() << "content:" << raw.left(200); + // Don't trim the whole output — trailing tabs are significant fields + QString raw = QString::fromUtf8(out); m_sessions.clear(); if (!raw.isEmpty()) { - for (const QString &line : raw.split('\n')) { - QStringList parts = line.split('\t'); + for (const QString &line : raw.split('\n', Qt::SkipEmptyParts)) { + QString trimmed = line.trimmed(); + if (trimmed.isEmpty()) continue; + QStringList parts = trimmed.split('\t'); if (parts.size() >= 2) { QVariantMap session; session["id"] = parts[0]; @@ -104,7 +106,6 @@ void Ollie9pClient::refreshSessions() } } } - qDebug() << "refreshSessions: m_sessions count =" << m_sessions.size(); emit sessionsChanged(); // Auto-select first session if none active @@ -540,13 +541,15 @@ void Ollie9pClient::onEventReadyRead() { // eventwait returned the full session index — use it directly QByteArray data = m_eventProc->readAllStandardOutput(); - QString raw = QString::fromUtf8(data).trimmed(); - qDebug() << "onEventReadyRead: data length =" << data.length() << "content:" << raw.left(200); + // Don't trim the whole output — trailing tabs are significant fields + QString raw = QString::fromUtf8(data); m_sessions.clear(); if (!raw.isEmpty()) { - for (const QString &line : raw.split('\n')) { - QStringList parts = line.split('\t'); + for (const QString &line : raw.split('\n', Qt::SkipEmptyParts)) { + QString trimmed = line.trimmed(); + if (trimmed.isEmpty()) continue; + QStringList parts = trimmed.split('\t'); if (parts.size() >= 2) { QVariantMap session; session["id"] = parts[0]; @@ -557,7 +560,6 @@ void Ollie9pClient::onEventReadyRead() } } } - qDebug() << "onEventReadyRead: m_sessions count =" << m_sessions.size(); emit sessionsChanged(); // Auto-select first session if none active