TCL Copy Tool.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. 
  2. // TCL Tools.cpp: 定义应用程序的类行为。
  3. //
  4. #include "pch.h"
  5. #include "framework.h"
  6. #include "TCL Copy Tool.h"
  7. #include "TCL Copy ToolDlg.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #endif
  11. // CTCLToolsApp
  12. BEGIN_MESSAGE_MAP(CTCLToolsApp, CWinApp)
  13. ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
  14. END_MESSAGE_MAP()
  15. // CTCLToolsApp 构造
  16. CTCLToolsApp::CTCLToolsApp()
  17. {
  18. // 支持重新启动管理器
  19. m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
  20. // TODO: 在此处添加构造代码,
  21. // 将所有重要的初始化放置在 InitInstance 中
  22. }
  23. // 唯一的 CTCLToolsApp 对象
  24. CTCLToolsApp theApp;
  25. // CTCLToolsApp 初始化
  26. BOOL CTCLToolsApp::InitInstance()
  27. {
  28. // TODO: 调用 AfxInitRichEdit2() 以初始化 richedit2 库。\n" // 如果一个运行在 Windows XP 上的应用程序清单指定要
  29. // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
  30. //则需要 InitCommonControlsEx()。 否则,将无法创建窗口。
  31. INITCOMMONCONTROLSEX InitCtrls;
  32. InitCtrls.dwSize = sizeof(InitCtrls);
  33. // 将它设置为包括所有要在应用程序中使用的
  34. // 公共控件类。
  35. InitCtrls.dwICC = ICC_WIN95_CLASSES;
  36. InitCommonControlsEx(&InitCtrls);
  37. AfxInitRichEdit2();
  38. CWinApp::InitInstance();
  39. #if 1
  40. // 获取模块的目录;
  41. TCHAR szDrive[MAX_PATH] = { 0 };
  42. TCHAR szDir[MAX_PATH] = { 0 };
  43. TCHAR szExt[MAX_PATH] = { 0 };
  44. ::GetModuleFileName(NULL, Global::g_szCurModulePath, sizeof(Global::g_szCurModulePath) / sizeof(TCHAR));
  45. //_tsplitpath_s(Global::g_szCurModulePath, szDrive, szDir, Global::g_szFna, szExt);
  46. //_tcscpy_s(Global::g_szCurModuleDir, szDrive);
  47. //_tcscat_s(Global::g_szCurModuleDir, szDir);
  48. ::GetCurrentDirectory(MAX_PATH, Global::g_szCurModuleDir);
  49. _tcscat_s(Global::g_szCurModuleDir, _T("\\"));
  50. // config文件路径;
  51. _stprintf_s(Global::g_szConfig, _T("%sconfig.ini"), Global::g_szCurModuleDir);
  52. // 日志模板;
  53. char szFileName[MAX_PATH];
  54. sprintf_s(szFileName, "%s\\log4crc.xml", Global::g_szCurModuleDir);
  55. ///设置日志配置文件名
  56. LOG4C_PARAM_CFG_FILE_NAME(szFileName);
  57. ///设置日志级别
  58. LOG4C_PARAM_LOG_LEVEL("unknown");
  59. ///设置日志文件大小
  60. LOG4C_PARAM_LOG_FILE_SIZE(1024*1024*10);
  61. ///设置生成日志文件个数,达到最大个数将自动覆盖最旧的日志
  62. LOG4C_PARAM_LOG_FILE_NUM(100);
  63. ///设置每次记录日志都重新读取日志配置文件
  64. LOG4C_PARAM_REREAD_LOG_CFG_FILE(1);
  65. ///带参数日志模块初始化,以上所有设置了的参数都将生效,没有设置的采用缺省值
  66. LOG4C_INIT_WITH_PARAM();
  67. #if 0 // 等级示例;
  68. LOG4C((LOG_FATAL, "LOG_FATAL!"));
  69. LOG4C((LOG_ALERT, "LOG_ALERT!"));
  70. LOG4C((LOG_CRIT, "LOG_CRIT!"));
  71. LOG4C((LOG_ERROR, "LOG_ERROR!"));
  72. LOG4C((LOG_WARN, "LOG_WARN!"));
  73. LOG4C((LOG_NOTICE, "LOG_NOTICE!"));
  74. LOG4C((LOG_INFO, "LOG_INFO!"));
  75. LOG4C((LOG_DEBUG, "LOG_DEBUG!"));
  76. LOG4C((LOG_TRACE, "LOG_TRACE!"));
  77. LOG4C((LOG_NOTSET, "LOG_NOTSET!"));
  78. LOG4C((LOG_UNKNOWN, "LOG_UNKNOWN!"));
  79. #endif
  80. LOG4C((LOG_NOTICE, "程序开始运行!"));
  81. #endif
  82. Global::GetConfig();
  83. Global::GetMacAddress();
  84. AfxEnableControlContainer();
  85. if (g_db.Open(Global::g_tConfig.com))
  86. g_db.RemoveReportInfo();
  87. #ifdef _DEBUG
  88. auto HexString2Bytes = [](std::string strHex, const int& len /* = 3 */)
  89. {
  90. auto TwoHexChar2Char = [](char ch1, char ch2)
  91. {
  92. char Numb1;
  93. char Numb2;
  94. if (ch1 >= 'A')
  95. Numb1 = (toupper(ch1) - '0' - 7) * 16;
  96. else
  97. Numb1 = (ch1 - '0') * 16;
  98. if (ch2 >= 'A')
  99. Numb2 = (toupper(ch2) - '0' - 7);
  100. else
  101. Numb2 = (ch2 - '0');
  102. return (Numb1 + Numb2);
  103. };
  104. byte value = 0;
  105. std::string strBytes;
  106. int nSize = strHex.size();
  107. for (int i = 0; i < nSize; i += len)
  108. {
  109. strBytes.push_back(TwoHexChar2Char(strHex[i], strHex[i + 1]));
  110. }
  111. return strBytes;
  112. };
  113. std::vector<CSIACP::RTN> vtdata;
  114. _SIACP_ siacp = { "GetWidevine", "AA", "EC", "00", true, 100 };
  115. std::string data = "AB 05 0A DF 4E AB FE 01 0B ED 00 00 00 01 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 4D 53 54 41 52 5F 53 45 43 55 52 45 5F 53 54 4F 52 45 5F 46 49 4C 45 5F 4D 41 47 49 43 5F 49 44 7E EE CC 10 32 C1 0A 83 3B FB A2 46 A2 90 C7 90 8F 04 3B DE AB AD AA 7A 99 A8 B0 24 63 B3 D9 D6 60 23 E5 83 4D 0F 47 32 3C 3D A3 88 72 66 74 12 91 8C A5 10 25 7D B7 D6 7E 1D E0 2B 64 E9 72 13 4D 4C B6 9F BF 71 6C 4C 1B BF E1 F2 0C 51 9E C5 D5 44 9C 6D B4 5A D0 E9 35 A9 BD 93 A6 3D 9D 7E 7D E0 F0 0E 2C 24 12 50 13 CF 9C 44 DD 8D 53 0E 40 FA 4F EE E6 74 2D 9C CF A8 5B BF C3 B6 1B 52 F5 57 22 96 7A 85 CE 3E 05 32 60 33 D8 A1 BD C4 5D 37 C4 D9 E8 63 88 72 4F C0 98 E5 2A 0E 56 30 96 07 D4 FD 90 9C E9 0F 52 49 9E 0E F4 6B 6E 40 30 25 11 80 60 6D D6 5C 9D CD 9D DD 1B BD FF 12 37 DD 05 D6 ED F4";
  116. std::string bb = HexString2Bytes(data, 3);
  117. g_siacp.ParserSerialData(vtdata, siacp, (byte*)bb.c_str(), bb.size());
  118. #endif
  119. // 启动线程上报;
  120. std::thread t([]() {
  121. COTA ota;
  122. BOOL bRet;
  123. std::string xml;
  124. std::vector<STReport> vt;
  125. while (true)
  126. {
  127. vt.clear();
  128. g_db.QueryUnReportInfo(vt);
  129. for (auto it : vt)
  130. {
  131. if ( _tcsicmp("https://cn.ota.qhmoka.com/ota-services/report/reportToolsLog", it.url.c_str()) == 0 )
  132. {
  133. bRet = ota.ReportLog(it.url, it.content);
  134. }
  135. else
  136. {
  137. bRet = ota.GetKeyInfo(it.url, it.content, "", "", xml);
  138. }
  139. if (bRet)
  140. {
  141. // 上报成功;
  142. g_db.UpdateKeyReportStatus(it);
  143. }
  144. std::this_thread::sleep_for(std::chrono::microseconds(500));
  145. }
  146. std::this_thread::sleep_for(std::chrono::seconds(10));
  147. }
  148. });
  149. t.detach();
  150. //std::string vcode;
  151. //g_ota.GetVCode("CC-A1-2B-03-09-13", vcode);
  152. // 创建 shell 管理器,以防对话框包含
  153. // 任何 shell 树视图控件或 shell 列表视图控件。
  154. CShellManager *pShellManager = new CShellManager;
  155. // 激活“Windows Native”视觉管理器,以便在 MFC 控件中启用主题
  156. CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
  157. // 标准初始化
  158. // 如果未使用这些功能并希望减小
  159. // 最终可执行文件的大小,则应移除下列
  160. // 不需要的特定初始化例程
  161. // 更改用于存储设置的注册表项
  162. // TODO: 应适当修改该字符串,
  163. // 例如修改为公司或组织名
  164. SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
  165. CTCLCopyToolDlg dlg;
  166. m_pMainWnd = &dlg;
  167. INT_PTR nResponse = dlg.DoModal();
  168. if (nResponse == IDOK)
  169. {
  170. // TODO: 在此放置处理何时用
  171. // “确定”来关闭对话框的代码
  172. }
  173. else if (nResponse == IDCANCEL)
  174. {
  175. // TODO: 在此放置处理何时用
  176. // “取消”来关闭对话框的代码
  177. }
  178. else if (nResponse == -1)
  179. {
  180. TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");
  181. TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");
  182. }
  183. // 删除上面创建的 shell 管理器。
  184. if (pShellManager != nullptr)
  185. {
  186. delete pShellManager;
  187. }
  188. #if !defined(_AFXDLL) && !defined(_AFX_NO_MFC_CONTROLS_IN_DIALOGS)
  189. ControlBarCleanUp();
  190. #endif
  191. // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
  192. // 而不是启动应用程序的消息泵。
  193. return FALSE;
  194. }
  195. int CTCLToolsApp::ExitInstance()
  196. {
  197. // TODO: 在此添加专用代码和/或调用基类
  198. g_db.Close();
  199. g_siacp.CloseComm();
  200. return CWinApp::ExitInstance();
  201. }