ErrorHandler.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. //#include <Windows.h>
  2. #include "Config.h"
  3. #include "ConfigLoader.h"
  4. #include "ErrorHandler.h"
  5. #include "WindowLocator.h"
  6. // Predefined variables for "AddVariablePredef" macro
  7. #define ERR_TYP_PREDEF m_errorTypes
  8. #define ERR_DATA_PREDEF m_errorData
  9. #define ERR_DATA_TYPE_PREDEF m_errorType
  10. #define ERR_HASH_PREDEF m_errHashmap
  11. #define AssignErrorType(ERROR_CODE, ERROR_TYPE) ERR_DATA_PREDEF[ERROR_CODE].ERR_DATA_TYPE_PREDEF = ERROR_TYPE; ERR_HASH_PREDEF[GetString(ERROR_CODE)] = ERROR_CODE
  12. // AssignErrorType(ERROR_CODE, ERROR_TYPE) ERR_TYP_PREDEF[ERROR_CODE] = ERROR_TYPE; ERR_HASH_PREDEF[GetString(ERROR_CODE)] = ERROR_CODE
  13. //#define AssignErrorSource(ERROR_CODE, ERROR_TYPE) ERR_TYP_PREDEF[ERROR_CODE] = ERROR_TYPE; ERR_HASH_PREDEF[GetString(ERROR_CODE)] = ERROR_CODE
  14. ErrorHandler::ErrorHandler()
  15. {
  16. m_console = nullptr;
  17. // Add the error codes to the hash map and also assign their error types in the error type array
  18. AssignErrorType(Undefined, Warning);
  19. AssignErrorType(Success, Info);
  20. AssignErrorType(Failure, Warning);
  21. AssignErrorType(Initialize_success, Info);
  22. AssignErrorType(Initialize_failure, Info);
  23. AssignErrorType(File_not_found, Warning);
  24. AssignErrorType(Destroy_obj_not_found, Warning);
  25. AssignErrorType(Glew_failed, FatalError);
  26. AssignErrorType(Ifstream_failed, Warning);
  27. AssignErrorType(Clock_QueryFrequency, FatalError);
  28. AssignErrorType(Framebuffer_failed, FatalError);
  29. AssignErrorType(Geometrybuffer_failed, FatalError);
  30. AssignErrorType(GL_context_missing, Error);
  31. AssignErrorType(Window_handle_missing, Error);
  32. AssignErrorType(AssimpScene_failed, Error);
  33. AssignErrorType(ObjectPool_full, Warning);
  34. AssignErrorType(Property_no_filename, Warning);
  35. AssignErrorType(Shader_attach_failed, Error);
  36. AssignErrorType(Shader_compile_failed, Error);
  37. AssignErrorType(Shader_creation_failed, Error);
  38. AssignErrorType(Shader_link_failed, Error);
  39. AssignErrorType(Shader_loading_failed, Error);
  40. AssignErrorType(Texture_not_found, Warning);
  41. AssignErrorType(Texture_empty, Warning);
  42. AssignErrorType(Invalid_num_vid_displays, Warning);
  43. AssignErrorType(SDL_video_init_failed, FatalError);
  44. AssignErrorType(SDL_vsync_failed, Warning);
  45. AssignErrorType(Window_creation_failed, FatalError);
  46. AssignErrorType(Invalid_object_id, Error);
  47. AssignErrorType(Duplicate_object_id, Error);
  48. // Add error sources to the hash map, and offset them by number of error codes, because they share the same hash map
  49. m_errHashmap[GetString(Source_Unknown)] = NumberOfErrorCodes + Source_Unknown;
  50. m_errHashmap[GetString(Source_General)] = NumberOfErrorCodes + Source_General;
  51. m_errHashmap[GetString(Source_AtmScatteringPass)] = NumberOfErrorCodes + Source_AtmScatteringPass;
  52. m_errHashmap[GetString(Source_BloomCompositePass)] = NumberOfErrorCodes + Source_BloomCompositePass;
  53. m_errHashmap[GetString(Source_BloomPass)] = NumberOfErrorCodes + Source_BloomPass;
  54. m_errHashmap[GetString(Source_BlurPass)] = NumberOfErrorCodes + Source_BlurPass;
  55. m_errHashmap[GetString(Source_CameraComponent)] = NumberOfErrorCodes + Source_CameraComponent;
  56. m_errHashmap[GetString(Source_Config)] = NumberOfErrorCodes + Source_Config;
  57. m_errHashmap[GetString(Source_ConfigLoader)] = NumberOfErrorCodes + Source_ConfigLoader;
  58. m_errHashmap[GetString(Source_Engine)] = NumberOfErrorCodes + Source_Engine;
  59. m_errHashmap[GetString(Source_FileLoader)] = NumberOfErrorCodes + Source_FileLoader;
  60. m_errHashmap[GetString(Source_FinalPass)] = NumberOfErrorCodes + Source_FinalPass;
  61. m_errHashmap[GetString(Source_GameObject)] = NumberOfErrorCodes + Source_GameObject;
  62. m_errHashmap[GetString(Source_GeometryBuffer)] = NumberOfErrorCodes + Source_GeometryBuffer;
  63. m_errHashmap[GetString(Source_GeometryPass)] = NumberOfErrorCodes + Source_GeometryPass;
  64. m_errHashmap[GetString(Source_GraphicsObject)] = NumberOfErrorCodes + Source_GraphicsObject;
  65. m_errHashmap[GetString(Source_GUI)] = NumberOfErrorCodes + Source_GUI;
  66. m_errHashmap[GetString(Source_GUIObject)] = NumberOfErrorCodes + Source_GUIObject;
  67. m_errHashmap[GetString(Source_GUISequenceComponent)] = NumberOfErrorCodes + Source_GUISequenceComponent;
  68. m_errHashmap[GetString(Source_HdrMappingPass)] = NumberOfErrorCodes + Source_HdrMappingPass;
  69. m_errHashmap[GetString(Source_LensFlareCompositePass)] = NumberOfErrorCodes + Source_LensFlareCompositePass;
  70. m_errHashmap[GetString(Source_LensFlarePass)] = NumberOfErrorCodes + Source_LensFlarePass;
  71. m_errHashmap[GetString(Source_LightComponent)] = NumberOfErrorCodes + Source_LightComponent;
  72. m_errHashmap[GetString(Source_LightObject)] = NumberOfErrorCodes + Source_LightObject;
  73. m_errHashmap[GetString(Source_LightingPass)] = NumberOfErrorCodes + Source_LightingPass;
  74. m_errHashmap[GetString(Source_LuaComponent)] = NumberOfErrorCodes + Source_LuaComponent;
  75. m_errHashmap[GetString(Source_ObjectDirectory)] = NumberOfErrorCodes + Source_ObjectDirectory;
  76. m_errHashmap[GetString(Source_ModelComponent)] = NumberOfErrorCodes + Source_ModelComponent;
  77. m_errHashmap[GetString(Source_ModelLoader)] = NumberOfErrorCodes + Source_ModelLoader;
  78. m_errHashmap[GetString(Source_PlayerObject)] = NumberOfErrorCodes + Source_PlayerObject;
  79. m_errHashmap[GetString(Source_PostProcessPass)] = NumberOfErrorCodes + Source_PostProcessPass;
  80. m_errHashmap[GetString(Source_PropertyLoader)] = NumberOfErrorCodes + Source_PropertyLoader;
  81. m_errHashmap[GetString(Source_ReflectionPass)] = NumberOfErrorCodes + Source_ReflectionPass;
  82. m_errHashmap[GetString(Source_Renderer)] = NumberOfErrorCodes + Source_Renderer;
  83. m_errHashmap[GetString(Source_RendererScene)] = NumberOfErrorCodes + Source_RendererScene;
  84. m_errHashmap[GetString(Source_RendererSystem)] = NumberOfErrorCodes + Source_RendererSystem;
  85. m_errHashmap[GetString(Source_SceneLoader)] = NumberOfErrorCodes + Source_SceneLoader;
  86. m_errHashmap[GetString(Source_Script)] = NumberOfErrorCodes + Source_Script;
  87. m_errHashmap[GetString(Source_ScriptObject)] = NumberOfErrorCodes + Source_ScriptObject;
  88. m_errHashmap[GetString(Source_ShaderComponent)] = NumberOfErrorCodes + Source_ShaderComponent;
  89. m_errHashmap[GetString(Source_ShaderLoader)] = NumberOfErrorCodes + Source_ShaderLoader;
  90. m_errHashmap[GetString(Source_SkyObject)] = NumberOfErrorCodes + Source_SkyObject;
  91. m_errHashmap[GetString(Source_SkyPass)] = NumberOfErrorCodes + Source_SkyPass;
  92. m_errHashmap[GetString(Source_TextureLoader)] = NumberOfErrorCodes + Source_TextureLoader;
  93. m_errHashmap[GetString(Source_Window)] = NumberOfErrorCodes + Source_Window;
  94. m_errHashmap[GetString(Source_World)] = NumberOfErrorCodes + Source_World;
  95. m_errHashmap[GetString(Source_WorldScene)] = NumberOfErrorCodes + Source_WorldScene;
  96. m_errHashmap[GetString(Source_WorldSystem)] = NumberOfErrorCodes + Source_WorldSystem;
  97. // Add error types to the hash map, and offset them by number of error codes and error sources, because they share the same hash map
  98. m_errHashmap[GetString(Info)] = NumberOfErrorCodes + Source_NumberOfErrorSources + Info;
  99. m_errHashmap[GetString(Warning)] = NumberOfErrorCodes + Source_NumberOfErrorSources + Warning;
  100. m_errHashmap[GetString(Error)] = NumberOfErrorCodes + Source_NumberOfErrorSources + Error;
  101. m_errHashmap[GetString(FatalError)] = NumberOfErrorCodes + Source_NumberOfErrorSources + FatalError;
  102. }
  103. ErrorHandler::~ErrorHandler()
  104. {
  105. }
  106. ErrorCode ErrorHandler::init()
  107. {
  108. m_console = new CoutConsole;
  109. ConfigFile errorCodes;
  110. if(errorCodes.import(Config::filepathVar().config_path + Config::configFileVar().error_code_strings_eng, m_errHashmap) != Success)
  111. {
  112. log(ErrorType::Error, ErrorSource::Source_General, "Error strings has failed to load");
  113. }
  114. else
  115. {
  116. NodeIterator rootNode = errorCodes.getRootNode();
  117. NodeIterator it = rootNode.getNode("Error Codes");
  118. for(int i = 0; i < ErrorCode::NumberOfErrorCodes; i++)
  119. {
  120. m_errorData[i].m_errorString = it.getValue(i).getString();
  121. }
  122. it = rootNode.getNode("Error Sources");
  123. for(int i = ErrorCode::NumberOfErrorCodes, size = ErrorSource::Source_NumberOfErrorSources + ErrorCode::NumberOfErrorCodes; i < size; i++)
  124. m_errorSources[i - ErrorCode::NumberOfErrorCodes] = it.getValue(i).getString();
  125. it = rootNode.getNode("Error Types");
  126. for(int i = ErrorCode::NumberOfErrorCodes + ErrorSource::Source_NumberOfErrorSources,
  127. size = ErrorSource::Source_NumberOfErrorSources + ErrorCode::NumberOfErrorCodes + ErrorType::NumberOfErrorTypes; i < size; i++)
  128. m_errorTypeStrings[i - ErrorCode::NumberOfErrorCodes - ErrorSource::Source_NumberOfErrorSources] = it.getValue(i).getString();
  129. }
  130. return ErrorCode::Success;
  131. }
  132. void ErrorHandler::log(ErrorCode p_errorCode)
  133. {
  134. log(p_errorCode, ErrorSource::Source_Unknown);
  135. }
  136. void ErrorHandler::log(ErrorCode p_errorCode, ErrorSource p_errorSource)
  137. {
  138. if(p_errorCode == ErrorCode::CachedError)
  139. {
  140. if(m_cachedError.errorPresent())
  141. {
  142. log(m_errorData[m_cachedError.m_errorCode].m_errorType, p_errorSource, m_errorData[m_cachedError.m_errorCode].m_errorString + ": " + m_cachedError.m_errorString);
  143. m_cachedError.clear();
  144. }
  145. }
  146. else
  147. log(m_errorData[p_errorCode].m_errorType, p_errorSource, m_errorData[p_errorCode].m_errorString);
  148. }
  149. void ErrorHandler::log(ErrorType p_errorType, ErrorSource p_errorSource, std::string p_error)
  150. {
  151. // If the engine has already been set to shutdown, don't process any errors
  152. if(Config::m_engineVar.running == true)
  153. {
  154. std::string displayMessage;
  155. switch(p_errorType)
  156. {
  157. case ErrorType::Info:
  158. {
  159. m_console->displayMessage(m_errorTypeStrings[p_errorType] + ": " + m_errorSources[p_errorSource] + ": " + p_error + ".");
  160. break;
  161. }
  162. case ErrorType::Warning:
  163. {
  164. m_console->displayMessage(m_errorTypeStrings[p_errorType] + ": " + m_errorSources[p_errorSource] + ": " + p_error + ".");
  165. break;
  166. }
  167. case ErrorType::Error:
  168. {
  169. // Remove a 'new line' character if it's present, as it would break the formating
  170. if(p_error[p_error.size() - 1] == '\n')
  171. p_error.pop_back();
  172. // TODO make the error question data driven
  173. if(!WindowLocator().get().spawnYesNoErrorBox(m_errorTypeStrings[p_errorType] + ": " + m_errorSources[p_errorSource], m_errorSources[p_errorSource] + ": " + p_error + ".\n\nWould you like to continue?"))
  174. Config::m_engineVar.running = false;
  175. break;
  176. }
  177. case ErrorType::FatalError:
  178. {
  179. WindowLocator().get().spawnErrorBox(m_errorTypeStrings[p_errorType] + ": " + m_errorSources[p_errorSource], m_errorSources[p_errorSource] + ": " + p_error + ".");
  180. Config::m_engineVar.running = false;
  181. break;
  182. }
  183. default:
  184. break;
  185. }
  186. }
  187. }
  188. void ErrorHandler::log(ErrorCode p_errorCode, ErrorSource p_errorSource, std::string p_error)
  189. {
  190. if(p_errorCode == ErrorCode::CachedError)
  191. {
  192. if(m_cachedError.errorPresent())
  193. {
  194. log(m_errorData[m_cachedError.m_errorCode].m_errorType, p_errorSource, m_errorData[m_cachedError.m_errorCode].m_errorString + ": " + p_error + ": " + m_cachedError.m_errorString);
  195. m_cachedError.clear();
  196. }
  197. }
  198. else
  199. log(m_errorData[p_errorCode].m_errorType, p_errorSource, m_errorData[p_errorCode].m_errorString + ": " + p_error);
  200. }