Fix logger eventually causing a crash without a console on Windows. (#481)

This commit is contained in:
Skyth (Asilkan) 2025-03-01 12:48:19 +03:00 committed by GitHub
parent 881712999c
commit 9e744ffded
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 30 additions and 6 deletions

View file

@ -9,6 +9,8 @@
#include <shellapi.h> #include <shellapi.h>
#endif #endif
#include <os/logger.h>
// UpdateChecker // UpdateChecker
using json = nlohmann::json; using json = nlohmann::json;
@ -52,7 +54,7 @@ static bool parseVersion(const std::string &versionStr, int &major, int &minor,
} }
catch (const std::exception &e) catch (const std::exception &e)
{ {
fmt::println("Error while parsing version: {}.", e.what()); LOGF_ERROR("Error while parsing version: {}.", e.what());
return false; return false;
} }
@ -93,25 +95,25 @@ void updateCheckerThread()
} }
else else
{ {
fmt::println("Error while parsing response: tag_name does not contain a valid version string."); LOG_ERROR("Error while parsing response: tag_name does not contain a valid version string.");
g_updateCheckerResult = UpdateChecker::Result::Failed; g_updateCheckerResult = UpdateChecker::Result::Failed;
} }
} }
else else
{ {
fmt::println("Error while parsing response: tag_name not found or not the right type."); LOG_ERROR("Error while parsing response: tag_name not found or not the right type.");
g_updateCheckerResult = UpdateChecker::Result::Failed; g_updateCheckerResult = UpdateChecker::Result::Failed;
} }
} }
catch (const json::exception &e) catch (const json::exception &e)
{ {
fmt::println("Error while parsing response: {}", e.what()); LOGF_ERROR("Error while parsing response: {}", e.what());
g_updateCheckerResult = UpdateChecker::Result::Failed; g_updateCheckerResult = UpdateChecker::Result::Failed;
} }
} }
else else
{ {
fmt::println("Error while performing request: {}", curl_easy_strerror(res)); LOGF_ERROR("Error while performing request: {}", curl_easy_strerror(res));
g_updateCheckerResult = UpdateChecker::Result::Failed; g_updateCheckerResult = UpdateChecker::Result::Failed;
} }

View file

@ -153,6 +153,8 @@ int main(int argc, char *argv[])
timeBeginPeriod(1); timeBeginPeriod(1);
#endif #endif
os::process::CheckConsole();
if (!os::registry::Init()) if (!os::registry::Init())
LOGN_WARNING("OS doesn't support registry"); LOGN_WARNING("OS doesn't support registry");

View file

@ -61,6 +61,12 @@ bool os::process::StartProcess(const std::filesystem::path& path, const std::vec
return true; return true;
} }
void os::process::CheckConsole()
{
// Always visible on Linux.
g_consoleVisible = true;
}
void os::process::ShowConsole() void os::process::ShowConsole()
{ {
// Unnecessary on Linux. // Unnecessary on Linux.

View file

@ -2,9 +2,12 @@
namespace os::process namespace os::process
{ {
inline bool g_consoleVisible;
std::filesystem::path GetExecutablePath(); std::filesystem::path GetExecutablePath();
std::filesystem::path GetWorkingDirectory(); std::filesystem::path GetWorkingDirectory();
bool SetWorkingDirectory(const std::filesystem::path& path); bool SetWorkingDirectory(const std::filesystem::path& path);
bool StartProcess(const std::filesystem::path& path, const std::vector<std::string>& args, std::filesystem::path work = {}); bool StartProcess(const std::filesystem::path& path, const std::vector<std::string>& args, std::filesystem::path work = {});
void CheckConsole();
void ShowConsole(); void ShowConsole();
} }

View file

@ -1,9 +1,10 @@
#include <os/logger.h> #include <os/logger.h>
#include <os/process.h>
#define FOREGROUND_WHITE (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE) #define FOREGROUND_WHITE (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
#define FOREGROUND_YELLOW (FOREGROUND_RED | FOREGROUND_GREEN) #define FOREGROUND_YELLOW (FOREGROUND_RED | FOREGROUND_GREEN)
HANDLE g_hStandardOutput; static HANDLE g_hStandardOutput;
void os::logger::Init() void os::logger::Init()
{ {
@ -12,6 +13,9 @@ void os::logger::Init()
void os::logger::Log(const std::string_view str, ELogType type, const char* func) void os::logger::Log(const std::string_view str, ELogType type, const char* func)
{ {
if (!os::process::g_consoleVisible)
return;
switch (type) switch (type)
{ {
case ELogType::Utility: case ELogType::Utility:

View file

@ -52,6 +52,11 @@ bool os::process::StartProcess(const std::filesystem::path& path, const std::vec
return true; return true;
} }
void os::process::CheckConsole()
{
g_consoleVisible = (GetConsoleWindow() != nullptr);
}
void os::process::ShowConsole() void os::process::ShowConsole()
{ {
if (GetConsoleWindow() == nullptr) if (GetConsoleWindow() == nullptr)
@ -60,5 +65,7 @@ void os::process::ShowConsole()
freopen("CONIN$", "r", stdin); freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stderr); freopen("CONOUT$", "w", stderr);
freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stdout);
g_consoleVisible = true;
} }
} }