UpgradeTaskFSM.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. #ifndef RVC_MOD_UPGRADETASK_FSM_H_
  2. #define RVC_MOD_UPGRADETASK_FSM_H_
  3. #include "stdafx.h"
  4. #include "SimpleString.h"
  5. #include "SpBase.h"
  6. #include "SpFSM.h"
  7. #include <list>
  8. #include <map>
  9. #include <queue>
  10. #include "IHttpFunc.h"
  11. #define DOWNLOAD_CONTENT_EACH_LEN 512*1024
  12. #define DOWNLOAD_TIMEOUT 2*60
  13. #define QUERY_NO_TASK_WARN_LIMIT 15
  14. #define QUERY_IS_WORK_WARN_LIMIT 10
  15. using namespace std;
  16. #define WARN_TASK_COPY_FILE_ZERO 0x50620022 //升级copy文件夹文件个数为0
  17. #define ERR_TASK_QUERY_PRE_NEW_TASK_FAIL 0x50620023 //查询新任务报错
  18. #define ERR_TASK_QUERY_CONTINUE_NEW_TASK_FAIL 0x50620024 //查询继续新任务报错
  19. #define ERR_TASK_QUERY_CONTINUE_NEW_TASK_ERR 0x50620025 //查询继续新任务异常
  20. //#define WARN_BLACK_FILE_SUM 0x50600023 //黑名单文件数量
  21. #define UpgradeMgr_VERSION_DOWNLOAD_ID "QLR0402506Z10101"
  22. #define UpgradeMgr_VERSION_INSTALL_ID "QLR0402506Z10201"
  23. #define UpgradeMgr_VERSION_SWTICH_ID "QLR0402506Z10301"
  24. #define UpgradeMgr_VERSION_START_ID "QLR0402506Z10401"
  25. #define UpgradeMgr_OUTSIDE_SYSTEM_DOWNLOAD_ID "QLR0402506Z10102"
  26. #define UpgradeMgr_OUTSIDE_SYSTEM_INSTALL_ID "QLR0402506Z10202"
  27. #define UpgradeMgr_OUTSIDE_SYSTEM_SWTICH_ID "QLR0402506Z10302"
  28. #define UpgradeMgr_OUTSIDE_SYSTEM_START_ID "QLR0402506Z10405"
  29. #define UpgradeMgr_PerTask_HTTP_ERR "QLR0402506Z10501"
  30. #define UpgradeMgr_DOWNLOAD_ID "QLR0402506Z101"
  31. #define UpgradeMgr_INSTALL_ID "QLR0402506Z102"
  32. #define UpgradeMgr_SWTICH_ID "QLR0402506Z103"
  33. #define UpgradeMgr_START_ID "QLR0402506Z104"
  34. #define UpgradeMgr_ROLLBACK_ID "QLR0402506Z201"
  35. #define UpgradeMgr_ROLLBACK_SWTICH_ID "QLR0402506Z202"
  36. #define UpgradeMgr_ROLLBACK_START_ID "QLR0402506Z203"
  37. namespace HttpStruct
  38. {
  39. //发送文件hash列表接口
  40. struct SendSM3TaskReq : CHTTPReq {
  41. string m_reqStr;
  42. string ToJson() {
  43. return m_reqStr;
  44. }
  45. };
  46. struct SendSM3TaskRet : CHTTPRet {
  47. string m_retStr;
  48. bool Parse(string strData) {
  49. m_retStr=strData;
  50. return true;
  51. }
  52. };
  53. //更新任务状态接口
  54. struct UpdateTaskStatusReq : CHTTPReq {
  55. string m_reqStr;
  56. string ToJson() {
  57. return m_reqStr;
  58. }
  59. };
  60. struct UpdateTaskStatusRet : CHTTPRet {
  61. string m_retStr;
  62. bool Parse(string strData) {
  63. m_retStr=strData;
  64. return true;
  65. }
  66. };
  67. //查询当前任务
  68. struct QueryCurrTaskReq : CHTTPReq {
  69. string m_reqStr;
  70. string ToJson() {
  71. return m_reqStr;
  72. }
  73. };
  74. struct QueryCurrTaskRet : CHTTPRet {
  75. string m_retStr;
  76. bool Parse(string strData) {
  77. m_retStr=strData;
  78. return true;
  79. }
  80. };
  81. //查询新任务
  82. struct QueryNewTaskReq : CHTTPReq {
  83. string m_reqStr;
  84. string ToJson() {
  85. return m_reqStr;
  86. }
  87. };
  88. struct QueryNewTaskRet : CHTTPRet {
  89. string m_retStr;
  90. bool Parse(string strData) {
  91. m_retStr=strData;
  92. return true;
  93. }
  94. };
  95. //断点下载升级包
  96. struct DownloadPackTaskRet{
  97. long content_length;
  98. long origin_file_length;
  99. bool bfinish;
  100. string sm3;
  101. };
  102. }
  103. // 升级任务状态机
  104. class CUpgradeTaskFSM : public FSMImpl<CUpgradeTaskFSM>, public IFSMStateHooker, public ISysVarListener
  105. {
  106. public:
  107. enum
  108. {
  109. Event_Start = EVT_USER+1,
  110. Event_StartDealTask,
  111. Event_DealCurrTask,
  112. Event_EndUpdateTask,
  113. Event_EndQueryCurrTask,
  114. Event_StartPoll,
  115. Event_EndPoll,
  116. Event_EndPrePoll,
  117. Event_EndSendSM3Task,
  118. Event_EndContinuePoll,
  119. Event_StartDownload,
  120. Event_EndQueryTaskStatus,
  121. Event_Download_Idle,
  122. Event_EndDownload,
  123. Event_Download_Fail,
  124. Event_CancelTask,
  125. Event_StartInstall,
  126. Event_EndUnzipPackTask,
  127. Event_EndStopMediaPlayTask,
  128. Event_EndInstallPackTask,
  129. Event_EndInstall,
  130. Event_EndRollBackCheckTask,
  131. Event_StartSwitch,
  132. Event_PreRestart,
  133. };
  134. struct SendSM3TaskEvent:public FSMEvent
  135. {
  136. bool isSucc;//是否写入成功
  137. SendSM3TaskEvent(bool isSendSucc)
  138. : FSMEvent(Event_EndSendSM3Task), isSucc(isSendSucc)
  139. {}
  140. };
  141. struct UpdateTaskStatusEvent:public FSMEvent
  142. {
  143. bool isSucc;//是否更新成功
  144. UpdateTaskStatusEvent(bool isSendSucc)
  145. : FSMEvent(Event_EndUpdateTask), isSucc(isSendSucc)
  146. {}
  147. };
  148. struct QueryCurrTaskEvent:public FSMEvent
  149. {
  150. bool isSucc;//是否查询成功
  151. bool isTask_valid;//任务是否有效
  152. QueryCurrTaskEvent(bool isSendSucc,bool isValid)
  153. : FSMEvent(Event_EndQueryCurrTask), isSucc(isSendSucc),isTask_valid(isValid)
  154. {}
  155. };
  156. struct QueryNewTaskEvent:public FSMEvent
  157. {
  158. bool isSucc;//是否查询成功
  159. QueryNewTaskEvent(bool isSendSucc)
  160. : FSMEvent(Event_EndPoll), isSucc(isSendSucc)
  161. {}
  162. };
  163. struct QueryNewContinueTaskEvent:public FSMEvent
  164. {
  165. int retParam;//是否查询成功
  166. QueryNewContinueTaskEvent(int ret)
  167. : FSMEvent(Event_EndContinuePoll)
  168. {
  169. retParam = ret;
  170. }
  171. };
  172. struct QueryNewPreTaskEvent:public FSMEvent
  173. {
  174. bool isSucc;//是否查询成功
  175. QueryNewPreTaskEvent(bool isSendSucc)
  176. : FSMEvent(Event_EndPrePoll), isSucc(isSendSucc)
  177. {}
  178. };
  179. struct QueryTaskStatusEvent:public FSMEvent
  180. {
  181. bool isSucc;//是否查询成功
  182. bool isTask_valid;//任务是否有效
  183. QueryTaskStatusEvent(bool isSendSucc,bool isValid)
  184. : FSMEvent(Event_EndQueryTaskStatus), isSucc(isSendSucc),isTask_valid(isValid)
  185. {}
  186. };
  187. struct DownloadPackTaskEvent:public FSMEvent
  188. {
  189. bool isSucc;
  190. DownloadPackTaskEvent(bool isDownloadSucc)
  191. : FSMEvent(Event_EndDownload), isSucc(isDownloadSucc)
  192. {}
  193. };
  194. struct DownloadPackTaskFailEvent:public FSMEvent
  195. {
  196. string errMsg;//错误信息
  197. DownloadPackTaskFailEvent(string errorMsg)
  198. : FSMEvent(Event_Download_Fail), errMsg(errorMsg)
  199. {}
  200. };
  201. struct StopMediaPlayTaskEvent:public FSMEvent
  202. {
  203. bool isSucc;
  204. StopMediaPlayTaskEvent(bool isStopSucc)
  205. : FSMEvent(Event_EndStopMediaPlayTask), isSucc(isStopSucc)
  206. {}
  207. };
  208. struct UnzipPackTaskEvent:public FSMEvent
  209. {
  210. bool isSucc;
  211. UnzipPackTaskEvent(bool isUnzipSucc)
  212. : FSMEvent(Event_EndUnzipPackTask), isSucc(isUnzipSucc)
  213. {}
  214. };
  215. struct RollBackCheckTaskEvent :public FSMEvent
  216. {
  217. bool isSucc;
  218. CSimpleStringA errMsg;
  219. string failReason;
  220. RollBackCheckTaskEvent(bool isInstallSucc, CSimpleStringA errMsgStr, string strfailReason)
  221. : FSMEvent(Event_EndRollBackCheckTask), isSucc(isInstallSucc), errMsg(errMsgStr), failReason(strfailReason)
  222. {}
  223. };
  224. struct InstallPackTaskEvent:public FSMEvent
  225. {
  226. bool isSucc;
  227. CSimpleStringA errMsg;
  228. int failStatus;
  229. InstallPackTaskEvent(bool isInstallSucc,CSimpleStringA errMsgStr,int iFailStatus)
  230. : FSMEvent(Event_EndInstallPackTask), isSucc(isInstallSucc),errMsg(errMsgStr),failStatus(iFailStatus)
  231. {}
  232. };
  233. struct CInstallStep
  234. {
  235. //不存储到运行时
  236. int stepSeq; //步骤序号
  237. CSimpleStringA cmdType; //升级安装需执行命令类型:Delete、Copy、Run
  238. int cmdFail; //0:执行失败认为升级失败 1:执行失败忽略继续升级
  239. CSimpleStringA srcPathType; //0:相对路径 1:绝对路径 2:当前版本相对路径 3:升级包相对路径
  240. CSimpleStringA srcPath;
  241. CSimpleStringA dstPathType; //0:相对路径 1:绝对路径 2:当前版本相对路径 3:升级版本相对路径 4:升级包相对路径
  242. CSimpleStringA dstPath;
  243. };
  244. // 待安装任务信息(运行时保存的中间变量)
  245. struct CTaskInfo
  246. { //存储到运行时
  247. CSimpleStringA upgradeTaskId; //升级任务编号
  248. CSimpleStringA createTaskVersion;//创建升级任务时的版本号
  249. CSimpleStringA cPendingState; // 已下载D、安装中I、等待切换S、任务结果确认T
  250. CSimpleStringA NewVersion; // 任务升级后的版本号
  251. CSimpleStringA pack_name; //升级包名
  252. CSimpleStringA task_type; //任务类型 U:升级任务 R:回退任务
  253. CSimpleStringA depNewVersion; //适配器新版本号
  254. //CSimpleStringA task_class; //任务类别 A:应用版本任务 D:适配器任务 T:体系外任务
  255. //不存储到运行时
  256. CSimpleStringA pack_version; //升级包指定的版本号
  257. bool stop_media_play; //停止广告播放(0:不停止 1:停止)
  258. int reboot_type; //重启策略类型(0:不启动 1:重启框架 2:重启系统)
  259. CSimpleStringA file_path; //升级包路径
  260. CSimpleStringA download_url; //升级包下载地址
  261. CSimpleStringA pack_hash; //升级包hash值
  262. long pack_length; //升级包长度(服务端暂时不传)
  263. queue<CInstallStep*> install_step;//安装步骤队列
  264. };
  265. struct CTaskProcess
  266. {
  267. CSimpleStringA strPackName;//包名
  268. CSimpleStringA installVersion;//安装版本号
  269. CSimpleStringA CurrentVersion;//当前版本号
  270. CSimpleStringA cInstallState;//升级状态
  271. CSimpleStringA strInstallComment;//升级状态备注
  272. };
  273. struct CenterUrl
  274. {
  275. string updateTaskUrl; //更新升级任务url
  276. string queryCurrTaskUrl; //查询当前任务url
  277. string queryNewTaskUrl; //查询新任务url(旧版本使用)
  278. string queryPreTaskUrl; //预查询新任务url
  279. string queryContinueTaskUrl; //继续查询新任务url
  280. string queryTaskStatus; //查询当前任务是否有效url
  281. string sendSM3TaskUrl; //发送文件hashurl
  282. };
  283. struct HashScanSet
  284. {
  285. CSimpleStringA relativeDir; //相对路径
  286. CSimpleStringA absoluteDir; //绝对路径
  287. CSimpleStringA currVerDir; //当前版本相对路径
  288. CSimpleStringA blackFile; //不纳入扫描的文件名称
  289. CSimpleStringA blackDir; //不纳入扫描的文件夹
  290. };
  291. public:
  292. CUpgradeTaskFSM(){
  293. isSendHash = false;//默认查询策略不发送hash
  294. m_isSM3HashSucc = false;//默认hash计算失败
  295. m_bDownloadIdle = false;
  296. m_bTaskCancel=false;
  297. m_fileSM3ListHash="";//终端hash列表64位hash值
  298. m_fileSM3List = "";//终端hash列表值
  299. m_strPreTaskId="";//预检查任务ID
  300. m_bNeedHash=0;//预检查是否需要hash
  301. m_newEachDownloadLen=DOWNLOAD_CONTENT_EACH_LEN;
  302. m_PrintHttpLog =false;
  303. m_startFlag = false;
  304. m_iBlackFileCount=0;
  305. m_bSwitchFlag = false;
  306. m_bRollbackTask = false;
  307. m_TempDepUpgradeFlag = false;//默认非适配器升级
  308. m_queryNewTaskInterval = 240;//默认查询任务时间间隔
  309. m_installStopCopyDep = false;//默认拷贝
  310. m_downloadBreakOffCount = 0;
  311. m_queryIsWorkCount = 0;
  312. }
  313. ~CUpgradeTaskFSM(){}
  314. //具体实现方法
  315. ErrorCodeEnum CreateNewVersion(CVersion NewSoftwareVersion,CSimpleStringA &strErrInfo);//创建新版本
  316. ErrorCodeEnum ClearUpgradeFailVersion(CVersion NewSoftwareVersion);//清理升级新版本临时文件
  317. bool GetSysUpgradeResult(const char *pszResultLog, CSimpleStringA &eErrorCode, CSimpleStringA &strErrMsg);//从体系外生成的result.log文件中获取结果
  318. //安装执行步骤方法
  319. int ExecInstall(CSimpleStringA &strErrMsg);//升级安装 0:失败 1:成功 -1:未知
  320. int ExecRunCmd(CSimpleStringA &strErrMsg,CInstallStep* ins);
  321. bool ExecDeleteCmd(CSimpleStringA &strErrMsg,CInstallStep* ins);
  322. bool ExecCpoyCmd(CSimpleStringA &strErrMsg,CInstallStep* ins);
  323. bool GetRootTypePath(int rootType,CSimpleStringA &rootPath);//1:相对路径 2:当前版本相对路径 3:升级版本相对路径 4:升级包相对路径
  324. ErrorCodeEnum CopyFileOperate(const char* srcPath, const char* destPath, int nCopyMode, CSimpleStringA &strErrMsg);
  325. ErrorCodeEnum SetRunSucceed(const char* pPackFile);//成功切换新版本
  326. ErrorCodeEnum UpgradeToNewVersion();//设置新版本状态
  327. ErrorCodeEnum RollBackToHistoryVersion(CVersion historyVersion);//回退到某个历史版本
  328. void RecursiveGetSubFiles(const char *pszDir, const char *pszTrimStart, list<CSimpleStringA>& retList);
  329. bool IsFileMatch(const char *pszFilter, const char *pszFileName);
  330. bool RecursiveCopyDir(const char *pszSourceDir, const char *pszDestDir,CSimpleStringA &strErrInfo);//可以合并
  331. CSimpleStringA GetFileDirectory(const char *pszFullPath);//查找文件的父路径
  332. int system_on(string cmdFilePath, bool isWait,CSimpleStringA &errMsg);//cmd窗口程序
  333. int waitSystem(string cmd, const char * par, bool nShow,CSimpleStringA &errMsg);//起进程执行cmd
  334. ErrorCodeEnum UnzipPack(const char* unZipPackName);//解压文件
  335. ErrorCodeEnum DeleteUnzipDir();//清理临时解压包文件
  336. ErrorCodeEnum RollBackVersionCheck(string &failReason, CSimpleStringA& strErrMsg);//回退版本检查 C:一般错误 X:终端找不到需要回退的版本文件夹 、回退版本比现在版本高
  337. void SendUpgradeTaskProgress(CTaskProcess &process, CSimpleStringA logCodeStr, CSimpleStringA rtaStr = "");
  338. ErrorCodeEnum GetRunConfigStrValue(const char *pszSection, const char *pszKey, CSimpleStringA &strValue);
  339. ErrorCodeEnum SetRunConfigStrValue(const char *pszSection, const char *pszKey, const char *pszValue);
  340. bool ClearCurrTaskInfo();//任务无效清除运行时记录和残留下载包
  341. bool ClearInstallStep();//清理历史任务安装步骤
  342. ErrorCodeEnum LoadPersistTaskInfo();//启动开始加载运行时文件
  343. ErrorCodeEnum loadCenterCfgInfo();//启动开始加载集中配置文件
  344. bool GetFileLength(const char* filePath,long &fileLen);//获取文件长度
  345. ErrorCodeEnum GetSM3List(CSimpleStringA &strSM3List);//获取版本文件hash集合字符串
  346. ErrorCodeEnum ScanSM3ByType(int type,CSimpleStringA pathFilter);
  347. ErrorCodeEnum NewSM3Folder(CSimpleStringA scanFilter,CSimpleStringA replaceDir);//新的hash扫描文件夹实现
  348. //新国密SM3函数,isSub表示是否截取新国密中间一段密文
  349. ErrorCodeEnum SM3FileToStr(CSimpleStringA strFilePath, CSimpleStringA &strSM3,bool isSub);
  350. ErrorCodeEnum SM3DataToStr(CSimpleStringA strData, CSimpleStringA &strSM3,bool isSub);
  351. ErrorCodeEnum SM3_Str(CSimpleStringA &strSM3,BYTE * SM3Byte,bool isSub);
  352. bool IsPackDownloaded(const char *pPackName,const char* packHash,long packLen);//判断安装包是否已下载成功
  353. bool DownloadFileWrite(byte* content,long contentLen,const char* filePath);
  354. bool CheckIfCanSwitchNow();//是否允许切换
  355. ErrorCodeEnum SwitchUpgradeNow();//切换版本
  356. ErrorCodeEnum DownloadProgress(long tempFileLen,long fileSumLen);//返回下载进度
  357. char GetInstallState(int nState);//根据状态机获取升级状态
  358. ErrorCodeEnum GetUpgradeState(bool &bInstalling, CSimpleStringA &strPackFile, CSimpleStringA &strExecID,
  359. char &cInstallState, bool &bSysInstall, bool &bLightPack, CSimpleStringA &strNewVersion);
  360. static void HttpsLogCallBack(const char* logtxt);
  361. void judgeTaskClass();//临时判定升级任务类别
  362. ErrorCodeEnum judgeRollbackTaskClass(CSimpleStringA verDirName, string& failReason, CSimpleStringA& strErrMsg);//临时判定回退任务类别
  363. ErrorCodeEnum CreateNewDepVersion(CSimpleStringA NewSoftwareVersion, CSimpleStringA& strErrInfo);//升级时创建新适配器版本
  364. ErrorCodeEnum CreateInstallDepVersion(CSimpleStringA NewSoftwareVersion, CSimpleStringA& strErrInfo);//安装时创建新适配器版本
  365. ErrorCodeEnum ClearUpgradeFailDepVersion(CSimpleStringA NewSoftwareVersion);//清理升级新版本临时文件
  366. ErrorCodeEnum UpgradeDepToNewVersion();//更新depactive文件
  367. ErrorCodeEnum SwitchUpgradeDepNow();//切换适配器版本
  368. ErrorCodeEnum RollBackDepVersionCheck(string& failReason, CSimpleStringA& strErrMsg);//回退版本检查 C:一般错误 X:终端找不到需要回退的版本文件夹
  369. ErrorCodeEnum RollBackToHistoryDepVersion(CSimpleStringA historyDepVersion);//适配器回退到某个历史版本
  370. //适配器安装函数
  371. int ExecDepInstall(CSimpleStringA& strErrMsg);//适配器升级 0:失败 1:成功
  372. int ExecDepRunCmd(CSimpleStringA& strErrMsg, CInstallStep* ins);
  373. bool ExecDepDeleteCmd(CSimpleStringA& strErrMsg, CInstallStep* ins);
  374. bool ExecDepCpoyCmd(CSimpleStringA& strErrMsg, CInstallStep* ins);
  375. bool GetDepRootTypePath(int rootType, CSimpleStringA& rootPath);//1:相对路径 2:当前版本相对路径 3:升级版本相对路径 4:升级包相对路径
  376. CSimpleStringA getAlarmCurrVersion();
  377. //升级时添加防火墙策略
  378. ErrorCodeEnum SetNewVersionPathToFirewall();
  379. bool isWork();
  380. bool isAuthSucc();
  381. bool isTerminalInstall();
  382. void upgradeSuccStateBroadCast();
  383. #ifdef RVC_OS_WIN
  384. #else
  385. int changeFileAtt(const char* path);
  386. #endif
  387. private:
  388. bool DirIsExist(const char* scanPath,const char* dirName);
  389. virtual void OnStateTrans(int iSrcState, int iDstState);
  390. virtual void OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName);
  391. virtual ErrorCodeEnum OnInit();
  392. virtual ErrorCodeEnum OnExit();
  393. enum{s1, s2, s3, s4, s5, s6, s7};
  394. BEGIN_FSM_STATE(CUpgradeTaskFSM)
  395. FSM_STATE_ENTRY(s1, "Start",s1_on_entry,s1_on_exit,s1_on_event)//计算hash值
  396. FSM_STATE_ENTRY(s2, "DealTask",s2_on_entry,s2_on_exit,s2_on_event)//处理上个任务,反馈任务结果,并根据任务状态跳转到其他状态
  397. FSM_STATE_ENTRY(s3, "Poll",s3_on_entry,s3_on_exit,s3_on_event)//查询任务
  398. FSM_STATE_ENTRY(s4, "Download", s4_on_entry, s4_on_exit, s4_on_event)//下载安装包
  399. FSM_STATE_ENTRY(s5, "Install", s5_on_entry, s5_on_exit, s5_on_event)//安装升级包
  400. FSM_STATE_ENTRY(s6, "Switch", s6_on_entry, s6_on_exit, s6_on_event)//进行版本切换
  401. FSM_STATE_ENTRY(s7, "Disable", s7_on_entry, s7_on_exit, s7_on_event)//静止状态
  402. END_FSM_STATE()
  403. BEGIN_FSM_RULE(CUpgradeTaskFSM,s1)
  404. FSM_RULE_ENTRY_ANY(s1, s2, Event_StartDealTask)
  405. FSM_RULE_ENTRY_ANY(s2, s3, Event_StartPoll)
  406. FSM_RULE_ENTRY(s2, s4, Event_EndQueryCurrTask, 4)
  407. FSM_RULE_ENTRY(s2, s5, Event_EndQueryCurrTask, 5)
  408. FSM_RULE_ENTRY(s2, s6, Event_EndQueryCurrTask, 6)
  409. FSM_RULE_ENTRY_ANY(s3, s4, Event_StartDownload)
  410. FSM_RULE_ENTRY_ANY(s3, s5, Event_StartInstall)//回退
  411. FSM_RULE_ENTRY_ANY(s4, s5, Event_StartInstall)
  412. FSM_RULE_ENTRY_ANY(s4, s3, Event_StartPoll)//任务取消进入S3
  413. FSM_RULE_ENTRY_ANY(s4, s2, Event_StartDealTask)//下载失败进入S2
  414. FSM_RULE_ENTRY_ANY(s5, s6, Event_StartSwitch)
  415. FSM_RULE_ENTRY_ANY(s5, s2, Event_StartDealTask)//安装失败进入S2
  416. FSM_RULE_ENTRY_ANY(s6, s2, Event_StartDealTask)//无需重启框架和系统切换成功进入S2
  417. FSM_RULE_ENTRY_ANY(s6, s3, Event_StartPoll)//取消任务进入S3
  418. FSM_RULE_ENTRY_ANY(s6, s7, Event_PreRestart)//重启服务
  419. END_FSM_RULE()
  420. private:
  421. //完成
  422. void s1_on_entry();
  423. void s1_on_exit();
  424. unsigned int s1_on_event(FSMEvent* event);
  425. //完成
  426. void s2_on_entry();
  427. void s2_on_exit();
  428. unsigned int s2_on_event(FSMEvent* event);
  429. //完成
  430. void s3_on_entry();
  431. void s3_on_exit();
  432. unsigned int s3_on_event(FSMEvent* event);
  433. //完成
  434. void s4_on_entry();
  435. void s4_on_exit();
  436. unsigned int s4_on_event(FSMEvent* event);
  437. //完成
  438. void s5_on_entry();
  439. void s5_on_exit();
  440. unsigned int s5_on_event(FSMEvent* event);
  441. //完成
  442. void s6_on_entry();
  443. void s6_on_exit();
  444. unsigned int s6_on_event(FSMEvent* event);
  445. //
  446. void s7_on_entry();
  447. void s7_on_exit();
  448. unsigned int s7_on_event(FSMEvent* event);
  449. private:
  450. list<CSimpleStringA> m_DepWhitelist; //dep文件夹白名单
  451. list<CSimpleStringA> m_DirBlacklist; //整体文件夹黑名单
  452. list<CSimpleStringA> m_FileBlacklist; //整体文件黑名单
  453. public:
  454. map<CSimpleStringA, CSimpleStringA> m_fileSM3Map; // 版本文件hash值集合
  455. CTaskInfo m_currentTask; //当前的任务缓存变量
  456. CVersion m_currentVersion; //当前终端版本
  457. CSimpleStringA m_currentDepVersion; //当前适配器版本
  458. CenterUrl m_centerUrl;//访问总行的url地址集合
  459. int m_newEachDownloadLen;//新的每次下载数据长度阈值(k)
  460. bool m_PrintHttpLog; //是否打印通讯日志
  461. bool m_startFlag; //升级实体启动标志位,默认是不开,
  462. bool m_stopSetFirewall;//是否停止设置防火墙路径,默认是不停止
  463. HashScanSet m_hashScanSet;//扫描文件hash设置
  464. bool m_isSM3HashSucc;//hash是否计算成功
  465. bool isSendHash;//hash是否发送
  466. CSimpleStringA m_fileSM3ListHash;//SM3 64位hash
  467. CSimpleStringA m_fileSM3List;//版本文件hash集合字符串
  468. DWORD m_beginSendSM3Time;//开始发送sm3hahs时间
  469. int m_queryNewTaskCount;//查询新任务时无任务次数
  470. int m_queryIsWorkCount;
  471. int m_downloadBreakOffCount;
  472. bool m_bDownloadIdle; //是否下载空闲 true: 不能下载,false: 可下载
  473. bool m_bTaskCancel; //是否任务取消 true: 任务取消,false: 未取消
  474. int m_iBlackFileCount; //黑名单文件数量
  475. CSimpleStringA m_strPreTaskId; //预检查taskId
  476. int m_bNeedHash;//是否需要hash对比查询任务
  477. bool m_bSwitchFlag;//是否启动后切换流程直接进入标志
  478. bool m_bRollbackTask;//是否已经处于回退流程。
  479. bool m_TempDepUpgradeFlag;//临时适配器升级安装的判定标志 true 适配器 false 非适配器
  480. int m_queryNewTaskInterval;//查询任务时间间隔,默认是240s
  481. bool m_installStopCopyDep;//安装时是否停止拷贝应用dep公共文件夹
  482. };
  483. #endif //RVC_MOD_UPGRADETASK_FSM_H_