DeviceControlFSM.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  1. #include "stdafx.h"
  2. #include "DeviceControlFSM.h"
  3. #include "GetDevInfoHelper.h"
  4. #include "EventCode.h"
  5. #include "fileutil.h"
  6. #include "toolkit.h"
  7. #include "osutil.h"
  8. #include "CommEntityUtil.hpp"
  9. #if defined(RVC_OS_WIN)
  10. static const char DEFAULT_ADAPTER_LIBRARY_NAME[] = "DeviceControl.cmbsz.1.1.dll";
  11. #else
  12. static const char DEFAULT_ADAPTER_LIBRARY_NAME[] = "libDeviceControl.cmbsz.1.1.so";
  13. #endif //RVC_OS_WIN
  14. namespace
  15. {
  16. /*
  17. PAD, Desk2S1.0: false
  18. * Stand2S, CardStore, Desk2S.2.0, Desk2S.2.1, Desk1S.1.0: true
  19. */
  20. bool IsNeedOpenUsb(CEntityBase* pCallerEntity)
  21. {
  22. bool result = false;
  23. ErrorCodeEnum errCode = Error_Unexpect;
  24. CSystemStaticInfo sysDevInfo;
  25. errCode = pCallerEntity->GetFunction()->GetSystemStaticInfo(sysDevInfo);
  26. CSimpleStringA strMachineType;
  27. strMachineType = sysDevInfo.strMachineType;
  28. WORD majorVersion = sysDevInfo.MachineVersion.GetMajor();
  29. WORD minorVersion = sysDevInfo.MachineVersion.GetMinor();
  30. CSimpleStringA machineVersion = CSimpleStringA::Format("%d.%d", majorVersion, minorVersion);
  31. Dbg("MachineType:%s, machineVersion:%s", strMachineType.GetData(), machineVersion.GetData());
  32. if (!strMachineType.Compare("RVC.PAD", true)
  33. || (!strMachineType.Compare("RVC.Desk2S", true) && !machineVersion.Compare("1.0"))) {
  34. result = false;
  35. } else if (!strMachineType.Compare("RVC.Stand2S", true) || !strMachineType.Compare("RVC.CardStore", true)
  36. || (!strMachineType.Compare("RVC.Desk2S", true) && !machineVersion.Compare("2.0"))
  37. || (!strMachineType.Compare("RVC.Desk2S", true) && !machineVersion.Compare("2.1"))
  38. || (!strMachineType.Compare("RVC.Desk1S", true) && !machineVersion.Compare("1.0"))) {
  39. result = true;
  40. } else {
  41. //TODO:: if add new machine type
  42. result = true;
  43. }
  44. return result;
  45. }
  46. }
  47. ErrorCodeEnum CDeviceControlFSM::OnInit()
  48. {
  49. LOG_FUNCTION();
  50. ErrorCodeEnum eErr;
  51. GET_DEV_ENTITY_BASE_POINTER()->InitializeVendorLogSwitch();
  52. CSmartPointer<IConfigInfo> spConfig;
  53. CSystemStaticInfo sysInfo;
  54. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  55. eErr = spEntityFunction->GetSystemStaticInfo(sysInfo);
  56. if (eErr != Error_Succeed) {
  57. Dbg("Get System Static info failed: %s.", SpStrError(eErr));
  58. return eErr;
  59. }
  60. eErr = spEntityFunction->OpenConfig(Config_Root, spConfig);
  61. if (eErr != Error_Succeed) {
  62. Dbg("open cfg file failed: %s.", SpStrError(eErr));
  63. return eErr;
  64. }
  65. m_csMachineType = sysInfo.strMachineType;
  66. Dbg("machine type:%s", (LPCTSTR)m_csMachineType);
  67. CSimpleStringA dllName, tmpDevSN("");
  68. #if defined(RVC_OS_WIN)
  69. spEntityFunction->GetSysVar("FWBDevSN", tmpDevSN);
  70. m_bFWB = (tmpDevSN.GetLength() > 12 && tmpDevSN.IndexOf("FWB") > 2);
  71. #endif //RVC_OS_WIN
  72. const bool IsNotPadType = (m_csMachineType.IsNullOrEmpty() || m_csMachineType.Compare("RVC.PAD", true) != 0 || m_bFWB);
  73. if(IsNotPadType) {
  74. CSimpleStringA csDepPath("");
  75. eErr = spEntityFunction->GetPath("Dep", csDepPath);
  76. if (eErr == Error_Succeed) {
  77. Dbg("not RVC.PAD or is FWB(%d),to use default dll.", m_bFWB);
  78. dllName = csDepPath + SPLIT_SLASH_STR;
  79. dllName += DEFAULT_ADAPTER_LIBRARY_NAME;
  80. }
  81. } else {
  82. auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
  83. eErr = pEntity->ExtractVendorLibFullPath(dllName);
  84. if (eErr != Error_Succeed) {
  85. Dbg("ExtractVendorLibFullPath(%s) failed.", (LPCTSTR)dllName);
  86. return Error_DevLoadFileFailed;
  87. }
  88. Dbg("%s", (LPCTSTR)dllName);
  89. }
  90. eErr = m_hDevHelper.LoadUp(dllName);
  91. if (eErr != Error_Succeed) {
  92. Dbg("LoadUp failed.%s", SpStrError(eErr));
  93. return Error_DevLoadFileFailed;
  94. } else {
  95. Dbg("load vendor dll and pointer suc.");
  96. }
  97. InitializeTokenLib();
  98. if (!IsNotPadType)//RVC.PAD to read root.ini
  99. {
  100. int baudRate, port;
  101. spConfig->ReadConfigValueInt("Device.DeviceControl", "Baudrate", baudRate);
  102. spConfig->ReadConfigValueInt("Device.DeviceControl", "Port", port);
  103. eErr = m_hDevHelper->DevOpen(port, baudRate);
  104. if (eErr != Error_Succeed) {
  105. LOG_DEVCONTROL_ERROR_MSG_MACRO(eErr, DevOpen);
  106. return Error_DevConnFailed;
  107. } else {
  108. Dbg("Open device succ.");
  109. }
  110. eErr = m_hDevHelper->PortControl(USB_PORT_ENABLE);
  111. if (eErr != Error_Succeed) {
  112. LOG_DEVCONTROL_ERROR_MSG_MACRO(eErr, PortControl);
  113. }
  114. }
  115. DoBrowserCacheClearJob();
  116. //DoRestartSogouServicesJob();
  117. return Error_Succeed;
  118. }
  119. ErrorCodeEnum CDeviceControlFSM::InitializeTokenLib()
  120. {
  121. #if defined(RVC_OS_WIN)
  122. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  123. CSimpleStringA csDepPath("");
  124. ErrorCodeEnum eErr = spEntityFunction->GetPath("Dep", csDepPath);
  125. if (eErr == Error_Succeed) {
  126. CSimpleStringA csAQUkeyDll, csBackslash("\\");
  127. csAQUkeyDll = csDepPath + csBackslash + "token.dll";
  128. m_hTokenDll = LoadLibraryA(csAQUkeyDll);
  129. if (m_hTokenDll == NULL) {
  130. Dbg("Load aq dll failed.%d", GetLastError());
  131. return Error_DevLoadFileFailed;
  132. } else {
  133. if ((AQGetUKeyID = (lpGetUKeyID)GetProcAddress(m_hTokenDll, "GetUKeyID")) == NULL) {
  134. Dbg("Get GetUKeyID failed.");
  135. return Error_DevLoadFileFailed;
  136. }
  137. if ((AQInitToken = (lpInitToken)GetProcAddress(m_hTokenDll, "InitToken")) == NULL) {
  138. Dbg("Get InitToken failed.");
  139. return Error_DevLoadFileFailed;
  140. }
  141. Dbg("Load aq suc.");
  142. }
  143. }
  144. return eErr;
  145. #else
  146. return Error_NotSupport;
  147. #endif //RVC_OS_WIN
  148. }
  149. void CDeviceControlFSM::DoBrowserCacheClearJob()
  150. {
  151. LOG_FUNCTION();
  152. CSmartPointer<IConfigInfo> spConfig;
  153. ErrorCodeEnum err = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfig);
  154. CSimpleStringA str(true);
  155. err = spConfig->ReadConfigValue("Browser", "CacheClear", str);
  156. if (str.Compare("true", true) == 0) {
  157. CSimpleStringA strCachePath;
  158. GetEntityBase()->GetFunction()->GetPath("Temp", strCachePath);
  159. if (!strCachePath.IsNullOrEmpty()) {
  160. strCachePath += SPLIT_SLASH_STR;
  161. strCachePath += "cefCache";
  162. Dbg("browser cache path: %s", strCachePath.GetData());
  163. if (ExistsDirA(strCachePath)) {
  164. RemoveDirRecursiveA(strCachePath);
  165. LogWarn(Severity_Middle, Error_Debug, LOG_DEVICECONTROL_BROWSER_CACHE_CLEAER, "clear chromium browser cache.");
  166. }
  167. if (!ExistsDirA(strCachePath)) {
  168. spConfig->WriteConfigValue("Browser", "CacheClear", NULL);
  169. }
  170. }
  171. }
  172. }
  173. void CDeviceControlFSM::DoRestartSogouServicesJob()
  174. {
  175. LOG_FUNCTION();
  176. CSmartPointer<IConfigInfo> spConfig;
  177. ErrorCodeEnum err = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfig);
  178. CSimpleStringA str(true);
  179. err = spConfig->ReadConfigValue("Browser", "SogouRestart", str);
  180. if (str.Compare("true", true) == 0) {
  181. spConfig->WriteConfigValue("Browser", "SogouRestart", NULL);
  182. RestartSogouServices();
  183. }
  184. }
  185. ErrorCodeEnum CDeviceControlFSM::RestartSogouServices()
  186. {
  187. LOG_FUNCTION();
  188. ErrorCodeEnum result(Error_Succeed);
  189. CSimpleStringA shellScriptPath;
  190. GetEntityBase()->GetFunction()->GetPath("Base", shellScriptPath);
  191. shellScriptPath += SPLIT_SLASH_STR;
  192. shellScriptPath += "res" SPLIT_SLASH_STR "RunScript" SPLIT_SLASH_STR;
  193. std::string startup_service(shellScriptPath.GetData());
  194. startup_service += "startup_sogouservice.sh";
  195. std::string shutdown_service(shellScriptPath.GetData());
  196. shutdown_service += "shutdown_sogouservice.sh";
  197. std::string shutdown_service_without_monitor(shellScriptPath.GetData());
  198. shutdown_service_without_monitor += "shutdown_sogouservice_without_monitor.sh";
  199. const BOOL s1 = ExistsFileA(startup_service.c_str());
  200. const BOOL s2 = ExistsFileA(shutdown_service.c_str());
  201. const BOOL s3 = ExistsFileA(shutdown_service_without_monitor.c_str());
  202. if (s3) {
  203. char* relate_processes[3] = { "sogouImeWebSrv", "sogouImeService", "sogoumonitor.sh" };
  204. int count = 4;
  205. alive_process_info old_processes[4];
  206. memset(old_processes, 0, sizeof(old_processes));
  207. osutil_detect_unique_app(relate_processes, array_size(relate_processes), &count, old_processes);
  208. int sogouImeWebSrv_PID(0), sogouImeServicePID(0);
  209. bool monitor_exist(false), other_exists(false);
  210. for (int i = 0; i < count; ++i) {
  211. if (strcmp(old_processes[i].name, relate_processes[2]) == 0) {
  212. monitor_exist = true;
  213. } else {
  214. other_exists = false;
  215. }
  216. if (strcmp(old_processes[i].name, relate_processes[0]) == 0) {
  217. sogouImeWebSrv_PID = old_processes[i].pid;
  218. } else if (strcmp(old_processes[i].name, relate_processes[1]) == 0) {
  219. sogouImeServicePID = old_processes[i].pid;
  220. }
  221. }
  222. if (!monitor_exist) {
  223. return Error_InvalidState;
  224. } else if(!other_exists){
  225. return Error_NotExist;
  226. } else {
  227. std::string succStr, errStr;
  228. std::string runStr("bash ");
  229. runStr += shutdown_service_without_monitor;
  230. if (!SP::Module::Util::ShelllExecute(runStr, succStr, errStr)) {
  231. LogWarn(Severity_Middle, Error_Unexpect, LOG_DEVICECONTROL_SOGOU_SCRIPTS_EXECUTE_FAILED,
  232. CSimpleStringA::Format("%s: %s, %s", shutdown_service_without_monitor.c_str(), succStr.c_str(), errStr.c_str()));
  233. return Error_Unexpect;
  234. } else {
  235. Dbg("execute {%s} suc: %s", shutdown_service_without_monitor.c_str(), succStr.c_str());
  236. /**等待服务进程退出 */
  237. Sleep(300);
  238. /** Sogou的监护服务每隔5s会检测搜狗服务是否存在,否则会重启,为什么不自己重启,因为搜狗服务得跑在普通用户权限下 [Gifur@20211230]*/
  239. const DWORD defaultInterval = 3000;
  240. const int maxtIntervalTimes(3);
  241. int intervalTimes(0);
  242. char* relate_processes2[2] = { "sogouImeWebSrv", "sogouImeService" };
  243. int count2 = 3;
  244. bool succ_flag(false);
  245. int sogouImeWebSrv_newPID(0), sogouImeService_newPID(0);
  246. alive_process_info new_processes[3];
  247. memset(new_processes, 0, sizeof(new_processes));
  248. osutil_detect_unique_app(relate_processes2, array_size(relate_processes2), &count2, new_processes);
  249. while (intervalTimes < maxtIntervalTimes) {
  250. if (count2 == 2/*normal process count*/) {
  251. int exit_flag(0);
  252. for (int i = 0; i < count2; ++i) {
  253. if (strcmp(new_processes[i].name, relate_processes2[0]) == 0 && sogouImeWebSrv_PID != new_processes[i].pid) {
  254. sogouImeWebSrv_newPID = new_processes[i].pid;
  255. exit_flag += 1;
  256. } else if (strcmp(new_processes[i].name, relate_processes2[1]) == 0 && sogouImeServicePID != new_processes[i].pid) {
  257. exit_flag += 1;
  258. sogouImeService_newPID = new_processes[i].pid;
  259. }
  260. }
  261. if (exit_flag == 2) {
  262. succ_flag = true;
  263. break;
  264. }
  265. }
  266. Sleep(defaultInterval);
  267. count2 = 3;
  268. memset(new_processes, 0, sizeof(new_processes));
  269. osutil_detect_unique_app(relate_processes2, array_size(relate_processes2), &count2, new_processes);
  270. intervalTimes++;
  271. }
  272. if (succ_flag) {
  273. LogWarn(Severity_Middle, Error_Debug, LOG_DEVICECONTROL_SOGOU_SCRIPTS_EXECUTE_SUCC,
  274. CSimpleStringA::Format("auto restart sogou services succ: WebSrv pid: %u, Service pid: %u", sogouImeWebSrv_newPID, sogouImeService_newPID));
  275. result = Error_Succeed;
  276. } else {
  277. LogWarn(Severity_Middle, Error_TimeOut, LOG_DEVICECONTROL_SOGOU_SCRIPTS_EXECUTE_SUCC, "wait sogou auto restart timeout");
  278. result = Error_TimeOut;
  279. }
  280. }
  281. }
  282. }
  283. else if (s1 && s2) {
  284. do {
  285. std::string succStr, errStr;
  286. std::string runStr("bash ");
  287. runStr += shutdown_service;
  288. if (!SP::Module::Util::ShelllExecute(runStr, succStr, errStr)) {
  289. LogWarn(Severity_Middle, Error_Unexpect, LOG_DEVICECONTROL_SOGOU_SCRIPTS_EXECUTE_FAILED,
  290. CSimpleStringA::Format("%s: %s, %s", shutdown_service.c_str(), succStr.c_str(), errStr.c_str()));
  291. return Error_Unexpect;
  292. } else {
  293. Dbg("execute {%s} suc: %s", shutdown_service.c_str(), succStr.c_str());
  294. }
  295. } while (false);
  296. Sleep(3000);
  297. do {
  298. char app[MAX_PATH] = { '\0' };
  299. tk_process_t* process = NULL;
  300. tk_process_option_t option;
  301. option.exit_cb = NULL;
  302. option.file = NULL;
  303. option.flags = 0;
  304. sprintf(app, "bash %s", startup_service.c_str());
  305. option.params = app;
  306. const int res = process_spawn(&option, &process);
  307. if (0 == res) {
  308. FREE(process);
  309. Dbg("execute {%s} suc", startup_service.c_str());
  310. } else {
  311. LogWarn(Severity_Middle, Error_Unexpect, LOG_DEVICECONTROL_SOGOU_SCRIPTS_EXECUTE_FAILED,
  312. CSimpleStringA::Format("%s: %d", startup_service.c_str(), res));
  313. return Error_Unexpect;
  314. }
  315. } while (false);
  316. LogWarn(Severity_Middle, Error_Unexpect, LOG_DEVICECONTROL_SOGOU_SCRIPTS_EXECUTE_SUCC, "sogou restart succ.");
  317. } else {
  318. LogWarn(Severity_Middle, Error_NotExist, LOG_DEVICECONTROL_SOGOU_SCRIPTS_NOT_EXISTS,
  319. CSimpleStringA::Format("%s=%d, %s=%d", startup_service.c_str(), s1, shutdown_service.c_str(), s2));
  320. result = Error_NotExist;
  321. }
  322. return result;
  323. }
  324. ErrorCodeEnum CDeviceControlFSM::OnExit()
  325. {
  326. return Error_Succeed;
  327. }
  328. unsigned int CDeviceControlFSM::s0_on_event(FSMEvent* pEvt)
  329. {
  330. Dbg("s0 event %d,%d", pEvt->iEvt, pEvt->param1);
  331. switch (pEvt->iEvt) {
  332. case USER_EVT_USB:
  333. {
  334. USBEvent* ue = dynamic_cast<USBEvent*>(pEvt);
  335. OpenTask* task = new OpenTask(this);
  336. task->ctx = ue->ctx;
  337. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  338. pEvt->SetHandled();
  339. return 0;
  340. }
  341. case USER_EVT_QUERY_USB:
  342. {
  343. QueryUSBEvent* ue = dynamic_cast<QueryUSBEvent*>(pEvt);
  344. QueryUSBTask* task = new QueryUSBTask(this);
  345. task->ctx = ue->ctx;
  346. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  347. pEvt->SetHandled();
  348. return 0;
  349. }
  350. case USER_EVT_GET_UKEYID:
  351. {
  352. GetUkeyIDEvent* ue = dynamic_cast<GetUkeyIDEvent*>(pEvt);
  353. GetUkeyIDTask* task = new GetUkeyIDTask(this);
  354. task->ctx = ue->ctx;
  355. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  356. pEvt->SetHandled();
  357. #if defined(RVC_OS_WIN)
  358. m_bWorkingOp = true;
  359. WorkingOpTask* pOp = new WorkingOpTask(this);
  360. GetEntityBase()->GetFunction()->PostThreadPoolTask(pOp);
  361. #endif //RVC_OS_WIN
  362. return 0;
  363. }
  364. case USER_EVT_INIT_TOKEN:
  365. {
  366. InitTokenEvent* ue = dynamic_cast<InitTokenEvent*>(pEvt);
  367. InitTokenTask* task = new InitTokenTask(this);
  368. task->ctx = ue->ctx;
  369. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  370. pEvt->SetHandled();
  371. #if defined(RVC_OS_WIN)
  372. m_bWorkingOp = true;
  373. WorkingOpTask* pOp = new WorkingOpTask(this);
  374. GetEntityBase()->GetFunction()->PostThreadPoolTask(pOp);
  375. #endif //RVC_OS_WIN
  376. return 0;
  377. }
  378. default:
  379. break;
  380. }
  381. return 0;
  382. }
  383. unsigned int CDeviceControlFSM::s1_on_event(FSMEvent* pEvt)
  384. {
  385. Dbg("s1 %d,%d", pEvt->iEvt, pEvt->param1);
  386. switch (pEvt->iEvt) {
  387. case USER_EVT_USB_FINISHED:
  388. pEvt->SetHandled();
  389. return pEvt->param1;
  390. case USER_EVT_QUERY_USB_FINISHED:
  391. pEvt->SetHandled();
  392. return pEvt->param1;
  393. default:
  394. break;
  395. }
  396. return 0;
  397. }
  398. unsigned int CDeviceControlFSM::s3_on_event(FSMEvent* pEvt)
  399. {
  400. Dbg("s3 %d,%d", pEvt->iEvt, pEvt->param1);
  401. switch (pEvt->iEvt) {
  402. case USER_EVT_GET_UKEYID_FINISHED:
  403. pEvt->SetHandled();
  404. return pEvt->param1;
  405. default:
  406. break;
  407. }
  408. return 0;
  409. }
  410. unsigned int CDeviceControlFSM::s4_on_event(FSMEvent* pEvt)
  411. {
  412. Dbg("s4 %d,%d", pEvt->iEvt, pEvt->param1);
  413. switch (pEvt->iEvt) {
  414. case USER_EVT_INIT_TOKEN_FINISHED:
  415. pEvt->SetHandled();
  416. return pEvt->param1;
  417. default:
  418. break;
  419. }
  420. return 0;
  421. }
  422. int CDeviceControlFSM::UsbControl(SpReqAnsContext<DeviceControlService_USB_Req, DeviceControlService_USB_Ans>::Pointer ctx)
  423. {
  424. Dbg("open %d", ctx->Req.open);
  425. if (IsNeedOpenUsb(m_pEntity)) {
  426. ControlType eType;
  427. if (ctx->Req.open) {
  428. eType = USB_PORT_ENABLE;
  429. LogEvent(Severity_Middle, LOG_EVT_USB_CONTROL_ON, "usb on");//control by gpio
  430. LogEvent(Severity_Middle, LOG_EVT_USB_LIGHT_ON, "usb on");//control by gpio
  431. } else {
  432. eType = USB_PORT_DISABLE;
  433. LogEvent(Severity_Middle, LOG_EVT_USB_CONTROL_OFF, "usb off");//control by gpio
  434. LogEvent(Severity_Middle, LOG_EVT_USB_LIGHT_OFF, "usb off");//control by gpio
  435. }
  436. } else {
  437. Dbg("no need open/close usb, this machine's usb is always open.");
  438. }
  439. ctx->Answer(Error_Succeed);
  440. return 0;
  441. }
  442. int CDeviceControlFSM::GetUkeyIDx(SpReqAnsContext<DeviceControlService_GetUkeyID_Req, DeviceControlService_GetUkeyID_Ans>::Pointer ctx)
  443. {
  444. LOG_FUNCTION();
  445. if (ctx == NULL) {
  446. Dbg("ctx is null.");
  447. return 1;
  448. }
  449. #if defined(RVC_OS_WIN)
  450. char pID[512];
  451. ZeroMemory(pID, 512);
  452. int tmp = 512;
  453. int ret = AQGetUKeyID(pID, tmp);
  454. m_bWorkingOp = false;
  455. if (ret == 0) {
  456. ctx->Ans.UkeyID = pID;
  457. ctx->Ans.UkeyIDLen = strlen(pID);
  458. Dbg("oiltest ukey id [%d][%s][%d]", tmp, (LPCTSTR)ctx->Ans.UkeyID, ctx->Ans.UkeyIDLen);
  459. ctx->Ans.reserved1 = 999;
  460. ctx->Answer(Error_Succeed);
  461. return 0;
  462. } else {
  463. Dbg("GetUKey failed.%d,%d", ret, GetLastError());
  464. ctx->Ans.reserved1 = ret;
  465. ctx->Answer(Error_Succeed);
  466. return 1;
  467. }
  468. #else
  469. ctx->Answer(Error_NotSupport);
  470. return 1;
  471. #endif //RVC_OS_WIN
  472. }
  473. int CDeviceControlFSM::InitTokenx(SpReqAnsContext<DeviceControlService_InitToken_Req, DeviceControlService_InitToken_Ans>::Pointer ctx)
  474. {
  475. LOG_FUNCTION();
  476. if (ctx == NULL) {
  477. Dbg("ctx is null.");
  478. return 1;
  479. }
  480. #if defined(RVC_OS_WIN)
  481. int tokensnlen, pkcs10len, msglen;
  482. tokensnlen = 32;
  483. pkcs10len = 2048;
  484. msglen = 128;
  485. char tokenSn[32], pkcs10[2048], msg[128];
  486. ZeroMemory(tokenSn, tokensnlen);
  487. ZeroMemory(pkcs10, pkcs10len);
  488. ZeroMemory(msg, msglen);
  489. int ret = AQInitToken(const_cast<char*>(ctx->Req.CertType.GetData())
  490. , ctx->Ans.TokenType, const_cast<char*>(ctx->Req.OldSuperPwd.GetData())
  491. , const_cast<char*>(ctx->Req.UserName.GetData())
  492. , const_cast<char*>(ctx->Req.UserIDType.GetData())
  493. , const_cast<char*>(ctx->Req.UserIDNo.GetData())
  494. , tokenSn
  495. , tokensnlen, pkcs10, pkcs10len, msg, msglen);
  496. m_bWorkingOp = false;
  497. if (ret == 0) {
  498. Dbg("[%d][%s][%d][%s][%d]", tokensnlen, tokenSn, msglen, msg, pkcs10len);
  499. char xx1[768], xx2[768];
  500. ZeroMemory(xx1, 768);
  501. ZeroMemory(xx2, 768);
  502. if (pkcs10len > 600) {
  503. strncpy(xx1, pkcs10, 600);
  504. strncpy(xx2, pkcs10 + 600, pkcs10len - 600 + 1);
  505. } else
  506. strncpy(xx1, pkcs10, pkcs10len);
  507. Dbg("[%s]", xx1);
  508. Dbg("[%s]", xx2);
  509. ctx->Ans.TokenSn = tokenSn;
  510. ctx->Ans.PKCS10 = pkcs10;
  511. ctx->Ans.Msg = msg;
  512. ctx->Ans.TokenSnLen = tokensnlen;
  513. ctx->Ans.PKCS10Len = pkcs10len;
  514. ctx->Ans.MsgLen = msglen;
  515. ctx->Ans.reserved1 = 999;
  516. ctx->Answer(Error_Succeed);
  517. return 0;
  518. } else {
  519. Dbg("InitToken failed.%d,%d", ret, GetLastError());
  520. ctx->Ans.reserved1 = ret;
  521. ctx->Answer(Error_Succeed);
  522. return 1;
  523. }
  524. #else
  525. ctx->Answer(Error_NotSupport);
  526. return 1;
  527. #endif //RVC_OS_WIN
  528. }
  529. int CDeviceControlFSM::QueryUSB(SpReqAnsContext<DeviceControlService_QueryUSBStatus_Req
  530. , DeviceControlService_QueryUSBStatus_Ans>::Pointer ctx)
  531. {
  532. ErrorCodeEnum eErr = Error_Unexpect;
  533. GpioService_ClientBase* pGpio = new GpioService_ClientBase(this->GetEntityBase());
  534. if (pGpio != NULL) {
  535. eErr = pGpio->Connect();
  536. if (eErr != Error_Succeed) {
  537. Dbg("connect to gpio failed.");
  538. pGpio->SafeDelete();
  539. pGpio = NULL;
  540. ctx->Answer(eErr);
  541. return 0;
  542. }
  543. GpioService_QueryCurrSet_Req req;
  544. GpioService_QueryCurrSet_Ans ans;
  545. eErr = pGpio->QueryCurrSet(req, ans, 10000);
  546. if (eErr == Error_Succeed) {
  547. ctx->Ans.flag = ((ans.output & 0x2) == 0x2);
  548. Dbg("%d,%d", ans.output, ctx->Ans.flag);
  549. ctx->Answer(Error_Succeed);
  550. } else {
  551. Dbg("Query usb failed: %s", SpStrError(eErr));
  552. ctx->Answer(eErr);
  553. }
  554. pGpio->GetFunction()->CloseSession();
  555. }
  556. return 0;
  557. }
  558. /** 5s per times and quit after 100 times*/
  559. void CDeviceControlFSM::WorkingOp()
  560. {
  561. int count = 0;
  562. while (m_bWorkingOp) {
  563. //relate with eventconvert
  564. LogEvent(Severity_Low, LOG_EVT_USB_CONTROL_OP, "ukey op.");
  565. Sleep(5000);
  566. count++;
  567. if (count > 100) {
  568. m_bWorkingOp = false;
  569. break;
  570. }
  571. }
  572. }