升龙物业 老版本 ocx IPO, 加密狗 转值班电话

AgentLog.cpp 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <io.h>
  4. #include "AgentLog.h"
  5. #include "AgentEventManager.h"
  6. #include "AgentClient.h"
  7. /*
  8. * 函数名称:CAgentLog(CAgentClient*)
  9. * 概要分析:构造函数
  10. */
  11. CAgentLog::CAgentLog( CAgentClient *a_pAgentClient )
  12. {
  13. m_bOpen = false;
  14. m_bShowLogInfo = false;
  15. m_nLogLineInMemory = 0;
  16. memset( m_sLogFileDir, 0, sizeof(m_sLogFileDir) );
  17. m_pLogFile = NULL;
  18. m_pEventManager = NULL;
  19. m_nLogAgentNumber = 0;
  20. m_pAgentClient = a_pAgentClient;
  21. }
  22. /*
  23. * 函数名称:~CAgentLog()
  24. * 概要分析:析构函数
  25. */
  26. CAgentLog::~CAgentLog()
  27. {
  28. if( m_pLogFile != NULL )
  29. {
  30. fclose(m_pLogFile);
  31. m_pLogFile = NULL;
  32. }
  33. }
  34. /*
  35. * 函数名称:SetOpen(bool)
  36. * 概要分析:设置日志的开关
  37. */
  38. void CAgentLog::SetOpen(BOOL a_bOpen)
  39. {
  40. m_bOpen = a_bOpen;
  41. if( a_bOpen == TRUE )
  42. {
  43. // 1.获取ocx所在的当前目录
  44. char tmpStrOcxDir[1024];
  45. char tmpStrLogDir[1024];
  46. char acDir[1024];
  47. char acBuf[1024];
  48. char acText[1024];
  49. int i = 0;
  50. memset( tmpStrOcxDir, 0, sizeof(tmpStrOcxDir) );
  51. memset( tmpStrLogDir, 0, sizeof(tmpStrLogDir) );
  52. memset( acDir, 0, sizeof(acDir) );
  53. memset( acBuf, 0, sizeof(acBuf) );
  54. memset( acText, 0, sizeof(acText) );
  55. ::GetModuleFileNameA( AfxGetInstanceHandle(), acDir, sizeof(acDir) );
  56. ::GetShortPathName( acDir, acBuf, sizeof(acBuf) );
  57. ::GetLongPathName( acBuf, acText, sizeof(acText) );
  58. for( i=(strlen(acText)-1); i>=0; i-- )
  59. {
  60. if( acText[i] == '\\' )
  61. {
  62. acText[i] = '\0';
  63. break;
  64. }
  65. }
  66. strcpy_s( tmpStrOcxDir, sizeof(tmpStrOcxDir), acText );
  67. // 2.创建ocx日志存放目录
  68. lstrcpy( tmpStrLogDir, tmpStrOcxDir );
  69. strcat_s( tmpStrLogDir, "\\ocx_log\\" );
  70. if( CreateDirectoryA(tmpStrLogDir, NULL) == FALSE )
  71. {
  72. }
  73. // 3.保存ocx日志存放目录
  74. strcpy_s( m_sLogFileDir, sizeof(m_sLogFileDir), tmpStrLogDir );
  75. // 4.创建当前座席的日志文件
  76. if( m_pLogFile == NULL )
  77. {
  78. OpenLogFile();
  79. }
  80. }
  81. }
  82. /*
  83. * 函数名称:SetShowLogInfo(bool)
  84. * 概要分析:设置日志的前端是否显示
  85. */
  86. void CAgentLog::SetShowLogInfo( BOOL a_bFlag )
  87. {
  88. m_bShowLogInfo = a_bFlag;
  89. }
  90. /*
  91. * 函数名称:OpenLogFile()
  92. * 概要分析:打开指定的日志文件
  93. */
  94. void CAgentLog::OpenLogFile()
  95. {
  96. SYSTEMTIME tmpSysTime;
  97. char tmpStrLogFilePath[1024];
  98. memset( tmpStrLogFilePath, 0, sizeof(tmpStrLogFilePath) );
  99. if( strcmp(m_sLogFileDir,"") == 0 )
  100. {
  101. return;
  102. }
  103. else
  104. {
  105. // 1.获取系统的当前时间,然后创建日志文件的路径
  106. ::GetSystemTime( &tmpSysTime );
  107. sprintf_s( tmpStrLogFilePath, 1024, "%s\\ocx_log_Agent%d_%d-%d-%d.txt", m_sLogFileDir, m_pAgentClient->GetAgentNumber(), tmpSysTime.wYear, tmpSysTime.wMonth, tmpSysTime.wDay );
  108. // 2.查看文件是否存在,然后打开,读写追加
  109. if( (_access_s(tmpStrLogFilePath, 0)) == 0 )
  110. {
  111. // 3.文件存在,以追加方式打开当天的日志文件
  112. if( fopen_s(&m_pLogFile, tmpStrLogFilePath, "at+") != 0)
  113. {
  114. ::MessageBoxA( NULL, "追加打开日志文件失败", "Test", MB_OK );
  115. return;
  116. }
  117. }
  118. else
  119. {
  120. // 4.文件不存在,则创建当天的日志文件
  121. if( fopen_s(&m_pLogFile, tmpStrLogFilePath, "wt+") != 0 )
  122. {
  123. ::MessageBoxA( NULL, "读写打开一个新文件", "Test", MB_OK );
  124. return;
  125. }
  126. }
  127. }
  128. }
  129. /*
  130. * 函数名称:CloseLogFile()
  131. * 概要分析:关闭指定的日志文件
  132. */
  133. void CAgentLog::CloseLogFile()
  134. {
  135. if( m_pLogFile != NULL )
  136. {
  137. ::fclose( m_pLogFile );
  138. m_pLogFile = NULL;
  139. }
  140. }
  141. /*****日志log操作*************************************************************/
  142. /*
  143. * 函数名称:Log(char*,...)
  144. * 概要分析:记录信息到ocx所在目录下的文件夹
  145. */
  146. void CAgentLog::Log( char *a_sFormat, ... )
  147. {
  148. if( m_bOpen == TRUE )
  149. {
  150. // 1.判断文件指针是否为NULL
  151. if( m_pLogFile == NULL )
  152. {
  153. OpenLogFile();
  154. }
  155. // 2.记录系统的时间
  156. SYSTEMTIME tmpSysTime;
  157. ::GetLocalTime( &tmpSysTime);
  158. // 3.格式化消息内容
  159. char tmpStrSzMsg[1024];
  160. va_list ap;
  161. memset( tmpStrSzMsg, 0, sizeof(tmpStrSzMsg) );
  162. va_start( ap, a_sFormat );
  163. vsprintf_s( tmpStrSzMsg, a_sFormat, ap );
  164. // 4.把时间也存到消息内容里面:
  165. char tmpSzLogInfo[1024];
  166. memset( tmpSzLogInfo, 0, sizeof(tmpSzLogInfo) );
  167. sprintf_s( tmpSzLogInfo, 1024, "[%d-%d-%d %d:%d:%d.%d] ", tmpSysTime.wYear,
  168. tmpSysTime.wMonth,
  169. tmpSysTime.wDay,
  170. tmpSysTime.wHour,
  171. tmpSysTime.wMinute,
  172. tmpSysTime.wSecond,
  173. tmpSysTime.wMilliseconds );
  174. strcat_s( tmpSzLogInfo, sizeof(tmpSzLogInfo), tmpStrSzMsg );
  175. strcat_s( tmpSzLogInfo, sizeof(tmpSzLogInfo), "\n" );
  176. // 3.把消息内容写入到文件中,录入计数器累加
  177. if( m_pLogFile == NULL )
  178. {
  179. return;
  180. }
  181. ::fputs( tmpSzLogInfo, m_pLogFile );
  182. m_nLogLineInMemory++;
  183. // 4.触发前端信息显示事件
  184. if( m_bShowLogInfo == TRUE )
  185. {
  186. CString tmpStrMsg;
  187. tmpStrMsg.Format( "%s", tmpSzLogInfo );
  188. m_pAgentClient->GetEventManager()->Fire_Evt_ShowInfo( tmpStrMsg );
  189. }
  190. // 5.查看在内存中日志录入的行数
  191. if( m_nLogLineInMemory >= MAX_LOG_LINE_IN_MEMORY )
  192. {
  193. // 6.清空录入计数器
  194. m_nLogLineInMemory = 0;
  195. // 7.把内存中的数据记录到磁盘日志文件
  196. CloseLogFile();
  197. // 8.然后再次打开磁盘日志文件
  198. OpenLogFile();
  199. }
  200. }
  201. }
  202. /*
  203. * 函数名称:Log(CString)
  204. * 概要分析:录入信息到磁盘文件
  205. */
  206. void CAgentLog::Log( CString a_sLogMsg )
  207. {
  208. if( m_bOpen == TRUE )
  209. {
  210. // 1.判断文件指针是否为NULL
  211. if( m_pLogFile == NULL )
  212. {
  213. OpenLogFile();
  214. }
  215. // 2.标准化消息内容,把CString字符串对象转换为char*字符串指针
  216. char *tmpLpStrMsg = NULL;
  217. tmpLpStrMsg = a_sLogMsg.GetBuffer();
  218. // 3.把消息内容写入到文件中,录入计数器累加
  219. if( m_pLogFile == NULL )
  220. {
  221. return;
  222. }
  223. ::fputs( tmpLpStrMsg, m_pLogFile );
  224. m_nLogLineInMemory++;
  225. // 4.触发前端信息显示事件
  226. if( m_bShowLogInfo == TRUE )
  227. {
  228. CString tmpStrShowInfo = a_sLogMsg+"\n";
  229. m_pAgentClient->GetEventManager()->Fire_Evt_ShowInfo( tmpStrShowInfo );
  230. }
  231. // 5.查看在内存中日志录入的行数
  232. if( m_nLogLineInMemory >= MAX_LOG_LINE_IN_MEMORY )
  233. {
  234. // 6.清空录入计数器
  235. m_nLogLineInMemory = 0;
  236. // 7.把内存中的数据记录到磁盘日志文件
  237. CloseLogFile();
  238. // 8.然后再次打开磁盘日志文件
  239. OpenLogFile();
  240. }
  241. // 9.一定要记得调用CString.ReleaseBuffer(),避免内存泄露
  242. a_sLogMsg.ReleaseBuffer();
  243. }
  244. }