00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "flexilog.h"
00013 #include "common.h"
00014 #include "kernel.h"
00015 #include "modulehandle.h"
00016
00017 #define LOGFILE wxT("app.log")
00018
00019 using namespace VRUT;
00020
00021
00022 FlexiLog::FlexiLog(wxTextCtrl * _textCtrl)
00023 : wxLogTextCtrl(_textCtrl),
00024 textCtrl(_textCtrl),
00025 dbgout((wxFileOutputStream *)NULL), dout((wxTextOutputStream *)NULL)
00026 {
00027 syncEveryMsg = false;
00028 kernel = (Kernel *)NULL;
00029 SetLogLevel(wxLOG_Max);
00030 SetVerbose(true);
00031 logToTextCtrl = true;
00032 dbgout = new wxFileOutputStream(LOGFILE);
00033 if (dbgout && dbgout->IsOk())
00034 dout = new wxTextOutputStream(*dbgout);
00035 else
00036 LogMessage(wxT("<FlexiLog>Logging to file disabled"), wxLOG_Warning);
00037 }
00038
00039
00040 FlexiLog::~FlexiLog()
00041 {
00042 SAFE_DELETE(dout);
00043 if (dbgout)
00044 dbgout->Close();
00045 SAFE_DELETE(dbgout);
00046 }
00047
00048
00049 FlexiLog * FlexiLog::GetInstance()
00050 {
00051 wxLog * logInst = wxLog::GetActiveTarget();
00052 if (logInst)
00053 return dynamic_cast<FlexiLog *>(logInst);
00054
00055 return (FlexiLog *)NULL;
00056 }
00057
00058
00059 void FlexiLog::LogMessageFlexi(const wxString & msg, wxLogLevel loglevel)
00060 {
00061 FlexiLog * logInst = GetInstance();
00062 if (logInst)
00063 logInst->LogMessage(msg, loglevel);
00064 }
00065
00066
00067 void FlexiLog::DoLog(wxLogLevel level, const wxChar * msg, time_t timestamp)
00068 {
00069 if (dout)
00070 {
00071 wxString prep;
00072 TimeStamp(&prep);
00073 switch (level)
00074 {
00075 case wxLOG_FatalError:
00076 case wxLOG_Error:
00077 prep.Append(wxT("Error: "));
00078 break;
00079 case wxLOG_Warning:
00080 prep.Append(wxT("Warning: "));
00081 break;
00082 case wxLOG_Debug:
00083 prep.Append(wxT("Debug: "));
00084 break;
00085 case wxLOG_Info:
00086 case wxLOG_Message:
00087 case wxLOG_Status:
00088 case wxLOG_Trace:
00089 case wxLOG_Progress:
00090 default:
00091 break;
00092 }
00093 *dout << prep << msg << wxT('\n');
00094 if (syncEveryMsg)
00095 dbgout->Sync();
00096 }
00097
00098 if (logToTextCtrl)
00099 {
00100 switch (level)
00101 {
00102 case wxLOG_FatalError:
00103 case wxLOG_Error:
00104 textCtrl->SetDefaultStyle(wxTextAttr(*wxRED));
00105 break;
00106 case wxLOG_Warning:
00107 textCtrl->SetDefaultStyle(wxTextAttr(wxColour(128, 0, 0)));
00108 break;
00109 case wxLOG_Info:
00110 case wxLOG_Debug:
00111 case wxLOG_Trace:
00112 case wxLOG_Progress:
00113 textCtrl->SetDefaultStyle(wxTextAttr(wxColour(0, 128, 0)));
00114 break;
00115 case wxLOG_Message:
00116 case wxLOG_Status:
00117 default:
00118 textCtrl->SetDefaultStyle(wxTextAttr(*wxBLACK));
00119 break;
00120 }
00121 wxLogTextCtrl::DoLog(level, msg, timestamp);
00122 }
00123 }
00124
00125
00126 void FlexiLog::SetStatusText(const wxString & status)
00127 {
00128 if (textCtrl && textCtrl->GetParent())
00129 if (textCtrl->GetParent()->IsKindOf(CLASSINFO(wxFrame)))
00130 ((wxFrame *)textCtrl->GetParent())->SetStatusText(status);
00131 }
00132
00133
00134 void FlexiLog::LogMessage(const wxString & msg, wxLogLevel loglevel)
00135 {
00136 if (!kernel || kernel->GetMainThreadID() == wxThread::GetCurrentId())
00137 {
00138 switch (loglevel)
00139 {
00140 case wxLOG_FatalError:
00141 wxLogFatalError(msg);
00142 break;
00143 case wxLOG_Error:
00144 wxLogError(msg);
00145 break;
00146 case wxLOG_Warning:
00147 wxLogWarning(msg);
00148 break;
00149 case wxLOG_Info:
00150 wxLogVerbose(msg);
00151 break;
00152 case wxLOG_Debug:
00153 wxLogDebug(msg);
00154 break;
00155 case wxLOG_Trace:
00156 case wxLOG_Progress:
00157 case wxLOG_Message:
00158 wxLogMessage(msg);
00159 break;
00160 case wxLOG_Status:
00161 wxLogStatus(msg);
00162 break;
00163 }
00164 }
00165 else
00166 {
00167 wxCommandEvent ev = Event::GET_EVT_LOG(msg + wxT(" [async]"), loglevel);
00168 kernel->GetMessageSink()->PostEvent(ev);
00169 }
00170 }