UpgradeTaskFSM.h 19 KB

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