DeviceControlFSM.cpp 21 KB

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