diff --git a/include/ZE_ZEngine.h b/include/ZE_ZEngine.h index f3c9965..a240140 100644 --- a/include/ZE_ZEngine.h +++ b/include/ZE_ZEngine.h @@ -13,7 +13,7 @@ File: ZE_ZEngine.h
Description: Header file for ZEngine class, the core of the ZEngine.
Author(s): James Turk
-$Id: ZE_ZEngine.h,v 1.10 2003/01/12 07:09:04 cozman Exp $
+$Id: ZE_ZEngine.h,v 1.11 2003/01/13 06:31:08 cozman Exp $
\file ZE_ZEngine.h \brief Definition file for core ZEngine class. @@ -24,10 +24,10 @@ $Id: ZE_ZEngine.h,v 1.10 2003/01/12 07:09:04 cozman Exp $
#ifndef __ze_zengine_h__ #define __ze_zengine_h__ -#include "ZE_Error.h" #include "ZE_Defines.h" #include "ZE_Macros.h" #include "ZE_Includes.h" +#include "ZE_ZError.h" /*! \brief ZEngine Namespace. @@ -150,7 +150,7 @@ class ZEngine /*! \brief Quit SDL and any Subsystems. - Shut down SDL (and SDL_ttf,SDL_mixer if necessary). + Shut down SDL (and SDL_ttf,SDL_mixer if necessary) You shouldn't ever have to call this, ReleaseInstance calls this for you. **/ void CloseDisplay(); @@ -477,6 +477,79 @@ class ZEngine #endif //USE_PHYSFS + ///////////////// + //Error Logging// + ///////////////// + private: + //! Stack of Errors which have occured. + queue mErrorQueue; + //! Current error. + ZError mCurError; + //! Option controlling how logfile is used. + bool mLogAllErrors; + //! C-style FILE* for error logging. + FILE *mErrlog; + + /*! + \brief Writes an error to file. + + Writes error to current error file. + \since 0.8.2 + \param error ZError to write to file. + **/ + void LogError(ZError error); + + public: + /*! + \brief Modify Error Logging. + + Change the way errors are logged and the file they are logged to, before calling this errors are logged to stderr. + (SDL may define stderr.txt on some platforms.) + \since 0.8.2 + \param logAll If set to true every error will be written to file instead of stored in the logfile. + \param logFile Name of file to use as log, passing in stderr or stdio will set the log to the C streams. + Passing in nothing will not change the current error log file, which defaults to stderr. + **/ + void SetErrorLog(bool logAll, string logFile=""); + + /*! + \brief Report an error. + + Adds the error to the the error queue, and sets the current error to this error. + \since 0.8.2 + \param code ZErrorCode of error. + \param desc Optional string describing error. + \param file Optional argument specifying the file the error occured in. + \param line Optional argument specifying the line the error occured on. + **/ + void ReportError(ZErrorCode code, string desc="", string file="", unsigned int line=0); + + /*! + \brief Get the last error. + + Get the last error reported. + \since 0.8.2 + \return ZErrorCode of last error reported. + **/ + ZErrorCode GetLastError(); + + /*! + \brief Write to the log. + + Write a string to the log, allowing special usage of the error log. + \since 0.8.2 + \param str String to write to log file. + **/ + void WriteLog(string str); + + /*! + \brief Flush Stack of Errors to file. + + Write the error stack to the error log. + \since 0.8.2 + **/ + void FlushErrors(); + //////////////////////////// //Data Loading + Unloading// diff --git a/src/ZE_ZEngine.cpp b/src/ZE_ZEngine.cpp index 096aa26..60f427d 100644 --- a/src/ZE_ZEngine.cpp +++ b/src/ZE_ZEngine.cpp @@ -13,12 +13,12 @@ File: ZE_ZEngine.cpp
Description: Implementation source file for ZEngine library main singleton class.
Author(s): James Turk
-$Id: ZE_ZEngine.cpp,v 1.14 2003/01/12 20:55:46 cozman Exp $
+$Id: ZE_ZEngine.cpp,v 1.15 2003/01/13 06:31:09 cozman Exp $
\file ZE_ZEngine.cpp \brief Central source file for ZEngine. - Actual implementation of ZEngine singleton class at heart of ZEngine. + Actual implementation of ZEngine singleton class, the core of ZEngine. **/ #include "ZE_ZEngine.h" @@ -55,6 +55,9 @@ ZEngine::ZEngine() mDesiredFramerate = 0; mNextUpdate = mLastPause = mPausedTime = mLastTime = 0; mSecPerFrame = 0.0; + + mLogAllErrors = true; + mErrlog = stderr; } ZEngine* ZEngine::GetInstance() @@ -106,14 +109,14 @@ bool ZEngine::CreateDisplay(string title, string icon) if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_AUDIO) < 0) { - LogError(FormatStr("SDL could not be initialized: %s", SDL_GetError())); + ReportError(ZERR_SDL_INIT,SDL_GetError()); return false; } #ifdef USE_SDL_MIXER if(Mix_OpenAudio(mRate, AUDIO_S16SYS, mStereo?2:1, 4096) < 0) //Open Audio (Stereo?2:1 is conditional for number of channels) { - LogError(FormatStr("SDL_mixer could not be initialized: %s", Mix_GetError())); + ReportError(ZERR_MIX_INIT,SDL_GetError()); return false; } #endif //USE_SDL_MIXER @@ -172,6 +175,7 @@ bool ZEngine::CreateDisplay(string title, string icon) if(!mScreen) //try 0 for BPP if supplied bpp failed { + ReportError(ZERR_VIDMODE,SDL_GetError()); mScreen = SDL_SetVideoMode(mWidth, mHeight, 0, flags); if(!mScreen) //if safe screen setup fails @@ -180,11 +184,10 @@ bool ZEngine::CreateDisplay(string title, string icon) Mix_CloseAudio(); #endif SDL_Quit(); - LogError(FormatStr("Unable to set video mode %dx%d (%dBpp): %s. Desktop Depth failed, fatal error.",mWidth,mHeight,mBPP,SDL_GetError())); + + ReportError(ZERR_VIDMODE,FormatStr("Desktop Depth failed: %s",SDL_GetError())); return false; } - else //let them know what they wanted failed - LogError(FormatStr("Unable to set video mode %dx%d (%dBpp): %s. Desktop Depth worked.",mWidth,mHeight,mBPP,SDL_GetError())); } mWidth = mScreen->w; @@ -200,7 +203,7 @@ bool ZEngine::CreateDisplay(string title, string icon) #ifdef USE_SDL_TTF if(TTF_Init() < 0) { - LogError(FormatStr("SDL_ttf could not be initialized: %s", TTF_GetError())); + ReportError(ZERR_TTF_INIT,TTF_GetError()); return false; } #endif //USE_SDL_TTF @@ -226,6 +229,9 @@ void ZEngine::CloseDisplay() #endif SDL_Quit(); + + if(mErrlog != stderr && mErrlog != stdin) + fclose(mErrlog); } SDL_Surface *ZEngine::Display() @@ -489,6 +495,57 @@ void ZEngine::AddPhysFSDir(string dir) #endif //USE_PHYSFS +void ZEngine::SetErrorLog(bool logAll, string logFile) +{ + mLogAllErrors = logAll; + if(logFile.length()) + { + if(logFile == "stderr") + mErrlog = stderr; + else if(logFile == "stdout") + mErrlog = stdout; + else + mErrlog = fopen(logFile.c_str(),"w"); + } +} + +void ZEngine::ReportError(ZErrorCode code, string desc, string file, unsigned int line) +{ + mCurError.Create(code,desc,file,line); + + if(mLogAllErrors) + { + LogError(mCurError); + fflush(mErrlog); + } + else + mErrorQueue.push(mCurError); +} + +ZErrorCode ZEngine::GetLastError() +{ + return mCurError.Code(); +} + +void ZEngine::WriteLog(string str) +{ + fprintf(mErrlog,str.c_str()); +} + +void ZEngine::LogError(ZError error) +{ + fprintf(mErrlog,error.LogString().c_str()); +} + +void ZEngine::FlushErrors() +{ + while(!mErrorQueue.empty()) + { + LogError(mErrorQueue.front()); + mErrorQueue.pop(); + } +} + SDL_Surface* ZEngine::LoadImage(string filename) { SDL_Surface *image; @@ -497,7 +554,10 @@ SDL_Surface* ZEngine::LoadImage(string filename) SDL_RWops *rw; rw = PHYSFSRWOPS_openRead(filename.c_str()); if(!rw) - LogError(FormatStr("PhysFS RWops failed: %s",SDL_GetError())); + { + ReportError(ZERR_LOAD_IMAGE,FormatStr("%s [PhysFS RWops failed: %s]",filename.c_str(),SDL_GetError())); + return NULL; + } #ifdef USE_SDL_IMAGE image = IMG_Load_RW(rw,0); #else @@ -517,7 +577,7 @@ SDL_Surface* ZEngine::LoadImage(string filename) if(!image) { - LogError(FormatStr("LoadImage could not load %s.",filename.c_str())); + ReportError(ZERR_LOAD_IMAGE,filename); return NULL; } else @@ -541,7 +601,7 @@ Mix_Chunk* ZEngine::LoadSound(string filename) if(!sound) { - LogError(FormatStr("LoadImage could not load %s.",filename.c_str())); + ReportError(ZERR_LOAD_SOUND,filename); return NULL; } else @@ -564,7 +624,7 @@ Mix_Music* ZEngine::LoadMusic(string filename) if(!music) { - LogError(FormatStr("LoadMusic could not load %s.",filename.c_str())); + ReportError(ZERR_LOAD_MUSIC,filename); return NULL; } else @@ -591,7 +651,7 @@ TTF_Font* ZEngine::LoadFont(string filename, int size) if(!font) { - LogError(FormatStr("LoadFont could not load %s.",filename.c_str())); + ReportError(ZERR_LOAD_FONT,filename); return NULL; } else