00001
00002
00003
00004
00005 #include <time.h>
00006 #include "../Headers/cLogger.h"
00007 #include "../Headers/cConsoleLogReceiver.h"
00008 #include "../Headers/cFileLogReceiver.h"
00009 #include "../Headers/cUtils.h"
00010
00011 namespace cAudio
00012 {
00013 static cLogger Logger;
00014 static bool FirstTimeLogInit(false);
00015 static cConsoleLogReceiver ConsoleLog;
00016 static cFileLogReceiver FileLog;
00017
00018 cLogger::cLogger() : StartTime(0), MinLogLevel(ELL_INFO)
00019 {
00020 StartTime = clock();
00021 }
00022
00023 void cLogger::logCritical( const char* sender, const char *msg, ... )
00024 {
00025 if(ELL_CRITICAL >= MinLogLevel)
00026 {
00027 Mutex.lock();
00028 va_list args;
00029 va_start( args, msg );
00030 broadcastMessage( ELL_CRITICAL, sender, msg, args );
00031 va_end( args );
00032 Mutex.unlock();
00033 }
00034 }
00035 void cLogger::logError( const char* sender, const char *msg, ... )
00036 {
00037 if(ELL_ERROR >= MinLogLevel)
00038 {
00039 Mutex.lock();
00040 va_list args;
00041 va_start( args, msg );
00042 broadcastMessage( ELL_ERROR, sender, msg, args );
00043 va_end( args );
00044 Mutex.unlock();
00045 }
00046 }
00047 void cLogger::logWarning( const char* sender, const char *msg, ... )
00048 {
00049 if(ELL_WARNING >= MinLogLevel)
00050 {
00051 Mutex.lock();
00052 va_list args;
00053 va_start( args, msg );
00054 broadcastMessage( ELL_WARNING, sender, msg, args );
00055 va_end( args );
00056 Mutex.unlock();
00057 }
00058 }
00059 void cLogger::logInfo( const char* sender, const char *msg, ... )
00060 {
00061 if(ELL_INFO >= MinLogLevel)
00062 {
00063 Mutex.lock();
00064 va_list args;
00065 va_start( args, msg );
00066 broadcastMessage( ELL_INFO, sender, msg, args );
00067 va_end( args );
00068 Mutex.unlock();
00069 }
00070 }
00071 void cLogger::logDebug( const char* sender, const char *msg, ... )
00072 {
00073 if(ELL_DEBUG >= MinLogLevel)
00074 {
00075 Mutex.lock();
00076 va_list args;
00077 va_start( args, msg );
00078 broadcastMessage( ELL_DEBUG, sender, msg, args );
00079 va_end( args );
00080 Mutex.unlock();
00081 }
00082 }
00083 void cLogger::setLogLevel( const LogLevel& logLevel )
00084 {
00085 Mutex.lock();
00086 MinLogLevel = logLevel;
00087 Mutex.unlock();
00088 }
00089 void cLogger::broadcastMessage( LogLevel level, const char* sender, const char* msg, va_list args )
00090 {
00091 float messageTime = (clock() - StartTime) / (float)CLOCKS_PER_SEC;
00092 vsnprintf( TempTextBuf, 2048, msg, args );
00093
00094 std::map<std::string,ILogReceiver*>::iterator it = Receivers.begin();
00095 for (it = Receivers.begin(); it != Receivers.end(); it++)
00096 {
00097 it->second->OnLogMessage(sender, TempTextBuf, level, messageTime);
00098 }
00099 }
00100 bool cLogger::registerLogReceiver(ILogReceiver* receiver, const char* name)
00101 {
00102 Mutex.lock();
00103 std::string logName = safeCStr(name);
00104 Receivers[logName] = receiver;
00105 Mutex.unlock();
00106 return true;
00107 }
00108
00109 void cLogger::unRegisterLogReceiver(const char* name)
00110 {
00111 Mutex.lock();
00112 std::string logName = safeCStr(name);
00113 std::map<std::string, ILogReceiver*>::iterator it = Receivers.find(logName);
00114 if(it != Receivers.end())
00115 {
00116 Receivers.erase(it);
00117 }
00118 Mutex.unlock();
00119 }
00120
00121 bool cLogger::isLogReceiverRegistered(const char* name)
00122 {
00123 Mutex.lock();
00124 std::string logName = safeCStr(name);
00125 std::map<std::string, ILogReceiver*>::iterator it = Receivers.find(logName);
00126 bool result = (it != Receivers.end());
00127 Mutex.unlock();
00128 return result;
00129 }
00130
00131 ILogReceiver* cLogger::getLogReceiver(const char* name)
00132 {
00133 Mutex.lock();
00134 std::string logName = safeCStr(name);
00135 std::map<std::string, ILogReceiver*>::iterator it = Receivers.find(logName);
00136 if(it != Receivers.end())
00137 {
00138 Mutex.unlock();
00139 return it->second;
00140 }
00141 Mutex.unlock();
00142 return NULL;
00143 }
00144
00145 CAUDIO_API ILogger* getLogger()
00146 {
00147 if(!FirstTimeLogInit)
00148 {
00149 FirstTimeLogInit = true;
00150 Logger.registerLogReceiver(&ConsoleLog, "Console");
00151 Logger.registerLogReceiver(&FileLog,"File");
00152 }
00153 return &Logger;
00154 }
00155 };