summaryrefslogtreecommitdiffstats
path: root/source/Log.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/Log.cpp')
-rw-r--r--source/Log.cpp168
1 files changed, 168 insertions, 0 deletions
diff --git a/source/Log.cpp b/source/Log.cpp
new file mode 100644
index 000000000..42c58eb27
--- /dev/null
+++ b/source/Log.cpp
@@ -0,0 +1,168 @@
+
+#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
+
+#include "Log.h"
+
+#include <fstream>
+#include <ctime>
+#include "OSSupport/MakeDir.h"
+#include "OSSupport/IsThread.h"
+
+#if defined(ANDROID_NDK)
+ #include <android/log.h>
+ #include "ToJava.h"
+#endif
+
+
+
+
+cLog* cLog::s_Log = NULL;
+
+cLog::cLog(const AString & a_FileName )
+ : m_File(NULL)
+{
+ s_Log = this;
+
+ // create logs directory
+ cMakeDir::MakeDir("logs");
+
+ OpenLog( (FILE_IO_PREFIX + std::string("logs/") + a_FileName).c_str() );
+}
+
+
+
+
+
+cLog::~cLog()
+{
+ CloseLog();
+ s_Log = NULL;
+}
+
+
+
+
+
+cLog* cLog::GetInstance()
+{
+ if(s_Log)
+ return s_Log;
+
+ new cLog("log.txt");
+ return s_Log;
+}
+
+
+
+
+
+void cLog::CloseLog()
+{
+ if( m_File )
+ fclose (m_File);
+ m_File = 0;
+}
+
+
+
+
+
+void cLog::OpenLog( const char* a_FileName )
+{
+ if(m_File) fclose (m_File);
+ #ifdef _WIN32
+ fopen_s( &m_File, a_FileName, "a+" );
+ #else
+ m_File = fopen(a_FileName, "a+" );
+ #endif
+}
+
+
+
+
+
+void cLog::ClearLog()
+{
+ #ifdef _WIN32
+ if( fopen_s( &m_File, "log.txt", "w" ) == 0)
+ fclose (m_File);
+ #else
+ m_File = fopen("log.txt", "w" );
+ if( m_File )
+ fclose (m_File);
+ #endif
+ m_File = 0;
+}
+
+
+
+
+
+void cLog::Log(const char * a_Format, va_list argList)
+{
+ AString Message;
+ AppendVPrintf(Message, a_Format, argList);
+
+ time_t rawtime;
+ time ( &rawtime );
+
+ struct tm* timeinfo;
+#ifdef _WIN32
+ struct tm timeinforeal;
+ timeinfo = &timeinforeal;
+ localtime_s(timeinfo, &rawtime );
+#else
+ timeinfo = localtime( &rawtime );
+#endif
+
+ AString Line;
+ #ifdef _DEBUG
+ Printf(Line, "[%04x|%02d:%02d:%02d] %s\n", cIsThread::GetCurrentID(), timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, Message.c_str());
+ #else
+ Printf(Line, "[%02d:%02d:%02d] %s\n", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, Message.c_str());
+ #endif
+ if (m_File)
+ {
+ fputs(Line.c_str(), m_File);
+ fflush(m_File);
+ }
+
+ // Print to console:
+#if defined(ANDROID_NDK)
+ //__android_log_vprint(ANDROID_LOG_ERROR,"MCServer", a_Format, argList);
+ __android_log_print(ANDROID_LOG_ERROR, "MCServer", "%s", Line.c_str() );
+ //CallJavaFunction_Void_String(g_JavaThread, "AddToLog", Line );
+#else
+ printf("%s", Line.c_str());
+#endif
+
+ #if defined (_WIN32) && defined(_DEBUG)
+ // In a Windows Debug build, output the log to debug console as well:
+ OutputDebugString(Line.c_str());
+ #endif // _WIN32
+}
+
+
+
+
+
+void cLog::Log(const char* a_Format, ...)
+{
+ va_list argList;
+ va_start(argList, a_Format);
+ Log( a_Format, argList );
+ va_end(argList);
+}
+
+
+
+
+
+void cLog::SimpleLog(const char* a_String)
+{
+ Log("%s", a_String );
+}
+
+
+
+