DeviceControlFSM.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  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. BOOL bSucc(FALSE);
  158. CSimpleStringA strCachePath;
  159. GetEntityBase()->GetFunction()->GetPath("Temp", strCachePath);
  160. if (!strCachePath.IsNullOrEmpty()) {
  161. bSucc = TRUE;
  162. const char* cacheDirs[] = {"cefCache", "cefCache_Ad", "cefCache_breakdown", "cefCache_ErrNotify", "cefCache_main"
  163. , "UOSBrowser_Ad", "UOSBrowser_main" };
  164. for(int i=0; i<array_size(cacheDirs); ++i)
  165. {
  166. CSimpleStringA strcefCachePath(strCachePath);
  167. strcefCachePath += SPLIT_SLASH_STR;
  168. strcefCachePath += cacheDirs[i];
  169. if (ExistsDirA(strcefCachePath)) {
  170. RemoveDirRecursiveA(strcefCachePath);
  171. LogWarn(Severity_Middle, Error_Debug, LOG_DEVICECONTROL_BROWSER_CACHE_CLEAER,
  172. CSimpleStringA::Format("clear chromium browser cache: %s", strcefCachePath.GetData()));
  173. }
  174. }
  175. }
  176. if (bSucc) {
  177. spConfig->WriteConfigValue("Browser", "CacheClear", NULL);
  178. }
  179. }
  180. }
  181. void CDeviceControlFSM::DoRestartSogouServicesJob()
  182. {
  183. LOG_FUNCTION();
  184. CSmartPointer<IConfigInfo> spConfig;
  185. ErrorCodeEnum err = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfig);
  186. CSimpleStringA str(true);
  187. err = spConfig->ReadConfigValue("Browser", "SogouRestart", str);
  188. if (str.Compare("true", true) == 0) {
  189. spConfig->WriteConfigValue("Browser", "SogouRestart", NULL);
  190. RestartSogouServices();
  191. }
  192. }
  193. ErrorCodeEnum CDeviceControlFSM::RestartSogouServices()
  194. {
  195. LOG_FUNCTION();
  196. ErrorCodeEnum result(Error_Succeed);
  197. CSimpleStringA shellScriptPath;
  198. GetEntityBase()->GetFunction()->GetPath("Base", shellScriptPath);
  199. shellScriptPath += SPLIT_SLASH_STR;
  200. shellScriptPath += "res" SPLIT_SLASH_STR "RunScript" SPLIT_SLASH_STR;
  201. std::string startup_service(shellScriptPath.GetData());
  202. startup_service += "startup_sogouservice.sh";
  203. std::string shutdown_service(shellScriptPath.GetData());
  204. shutdown_service += "shutdown_sogouservice.sh";
  205. std::string shutdown_service_without_monitor(shellScriptPath.GetData());
  206. shutdown_service_without_monitor += "shutdown_sogouservice_without_monitor.sh";
  207. const BOOL s1 = ExistsFileA(startup_service.c_str());
  208. const BOOL s2 = ExistsFileA(shutdown_service.c_str());
  209. const BOOL s3 = ExistsFileA(shutdown_service_without_monitor.c_str());
  210. if (s3) {
  211. Dbg("to shutdown sogou service except monitor...");
  212. char* relate_processes[3] = { "sogouImeWebSrv", "sogouImeService", "sogoumonitor.sh" };
  213. int count = 4;
  214. alive_process_info old_processes[4];
  215. memset(old_processes, 0, sizeof(old_processes));
  216. osutil_detect_unique_app(relate_processes, array_size(relate_processes), &count, old_processes);
  217. int sogouImeWebSrv_PID(0), sogouImeServicePID(0);
  218. bool monitor_exist(false), other_exists(false);
  219. /** 因为接口暂时获取不了命令行的内容,只能暂时将此接口置为成功 [Gifur@2022110]*/
  220. monitor_exist = true;
  221. for (int i = 0; i < count; ++i) {
  222. if (strcmp(old_processes[i].name, relate_processes[2]) == 0) {
  223. monitor_exist = true;
  224. } else {
  225. other_exists = true;
  226. }
  227. if (strcmp(old_processes[i].name, relate_processes[0]) == 0) {
  228. sogouImeWebSrv_PID = old_processes[i].pid;
  229. } else if (strcmp(old_processes[i].name, relate_processes[1]) == 0) {
  230. sogouImeServicePID = old_processes[i].pid;
  231. }
  232. }
  233. if (!monitor_exist) {
  234. return Error_InvalidState;
  235. } else if(!other_exists){
  236. return Error_NotExist;
  237. } else {
  238. std::string succStr, errStr;
  239. std::string runStr("bash ");
  240. runStr += shutdown_service_without_monitor;
  241. if (!SP::Module::Util::ShelllExecute(runStr, succStr, errStr)) {
  242. LogWarn(Severity_Middle, Error_Unexpect, LOG_DEVICECONTROL_SOGOU_SCRIPTS_EXECUTE_FAILED,
  243. CSimpleStringA::Format("%s: %s, %s", shutdown_service_without_monitor.c_str(), succStr.c_str(), errStr.c_str()));
  244. return Error_Unexpect;
  245. } else {
  246. Dbg("execute {%s} suc: %s", shutdown_service_without_monitor.c_str(), succStr.c_str());
  247. /**等待服务进程退出 */
  248. Sleep(300);
  249. /** Sogou的监护服务每隔5s会检测搜狗服务是否存在,否则会重启,为什么不自己重启,因为搜狗服务得跑在普通用户权限下 [Gifur@20211230]*/
  250. const DWORD defaultInterval = 3000;
  251. const int maxtIntervalTimes(3);
  252. int intervalTimes(0);
  253. char* relate_processes2[2] = { "sogouImeWebSrv", "sogouImeService" };
  254. bool succ_flag(false);
  255. int sogouImeWebSrv_newPID(0), sogouImeService_newPID(0);
  256. int count2 = 3;
  257. alive_process_info new_processes[3];
  258. memset(new_processes, 0, sizeof(new_processes));
  259. osutil_detect_unique_app(relate_processes2, array_size(relate_processes2), &count2, new_processes);
  260. do {
  261. if (count2 == 2/*normal process count*/) {
  262. int exit_flag(0);
  263. for (int i = 0; i < count2; ++i) {
  264. if (strcmp(new_processes[i].name, relate_processes2[0]) == 0 && sogouImeWebSrv_PID != new_processes[i].pid) {
  265. sogouImeWebSrv_newPID = new_processes[i].pid;
  266. exit_flag += 1;
  267. } else if (strcmp(new_processes[i].name, relate_processes2[1]) == 0 && sogouImeServicePID != new_processes[i].pid) {
  268. exit_flag += 1;
  269. sogouImeService_newPID = new_processes[i].pid;
  270. }
  271. }
  272. if (exit_flag == 2) {
  273. succ_flag = true;
  274. break;
  275. }
  276. }
  277. if (++intervalTimes >= maxtIntervalTimes) {
  278. break;
  279. }
  280. Sleep(defaultInterval);
  281. count2 = 3;
  282. memset(new_processes, 0, sizeof(new_processes));
  283. osutil_detect_unique_app(relate_processes2, array_size(relate_processes2), &count2, new_processes);
  284. } while (true);
  285. if (succ_flag) {
  286. LogWarn(Severity_Middle, Error_Debug, LOG_DEVICECONTROL_SOGOU_SCRIPTS_EXECUTE_SUCC,
  287. CSimpleStringA::Format("auto restart sogou services succ: WebSrv pid: %u, Service pid: %u", sogouImeWebSrv_newPID, sogouImeService_newPID));
  288. result = Error_Succeed;
  289. } else {
  290. LogWarn(Severity_Middle, Error_TimeOut, LOG_DEVICECONTROL_SOGOU_SCRIPTS_EXECUTE_TIMEOUT, "wait sogou auto restart timeout");
  291. result = Error_TimeOut;
  292. }
  293. }
  294. }
  295. }
  296. else if (s1 && s2) {
  297. do {
  298. std::string succStr, errStr;
  299. std::string runStr("bash ");
  300. runStr += shutdown_service;
  301. if (!SP::Module::Util::ShelllExecute(runStr, succStr, errStr)) {
  302. LogWarn(Severity_Middle, Error_Unexpect, LOG_DEVICECONTROL_SOGOU_SCRIPTS_EXECUTE_FAILED,
  303. CSimpleStringA::Format("%s: %s, %s", shutdown_service.c_str(), succStr.c_str(), errStr.c_str()));
  304. return Error_Unexpect;
  305. } else {
  306. Dbg("execute {%s} suc: %s", shutdown_service.c_str(), succStr.c_str());
  307. }
  308. } while (false);
  309. Sleep(3000);
  310. do {
  311. char app[MAX_PATH] = { '\0' };
  312. tk_process_t* process = NULL;
  313. tk_process_option_t option;
  314. option.exit_cb = NULL;
  315. option.file = NULL;
  316. option.flags = 0;
  317. sprintf(app, "bash %s", startup_service.c_str());
  318. option.params = app;
  319. const int res = process_spawn(&option, &process);
  320. if (0 == res) {
  321. FREE(process);
  322. Dbg("execute {%s} suc", startup_service.c_str());
  323. } else {
  324. LogWarn(Severity_Middle, Error_Unexpect, LOG_DEVICECONTROL_SOGOU_SCRIPTS_EXECUTE_FAILED,
  325. CSimpleStringA::Format("%s: %d", startup_service.c_str(), res));
  326. return Error_Unexpect;
  327. }
  328. } while (false);
  329. LogWarn(Severity_Middle, Error_Unexpect, LOG_DEVICECONTROL_SOGOU_SCRIPTS_EXECUTE_SUCC, "sogou restart succ.");
  330. } else {
  331. LogWarn(Severity_Middle, Error_NotExist, LOG_DEVICECONTROL_SOGOU_SCRIPTS_NOT_EXISTS,
  332. CSimpleStringA::Format("%s=%d, %s=%d", startup_service.c_str(), s1, shutdown_service.c_str(), s2));
  333. result = Error_NotExist;
  334. }
  335. return result;
  336. }
  337. ErrorCodeEnum CDeviceControlFSM::OnExit()
  338. {
  339. return Error_Succeed;
  340. }
  341. unsigned int CDeviceControlFSM::s0_on_event(FSMEvent* pEvt)
  342. {
  343. Dbg("s0 event %d,%d", pEvt->iEvt, pEvt->param1);
  344. switch (pEvt->iEvt) {
  345. case USER_EVT_USB:
  346. {
  347. USBEvent* ue = dynamic_cast<USBEvent*>(pEvt);
  348. OpenTask* task = new OpenTask(this);
  349. task->ctx = ue->ctx;
  350. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  351. pEvt->SetHandled();
  352. return 0;
  353. }
  354. case USER_EVT_QUERY_USB:
  355. {
  356. QueryUSBEvent* ue = dynamic_cast<QueryUSBEvent*>(pEvt);
  357. QueryUSBTask* task = new QueryUSBTask(this);
  358. task->ctx = ue->ctx;
  359. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  360. pEvt->SetHandled();
  361. return 0;
  362. }
  363. case USER_EVT_GET_UKEYID:
  364. {
  365. GetUkeyIDEvent* ue = dynamic_cast<GetUkeyIDEvent*>(pEvt);
  366. GetUkeyIDTask* task = new GetUkeyIDTask(this);
  367. task->ctx = ue->ctx;
  368. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  369. pEvt->SetHandled();
  370. #if defined(RVC_OS_WIN)
  371. m_bWorkingOp = true;
  372. WorkingOpTask* pOp = new WorkingOpTask(this);
  373. GetEntityBase()->GetFunction()->PostThreadPoolTask(pOp);
  374. #endif //RVC_OS_WIN
  375. return 0;
  376. }
  377. case USER_EVT_INIT_TOKEN:
  378. {
  379. InitTokenEvent* ue = dynamic_cast<InitTokenEvent*>(pEvt);
  380. InitTokenTask* task = new InitTokenTask(this);
  381. task->ctx = ue->ctx;
  382. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  383. pEvt->SetHandled();
  384. #if defined(RVC_OS_WIN)
  385. m_bWorkingOp = true;
  386. WorkingOpTask* pOp = new WorkingOpTask(this);
  387. GetEntityBase()->GetFunction()->PostThreadPoolTask(pOp);
  388. #endif //RVC_OS_WIN
  389. return 0;
  390. }
  391. default:
  392. break;
  393. }
  394. return 0;
  395. }
  396. unsigned int CDeviceControlFSM::s1_on_event(FSMEvent* pEvt)
  397. {
  398. Dbg("s1 %d,%d", pEvt->iEvt, pEvt->param1);
  399. switch (pEvt->iEvt) {
  400. case USER_EVT_USB_FINISHED:
  401. pEvt->SetHandled();
  402. return pEvt->param1;
  403. case USER_EVT_QUERY_USB_FINISHED:
  404. pEvt->SetHandled();
  405. return pEvt->param1;
  406. default:
  407. break;
  408. }
  409. return 0;
  410. }
  411. unsigned int CDeviceControlFSM::s3_on_event(FSMEvent* pEvt)
  412. {
  413. Dbg("s3 %d,%d", pEvt->iEvt, pEvt->param1);
  414. switch (pEvt->iEvt) {
  415. case USER_EVT_GET_UKEYID_FINISHED:
  416. pEvt->SetHandled();
  417. return pEvt->param1;
  418. default:
  419. break;
  420. }
  421. return 0;
  422. }
  423. unsigned int CDeviceControlFSM::s4_on_event(FSMEvent* pEvt)
  424. {
  425. Dbg("s4 %d,%d", pEvt->iEvt, pEvt->param1);
  426. switch (pEvt->iEvt) {
  427. case USER_EVT_INIT_TOKEN_FINISHED:
  428. pEvt->SetHandled();
  429. return pEvt->param1;
  430. default:
  431. break;
  432. }
  433. return 0;
  434. }
  435. int CDeviceControlFSM::UsbControl(SpReqAnsContext<DeviceControlService_USB_Req, DeviceControlService_USB_Ans>::Pointer ctx)
  436. {
  437. Dbg("open %d", ctx->Req.open);
  438. if (IsNeedOpenUsb(m_pEntity)) {
  439. ControlType eType;
  440. if (ctx->Req.open) {
  441. eType = USB_PORT_ENABLE;
  442. LogEvent(Severity_Middle, LOG_EVT_USB_CONTROL_ON, "usb on");//control by gpio
  443. LogEvent(Severity_Middle, LOG_EVT_USB_LIGHT_ON, "usb on");//control by gpio
  444. } else {
  445. eType = USB_PORT_DISABLE;
  446. LogEvent(Severity_Middle, LOG_EVT_USB_CONTROL_OFF, "usb off");//control by gpio
  447. LogEvent(Severity_Middle, LOG_EVT_USB_LIGHT_OFF, "usb off");//control by gpio
  448. }
  449. } else {
  450. Dbg("no need open/close usb, this machine's usb is always open.");
  451. }
  452. ctx->Answer(Error_Succeed);
  453. return 0;
  454. }
  455. int CDeviceControlFSM::GetUkeyIDx(SpReqAnsContext<DeviceControlService_GetUkeyID_Req, DeviceControlService_GetUkeyID_Ans>::Pointer ctx)
  456. {
  457. LOG_FUNCTION();
  458. if (ctx == NULL) {
  459. Dbg("ctx is null.");
  460. return 1;
  461. }
  462. #if defined(RVC_OS_WIN)
  463. char pID[512];
  464. ZeroMemory(pID, 512);
  465. int tmp = 512;
  466. int ret = AQGetUKeyID(pID, tmp);
  467. m_bWorkingOp = false;
  468. if (ret == 0) {
  469. ctx->Ans.UkeyID = pID;
  470. ctx->Ans.UkeyIDLen = strlen(pID);
  471. Dbg("oiltest ukey id [%d][%s][%d]", tmp, (LPCTSTR)ctx->Ans.UkeyID, ctx->Ans.UkeyIDLen);
  472. ctx->Ans.reserved1 = 999;
  473. ctx->Answer(Error_Succeed);
  474. return 0;
  475. } else {
  476. Dbg("GetUKey failed.%d,%d", ret, GetLastError());
  477. ctx->Ans.reserved1 = ret;
  478. ctx->Answer(Error_Succeed);
  479. return 1;
  480. }
  481. #else
  482. ctx->Answer(Error_NotSupport);
  483. return 1;
  484. #endif //RVC_OS_WIN
  485. }
  486. int CDeviceControlFSM::InitTokenx(SpReqAnsContext<DeviceControlService_InitToken_Req, DeviceControlService_InitToken_Ans>::Pointer ctx)
  487. {
  488. LOG_FUNCTION();
  489. if (ctx == NULL) {
  490. Dbg("ctx is null.");
  491. return 1;
  492. }
  493. #if defined(RVC_OS_WIN)
  494. int tokensnlen, pkcs10len, msglen;
  495. tokensnlen = 32;
  496. pkcs10len = 2048;
  497. msglen = 128;
  498. char tokenSn[32], pkcs10[2048], msg[128];
  499. ZeroMemory(tokenSn, tokensnlen);
  500. ZeroMemory(pkcs10, pkcs10len);
  501. ZeroMemory(msg, msglen);
  502. int ret = AQInitToken(const_cast<char*>(ctx->Req.CertType.GetData())
  503. , ctx->Ans.TokenType, const_cast<char*>(ctx->Req.OldSuperPwd.GetData())
  504. , const_cast<char*>(ctx->Req.UserName.GetData())
  505. , const_cast<char*>(ctx->Req.UserIDType.GetData())
  506. , const_cast<char*>(ctx->Req.UserIDNo.GetData())
  507. , tokenSn
  508. , tokensnlen, pkcs10, pkcs10len, msg, msglen);
  509. m_bWorkingOp = false;
  510. if (ret == 0) {
  511. Dbg("[%d][%s][%d][%s][%d]", tokensnlen, tokenSn, msglen, msg, pkcs10len);
  512. char xx1[768], xx2[768];
  513. ZeroMemory(xx1, 768);
  514. ZeroMemory(xx2, 768);
  515. if (pkcs10len > 600) {
  516. strncpy(xx1, pkcs10, 600);
  517. strncpy(xx2, pkcs10 + 600, pkcs10len - 600 + 1);
  518. } else
  519. strncpy(xx1, pkcs10, pkcs10len);
  520. Dbg("[%s]", xx1);
  521. Dbg("[%s]", xx2);
  522. ctx->Ans.TokenSn = tokenSn;
  523. ctx->Ans.PKCS10 = pkcs10;
  524. ctx->Ans.Msg = msg;
  525. ctx->Ans.TokenSnLen = tokensnlen;
  526. ctx->Ans.PKCS10Len = pkcs10len;
  527. ctx->Ans.MsgLen = msglen;
  528. ctx->Ans.reserved1 = 999;
  529. ctx->Answer(Error_Succeed);
  530. return 0;
  531. } else {
  532. Dbg("InitToken failed.%d,%d", ret, GetLastError());
  533. ctx->Ans.reserved1 = ret;
  534. ctx->Answer(Error_Succeed);
  535. return 1;
  536. }
  537. #else
  538. ctx->Answer(Error_NotSupport);
  539. return 1;
  540. #endif //RVC_OS_WIN
  541. }
  542. int CDeviceControlFSM::QueryUSB(SpReqAnsContext<DeviceControlService_QueryUSBStatus_Req
  543. , DeviceControlService_QueryUSBStatus_Ans>::Pointer ctx)
  544. {
  545. ErrorCodeEnum eErr = Error_Unexpect;
  546. GpioService_ClientBase* pGpio = new GpioService_ClientBase(this->GetEntityBase());
  547. if (pGpio != NULL) {
  548. eErr = pGpio->Connect();
  549. if (eErr != Error_Succeed) {
  550. Dbg("connect to gpio failed.");
  551. pGpio->SafeDelete();
  552. pGpio = NULL;
  553. ctx->Answer(eErr);
  554. return 0;
  555. }
  556. GpioService_QueryCurrSet_Req req;
  557. GpioService_QueryCurrSet_Ans ans;
  558. eErr = pGpio->QueryCurrSet(req, ans, 10000);
  559. if (eErr == Error_Succeed) {
  560. ctx->Ans.flag = ((ans.output & 0x2) == 0x2);
  561. Dbg("%d,%d", ans.output, ctx->Ans.flag);
  562. ctx->Answer(Error_Succeed);
  563. } else {
  564. Dbg("Query usb failed: %s", SpStrError(eErr));
  565. ctx->Answer(eErr);
  566. }
  567. pGpio->GetFunction()->CloseSession();
  568. }
  569. return 0;
  570. }
  571. /** 5s per times and quit after 100 times*/
  572. void CDeviceControlFSM::WorkingOp()
  573. {
  574. int count = 0;
  575. while (m_bWorkingOp) {
  576. //relate with eventconvert
  577. LogEvent(Severity_Low, LOG_EVT_USB_CONTROL_OP, "ukey op.");
  578. Sleep(5000);
  579. count++;
  580. if (count > 100) {
  581. m_bWorkingOp = false;
  582. break;
  583. }
  584. }
  585. }