You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
2.8 KiB

/**
* @file appfat.cpp
*
* Implementation of error dialogs.
*/
#include <config.h>
8 years ago
5 years ago
#include <fmt/format.h>
#include "diablo.h"
#include "storm/storm.h"
#include "utils/language.h"
#include "utils/sdl_thread.h"
5 years ago
#include "utils/ui_fwd.h"
namespace devilution {
namespace {
/** Set to true when a fatal error is encountered and the application should shut down. */
bool Terminating = false;
/** Thread id of the last callee to FreeDlg(). */
SDL_threadID CleanupThreadId;
8 years ago
/**
* @brief Displays an error message box based on the given format string and variable argument list.
* @param pszFmt Error message format
* @param va Additional parameters for message format
*/
void MsgBox(const char *pszFmt, va_list va)
8 years ago
{
char text[256];
8 years ago
vsnprintf(text, sizeof(text), pszFmt, va);
UiErrorOkDialog(_("Error"), text);
8 years ago
}
/**
* @brief Cleans up after a fatal application error.
*/
void FreeDlg()
8 years ago
{
if (Terminating && CleanupThreadId != this_sdl_thread::get_id())
SDL_Delay(20000);
Terminating = true;
CleanupThreadId = this_sdl_thread::get_id();
if (gbIsMultiplayer) {
if (SNetLeaveGame(3))
SDL_Delay(2000);
}
SNetDestroy();
8 years ago
}
} // namespace
void app_fatal(const char *pszFmt, ...)
{
va_list va;
va_start(va, pszFmt);
FreeDlg();
if (pszFmt != nullptr)
MsgBox(pszFmt, va);
va_end(va);
diablo_quit(1);
}
void DrawDlg(const char *pszFmt, ...)
8 years ago
{
char text[256];
va_list va;
8 years ago
va_start(va, pszFmt);
vsnprintf(text, sizeof(text), pszFmt, va);
va_end(va);
UiErrorOkDialog(PROJECT_NAME, text, false);
8 years ago
}
#ifdef _DEBUG
void assert_fail(int nLineNo, const char *pszFile, const char *pszFail)
{
app_fatal("assertion failed (%s:%i)\n%s", pszFile, nLineNo, pszFail);
}
#endif
void ErrDlg(const char *title, const char *error, const char *logFilePath, int logLineNr)
8 years ago
{
char text[1024];
FreeDlg();
strncpy(text, fmt::format(_(/* TRANSLATORS: Error message that displays relevant information for bug report */ "{:s}\n\nThe error occurred at: {:s} line {:d}"), error, logFilePath, logLineNr).c_str(), sizeof(text));
UiErrorOkDialog(title, text);
app_fatal(nullptr);
8 years ago
}
void InsertCDDlg()
8 years ago
{
char text[1024];
snprintf(
text,
sizeof(text),
"%s",
_("Unable to open main data archive (diabdat.mpq or spawn.mpq).\n"
"\n"
"Make sure that it is in the game folder."));
UiErrorOkDialog(_("Data File Error"), text);
app_fatal(nullptr);
8 years ago
}
void DirErrorDlg(const char *error)
8 years ago
{
char text[1024];
strncpy(text, fmt::format(_(/* TRANSLATORS: Error when Program is not allowed to write data */ "Unable to write to location:\n{:s}"), error).c_str(), sizeof(text));
UiErrorOkDialog(_("Read-Only Directory Error"), text);
app_fatal(nullptr);
8 years ago
}
} // namespace devilution