XLogFile.cpp
上传用户:kklily621
上传日期:2013-06-25
资源大小:252k
文件大小:7k
开发平台:

Visual C++

  1. //=============================================================================================
  2. /*
  3. 文件: XLogFile.cpp
  4. 说明:
  5. ---------------------------------------------------
  6. 日志文件操作,用来完成日志文件的创建,日志记录
  7. 的添加和日志的查询操作。
  8. ---------------------------------------------------
  9. 工程: Xfilter 个人防火墙
  10. 作者: 朱雁辉,朱雁冰
  11. 创建日期: 2001/08/23
  12. 网址: http://www.xfilt.com
  13. 电子邮件: xstudio@xfilt.com
  14. 版权所有 (c) 2001-2002 X 工作室
  15. 警告:
  16. ---------------------------------------------------
  17. 本电脑程序受著作权法的保护。未经授权,不能使用
  18. 和修改本软件全部或部分源代码。凡擅自复制、盗用或散
  19. 布此程序或部分程序或者有其它任何越权行为,将遭到民
  20. 事赔偿及刑事的处罚,并将依法以最高刑罚进行追诉。
  21. 凡通过合法途径购买本软件源代码的用户被默认授权
  22. 可以在自己的程序中使用本软件的部分代码,但作者不对
  23. 代码产生的任何后果负责。
  24. 使用了本软件代码的程序只能以可执行文件形式发布,
  25. 未经特别许可,不能将含有本软件源代码的源程序以任何
  26. 形式发布。
  27. ---------------------------------------------------
  28. */
  29. //=============================================================================================
  30. #include "stdafx.h"
  31. #include "XLogFile.h"
  32. CXLogFile::CXLogFile()
  33. {
  34. InitializeCriticalSection(&gCriticalSectionLog);
  35. m_sPathName = CAclFile::GetAppPath() + LOG_FILE_NAME;
  36. m_LogFile.m_hFile = NULL;
  37. }
  38. CXLogFile::~CXLogFile()
  39. {
  40. CloseLog();
  41. }
  42. //=============================================================================================
  43. // Private log file operator function
  44. int CXLogFile::CreateLog(const TCHAR *sPathName)
  45. {
  46. TRY
  47. {
  48. m_LogFile.Open( sPathName,
  49. CFile::modeCreate | 
  50. CFile::modeWrite | 
  51. CFile::typeBinary | 
  52. CFile::shareExclusive
  53. );
  54. _tcscpy(m_LogHeader.Singnature, ACL_HEADER_SIGNATURE);
  55. m_LogHeader.RecordCount = 0;
  56. m_LogHeader.CurrentPosition = LOG_HEADER_LENTH;
  57. int iRet;
  58. if(iRet = WriteHeader() != XERR_SUCCESS)
  59. return iRet;
  60. ODS2(_T("XFILE: Success create the file "),sPathName);
  61. CloseLog();
  62. }
  63. CATCH( CFileException, e )
  64. {
  65. ODS2(_T("XFILE: Can't create the file:"), sPathName);
  66. return XERR_FILE_CREATE_FAILURE;
  67. }
  68. END_CATCH
  69. return XERR_SUCCESS;
  70. }
  71. int CXLogFile::WriteHeader()
  72. {
  73. TRY
  74. {
  75. m_LogFile.SeekToBegin();
  76. m_LogFile.Write(&m_LogHeader, LOG_HEADER_LENTH);
  77. }
  78. CATCH( CFileException, e )
  79. {
  80. return XERR_FILE_WRITER_HEADER_ERROR;
  81. }
  82. END_CATCH
  83. return XERR_SUCCESS;
  84. }
  85. int CXLogFile::OpenLog()
  86. {
  87. if(_taccess(m_sPathName, 0) == -1) // file not exists & create
  88. {
  89. DP1(_T("XFILE: Log file %s not exists.n"), LOG_FILE_NAME);
  90. int iRet;
  91. if((iRet = CreateLog(m_sPathName)) != XERR_SUCCESS)
  92. return iRet;
  93. }
  94. TRY // open file
  95. {
  96. m_LogFile.Open( m_sPathName,
  97. CFile::modeReadWrite    |
  98. CFile::typeBinary | 
  99. CFile::shareDenyNone   
  100. );
  101. m_LogFile.Read(&m_LogHeader, LOG_HEADER_LENTH);
  102. if(_tcscmp(m_LogHeader.Singnature, ACL_HEADER_SIGNATURE) != 0)
  103. return XERR_FILE_INVALID_SIGNATURE;
  104. if(!m_LogFile.GetStatus(m_FileStatus))
  105. return XERR_GET_FILE_STATUS_ERROR;
  106. if(m_FileStatus.m_attribute == 0x01)
  107. return XERR_FILE_READ_ONLY;
  108. DP1(_T("XFILE: Success open the file of %sn"), LOG_FILE_NAME);
  109. }
  110. CATCH( CFileException, e )
  111. {
  112. DP1(_T("XFILE: Can't open the file of %sn"), LOG_FILE_NAME);
  113. return XERR_FILE_CAN_NOT_OPEN;
  114. }
  115. END_CATCH
  116. return XERR_SUCCESS;
  117. }
  118. int CXLogFile::CloseLog()
  119. {
  120. m_LogFile.Close();
  121. m_LogFile.m_hFile = NULL;
  122. return XERR_SUCCESS;
  123. }
  124. //=============================================================================================
  125. // Public log file operator function
  126. int CXLogFile::AddLog(SESSION *session, long MaxLogSize)
  127. {
  128. int iRet;
  129. if(m_LogFile.m_hFile == NULL)
  130. {
  131. if((iRet = OpenLog()) != XERR_SUCCESS)
  132. return iRet;
  133. }
  134. #if _DEBUG
  135. CString a;
  136. a.Format("file size: %u; max log size: %u; one record lenth: %u; 
  137. after add file size: %u; Current Position: %u; Log Header Lenth: %u"
  138. , m_FileStatus.m_size
  139. , MaxLogSize * FILE_SIZE_1M_BYTES
  140. , RESULT_ONE_RECORD_LENTH
  141. , MaxLogSize * FILE_SIZE_1M_BYTES - RESULT_ONE_RECORD_LENTH
  142. , m_LogHeader.CurrentPosition
  143. , LOG_HEADER_LENTH
  144. );
  145. OutputDebugString(a);
  146. #endif
  147. DWORD PreAddFileSize = MaxLogSize * FILE_SIZE_1M_BYTES - RESULT_ONE_RECORD_LENTH;
  148. if(m_LogHeader.CurrentPosition > PreAddFileSize)
  149. {
  150. m_LogHeader.CurrentPosition = LOG_HEADER_LENTH;
  151. if(iRet = WriteHeader() != XERR_SUCCESS)
  152. return iRet;
  153. }
  154. TRY
  155. {
  156. session->s = m_LogHeader.CurrentPosition;
  157. m_LogFile.Seek(m_LogHeader.CurrentPosition, CFile::begin);
  158. m_LogFile.Write(session, SESSION_LENTH);
  159. m_LogHeader.CurrentPosition = m_LogFile.GetPosition();
  160. m_LogHeader.RecordCount ++;
  161. if(iRet = WriteHeader() != XERR_SUCCESS)
  162. return iRet;
  163. DP1(_T("XFILE: Success add a record to the file of %sn"), LOG_FILE_NAME);
  164. }
  165. CATCH( CFileException, e )
  166. {
  167. DP1(_T("XFILE: Can't add record to the file of %sn"), LOG_FILE_NAME);
  168. return XERR_FILE_ADD_ERROR;
  169. }
  170. END_CATCH
  171. return XERR_SUCCESS;
  172. }
  173. int CXLogFile::FindLog(LOG_FIND *logfind, long MaxLogSize)
  174. {
  175. if(m_LogFile.m_hFile == NULL)
  176. {
  177. int iRet;
  178. if((iRet = OpenLog()) == XERR_FILE_CAN_NOT_OPEN)
  179. return iRet;
  180. }
  181. m_LogFile.SeekToBegin();
  182. m_LogFile.Read(&m_LogHeader, LOG_HEADER_LENTH);
  183. SESSION session;
  184. DWORD ulLenth = m_LogFile.GetLength();
  185. DWORD ulMaxLenth = MaxLogSize * FILE_SIZE_1M_BYTES;
  186. DWORD ulCurrentPosition = 0;
  187. int iIsChangeDirection = 0;
  188. logfind->ulChangeDirectionIndex = 0;
  189. logfind->ulRecordCount = 0;
  190. logfind->ulStartPosition = 0;
  191. TRY
  192. {
  193. m_LogFile.Seek(LOG_HEADER_LENTH, CFile::begin);
  194. ulCurrentPosition = m_LogFile.GetPosition();
  195. while(ulCurrentPosition < ulLenth && ulCurrentPosition < ulMaxLenth)
  196. {
  197. m_LogFile.Read(&session, SESSION_LENTH);
  198. ulCurrentPosition = m_LogFile.GetPosition();
  199. if(session.tStartTime >= logfind->tStartTime
  200. && session.tEndTime <= logfind->tEndTime)
  201. {
  202. if(logfind->ulRecordCount != 1 
  203. && m_LogHeader.CurrentPosition == (ulCurrentPosition - SESSION_LENTH))
  204. {
  205. iIsChangeDirection = 2;
  206. logfind->ulChangeDirectionIndex = logfind->ulRecordCount;
  207. logfind->ulStartPosition = ulCurrentPosition - SESSION_LENTH;
  208. }
  209. logfind->ulRecordCount ++;
  210. if(logfind->ulRecordCount == 1 || iIsChangeDirection == 1)
  211. logfind->ulStartPosition = ulCurrentPosition - SESSION_LENTH;
  212. if(iIsChangeDirection == 1)
  213. iIsChangeDirection = 2;
  214. }
  215. else if(logfind->ulRecordCount > 0 && iIsChangeDirection != 1)
  216. {
  217. iIsChangeDirection = 1;
  218. logfind->ulChangeDirectionIndex = logfind->ulRecordCount;
  219. }
  220. }
  221. logfind->ulChangeDirectionIndex = logfind->ulRecordCount - logfind->ulChangeDirectionIndex;
  222. }
  223. CATCH( CFileException, e )
  224. {
  225. ODS(_T("XFILE: Find Log Error."));
  226. return XERR_FILE_RECORD_CAN_NOT_FIND;
  227. }
  228. END_CATCH
  229. return XERR_SUCCESS;
  230. }