From 2718e5ca9784f36cc131533d06da0851c7aecf00 Mon Sep 17 00:00:00 2001 From: Multica Agent Date: Mon, 24 Aug 2026 01:52:49 +0800 Subject: [PATCH] fix(data-transfer): use JSON serialization for add_result and transfer_content messages The send side serialized migration results and transfer progress using space-delimited fields (name + " " + success + " " + reason + ";"), but both name and reason are translated strings that contain spaces. The receive side split on " " with a strict size()==3 / size()==4 check, which discarded every entry, causing the receiver's completion list to be empty while the sender's was complete. Replace the space-delimited format with JSON (QJsonDocument) on both sides so field boundaries are unambiguous regardless of content: - add_result: sender builds a QJsonArray of {name, success, reason} objects; receiver parses the array and emits addResult per entry. - transfer_content: sender builds a single {type, content, progressbar, estimatedtime} object; receiver parses it (handling both single object and array) and emits transferContent. Log: PMS bug 246975 --- .../core/gui/transfer/resultdisplay.cpp | 12 +++++-- .../core/gui/transfer/resultdisplay.h | 3 +- .../core/gui/transfer/transferringwidget.cpp | 13 ++++++-- .../core/utils/transferworker.cpp | 33 +++++++++++++------ 4 files changed, 44 insertions(+), 17 deletions(-) diff --git a/src/plugins/data-transfer/core/gui/transfer/resultdisplay.cpp b/src/plugins/data-transfer/core/gui/transfer/resultdisplay.cpp index 8db67a77f..a56ade281 100644 --- a/src/plugins/data-transfer/core/gui/transfer/resultdisplay.cpp +++ b/src/plugins/data-transfer/core/gui/transfer/resultdisplay.cpp @@ -1,4 +1,6 @@ #include "resultdisplay.h" +#include +#include #include #include #include @@ -67,7 +69,8 @@ void ResultDisplayWidget::initUI() &ResultDisplayWidget::addResult); #ifdef linux connect(TransferHelper::instance(), &TransferHelper::transferFinished, this, [this] { - TransferHelper::instance()->sendMessage("add_result", processText); + TransferHelper::instance()->sendMessage( + "add_result", QString::fromUtf8(QJsonDocument(processText).toJson(QJsonDocument::Compact))); }); #endif } @@ -107,8 +110,11 @@ void ResultDisplayWidget::addResult(QString name, bool success, QString reason) setStatus(false); resultWindow->updateContent(name, reason, success); - QString res = success ? "true" : "false"; - processText.append(name + " " + res + " " + reason + ";"); + QJsonObject obj; + obj["name"] = name; + obj["success"] = success; + obj["reason"] = reason; + processText.append(obj); } void ResultDisplayWidget::clear() diff --git a/src/plugins/data-transfer/core/gui/transfer/resultdisplay.h b/src/plugins/data-transfer/core/gui/transfer/resultdisplay.h index c21ed2ade..8ed28d7dd 100644 --- a/src/plugins/data-transfer/core/gui/transfer/resultdisplay.h +++ b/src/plugins/data-transfer/core/gui/transfer/resultdisplay.h @@ -2,6 +2,7 @@ #define RESULTDISPLAYWIDGET_H #include +#include #include "../type_defines.h" class QTextBrowser; class QLabel; @@ -37,7 +38,7 @@ public slots: private: ResultWindow *resultWindow { nullptr }; - QString processText; + QJsonArray processText; QLabel *iconLabel { nullptr }; QLabel *titileLabel { nullptr }; QLabel *tiptextlabel { nullptr }; diff --git a/src/plugins/data-transfer/core/gui/transfer/transferringwidget.cpp b/src/plugins/data-transfer/core/gui/transfer/transferringwidget.cpp index a84483a86..94d6e9cef 100644 --- a/src/plugins/data-transfer/core/gui/transfer/transferringwidget.cpp +++ b/src/plugins/data-transfer/core/gui/transfer/transferringwidget.cpp @@ -2,6 +2,9 @@ #include "errorwidget.h" +#include +#include + #include #include #include @@ -202,9 +205,13 @@ void TransferringWidget::updateProcess(const QString &tpye, const QString &conte timeLabel->setText(QString(tr("Transfer will be completed in --"))); #ifdef linux //通知对方进程情况 - QString mes = tpye + " " + content + " " + QString::number(progressbar) + " " - + QString::number(estimatedtime) + ";"; - TransferHelper::instance()->sendMessage("transfer_content", mes); + QJsonObject obj; + obj["type"] = tpye; + obj["content"] = content; + obj["progressbar"] = progressbar; + obj["estimatedtime"] = estimatedtime; + TransferHelper::instance()->sendMessage( + "transfer_content", QString::fromUtf8(QJsonDocument(obj).toJson(QJsonDocument::Compact))); #endif } } diff --git a/src/plugins/data-transfer/core/utils/transferworker.cpp b/src/plugins/data-transfer/core/utils/transferworker.cpp index acfce1a6d..a225e868c 100644 --- a/src/plugins/data-transfer/core/utils/transferworker.cpp +++ b/src/plugins/data-transfer/core/utils/transferworker.cpp @@ -17,6 +17,9 @@ #include #include #include +#include +#include +#include #pragma execution_character_set("utf-8") TransferHandle::TransferHandle() @@ -350,11 +353,15 @@ void TransferHandle::handleMiscMessage(QString jsonmsg) if (miscJson.has_member("add_result")) { QString result = miscJson.get("add_result").as_c_str(); LOG << "add_result" << result.data(); - for (QString str : result.split(";")) { - auto res = str.split(" "); - if (res.size() != 3) - continue; - emit TransferHelper::instance()->addResult(res.at(0), res.at(1) == "true", res.at(2)); + QJsonDocument doc = QJsonDocument::fromJson(result.toUtf8()); + if (doc.isArray()) { + for (const QJsonValue &value : doc.array()) { + QJsonObject obj = value.toObject(); + emit TransferHelper::instance()->addResult( + obj.value("name").toString(), + obj.value("success").toBool(), + obj.value("reason").toString()); + } } emit TransferHelper::instance()->transferFinished(); } @@ -376,11 +383,17 @@ void TransferHandle::handleMiscMessage(QString jsonmsg) if (miscJson.has_member("transfer_content")) { QString result = miscJson.get("transfer_content").as_c_str(); - for (QString str : result.split(";")) { - auto res = str.split(" "); - if (res.size() != 4) - continue; - emit TransferHelper::instance()->transferContent(res.at(0), res.at(1), res.at(2).toInt(), res.at(3).toInt()); + QJsonDocument doc = QJsonDocument::fromJson(result.toUtf8()); + QJsonArray contents = doc.isArray() ? doc.array() : QJsonArray(); + if (doc.isObject()) + contents.append(doc.object()); + for (const QJsonValue &value : contents) { + QJsonObject obj = value.toObject(); + emit TransferHelper::instance()->transferContent( + obj.value("type").toString(), + obj.value("content").toString(), + obj.value("progressbar").toInt(), + obj.value("estimatedtime").toInt()); } } }