Log.cpp
上传用户:surprise9
上传日期:2007-01-04
资源大小:426k
文件大小:5k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // This is part of the WAR SOFTWARE SERIES initiated by Jarle Aase
  2. // Copyright 1996 by Jarle Aase. All rights reserved.
  3. // See the "War Software Series Licende Agreement" for details concerning 
  4. // use and distribution.
  5. // ---
  6. // This source code, executables and programs containing source code or
  7. // binaries or proprietetary technology from the War Software Series are
  8. // NOT alloed used, viewed or tested by any governmental agencies in
  9. // any countries. This includes the government, departments, police, 
  10. // military etc.
  11. // ---
  12. // This file is intended for use with Tab space = 2
  13. // Created and maintained in MSVC Developer Studio
  14. // ---
  15. // NAME : Log.cpp
  16. // PURPOSE : General logging classes for all applications.
  17. // PROGRAM : 
  18. // DATE : Sept. 19 1996
  19. // AUTHOR : Jarle Aase
  20. // ---
  21. // REVISION HISTORY
  22. // 
  23. #include "stdafx.h"
  24. #include "Resource.h"
  25. #include "WarSoftware.h"
  26. #ifdef _DEBUG
  27. #define new DEBUG_NEW
  28. #undef THIS_FILE
  29. static char THIS_FILE[] = __FILE__;
  30. #endif
  31. ////////////////////////////////////////////////////////////////////
  32. // General Logging classes
  33. CLog *CLog::m_pLog;
  34. CLog::CLog()
  35. {
  36. m_LogQueue.Empty();
  37. m_UseHistory = TRUE;
  38. m_EventHandle = CDaemonEvent::DsRegister(EVT_LOG, (LPVOID)this, SendHistory);
  39. if (!m_pLog)
  40. m_pLog = this;
  41. m_Flags = 0xffffffff; // Turn all flags on..
  42. }
  43. CLog::~CLog()
  44. {
  45. if (m_pLog == this)
  46. m_pLog = NULL;
  47. if (m_EventHandle)
  48. CDaemonEvent::DsClose(m_EventHandle);
  49. m_LogHistory.KillAll();
  50. //ASSERT(m_LogQueue.IsEmpty());
  51. m_LogQueue.Empty();
  52. }
  53. void CLog::LogMsg(int LogType, LPCSTR Format, ...)
  54. {
  55. if (!ShouldLog(this, LogType))
  56. return;
  57. ASSERT(AfxIsValidString(Format, FALSE));
  58. va_list argList;
  59. va_start(argList, Format);
  60. LogMsgV(LogType, Format, argList);
  61. va_end(argList);
  62. }
  63. void CLog::LogMsgV(int LogType, LPCTSTR Format, va_list argList)
  64. {
  65. if (!ShouldLog(this, LogType))
  66. return;
  67. va_list argListSave = argList;
  68. if (Format)
  69. {
  70. CWarString cBuf, cCurrentLogLine;
  71. char tbuf[32];
  72. if (!(LogType &
  73. (LOGF_SYSTEM |
  74. (int)m_LogDebug |
  75. ((int)m_LogErrors << 1) |
  76. ((int)m_LogFileAccess << 2) |
  77. ((int)m_LogInOut << 3) |
  78. ((int)m_LogSecurity << 4) |
  79. ((int)m_LogWarnings << 5) |
  80. ((int)m_LogWinsock << 7))))
  81. {
  82. goto done;
  83. }
  84. cBuf.Format("[%s%s%s%s%s%s%s%s %s] ",
  85. LogType & LOGF_SYSTEM ? "S" : "",
  86. LogType & LOGF_DEBUG ? "D" : "",
  87. LogType & LOGF_ERROR ? "E" : "",
  88. LogType & LOGF_FILEACC ? "F" : "",
  89. LogType & LOGF_INOUT ? "L" : "",
  90. LogType & LOGF_SECURITY ? "C" : "",
  91. LogType & LOGF_WARNINGS ? "W" : "",
  92. LogType & LOGF_WINSOCK ? "N" : "",
  93. MyTime(tbuf));
  94. cCurrentLogLine = cBuf;
  95. cBuf.FormatVaList(Format, argList);
  96. cCurrentLogLine += cBuf;
  97. cCurrentLogLine += "rn";
  98. m_Lock.Lock();
  99. m_LogQueue += cCurrentLogLine;
  100. // Add to history list
  101. if (m_UseHistory)
  102. m_LogHistory.Add(cCurrentLogLine, m_LogLines);
  103. m_Lock.Unlock();
  104. if (m_EventHandle)
  105. CDaemonEvent::DsEvent(m_EventHandle, cCurrentLogLine);
  106. LoggedLine(LogType, cCurrentLogLine);
  107. }
  108. Flush(FALSE);
  109. done:
  110. va_end(argListSave);
  111. }
  112. void CLog::LoggedLine(int LogType, LPCSTR Line)
  113. {
  114. // Override to log to window...
  115. }
  116. LPCSTR CLog::MyTime(LPSTR buf)
  117. {
  118. SYSTEMTIME st;
  119. GetLocalTime(&st);
  120. return FormatTime(st, buf);
  121. }
  122. LPCSTR CLog::FormatTime(SYSTEMTIME& st, LPSTR buf)
  123. {
  124. sprintf(buf,"%04d %02d %02d %02d:%02d", 
  125. st.wYear,
  126. st.wMonth,
  127. st.wDay,
  128. st.wHour,
  129. st.wMinute);
  130. return buf;
  131. }
  132. BOOL CLog::Flush(BOOL Force)
  133. {
  134. CFile File;
  135. BOOL Rval = TRUE;
  136. m_Lock.Lock();
  137. // Optimize flags.
  138. m_Flags = LOGF_SYSTEM;
  139. m_Flags |= m_LogDebug ? LOGF_DEBUG : 0;
  140. m_Flags |= m_LogErrors ? LOGF_ERROR : 0;
  141. m_Flags |= m_LogFileAccess ? LOGF_FILEACC : 0;
  142. m_Flags |= m_LogInOut ? LOGF_INOUT : 0;
  143. m_Flags |= m_LogSecurity ? LOGF_SECURITY : 0;
  144. m_Flags |= m_LogWarnings ? LOGF_WARNINGS : 0;
  145. m_Flags |= m_LogWinsock ? LOGF_WINSOCK : 0;
  146. if (m_LogFile.GetLength() && (Force || m_Timer.TimeOut(m_Delay * 1000)))
  147. {
  148. CFileException FileEx;
  149. CString cLogFile;
  150. ExpandStringMacros(m_LogFile, cLogFile);
  151. ExpandPath(cLogFile);
  152. if (File.Open(cLogFile,
  153. CFile::modeWrite
  154. | CFile::modeCreate
  155. | CFile::modeNoTruncate
  156. | CFile::shareExclusive,
  157. &FileEx))
  158. {
  159. m_Timer.Reset();
  160. try
  161. {
  162. File.SeekToEnd();
  163. File.Write(m_LogQueue,m_LogQueue.GetLength());
  164. File.Close();
  165. m_LogQueue.Empty();
  166. }
  167. catch(CFileException* theException)
  168. {
  169. File.Close();
  170. theException->Delete();
  171. LogMsg(LOGF_WARNINGS,"CLog::Flush(): File IO failed.");
  172. goto failed;
  173. }
  174. }
  175. else
  176. {
  177. failed:
  178. // Failed to open file. If the buffer is too large, we just empty it...
  179. if (m_LogQueue.GetLength() > (1024 * 16))
  180. {
  181. m_LogQueue.Empty();
  182. LogMsg(LOGF_WARNINGS,"CLog::Flush(): Failed to flush logfile. Log buffer trashed due to buffer overflow.");
  183. Rval = FALSE;
  184. }
  185. }
  186. }
  187. m_Lock.Unlock();
  188. return Rval;
  189. }
  190. void CLog::SendHistory(LPVOID pOrigin, CDaemonEvent *pCliEv)
  191. {
  192. CString *cs;
  193. CLog *pLog = (CLog *)pOrigin;
  194. ASSERT(AfxIsValidAddress(pLog, sizeof(CLog)));
  195. CLinkedListItem *Item = pLog->m_LogHistory.First();
  196. while(Item)
  197. {
  198. cs = (CString *)pLog->m_LogHistory.Ptr(Item);
  199. ASSERT(AfxIsValidString(*cs));
  200. pCliEv->DsEvent(pLog->m_EventHandle, *cs);
  201. Item = pLog->m_LogHistory.Next(Item);
  202. }
  203. }