diff --git a/apps/launcher/datafilespage.cpp b/apps/launcher/datafilespage.cpp index e1b34a8034..ab2f459d26 100644 --- a/apps/launcher/datafilespage.cpp +++ b/apps/launcher/datafilespage.cpp @@ -11,6 +11,7 @@ #include #include + #include #include @@ -22,6 +23,7 @@ #include #include #include +#include #include #include "utils/textinputdialog.hpp" @@ -787,6 +789,7 @@ void Launcher::DataFilesPage::startNavMeshTool() ui.navMeshLogPlainTextEdit->clear(); ui.navMeshProgressBar->setValue(0); ui.navMeshProgressBar->setMaximum(1); + ui.navMeshProgressBar->resetFormat(); mNavMeshToolProgress = NavMeshToolProgress {}; @@ -813,6 +816,8 @@ void Launcher::DataFilesPage::readNavMeshToolStderr() void Launcher::DataFilesPage::updateNavMeshProgress(int minDataSize) { + if (!mNavMeshToolProgress.mEnabled) + return; QProcess& process = *mNavMeshToolInvoker->getProcess(); mNavMeshToolProgress.mMessagesData.append(process.readAllStandardError()); if (mNavMeshToolProgress.mMessagesData.size() < minDataSize) @@ -826,14 +831,23 @@ void Launcher::DataFilesPage::updateNavMeshProgress(int minDataSize) ui.navMeshProgressBar->maximum(), ui.navMeshProgressBar->value(), }; - while (true) + try { - NavMeshTool::Message message; - const std::byte* const nextPosition = NavMeshTool::deserialize(position, end, message); - if (nextPosition == position) - break; - position = nextPosition; - handle = std::visit(handle, NavMeshTool::decode(message)); + while (true) + { + NavMeshTool::Message message; + const std::byte* const nextPosition = NavMeshTool::deserialize(position, end, message); + if (nextPosition == position) + break; + position = nextPosition; + handle = std::visit(handle, NavMeshTool::decode(message)); + } + } + catch (const std::exception& e) + { + Log(Debug::Error) << "Failed to deserialize navmeshtool message: " << e.what(); + mNavMeshToolProgress.mEnabled = false; + ui.navMeshProgressBar->setFormat("Failed to update progress: " + QString(e.what())); } if (position != begin) mNavMeshToolProgress.mMessagesData = mNavMeshToolProgress.mMessagesData.mid(position - begin); @@ -861,7 +875,10 @@ void Launcher::DataFilesPage::navMeshToolFinished(int exitCode, QProcess::ExitSt updateNavMeshProgress(0); ui.navMeshLogPlainTextEdit->appendPlainText(QString::fromUtf8(mNavMeshToolInvoker->getProcess()->readAllStandardOutput())); if (exitCode == 0 && exitStatus == QProcess::ExitStatus::NormalExit) + { ui.navMeshProgressBar->setValue(ui.navMeshProgressBar->maximum()); + ui.navMeshProgressBar->resetFormat(); + } ui.cancelNavMeshButton->setEnabled(false); ui.navMeshProgressBar->setEnabled(false); } diff --git a/apps/launcher/datafilespage.hpp b/apps/launcher/datafilespage.hpp index 0a235209f3..ca62c4f1cc 100644 --- a/apps/launcher/datafilespage.hpp +++ b/apps/launcher/datafilespage.hpp @@ -83,6 +83,7 @@ namespace Launcher private: struct NavMeshToolProgress { + bool mEnabled = true; QByteArray mLogData; QByteArray mMessagesData; std::map mWorldspaces; diff --git a/components/navmeshtool/protocol.cpp b/components/navmeshtool/protocol.cpp index 656d5ab4d6..29128eb564 100644 --- a/components/navmeshtool/protocol.cpp +++ b/components/navmeshtool/protocol.cpp @@ -5,6 +5,8 @@ #include #include +#include +#include #include #include @@ -12,6 +14,21 @@ namespace NavMeshTool { namespace { + std::string formatMagic(const char (&value)[std::size(messageMagic)]) + { + std::ostringstream stream; + for (const char v : value) + { + if (std::isprint(v) && !std::isspace(v)) + stream << '\'' << v << '\''; + else + stream << "0x" << std::hex << std::uppercase << std::setfill('0') << std::setw(2) + << static_cast(v); + stream << ' '; + } + return stream.str(); + } + template struct Format : Serialization::Format> { @@ -29,7 +46,7 @@ namespace NavMeshTool char magic[std::size(messageMagic)]; visitor(*this, magic); if (std::memcmp(magic, messageMagic, sizeof(magic)) != 0) - throw BadMessageMagic(); + throw std::runtime_error("Bad navmeshtool message magic: " + formatMagic(magic)); } visitor(*this, value.mType); visitor(*this, value.mSize); diff --git a/components/navmeshtool/protocol.hpp b/components/navmeshtool/protocol.hpp index ddb68a716c..d586d44aae 100644 --- a/components/navmeshtool/protocol.hpp +++ b/components/navmeshtool/protocol.hpp @@ -11,11 +11,6 @@ namespace NavMeshTool { inline constexpr char messageMagic[] = {'n', 'v', 't', 'm'}; - struct BadMessageMagic : std::runtime_error - { - BadMessageMagic() : std::runtime_error("Bad Message magic") {} - }; - enum class MessageType : std::uint64_t { ExpectedCells = 1,