From c2a14bbbdedd05ca73c22d76be7a7eca9ae50e6a Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Fri, 8 Nov 2024 23:50:12 +0200 Subject: [PATCH] Improve AbstractXMLParser error reporting The more detailed error message that used to go only to Livelog.txt is now also displayed in the ingame error screen, providing more helpful error message to players when making bug reports/asking for help --- Ja2/Init.cpp | 12 +++++++----- Tactical/LogicalBodyTypes/AbstractXMLLoader.cpp | 9 +++++---- Tactical/LogicalBodyTypes/AbstractXMLLoader.h | 2 +- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Ja2/Init.cpp b/Ja2/Init.cpp index 605a13a7b..44a90d769 100644 --- a/Ja2/Init.cpp +++ b/Ja2/Init.cpp @@ -438,11 +438,13 @@ BOOLEAN LoadExternalGameplayData(STR directoryName, BOOLEAN isMultiplayer) if (isMultiplayer == false) { using namespace LogicalBodyTypes; - SGP_THROW_IFFALSE(Layers::Instance().LoadFromFile(directoryName, LBT_LAYERSFILENAME), LBT_LAYERSFILENAME); - SGP_THROW_IFFALSE(PaletteDB::Instance().LoadFromFile(directoryName, LBT_PALETTESFILENAME), LBT_PALETTESFILENAME); - SGP_THROW_IFFALSE(SurfaceDB::Instance().LoadFromFile(directoryName, LBT_ANIMSURFACESFILENAME), LBT_ANIMSURFACESFILENAME); - SGP_THROW_IFFALSE(FilterDB::Instance().LoadFromFile(directoryName, LBT_FILTERSFILENAME), LBT_FILTERSFILENAME); - SGP_THROW_IFFALSE(BodyTypeDB::Instance().LoadFromFile(directoryName, LBT_BODYTYPESFILENAME), LBT_BODYTYPESFILENAME); + CHAR8 errorBuf[512]{"Failed loading LogicalBodyTypes external data!"}; + + SGP_THROW_IFFALSE(Layers::Instance().LoadFromFile(directoryName, LBT_LAYERSFILENAME, errorBuf), errorBuf); + SGP_THROW_IFFALSE(PaletteDB::Instance().LoadFromFile(directoryName, LBT_PALETTESFILENAME, errorBuf), errorBuf); + SGP_THROW_IFFALSE(SurfaceDB::Instance().LoadFromFile(directoryName, LBT_ANIMSURFACESFILENAME, errorBuf), errorBuf); + SGP_THROW_IFFALSE(FilterDB::Instance().LoadFromFile(directoryName, LBT_FILTERSFILENAME, errorBuf), errorBuf); + SGP_THROW_IFFALSE(BodyTypeDB::Instance().LoadFromFile(directoryName, LBT_BODYTYPESFILENAME, errorBuf), errorBuf); } } diff --git a/Tactical/LogicalBodyTypes/AbstractXMLLoader.cpp b/Tactical/LogicalBodyTypes/AbstractXMLLoader.cpp index ab1822599..93d746720 100644 --- a/Tactical/LogicalBodyTypes/AbstractXMLLoader.cpp +++ b/Tactical/LogicalBodyTypes/AbstractXMLLoader.cpp @@ -24,14 +24,15 @@ AbstractXMLLoader::ParseData* AbstractXMLLoader::MakeParseData(XML_Parser* parse return new ParseData(parser); } -bool AbstractXMLLoader::LoadFromFile(const char* directoryName, const char* fileName) { +bool AbstractXMLLoader::LoadFromFile(const char* directoryName, const char* fileName, CHAR8* errorBuf) { HWFILE hFile; UINT32 uiBytesRead; UINT32 uiFSize; CHAR8* lpcBuffer; char fileNameFull[MAX_PATH + 1]; if (strlen(fileName) + strlen(directoryName) >= MAX_PATH) { - LiveMessage("Can't load file. Concatinated filename too long for buffer!"); + sprintf(errorBuf, "Can't load file %s%s, Concatenated filename too long for buffer!", directoryName, fileName); + LiveMessage(errorBuf); return false; } SetDirectoryName(directoryName); @@ -46,12 +47,14 @@ bool AbstractXMLLoader::LoadFromFile(const char* directoryName, const char* file DebugMsg(TOPIC_JA2, DBG_LEVEL_3, msg.c_str()); hFile = FileOpen(fileNameFull, FILE_ACCESS_READ, FALSE); if (!hFile) { + sprintf(errorBuf, "Can't open %s", fileNameFull); delete data; return false; } uiFSize = FileGetSize(hFile); lpcBuffer = (CHAR8*)MemAlloc(uiFSize + 1); if (!FileRead(hFile, lpcBuffer, uiFSize, &uiBytesRead)) { + sprintf(errorBuf, "Error reading %s to buffer", fileNameFull); MemFree(lpcBuffer); delete data; return false; @@ -72,7 +75,6 @@ bool AbstractXMLLoader::LoadFromFile(const char* directoryName, const char* file try { if (!XML_Parse(parser, lpcBuffer, uiFSize, TRUE)) { - CHAR8 errorBuf[512]; sprintf(errorBuf, "XML Parser Error in %s[%d]: %s", fileNameFull, XML_GetCurrentLineNumber(parser), XML_ErrorString(XML_GetErrorCode(parser))); LiveMessage(errorBuf); MemFree(lpcBuffer); @@ -80,7 +82,6 @@ bool AbstractXMLLoader::LoadFromFile(const char* directoryName, const char* file return false; } } catch (XMLParseException e) { - CHAR8 errorBuf[512]; sprintf(errorBuf, "XML Parser Exception in %s[%d]: %s", fileNameFull, e._LINE, e.what()); LiveMessage(errorBuf); MemFree(lpcBuffer); diff --git a/Tactical/LogicalBodyTypes/AbstractXMLLoader.h b/Tactical/LogicalBodyTypes/AbstractXMLLoader.h index 765c127bc..20749ba0e 100644 --- a/Tactical/LogicalBodyTypes/AbstractXMLLoader.h +++ b/Tactical/LogicalBodyTypes/AbstractXMLLoader.h @@ -55,7 +55,7 @@ class AbstractXMLLoader : public ISingleton public: AbstractXMLLoader(XML_StartElementHandler startHandler, XML_EndElementHandler endHandler, XML_CharacterDataHandler charHandler, ParseDataFactoryFunc parseDataFactF = MakeParseData); ~AbstractXMLLoader(void); - bool LoadFromFile(const char* directoryName, const char* fileName); + bool LoadFromFile(const char* directoryName, const char* fileName, CHAR8* errorBuf); const char* GetFileName(); const char* GetDirectoryName(); void SetFileName(const char* fileName);