Global.cpp 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902
  1. #include "stdafx.h"
  2. #include "Global.h"
  3. #include <SetupAPI.h>
  4. #include <InitGuid.h>
  5. #include <WinIoCtl.h>
  6. #pragma comment(lib, "SetupAPI.lib")
  7. #include "cJSON.h"
  8. #include <direct.h>
  9. #include "CritSection.h"
  10. namespace Global
  11. {
  12. //////////////////////////////////////////////////////////////////////////
  13. // 全局变量;
  14. BOOL g_bTestHost = FALSE;
  15. TCHAR g_szCurModuleDir[MAX_PATH] = { 0 };
  16. TCHAR g_szCurModulePath[MAX_PATH] = { 0 };
  17. TCHAR g_szFna[MAX_PATH] = { 0 };
  18. TCHAR g_szConfig[MAX_PATH] = { 0 };
  19. std::string g_strMacs;
  20. std::vector<MacAddress> g_vtMac;
  21. TConfig g_tConfig;
  22. Global::TChassis g_AutoOnlineChassis;
  23. // usb;
  24. static GUID UsbClassGuid = { 0xA5DCBF10L, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED} };
  25. // mac;
  26. static GUID MacClassGuid = { 0xAD498944, 0x762F, 0x11D0, {0x8D, 0xCB, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C} };
  27. // hdd;
  28. static GUID HDDClassGuid = { 0x53F56307, 0xB6BF, 0x11D0, {0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B} };
  29. //////////////////////////////////////////////////////////////////////////
  30. // 全局函数;
  31. void Init()
  32. {
  33. TCHAR szDrive[_MAX_DRIVE] = { 0 };
  34. TCHAR szDir[_MAX_DIR] = { 0 };
  35. TCHAR szExt[_MAX_DIR] = { 0 };
  36. ::GetModuleFileName(NULL, g_szCurModulePath, sizeof(g_szCurModulePath) / sizeof(TCHAR));
  37. _tsplitpath_s(g_szCurModulePath, szDrive, szDir, g_szFna, szExt);
  38. _tcscpy_s(g_szCurModuleDir, szDrive);
  39. _tcscat_s(g_szCurModuleDir, szDir);
  40. // 创建cache目录;
  41. TCHAR szPath[MAX_PATH] = {0};
  42. _stprintf_s(szPath, _T("%scache"), g_szCurModuleDir);
  43. MKDIR(szPath);
  44. _stprintf_s(szPath, _T("%sdb"), g_szCurModuleDir);
  45. MKDIR(szPath);
  46. _stprintf_s(szPath, _T("%slog"), g_szCurModuleDir);
  47. MKDIR(szPath);
  48. }
  49. void MKDIR(LPCTSTR dir)
  50. {
  51. //////////////////////////////////////////////////////////////////////////
  52. // 创建目录;
  53. int nleft = 0;
  54. int nIndex = -1;
  55. std::string strdir = dir;
  56. if (strdir.at(strdir.size() - 1) != _T('\\'))
  57. strdir.append(_T("\\"));
  58. // 共享路径和硬盘盘符;
  59. if (_tcscmp(strdir.substr(0, 2).c_str(), _T("\\\\")) == 0)
  60. nleft = strdir.find_first_of(_T("\\"), 2) + 1; // 去除共享主机名;
  61. else if (strdir.at(2) == _T('\\'))
  62. nleft = 3;
  63. do
  64. {
  65. nIndex = strdir.substr(nleft, -1).find_first_of(_T("\\"));
  66. if (nIndex != std::string::npos)
  67. {
  68. std::string sub = strdir.substr(0, nIndex + nleft);
  69. if (_mkdir(sub.c_str()) == -1 && (errno != EEXIST))
  70. {
  71. //WriteTextLog(_T("创建目录失败:%s,错误码:%d"), strdir.substr(0, nIndex + nleft).c_str(), errno);
  72. break;
  73. }
  74. nleft += nIndex + 1;
  75. }
  76. } while (nIndex != -1);
  77. }
  78. /************************************************************************/
  79. /* 函数:WriteTextLog[7/28/2009 Jeff];
  80. /* 描述:写文本日志;
  81. /* 参数:;
  82. /* [IN] :;
  83. /* 返回:void;
  84. /* 注意:;
  85. /* 示例:;
  86. /*
  87. /* 修改:;
  88. /* 日期:;
  89. /* 内容:;
  90. /************************************************************************/
  91. void WriteTextLog(const TCHAR* format, ...)
  92. {
  93. static ThreadSection cs;
  94. AutoThreadSection ats(&cs);
  95. // 将日志内容输入到文件中;
  96. // 获取今年年份;
  97. __time64_t gmt = time(NULL); // 获取当前日历时间(1900-01-01开始的Unix时间戳);
  98. struct tm gmtm = { 0 };
  99. localtime_s(&gmtm, &gmt); // 时间戳转成本地时间;
  100. // 解析出日志路径;
  101. TCHAR szlogpath[MAX_PATH] = { 0 };
  102. _stprintf_s(szlogpath, _T("%slog\\log %02d%02d.txt"), g_szCurModuleDir, gmtm.tm_mon + 1, gmtm.tm_mday);
  103. // 打开或创建文件;
  104. FILE* fp = NULL;
  105. //if (_taccess(szlogpath, 0) != -1)
  106. #ifndef UNICODE
  107. if (_access(szlogpath, 0) != -1)
  108. #else
  109. if (_taccess(szlogpath, 0) != -1)
  110. #endif
  111. { // 存在;
  112. if (0 == _tfopen_s(&fp, szlogpath, _T("a+")))
  113. // 移动到末尾;
  114. fseek(fp, 0, SEEK_END);
  115. }
  116. else
  117. { // 不存在;
  118. _tfopen_s(&fp, szlogpath, _T("w+"));
  119. }
  120. if (fp == NULL)
  121. return;
  122. // 格式化前设置语言区域;
  123. TCHAR* old_locale = _tcsdup(_tsetlocale(LC_CTYPE, NULL));
  124. _tsetlocale(LC_CTYPE, _T("chs")); //设定中文;
  125. // 格式化日志内容;
  126. va_list args = NULL;
  127. int len = 0;
  128. TCHAR* buffer = NULL;
  129. va_start(args, format);
  130. // _vscprintf doesn't count. terminating '\0'
  131. len = _vsctprintf(format, args) + 1;
  132. buffer = (TCHAR*)malloc(len * sizeof(TCHAR));
  133. _vstprintf_s(buffer, len, format, args);
  134. _ftprintf(fp, _T("%04d-%02d-%02d %02d:%02d:%02d %s\n"), gmtm.tm_year + 1990, gmtm.tm_mon + 1, gmtm.tm_mday, gmtm.tm_hour, gmtm.tm_min, gmtm.tm_sec, buffer);
  135. // 关闭文件,释放资源并设置回原语言区域;
  136. free(buffer);
  137. fclose(fp);
  138. _tsetlocale(LC_CTYPE, old_locale);
  139. free(old_locale); //还原区域设定;
  140. }
  141. // 读取配置文件-预留;
  142. void GetConfig()
  143. {
  144. // 读取文件;
  145. FILE* pf = NULL;
  146. _tfopen_s(&pf, _T("./Config.json"), _T("rb"));
  147. if (!pf)
  148. return;
  149. // 获取文件长度;
  150. fseek(pf, 0, SEEK_END);
  151. size_t file_size = ftell(pf);
  152. fseek(pf, 0, SEEK_SET);
  153. // 读取文件内容;
  154. byte* pdata = (byte*)malloc(file_size);
  155. fread(pdata, file_size, 1, pf);
  156. fclose(pf);
  157. // Json数据;
  158. cJSON* pJson = cJSON_Parse((const char*)pdata);
  159. if (pJson == NULL)
  160. {
  161. goto end;
  162. }
  163. // 获取数据;
  164. g_tConfig.com = cJSON_GetObjectItem(pJson, _T("COM")) ? cJSON_GetObjectItem(pJson, _T("COM"))->valuestring : "";
  165. g_tConfig.baudrate = cJSON_GetObjectItem(pJson, _T("Baudrate")) ? cJSON_GetObjectItem(pJson, _T("Baudrate"))->valuestring : "115200";
  166. g_tConfig.mode = cJSON_GetObjectItem(pJson, _T("Mode")) ? cJSON_GetObjectItem(pJson, _T("Mode"))->valueint : 0;
  167. g_tConfig.warncount = cJSON_GetObjectItem(pJson, _T("WarnCount")) ? cJSON_GetObjectItem(pJson, _T("WarnCount"))->valueint : 200;
  168. g_tConfig.waitboot = cJSON_GetObjectItem(pJson, _T("WaitBoot")) ? cJSON_GetObjectItem(pJson, _T("WaitBoot"))->valueint : 5000;
  169. g_tConfig.serverurl = cJSON_GetObjectItem(pJson, _T("server-url")) ? cJSON_GetObjectItem(pJson, _T("server-url"))->valuestring : "";
  170. g_tConfig.chassis = cJSON_GetObjectItem(pJson, _T("Chassis")) ? cJSON_GetObjectItem(pJson, _T("Chassis"))->valuestring : "";
  171. // 频道;
  172. cJSON* pItem = NULL;
  173. cJSON* pChannel = cJSON_GetObjectItem(pJson, "Channel");
  174. if (pChannel)
  175. {
  176. int nCount = cJSON_GetArraySize(pChannel);
  177. for (int i = 0; i < nCount; i++)
  178. {
  179. pItem = cJSON_GetArrayItem(pChannel, i);
  180. if (pItem && pItem->child)
  181. {
  182. g_tConfig.channel.insert(std::pair<std::string, std::string>(pItem->child->string, pItem->child->valuestring));
  183. }
  184. }
  185. }
  186. // 语言;
  187. cJSON* pLanguage = cJSON_GetObjectItem(pJson, "Language");
  188. if (pLanguage)
  189. {
  190. int nCount = cJSON_GetArraySize(pLanguage);
  191. for (int i = 0; i < nCount; i++)
  192. {
  193. pItem = cJSON_GetArrayItem(pLanguage, i);
  194. if (pItem && pItem->child)
  195. {
  196. g_tConfig.language.insert(std::pair<std::string, std::string>(pItem->child->string, pItem->child->valuestring));
  197. }
  198. }
  199. }
  200. // 文件夹;
  201. cJSON* pKeyFolder = cJSON_GetObjectItem(pJson, "KeyFolder");
  202. if (pKeyFolder)
  203. {
  204. int nCount = cJSON_GetArraySize(pKeyFolder);
  205. for (int i = 0; i < nCount; i++)
  206. {
  207. pItem = cJSON_GetArrayItem(pKeyFolder, i);
  208. if (pItem && pItem->child)
  209. {
  210. g_tConfig.keyfolder.insert(std::pair<std::string, std::string>(pItem->child->string, pItem->child->valuestring));
  211. }
  212. }
  213. }
  214. // read check;
  215. cJSON *pReadCheck = cJSON_GetObjectItem(pJson, "ReadCheck");
  216. if ( pReadCheck )
  217. {
  218. g_tConfig.readcheck.IsPID = cJSON_GetObjectItem(pReadCheck, _T("PID")) ? cJSON_GetObjectItem(pReadCheck, _T("PID"))->valueint : 1;
  219. g_tConfig.readcheck.IsCHANNEL = cJSON_GetObjectItem(pReadCheck, _T("CHANNEL")) ? cJSON_GetObjectItem(pReadCheck, _T("CHANNEL"))->valueint : 1;
  220. g_tConfig.readcheck.IsOSD = cJSON_GetObjectItem(pReadCheck, _T("OSD")) ? cJSON_GetObjectItem(pReadCheck, _T("OSD"))->valueint : 1;
  221. g_tConfig.readcheck.IsSHOP = cJSON_GetObjectItem(pReadCheck, _T("SHOP")) ? cJSON_GetObjectItem(pReadCheck, _T("SHOP"))->valueint : 1;
  222. g_tConfig.readcheck.IsDID = cJSON_GetObjectItem(pReadCheck, _T("DID")) ? cJSON_GetObjectItem(pReadCheck, _T("DID"))->valueint : 1;
  223. g_tConfig.readcheck.IsMAC = cJSON_GetObjectItem(pReadCheck, _T("MAC")) ? cJSON_GetObjectItem(pReadCheck, _T("MAC"))->valueint : 1;
  224. g_tConfig.readcheck.IsHDCP = cJSON_GetObjectItem(pReadCheck, _T("HDCP")) ? cJSON_GetObjectItem(pReadCheck, _T("HDCP"))->valueint : 1;
  225. g_tConfig.readcheck.IsHDCP22 = cJSON_GetObjectItem(pReadCheck, _T("HDCP22")) ? cJSON_GetObjectItem(pReadCheck, _T("HDCP22"))->valueint : 1;
  226. g_tConfig.readcheck.IsWIDI = cJSON_GetObjectItem(pReadCheck, _T("WIDI")) ? cJSON_GetObjectItem(pReadCheck, _T("WIDI"))->valueint : 1;
  227. g_tConfig.readcheck.IsWIDEVINE = cJSON_GetObjectItem(pReadCheck, _T("WIDEVINE")) ? cJSON_GetObjectItem(pReadCheck, _T("WIDEVINE"))->valueint : 1;
  228. g_tConfig.readcheck.IsESN = cJSON_GetObjectItem(pReadCheck, _T("ESN")) ? cJSON_GetObjectItem(pReadCheck, _T("ESN"))->valueint : 1;
  229. g_tConfig.readcheck.IsCI = cJSON_GetObjectItem(pReadCheck, _T("CI")) ? cJSON_GetObjectItem(pReadCheck, _T("CI"))->valueint : 1;
  230. }
  231. #ifdef SUPER_VER
  232. // write check;
  233. cJSON* pWriteCheck = cJSON_GetObjectItem(pJson, "WriteCheck");
  234. if (pWriteCheck)
  235. {
  236. //g_tConfig.writecheck.IsPID = cJSON_GetObjectItem(pWriteCheck, _T("PID")) ? cJSON_GetObjectItem(pWriteCheck, _T("PID"))->valueint : 1;
  237. //g_tConfig.writecheck.IsCHANNEL = cJSON_GetObjectItem(pWriteCheck, _T("CHANNEL")) ? cJSON_GetObjectItem(pWriteCheck, _T("CHANNEL"))->valueint : 1;
  238. //g_tConfig.writecheck.IsOSD = cJSON_GetObjectItem(pWriteCheck, _T("OSD")) ? cJSON_GetObjectItem(pWriteCheck, _T("OSD"))->valueint : 1;
  239. //g_tConfig.writecheck.IsSHOP = cJSON_GetObjectItem(pWriteCheck, _T("SHOP")) ? cJSON_GetObjectItem(pWriteCheck, _T("SHOP"))->valueint : 1;
  240. g_tConfig.writecheck.IsDID = cJSON_GetObjectItem(pWriteCheck, _T("DID")) ? cJSON_GetObjectItem(pWriteCheck, _T("DID"))->valueint : 1;
  241. g_tConfig.writecheck.IsMAC = cJSON_GetObjectItem(pWriteCheck, _T("MAC")) ? cJSON_GetObjectItem(pWriteCheck, _T("MAC"))->valueint : 1;
  242. g_tConfig.writecheck.IsHDCP = cJSON_GetObjectItem(pWriteCheck, _T("HDCP")) ? cJSON_GetObjectItem(pWriteCheck, _T("HDCP"))->valueint : 1;
  243. g_tConfig.writecheck.IsHDCP22 = cJSON_GetObjectItem(pWriteCheck, _T("HDCP22")) ? cJSON_GetObjectItem(pWriteCheck, _T("HDCP22"))->valueint : 1;
  244. g_tConfig.writecheck.IsWIDI = cJSON_GetObjectItem(pWriteCheck, _T("WIDI")) ? cJSON_GetObjectItem(pWriteCheck, _T("WIDI"))->valueint : 1;
  245. g_tConfig.writecheck.IsWIDEVINE = cJSON_GetObjectItem(pWriteCheck, _T("WIDEVINE")) ? cJSON_GetObjectItem(pWriteCheck, _T("WIDEVINE"))->valueint : 1;
  246. g_tConfig.writecheck.IsESN = cJSON_GetObjectItem(pWriteCheck, _T("ESN")) ? cJSON_GetObjectItem(pWriteCheck, _T("ESN"))->valueint : 1;
  247. g_tConfig.writecheck.IsCI = cJSON_GetObjectItem(pWriteCheck, _T("CI")) ? cJSON_GetObjectItem(pWriteCheck, _T("CI"))->valueint : 1;
  248. }
  249. // write done;
  250. cJSON* pWriteDone = cJSON_GetObjectItem(pJson, "WriteDone");
  251. if (pWriteDone)
  252. {
  253. g_tConfig.writedone.IsPID = cJSON_GetObjectItem(pWriteDone, _T("PID")) ? cJSON_GetObjectItem(pWriteDone, _T("PID"))->valueint : 1;
  254. g_tConfig.writedone.IsCHANNEL = cJSON_GetObjectItem(pWriteDone, _T("CHANNEL")) ? cJSON_GetObjectItem(pWriteDone, _T("CHANNEL"))->valueint : 1;
  255. g_tConfig.writedone.IsOSD = cJSON_GetObjectItem(pWriteDone, _T("OSD")) ? cJSON_GetObjectItem(pWriteDone, _T("OSD"))->valueint : 1;
  256. g_tConfig.writedone.IsSHOP = cJSON_GetObjectItem(pWriteDone, _T("SHOP")) ? cJSON_GetObjectItem(pWriteDone, _T("SHOP"))->valueint : 1;
  257. g_tConfig.writedone.IsDID = cJSON_GetObjectItem(pWriteDone, _T("DID")) ? cJSON_GetObjectItem(pWriteDone, _T("DID"))->valueint : 1;
  258. g_tConfig.writedone.IsMAC = cJSON_GetObjectItem(pWriteDone, _T("MAC")) ? cJSON_GetObjectItem(pWriteDone, _T("MAC"))->valueint : 1;
  259. g_tConfig.writedone.IsHDCP = cJSON_GetObjectItem(pWriteDone, _T("HDCP")) ? cJSON_GetObjectItem(pWriteDone, _T("HDCP"))->valueint : 1;
  260. g_tConfig.writedone.IsHDCP22 = cJSON_GetObjectItem(pWriteDone, _T("HDCP22")) ? cJSON_GetObjectItem(pWriteDone, _T("HDCP22"))->valueint : 1;
  261. g_tConfig.writedone.IsWIDI = cJSON_GetObjectItem(pWriteDone, _T("WIDI")) ? cJSON_GetObjectItem(pWriteDone, _T("WIDI"))->valueint : 1;
  262. g_tConfig.writedone.IsWIDEVINE = cJSON_GetObjectItem(pWriteDone, _T("WIDEVINE")) ? cJSON_GetObjectItem(pWriteDone, _T("WIDEVINE"))->valueint : 1;
  263. g_tConfig.writedone.IsESN = cJSON_GetObjectItem(pWriteDone, _T("ESN")) ? cJSON_GetObjectItem(pWriteDone, _T("ESN"))->valueint : 1;
  264. g_tConfig.writedone.IsCI = cJSON_GetObjectItem(pWriteDone, _T("CI")) ? cJSON_GetObjectItem(pWriteDone, _T("CI"))->valueint : 1;
  265. }
  266. #endif
  267. // 配置;
  268. cJSON* pChassis = cJSON_GetObjectItem(pJson, "Chassis-list");
  269. if (pChassis)
  270. {
  271. int nCount = cJSON_GetArraySize(pChassis);
  272. for (int i = 0; i < nCount; i++)
  273. {
  274. pItem = cJSON_GetArrayItem(pChassis, i);
  275. if (pItem && pItem->child)
  276. {
  277. std::string name;
  278. TChassis tchassis;
  279. name = cJSON_GetObjectItem(pItem, _T("name")) ? cJSON_GetObjectItem(pItem, _T("name"))->valuestring : "";
  280. tchassis.IsCopyDID = cJSON_GetObjectItem(pItem, _T("IsCopyDID")) ? cJSON_GetObjectItem(pItem, _T("IsCopyDID"))->valueint : 0;
  281. tchassis.IsCopyMAC = cJSON_GetObjectItem(pItem, _T("IsCopyMAC")) ? cJSON_GetObjectItem(pItem, _T("IsCopyMAC"))->valueint : 0;
  282. tchassis.IsCopyKEY = cJSON_GetObjectItem(pItem, _T("IsCopyKEY")) ? cJSON_GetObjectItem(pItem, _T("IsCopyKEY"))->valueint : 0;
  283. tchassis.IsCopyESN = cJSON_GetObjectItem(pItem, _T("IsCopyESN")) ? cJSON_GetObjectItem(pItem, _T("IsCopyESN"))->valueint : 0;
  284. tchassis.IsCopyWiDi = cJSON_GetObjectItem(pItem, _T("IsCopyWiDi")) ? cJSON_GetObjectItem(pItem, _T("IsCopyWiDi"))->valueint : 0;
  285. tchassis.IsCopyWidevine = cJSON_GetObjectItem(pItem, _T("IsCopyWidevine")) ? cJSON_GetObjectItem(pItem, _T("IsCopyWidevine"))->valueint : 0;
  286. tchassis.IsCopyKEY2_2 = cJSON_GetObjectItem(pItem, _T("IsCopyKEY2_2")) ? cJSON_GetObjectItem(pItem, _T("IsCopyKEY2_2"))->valueint : 0;
  287. tchassis.IsCopyKEY2_3 = cJSON_GetObjectItem(pItem, _T("IsCopyKEY2_3")) ? cJSON_GetObjectItem(pItem, _T("IsCopyKEY2_3"))->valueint : 0;
  288. tchassis.IsCopyCikey = cJSON_GetObjectItem(pItem, _T("IsCopyCikey")) ? cJSON_GetObjectItem(pItem, _T("IsCopyCikey"))->valueint : 0;
  289. tchassis.IsCopyChannel = cJSON_GetObjectItem(pItem, _T("IsCopyChannel")) ? cJSON_GetObjectItem(pItem, _T("IsCopyChannel"))->valueint : 0;
  290. tchassis.IsCopyWB = cJSON_GetObjectItem(pItem, _T("IsCopyWB")) ? cJSON_GetObjectItem(pItem, _T("IsCopyWB"))->valueint : 0;
  291. tchassis.IsDisplayClientType = cJSON_GetObjectItem(pItem, _T("IsDisplayClientType")) ? cJSON_GetObjectItem(pItem, _T("IsDisplayClientType"))->valueint : 0;
  292. tchassis.IsWritePID = cJSON_GetObjectItem(pItem, _T("IsWritePID")) ? cJSON_GetObjectItem(pItem, _T("IsWritePID"))->valueint : 0;
  293. tchassis.IsWBInit = cJSON_GetObjectItem(pItem, _T("IsWBInit")) ? cJSON_GetObjectItem(pItem, _T("IsWBInit"))->valueint : 0;
  294. tchassis.IsMTKInit = cJSON_GetObjectItem(pItem, _T("IsMTKInit")) ? cJSON_GetObjectItem(pItem, _T("IsMTKInit"))->valueint : 0;
  295. tchassis.IsOsdLanguage = cJSON_GetObjectItem(pItem, _T("IsOsdLanguage")) ? cJSON_GetObjectItem(pItem, _T("IsOsdLanguage"))->valueint : 0;
  296. tchassis.IsShopLanguage = cJSON_GetObjectItem(pItem, _T("IsShopLanguage")) ? cJSON_GetObjectItem(pItem, _T("IsShopLanguage"))->valueint : 0;
  297. tchassis.IsCopyClientType = cJSON_GetObjectItem(pItem, _T("IsCopyClientType")) ? cJSON_GetObjectItem(pItem, _T("IsCopyClientType"))->valueint : 0;
  298. tchassis.IsMGKKeyEnb = cJSON_GetObjectItem(pItem, _T("IsMGKKeyEnb")) ? cJSON_GetObjectItem(pItem, _T("IsMGKKeyEnb"))->valueint : 0;
  299. tchassis.IsNovaTakHDCPEnb = cJSON_GetObjectItem(pItem, _T("IsNovaTakHDCPEnb")) ? cJSON_GetObjectItem(pItem, _T("IsNovaTakHDCPEnb"))->valueint : 0;
  300. tchassis.ProjectID = cJSON_GetObjectItem(pItem, _T("ProjectID")) ? cJSON_GetObjectItem(pItem, _T("ProjectID"))->valueint : 0;
  301. tchassis.Channel = cJSON_GetObjectItem(pItem, _T("Channel")) ? cJSON_GetObjectItem(pItem, _T("Channel"))->valuestring : "";
  302. tchassis.WBFile = cJSON_GetObjectItem(pItem, _T("WBFile")) ? cJSON_GetObjectItem(pItem, _T("WBFile"))->valuestring : "";
  303. tchassis.Delay = cJSON_GetObjectItem(pItem, _T("Delay")) ? cJSON_GetObjectItem(pItem, _T("Delay"))->valueint : 50;
  304. tchassis.CheckString = cJSON_GetObjectItem(pItem, _T("CheckString")) ? cJSON_GetObjectItem(pItem, _T("CheckString"))->valuestring : "";
  305. tchassis.ClientType = cJSON_GetObjectItem(pItem, _T("ClientType")) ? cJSON_GetObjectItem(pItem, _T("ClientType"))->valuestring : "";
  306. tchassis.MACType = cJSON_GetObjectItem(pItem, _T("MACType")) ? cJSON_GetObjectItem(pItem, _T("MACType"))->valuestring : "";
  307. tchassis.HDCPKeyType = cJSON_GetObjectItem(pItem, _T("HDCPKeyType")) ? cJSON_GetObjectItem(pItem, _T("HDCPKeyType"))->valuestring : "";
  308. tchassis.HDCPKey22Type = cJSON_GetObjectItem(pItem, _T("HDCPKey22Type")) ? cJSON_GetObjectItem(pItem, _T("HDCPKey22Type"))->valuestring : "";
  309. tchassis.HDCPKey23Type = cJSON_GetObjectItem(pItem, _T("HDCPKey23Type")) ? cJSON_GetObjectItem(pItem, _T("HDCPKey23Type"))->valuestring : "";
  310. tchassis.ESNType = cJSON_GetObjectItem(pItem, _T("ESNType")) ? cJSON_GetObjectItem(pItem, _T("ESNType"))->valuestring : "";
  311. tchassis.WiDiType = cJSON_GetObjectItem(pItem, _T("WiDiType")) ? cJSON_GetObjectItem(pItem, _T("WiDiType"))->valuestring : "";
  312. tchassis.WidevineType = cJSON_GetObjectItem(pItem, _T("WidevineType")) ? cJSON_GetObjectItem(pItem, _T("WidevineType"))->valuestring : "";
  313. tchassis.CIKeyType = cJSON_GetObjectItem(pItem, _T("CIKeyType")) ? cJSON_GetObjectItem(pItem, _T("CIKeyType"))->valuestring : "";
  314. tchassis.MGKKeyType = cJSON_GetObjectItem(pItem, _T("MGKKeyType")) ? cJSON_GetObjectItem(pItem, _T("MGKKeyType"))->valuestring : "";
  315. tchassis.NovaTakHDCPType = cJSON_GetObjectItem(pItem, _T("NovaTakHDCPType")) ? cJSON_GetObjectItem(pItem, _T("NovaTakHDCPType"))->valuestring : "";
  316. g_tConfig.chassislist.insert(std::pair<std::string, CHASSIS>(name, tchassis));
  317. }
  318. }
  319. }
  320. end:
  321. if (pdata)
  322. free(pdata);
  323. if (pJson)
  324. cJSON_Delete(pJson);
  325. }
  326. void SetConfig()
  327. {
  328. // Json数据;
  329. cJSON* pJson = cJSON_CreateObject();
  330. cJSON_AddStringToObject(pJson, "COM", g_tConfig.com.c_str());
  331. cJSON_AddStringToObject(pJson, "server-url", g_tConfig.serverurl.c_str());
  332. cJSON_AddStringToObject(pJson, "Chassis", g_tConfig.chassis.c_str());
  333. cJSON_AddNumberToObject(pJson, "Mode", g_tConfig.mode);
  334. cJSON_AddNumberToObject(pJson, "WarnCount", g_tConfig.warncount);
  335. cJSON_AddNumberToObject(pJson, "WaitBoot", g_tConfig.waitboot);
  336. cJSON_AddStringToObject(pJson, "Baudrate", g_tConfig.baudrate.c_str());
  337. // 频道;
  338. cJSON* pItem = NULL;
  339. cJSON* pChannel = cJSON_AddArrayToObject(pJson, _T("Channel"));
  340. if (pChannel)
  341. {
  342. std::map<std::string, std::string>::iterator it = g_tConfig.channel.begin();
  343. for (; it != g_tConfig.channel.end(); it++)
  344. {
  345. pItem = cJSON_AddObjectToObject(pChannel, it->first.c_str());
  346. cJSON_AddStringToObject(pItem, it->first.c_str(), it->second.c_str());
  347. }
  348. }
  349. // 语言;
  350. cJSON* pLanguage = cJSON_AddArrayToObject(pJson, _T("Language"));
  351. if (pLanguage)
  352. {
  353. std::map<std::string, std::string>::iterator it = g_tConfig.language.begin();
  354. for (; it != g_tConfig.language.end(); it++)
  355. {
  356. pItem = cJSON_AddObjectToObject(pLanguage, it->first.c_str());
  357. cJSON_AddStringToObject(pItem, it->first.c_str(), it->second.c_str());
  358. }
  359. }
  360. // 文件夹;
  361. cJSON* pKeyFolder = cJSON_AddArrayToObject(pJson, _T("KeyFolder"));
  362. if (pKeyFolder)
  363. {
  364. std::map<std::string, std::string>::iterator it = g_tConfig.keyfolder.begin();
  365. for (; it != g_tConfig.keyfolder.end(); it++)
  366. {
  367. pItem = cJSON_AddObjectToObject(pKeyFolder, it->first.c_str());
  368. cJSON_AddStringToObject(pItem, it->first.c_str(), it->second.c_str());
  369. }
  370. }
  371. // read check;
  372. cJSON* pReadCheck = cJSON_AddObjectToObject(pJson, "ReadCheck");
  373. if (pReadCheck)
  374. {
  375. cJSON_AddBoolToObject(pReadCheck, _T("PID"), g_tConfig.readcheck.IsPID);
  376. cJSON_AddBoolToObject(pReadCheck, _T("CHANNEL"), g_tConfig.readcheck.IsCHANNEL);
  377. cJSON_AddBoolToObject(pReadCheck, _T("OSD"), g_tConfig.readcheck.IsOSD);
  378. cJSON_AddBoolToObject(pReadCheck, _T("SHOP"), g_tConfig.readcheck.IsSHOP);
  379. cJSON_AddBoolToObject(pReadCheck, _T("DID"), g_tConfig.readcheck.IsDID);
  380. cJSON_AddBoolToObject(pReadCheck, _T("MAC"), g_tConfig.readcheck.IsMAC);
  381. cJSON_AddBoolToObject(pReadCheck, _T("HDCP"), g_tConfig.readcheck.IsHDCP);
  382. cJSON_AddBoolToObject(pReadCheck, _T("HDCP22"), g_tConfig.readcheck.IsHDCP22);
  383. cJSON_AddBoolToObject(pReadCheck, _T("WIDI"), g_tConfig.readcheck.IsWIDI);
  384. cJSON_AddBoolToObject(pReadCheck, _T("WIDEVINE"), g_tConfig.readcheck.IsWIDEVINE);
  385. cJSON_AddBoolToObject(pReadCheck, _T("ESN"), g_tConfig.readcheck.IsESN);
  386. cJSON_AddBoolToObject(pReadCheck, _T("CI"), g_tConfig.readcheck.IsCI);
  387. }
  388. #ifdef SUPER_VER
  389. // write check;
  390. cJSON* pWriteCheck = cJSON_AddObjectToObject(pJson, "WriteCheck");
  391. if (pWriteCheck)
  392. {
  393. //cJSON_AddBoolToObject(pWriteCheck, _T("PID"), g_tConfig.writecheck.IsPID);
  394. //cJSON_AddBoolToObject(pWriteCheck, _T("CHANNEL"), g_tConfig.writecheck.IsCHANNEL);
  395. //cJSON_AddBoolToObject(pWriteCheck, _T("OSD"), g_tConfig.writecheck.IsOSD);
  396. //cJSON_AddBoolToObject(pWriteCheck, _T("SHOP"), g_tConfig.writecheck.IsSHOP);
  397. cJSON_AddBoolToObject(pWriteCheck, _T("DID"), g_tConfig.writecheck.IsDID);
  398. cJSON_AddBoolToObject(pWriteCheck, _T("MAC"), g_tConfig.writecheck.IsMAC);
  399. cJSON_AddBoolToObject(pWriteCheck, _T("HDCP"), g_tConfig.writecheck.IsHDCP);
  400. cJSON_AddBoolToObject(pWriteCheck, _T("HDCP22"), g_tConfig.writecheck.IsHDCP22);
  401. cJSON_AddBoolToObject(pWriteCheck, _T("WIDI"), g_tConfig.writecheck.IsWIDI);
  402. cJSON_AddBoolToObject(pWriteCheck, _T("WIDEVINE"), g_tConfig.writecheck.IsWIDEVINE);
  403. cJSON_AddBoolToObject(pWriteCheck, _T("ESN"), g_tConfig.writecheck.IsESN);
  404. cJSON_AddBoolToObject(pWriteCheck, _T("CI"), g_tConfig.writecheck.IsCI);
  405. }
  406. // write done;
  407. cJSON* pWriteDone= cJSON_AddObjectToObject(pJson, "WriteDone");
  408. if (pWriteDone)
  409. {
  410. cJSON_AddBoolToObject(pWriteDone, _T("PID"), g_tConfig.writedone.IsPID);
  411. cJSON_AddBoolToObject(pWriteDone, _T("CHANNEL"), g_tConfig.writedone.IsCHANNEL);
  412. cJSON_AddBoolToObject(pWriteDone, _T("OSD"), g_tConfig.writedone.IsOSD);
  413. cJSON_AddBoolToObject(pWriteDone, _T("SHOP"), g_tConfig.writedone.IsSHOP);
  414. cJSON_AddBoolToObject(pWriteDone, _T("DID"), g_tConfig.writedone.IsDID);
  415. cJSON_AddBoolToObject(pWriteDone, _T("MAC"), g_tConfig.writedone.IsMAC);
  416. cJSON_AddBoolToObject(pWriteDone, _T("HDCP"), g_tConfig.writedone.IsHDCP);
  417. cJSON_AddBoolToObject(pWriteDone, _T("HDCP22"), g_tConfig.writedone.IsHDCP22);
  418. cJSON_AddBoolToObject(pWriteDone, _T("WIDI"), g_tConfig.writedone.IsWIDI);
  419. cJSON_AddBoolToObject(pWriteDone, _T("WIDEVINE"), g_tConfig.writedone.IsWIDEVINE);
  420. cJSON_AddBoolToObject(pWriteDone, _T("ESN"), g_tConfig.writedone.IsESN);
  421. cJSON_AddBoolToObject(pWriteDone, _T("CI"), g_tConfig.writedone.IsCI);
  422. }
  423. #endif
  424. // 配置;
  425. cJSON* pChassis = cJSON_AddArrayToObject(pJson, _T("Chassis-list"));
  426. if (pChassis)
  427. {
  428. std::map<std::string, TChassis>::iterator it = g_tConfig.chassislist.begin();
  429. for (; it != g_tConfig.chassislist.end(); it++)
  430. {
  431. pItem = cJSON_AddObjectToObject(pChassis, it->first.c_str());
  432. cJSON_AddStringToObject(pItem, _T("name"), it->first.c_str());
  433. // bool
  434. cJSON_AddBoolToObject(pItem, _T("IsCopyDID"), it->second.IsCopyDID);
  435. cJSON_AddBoolToObject(pItem, _T("IsCopyMAC"), it->second.IsCopyMAC);
  436. cJSON_AddBoolToObject(pItem, _T("IsCopyKEY"), it->second.IsCopyKEY);
  437. cJSON_AddBoolToObject(pItem, _T("IsCopyESN"), it->second.IsCopyESN);
  438. cJSON_AddBoolToObject(pItem, _T("IsCopyWiDi"), it->second.IsCopyWiDi);
  439. cJSON_AddBoolToObject(pItem, _T("IsCopyWidevine"), it->second.IsCopyWidevine);
  440. cJSON_AddBoolToObject(pItem, _T("IsCopyKEY2_2"), it->second.IsCopyKEY2_2);
  441. cJSON_AddBoolToObject(pItem, _T("IsCopyKEY2_3"), it->second.IsCopyKEY2_3);
  442. cJSON_AddBoolToObject(pItem, _T("IsCopyCikey"), it->second.IsCopyCikey);
  443. cJSON_AddBoolToObject(pItem, _T("IsCopyChannel"), it->second.IsCopyChannel);
  444. cJSON_AddBoolToObject(pItem, _T("IsCopyWB"), it->second.IsCopyWB);
  445. cJSON_AddBoolToObject(pItem, _T("IsDisplayClientType"), it->second.IsDisplayClientType);
  446. cJSON_AddBoolToObject(pItem, _T("IsWritePID"), it->second.IsWritePID);
  447. cJSON_AddBoolToObject(pItem, _T("IsWBInit"), it->second.IsWBInit);
  448. cJSON_AddBoolToObject(pItem, _T("IsMTKInit"), it->second.IsMTKInit);
  449. cJSON_AddBoolToObject(pItem, _T("IsOsdLanguage"), it->second.IsOsdLanguage);
  450. cJSON_AddBoolToObject(pItem, _T("IsShopLanguage"), it->second.IsShopLanguage);
  451. cJSON_AddBoolToObject(pItem, _T("IsCopyClientType"), it->second.IsCopyClientType);
  452. cJSON_AddBoolToObject(pItem, _T("IsMGKKeyEnb"), it->second.IsMGKKeyEnb);
  453. cJSON_AddBoolToObject(pItem, _T("IsNovaTakHDCPEnb"), it->second.IsNovaTakHDCPEnb);
  454. // ini
  455. cJSON_AddNumberToObject(pItem, _T("ProjectID"), it->second.ProjectID);
  456. cJSON_AddNumberToObject(pItem, _T("Delay"), it->second.Delay);
  457. // string
  458. cJSON_AddStringToObject(pItem, _T("Channel"), it->second.Channel.c_str());
  459. cJSON_AddStringToObject(pItem, _T("WBFile"), it->second.WBFile.c_str());
  460. cJSON_AddStringToObject(pItem, _T("CheckString"), it->second.CheckString.c_str());
  461. cJSON_AddStringToObject(pItem, _T("ClientType"), it->second.ClientType.c_str());
  462. cJSON_AddStringToObject(pItem, _T("MACType"), it->second.MACType.c_str());
  463. cJSON_AddStringToObject(pItem, _T("HDCPKeyType"), it->second.HDCPKeyType.c_str());
  464. cJSON_AddStringToObject(pItem, _T("HDCPKey22Type"), it->second.HDCPKey22Type.c_str());
  465. cJSON_AddStringToObject(pItem, _T("HDCPKey23Type"), it->second.HDCPKey23Type.c_str());
  466. cJSON_AddStringToObject(pItem, _T("ESNType"), it->second.ESNType.c_str());
  467. cJSON_AddStringToObject(pItem, _T("WiDiType"), it->second.WiDiType.c_str());
  468. cJSON_AddStringToObject(pItem, _T("WidevineType"), it->second.WidevineType.c_str());
  469. cJSON_AddStringToObject(pItem, _T("CIKeyType"), it->second.CIKeyType.c_str());
  470. cJSON_AddStringToObject(pItem, _T("MGKKeyType"), it->second.MGKKeyType.c_str());
  471. cJSON_AddStringToObject(pItem, _T("NovaTakHDCPType"), it->second.NovaTakHDCPType.c_str());
  472. }
  473. }
  474. char* pJsonText = cJSON_Print(pJson);
  475. // 保存到文件中;
  476. FILE* pf = NULL;
  477. _tfopen_s(&pf, _T("./Config.json"), _T("wb"));
  478. if (pf)
  479. {
  480. fwrite(pJsonText, _tcslen(pJsonText), 1, pf);
  481. fclose(pf);
  482. }
  483. if (pJsonText)
  484. delete[] pJsonText;
  485. cJSON_Delete(pJson);
  486. }
  487. // 去除空格;
  488. std::string& trim(std::string& str)
  489. {
  490. int nIndex = 0;
  491. while ((nIndex = str.find_first_of(' ')) != std::string::npos)
  492. str.erase(nIndex, 1);
  493. return str;
  494. }
  495. // hModule 模块句柄 NULL表示当前模块;
  496. bool GetVersion(IN const TCHAR* fname, OUT WORD* pdwFileVersion, OUT WORD* pdwProductVerion)
  497. {
  498. VS_FIXEDFILEINFO* pVi = NULL;
  499. DWORD dwHandle = 0;
  500. int size = GetFileVersionInfoSize(fname, &dwHandle);
  501. if (size > 0)
  502. {
  503. BYTE* buffer = new BYTE[size];
  504. memset(buffer, 0, size);
  505. if (GetFileVersionInfo(fname, 0, size, buffer))
  506. {
  507. if (VerQueryValue(buffer, _T("\\"), (LPVOID*)& pVi, (PUINT)& size))
  508. {
  509. pdwFileVersion[0] = HIWORD(pVi->dwFileVersionMS);
  510. pdwFileVersion[1] = LOWORD(pVi->dwFileVersionMS);
  511. pdwFileVersion[2] = HIWORD(pVi->dwFileVersionLS);
  512. pdwFileVersion[3] = LOWORD(pVi->dwFileVersionLS);
  513. pdwProductVerion[0] = HIWORD(pVi->dwProductVersionMS);
  514. pdwProductVerion[1] = LOWORD(pVi->dwProductVersionMS);
  515. pdwProductVerion[2] = HIWORD(pVi->dwProductVersionLS);
  516. pdwProductVerion[3] = LOWORD(pVi->dwProductVersionLS);
  517. delete[] buffer;
  518. return true;
  519. }
  520. }
  521. delete[] buffer;
  522. }
  523. return false;
  524. }
  525. BOOL GetVersion(IN HMODULE hModule, OUT DWORD(&dwFVArray)[4], OUT DWORD(&dwPVArray)[4])
  526. {
  527. TCHAR fname[MAX_PATH];
  528. VS_FIXEDFILEINFO* pVi;
  529. DWORD dwHandle;
  530. if (GetModuleFileName(hModule, fname, MAX_PATH))
  531. {
  532. INT nSize = GetFileVersionInfoSize(fname, &dwHandle);
  533. if (nSize > 0)
  534. {
  535. BYTE* pBuffer = new BYTE[nSize];
  536. memset(pBuffer, 0, nSize);
  537. if (GetFileVersionInfo(fname, 0, nSize, pBuffer))
  538. {
  539. if (VerQueryValue(pBuffer, _T("\\"), (LPVOID*)& pVi, (PUINT)& nSize))
  540. {
  541. dwFVArray[0] = HIWORD(pVi->dwFileVersionMS);
  542. dwFVArray[1] = LOWORD(pVi->dwFileVersionMS);
  543. dwFVArray[2] = HIWORD(pVi->dwFileVersionLS);
  544. dwFVArray[3] = LOWORD(pVi->dwFileVersionLS);
  545. dwPVArray[0] = HIWORD(pVi->dwProductVersionMS);
  546. dwPVArray[1] = LOWORD(pVi->dwProductVersionMS);
  547. dwPVArray[2] = HIWORD(pVi->dwProductVersionLS);
  548. dwPVArray[3] = LOWORD(pVi->dwProductVersionLS);
  549. delete[]pBuffer;
  550. return TRUE;
  551. }
  552. }
  553. if (pBuffer)
  554. delete[]pBuffer;
  555. }
  556. }
  557. return FALSE;
  558. }
  559. WCHAR* ASCII2UNICODE(IN LPCCH lpASCIIStr)
  560. {
  561. if (lpASCIIStr == NULL)
  562. return NULL;
  563. // 获取宽字符字节数;
  564. int cchWideChar = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, NULL, 0);
  565. if (cchWideChar == 0)
  566. return NULL;
  567. // 转换成宽字符串;
  568. WCHAR* pWideChar = new WCHAR[cchWideChar + 1];
  569. memset(pWideChar, 0, sizeof(WCHAR) * (cchWideChar + 1));
  570. int nWriteNum = MultiByteToWideChar(CP_ACP, 0, lpASCIIStr, -1, pWideChar, cchWideChar);
  571. if (nWriteNum != cchWideChar)
  572. {
  573. if (pWideChar)
  574. delete[] pWideChar;
  575. return NULL;
  576. }
  577. return pWideChar;
  578. }
  579. BOOL UNICODE2UTF8(IN LPWCH lpUNICODEStr, OUT std::string& strResult)
  580. {
  581. if (lpUNICODEStr == NULL)
  582. return FALSE;
  583. // 获取多字节字符字节数;
  584. int cbMultiByte = WideCharToMultiByte(CP_UTF8, 0, lpUNICODEStr, -1, NULL, 0, NULL, NULL);
  585. if (cbMultiByte == 0)
  586. return FALSE;
  587. // 转换成多字节字符;
  588. CHAR* pResult = new CHAR[cbMultiByte];
  589. memset(pResult, 0, cbMultiByte);
  590. int nWriteNum = WideCharToMultiByte(CP_UTF8, 0, lpUNICODEStr, -1, pResult, cbMultiByte, NULL, NULL);
  591. if (nWriteNum != cbMultiByte)
  592. return FALSE;
  593. strResult = pResult;
  594. if (pResult)
  595. delete[] pResult;
  596. return TRUE;
  597. }
  598. BOOL ASCII2UTF8(IN LPCCH lpASCIIStr, OUT std::string& strResult)
  599. {
  600. // 将ASCII字符串转成UNICODE字符串;
  601. WCHAR* pWideChar = ASCII2UNICODE(lpASCIIStr);
  602. if (pWideChar == NULL)
  603. return FALSE;
  604. // 再将UICODE转成UTF8;
  605. BOOL bResult = UNICODE2UTF8(pWideChar, strResult);
  606. if (pWideChar)
  607. delete[] pWideChar;
  608. return bResult;
  609. }
  610. std::string EnCode_UTF8URL(IN const CHAR* pText)
  611. {
  612. std::string tt = "";
  613. std::string dd = "";
  614. ASCII2UTF8(pText, tt);
  615. size_t len = tt.length();
  616. for (size_t i = 0; i < len; i++)
  617. {
  618. if (isalnum((BYTE)tt.at(i)))
  619. {
  620. char tempbuff[2] = { 0 };
  621. sprintf_s(tempbuff, "%c", (BYTE)tt.at(i));
  622. dd.append(tempbuff);
  623. }
  624. else if (isspace((BYTE)tt.at(i)))
  625. {
  626. dd.append("+");
  627. }
  628. else
  629. {
  630. char tempbuff[4];
  631. sprintf_s(tempbuff, "%%%X%X", ((BYTE)tt.at(i)) >> 4, ((BYTE)tt.at(i)) % 16);
  632. dd.append(tempbuff);
  633. }
  634. }
  635. return dd;
  636. }
  637. void EnCode_UTF8URL(IN const CHAR* pText, OUT std::string& strResult)
  638. {
  639. std::string tt = "";
  640. ASCII2UTF8(pText, tt);
  641. size_t len = tt.length();
  642. for (size_t i = 0; i < len; i++)
  643. {
  644. if (isalnum((BYTE)tt.at(i)))
  645. {
  646. char tempbuff[2] = { 0 };
  647. sprintf_s(tempbuff, "%c", (BYTE)tt.at(i));
  648. strResult.append(tempbuff);
  649. }
  650. else if (isspace((BYTE)tt.at(i)))
  651. {
  652. strResult.append("+");
  653. }
  654. else
  655. {
  656. char tempbuff[4];
  657. sprintf_s(tempbuff, "%%%X%X", ((BYTE)tt.at(i)) >> 4, ((BYTE)tt.at(i)) % 16);
  658. strResult.append(tempbuff);
  659. }
  660. }
  661. }
  662. // 通过注册表查找系统当前串口信息;
  663. BOOL GetSysSerialPort(std::vector<std::string>& vtports)
  664. {
  665. HKEY hKey;
  666. LSTATUS lReg = 0;
  667. DWORD dwMaxValLen = 0;
  668. DWORD dwValNum = 0;
  669. lReg = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_QUERY_VALUE, &hKey);
  670. if (lReg != ERROR_SUCCESS)
  671. {
  672. //LOG4C((LOG_WARN, "Open Registry Error"));
  673. return FALSE;
  674. }
  675. lReg = RegQueryInfoKeyA(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwValNum, &dwMaxValLen, NULL, NULL, NULL);
  676. if (lReg != ERROR_SUCCESS)
  677. {
  678. //LOG4C((LOG_WARN, "Getting Key Info Error"));
  679. return FALSE;
  680. }
  681. if (vtports.size())
  682. {
  683. vtports.clear();
  684. }
  685. LPSTR lpValName, lpComNum;
  686. DWORD dwValName, dwValSize = 6;
  687. for (DWORD i = 0; i < dwValNum; i++)
  688. {
  689. dwValName = dwMaxValLen + 1;
  690. dwValSize = 6;
  691. lpValName = (LPSTR)VirtualAlloc(NULL, dwValName, MEM_COMMIT, PAGE_READWRITE);
  692. lReg = RegEnumValueA(hKey, i, lpValName, &dwValName, NULL, NULL, NULL, NULL);
  693. if ((lReg != ERROR_SUCCESS) && (lReg != ERROR_NO_MORE_ITEMS))
  694. {
  695. //LOG4C((LOG_WARN, "Enum Registry Error or No More Items"));
  696. continue;
  697. }
  698. lpComNum = (LPSTR)VirtualAlloc(NULL, 6, MEM_COMMIT, PAGE_READWRITE);
  699. lReg = RegQueryValueExA(hKey, lpValName, NULL, NULL, (LPBYTE)lpComNum, &dwValSize);
  700. if (lReg != ERROR_SUCCESS)
  701. {
  702. //LOG4C((LOG_WARN, "Can not get the name of the port"));
  703. continue;
  704. }
  705. vtports.push_back(lpComNum);
  706. VirtualFree(lpValName, 0, MEM_RELEASE);
  707. VirtualFree(lpComNum, 0, MEM_RELEASE);
  708. }
  709. return TRUE;
  710. }
  711. INT GetMacAddress()
  712. {
  713. HDEVINFO hDevInfo;
  714. DWORD MemberIndex, RequiredSize;
  715. SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
  716. PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData;
  717. INT nTotal = 0;
  718. INT nNICKind = 0;
  719. // 获取设备信息集;
  720. hDevInfo = SetupDiGetClassDevs(&MacClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
  721. if (hDevInfo == INVALID_HANDLE_VALUE)
  722. {
  723. return -1;
  724. }
  725. g_vtMac.clear();
  726. // 枚举设备信息集中所有设备;
  727. DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
  728. for (MemberIndex = 0; SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &MacClassGuid, MemberIndex, &DeviceInterfaceData); MemberIndex++)
  729. {
  730. // 获取接收缓冲区大小,函数返回值为FALSE,GetLastError()=ERROR_INSUFFICIENT_BUFFER;
  731. SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, NULL, 0, &RequiredSize, NULL);
  732. // 申请接收缓冲区;
  733. DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(RequiredSize);
  734. DeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
  735. // 获取设备细节信息;
  736. if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, DeviceInterfaceDetailData, RequiredSize, NULL, NULL))
  737. {
  738. HANDLE hDeviceFile;
  739. BOOL isOK = FALSE;
  740. if (_tcsnicmp(DeviceInterfaceDetailData->DevicePath + 4, TEXT("pci"), 3) != 0)
  741. {
  742. free(DeviceInterfaceDetailData);
  743. DeviceInterfaceDetailData = NULL;
  744. continue;
  745. }
  746. MacAddress tagMacAddress;
  747. tagMacAddress.nNICKind = NIC_PCI;
  748. _stprintf_s(tagMacAddress.szNICKind, _T("%s"), _T("NIC_PCI"));
  749. // 获取设备句柄;
  750. hDeviceFile = CreateFile(DeviceInterfaceDetailData->DevicePath,
  751. 0,
  752. FILE_SHARE_READ | FILE_SHARE_WRITE,
  753. NULL,
  754. OPEN_EXISTING,
  755. 0,
  756. NULL);
  757. if (hDeviceFile != INVALID_HANDLE_VALUE)
  758. {
  759. ULONG dwID;
  760. BYTE ucData[8];
  761. DWORD dwByteRet;
  762. // 获取原生MAC地址;
  763. dwID = OID_802_3_PERMANENT_ADDRESS;
  764. isOK = DeviceIoControl(hDeviceFile, IOCTL_NDIS_QUERY_GLOBAL_STATS, &dwID, sizeof(dwID), ucData, sizeof(ucData), &dwByteRet, NULL);
  765. if (isOK)
  766. {
  767. ++nTotal;
  768. _stprintf_s(tagMacAddress.szDevicePath, _T("%s"), DeviceInterfaceDetailData->DevicePath);
  769. memset(tagMacAddress.szMacAddress, 0, sizeof(TCHAR) * MAX_PATH);
  770. // 将字节数组转换成16进制字符串;
  771. for (DWORD i = 0; i < dwByteRet; i++)
  772. {
  773. _stprintf_s(&tagMacAddress.szMacAddress[i * 3], MAX_PATH - (i * 3), (i != dwByteRet - 1) ? _T("%02X-") : _T("%02X"), ucData[i]);
  774. }
  775. g_vtMac.push_back(tagMacAddress);
  776. }
  777. CloseHandle(hDeviceFile);
  778. }
  779. }
  780. free(DeviceInterfaceDetailData);
  781. DeviceInterfaceDetailData = NULL;
  782. }
  783. SetupDiDestroyDeviceInfoList(hDevInfo);
  784. #if 1
  785. g_strMacs.clear();
  786. std::vector<MacAddress>::iterator it = g_vtMac.begin();
  787. for (; it != g_vtMac.end(); it++)
  788. {
  789. g_strMacs.append(it->szMacAddress);
  790. g_strMacs.append("&");
  791. }
  792. #endif
  793. return nTotal;
  794. }
  795. BOOL IsValidString(LPCTSTR lpszString)
  796. {
  797. if (lpszString == NULL)
  798. return FALSE;
  799. do
  800. {
  801. // ASCII可显示的字符;
  802. if (*lpszString < 32 || *lpszString > 126)
  803. {
  804. return FALSE;
  805. }
  806. } while (*++lpszString);
  807. return TRUE;
  808. }
  809. } // namespace Global