诸暨麻将添加redis
您不能選擇超過 %s 個話題 話題必須以字母或數字為開頭,可包含連接號 ('-') 且最長為 35 個字
 
 
 
 
 
 

485 行
14 KiB

  1. #include "StdAfx.h"
  2. #include "TraceService.h" // #include "EventService.h"
  3. //////////////////////////////////////////////////////////////////////////
  4. //颜色定义
  5. #define COLOR_TIME RGB(0,0,0)
  6. #define COLOR_NORMAL RGB(125,125,125)
  7. #define COLOR_WARN RGB(255,128,0)
  8. #define COLOR_EXCEPTION RGB(200,0,0)
  9. #define COLOR_DEBUG RGB(0,128,128)
  10. #define EVENT_LEVEL_COUNT 5
  11. #define IDM_MENU0 100
  12. #define IDM_MENU1 110
  13. #define IDM_MENU2 120
  14. #define IDM_MENU3 130
  15. #define IDM_MENU4 140
  16. #define IDM_MENU5 150
  17. //////////////////////////////////////////////////////////////////////////
  18. //追踪服务
  19. //////////////////////////////////////////////////////////////////////////
  20. static ITraceService *g_pITraceService = NULL;
  21. //函数定义
  22. //////////////////////////////////////////////////////////////////////////
  23. //构造函数
  24. CTraceService::CTraceService()
  25. {
  26. }
  27. //服务配置
  28. //////////////////////////////////////////////////////////////////////////
  29. //设置服务
  30. bool CTraceService::SetTraceService(IUnknownEx * pIUnknownEx)
  31. {
  32. g_pITraceService = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, ITraceService);
  33. return NULL != g_pITraceService;
  34. }
  35. //获取服务
  36. VOID * CTraceService::GetTraceService(const IID & Guid, DWORD dwQueryVer)
  37. {
  38. ASSERT(g_pITraceService);
  39. if (g_pITraceService) return NULL;
  40. return (VOID*)g_pITraceService->QueryInterface(Guid, dwQueryVer);
  41. return NULL;
  42. }
  43. //获取服务
  44. VOID * CTraceService::GetTraceServiceManager(const IID & Guid, DWORD dwQueryVer)
  45. {
  46. return NULL;
  47. }
  48. //状态管理
  49. //////////////////////////////////////////////////////////////////////////
  50. //追踪状态
  51. bool CTraceService::IsEnableTrace(enTraceLevel TraceLevel)
  52. {
  53. return false;
  54. }
  55. //追踪控制
  56. bool CTraceService::EnableTrace(enTraceLevel TraceLevel, bool bEnableTrace)
  57. {
  58. return false;
  59. }
  60. //功能函数
  61. //////////////////////////////////////////////////////////////////////////
  62. //追踪信息
  63. bool CTraceService::TraceString(LPCTSTR pszString, enTraceLevel TraceLevel)
  64. {
  65. if (TraceLevel == TraceLevel_Debug)
  66. return false;
  67. if (g_pITraceService)
  68. return g_pITraceService->TraceString(pszString, TraceLevel);
  69. return false;
  70. }
  71. //////////////////////////////////////////////////////////////////////////
  72. //追踪服务
  73. //////////////////////////////////////////////////////////////////////////
  74. BEGIN_MESSAGE_MAP(CTraceServiceControl, CRichEditCtrl)
  75. ON_WM_RBUTTONDOWN()
  76. ON_COMMAND(IDM_MENU0, OnCopyString)
  77. ON_COMMAND(IDM_MENU1, OnSelectAll)
  78. ON_COMMAND(IDM_MENU2, OnDeleteString)
  79. ON_COMMAND(IDM_MENU3, OnClearAll)
  80. ON_COMMAND(IDM_MENU4, OnSaveString)
  81. END_MESSAGE_MAP()
  82. //函数定义
  83. //////////////////////////////////////////////////////////////////////////
  84. //构造函数
  85. CTraceServiceControl::CTraceServiceControl()
  86. {
  87. CTraceService::SetTraceService((IUnknownEx*)QueryInterface(IID_IUnknownEx, VER_IUnknownEx));
  88. }
  89. //析构函数
  90. CTraceServiceControl::~CTraceServiceControl()
  91. {
  92. CTraceService::SetTraceService(NULL);
  93. }
  94. //基础接口
  95. //////////////////////////////////////////////////////////////////////////
  96. //接口查询
  97. VOID * CTraceServiceControl::QueryInterface(const IID & Guid, DWORD dwQueryVer)
  98. {
  99. QUERYINTERFACE(ITraceService, Guid, dwQueryVer);
  100. QUERYINTERFACE_IUNKNOWNEX(ITraceService, Guid, dwQueryVer);
  101. return NULL;
  102. }
  103. //信息接口
  104. //////////////////////////////////////////////////////////////////////////
  105. //追踪信息
  106. bool CTraceServiceControl::TraceString(LPCTSTR pszString, enTraceLevel TraceLevel)
  107. {
  108. //效验参数
  109. ITraceService *pITraceService = (ITraceService*)(QueryInterface(IID_ITraceService, VER_ITraceService));
  110. ASSERT(pITraceService != NULL);
  111. if (pITraceService == NULL) return false;
  112. //变量定义
  113. CHARFORMAT2 CharFormat;
  114. ZeroMemory(&CharFormat, sizeof(CharFormat));
  115. //构造数据
  116. CharFormat.cbSize = sizeof(CharFormat);
  117. CharFormat.dwMask = CFM_COLOR | CFM_BACKCOLOR;
  118. CTraceServiceControl *pRichEditTrace = static_cast<CTraceServiceControl*>(pITraceService);
  119. if (pRichEditTrace == NULL) return false;
  120. CharFormat.crTextColor = RGB(0, 0, 0);
  121. CharFormat.crBackColor = RGB(255, 255, 255);
  122. lstrcpyn(CharFormat.szFaceName, TEXT("宋体"), sizeof(CharFormat.szFaceName));
  123. //获取时间
  124. SYSTEMTIME SystemTime;
  125. TCHAR szTimeBuffer[4098] = { 0 };
  126. ZeroMemory(szTimeBuffer, sizeof(TCHAR)*4096);
  127. GetLocalTime(&SystemTime);
  128. _snwprintf(szTimeBuffer, sizeof(szTimeBuffer), TEXT("【 %04d-%02d-%02d %02d:%02d:%02d 】"), SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay, SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond);
  129. // InsertString(szTimeBuffer, CharFormat);
  130. //长度判断
  131. int iLen = wcslen(pszString);
  132. if (iLen > 3800)
  133. {
  134. _sntprintf(szTimeBuffer, sizeof(szTimeBuffer), TEXT("%s%s\n"), szTimeBuffer, _T("输出信息超长,信息请小于4K。"));
  135. }
  136. else
  137. {
  138. _sntprintf(szTimeBuffer, sizeof(szTimeBuffer), TEXT("%s%s\n"), szTimeBuffer, pszString);
  139. }
  140. CharFormat.crTextColor = pRichEditTrace->GetTraceColor(TraceLevel);
  141. return InsertString(szTimeBuffer, CharFormat);
  142. }
  143. //重载函数
  144. //////////////////////////////////////////////////////////////////////////
  145. //绑定函数
  146. VOID CTraceServiceControl::PreSubclassWindow()
  147. {
  148. __super::PreSubclassWindow();
  149. CTraceService::SetTraceService((IUnknownEx*)QueryInterface(IID_IUnknownEx, VER_IUnknownEx));
  150. }
  151. //功能函数
  152. //////////////////////////////////////////////////////////////////////////
  153. //加载消息
  154. bool CTraceServiceControl::LoadMessage(LPCTSTR pszFileName)
  155. {
  156. if (static_cast<CTraceServiceControl*>(g_pITraceService) == NULL) return false;
  157. return static_cast<CTraceServiceControl*>(g_pITraceService)->LoadMessage(pszFileName);
  158. }
  159. //保存信息
  160. bool CTraceServiceControl::SaveMessage(LPCTSTR pszFileName)
  161. {
  162. if (static_cast<CTraceServiceControl*>(g_pITraceService) == NULL) return false;
  163. return static_cast<CTraceServiceControl*>(g_pITraceService)->SaveMessage(pszFileName);
  164. }
  165. //设置参数
  166. bool CTraceServiceControl::SetParameter(LONG lMaxLineCount, LONG lReserveLineCount)
  167. {
  168. m_lMaxLineCount = lMaxLineCount; //最大行数
  169. m_lReserveLineCount = lReserveLineCount; //保留行数
  170. return true;
  171. }
  172. //辅助函数
  173. //////////////////////////////////////////////////////////////////////////
  174. //配置服务
  175. VOID CTraceServiceControl::InitializeService()
  176. {
  177. }
  178. //获取颜色
  179. COLORREF CTraceServiceControl::GetTraceColor(enTraceLevel TraceLevel)
  180. {
  181. switch (TraceLevel)
  182. {
  183. case TraceLevel_Info:
  184. return RGB(133, 124, 129);
  185. break;
  186. case TraceLevel_Normal:
  187. return RGB(133, 124, 129);
  188. break;
  189. case TraceLevel_Warning:
  190. return RGB(255, 0, 0);
  191. break;
  192. case TraceLevel_Exception:
  193. return RGB(255, 0, 0);
  194. break;
  195. case TraceLevel_Debug:
  196. return RGB(19, 127, 140);
  197. break;
  198. }
  199. return RGB(0, 0, 0);
  200. }
  201. //字符判断
  202. bool EfficacyUrlChar(TCHAR chChar)
  203. {
  204. //特殊字符
  205. if (chChar == TEXT('.')) return true;
  206. if (chChar == TEXT('=')) return true;
  207. if (chChar == TEXT('+')) return true;
  208. if (chChar == TEXT('?')) return true;
  209. if (chChar == TEXT('#')) return true;
  210. if (chChar == TEXT('%')) return true;
  211. if (chChar == TEXT('/')) return true;
  212. if (chChar == TEXT(':')) return true;
  213. if (chChar == TEXT('&')) return true;
  214. //字符范围
  215. if ((chChar >= TEXT('a')) && (chChar <= TEXT('z'))) return true;
  216. if ((chChar >= TEXT('A')) && (chChar <= TEXT('Z'))) return true;
  217. if ((chChar >= TEXT('0')) && (chChar <= TEXT('9'))) return true;
  218. return false;
  219. }
  220. //地址判断
  221. bool EfficacyUrlString(LPCTSTR pszUrl)
  222. {
  223. for (WORD i = 0; i < wcslen(pszUrl); i++)
  224. {
  225. if (!EfficacyUrlChar(pszUrl[i])) return false;
  226. }
  227. return true;
  228. }
  229. //插入字串
  230. bool CTraceServiceControl::InsertString(LPCTSTR pszString, CHARFORMAT2 & CharFormat)
  231. {
  232. if (GetTextLength() >= 1024 * 512)
  233. OnClearAll();
  234. //插入消息
  235. //变量定义
  236. bool bResumeSelect;
  237. CHARRANGE CharRange;
  238. //保存状态
  239. SetSel(-1L, -1L);
  240. GetSel(CharRange.cpMin, CharRange.cpMax);
  241. bResumeSelect = (CharRange.cpMax != CharRange.cpMin);
  242. //搜索变量
  243. LPCTSTR pszHttp = TEXT("http://");
  244. const INT nHttpLength = lstrlen(pszHttp);
  245. const INT nStringLength = lstrlen(pszString);
  246. //索引定义
  247. INT nStringStart = 0;
  248. INT nStringPause = 0;
  249. //字符解释
  250. for (INT i = 0; i < nStringLength; i++)
  251. {
  252. //变量定义
  253. INT nUrlPause = i;
  254. //地址判断
  255. if (((i + nHttpLength) < nStringLength) && (memcmp(&pszString[i], pszHttp, nHttpLength*sizeof(TCHAR)) == 0))
  256. {
  257. //设置索引
  258. nUrlPause = i + nHttpLength;
  259. //地址搜索
  260. while (nUrlPause < nStringLength)
  261. {
  262. //字符判断
  263. if (EfficacyUrlChar(pszString[nUrlPause]) == true)
  264. {
  265. nUrlPause++;
  266. continue;
  267. }
  268. break;
  269. }
  270. }
  271. //终止字符
  272. if (nUrlPause <= (i + nHttpLength)) nStringPause = (i + 1);
  273. //插入字符
  274. if ((i == (nStringLength - 1)) || (nUrlPause > (i + nHttpLength)))
  275. {
  276. //普通字符
  277. if (nStringPause > nStringStart)
  278. {
  279. //获取缓冲
  280. CString strNormalString;
  281. LPTSTR pszNormalString = strNormalString.GetBuffer(nStringPause - nStringStart + 1);
  282. //拷贝字符
  283. pszNormalString[nStringPause - nStringStart] = 0;
  284. CopyMemory(pszNormalString, &pszString[nStringStart], (nStringPause - nStringStart)*sizeof(TCHAR));
  285. //释放缓冲
  286. strNormalString.ReleaseBuffer();
  287. //插入消息
  288. SetSel(-1L, -1L);
  289. SetWordCharFormat(CharFormat);
  290. ReplaceSel((LPCTSTR)strNormalString);
  291. }
  292. //连接地址
  293. if (nUrlPause > (i + nHttpLength))
  294. {
  295. //获取缓冲
  296. CString strUrlString;
  297. LPTSTR pszUrlString = strUrlString.GetBuffer((nUrlPause - i) + 1);
  298. //拷贝字符
  299. pszUrlString[nUrlPause - i] = 0;
  300. CopyMemory(pszUrlString, &pszString[i], (nUrlPause - i)*sizeof(TCHAR));
  301. //释放缓冲
  302. strUrlString.ReleaseBuffer();
  303. //构造格式
  304. CHARFORMAT2 CharFormatHyper;
  305. CharFormatHyper = CharFormat;
  306. //效验地址
  307. if (EfficacyUrlString(strUrlString) == true)
  308. {
  309. CharFormatHyper.dwMask |= CFM_LINK;
  310. CharFormatHyper.dwEffects |= CFE_LINK;
  311. }
  312. //插入消息
  313. SetSel(-1L, -1L);
  314. SetWordCharFormat(CharFormatHyper);
  315. ReplaceSel((LPCTSTR)strUrlString);
  316. }
  317. //设置索引
  318. nStringStart = __max(i, nUrlPause);
  319. }
  320. //设置索引
  321. i += (nUrlPause - i);
  322. }
  323. //状态设置
  324. if (bResumeSelect == true) SetSel(CharRange);
  325. else PostMessage(WM_VSCROLL, SB_BOTTOM, 0);
  326. return true;
  327. }
  328. //回调函数
  329. //////////////////////////////////////////////////////////////////////////
  330. //加载回调
  331. DWORD CALLBACK CTraceServiceControl::LoadCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG * pcb)
  332. {
  333. return 0;
  334. }
  335. //保存回调
  336. DWORD CALLBACK CTraceServiceControl::SaveCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG * pcb)
  337. {
  338. return 0;
  339. }
  340. //菜单命令
  341. //////////////////////////////////////////////////////////////////////////
  342. //删除信息
  343. VOID CTraceServiceControl::OnClearAll()
  344. {
  345. SetWindowText(NULL);
  346. }
  347. //全部选择
  348. VOID CTraceServiceControl::OnSelectAll()
  349. {
  350. __super::SetSel(0, __super::GetTextLength());
  351. }
  352. //拷贝字符
  353. VOID CTraceServiceControl::OnCopyString()
  354. {
  355. __super::Copy();
  356. }
  357. //保存信息
  358. VOID CTraceServiceControl::OnSaveString()
  359. {
  360. CFileDialog dlg(FALSE, TEXT("*.txt"), NULL, 4 | 2, TEXT("信息|*.txt||"));
  361. if (dlg.DoModal() == IDOK)
  362. {
  363. CString m_filename = dlg.GetPathName();
  364. CString strInput;
  365. GetWindowText(strInput);
  366. CFile file(m_filename, CFile::modeCreate | CFile::modeWrite);
  367. file.Write(strInput, strInput.GetLength());
  368. file.Close();
  369. }
  370. }
  371. //删除字符
  372. VOID CTraceServiceControl::OnDeleteString()
  373. {
  374. ReplaceSel(NULL, true);
  375. }
  376. //消息映射
  377. //////////////////////////////////////////////////////////////////////////
  378. //建立消息
  379. INT CTraceServiceControl::OnCreate(LPCREATESTRUCT lpCreateStruct)
  380. {
  381. return __super::OnCreate(lpCreateStruct);
  382. }
  383. //右键消息
  384. VOID CTraceServiceControl::OnRButtonDown(UINT nFlags, CPoint point)
  385. {
  386. CMenu menu;
  387. ClientToScreen(&point);
  388. menu.CreatePopupMenu();
  389. CHARRANGE sl;
  390. GetSel(sl);
  391. menu.AppendMenu(MF_STRING | (sl.cpMax != sl.cpMin) ? 0 : MF_DISABLED | MF_GRAYED, IDM_MENU0, TEXT("复制(&C)\tCtrl+C"));
  392. menu.AppendMenu(MF_STRING | (GetTextLength() > 0 && sl.cpMax - sl.cpMin < GetTextLength()) ? 0 : MF_DISABLED | MF_GRAYED, IDM_MENU1, TEXT("全选(&A)\tCtrl+A"));
  393. menu.AppendMenu(MF_STRING | (false) ? 0 : MF_DISABLED | MF_GRAYED, IDM_MENU2, TEXT("删除(&D)"));
  394. menu.AppendMenu(MF_STRING | (GetTextLength() > 0) ? 0 : MF_DISABLED | MF_GRAYED, IDM_MENU3, TEXT("清除信息"));
  395. menu.AppendMenu(MF_SEPARATOR, 0);
  396. menu.AppendMenu(MF_STRING | (GetTextLength() > 0) ? 0 : MF_DISABLED | MF_GRAYED, IDM_MENU4, TEXT("保存信息..."));
  397. TrackPopupMenu(menu.m_hMenu, nFlags, point.x, point.y, 0, m_hWnd, NULL);
  398. }
  399. //追踪消息
  400. LRESULT CTraceServiceControl::OnTraceServiceMessage(WPARAM wParam, LPARAM lParam)
  401. {
  402. return 0;
  403. }