Browse Source

#IQRV #comment:优化资源管理实体版本判定逻辑

陈纪林80310970 6 months ago
parent
commit
c0ef1e2b8f

+ 30 - 6
Module/mod_ResourceWatcher/ResourceWatcherFSM.cpp

@@ -13,6 +13,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <vector>
+#include <regex>
 #include "ResourceWatcher_UserCode.h"
 
 #ifdef RVC_OS_LINUX
@@ -763,6 +764,17 @@ void ResourceWatcherFSM::AutoDeleteFiles()
 
 }
 
+BOOL ResourceWatcherFSM::IsValidVersionNumber(const std::string& version)
+{
+    // 正则表达式解释:
+   // ^[1-9]\d*       第一部分:首位不能为0的正整数
+   // (\.(0|([1-9]\d*))){3}  后跟三个部分,每个部分为0或非零无前导整数
+   // $ 结束符
+    std::regex pattern(R"(^([1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$)");
+
+    return std::regex_match(version, pattern);
+}
+
 //终端升级后会执行版本清理功能
 BOOL ResourceWatcherFSM::DeleteVersionPackage()
 {
@@ -824,13 +836,19 @@ BOOL ResourceWatcherFSM::DeleteVersionPackage()
                 //files.push_back(string(dirp->d_name));
                 CInstallInfo verInfo = {};
                 DWORD dwMajor(0), dwMinor(0), dwRevision(0), dwBuild(0);
-                int n = sscanf(dirp->d_name, "%d.%d.%d.%d", &dwMajor, &dwMinor, &dwRevision, &dwBuild);
-                if (n != 4)
+                BOOL isValidVer = IsValidVersionNumber(fileinfo.name);
+                if (isValidVer == FALSE)
                 {
                     DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Not target version file.[%s]", dirp->d_name);
                     continue;
                 }
                 else {
+                    int n = sscanf(dirp->d_name, "%d.%d.%d.%d", &dwMajor, &dwMinor, &dwRevision, &dwBuild);
+                    if (n != 4)
+                    {
+                        DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Split version failed.The PARTS number of [%s] is [%d].", fileinfo.name, n);
+                        continue;
+                    }
                     CVersion verName(dwMajor, dwMinor, dwRevision, dwBuild);
                     if (verName.IsValid())
                     {
@@ -841,7 +859,7 @@ BOOL ResourceWatcherFSM::DeleteVersionPackage()
                         intallInfoVects.push_back(verName);
                     }
                     else {
-                        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Not target version file.[%s]", dirp->d_name);
+                        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("[%s]Bigger than current version file.", dirp->d_name);
                     }
                 }
             }
@@ -856,13 +874,19 @@ BOOL ResourceWatcherFSM::DeleteVersionPackage()
             do {
                 CInstallInfo verInfo = {};
                 DWORD dwMajor(0), dwMinor(0), dwRevision(0), dwBuild(0);
-                int n = sscanf(fileinfo.name, "%d.%d.%d.%d", &dwMajor, &dwMinor, &dwRevision, &dwBuild);
-                if (n != 4)
+                BOOL isValidVer = IsValidVersionNumber(fileinfo.name);
+                if (isValidVer ==  FALSE)
                 {
                     DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Not target version file.[%s]", fileinfo.name);
                     continue;
                 }
                 else {
+                    int n = sscanf(fileinfo.name, "%d.%d.%d.%d", &dwMajor, &dwMinor, &dwRevision, &dwBuild);
+                    if (n != 4)
+                    {
+                        DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Split version failed.The PARTS number of [%s] is [%d].", fileinfo.name, n);
+                        continue;
+                    }
                     CVersion verName(dwMajor, dwMinor, dwRevision, dwBuild);
                     if (verName.IsValid())
                     {
@@ -874,7 +898,7 @@ BOOL ResourceWatcherFSM::DeleteVersionPackage()
                         intallInfoVects.push_back(verName);
                     }
                     else {
-                        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Not target version file.[%s]", fileinfo.name);
+                        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("[%s]Bigger than current version file.", fileinfo.name);
                     }
                 }
             } while (_findnext(hFile, &fileinfo) == 0);

+ 1 - 0
Module/mod_ResourceWatcher/ResourceWatcherFSM.h

@@ -317,6 +317,7 @@ public:
 	void CenterSettingDelete();
 	BOOL DeleteVersionPackage();
 	void DeleteVideoFiles();
+	BOOL IsValidVersionNumber(const std::string& version);
 	int ProcessFileDelete(CSimpleStringA rtaCode, LPCTSTR lpszPath, int& nDelSucCnt, int& nDelFailedCnt, bool delDir, unsigned int saveBackDay = 0);
 
     BOOL DetectIsFirstRunAtBoot();