瀏覽代碼

!10599 st2分支合并到非接异常信息分支
Merge pull request !10599 from 80174520/ST2

刘文涛80174520 9 月之前
父節點
當前提交
2fa6dd2d37
共有 72 個文件被更改,包括 1375 次插入733 次删除
  1. 1 1
      DevAdapter/CMakeLists.txt
  2. 3 0
      DevAdapter/liblog4vendor/env_deal.cpp
  3. 1 1
      DevAdapter/liblog4vendor/env_deal.h
  4. 4 0
      DevAdapter/liblog4vendor/log4vendor.cpp
  5. 3 1
      DevAdapter/simulator/FingerPrint.1.1/FingerPrint_impl.cpp
  6. 0 2
      DevAdapter/simulator/assets/cmbsz-st.ini
  7. 0 2
      DevAdapter/simulator/assets/cmbsz-uat.ini
  8. 1 1
      DevAdapter/simulator/assets/cmbsz.ini
  9. 12 4
      DevAdapter/simulator/cardissuer.1.1/cardissuer_httpans.h
  10. 76 10
      DevAdapter/simulator/cardissuer.1.1/cardissuer_impl.cpp
  11. 5 5
      DevAdapter/simulator/cardissuer.1.1/cardissuer_impl.h
  12. 12 4
      DevAdapter/simulator/cardissuerstand.1.1/cardissuer_httpans.h
  13. 76 10
      DevAdapter/simulator/cardissuerstand.1.1/cardissuer_impl.cpp
  14. 5 5
      DevAdapter/simulator/cardissuerstand.1.1/cardissuer_impl.h
  15. 16 8
      DevAdapter/simulator/cardissuerstore.1.1/cardissuer_httpans.h
  16. 77 11
      DevAdapter/simulator/cardissuerstore.1.1/cardissuer_impl.cpp
  17. 5 5
      DevAdapter/simulator/cardissuerstore.1.1/cardissuer_impl.h
  18. 1 1
      DevAdapter/simulator/contactlesscard.1.1/contactless_httpans.h
  19. 5 2
      DevAdapter/simulator/contactlesscard.1.1/contactless_impl.cpp
  20. 3 0
      DevAdapter/simulator/gpio.1.1/gpio_impl.cpp
  21. 3 1
      DevAdapter/simulator/hspscanner.1.1/hspscanner_impl.cpp
  22. 3 0
      DevAdapter/simulator/idcer.1.1/idcer_impl.cpp
  23. 2 2
      DevAdapter/simulator/pinpad.1.1/pinpad_httpans.h
  24. 6 4
      DevAdapter/simulator/pinpad.1.1/pinpad_impl.cpp
  25. 1 0
      Framework/spbase/SpEntity.cpp
  26. 6 2
      Module/include/CommEntityUtil.hpp
  27. 4 2
      Module/include/DevEntityCommBase.hpp
  28. 2 24
      Module/include/DevFSMCommBase.hpp
  29. 2 14
      Module/include/EventCode.h
  30. 8 61
      Module/mod_CardIssuerStand/CardIssuerFSM.cpp
  31. 1 2
      Module/mod_CardIssuerStand/CardIssuerFSM.h
  32. 3 3
      Module/mod_ContactlessCard/ContactlessFSM.cpp
  33. 2 7
      Module/mod_DeviceControl/mod_DeviceControl.cpp
  34. 15 87
      Module/mod_FingerPrint/FingerPrintFSM.cpp
  35. 0 2
      Module/mod_FingerPrint/FingerPrint_UserErrorCode.h
  36. 1 1
      Module/mod_HSPScanner/HSPSCanner_UserErrorCode.h
  37. 15 9
      Module/mod_HSPScanner/HSPScannerFSM.cpp
  38. 1 7
      Module/mod_HSPScanner/mod_HSPScanner.h
  39. 21 13
      Module/mod_IDCertificate/IDCertFSM.cpp
  40. 243 157
      Module/mod_ResourceWatcher/ResourceWatcherFSM.cpp
  41. 3 11
      Module/mod_ResourceWatcher/ResourceWatcherFSM.h
  42. 3 0
      Module/mod_ResourceWatcher/ResourceWatcher_UserCode.h
  43. 7 41
      Module/mod_cardissuerstore/CardIssuerFSM.cpp
  44. 1 2
      Module/mod_cardissuerstore/CardIssuerFSM.h
  45. 40 7
      Module/mod_chromium/CModTools.cpp
  46. 1 1
      Module/mod_chromium/EntitySessionManager.cpp
  47. 8 6
      Module/mod_chromium/baseEx.cpp
  48. 6 0
      Module/mod_chromium/baseEx.h
  49. 30 6
      Module/mod_chromium/mod_chromium.cpp
  50. 40 17
      Module/mod_gpio/mod_gpio.cpp
  51. 4 3
      Module/mod_healthmanager/HealthManagerFSM.cpp
  52. 15 10
      Module/mod_healthmanager/mod_healthmanager.cpp
  53. 1 1
      Module/mod_healthmanager/mod_healthmanager.h
  54. 38 11
      Module/mod_livenessdetection/RvcWsServer.cpp
  55. 73 75
      Module/mod_livenessdetection/RvcWsServer.h
  56. 1 0
      Module/mod_recorder/mod_recorder.cpp
  57. 1 0
      Module/mod_upload/CMakeLists.txt
  58. 38 47
      Module/mod_upload/UploadFSM.cpp
  59. 3 4
      Module/mod_upload/UploadFSM.h
  60. 13 0
      Module/mod_upload/Upload_UserErrorCode.h
  61. 23 4
      Module/mod_vtmloader/VtmLoaderFSM.cpp
  62. 3 3
      Other/libfilecryption/fileanalysis.cpp
  63. 1 1
      Other/libfilecryption/fileanalysis.h
  64. 1 1
      Other/libfilecryption/filecryption.cpp
  65. 2 2
      Other/libfilecryption/mp4info.cpp
  66. 5 5
      Other/libfilecryption/rvcfileheader.cpp
  67. 1 1
      Other/libfilecryption/rvcfileheader.h
  68. 1 1
      addin/cmake/DependencyConanFiles.cmake
  69. 1 1
      addin/res/RunScript/startInit.sh
  70. 1 1
      addin/res/RunScript/startSettings.sh
  71. 342 0
      addin/res/VTMModifyHeaders/background.js
  72. 23 0
      addin/res/VTMModifyHeaders/manifest.json

+ 1 - 1
DevAdapter/CMakeLists.txt

@@ -297,7 +297,7 @@ if(DEVADAPTER_USING_CONAN)
         #CardLibDB_CMB.db3
         conan_cmake_run(REQUIRES VendorDLL/2024.11.1401@LR04.02_VendorLib/testing
             BASIC_SETUP CMAKE_TARGETS)
-        set(SELF_CONAN_LIB_NAME self/2024.1025.01@LR04.02_VendorLib/testing)
+        set(SELF_CONAN_LIB_NAME self/2024.1217.01@LR04.02_VendorLib/testing)
         add_subdirectory(self)
     endif(MSVC)
 

+ 3 - 0
DevAdapter/liblog4vendor/env_deal.cpp

@@ -74,10 +74,13 @@ namespace cmb {
 
 	bool env_log_config::retrieve_env_value()
 	{
+        record_type = record_level = module_name = record_path = seal_module_name = "";
+
 		env_deal("VENDOR_RECODE_TYPE").get(record_type);
 		env_deal("VENDOR_RECODE_LEVEL").get(record_level);
 		env_deal("VENDOR_DLL_NAME").get(module_name);
 		env_deal("VENDOR_LOG_PATH").get(record_path);
+		env_deal("VENDOR_PARENT_NAME").get(seal_module_name);
         return true;
 	}
 }

+ 1 - 1
DevAdapter/liblog4vendor/env_deal.h

@@ -28,7 +28,7 @@ namespace cmb {
 		std::string record_type;
 		std::string record_path;
 		std::string module_name;
-
+		std::string seal_module_name;
 		bool retrieve_env_value();
 	};
 }

+ 4 - 0
DevAdapter/liblog4vendor/log4vendor.cpp

@@ -124,6 +124,10 @@ namespace cmb {
             }
 #endif //_MSC_VER
 		}
+		else if (!env.seal_module_name.empty()) {
+			config->dev_name = "vendor_";
+			config->dev_name += env.seal_module_name.c_str();
+		}
 		config->log_dir = env.record_path;
 	}
 

+ 3 - 1
DevAdapter/simulator/FingerPrint.1.1/FingerPrint_impl.cpp

@@ -212,7 +212,9 @@ DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass*& pBaseObj)
 #endif 
 	std::string str;
 	cmb::log4vendor::init(config, str);
-	printf("init after: %s\n", str.c_str());
+	
+	std::string tmpStr = GetSimulatorUrl();
+	LOG4VTM(INFO, "URL = " << tmpStr.c_str());
 
 	return Error_Succeed;
 }

+ 0 - 2
DevAdapter/simulator/assets/cmbsz-st.ini

@@ -1,2 +0,0 @@
-[server]
-url=http://emulatoruser.paasst.cmbchina.cn/emulator/avs/retrieveEmulatorData

+ 0 - 2
DevAdapter/simulator/assets/cmbsz-uat.ini

@@ -1,2 +0,0 @@
-[server]
-url=http://emulatoruser.paasuat.cmbchina.cn/emulator/avs/retrieveEmulatorData

+ 1 - 1
DevAdapter/simulator/assets/cmbsz.ini

@@ -1,2 +1,2 @@
 [server]
-url=http://emulator.paasst.cmbchina.cn/emulator/avs/retrieveEmulatorData
+url=http://emulatoruser.paasst.cmbchina.cn/emulator/avs/retrieveEmulatorData

+ 12 - 4
DevAdapter/simulator/cardissuer.1.1/cardissuer_httpans.h

@@ -29,7 +29,7 @@ struct TrackInfoJson
 	int eSource;
 	int eStatus;
 	int dwSize;
-	BYTE data[MAX_MAG_TRACK_SIZE];
+	std::string data;
 	JSONCONVERT2OBJECT_MEMEBER_REGISTER(eSource, eStatus, dwSize, data)
 };
 
@@ -45,7 +45,7 @@ typedef struct MagTracksAns {
 typedef struct CmdInfoAns {
 	int errNum;
 	int dwSize;
-	BYTE data[MAX_IC_BUFFER_SIZE];
+	std::string data;
 
 	JSONCONVERT2OBJECT_MEMEBER_REGISTER(errNum, dwSize, data)
 }CmdInfoAns;
@@ -109,7 +109,15 @@ typedef struct SlotStatusAns {
 	int dwSize;//sum of slots
 	//数据下标0~x 表示对应卡槽号0~x的是否有卡的状态
 	//0:卡槽为空,1:卡槽有卡;
-	BYTE status[MAX_SLOT_BUFFER_SIZE];
+	std::vector<int> status;//int 数组
 
 	JSONCONVERT2OBJECT_MEMEBER_REGISTER(errNum, dwSize, status)
-}SlotStatusAns;
+}SlotStatusAns;
+
+typedef struct SAMStatusAns {
+	int errNum;
+	int isActive;//0:Inactive; 1:acitve
+	int chosenOfSAM;//the selected sam number:1,2,...
+
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(errNum, isActive, chosenOfSAM)
+}SAMStatusAns;

+ 76 - 10
DevAdapter/simulator/cardissuer.1.1/cardissuer_impl.cpp

@@ -39,7 +39,9 @@ DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass*& pBaseObj)
 #endif 
 	std::string str;
 	cmb::log4vendor::init(config, str);
-	printf("init after: %s\n", str.c_str());
+	
+	std::string tmpStr = GetSimulatorUrl();
+	LOG4VTM(INFO, "URL = " << tmpStr.c_str());
 
 	return Error_Succeed;
 }
@@ -220,7 +222,7 @@ ErrorCodeEnum CardIssuerImpl::MagRead(MagTracks& magTracks)
 			magTracks.track[i].eStatus = (TrackDataStateEnum)ans.track[i].eStatus;
 			magTracks.track[i].dwSize = ans.track[i].dwSize;
 			memset(magTracks.track[i].data, 0, sizeof(BYTE) * MAX_MAG_TRACK_SIZE);
-			memcpy(magTracks.track[i].data, ans.track[i].data, sizeof(BYTE) * MAX_MAG_TRACK_SIZE);
+			memcpy(magTracks.track[i].data, ans.track[i].data.c_str(), ans.track[i].data.length() + 1);
 		}
 	}
 
@@ -292,12 +294,45 @@ ErrorCodeEnum CardIssuerImpl::ICCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
 
 	if (err == Error_Succeed) {
 		recvBuf.dwSize = ans.dwSize;
-		memcpy(recvBuf.data, ans.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
+		memcpy(recvBuf.data, ans.data.c_str(), ans.data.length() + 1);
 	}
 
 	return err;
 }
 
+ErrorCodeEnum CardIssuerImpl::SAMActive(BYTE vcc)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	SimulatorCommonAns ans;
+
+	err = SimulatorHttpFunction(EntityName, "SAMActive", ans);
+	LOG4VTM(INFO, "SAMActive err = " << err);
+
+	return err;
+}
+
+ErrorCodeEnum CardIssuerImpl::SAMDeactivate()
+{
+	ErrorCodeEnum err = Error_Succeed;
+	SimulatorCommonAns ans;
+
+	err = SimulatorHttpFunction(EntityName, "SAMDeactivate", ans);
+	LOG4VTM(INFO, "SAMDeactivate err = " << err);
+
+	return err;
+}
+
+ErrorCodeEnum CardIssuerImpl::SAMWarmReset()
+{
+	ErrorCodeEnum err = Error_Succeed;
+	SimulatorCommonAns ans;
+
+	err = SimulatorHttpFunction(EntityName, "SAMWarmReset", ans);
+	LOG4VTM(INFO, "SAMWarmReset err = " << err);
+
+	return err;
+}
+
 ErrorCodeEnum CardIssuerImpl::SAMCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
 {
 	ErrorCodeEnum err = Error_Succeed;
@@ -308,12 +343,39 @@ ErrorCodeEnum CardIssuerImpl::SAMCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
 
 	if (err == Error_Succeed) {
 		recvBuf.dwSize = ans.dwSize;
-		memcpy(recvBuf.data, ans.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
+		memcpy(recvBuf.data, ans.data.c_str(), ans.data.length() + 1);
+	}
+
+	return err;
+}
+
+ErrorCodeEnum CardIssuerImpl::SAMQueryStatus(SAMStatus& samStatus)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	SAMStatusAns ans;
+
+	err = SimulatorHttpFunction(EntityName, "SAMQueryStatus", ans);
+	LOG4VTM(INFO, "SAMQueryStatus err = " << err);
+
+	if (err == Error_Succeed) {
+		samStatus.isActive = ans.isActive;
+		samStatus.chosenOfSAM = ans.chosenOfSAM;
 	}
 
 	return err;
 }
 
+ErrorCodeEnum CardIssuerImpl::SAMSelect(const int sn)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	SimulatorCommonAns ans;
+
+	err = SimulatorHttpFunction(EntityName, "SAMSelect", ans);
+	LOG4VTM(INFO, "SAMSelect err = " << err);
+
+	return err;
+}
+
 ErrorCodeEnum CardIssuerImpl::ActiveICCardATR(CmdInfo& atrBuf)
 {
 	ErrorCodeEnum err = Error_Succeed;
@@ -324,7 +386,7 @@ ErrorCodeEnum CardIssuerImpl::ActiveICCardATR(CmdInfo& atrBuf)
 
 	if (err == Error_Succeed) {
 		atrBuf.dwSize = ans.dwSize;
-		memcpy(atrBuf.data, ans.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
+		memcpy(atrBuf.data, ans.data.c_str(), ans.data.length() + 1);
 	}
 
 	return err;
@@ -377,7 +439,7 @@ ErrorCodeEnum CardIssuerImpl::RFTypeABCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
 
 	if (err == Error_Succeed) {
 		recvBuf.dwSize = ans.dwSize;
-		memcpy(recvBuf.data, ans.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
+		memcpy(recvBuf.data, ans.data.c_str(), ans.data.length() + 1);
 	}
 
 	return err;
@@ -480,9 +542,9 @@ ErrorCodeEnum CardIssuerImpl::ReadAccount(CardNo& cardNo)
 		cardNo.dwSize = ans.dwSize;
 		cardNo.dwTrack2Size = ans.dwTrack2Size;
 		cardNo.dwTrack3Size = ans.dwTrack3Size;
-		memcpy(cardNo.account, ans.account.c_str(), ans.account.length());
-		memcpy(cardNo.track2, ans.track2.c_str(), ans.track2.length());
-		memcpy(cardNo.track3, ans.track3.c_str(), ans.track3.length());
+		memcpy(cardNo.account, ans.account.c_str(), ans.account.length() + 1);
+		memcpy(cardNo.track2, ans.track2.c_str(), ans.track2.length() + 1);
+		memcpy(cardNo.track3, ans.track3.c_str(), ans.track3.length() + 1);
 	}
 
 	return err;
@@ -513,7 +575,11 @@ ErrorCodeEnum CardIssuerImpl::QuerySlotsStatus(SlotStatus& slots, const int slot
 
 	if (err == Error_Succeed) {
 		slots.dwSize = ans.dwSize;
-		memcpy(slots.status, ans.status, MAX_SLOT_BUFFER_SIZE);
+		
+		for (int i = 0; i < ans.status.size(); i++)
+		{
+			slots.status[i] = (BYTE)ans.status[i];
+		}
 	}
 
 	return err;

+ 5 - 5
DevAdapter/simulator/cardissuer.1.1/cardissuer_impl.h

@@ -82,11 +82,11 @@ public:
 	//使用(卡库,卡机)
 	ErrorCodeEnum ICCommand(CmdInfo sendBuf, CmdInfo& recvBuf);
 	//////////////////SAM 卡操作部分////////////////////
-	ErrorCodeEnum SAMActive(BYTE vcc = 0x30) { return Error_NotImpl; }//使用(卡库,卡机)
-	ErrorCodeEnum SAMDeactivate() { return Error_NotImpl; }//使用(卡库,卡机)
-	ErrorCodeEnum SAMWarmReset() { return Error_NotImpl; }//使用(卡库,卡机)
-	ErrorCodeEnum SAMQueryStatus(SAMStatus& samStatus) { return Error_NotImpl; }//使用(卡库,卡机)
-	ErrorCodeEnum SAMSelect(const int sn) { return Error_NotImpl; }//使用(卡库,卡机)
+	ErrorCodeEnum SAMActive(BYTE vcc = 0x30);//使用(卡库,卡机)
+	ErrorCodeEnum SAMDeactivate();//使用(卡库,卡机)
+	ErrorCodeEnum SAMWarmReset();//使用(卡库,卡机)
+	ErrorCodeEnum SAMQueryStatus(SAMStatus& samStatus);//使用(卡库,卡机)
+	ErrorCodeEnum SAMSelect(const int sn);//使用(卡库,卡机)
 	//即时制卡卡库需要实现SAMCommand,用来执行apdu指令
 	ErrorCodeEnum SAMCommand(CmdInfo sendBuf, CmdInfo& recvBuf);//使用(卡库,卡机)
 	//即时制卡卡库需要实现ActiveICCardATR,用来激活卡片,返回ATR

+ 12 - 4
DevAdapter/simulator/cardissuerstand.1.1/cardissuer_httpans.h

@@ -29,7 +29,7 @@ struct TrackInfoJson
 	int eSource;
 	int eStatus;
 	int dwSize;
-	BYTE data[MAX_MAG_TRACK_SIZE];
+	std::string data;
 	JSONCONVERT2OBJECT_MEMEBER_REGISTER(eSource, eStatus, dwSize, data)
 };
 
@@ -45,7 +45,7 @@ typedef struct MagTracksAns {
 typedef struct CmdInfoAns {
 	int errNum;
 	int dwSize;
-	BYTE data[MAX_IC_BUFFER_SIZE];
+	std::string data;
 
 	JSONCONVERT2OBJECT_MEMEBER_REGISTER(errNum, dwSize, data)
 }CmdInfoAns;
@@ -109,7 +109,15 @@ typedef struct SlotStatusAns {
 	int dwSize;//sum of slots
 	//数据下标0~x 表示对应卡槽号0~x的是否有卡的状态
 	//0:卡槽为空,1:卡槽有卡;
-	BYTE status[MAX_SLOT_BUFFER_SIZE];
+	std::vector<int> status;//int 数组
 
 	JSONCONVERT2OBJECT_MEMEBER_REGISTER(errNum, dwSize, status)
-}SlotStatusAns;
+}SlotStatusAns;
+
+typedef struct SAMStatusAns {
+	int errNum;
+	int isActive;//0:Inactive; 1:acitve
+	int chosenOfSAM;//the selected sam number:1,2,...
+
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(errNum, isActive, chosenOfSAM)
+}SAMStatusAns;

+ 76 - 10
DevAdapter/simulator/cardissuerstand.1.1/cardissuer_impl.cpp

@@ -39,7 +39,9 @@ DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass*& pBaseObj)
 #endif 
 	std::string str;
 	cmb::log4vendor::init(config, str);
-	printf("init after: %s\n", str.c_str());
+
+	std::string tmpStr = GetSimulatorUrl();
+	LOG4VTM(INFO, "URL = " << tmpStr.c_str());
 
 	return Error_Succeed;
 }
@@ -220,7 +222,7 @@ ErrorCodeEnum CardIssuerImpl::MagRead(MagTracks& magTracks)
 			magTracks.track[i].eStatus = (TrackDataStateEnum)ans.track[i].eStatus;
 			magTracks.track[i].dwSize = ans.track[i].dwSize;
 			memset(magTracks.track[i].data, 0, sizeof(BYTE) * MAX_MAG_TRACK_SIZE);
-			memcpy(magTracks.track[i].data, ans.track[i].data, sizeof(BYTE) * MAX_MAG_TRACK_SIZE);
+			memcpy(magTracks.track[i].data, ans.track[i].data.c_str(), ans.track[i].data.length() + 1);
 		}
 	}
 
@@ -292,12 +294,45 @@ ErrorCodeEnum CardIssuerImpl::ICCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
 
 	if (err == Error_Succeed) {
 		recvBuf.dwSize = ans.dwSize;
-		memcpy(recvBuf.data, ans.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
+		memcpy(recvBuf.data, ans.data.c_str(), ans.data.length() + 1);
 	}
 
 	return err;
 }
 
+ErrorCodeEnum CardIssuerImpl::SAMActive(BYTE vcc)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	SimulatorCommonAns ans;
+
+	err = SimulatorHttpFunction(EntityName, "SAMActive", ans);
+	LOG4VTM(INFO, "SAMActive err = " << err);
+
+	return err;
+}
+
+ErrorCodeEnum CardIssuerImpl::SAMDeactivate()
+{
+	ErrorCodeEnum err = Error_Succeed;
+	SimulatorCommonAns ans;
+
+	err = SimulatorHttpFunction(EntityName, "SAMDeactivate", ans);
+	LOG4VTM(INFO, "SAMDeactivate err = " << err);
+
+	return err;
+}
+
+ErrorCodeEnum CardIssuerImpl::SAMWarmReset()
+{
+	ErrorCodeEnum err = Error_Succeed;
+	SimulatorCommonAns ans;
+
+	err = SimulatorHttpFunction(EntityName, "SAMWarmReset", ans);
+	LOG4VTM(INFO, "SAMWarmReset err = " << err);
+
+	return err;
+}
+
 ErrorCodeEnum CardIssuerImpl::SAMCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
 {
 	ErrorCodeEnum err = Error_Succeed;
@@ -308,12 +343,39 @@ ErrorCodeEnum CardIssuerImpl::SAMCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
 
 	if (err == Error_Succeed) {
 		recvBuf.dwSize = ans.dwSize;
-		memcpy(recvBuf.data, ans.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
+		memcpy(recvBuf.data, ans.data.c_str(), ans.data.length() + 1);
+	}
+
+	return err;
+}
+
+ErrorCodeEnum CardIssuerImpl::SAMQueryStatus(SAMStatus& samStatus)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	SAMStatusAns ans;
+
+	err = SimulatorHttpFunction(EntityName, "SAMQueryStatus", ans);
+	LOG4VTM(INFO, "SAMQueryStatus err = " << err);
+
+	if (err == Error_Succeed) {
+		samStatus.isActive = ans.isActive;
+		samStatus.chosenOfSAM = ans.chosenOfSAM;
 	}
 
 	return err;
 }
 
+ErrorCodeEnum CardIssuerImpl::SAMSelect(const int sn)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	SimulatorCommonAns ans;
+
+	err = SimulatorHttpFunction(EntityName, "SAMSelect", ans);
+	LOG4VTM(INFO, "SAMSelect err = " << err);
+
+	return err;
+}
+
 ErrorCodeEnum CardIssuerImpl::ActiveICCardATR(CmdInfo& atrBuf)
 {
 	ErrorCodeEnum err = Error_Succeed;
@@ -324,7 +386,7 @@ ErrorCodeEnum CardIssuerImpl::ActiveICCardATR(CmdInfo& atrBuf)
 
 	if (err == Error_Succeed) {
 		atrBuf.dwSize = ans.dwSize;
-		memcpy(atrBuf.data, ans.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
+		memcpy(atrBuf.data, ans.data.c_str(), ans.data.length() + 1);
 	}
 
 	return err;
@@ -377,7 +439,7 @@ ErrorCodeEnum CardIssuerImpl::RFTypeABCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
 
 	if (err == Error_Succeed) {
 		recvBuf.dwSize = ans.dwSize;
-		memcpy(recvBuf.data, ans.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
+		memcpy(recvBuf.data, ans.data.c_str(), ans.data.length() + 1);
 	}
 
 	return err;
@@ -480,9 +542,9 @@ ErrorCodeEnum CardIssuerImpl::ReadAccount(CardNo& cardNo)
 		cardNo.dwSize = ans.dwSize;
 		cardNo.dwTrack2Size = ans.dwTrack2Size;
 		cardNo.dwTrack3Size = ans.dwTrack3Size;
-		memcpy(cardNo.account, ans.account.c_str(), ans.account.length());
-		memcpy(cardNo.track2, ans.track2.c_str(), ans.track2.length());
-		memcpy(cardNo.track3, ans.track3.c_str(), ans.track3.length());
+		memcpy(cardNo.account, ans.account.c_str(), ans.account.length() + 1);
+		memcpy(cardNo.track2, ans.track2.c_str(), ans.track2.length() + 1);
+		memcpy(cardNo.track3, ans.track3.c_str(), ans.track3.length() + 1);
 	}
 
 	return err;
@@ -513,7 +575,11 @@ ErrorCodeEnum CardIssuerImpl::QuerySlotsStatus(SlotStatus& slots, const int slot
 
 	if (err == Error_Succeed) {
 		slots.dwSize = ans.dwSize;
-		memcpy(slots.status, ans.status, MAX_SLOT_BUFFER_SIZE);
+
+		for (int i = 0; i < ans.status.size(); i++)
+		{
+			slots.status[i] = (BYTE)ans.status[i];
+		}
 	}
 
 	return err;

+ 5 - 5
DevAdapter/simulator/cardissuerstand.1.1/cardissuer_impl.h

@@ -82,11 +82,11 @@ public:
 	//使用(卡库,卡机)
 	ErrorCodeEnum ICCommand(CmdInfo sendBuf, CmdInfo& recvBuf);
 	//////////////////SAM 卡操作部分////////////////////
-	ErrorCodeEnum SAMActive(BYTE vcc = 0x30) { return Error_NotImpl; }//使用(卡库,卡机)
-	ErrorCodeEnum SAMDeactivate() { return Error_NotImpl; }//使用(卡库,卡机)
-	ErrorCodeEnum SAMWarmReset() { return Error_NotImpl; }//使用(卡库,卡机)
-	ErrorCodeEnum SAMQueryStatus(SAMStatus& samStatus) { return Error_NotImpl; }//使用(卡库,卡机)
-	ErrorCodeEnum SAMSelect(const int sn) { return Error_NotImpl; }//使用(卡库,卡机)
+	ErrorCodeEnum SAMActive(BYTE vcc = 0x30);//使用(卡库,卡机)
+	ErrorCodeEnum SAMDeactivate();//使用(卡库,卡机)
+	ErrorCodeEnum SAMWarmReset();//使用(卡库,卡机)
+	ErrorCodeEnum SAMQueryStatus(SAMStatus& samStatus);//使用(卡库,卡机)
+	ErrorCodeEnum SAMSelect(const int sn);//使用(卡库,卡机)
 	//即时制卡卡库需要实现SAMCommand,用来执行apdu指令
 	ErrorCodeEnum SAMCommand(CmdInfo sendBuf, CmdInfo& recvBuf);//使用(卡库,卡机)
 	//即时制卡卡库需要实现ActiveICCardATR,用来激活卡片,返回ATR

+ 16 - 8
DevAdapter/simulator/cardissuerstore.1.1/cardissuer_httpans.h

@@ -3,8 +3,8 @@
 #include <vector>
 
 typedef struct CardIssuerStatusAns {
-    int errNum;
-	
+	int errNum;
+
 	int eMedia;	//state about card
 	int eRetainBin;
 	int dwRetainCount;	//回收箱容量
@@ -13,7 +13,7 @@ typedef struct CardIssuerStatusAns {
 	std::vector<int> dwIssuerCount;	//发卡箱容量,0,1,2,... => 1,2,3,...
 	std::vector<int> eKakuTape;//eKakuTape[0],eKakuTape[1],eKakuTape[2],eKakuTape[3]分别存放平面,凹,凸(金),凸(银)的状态
 
-    JSONCONVERT2OBJECT_MEMEBER_REGISTER(errNum, eMedia, eRetainBin, dwRetainCount, eIssuerBin, dwIssuerCount, eKakuTape)
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(errNum, eMedia, eRetainBin, dwRetainCount, eIssuerBin, dwIssuerCount, eKakuTape)
 }CardIssuerStatusAns;
 
 typedef struct GetDeviceSNAns {
@@ -29,7 +29,7 @@ struct TrackInfoJson
 	int eSource;
 	int eStatus;
 	int dwSize;
-	BYTE data[MAX_MAG_TRACK_SIZE];
+	std::string data;
 	JSONCONVERT2OBJECT_MEMEBER_REGISTER(eSource, eStatus, dwSize, data)
 };
 
@@ -45,7 +45,7 @@ typedef struct MagTracksAns {
 typedef struct CmdInfoAns {
 	int errNum;
 	int dwSize;
-	BYTE data[MAX_IC_BUFFER_SIZE];
+	std::string data;
 
 	JSONCONVERT2OBJECT_MEMEBER_REGISTER(errNum, dwSize, data)
 }CmdInfoAns;
@@ -66,7 +66,7 @@ typedef struct DevOpenExAns {
 
 typedef struct TransferEnInitAns {
 	int errNum;
-	int iStatus; 
+	int iStatus;
 	BYTE Cr1[256];
 	int lenR1;
 	BYTE Cr3[256];
@@ -109,7 +109,15 @@ typedef struct SlotStatusAns {
 	int dwSize;//sum of slots
 	//数据下标0~x 表示对应卡槽号0~x的是否有卡的状态
 	//0:卡槽为空,1:卡槽有卡;
-	BYTE status[MAX_SLOT_BUFFER_SIZE];
+	std::vector<int> status;//int 数组
 
 	JSONCONVERT2OBJECT_MEMEBER_REGISTER(errNum, dwSize, status)
-}SlotStatusAns;
+}SlotStatusAns;
+
+typedef struct SAMStatusAns {
+	int errNum;
+	int isActive;//0:Inactive; 1:acitve
+	int chosenOfSAM;//the selected sam number:1,2,...
+
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(errNum, isActive, chosenOfSAM)
+}SAMStatusAns;

+ 77 - 11
DevAdapter/simulator/cardissuerstore.1.1/cardissuer_impl.cpp

@@ -39,7 +39,9 @@ DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass*& pBaseObj)
 #endif 
 	std::string str;
 	cmb::log4vendor::init(config, str);
-	printf("init after: %s\n", str.c_str());
+
+	std::string tmpStr = GetSimulatorUrl();
+	LOG4VTM(INFO, "URL = " << tmpStr.c_str());
 
 	return Error_Succeed;
 }
@@ -136,7 +138,7 @@ ErrorCodeEnum CardIssuerImpl::GetDevStatus(CardIssuerStatus& devStatus)
 		devStatus.eMedia = (CardStatusEnum)ans.eMedia;
 		devStatus.eRetainBin = (RtBinStatusEnum)ans.eRetainBin;
 		devStatus.dwRetainCount = ans.dwRetainCount;
-		
+
 		for (int i = 0; i < 12; i++)
 		{
 			if (i >= ans.eIssuerBin.size())
@@ -220,7 +222,7 @@ ErrorCodeEnum CardIssuerImpl::MagRead(MagTracks& magTracks)
 			magTracks.track[i].eStatus = (TrackDataStateEnum)ans.track[i].eStatus;
 			magTracks.track[i].dwSize = ans.track[i].dwSize;
 			memset(magTracks.track[i].data, 0, sizeof(BYTE) * MAX_MAG_TRACK_SIZE);
-			memcpy(magTracks.track[i].data, ans.track[i].data, sizeof(BYTE) * MAX_MAG_TRACK_SIZE);
+			memcpy(magTracks.track[i].data, ans.track[i].data.c_str(), ans.track[i].data.length() + 1);
 		}
 	}
 
@@ -292,12 +294,45 @@ ErrorCodeEnum CardIssuerImpl::ICCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
 
 	if (err == Error_Succeed) {
 		recvBuf.dwSize = ans.dwSize;
-		memcpy(recvBuf.data, ans.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
+		memcpy(recvBuf.data, ans.data.c_str(), ans.data.length() + 1);
 	}
 
 	return err;
 }
 
+ErrorCodeEnum CardIssuerImpl::SAMActive(BYTE vcc)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	SimulatorCommonAns ans;
+
+	err = SimulatorHttpFunction(EntityName, "SAMActive", ans);
+	LOG4VTM(INFO, "SAMActive err = " << err);
+
+	return err;
+}
+
+ErrorCodeEnum CardIssuerImpl::SAMDeactivate()
+{
+	ErrorCodeEnum err = Error_Succeed;
+	SimulatorCommonAns ans;
+
+	err = SimulatorHttpFunction(EntityName, "SAMDeactivate", ans);
+	LOG4VTM(INFO, "SAMDeactivate err = " << err);
+
+	return err;
+}
+
+ErrorCodeEnum CardIssuerImpl::SAMWarmReset()
+{
+	ErrorCodeEnum err = Error_Succeed;
+	SimulatorCommonAns ans;
+
+	err = SimulatorHttpFunction(EntityName, "SAMWarmReset", ans);
+	LOG4VTM(INFO, "SAMWarmReset err = " << err);
+
+	return err;
+}
+
 ErrorCodeEnum CardIssuerImpl::SAMCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
 {
 	ErrorCodeEnum err = Error_Succeed;
@@ -308,12 +343,39 @@ ErrorCodeEnum CardIssuerImpl::SAMCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
 
 	if (err == Error_Succeed) {
 		recvBuf.dwSize = ans.dwSize;
-		memcpy(recvBuf.data, ans.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
+		memcpy(recvBuf.data, ans.data.c_str(), ans.data.length() + 1);
+	}
+
+	return err;
+}
+
+ErrorCodeEnum CardIssuerImpl::SAMQueryStatus(SAMStatus& samStatus)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	SAMStatusAns ans;
+
+	err = SimulatorHttpFunction(EntityName, "SAMQueryStatus", ans);
+	LOG4VTM(INFO, "SAMQueryStatus err = " << err);
+
+	if (err == Error_Succeed) {
+		samStatus.isActive = ans.isActive;
+		samStatus.chosenOfSAM = ans.chosenOfSAM;
 	}
 
 	return err;
 }
 
+ErrorCodeEnum CardIssuerImpl::SAMSelect(const int sn)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	SimulatorCommonAns ans;
+
+	err = SimulatorHttpFunction(EntityName, "SAMSelect", ans);
+	LOG4VTM(INFO, "SAMSelect err = " << err);
+
+	return err;
+}
+
 ErrorCodeEnum CardIssuerImpl::ActiveICCardATR(CmdInfo& atrBuf)
 {
 	ErrorCodeEnum err = Error_Succeed;
@@ -324,7 +386,7 @@ ErrorCodeEnum CardIssuerImpl::ActiveICCardATR(CmdInfo& atrBuf)
 
 	if (err == Error_Succeed) {
 		atrBuf.dwSize = ans.dwSize;
-		memcpy(atrBuf.data, ans.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
+		memcpy(atrBuf.data, ans.data.c_str(), ans.data.length() + 1);
 	}
 
 	return err;
@@ -377,7 +439,7 @@ ErrorCodeEnum CardIssuerImpl::RFTypeABCommand(CmdInfo sendBuf, CmdInfo& recvBuf)
 
 	if (err == Error_Succeed) {
 		recvBuf.dwSize = ans.dwSize;
-		memcpy(recvBuf.data, ans.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
+		memcpy(recvBuf.data, ans.data.c_str(), ans.data.length() + 1);
 	}
 
 	return err;
@@ -480,9 +542,9 @@ ErrorCodeEnum CardIssuerImpl::ReadAccount(CardNo& cardNo)
 		cardNo.dwSize = ans.dwSize;
 		cardNo.dwTrack2Size = ans.dwTrack2Size;
 		cardNo.dwTrack3Size = ans.dwTrack3Size;
-		memcpy(cardNo.account, ans.account.c_str(), ans.account.length());
-		memcpy(cardNo.track2, ans.track2.c_str(), ans.track2.length());
-		memcpy(cardNo.track3, ans.track3.c_str(), ans.track3.length());
+		memcpy(cardNo.account, ans.account.c_str(), ans.account.length() + 1);
+		memcpy(cardNo.track2, ans.track2.c_str(), ans.track2.length() + 1);
+		memcpy(cardNo.track3, ans.track3.c_str(), ans.track3.length() + 1);
 	}
 
 	return err;
@@ -513,7 +575,11 @@ ErrorCodeEnum CardIssuerImpl::QuerySlotsStatus(SlotStatus& slots, const int slot
 
 	if (err == Error_Succeed) {
 		slots.dwSize = ans.dwSize;
-		memcpy(slots.status, ans.status, MAX_SLOT_BUFFER_SIZE);
+
+		for (int i = 0; i < ans.status.size(); i++)
+		{
+			slots.status[i] = (BYTE)ans.status[i];
+		}
 	}
 
 	return err;

+ 5 - 5
DevAdapter/simulator/cardissuerstore.1.1/cardissuer_impl.h

@@ -82,11 +82,11 @@ public:
 	//使用(卡库,卡机)
 	ErrorCodeEnum ICCommand(CmdInfo sendBuf, CmdInfo& recvBuf) ;
 	//////////////////SAM 卡操作部分////////////////////
-	ErrorCodeEnum SAMActive(BYTE vcc = 0x30) { return Error_NotImpl; }//使用(卡库,卡机)
-	ErrorCodeEnum SAMDeactivate() { return Error_NotImpl; }//使用(卡库,卡机)
-	ErrorCodeEnum SAMWarmReset() { return Error_NotImpl; }//使用(卡库,卡机)
-	ErrorCodeEnum SAMQueryStatus(SAMStatus& samStatus) { return Error_NotImpl; }//使用(卡库,卡机)
-	ErrorCodeEnum SAMSelect(const int sn) { return Error_NotImpl; }//使用(卡库,卡机)
+	ErrorCodeEnum SAMActive(BYTE vcc = 0x30);//使用(卡库,卡机)
+	ErrorCodeEnum SAMDeactivate();//使用(卡库,卡机)
+	ErrorCodeEnum SAMWarmReset();//使用(卡库,卡机)
+	ErrorCodeEnum SAMQueryStatus(SAMStatus& samStatus);//使用(卡库,卡机)
+	ErrorCodeEnum SAMSelect(const int sn);//使用(卡库,卡机)
 	//即时制卡卡库需要实现SAMCommand,用来执行apdu指令
 	ErrorCodeEnum SAMCommand(CmdInfo sendBuf, CmdInfo& recvBuf) ;//使用(卡库,卡机)
 	//即时制卡卡库需要实现ActiveICCardATR,用来激活卡片,返回ATR

+ 1 - 1
DevAdapter/simulator/contactlesscard.1.1/contactless_httpans.h

@@ -18,7 +18,7 @@ typedef struct ActiveContactlessICCardAns {
 typedef struct CmdInfoAns {
 	int errNum;
 	int dwSize;
-	BYTE data[MAX_IC_BUFFER_SIZE];
+	std::string data;
 
 	JSONCONVERT2OBJECT_MEMEBER_REGISTER(errNum, dwSize, data)
 }CmdInfoAns;

+ 5 - 2
DevAdapter/simulator/contactlesscard.1.1/contactless_impl.cpp

@@ -158,7 +158,7 @@ ErrorCodeEnum ContactlessCardImpl::MifareCommand(MifareFuctionEnum eFunType, Cmd
 
     if (err == Error_Succeed) {
         recvBuf.dwSize = ans.dwSize;
-        memcpy(recvBuf.data, ans.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
+        memcpy(recvBuf.data, ans.data.c_str(), ans.data.length() + 1);
     }
 
     return err;
@@ -174,7 +174,7 @@ ErrorCodeEnum ContactlessCardImpl::RFTypeABCommand(CmdInfo sendBuf, CmdInfo& rec
 
     if (err == Error_Succeed) {
         recvBuf.dwSize = ans.dwSize;
-        memcpy(recvBuf.data, ans.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
+        memcpy(recvBuf.data, ans.data.c_str(), ans.data.length() + 1);
     }
 
     return err;
@@ -208,6 +208,9 @@ DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
     std::string str;
     cmb::log4vendor::init(config, str);
 
+    std::string tmpStr = GetSimulatorUrl();
+    LOG4VTM(INFO, "URL = " << tmpStr.c_str());
+
     return Error_Succeed;
 }
 DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass *&pBaseObj)

+ 3 - 0
DevAdapter/simulator/gpio.1.1/gpio_impl.cpp

@@ -152,6 +152,9 @@ DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
     std::string str;
     cmb::log4vendor::init(config, str);
 
+    std::string tmpStr = GetSimulatorUrl();
+    LOG4VTM(INFO, "URL = " << tmpStr.c_str());
+
     return Error_Succeed;
 }
 DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass *&pBaseObj)

+ 3 - 1
DevAdapter/simulator/hspscanner.1.1/hspscanner_impl.cpp

@@ -89,7 +89,9 @@ DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
 #endif 
         std::string str;
         cmb::log4vendor::init(config, str);
-        printf("init after: %s\n", str.c_str());
+
+        std::string tmpStr = GetSimulatorUrl();
+        LOG4VTM(INFO, "URL = " << tmpStr.c_str());
 
         return Error_Succeed;
     }

+ 3 - 0
DevAdapter/simulator/idcer.1.1/idcer_impl.cpp

@@ -534,6 +534,9 @@ DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass*& pBaseObj)
     std::string str;
     cmb::log4vendor::init(config, str);
 
+    std::string tmpStr = GetSimulatorUrl();
+    LOG4VTM(INFO, "URL = " << tmpStr.c_str());
+
     return Error_Succeed;
 }
 DEVICEBASE_API ErrorCodeEnum ReleaseDevComponent(DeviceBaseClass*& pBaseObj)

+ 2 - 2
DevAdapter/simulator/pinpad.1.1/pinpad_httpans.h

@@ -11,7 +11,7 @@ typedef struct KeyReadAns {
 typedef struct EnDecryptInfoAns {
     int errNum;
     int dwSize;
-    BYTE data[MAX_EN_DECRYPT_DATA_SIZE];	//en/decrypt data
+    std::string data;	//en/decrypt data
 
     JSONCONVERT2OBJECT_MEMEBER_REGISTER(errNum, dwSize, data)
 }EnDecryptInfoAns;
@@ -20,7 +20,7 @@ typedef struct PinBlockAns
 {
     int errNum;
     int dwSize;
-    BYTE data[MAX_PIN_BLOCK_SIZE];
+    std::string data;
 
     JSONCONVERT2OBJECT_MEMEBER_REGISTER(errNum, dwSize, data)
 }PinBlockAns;

+ 6 - 4
DevAdapter/simulator/pinpad.1.1/pinpad_impl.cpp

@@ -184,7 +184,7 @@ ErrorCodeEnum PinPadClassImpl::EncryptData(EnDecryptInfo srcInfo, EnDecryptInfo
 
     if (err == Error_Succeed) {
         destInfo.dwSize = ans.dwSize;
-        memcpy(destInfo.data, ans.data, MAX_EN_DECRYPT_DATA_SIZE);
+        memcpy(destInfo.data, ans.data.c_str(), ans.data.length() + 1);
     }
 
     return err;
@@ -200,7 +200,7 @@ ErrorCodeEnum PinPadClassImpl::MacEncrypt(EnDecryptInfo srcInfo, EnDecryptInfo &
 
     if (err == Error_Succeed) {
         destInfo.dwSize = ans.dwSize;
-        memcpy(destInfo.data, ans.data, MAX_EN_DECRYPT_DATA_SIZE);
+        memcpy(destInfo.data, ans.data.c_str(), ans.data.length() + 1);
     }
 
     return err;
@@ -216,7 +216,7 @@ ErrorCodeEnum PinPadClassImpl::GetPinBlock(PinBlock &block)
 
     if (err == Error_Succeed) {
         block.dwSize = ans.dwSize;
-        memcpy(block.data, ans.data, MAX_PIN_BLOCK_SIZE);
+        memcpy(block.data, ans.data.c_str(), ans.data.length() + 1);
     }
 
     return err;
@@ -265,7 +265,9 @@ DEVICEBASE_API ErrorCodeEnum  CreateDevComponent(DeviceBaseClass*& pOutDevAptObj
 #endif //_MSC_VER
     std::string str;
     cmb::log4vendor::init(config, str);
-    printf("init after: %s\n", str.c_str());
+
+    std::string tmpStr = GetSimulatorUrl();
+    LOG4VTM(INFO, "URL = " << tmpStr.c_str());
 
     return Error_Succeed;
 }

+ 1 - 0
Framework/spbase/SpEntity.cpp

@@ -1259,6 +1259,7 @@ ErrorCodeEnum SpEntity::GetSystemStaticInfo(CSystemStaticInfo &Info)
 
 	Info.strTerminalID = CSimpleStringA(root_ini->terminal_no);
 	Info.strMachineType = CSimpleStringA(root_ini->machine_type);
+	Info.strManufacturer = CSimpleStringA(root_ini->manufacturer);
 	Info.MachineVersion = CVersion(root_ini->machine_version.major, root_ini->machine_version.minor, root_ini->machine_version.revision, root_ini->machine_version.build);
 	Info.LatterInstallVersion = CVersion(install_ini->latter_install_version.major, install_ini->latter_install_version.minor, install_ini->latter_install_version.revision, install_ini->latter_install_version.build);
 

+ 6 - 2
Module/include/CommEntityUtil.hpp

@@ -602,12 +602,16 @@ static bool ShellExecute(const std::string& cmd, std::string& succResult, std::s
 		errResult = errResult + "GetExitCodeProcess failed with error code " + strerror(GetLastError());
 		return false;
 	}
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("The program exited with code:%d", exitCode);
-
 	// 关闭进程和线程句柄
 	CloseHandle(pi.hProcess);
 	CloseHandle(pi.hThread);
 
+	if (exitCode != 0)
+	{
+		errResult = errResult + "The program exited with code:" + strerror(exitCode);
+		return false;
+	}
+
 	return true;
 #else
 	char buf_ps[1024];

+ 4 - 2
Module/include/DevEntityCommBase.hpp

@@ -228,24 +228,26 @@ inline void CDevAdptEntityBase::InitializeVendorLogSwitch()
 
 	struct VendorLogConfig {
 
-		VendorLogConfig() :strLevel("OFF"), strType("FILE"), strDllName(""), strLogPath("") {}
+		VendorLogConfig() :strLevel("OFF"), strType("FILE"), strDllName(""), strLogPath(""), strModuleName(""){}
 
 		CSimpleStringA strLevel;
 		CSimpleStringA strType;
 		CSimpleStringA strDllName;
 		CSimpleStringA strLogPath;
+		CSimpleStringA strModuleName;
 
 		void Settle()  {
 			toolkit_setenv("VENDOR_RECODE_LEVEL", strLevel);
 			toolkit_setenv("VENDOR_RECODE_TYPE", strType);
 			toolkit_setenv("VENDOR_DLL_NAME", strDllName);
 			toolkit_setenv("VENDOR_LOG_PATH", strLogPath);
+			toolkit_setenv("VENDOR_PARENT_NAME", strModuleName);
 		}
 
 	} stLogConfig;
 
 	stLogConfig.strDllName = vendorLibInfo.toLibNameString().GetData();
-
+	stLogConfig.strModuleName = GetEntityName();
 	CSmartPointer<IConfigInfo> centerConfig;
 	GetFunction()->OpenConfig(Config_CenterSetting, centerConfig);
 

+ 2 - 24
Module/include/DevFSMCommBase.hpp

@@ -719,29 +719,6 @@ public:
 		m_errPkg.apiErrCode = apiCode;
 	}
 
-	DWORD AlarmDEC(bool bToBusiness = false, bool alarmOrNot = true) {
-		WORD wdErrCode = 0;
-		CSimpleStringA csErrMsg(true);
-		ErrorCodeEnum ec = GetAndSplitDevErrInfo(csErrMsg, wdErrCode, (LPCTSTR)m_errPkg.msgHead);
-		if (ec == Error_Succeed && wdErrCode != 0) {
-			//oilyang@20200525 if have been set ErrorCode of entity defined (not device),use it directly
-			if ((m_errPkg.apiErrCode >> 20) == m_entCode.dwEntityId)
-				UpdateDEC(m_errPkg.apiErrCode);
-			else
-				UpdateDEC(wdErrCode);
-		} else if (m_errPkg.apiErrCode != 0) {
-			UpdateDEC(m_errPkg.apiErrCode);
-		}
-		//oilyang@20200525 if have been set ErrorCode of entity defined (not device),use it directly
-		DWORD dwCode = GetAlarmDEC();
-		if (alarmOrNot) {
-            LogErrMsgEx(m_errPkg, csErrMsg, dwCode, bToBusiness);
-		} else {
-			DbgWithLink(bToBusiness ? LOG_LEVEL_ERROR : LOG_LEVEL_WARN, bToBusiness ? LOG_TYPE_USER : LOG_TYPE_SYSTEM).setAPI(m_errPkg.msgHead)("{\"DevSN\":\"%s\", \"Code\":\"%s\", \"Msg\":\"%s\"}"
-				, m_errPkg.devSN.GetData(), SpStrError(m_errPkg.devErrCode), csErrMsg.GetData());
-		}
-		return dwCode;
-	}
 	void SetErrorAndLog(ErrorCodeEnum errCode, DWORD userCode, CSimpleStringA devApi, CSimpleStringA funPath, bool bInBusiness = false, int costTime = 0, CSimpleStringA logCode = "", CSimpleStringA context = "")
 	{
 		//set error info
@@ -769,7 +746,7 @@ public:
 
 		//oilyang@20200525 if have been set ErrorCode of entity defined (not device),use it directly
 		const DWORD dwCode = GetAlarmDEC();
-		const CSimpleStringA alarmMsg = CSimpleStringA::Format("{\"Function\":\"%s\", \"DevApi\":\"%s\", \"ReturnCode\":\"%s\", \"Msg\":%s, \"Context\":%s}"
+		const CSimpleStringA alarmMsg = CSimpleStringA::Format("{\"Function\":\"%s\", \"DevApi\":\"%s\", \"ReturnCode\":\"%s\", \"Msg\":\"%s\", \"Context\":\"%s\"}"
 			, funPath.GetData(), devApi.GetData(), SpStrError(m_errPkgEx.errCode), csErrMsg.GetData(), context.GetData());
 		
 		std::map<std::string, std::string> msgInfo;
@@ -935,6 +912,7 @@ public:
 	{
 		CSimpleStringA entityName(this->GetEntityBase()->GetEntityName());
 		std::map<std::string, std::string> rootInfo;
+		rootInfo["File"] = m_adapterInfo.strPureAdapterName.GetData();
 		rootInfo["Vendor"] = m_adapterInfo.strVendor.GetData();
 		rootInfo["Version"] = m_adapterInfo.strVersion.GetData();
 		rootInfo["Batch"] = m_adapterInfo.strBatch.GetData();

+ 2 - 14
Module/include/EventCode.h

@@ -34,15 +34,6 @@ static const char* Device_Type_Table[] = {
 #define ERR_MOD_CENTERSETTING_CHANGE_FROM_NONE2SUBBRANCH      0x1010001F //从无切换到分行
 
 
-#define LOG_WARN_UPLOAD_SCANFILE_LOCK_ERROR 0x10400001 //扫描文件时文件独占句柄失败
-#define LOG_WARN_UPLOAD_QUERY_PLAN_ERROR 0x10400002 //查询扫描计划http通讯报错
-#define LOG_WARN_UPLOAD_QUERY_FILE_OVER_LIMIT 0x10400003 //扫描文件文件过大告警
-#define LOG_WARN_UPLOAD_FILE_REPORT 0x10400004 //上传文件统计信息告警
-#define LOG_WARN_UPLOAD_QUERY_PLAN_DATA_ERROR 0x10400005 //查询扫描计划数据效验错误
-
-
-
-#define LOG_WARN_UPLOAD_SCANFILE_LOCK_ERROR 0x10400001 //扫描文件时文件独占句柄失败
 
 #define EVENT_MOD_DOWNLOAD_STARTSYNC			0x10500032		// 开始同步
 #define EVENT_MOD_DOWNLOAD_SYNCHRONIZED			0x10500031		// 完成同步
@@ -480,18 +471,15 @@ ERROR_ACCESSAUTH_CONNECT_ACS_x}
 #define LOG_DEVICECONTROL_SOGOU_SCRIPTS_EXECUTE_FAILED 0x21400009
 #define LOG_DEVICECONTROL_SOGOU_SCRIPTS_EXECUTE_TIMEOUT 0x2140000A
 
+//公有引用
 #define LOG_EVT_HSPS_LIGHT_ON 0x21700002
 #define LOG_EVT_HSPS_LIGHT_OFF 0x21700003
 
 //#define LOG_ERR_DEVICECONTROL_RESTART 0x21480001
 
-#define LOG_ERR_HSPS_DEVOPEN_FAILED 0x21700001
-#define LOG_EVT_HSPS_LIGHT_ON 0x21700002
-#define LOG_EVT_HSPS_LIGHT_OFF 0x21700003
-#define LOG_EVT_HSPS_LOST_CONNECT 0x21700004
 
 
-#define LOG_EVT_HEALTH_FIRST_ENTER_MAINPADE_FROM_HEALTH_START 0x50100003	//健康启动以来首次进首页
+#define LOG_EVT_HEALTH_FIRST_ENTER_MAINPADE_FROM_HEALTH_START 0x50100002	//健康启动以来首次进首页
 #define LOG_WARN_HEALTH_INSTALL_FINISHED 0x50100004		//安装成功的标识
 #define LOG_WARN_HEALTH_INSTALL_RESET 0x50100005		//请求重新安装的标识
 #define LOG_WARN_HEALTH_INSTALL_TIMESTAMP 0x50100006		//上报安装时间标识

+ 8 - 61
Module/mod_CardIssuerStand/CardIssuerFSM.cpp

@@ -19,9 +19,6 @@
 #include <atltime.h>
 #endif //RVC_OS_WIN
 
-char tmpxx[1024];
-char testIC[1024];
-
 #include "CardIssuerClass.h"
 #include "mod_cardissuer.h"
 #include "stdafx.h"
@@ -30,12 +27,6 @@ char testIC[1024];
 //oiltest@20200915 temp for GetTickCount
 #ifdef RVC_OS_WIN
 #define _ATL_NO_AUTOMATIC_NAMESPACE
-#include <winsock2.h>
-#include <Ws2bth.h>
-// Link to Bthprops.lib
-#include <BluetoothAPIs.h>
-#pragma comment (lib, "Ws2_32.lib")
-#pragma comment (lib, "Bthprops.lib")
 #else
 #include<sys/time.h>
 #include <dlfcn.h>
@@ -1149,7 +1140,7 @@ ErrorCodeEnum CCardIssuerFSM::OnInit()
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("create card process failed.");
 		return Error_Resource;
 	}
-	Load();
+	m_csDevSN = "";
 	CSystemStaticInfo sysInfo;
 	//oilyang 20160331
 	//so many function always return Error_Succeed,so is useless to process it.
@@ -1163,7 +1154,8 @@ ErrorCodeEnum CCardIssuerFSM::OnInit()
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("CardIssuer, MachineType:%s, Site:%s, TerminalNo:%s, MachineVersion:%d.%d",
 		m_csMachineType.GetData(), m_csSite.GetData(), m_terminalNo.GetData(), m_majorVerion, m_minorVerion));
 
-	//因替换实体名,需要兼容把以前旧的运行时文件拷贝成新的实体名运行文件
+	//因替换实体名,需要兼容把以前旧的运行时文件拷贝成新的实体名运行文件,卡机分离后,拷贝旧版运行时文件,后期稳定后直接去除
+	//////////////////////////////////////////////////////////////////////////
 	CSimpleStringA runinfoPath(true);
 	CSmartPointer<IConfigInfo> spConfig;
 	ErrorCodeEnum  err = GetEntityBase()->GetFunction()->GetPath("RunInfo", runinfoPath);
@@ -1176,7 +1168,7 @@ ErrorCodeEnum CCardIssuerFSM::OnInit()
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get cfg file failed ");
 		return err;
 	}
-
+	
 	CSimpleStringA runinfoOldFile = runinfoPath + SPLIT_SLASH_STR + "runcfg" + SPLIT_SLASH_STR + "CardIssuer.ini"; 
 	CSimpleStringA runinfoNewFile = runinfoPath + SPLIT_SLASH_STR + "runcfg" + SPLIT_SLASH_STR + "CardIssuerStand.ini";
 
@@ -1251,7 +1243,7 @@ ErrorCodeEnum CCardIssuerFSM::OnInit()
 		}
 	}
 
-
+	//////////////////////////////////////////////////////////////////////////
 	m_devStatus.eMedia = CI_MEDIA_NOTPRESENT;
 	m_bHasHopper[0] = false;
 	m_bHasHopper[1] = false;
@@ -1541,10 +1533,10 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 	long l_beginTime,l_endTime;
 	do {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CreateDevComponent suc. m_port:%d, m_baudRate:%d, pDevSN:%s",
-			m_port, m_baudRate, pDevSN);
+			m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt(), pDevSN);
 
 		l_beginTime = GetTickCountRVC();
-		eErrDev = m_hDevHelper->DevOpenEx(m_port, m_baudRate, btOpenType, pDevSN, m_connectType);
+		eErrDev = m_hDevHelper->DevOpenEx(m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt(), btOpenType, pDevSN, m_connectType);
 		l_endTime = GetTickCountRVC();
 		
 		if (eErrDev == Error_Succeed)
@@ -1571,15 +1563,13 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 			else
 			{
 				SetErrorAndLog(eErrDev, MEC_DEVAPI_CARDISSUER_GetDevCategory, "DevAdapter::GetDevCategory", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
-
-				///*TODO: need to clear adapter object? (80374374@4/4/2023)*/
 				return Error_Unexpect;
 			}
 
 			if (!LoadCMBPrint(csBinPath))
 			{
 				errMsg = CSimpleStringA::Format("CardIssuer启动失败:Load CMBPrint failed.");
-				//LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_LoadLibraryA_CMBPrint_Failed, errMsg.GetData());
+				LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_LoadLibraryA_CMBPrint_Failed, errMsg.GetData());
 				return Error_DevLoadFileFailed;
 			}
 			initTries = 0;
@@ -1662,15 +1652,6 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 		}
 		if (m_hopperNum == 1 && btOpenType == DEV_OPEN_TYPE_COM)//oilyang 如果没有配置,使用原来的配置
 		{
-			//spConfig->ReadConfigValueInt("RunInfo", "CardRemains", m_remainsEx[0]);
-			//spConfig->ReadConfigValueInt("RunInfo", "CardIssued", m_issuedEx[0]);
-			//spConfig->ReadConfigValueInt("RunInfo", "CardCaptured", m_CardCaptured);
-			//spConfig->ReadConfigValueInt("RunInfo", "IsIssue", isIssue);
-			//spConfig->ReadConfigValueInt("RunInfo", "CardMixed", m_mixedEx[0]);
-			//spConfig->ReadConfigValueInt("RunInfo", "CardInit", m_CardInitEx[0]);
-			//spConfig->ReadConfigValueInt("RunInfo", "CardPercent", m_CardPercentEx[0]);
-			//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("use old record, CardRemains:%d, CardIssued:%d, CardCaptured:%d, IsIssue:%d, CardMixed:%d, CardInit:%d",
-			//	m_remainsEx[0], m_issuedEx[0], m_CardCaptured, isIssue, m_mixedEx[0], m_CardInitEx[0]));
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("use new hopper cfg record"));
 		}
 		//oilyang 回写卡机配置
@@ -1753,24 +1734,7 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 		}
 	}
 }
-void CCardIssuerFSM::Load()
-{
-	LOG_FUNCTION();
-	CSmartPointer<IConfigInfo> spConfig;
-	ErrorCodeEnum eErrDev = GetEntityBase()->GetFunction()->OpenConfig(Config_Root, spConfig);
-	if (spConfig == NULL)
-	{
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<Load>, open root.ini failed");
-		return;
-	}
-	spConfig->ReadConfigValueInt("Device.CardIssuer", "Baudrate", m_baudRate);
-	spConfig->ReadConfigValueInt("Device.CardIssuer", "Port", m_port);
 
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("m_baudRate:%d, m_port:%d",
-			m_baudRate, m_port));
-
-	m_csDevSN = "";
-}
 int CCardIssuerFSM::Initial()
 {
 	m_bOpening = true;
@@ -1826,21 +1790,6 @@ int CCardIssuerFSM::UnAcceptCard()
 		default:
 			break;
 		}
-
-		//oilyang@20230612 delete the following lines,as no need to GetDevStatus twice
-		//long l_beginTime, l_endTime;
-		//l_beginTime = GetTickCountRVC();
-		//eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
-		//l_endTime = GetTickCountRVC();
-
-		//if (Error_Succeed != eErr){
-		//	SetErrPackage("UnAcceptCard::SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN)", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SetCardInType);
-		//	AlarmDEC();
-		//} 
-		//if (GetDevStatus())
-		//	return 0;
-		//else
-		//	return 1;
 	}
 	else
 	{
@@ -4171,8 +4120,6 @@ ErrorCodeEnum CCardIssuerFSM::MachineMoveCardFrontGate(bool bInBussiness)
 			SetErrorAndLog(eMoveFrontGate, CardIssuer_UserErrorCode_MoveCardToGate_Failed, "DevAdapter::MoveCard", __FUNCTION__, bInBussiness, l_endTime - l_beginTime, "QLR040220305", "");
 		
 		}
-		//AlarmDEC(bInBussiness);
-			
 	}
 	else {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MoveCard").setCostTime(l_endTime - l_beginTime)("MachineMoveCardFrontGate::MoveCard");

+ 1 - 2
Module/mod_CardIssuerStand/CardIssuerFSM.h

@@ -834,7 +834,6 @@ public:
 	void s14_on_exit();
 	unsigned int s14_on_event(FSMEvent* event);
 	
-	void Load();
 	ErrorCodeEnum OpenDevice(BYTE btOpenType, const char *pDevSN);
 	int Initial();
 	bool GetDevStatus(bool bPrint=true);
@@ -941,7 +940,7 @@ private:
 	//1:default, 2:SCI, 3:no cfg
 	int m_machineType;
 	WORD m_majorVerion, m_minorVerion;
-	int m_port,m_baudRate,m_currentHopper,m_devOpenFailedCount;
+	int m_currentHopper,m_devOpenFailedCount;
 	int m_maxSlot,m_findCard,m_cardPos,m_currentFSMState,m_maxRetainCount, m_eacQueryFlag/*accout query*/
 		,m_ICRetryTimes;
 	CSimpleStringA m_CardBoxNoEx[HOPPER_NUM], m_PsbCodeEx[HOPPER_NUM], m_PsbNameEx[HOPPER_NUM], m_MaintainerEx[HOPPER_NUM],m_csMaintainTimeEx[HOPPER_NUM];

+ 3 - 3
Module/mod_ContactlessCard/ContactlessFSM.cpp

@@ -1111,18 +1111,18 @@ int CContactlessCardFSM::PreOnline(SpReqAnsContext<ContactlessCardService_PreOnl
 			if (!ctx->Req.reserved1.IsNullOrEmpty() && ctx->Req.reserved1.Compare("P") == 0) {
 				SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_RF_ActiveContactlessICCard, "DevAdapter::ActiveContactlessICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
 			}
-			ctx->Answer(Error_Interact, AlarmDEC());
+			ctx->Answer(Error_Interact, GetAlarmDEC());
 		}
 		else if (retDetectAndRead == -2){
 			if (!ctx->Req.reserved1.IsNullOrEmpty() && ctx->Req.reserved1.Compare("P") == 0) {
 				SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_RF_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
 			}
-			ctx->Answer(Error_Interact, AlarmDEC());
+			ctx->Answer(Error_Interact, GetAlarmDEC());
 		}else if (retDetectAndRead == -3){
 			if (!ctx->Req.reserved1.IsNullOrEmpty() && ctx->Req.reserved1.Compare("P") == 0) {
 				SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_RF_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
 			}
-			ctx->Answer(Error_Interact, AlarmDEC());
+			ctx->Answer(Error_Interact, GetAlarmDEC());
 		}
 		return 0;
 	}

+ 2 - 7
Module/mod_DeviceControl/mod_DeviceControl.cpp

@@ -57,6 +57,7 @@ void CDeviceControlServerSession::Handle_QueryUSBStatus(SpReqAnsContext<DeviceCo
 
     m_pEntity->QueryUSBStatus(ctx);
 }
+/** 无交易量  [Gifur@20241210]*/
 void CDeviceControlServerSession::Handle_QueryHardwareInfo(SpReqAnsContext<DeviceControlService_QueryHardwareInfo_Req, DeviceControlService_QueryHardwareInfo_Ans>::Pointer ctx)
 {
     DbgToBeidou(ctx->link, __FUNCTION__)();
@@ -116,8 +117,6 @@ void CDeviceControlEntity::QueryHardwareInfo(SpReqAnsContext<DeviceControlServic
 {
     CSystemStaticInfo info;
     GetFunction()->GetSystemStaticInfo(info);
-    CSimpleStringA deviceFct("");
-
 	CAutoArray<SP::Module::Net::NetworkAdapterItem> netList;
 	SP::Module::Net::GetINETMacAddresses(netList);
 
@@ -128,10 +127,6 @@ void CDeviceControlEntity::QueryHardwareInfo(SpReqAnsContext<DeviceControlServic
 		ipAddrs.Append(&tmpip, 0, 1);
 		macAddrs.Append(&tmpmac, 0, 1);
 	}
-	CSmartPointer<IConfigInfo> spConfig;
-	GetFunction()->OpenConfig(Config_Root, spConfig);
-	spConfig->ReadConfigValue("Device.PinPad", "Vendor", deviceFct);
-
     //获取操作系统版本信息
 #if defined(_MSC_VER)
         //获取windows系统版本
@@ -182,7 +177,7 @@ void CDeviceControlEntity::QueryHardwareInfo(SpReqAnsContext<DeviceControlServic
         ctx->Ans.reserved1 = 0;
 #endif	
         ctx->Ans.reserved3 = sysVer;
-        ctx->Ans.reserved4 = deviceFct;
+        ctx->Ans.reserved4 = "";
 
         ctx->Answer(Error_Succeed);
     }

+ 15 - 87
Module/mod_FingerPrint/FingerPrintFSM.cpp

@@ -292,8 +292,6 @@ unsigned CFingerPrintFSM::s3_on_event(FSMEvent* e)
 	return 0;
 }
 
-
-
 #pragma region entity init
 
 ErrorCodeEnum CFingerPrintFSM::OnInit()
@@ -315,87 +313,31 @@ ErrorCodeEnum CFingerPrintFSM::OnInit()
 
 int CFingerPrintFSM::Initial()
 {
-	CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
 	auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
-
-	BOOL triedFlag = FALSE;
-	if (pEntity->vendorLibInfo.IsNotConfig()) {
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Not config the vendor at root.ini");
-		CSmartPointer<IConfigInfo> spConfig;
-		ErrorCodeEnum errDev = spEntityFunction->OpenConfig(Config_Root, spConfig);
-		if (errDev != Error_Succeed)
-		{
-			SetErrPackage("Initial::OpenConfig", m_csDevSN, errDev, FingerPrint_UserErrorCode_OPEN_ROOT_FAILED_ONINIT);
-			AlarmDEC();
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(FingerPrint_Open_ID).setResultCode("RTA2402")("指纹仪实体初始化时,打开root.ini文件失败");
-			return 2;
-		}
-		CSimpleStringA strVendor(true);
-		CSimpleStringA strVersion(true);
-		CSimpleStringA strBatch(true);
-		spConfig->ReadConfigValue("Device.PinPad", "Vendor", strVendor);
-		spConfig->ReadConfigValue("Device.PinPad", "Version", strVersion);
-		spConfig->ReadConfigValue("Device.PinPad", "Batch", strBatch);
-		if (strVendor.IsNullOrEmpty() || strVersion.IsNullOrEmpty() || strBatch.IsNullOrEmpty()) {
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Some related node is not set, cannot continue.");
-		}
-		else {
-			strBatch = "1";
-			if (!strVendor.Compare("Hyosung", true)) {
-				strVersion = "1";
-			}
-			else {
-				if (!m_csMachineType.Compare("RVC.Stand2S", true)) {
-					strVersion = "7";
-					//TODO: Support new or old edition machine.
-				}
-				else if (!m_csMachineType.Compare("RVC.CardStore", true)) {
-					strVersion = "5";
-				}
-				else { //TODO:new machine
-					strVersion = "1";
-				}
-			}
-			VendorLibInfo tmpVendorLibInfo(GetEntityBase()->GetEntityName());
-			tmpVendorLibInfo.strVendor = strVendor;
-			tmpVendorLibInfo.strVersion = strVersion;
-			tmpVendorLibInfo.strBatch = strBatch;
-			LogWarn(Severity_Low, Error_Debug, FingerPrint_UserErrorCode_Compact_RootIni, tmpVendorLibInfo.toLibNameString());
-
-			pEntity->vendorLibInfo = tmpVendorLibInfo;
-			triedFlag = !tmpVendorLibInfo.IsNotConfig();
-		}
-	}
-	FulfillAdapterInfoFrom(pEntity->vendorLibInfo);
-	LogWarn(Severity_Low, Error_Unexpect, FingerPrint_UserErrorCode_ROOT_INFO, m_adapterInfo.adapterFilePath.GetData());
 	m_bOpened = false;
 	if (pEntity->vendorLibInfo.IsNotConfig()) {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Not config, Allow this condition happend.");
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("没有配置,将其视为指纹仪设备打开成功");
 		return 0;
 	}
+	FulfillAdapterInfoFrom(pEntity->vendorLibInfo);
+	LogWarn(Severity_Low, Error_Unexpect, FingerPrint_UserErrorCode_ROOT_INFO, m_adapterInfo.adapterFilePath.GetData());
 	pEntity->InitializeVendorLogSwitch();
 	ErrorCodeEnum err = LoadUpAdapterLibrary();
 	if (!IS_SUCCEED(err))
 	{
 		if (err != Error_NotExist) { //文件存在,只是因为其他原因导致加载失败的
+			//2024-12-10:4275780002, 1225300001 两台终端存在该情况
 			LogWarn(Severity_High, Error_NotInit, FingerPrint_UserErrorCode_LOAD_ADAPTER_FAILED,
 				CSimpleStringA::Format("Load library file: %s failed, GLE=%d", (LPCTSTR)m_adapterInfo.adapterFileName, GetLastError()));
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(FingerPrint_Open_ID).setResultCode("RTA2405")("加载厂商适配器失败");
 			return 2;
 		}
 		else {
-			if (!triedFlag) {//是在root.ini进行配置的,而不是程序推断的
-				LogWarn(Severity_High, Error_DevLoadFileFailed, FingerPrint_UserErrorCode_VENDOR_ADAPTER_NOT_EXIST,
-					CSimpleStringA::Format("library file: %s is not existed!", (LPCTSTR)m_adapterInfo.adapterFileName));
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(FingerPrint_Open_ID).setResultCode("RTA2404")("厂商适配器不存在dep中");
-				return 2;
-			}
-			else {//程序推断出来的适配器名称,但本地不存在该文件,放弃吧
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Config programme,  Allow this condition happend.");
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("动态配置,没有该文件,放弃之");
-				return 0;
-			}
+			//2024年12月10日:7555870003 5715350008 两台终端存在该情况
+			LogWarn(Severity_High, Error_DevLoadFileFailed, FingerPrint_UserErrorCode_VENDOR_ADAPTER_NOT_EXIST,
+				CSimpleStringA::Format("library file: %s is not existed!", (LPCTSTR)m_adapterInfo.adapterFileName));
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(FingerPrint_Open_ID).setResultCode("RTA2404")("厂商适配器不存在dep中");
+			return 2;
 		}
 
 	}
@@ -436,10 +378,8 @@ int CFingerPrintFSM::Initial()
 	else {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevCategory").setCostTime(l_endTime - l_beginTime)("Initial::GetDevCategory");
 	}
-
 	m_adapterInfo.FulfillCategoryInfo(m_devCatInfo);
 	m_bOpened = true;
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("FingerPrint entity open success.");
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("指纹仪设备打开成功");
 	return 0;
 }
@@ -450,23 +390,13 @@ int CFingerPrintFSM::Initial()
 
 ErrorCodeEnum CFingerPrintFSM::OnExit()
 {
-	CSimpleStringA tmpDevSN("");
-	GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpDevSN);
-	if (tmpDevSN.GetLength() > 12 && tmpDevSN.IndexOf("FWB") > 2)
-	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("This is fwb device, DevSN:%s", tmpDevSN.GetData());
-		return Error_Succeed;
-	}
-	else
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("This is normal device.");
+	if (m_hDevHelper != nullptr)
 	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("This is normal device.");
-		if (m_hDevHelper != nullptr)
-		{
-			m_hDevHelper.TearDown();
-			m_bOpened = false;
-		}
-		return Error_Succeed;
+		m_hDevHelper.TearDown();
+		m_bOpened = false;
 	}
+	return Error_Succeed;
 }
 
 #pragma endregion
@@ -535,8 +465,7 @@ int CFingerPrintFSM::GetFingerPrint(SpReqAnsContext<FingerPrintService_GetFinger
 		delete[] lpbFeature;
 		lpbFeature = NULL;
 		
-		SetErrPackage("GetFingerPrint::GetPath", m_csDevSN, eErr, FingerPrint_UserErrorCode_GET_DEP_PATH_FAILED_REGISTER);
-		AlarmDEC();
+		LogWarn(Severity_Middle, Error_Unexpect, FingerPrint_UserErrorCode_GET_DEP_PATH_FAILED_REGISTER, "GetFingerPrint::GetPath is fail");
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(FingerPrint_Scan_ID).setResultCode("RTA2410")("指纹扫描失败,获取dep路径失败");
 		ctx->Answer(Error_Param);
 		return 0;
@@ -828,8 +757,7 @@ int CFingerPrintFSM::GenerateTemplate(SpReqAnsContext<FingerPrintService_Generat
 		ctx->Answer(Error_Succeed);
 	}
 	else {
-		SetErrPackage("generate template failed", m_csDevSN, Error_Unexpect, FingerPrint_UserErrorCode_GETTEMPLATE_FAILED);
-		AlarmDEC();
+		LogWarn(Severity_Middle, Error_Unexpect, FingerPrint_UserErrorCode_GETTEMPLATE_FAILED, "generate template failed");
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setResultCode("RTA2419")("指纹仪模板生成失败");
 		ctx->Answer(errCode, FingerPrint_UserErrorCode_GETTEMPLATE_FAILED);
 	}

+ 0 - 2
Module/mod_FingerPrint/FingerPrint_UserErrorCode.h

@@ -50,7 +50,5 @@
 #define FingerPrint_UserErrorCode_Real_Root_Config						( FingerPrint_UserErrorCode_Start + 41 )	//实际加载的root配置
 
 #define FingerPrint_UserErrorCode_FindFile_in_DepBak					( FingerPrint_UserErrorCode_Start + 50 )	//在旧Dep路径下找到文件
-#define FingerPrint_UserErrorCode_Compact_RootIni					( FingerPrint_UserErrorCode_Start + 51 )	//本地未做硬件配置,实体做兼容
-
 
 #endif

+ 1 - 1
Module/mod_HSPScanner/HSPSCanner_UserErrorCode.h

@@ -19,7 +19,7 @@
 
 #define HSPScanner_UserErrorCode_Start							0x21700200
 #define HSPScanner_UserErrorCode_READ_IMAGE_FILE_FAILED			0x21700201
-#define HSPScanner_UserErrorCode_CREATE_OBJECT_FAILED			0x21700202
+#define HSPScanner_UserErrorCode_LOAD_DLLFILE_NOTEIXT			0x21700202
 #define HSPScanner_UserErrorCode_LOAD_DLLFILE_FAILED			0x21700203
 #define HSPScanner_UserErrorCode_GET_CDC_ADDR_FAILED			0x21700204
 #define HSPScanner_UserErrorCode_GET_RDC_ADDR_FAILED			0x21700205

+ 15 - 9
Module/mod_HSPScanner/HSPScannerFSM.cpp

@@ -129,7 +129,7 @@ LPCTSTR CHSPScannerFSM::MapCode2RTAString(DWORD dwValue)
 	case HSPScanner_UserErrorCode_READ_IMAGE_FILE_FAILED:
 		return "RTA2N0D";
 		break;
-	case HSPScanner_UserErrorCode_CREATE_OBJECT_FAILED:
+	case HSPScanner_UserErrorCode_LOAD_DLLFILE_NOTEIXT:
 		return "RTA2N0E";
 		break;
 	case HSPScanner_UserErrorCode_LOAD_DLLFILE_FAILED:
@@ -246,6 +246,12 @@ ErrorCodeEnum CHSPScannerFSM::OnInit()
 			return erroCode;
 		}
 	}
+	else if (erroCode == Error_NotExist) {
+		SetLastUserCode(HSPScanner_UserErrorCode_LOAD_DLLFILE_NOTEIXT);
+	}
+	else {
+		SetLastUserCode(HSPScanner_UserErrorCode_LOAD_DLLFILE_FAILED);
+	}
 
 FAIL:
 	m_bOpened = false;
@@ -714,7 +720,7 @@ unsigned int CHSPScannerFSM::s3_on_event(FSMEvent* e)
 			ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
 			if (FAILURED(erroCode)) {
 				//RTA2N0B
-				SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_Reset, "DevAdapter::Reset", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
+				SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_Reset, "DevAdapter::Reset", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
 				m_ecSelfTest = Error_InvalidState;
 				uRet = 1;
 			} else {
@@ -724,7 +730,7 @@ unsigned int CHSPScannerFSM::s3_on_event(FSMEvent* e)
 				ullEnd = SP::Module::Comm::RVCGetTickCount();
 				if (FAILURED(eXYW)) {
 					//RTA2N07
-					SetErrorAndLog(eXYW, MEC_DEVAPI_HSPSCANNER_SetViewPos, "DevAdapter::SetViewPos", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
+					SetErrorAndLog(eXYW, MEC_DEVAPI_HSPSCANNER_SetViewPos, "DevAdapter::SetViewPos", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
 					uRet = 1;
 					m_ecSelfTest = Error_InvalidState;
 					e->SetHandled();
@@ -741,7 +747,7 @@ unsigned int CHSPScannerFSM::s3_on_event(FSMEvent* e)
 					if (erroCode == Error_Succeed) {
 						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevStatus").setCostTime(ullEnd - ullStart)("{\"connected\": %d, \"previewing\": %d, \"showing\": %d}", status.isConnected, status.inPreview, status.inShow);
 					} else {
-						SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
+						SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
 					}
 				} while (false);
 				if (status.inPreview == 1 && status.inShow == 1) {
@@ -755,7 +761,7 @@ unsigned int CHSPScannerFSM::s3_on_event(FSMEvent* e)
 								DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::CancelPreview").setCostTime(ullEnd - ullStart)();
 							} else {
 								//RTA2N04
-								SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Close, "DevAdapter::CancelPreview", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
+								SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetPreview_Close, "DevAdapter::CancelPreview", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
 							}
 						} while (false);
 						{
@@ -769,7 +775,7 @@ unsigned int CHSPScannerFSM::s3_on_event(FSMEvent* e)
 									DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevStatus").setCostTime(ullEnd - ullStart)("preview:%d, show:%d, connect:%d", status.inPreview, status.inShow, status.isConnected);
 								} else {
 									//
-									SetErrorAndLog(tmpErr, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
+									SetErrorAndLog(tmpErr, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset);
 								}
 							} while (false);
 							if (retryStatus.inPreview == 1) {
@@ -782,7 +788,7 @@ unsigned int CHSPScannerFSM::s3_on_event(FSMEvent* e)
 										DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_MODEL_VIEW, HSPS_VIEW_HIDE");
 									} else {
 										//RTA2N0Q
-										SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset, CombineJsonContext("HSPS_VIEW_HIDE"));
+										SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset, CombineJsonContext("HSPS_VIEW_HIDE"));
 									}
 								} while (false);
 							}
@@ -797,7 +803,7 @@ unsigned int CHSPScannerFSM::s3_on_event(FSMEvent* e)
 								DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(ullEnd - ullStart)("HSPS_VIEW_HIDE");
 							} else {
 								//RTA2N0Q
-								SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset, CombineJsonContext("HSPS_VIEW_HIDE"));
+								SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_SetParam, "DevAdapter::SetParam", __FUNCTION__, false, ullEnd - ullStart, HSPScannerService_CustomLogCode_Reset, CombineJsonContext("HSPS_VIEW_HIDE"));
 							}
 						} while (false);
 					}
@@ -1172,7 +1178,7 @@ void CHSPScannerFSM::s7_on_exit()
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevStatus").setCostTime(ullEnd - ullStart)("{\"connected\": %d, \"previewing\": %d, \"showing\": %d}", status.isConnected, status.inPreview, status.inShow);
 		} else {
 			//RTA2N09
-			SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, IsInBusiness(), ullEnd - ullStart);
+			SetErrorAndLog(erroCode, MEC_DEVAPI_HSPSCANNER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, ullEnd - ullStart);
 		}
 		/** nothing to do now, plan to remove it? Gifur@2024220]*/
 	}

+ 1 - 7
Module/mod_HSPScanner/mod_HSPScanner.h

@@ -78,6 +78,7 @@ public:
 		CSmartPointer<ITransactionContext> pTransactionContext) 
 	{
 		ErrorCodeEnum erroCode = m_fsm.Init(this);
+		GetFunction()->RegistSysVarEvent("UIState", this);
 		pTransactionContext->SendAnswer(erroCode);
 	}
 
@@ -89,13 +90,6 @@ public:
 	virtual void OnPrePause(CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		ErrorCodeEnum ec = Error_Succeed;
-#ifdef TWINKLE_LOCAL_DEBUG
-		int ret = m_fsm.UnitTest("");
-		if(ret != 0) {
-			LogError(Severity_High, Error_Unexpect, ret, CSimpleStringA::Format("line: %d", ret));
-		}
-		ec = (ErrorCodeEnum)(ret);
-#endif //TWINKLE_LOCAL_DEBUG
 		pTransactionContext->SendAnswer(ec);
 	}
 	virtual void OnPreContinue(CSmartPointer<ITransactionContext> pTransactionContext)

+ 21 - 13
Module/mod_IDCertificate/IDCertFSM.cpp

@@ -662,7 +662,7 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 
 					DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER)
 						.setAPI("DevAdapter::IDCerGetDataEx2").setCostTime(m_ullEndTime - m_ullBeginTime)
-						.setLogCode("QLR040220106")("read succeed(sp2 scan).");
+						.setLogCode(IDCertService_LogCode_ReadAndScanUTF8)("read succeed(sp2 scan).");
 					bReadSuccess = true;
 					LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_OP, "IDCertifacate op.");
 
@@ -1034,10 +1034,9 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 
 				SetErrorAndLog(errReadEx2, MEC_DEVAPI_IDCER_IDCerGetDataEx2, "DevAdapter::IDCerGetDataEx2", __FUNCTION__,
 					true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invoke IDCerGetDataEx2(Timeout) failed: %s", SpStrError(errReadEx2));
 
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Invoke IDCerGetDataEx2(Timeout) failed: %s", SpStrError(errReadEx2));
-
-				ctx->Answer(Error_Unexpect, MEC_DEVAPI_IDCER_IDCerGetDataEx2);
+				ctx->Answer(Error_Unexpect, GetAlarmDEC()); //RTA2109
 			}
 		}
 		else if (!bOpenRF)
@@ -1046,20 +1045,29 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 				true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Open IDCerRFControl(Timeout) failed: %s", SpStrError(errRfOpen));
 
-			ctx->Answer(Error_Unexpect, MEC_DEVAPI_IDCER_IDCerRFControl);
+			ctx->Answer(Error_Unexpect, GetAlarmDEC());
 		}
 		else
 		{
-			SetErrorAndLog(errAuth, MEC_DEVAPI_IDCER_IDCerAuthenticate, "DevAdapter::IDCerAuthenticate", __FUNCTION__,
-				false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8); //RTA2107
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ReadAndScanUTF8::IDCerAuthenticate(Timeout) failed with errcode: %d", errAuth);
 
-			ctx->Answer(Error_Unexpect, MEC_DEVAPI_IDCER_IDCerAuthenticate);
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ReadAndScanUTF8::IDCerAuthenticate(Timeout) failed with errcode: %d", errAuth);
+			if (errAuth == Error_DevMedia)
+			{
+				SetErrorAndLog(errAuth, MEC_DEVAPI_IDCER_IDCerAuthenticate_NotIDCard, "DevAdapter::IDCerAuthenticate", __FUNCTION__,
+					false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8); //RTA2108
+				ctx->Answer(Error_Unexpect, GetAlarmDEC());
+			}
+			else
+			{
+				SetErrorAndLog(errAuth, MEC_DEVAPI_IDCER_IDCerAuthenticate, "DevAdapter::IDCerAuthenticate", __FUNCTION__,
+					false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8); //RTA2107
+				ctx->Answer(Error_Unexpect, GetAlarmDEC());
+			}
 		}
 	}
 	else 
 	{
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI("DevAdapter::IDCerGetDataEx2").setLogCode("QLR040220106").setResultCode("RTA2104");
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI("DevAdapter::IDCerGetDataEx2").setLogCode(IDCertService_LogCode_ReadAndScanUTF8).setResultCode("RTA2104")("ReadAndScanUTF8 some thing wrong.");
 		ctx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Failed);
 		LogError(Severity_High, Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Failed, "ReadAndScanUTF8 some thing wrong.");
 	}
@@ -1216,7 +1224,7 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 
 					DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER)
 						.setAPI("DevAdapter::IDCerGetDataEx2").setCostTime(m_ullEndTime - m_ullBeginTime)
-						.setLogCode("QLR040220106")("read succeed(sp2 scan).");
+						.setLogCode(IDCertService_LogCode_ReadAndScanUTF8JS)("read succeed(sp2 scan).");
 					bReadSuccess = true;
 					LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_OP, "IDCertifacate op.");
 
@@ -1600,7 +1608,7 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 
 				SetErrorAndLog(errReadEx2, MEC_DEVAPI_IDCER_IDCerGetDataEx2, "DevAdapter::IDCerGetDataEx2", __FUNCTION__,
 					true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invoke IDCerGetDataEx2(Timeout) failed: %s", SpStrError(eErr));
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invoke IDCerGetDataEx2(Timeout) failed: %s", SpStrError(errReadEx2));
 
 				ctx->Answer(Error_Unexpect, GetAlarmDEC()); //RTA2109
 			}
@@ -1608,7 +1616,7 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 		else if (!bOpenRF)
 		{
 			SetErrorAndLog(errRfOpen, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::OpenIDCerRFControl", __FUNCTION__,
-				true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
+				true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Open IDCerRFControl(Timeout) failed: %s", SpStrError(errRfOpen));
 
 			ctx->Answer(Error_Unexpect, GetAlarmDEC());

+ 243 - 157
Module/mod_ResourceWatcher/ResourceWatcherFSM.cpp

@@ -133,24 +133,28 @@ typedef struct _RawSMBIOSData
 
 void ResourceWatcherFSM::GetAutoStartFile(std::string& userDirPath, std::vector<std::string>& userDirFiles, std::string& pubDirPath, std::vector<std::string>& pubDirFiles)
 {
-	CSimpleStringA startMenuPublicPath(STARTUP_DIR_FULL_PATH);
-	auto arr = fileutil_get_sub_files(startMenuPublicPath);
-	pubDirPath = startMenuPublicPath.GetData();
-	if (arr != NULL) {
-		for (int i = 0; i < arr->nelts; ++i) {
-			char* file = ARRAY_IDX(arr, i, char*);
-			char* filename = strrchr(file, '\\');
-			if (filename != NULL) { filename += 1; }
-			else { filename = file; }
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("filename:%s", filename);
-			pubDirFiles.push_back(std::string(filename));
+	CSimpleStringA startMenuPublicPath(true);
+    GetCommStartupDirectory(startMenuPublicPath);
+    if (!startMenuPublicPath.IsNullOrEmpty()) {
+		auto arr = fileutil_get_sub_files(startMenuPublicPath);
+		pubDirPath = startMenuPublicPath.GetData();
+		if (arr != NULL) {
+			for (int i = 0; i < arr->nelts; ++i) {
+				char* file = ARRAY_IDX(arr, i, char*);
+				char* filename = strrchr(file, '\\');
+				if (filename != NULL) { filename += 1; }
+				else { filename = file; }
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("filename:%s", filename);
+				pubDirFiles.push_back(std::string(filename));
+			}
+			toolkit_array_free2(arr);
 		}
-		toolkit_array_free2(arr);
-	}
+    }
+
     CSimpleStringA startMenuFullPath(true);
     GetUserStartupDirectory(startMenuFullPath);
 	if (!startMenuFullPath.IsNullOrEmpty()) {
-		arr = fileutil_get_sub_files(startMenuFullPath);
+        auto arr = fileutil_get_sub_files(startMenuFullPath);
 		userDirPath = startMenuFullPath.GetData();
 		if (arr != NULL) {
 			for (int i = 0; i < arr->nelts; ++i) {
@@ -399,13 +403,9 @@ void ResourceWatcherFSM::TriggerAtStatusChanged(bool bMStatus)
                 RecoverDDEClipboardEnable();
             }
             GetEntityBase()->GetFunction()->PostThreadPoolTask(new DetectSoftwareInstallStatusTask(this));
-            GetEntityBase()->GetFunction()->PostThreadPoolTask(new UploadMonitorInfoTask(this));
-            AlarmSystemBasicInfo();
-#else
-			AlarmSystemBasicInfo();
 #endif //RVC_OS_LINUX
+            AlarmSystemBasicInfo();
         }
-
     }
 }
 
@@ -1526,7 +1526,7 @@ ErrorCodeEnum ResourceWatcherFSM::CreateLinkFile(const CSimpleStringA& szStartAp
 					{
 						hr = pShellLink->SetIconLocation(szIconPath, 0);
                         if (!SUCCEEDED(hr)) {
-							DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SetIconLocation failed: %d", hr);
+							DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SetIconLocation failed: %u", hr);
                         }
 					}
 					IPersistFile* pPersistFile;
@@ -1539,25 +1539,25 @@ ErrorCodeEnum ResourceWatcherFSM::CreateLinkFile(const CSimpleStringA& szStartAp
                             result = Error_Succeed;
 						}
 						else {
-							DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Save failed: %d", hr);
+							DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Save failed: %u", hr);
 						}
 						pPersistFile->Release();
 					}
 					else {
-						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("QueryInterface failed: %d", hr);
+						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("QueryInterface failed: %u", hr);
 					}
 				}
 				else {
-					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SetWorkingDirectory failed: %d", hr);
+					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SetWorkingDirectory failed: %u", hr);
 				}
             }
             else {
-                DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SetPath failed: %d", hr);
+                DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SetPath failed: %u", hr);
             }
             pShellLink->Release();
         }
         else {
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CoCreateInstance failed: %d", hr);
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CoCreateInstance failed: %u", hr);
         }
         CoUninitialize();
     }
@@ -1743,15 +1743,6 @@ void ResourceWatcherFSM::DetectAutoStartupCover()
 			}
         }
         break;
-	case 5: //设置使用EXE注册表自启动(涵盖所有类型)
-		if (nStartupType == 1 || nStartupType == 0 || nStartupType == 3 || nStartupType == 4 || nStartupType == 5) {
-			rc = ChangeAutoStartupWithExe();
-			if (rc == Error_Succeed && (nStartupType == 3 || nStartupType == 4 || nStartupType == 5)) {
-				toDeleteAutoStartFile = true;
-                //这里不做清理,因为以前也没有问题
-			}
-		}
-		break;
     case 3: //不设置开机自启动
 		if (nStartupType == 1 || nStartupType == 2) {
 			rc = ChangeAutoStartupWithExe(false, true);
@@ -1766,10 +1757,19 @@ void ResourceWatcherFSM::DetectAutoStartupCover()
 			rc = ChangeAutoStartupWithExe(true);
 		}
         break;
+	case 5: //设置使用EXE注册表自启动(涵盖所有类型)
+		if (nStartupType == 1 || nStartupType == 0 || nStartupType == 3 || nStartupType == 4 || nStartupType == 5) {
+			rc = ChangeAutoStartupWithExe();
+			if (rc == Error_Succeed && (nStartupType == 3 || nStartupType == 4 || nStartupType == 5)) {
+				toDeleteAutoStartFile = true;
+				//这里不做清理,因为以前也没有问题
+			}
+		}
+		break;
 	case 6: //设置为开机后开始菜单自启动(涵盖所有类型)
     {
         CSimpleStringA exePath(true);
-        if (nStartupType == 1 || nStartupType == 2 || nStartupType == 3 || nStartupType == 5) {
+        if (nStartupType == 1 || nStartupType == 2 || nStartupType == 3 || nStartupType == 5 || nStartupType == 0) {
             CSimpleStringA strNoUse(true);
             if (!m_skipDesktopDetect && !IsDesktopIconExist(strNoUse)) {
 				LogWarn(Severity_Low, Error_InvalidState, LOG_WARN_CREATE_EXELINK_FROMAUTOSTART_ABORT,
@@ -1781,7 +1781,7 @@ void ResourceWatcherFSM::DetectAutoStartupCover()
 					//TODO: 如果出现修改注册表成功但是设置自启动图标失败的情况  [Gifur@202492]
 					rc = ChangeAutoStartupWithExe(false, true);
 				}
-				else if (nStartupType == 3 || nStartupType == 5) {
+				else if (nStartupType == 3 || nStartupType == 5 || nStartupType == 0) {
                     rc = Error_Succeed;
 				}
 				if (rc == Error_Succeed) {
@@ -1794,7 +1794,7 @@ void ResourceWatcherFSM::DetectAutoStartupCover()
 						LogWarn(Severity_Low, Error_Debug, LOG_WARN_CREATE_EXELINK_FROMAUTOSTART_SUCC,
 							CSimpleStringA::Format("Create autostart lnk succ, old start type: %d", nStartupType));
                         if ((nStartupType == 3 || nStartupType == 5)) { toDeleteAutoStartFile = true; }
-						DeleteDuplicateAutoStartFile(true);
+						if(nStartupType != 0) DeleteDuplicateAutoStartFile(true);
 					}
 				}
 			}
@@ -1804,7 +1804,7 @@ void ResourceWatcherFSM::DetectAutoStartupCover()
 			}
         }
     }
-        break;
+    break;
 	case 7: //设置为开机后开始菜单自启动(针对仅有桌面开机自启动的)
 	{
 		CSimpleStringA exePath(true);
@@ -2293,17 +2293,22 @@ void ResourceWatcherFSM::DetectVersionHasChangedAndWarn()
 
 void ResourceWatcherFSM::DetectDestopFileAndWarn(bool bClear, CSimpleStringA& strFileSaveList)
 {
-    if (!m_strLoginedUserName.IsNullOrEmpty()) {
-		CSimpleStringA filelist(true);
-		int dirCount(0), fileCount(0);
-        CSimpleStringA desktopFullPath = CSimpleStringA::Format("C:\\Users\\%s\\Desktop", m_strLoginedUserName.GetData());
-        CSimpleStringA desktopPublicPath("C:\\Users\\Public\\Desktop");
-        CAutoArray<CSimpleStringA> desktopPaths;
-        desktopPaths.Init(2);
-        desktopPaths[0] = desktopFullPath;
-        desktopPaths[1] = desktopPublicPath;
-        for (int k = 0; k < desktopPaths.GetCount(); ++k) {
-            CSimpleStringA& curPath = desktopPaths[k];
+	CSimpleStringA filelist(true);
+	int dirCount(0), fileCount(0);
+	CSimpleStringA desktopFullPath(true);
+	CSimpleStringA desktopPublicPath(true);
+    GetUserDesktopDirectory(desktopFullPath);
+    GetCommDesktopDirectory(desktopPublicPath);
+    if (desktopFullPath.IsNullOrEmpty() || desktopPublicPath.IsNullOrEmpty()) {
+        DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get desktop directory path failed: pub:%d,user:%d", desktopPublicPath.GetLength(), desktopFullPath.GetLength());
+    }
+    else {
+		CAutoArray<CSimpleStringA> desktopPaths;
+		desktopPaths.Init(2);
+		desktopPaths[0] = desktopFullPath;
+		desktopPaths[1] = desktopPublicPath;
+		for (int k = 0; k < desktopPaths.GetCount(); ++k) {
+			CSimpleStringA& curPath = desktopPaths[k];
 			auto arr = fileutil_get_sub_files(curPath);
 			if (arr != NULL) {
 				for (int i = 0; i < arr->nelts; ++i) {
@@ -2311,8 +2316,8 @@ void ResourceWatcherFSM::DetectDestopFileAndWarn(bool bClear, CSimpleStringA& st
 					char* filename = strrchr(file, '\\');
 					if (filename != NULL) { filename += 1; }
 					else { filename = file; }
-                    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("filename:%s", filename);
-                    bool toRecord = true;
+					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("filename:%s", filename);
+					bool toRecord = true;
 					if (bClear) {
 						std::string strLowFileName = SP::Utility::ToLower(std::string(filename));
 						if (strFileSaveList.IsNullOrEmpty() || strFileSaveList.IndexOf(strLowFileName.c_str()) == -1) {
@@ -2326,13 +2331,13 @@ void ResourceWatcherFSM::DetectDestopFileAndWarn(bool bClear, CSimpleStringA& st
 							DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("skip to delete: %s", filename);
 						}
 					}
-                    if (toRecord) {
+					if (toRecord) {
 						fileCount++;
 						if (!filelist.IsNullOrEmpty()) {
 							filelist += "|";
 						}
 						filelist += filename;
-                    }
+					}
 				}
 				if (arr->nelts > 0) {
 					filelist += ";";
@@ -2347,8 +2352,8 @@ void ResourceWatcherFSM::DetectDestopFileAndWarn(bool bClear, CSimpleStringA& st
 					char* dirname = strrchr(dir, '\\');
 					if (dirname != NULL) { dirname += 1; }
 					else { dirname = dir; }
-                    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("dir name:%s", dirname);
-                    bool toRecord = true;
+					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("dir name:%s", dirname);
+					bool toRecord = true;
 					if (bClear) {
 						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("remove desktop dir:%s", dirname);
 						RemoveDirRecursiveA(dir);
@@ -2356,23 +2361,23 @@ void ResourceWatcherFSM::DetectDestopFileAndWarn(bool bClear, CSimpleStringA& st
 							toRecord = false;
 						}
 					}
-                    if (toRecord) {
-                        dirCount++;
+					if (toRecord) {
+						dirCount++;
 						if (!filelist.IsNullOrEmpty() && i != 0) {
 							filelist += "|";
 						}
 						filelist += dirname;
-                    }
+					}
 				}
 				if (arr->nelts > 0) {
 					filelist += ";";
 				}
 				toolkit_array_free2(arr);
 			}
-        }
-        LogWarn(Severity_Low, Error_Debug, LOG_INFO_DESKTOP_FILESTATUS
-            ,CSimpleStringA::Format("{\"subject\":\"desktop_file\",\"clear_flag\":\"%d\",\"username\":\"%s\",\"file_count\":%d,\"dir_count\":%d,\"content\":\"%s\"}"
-				, bClear ? 1 : 0, m_strLoginedUserName.GetData(), fileCount, dirCount, filelist.GetLength() < 950 ? filelist.GetData() : (filelist.SubString(0, 950) + "....").GetData()));
+		}
+		LogWarn(Severity_Low, Error_Debug, LOG_INFO_DESKTOP_FILESTATUS
+			, CSimpleStringA::Format("{\"subject\":\"desktop_file\",\"clear_flag\":\"%d\",\"desktop\":\"%s\",\"file_count\":%d,\"dir_count\":%d,\"content\":\"%s\"}"
+				, bClear ? 1 : 0, desktopFullPath.GetData(), fileCount, dirCount, filelist.GetLength() < 950 ? filelist.GetData() : (filelist.SubString(0, 950) + "....").GetData()));
     }
 }
 
@@ -2585,6 +2590,67 @@ void ResourceWatcherFSM::DetectAutoStartFileAndWarn()
         DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to delete duplicate auto start file.");
         DeleteDuplicateAutoStartFile();
     }
+    //////////////////////////////////////////////////////////////////////////
+
+    struct fileStruc {
+        std::string username;
+        std::vector<std::string> filenames;
+        //JSONCONVERT2OBJECT_MEMEBER_REGISTER(username, filenames)
+    };
+
+    struct fileVec
+    {
+        std::vector<fileStruc> startupfiles;
+        //JSONCONVERT2OBJECT_MEMEBER_REGISTER(startupfiles)
+    } curStartupFileInfo, keyStartFileInfo;
+
+	CSimpleStringA desktopParentPath = "C:\\Users";
+	auto arr = fileutil_get_sub_dirs(desktopParentPath);
+	if (arr != NULL) {
+		for (int i = 0; i < arr->nelts; ++i) {
+			char* dir = ARRAY_IDX(arr, i, char*);
+			char* dirname = strrchr(dir, '\\');
+			if (dirname != NULL) { dirname += 1; }
+			else { dirname = dir; }
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("dir name:%s", dirname);
+            fileStruc curset;
+			fileStruc keyset;
+            curset.username = keyset.username = dirname;
+            ToListCurrentUserStartupFile(dir, curset.filenames, keyset.filenames);
+            curStartupFileInfo.startupfiles.push_back(curset);
+            keyStartFileInfo.startupfiles.push_back(keyset);
+		}
+		toolkit_array_free2(arr);
+	}
+    std::string curset_str(""), keyset_str("");
+    for (auto it = curStartupFileInfo.startupfiles.begin(); it != curStartupFileInfo.startupfiles.end(); ++it) {
+        if (!curset_str.empty()) curset_str += ";";
+        curset_str += it->username;
+        curset_str += ":";
+        std::string content("");
+        for (auto ik = it->filenames.begin(); ik != it->filenames.end(); ik++) {
+            if (!content.empty()) content += "|";
+            content += ik->c_str();
+        }
+        curset_str += content;
+    }
+
+	for (auto it = keyStartFileInfo.startupfiles.begin(); it != keyStartFileInfo.startupfiles.end(); ++it) {
+		if (!keyset_str.empty()) keyset_str += ";";
+        keyset_str += it->username;
+        keyset_str += ":";
+		std::string content("");
+		for (auto ik = it->filenames.begin(); ik != it->filenames.end(); ik++) {
+			if (!content.empty()) content += "|";
+			content += ik->c_str();
+		}
+        keyset_str += content;
+	}
+
+    //Object2Json(curset_str, curStartupFileInfo);
+	//Object2Json(keyset_str, keyStartFileInfo);
+    LogWarn(Severity_Low, Error_Debug, LOG_RESOURCEWATCHER_DEBUG_STARTUPFILES, curset_str.c_str());
+	LogWarn(Severity_Low, Error_Debug, LOG_RESOURCEWATCHER_DEBUG_KEY_STARTUPFILES, keyset_str.c_str());
 }
 
 ErrorCodeEnum ResourceWatcherFSM::DetectVTMInstalledBySetup(BOOL& fYes)
@@ -4116,6 +4182,7 @@ void ResourceWatcherFSM::InitUserInfo()
     if (m_bFirstRunAfterBoot) {
 		LPITEMIDLIST lp;
 		CHAR lstr[MAX_PATH] = "";
+        //CSIDL_COMMON_STARTUP: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
 		HRESULT hr = SHGetSpecialFolderLocation(0, CSIDL_COMMON_STARTUP, &lp);
 		if (SUCCEEDED(hr)) {
 			memset(lstr, 0, strlen(lstr));
@@ -4123,6 +4190,14 @@ void ResourceWatcherFSM::InitUserInfo()
 			CSimpleStringA s = lstr;
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CSIDL_COMMON_STARTUP: %s", s.GetData());
 		}
+		hr = SHGetSpecialFolderLocation(0, CSIDL_STARTUP, &lp);
+		if (SUCCEEDED(hr)) {
+			memset(lstr, 0, strlen(lstr));
+			SHGetPathFromIDListA(lp, lstr);
+			CSimpleStringA s = lstr;
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CSIDL_STARTUP: %s", s.GetData());
+		}
+        //CSIDL_COMMON_DESKTOPDIRECTORY: C:\Users\Public\Desktop
 		hr = SHGetSpecialFolderLocation(0, CSIDL_COMMON_DESKTOPDIRECTORY, &lp);
 		if (SUCCEEDED(hr)) {
 			memset(lstr, 0, strlen(lstr));
@@ -4130,7 +4205,7 @@ void ResourceWatcherFSM::InitUserInfo()
 			CSimpleStringA s = lstr;
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CSIDL_COMMON_DESKTOPDIRECTORY: %s", s.GetData());
 		}
-
+        //CSIDL_DESKTOP: C:\Users\szzt\Desktop
 		hr = SHGetSpecialFolderLocation(0, CSIDL_DESKTOP, &lp);
 		if (SUCCEEDED(hr)) {
 			memset(lstr, 0, strlen(lstr));
@@ -4138,7 +4213,7 @@ void ResourceWatcherFSM::InitUserInfo()
 			CSimpleStringA s = lstr;
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CSIDL_DESKTOP: %s", s.GetData());
 		}
-
+        //CSIDL_DESKTOPDIRECTORY: C:\Users\szzt\Desktop
 		hr = SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, &lp);
 		if (SUCCEEDED(hr)) {
 			memset(lstr, 0, strlen(lstr));
@@ -4146,19 +4221,6 @@ void ResourceWatcherFSM::InitUserInfo()
 			CSimpleStringA s = lstr;
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CSIDL_DESKTOPDIRECTORY: %s", s.GetData());
 		}
-
-		CSimpleStringA desktopParentPath = "C:\\Users";
-		auto arr = fileutil_get_sub_dirs(desktopParentPath);
-		if (arr != NULL) {
-			for (int i = 0; i < arr->nelts; ++i) {
-				char* dir = ARRAY_IDX(arr, i, char*);
-				char* dirname = strrchr(dir, '\\');
-				if (dirname != NULL) { dirname += 1; }
-				else { dirname = dir; }
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("dir name:%s", dirname);
-			}
-			toolkit_array_free2(arr);
-		}
     }
 
 	const DWORD INFO_BUFFER_SIZE = 128;
@@ -4193,19 +4255,82 @@ void ResourceWatcherFSM::InitUserInfo()
         ,m_strCurrentUserName.GetData(), m_strLoginedUserName.GetData(), diff_flag));
 }
 
-void ResourceWatcherFSM::GetUserDesktopDirectory(CSimpleStringA& outDir)
+void ResourceWatcherFSM::ToListCurrentUserStartupFile(const std::string& userDirPath, std::vector<std::string>& files, std::vector<std::string>& keyfiles)
 {
-    outDir.Clear();
-	if (!m_strLoginedUserName.IsNullOrEmpty()) {
-		CSimpleStringA desktopFullPath = CSimpleStringA::Format("C:\\Users\\%s\\Desktop", m_strLoginedUserName.GetData());
-		outDir = desktopFullPath;
+    std::string fulPath(userDirPath);
+    fulPath += "\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup";
+    files.clear();
+    keyfiles.clear();
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("startup path:%s", fulPath.c_str());
+    if (ExistsDirA(fulPath.c_str())) {
+		auto arr = fileutil_get_sub_files(fulPath.c_str());
+		if (arr != NULL) {
+			for (int i = 0; i < arr->nelts; ++i) {
+				char* file = ARRAY_IDX(arr, i, char*);
+				char* filename = strrchr(file, '\\');
+				if (filename != NULL) { filename += 1; }
+				else { filename = file; }
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("filename:%s", filename);
+                files.push_back(std::string(filename));
+			}
+			toolkit_array_free2(arr);
+		}
+
+        for (auto kt = keyUserlist.cbegin(); kt != keyUserlist.cend(); ++kt) {
+            std::string sub_file(fulPath);
+            sub_file += "\\";
+            sub_file += kt->c_str();
+            if (ExistsFileA(sub_file.c_str())) {
+                keyfiles.push_back(*kt);
+            }
+        }
+    }
+}
+
+void ResourceWatcherFSM::GetCommDesktopDirectory(CSimpleStringA& outDir)
+{
+	outDir.Clear();
+	LPITEMIDLIST lp;
+	CHAR lstr[MAX_PATH] = "";
+	HRESULT hr = SHGetSpecialFolderLocation(0, CSIDL_COMMON_DESKTOPDIRECTORY, &lp);
+	if (SUCCEEDED(hr)) {
+		memset(lstr, 0, strlen(lstr));
+		SHGetPathFromIDListA(lp, lstr);
+		outDir = lstr;
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CSIDL_COMMON_DESKTOPDIRECTORY: %s", outDir.GetData());
 	}
 	else {
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("LoginedUserName is empty.");
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SHGetSpecialFolderLocation for CSIDL_COMMON_DESKTOPDIRECTORY failed:%u", hr);
+        outDir = "C:\\Users\\Public\\Desktop";
 	}
 	return;
 }
 
+void ResourceWatcherFSM::GetUserDesktopDirectory(CSimpleStringA& outDir)
+{
+    outDir.Clear();
+	LPITEMIDLIST lp;
+	CHAR lstr[MAX_PATH] = "";
+    HRESULT hr = SHGetSpecialFolderLocation(0, CSIDL_DESKTOP, &lp);
+	if (SUCCEEDED(hr)) {
+		memset(lstr, 0, strlen(lstr));
+		SHGetPathFromIDListA(lp, lstr);
+        outDir = lstr;
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CSIDL_DESKTOP: %s", outDir.GetData());
+    }
+    else {
+        DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SHGetSpecialFolderLocation for CSIDL_DESKTOP failed:%u", hr);
+		if (!m_strLoginedUserName.IsNullOrEmpty()) {
+			CSimpleStringA desktopFullPath = CSimpleStringA::Format("C:\\Users\\%s\\Desktop", m_strLoginedUserName.GetData());
+			outDir = desktopFullPath;
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("LoginedUserName is empty.");
+		}
+    }
+	return;
+}
+
 bool ResourceWatcherFSM::IsDesktopIconExist(CSimpleStringA& strPath)
 {
 	CSimpleStringA s(true);
@@ -4218,26 +4343,46 @@ bool ResourceWatcherFSM::IsDesktopIconExist(CSimpleStringA& strPath)
 	return false;
 }
 
+void ResourceWatcherFSM::GetCommStartupDirectory(CSimpleStringA& outDir)
+{
+	outDir.Clear();
+	LPITEMIDLIST lp;
+	CHAR lstr[MAX_PATH] = "";
+	HRESULT hr = SHGetSpecialFolderLocation(0, CSIDL_COMMON_STARTUP, &lp);
+	if (SUCCEEDED(hr)) {
+		memset(lstr, 0, strlen(lstr));
+		SHGetPathFromIDListA(lp, lstr);
+		outDir = lstr;
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CSIDL_COMMON_STARTUP: %s", outDir.GetData());
+	}
+	else {
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SHGetSpecialFolderLocation for CSIDL_COMMON_STARTUP failed:%u", hr);
+        outDir = STARTUP_DIR_FULL_PATH;
+	}
+	return;
+}
+
 void ResourceWatcherFSM::GetUserStartupDirectory(CSimpleStringA& outDir)
 {
 	outDir.Clear();
-	//LPITEMIDLIST lp;
-	//HRESULT hr = SHGetSpecialFolderLocation(0, CSIDL_COMMON_STARTUP, &lp);
-	//if (SUCCEEDED(hr)) {
- //       CHAR lstr[MAX_PATH];
-	//	memset(lstr, 0, strlen(lstr));
-	//	SHGetPathFromIDListA(lp, lstr);
-	//	CSimpleStringA desktopFullPath = lstr;
-	//	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CSIDL_COMMON_STARTUP: %s", desktopFullPath.GetData());
-	//	outDir = desktopFullPath;
-	//}
-
-	if (!m_strLoginedUserName.IsNullOrEmpty()) {
-		CSimpleStringA startMenuFullPath = CSimpleStringA::Format("C:\\Users\\%s\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup", m_strLoginedUserName.GetData());
-		outDir = startMenuFullPath;
+	LPITEMIDLIST lp;
+	CHAR lstr[MAX_PATH] = "";
+    HRESULT hr = SHGetSpecialFolderLocation(0, CSIDL_STARTUP, &lp);
+	if (SUCCEEDED(hr)) {
+		memset(lstr, 0, strlen(lstr));
+		SHGetPathFromIDListA(lp, lstr);
+        outDir = lstr;
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CSIDL_STARTUP: %s", outDir.GetData());
     }
     else {
-        DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("LoginedUserName is empty.");
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SHGetSpecialFolderLocation for CSIDL_STARTUP failed:%u", hr);
+		if (!m_strLoginedUserName.IsNullOrEmpty()) {
+			CSimpleStringA startMenuFullPath = CSimpleStringA::Format("C:\\Users\\%s\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup", m_strLoginedUserName.GetData());
+			outDir = startMenuFullPath;
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("LoginedUserName is empty.");
+		}
     }
 	return;
 }
@@ -4521,65 +4666,6 @@ BOOL ResourceWatcherFSM::DetectIsFirstRunAtBoot()
 }
 
 #ifdef RVC_OS_LINUX
-void ResourceWatcherFSM::UploadMonitorSettings()
-{
-    CSmartPointer<IConfigInfo> spCtSettingConfig;
-    GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig);
-    int nSwitchOff(0);
-    spCtSettingConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "MonitorListenOFF", nSwitchOff);
-    if (!!nSwitchOff) {
-        DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Cancel monitor change listen!");
-        if (m_bFirstRunAfterBoot) {
-            CSimpleStringA value(true);
-            bool res = GetMonitorInfo(value);
-            LogWarn(Severity_Low, Error_Debug, LOG_INFO_MONITOR_SETTINGS, value);
-        }
-    }
-    else
-    {
-
-        int nInterval(10000);
-        int nValue(0);
-        spCtSettingConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "MonitorListenInterval", nValue);
-        if (nValue >= 10000) {
-            DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Update monitor listen interval from %d to %d", nInterval, nValue);
-            nInterval = nValue;
-        }
-
-        CSimpleStringA strLastMonitor(true);
-        bool readFromCfgFalg(true);
-        CSmartPointer<IConfigInfo> spRunConfig;
-        GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spRunConfig);
-        spRunConfig->ReadConfigValue("MonitorAttribute", "LastInfo", strLastMonitor);
-
-        do
-        {
-            CSimpleStringA value(true);
-            bool res = GetMonitorInfo(value);
-            if (!value.IsNullOrEmpty() && (strLastMonitor.IsNullOrEmpty() || (strLastMonitor.Compare(value) != 0))) {
-                LogWarn(Severity_Low, Error_Debug, LOG_INFO_MONITOR_SETTINGS, value);
-                CSmartPointer<IConfigInfo> spRunConfig;
-                GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spRunConfig);
-                spRunConfig->WriteConfigValue("MonitorAttribute", "LastInfo", value);
-                strLastMonitor = value;
-                if (readFromCfgFalg) {
-                    readFromCfgFalg = false;
-                }
-
-            }
-            else if (readFromCfgFalg && !strLastMonitor.IsNullOrEmpty() && strLastMonitor.Compare(value) == 0)
-            {
-                LogWarn(Severity_Low, Error_Debug, LOG_INFO_MONITOR_SETTINGS, value);
-                readFromCfgFalg = false;
-            }
-
-            Sleep(nInterval);
-
-        } while (true);
-    }
-}
-
-
 void ResourceWatcherFSM::DetectSoftwareInstallStatus()
 {
     CSmartPointer<IConfigInfo> spCtSettingConfig;

+ 3 - 11
Module/mod_ResourceWatcher/ResourceWatcherFSM.h

@@ -201,7 +201,6 @@ public:
 		return m_bFirstRunAfterBoot;
 	}
 #ifdef RVC_OS_LINUX
-	void UploadMonitorSettings();
 	bool GetMonitorInfo(CSimpleStringA& outInfo);
 	bool GetSysActiveStatus(CSimpleStringA& outInfo);
 	void DetectSoftwareInstallStatus();
@@ -362,10 +361,12 @@ public:
 	void DetectWallpaperAndWarn();
 	void InitCustomAutoStartFileSheet();
 	void InitUserInfo();
+	void ToListCurrentUserStartupFile(const std::string& userDirPath, std::vector<std::string>& files, std::vector<std::string>& keyfiles);
 	bool IsUserSameName() { return m_strLoginedUserName.Compare(m_strCurrentUserName) == 0; }
+	void GetCommDesktopDirectory(CSimpleStringA& outDir);
 	void GetUserDesktopDirectory(CSimpleStringA& outDir);
 	bool IsDesktopIconExist(CSimpleStringA& strPath);
-
+	void GetCommStartupDirectory(CSimpleStringA& outDir);
 	void GetUserStartupDirectory(CSimpleStringA& outDir);
 	bool IsStartupIconExist(CSimpleStringA& strPath);
 
@@ -384,15 +385,6 @@ public:
 };
 
 #ifdef RVC_OS_LINUX
-struct UploadMonitorInfoTask : public ITaskSp
-{
-	ResourceWatcherFSM* m_pFSM;
-	UploadMonitorInfoTask(ResourceWatcherFSM* pFSM) : m_pFSM(pFSM) {}
-	void Process()
-	{
-		m_pFSM->UploadMonitorSettings();
-	}
-};
 
 struct DetectSoftwareInstallStatusTask : public ITaskSp
 {

+ 3 - 0
Module/mod_ResourceWatcher/ResourceWatcher_UserCode.h

@@ -76,6 +76,9 @@
 
 #define LOG_RESOURCEWATCHER_OSD_RECOVER_ENABLE 0x50A00060
 #define LOG_RESOURCEWATCHER_OSD_REMOVE_SUCC 0x50A00061
+#define LOG_RESOURCEWATCHER_DEBUG_STARTUPFILES 0x50A00062
+#define LOG_RESOURCEWATCHER_DEBUG_KEY_STARTUPFILES 0x50A00063
+
 
 #define LOG_EVT_RESOURCE_CPU_ERROR	0x50A00102                //CPU使用率过于异常 > 98%(mod_ResourceWatcher)
 #define LOG_EVT_RESOURCE_CPU_TOO_HIGH  0x50A00103		    //CPU使用率过高 (mod_ResourceWatcher)

+ 7 - 41
Module/mod_cardissuerstore/CardIssuerFSM.cpp

@@ -18,9 +18,6 @@
 #include <atltime.h>
 #endif //RVC_OS_WIN
 
-char tmpxx[1024];
-char testIC[1024];
-
 #include "CardIssuerClass.h"
 #include "mod_cardissuer.h"
 #include "stdafx.h"
@@ -1394,7 +1391,7 @@ ErrorCodeEnum CCardIssuerFSM::OnInit()
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("create card process failed.");
 		return Error_Resource;
 	}
-	Load();
+	m_csDevSN = "";
 	CSystemStaticInfo sysInfo;
 	//oilyang 20160331
 	//so many function always return Error_Succeed,so is useless to process it.
@@ -1409,13 +1406,7 @@ ErrorCodeEnum CCardIssuerFSM::OnInit()
 	//如果是东信卡库,将CardLibDB_CMB.db3文件拷贝到运行时中,若运行时已存在该文件,不再拷贝
 	if(!m_csMachineType.Compare("RVC.CardStore", true))
 	{
-		CSmartPointer<IConfigInfo> spConfig;
-		GetEntityBase()->GetFunction()->OpenConfig(Config_Root, spConfig);
-		
-		CSimpleStringA csVendor("");
-		spConfig->ReadConfigValue("Device.CardIssuer", "Vendor", csVendor);
-
-		if(!csVendor.Compare("Eastcom", true))
+		if(!sysInfo.strManufacturer.Compare("Eastcom", true))
 		{
 			CSimpleStringA runinfoPath(true);
 			CSimpleStringA depPath(true);
@@ -1447,7 +1438,8 @@ ErrorCodeEnum CCardIssuerFSM::OnInit()
 		}
 	}
 
-	//因替换实体名,需要兼容把以前旧的运行时文件拷贝成新的实体名运行文件
+	//因替换实体名,需要兼容把以前旧的运行时文件拷贝成新的实体名运行文件,卡机分离后,拷贝旧版运行时文件,后期稳定后直接去除
+	//////////////////////////////////////////////////////////////////////////
 	CSimpleStringA runinfoPath(true);
 	CSmartPointer<IConfigInfo> spConfig;
 	ErrorCodeEnum  err = GetEntityBase()->GetFunction()->GetPath("RunInfo", runinfoPath);
@@ -1535,7 +1527,7 @@ ErrorCodeEnum CCardIssuerFSM::OnInit()
 		}
 	}
 	
-
+	//////////////////////////////////////////////////////////////////////////
 
 #endif //RVC_OS_WIN
 	m_devStatus.eMedia = CI_MEDIA_NOTPRESENT;
@@ -1828,10 +1820,10 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 	long l_beginTime,l_endTime;
 	do {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CreateDevComponent suc. m_port:%d, m_baudRate:%d, pDevSN:%s",
-			m_port, m_baudRate, pDevSN);
+			m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt(), pDevSN);
 
 		l_beginTime = GetTickCountRVC();
-		eErrDev = m_hDevHelper->DevOpenEx(m_port, m_baudRate, btOpenType, pDevSN, m_connectType);
+		eErrDev = m_hDevHelper->DevOpenEx(m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt(), btOpenType, pDevSN, m_connectType);
 		l_endTime = GetTickCountRVC();
 		
 		if (eErrDev == Error_Succeed)
@@ -1966,15 +1958,6 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 		}
 		if (m_hopperNum == 1 && btOpenType == DEV_OPEN_TYPE_COM)//oilyang 如果没有配置,使用原来的配置
 		{
-			//spConfig->ReadConfigValueInt("RunInfo", "CardRemains", m_remainsEx[0]);
-			//spConfig->ReadConfigValueInt("RunInfo", "CardIssued", m_issuedEx[0]);
-			//spConfig->ReadConfigValueInt("RunInfo", "CardCaptured", m_CardCaptured);
-			//spConfig->ReadConfigValueInt("RunInfo", "IsIssue", isIssue);
-			//spConfig->ReadConfigValueInt("RunInfo", "CardMixed", m_mixedEx[0]);
-			//spConfig->ReadConfigValueInt("RunInfo", "CardInit", m_CardInitEx[0]);
-			//spConfig->ReadConfigValueInt("RunInfo", "CardPercent", m_CardPercentEx[0]);
-			//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("use old record, CardRemains:%d, CardIssued:%d, CardCaptured:%d, IsIssue:%d, CardMixed:%d, CardInit:%d",
-			//	m_remainsEx[0], m_issuedEx[0], m_CardCaptured, isIssue, m_mixedEx[0], m_CardInitEx[0]);
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("use new hopper cfg record");
 		}
 		//oilyang 回写卡机配置
@@ -2081,24 +2064,7 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 		}
 	}
 }
-void CCardIssuerFSM::Load()
-{
-	LOG_FUNCTION();
-	/** 使用封装的公共逻辑去获取适配器打开的相关信息,参考其他硬件实体  [Gifur@20241111]*/
-	CSmartPointer<IConfigInfo> spConfig;
-	ErrorCodeEnum eErrDev = GetEntityBase()->GetFunction()->OpenConfig(Config_Root, spConfig);
-	if (spConfig == NULL)
-	{
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<Load>, open root.ini failed");
-		return;
-	}
-	spConfig->ReadConfigValueInt("Device.CardIssuer", "Baudrate", m_baudRate);
-	spConfig->ReadConfigValueInt("Device.CardIssuer", "Port", m_port);
 
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_baudRate:%d, m_port:%d", m_baudRate, m_port);
-
-	m_csDevSN = "";
-}
 int CCardIssuerFSM::Initial()
 {
 	m_bOpening = true;

+ 1 - 2
Module/mod_cardissuerstore/CardIssuerFSM.h

@@ -1182,7 +1182,6 @@ public:
 	void s19_on_exit();
 	unsigned int s19_on_event(FSMEvent* event);
 	
-	void Load();
 	ErrorCodeEnum OpenDevice(BYTE btOpenType, const char *pDevSN);
 	int Initial();
 	bool GetDevStatus(bool bPrint=true);
@@ -1304,7 +1303,7 @@ private:
 	int m_issueStatusFromFile, m_issueStatus/*the status maybe changed by Business call*/;
 	//1:default, 2:SCI, 3:no cfg
 	int m_machineType;
-	int m_port, m_baudRate, m_currentHopper, m_devOpenFailedCount;
+	int m_currentHopper, m_devOpenFailedCount;
 	int m_maxSlot,m_findCard,m_cardPos,m_currentFSMState,m_maxRetainCount, m_eacQueryFlag/*accout query*/
 		,m_ICRetryTimes;
 	CSimpleStringA m_CardBoxNoEx[HOPPER_NUM], m_PsbCodeEx[HOPPER_NUM], m_PsbNameEx[HOPPER_NUM], m_MaintainerEx[HOPPER_NUM],m_csMaintainTimeEx[HOPPER_NUM];

+ 40 - 7
Module/mod_chromium/CModTools.cpp

@@ -263,6 +263,11 @@ namespace Chromium {
         cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
 			Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "").Append(errType._to_string());
 		errPageUrl.Append(" --cache-path=").Append(cachePath);
+		if (ConfigManager::getInstance().m_extension_withTerminal && ConfigManager::getInstance().m_extension_headerStr.length() > 0)
+			errPageUrl.Append(" --modify-header=").Append(ConfigManager::getInstance().m_extension_headerStr.c_str());
+		if (ConfigManager::getInstance().m_extension_debugOpen)
+			errPageUrl.Append(" --right-menu");
+
         if (ConfigManager::getInstance().isUseMagic())
 			errPageUrl.Append(" --magic-str=").Append(m_magicStr.c_str());
 		if (ConfigManager::getInstance().m_withMedia)
@@ -471,14 +476,16 @@ namespace Chromium {
 		return std::make_pair(strUrl.GetLength() > 0, strUrl.GetData());
 	}
 
-
-
 	std::string CModTools::generateAdCmd(std::string AdUrl) {
 #if defined(RVC_OS_LINUX)
 		return generateBrowserCMDForEverything(AdUrl, 1, ConfigManager::getInstance().m_withUnsafeAd);
 #else
         CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
         strCmdLine.Append(strChromiumPath).Append(" --url=").Append(AdUrl.c_str());
+		if (ConfigManager::getInstance().m_extension_debugOpen)
+			strCmdLine.Append(" --right-menu");
+		if (ConfigManager::getInstance().m_extension_withTerminal && ConfigManager::getInstance().m_extension_headerStr.length() > 0)
+			strCmdLine.Append(" --modify-header=").Append(ConfigManager::getInstance().m_extension_headerStr.c_str());
         CSimpleStringA cachePath;
         this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
         cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
@@ -506,7 +513,10 @@ namespace Chromium {
     {
         CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
         strCmdLine.Append(strChromiumPath).Append(" --url=").Append(mainUrl.c_str());
-
+		if (ConfigManager::getInstance().m_extension_debugOpen)
+			strCmdLine.Append(" --right-menu");
+		if (ConfigManager::getInstance().m_extension_withTerminal && ConfigManager::getInstance().m_extension_headerStr.length() > 0)
+			strCmdLine.Append(" --modify-header=").Append(ConfigManager::getInstance().m_extension_headerStr.c_str());
         if (isExtend) {
             //not support
         }
@@ -554,6 +564,10 @@ namespace Chromium {
 #else
 		CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
 		strCmdLine.Append(strChromiumPath).Append(" --url=").Append(installUrl.c_str());
+		if (ConfigManager::getInstance().m_extension_debugOpen)
+			strCmdLine.Append(" --right-menu");
+		if (ConfigManager::getInstance().m_extension_withTerminal && ConfigManager::getInstance().m_extension_headerStr.length() > 0)
+			strCmdLine.Append(" --modify-header=").Append(ConfigManager::getInstance().m_extension_headerStr.c_str());
 		CSimpleStringA cachePath;
 		this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
 		cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
@@ -618,6 +632,8 @@ namespace Chromium {
 
 			CSimpleStringA strUOSBrowserPath(execute_oldbrowser_path.c_str());
 			strParams.Append(" --new-window --no-first-run --disable-popup-blocking --disable-notifications --disable-desktop-notifications ");
+			if (ConfigManager::getInstance().m_extension_withTerminal)
+				strParams.Append(" --load-extension=").Append(ConfigManager::getInstance().m_extensionPath.c_str());
 			strParams.Append(" --allow-running-insecure-content --disable-infobars --disable-suggestions-service --disable-save-password-bubble --disable-component-update");
 			
 			
@@ -643,8 +659,9 @@ namespace Chromium {
 		if (m_UseUOSBrowser == 2) {
 
 			CSimpleStringA strUOSBrowserPath(execute_newbrowser_path.c_str());
-			strParams.Append(" --incognito --allow-running-insecure-content --new-window");
-
+			strParams.Append(" --allow-running-insecure-content --new-window");
+			if (ConfigManager::getInstance().m_extension_withTerminal)
+				strParams.Append(" --load-extension=").Append(ConfigManager::getInstance().m_extensionPath.c_str());
 			CSimpleStringA tempPath;
 			this->m_pEntity->GetFunction()->GetPath("Temp", tempPath);
 			CSimpleStringA cachePath(tempPath);
@@ -665,6 +682,10 @@ namespace Chromium {
 #else
 		CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
 		strCmdLine.Append(strChromiumPath).Append(" --url=").Append(url.c_str());
+		if (ConfigManager::getInstance().m_extension_debugOpen)
+			strCmdLine.Append(" --right-menu");
+		if (ConfigManager::getInstance().m_extension_withTerminal && ConfigManager::getInstance().m_extension_headerStr.length() > 0)
+			strCmdLine.Append(" --modify-header=").Append(ConfigManager::getInstance().m_extension_headerStr.c_str());
 		if (width > 0 && height > 0)
 			strCmdLine.Append(" --center-size=").Append(std::to_string(width).c_str()).Append("*").Append(std::to_string(height).c_str());
 		if (point_x != -1 && point_y != -1)
@@ -692,6 +713,10 @@ namespace Chromium {
         CSimpleStringA cachePath;
         CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
         strCmdLine.Append(strChromiumPath).Append(" --url=").Append(mainUrl.c_str());
+		if (ConfigManager::getInstance().m_extension_debugOpen)
+			strCmdLine.Append(" --right-menu");
+		if (ConfigManager::getInstance().m_extension_withTerminal && ConfigManager::getInstance().m_extension_headerStr.length() > 0)
+			strCmdLine.Append(" --modify-header=").Append(ConfigManager::getInstance().m_extension_headerStr.c_str());
         this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
         cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
 			Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "").
@@ -758,7 +783,11 @@ namespace Chromium {
         if (m_UseUOSBrowser == 1) {
 
             CSimpleStringA strUOSBrowserPath(execute_oldbrowser_path.c_str());
-            CSimpleStringA strParams(" --new-window --kiosk --no-first-run --disable-popup-blocking --disable-notifications --disable-desktop-notifications --allow-running-insecure-content --disable-infobars --disable-suggestions-service --disable-save-password-bubble --disable-component-update");
+            CSimpleStringA strParams(" --new-window --no-first-run --disable-popup-blocking --disable-notifications --disable-desktop-notifications --allow-running-insecure-content --disable-infobars --disable-suggestions-service --disable-save-password-bubble --disable-component-update");
+			if (!ConfigManager::getInstance().m_extension_debugOpen)
+				strParams.Append(" --kiosk");
+			if (ConfigManager::getInstance().m_extension_withTerminal)
+				strParams.Append(" --load-extension=").Append(ConfigManager::getInstance().m_extensionPath.c_str());
 			if (pageType == 0 || pageType == 2 || pageType == 3) {
 
 			} else if (pageType == 1) {
@@ -818,7 +847,11 @@ namespace Chromium {
         if (m_UseUOSBrowser == 2) {
 
             CSimpleStringA strUOSBrowserPath(execute_newbrowser_path.c_str());
-            CSimpleStringA strParams(" --kiosk --incognito --allow-running-insecure-content --new-window");
+            CSimpleStringA strParams(" --allow-running-insecure-content --new-window");
+			if (!ConfigManager::getInstance().m_extension_debugOpen)
+				strParams.Append(" --kiosk");
+			if (ConfigManager::getInstance().m_extension_withTerminal)
+				strParams.Append(" --load-extension=").Append(ConfigManager::getInstance().m_extensionPath.c_str());
             if (pageType == 0 || pageType == 2 || pageType == 3) {
 
             } else if (pageType == 1) {

+ 1 - 1
Module/mod_chromium/EntitySessionManager.cpp

@@ -442,7 +442,7 @@ namespace Chromium {
 		Json::Value header;
 		header["url_contains"] = "";
 		header["action"] = "add";
-		header["header_name"] = "VTM_terminalno";
+		header["header_name"] = HEADER_TERMINALNO_NAME;
 		header["header_value"] = terminalno;
 		header["comment"] = "test";
 		header["apply_on"] = "req";

+ 8 - 6
Module/mod_chromium/baseEx.cpp

@@ -348,7 +348,7 @@ void InitUserCodeToMsgTip(CAutoArray<CSimpleStringA>& strErrorCodeArr, CAutoArra
 
 	for (int i = 0; i < strErrorCodeArr.GetCount(); i++)
 	{
-		std::string dstDescribe = std::string(strErrorCodeArr[i].GetData()) + "|" + std::string(strDescriptionArr[i].GetData());
+		std::string dstDescribe = "[" + std::string(strErrorCodeArr[i].GetData()) + "]" + std::string(strDescriptionArr[i].GetData());
 		if (g_UserCodeToMsgTip.find(strRemarkArr[i].GetData()) != g_UserCodeToMsgTip.end())
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("InitUserCodeToMsgTip repeated usercode:%s", strRemarkArr[i].GetData());
@@ -374,8 +374,8 @@ std::pair<unsigned long, ErrMsgStruct> getErrMsgByRemark(std::string srcMsg)
 
 	if (g_UserCodeToMsgTip.size() == 0)
 	{
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA42F0").setAPI(__FUNCTION__)("RTA42F0|微服务异常|(%s)", srcMsg.c_str());
-		return std::make_pair(0, ErrMsgStruct("RTA42F0", CSimpleString::Format("RTA42F0|微服务异常|(%s)", srcMsg.c_str()).GetData(), userCodeStr));
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA42F0").setAPI(__FUNCTION__)("[RTA42F0]微服务异常|(%s)", srcMsg.c_str());
+		return std::make_pair(0, ErrMsgStruct("RTA42F0", CSimpleString::Format("[RTA42F0]微服务异常|(%s)", srcMsg.c_str()).GetData(), userCodeStr));
 	}
 
 	if (g_UserCodeToMsgTip.find(userCodeStr) != g_UserCodeToMsgTip.end())
@@ -385,8 +385,8 @@ std::pair<unsigned long, ErrMsgStruct> getErrMsgByRemark(std::string srcMsg)
 	}		
 	else
 	{
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA42F1").setAPI(__FUNCTION__)("RTA42F1|错误映射异常|(%s)", srcMsg.c_str());
-		return std::make_pair(userCode, ErrMsgStruct("RTA42F1", CSimpleString::Format("RTA42F1|错误映射异常|(%s)", srcMsg.c_str()).GetData(), userCodeStr));
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA42F1").setAPI(__FUNCTION__)("[RTA42F1]错误映射异常|(%s)", srcMsg.c_str());
+		return std::make_pair(userCode, ErrMsgStruct("RTA42F1", CSimpleString::Format("[RTA42F1]错误映射异常|(%s)", srcMsg.c_str()).GetData(), userCodeStr));
 	}
 }
 
@@ -933,7 +933,7 @@ ConfigManager& ConfigManager::getInstance() {
 ConfigManager::ConfigManager()
 	: m_iTcpBridgePort(4504), m_strCustomMainUrl(""), m_strCustomAdUrl(""), m_runAd(false), m_runMain(false), m_runExtend(false), m_runLogin(false), m_withBrowser(false), m_withMin(false), m_withClose(false)
 	, m_withDebugMode(false), m_withMagic(false), m_withNoFileLog(false), m_installMode(false), m_withMedia(false), m_withSpecialTest(false), m_withConsole(false),
-	m_withLinkLog(false), m_withUnsafeAd(false), m_noStartupPage(false)
+	m_withLinkLog(false), m_withUnsafeAd(false), m_noStartupPage(false),  m_extension_debugOpen(false), m_extension_withTerminal(false)
 {
 	void* logProducer = nullptr;
 	std::map<std::string, void*> g_logProducerArr;
@@ -942,6 +942,8 @@ ConfigManager::ConfigManager()
 	bool g_withSpecialTest = false;
 	bool g_hasInitCfg = false;//can discard
 	int g_sogouForce = 0;
+	m_extensionPath = "";
+
 }
 
 

+ 6 - 0
Module/mod_chromium/baseEx.h

@@ -13,6 +13,8 @@
 
 #define DEFAULT_KEY_LEN 256
 
+#define HEADER_TERMINALNO_NAME "vtm-terminalno"
+
 
 std::vector<std::string> find_files(const std::string srcPath, const std::string fileName, bool isDir = false);
 std::string generateTimeStr(bool isSimple = false);
@@ -201,6 +203,10 @@ public:
 	std::deque<SYS_EVENT_PARAM> m_eventArr;
 	bool m_noStartupPage;
 	std::map<std::string, std::vector<int>> m_commonPageArr;
+	std::string m_extensionPath;
+	bool m_extension_debugOpen;
+	bool m_extension_withTerminal;
+	std::string m_extension_headerStr;
 
 public:
 	CSystemStaticInfo& getSysInfo() { return m_sysInfo; };

+ 30 - 6
Module/mod_chromium/mod_chromium.cpp

@@ -424,8 +424,6 @@ namespace Chromium {
 						,m_withMin, m_withClose, m_withDebugMode, m_withMagic, m_withNoFileLog, m_withMedia, m_withSpecialTest, m_withConsole, m_withLinkLog);
 						*/
 
-						
-
 
 						int forceCacheClean = false;
 						if (Error_Succeed == spConfig->ReadConfigValueInt("Chromium", "forceCacheClean", forceCacheClean) && forceCacheClean)
@@ -440,6 +438,28 @@ namespace Chromium {
 					else
 						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("can not find %s, use default", webMaskKey.GetData());
 				}
+
+				CSimpleString ExtensionsParam = "";
+				if (Error_Succeed == spConfig->ReadConfigValue("Chromium", "ExtensionsParam", ExtensionsParam) && ExtensionsParam.GetLength() > 0)
+				{
+					CSimpleString msg = CSimpleString::Format("ExtensionsParam:%s", ExtensionsParam.GetData());
+					LogManager::getInstance().logEntityStatus(msg.GetData(), LOG_LEVEL_INFO, 0, "none");
+					auto paramArr = ExtensionsParam.Split('|');
+					for (int i = 0; i < paramArr.GetCount(); i++)
+					{
+						auto trimStr = paramArr[i].Trim();
+						if (!trimStr.Compare("Debug", true))//browser can be control right menu
+							ConfigManager::getInstance().m_extension_debugOpen = true;
+						else if (!trimStr.Compare("header_Terminalno", true))
+						{
+							ConfigManager::getInstance().m_extension_withTerminal = true;
+							ConfigManager::getInstance().m_extension_headerStr = 
+								CSimpleString::Format("%s:%s", HEADER_TERMINALNO_NAME, ConfigManager::getInstance().getSysInfo().strTerminalID).GetData();
+						}
+					}
+				}
+
+
 				if (!ConfigManager::getInstance().m_runAd &&
 					!ConfigManager::getInstance().m_runMain &&
 					!ConfigManager::getInstance().m_runExtend &&
@@ -475,9 +495,12 @@ namespace Chromium {
 			return false;
 		}
 		// load all struct define xml & start websocket server
-		CSimpleStringA strStructPath;
+		CSimpleStringA strStructPath, strExtensionPath;
 		GetFunction()->GetPath("Base", strStructPath);
+		strExtensionPath = strStructPath;
 		strStructPath.Append(CSimpleStringA(SPLIT_SLASH_STR) + "res" + SPLIT_SLASH_STR + "StructConfig" + SPLIT_SLASH_STR);
+		strExtensionPath.Append(CSimpleStringA(SPLIT_SLASH_STR) + "res" + SPLIT_SLASH_STR + "VTMModifyHeaders");
+		ConfigManager::getInstance().m_extensionPath = strExtensionPath.GetData();
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("find struct config files in path %s", strStructPath.GetData());
 		m_pWsServer = new CWebsocketServer(strStructPath, this);
 		m_pWsServer->run();
@@ -1166,9 +1189,10 @@ namespace Chromium {
 			if (ConfigManager::getInstance().m_installMode)//Do not init Entity again in install mode
 				break;
 			//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("startWithCfg:open error or normal page");
-			LogManager::getInstance().logEntityOnLog(NULL == pszEntityName ? "" : pszEntityName, dwUserCode, "Event_VtmLoader_GetConfig_Suc",
-				0, "openPage", Error_Succeed, "startWithCfg:open error or normal page");
-			startWithCfg();//open errPage or normal page
+			if(dwUserCode == Event_VtmLoader_GetConfig_Fail)
+				LogManager::getInstance().logEntityOnLog(NULL == pszEntityName ? "" : pszEntityName, dwUserCode, "Event_VtmLoader_GetConfig_Fail",
+					0, "openPage", Error_Succeed, "startWithCfg:open error or normal page");
+			boost::thread(boost::bind(&CChromiumEntity::startWithCfg, this)).detach();//open errPage or normal page
 			break;
 		case Event_VtmLoader_GetVTMERRMSG_Suc:
 			LogManager::getInstance().logEntityOnLog(NULL == pszEntityName ? "" : pszEntityName, dwUserCode, "Event_VtmLoader_GetVTMERRMSG_Suc",

+ 40 - 17
Module/mod_gpio/mod_gpio.cpp

@@ -269,15 +269,18 @@ void CGpioEntity::ToLogRootINIInfo()
     CSimpleStringA entityName(GetEntityName());
 	if (!entityName.IsNullOrEmpty()) {
 		CSimpleStringA sectionName = CSimpleStringA::Format("Device.%s", entityName.GetData());
-		CSimpleStringA csVendor(true), csVersion(true), csBatch(true), csPort(true), csBaudrate(true);
-		spConfigRoot->ReadConfigValue(sectionName, "Vendor", csVendor);
-		spConfigRoot->ReadConfigValue(sectionName, "Version", csVersion);
-		spConfigRoot->ReadConfigValue(sectionName, "Batch", csBatch);
+		CSimpleStringA csVendor(true), csVersion(true), csBatch(true), csPort(true), csBaudrate(true), csFileName(true);
+		spConfigRoot->ReadConfigValue(sectionName, "File", csFileName);
+		if (csFileName.IsNullOrEmpty()) {
+			spConfigRoot->ReadConfigValue(sectionName, "Vendor", csVendor);
+			spConfigRoot->ReadConfigValue(sectionName, "Version", csVersion);
+			spConfigRoot->ReadConfigValue(sectionName, "Batch", csBatch);
+		}
 		spConfigRoot->ReadConfigValue(sectionName, "Port", csPort);
 		spConfigRoot->ReadConfigValue(sectionName, "Baudrate", csBaudrate);
-
 		std::map<std::string, std::string> rootInfo;
 		CSimpleStringA csCheckData(true), csKeySN(true);
+		rootInfo["File"] = csFileName.GetData();
 		rootInfo["Vendor"] = csVendor.GetData();
 		rootInfo["Version"] = csVersion.GetData();
 		rootInfo["Batch"] = csBatch.GetData();
@@ -328,6 +331,7 @@ struct GpioInitTask : public ITaskSp {
 
 void CGpioEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs, CSmartPointer<ITransactionContext> pTransactionContext)
 {
+	GetFunction()->RegistSysVarEvent("UIState", this);
 	GpioInitTask* initTask = new GpioInitTask(this, pTransactionContext);
 	GetFunction()->PostThreadPoolTask(initTask);
 }
@@ -453,22 +457,42 @@ ErrorCodeEnum CGpioEntity::Initial()
 	m_adapterInfo.strPort = csPort;
 	m_adapterInfo.strBaudrate = csBaudrate;
 	m_adapterInfo.strPortNum = csPortNum; //Just load from Config
-
+	BOOL nSwitchFlag(FALSE);
+	BOOL useOld = TRUE;
+	CSmartPointer<IConfigInfo> spConfigCenter;
+	eErrDev = spEntityFunction->OpenConfig(Config_CenterSetting, spConfigCenter);
+	if (eErrDev == Error_Succeed) {
+		int nValue(0);
+		spConfigCenter->ReadConfigValueInt(GetEntityName(), "PortNumChoiceSwitch", nValue);
+		if (nValue != 0) {
+			nSwitchFlag = TRUE;
+		}
+	}
 #if defined(RVC_OS_WIN)
-    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("[%s],[%s],[%s]", m_adapterInfo.strVendor.GetData()
-		, m_adapterInfo.strVersion.GetData(), m_adapterInfo.strBatch.GetData());
-    //TODO: 这个看怎么兼容后移除  [Gifur@202494]
-	//Gpio.keba.1.1 , Gpio.Hyosung.1.1, Gpio.kxd.1.1 均为 老设备,2024-9-11发现现有生产有2249台
-	if (!_stricmp(m_adapterInfo.strVendor, "Hyosung") || !_stricmp(m_adapterInfo.strVendor, "Keba") || !_stricmp(m_adapterInfo.strVendor, "Kxd")) {
-		if (m_adapterInfo.strVersion == "1" && m_adapterInfo.strVersion == "1") {
-			m_bNewVersion = FALSE;
+	if (nSwitchFlag && !csPortNum.IsNullOrEmpty()) {
+		if (csPortNum.Compare("3") == 0) { m_bNewVersion = FALSE;  useOld = FALSE; }
+		else if (csPortNum.Compare("4") == 0) { m_bNewVersion = TRUE;  useOld = FALSE; }
+	}
+	if (useOld) {
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("[%s],[%s],[%s]", m_adapterInfo.strVendor.GetData()
+			, m_adapterInfo.strVersion.GetData(), m_adapterInfo.strBatch.GetData());
+		//Gpio.keba.1.1 , Gpio.Hyosung.1.1, Gpio.kxd.1.1 均为 老设备,2024-9-11发现现有生产有2249台
+		if (!_stricmp(m_adapterInfo.strVendor, "Hyosung") || !_stricmp(m_adapterInfo.strVendor, "Keba") || !_stricmp(m_adapterInfo.strVendor, "Kxd")) {
+			if (m_adapterInfo.strVersion == "1" && m_adapterInfo.strBatch == "1") {
+				m_bNewVersion = FALSE;
+			}
 		}
 	}
-#endif
+#endif //RVC_OS_WIN
 	bool theSameFlag = false;
 	if ((m_bNewVersion && csPortNum.Compare("4") == 0) || (!m_bNewVersion && csPortNum.Compare("3") == 0)) { theSameFlag = true; }
 	LogWarn(Severity_Low, Error_Debug, GPIO_UserErrorCode_PortNumOldVersion
-		, CSimpleStringA::Format("Required:%s,NewVersion:%s,PortNum:%s", theSameFlag ? "True" : "False", m_bNewVersion ? "True" : "False", csPortNum.GetData()));
+		, CSimpleStringA::Format(",%s,%s,%s,%s,%s"
+			, theSameFlag ? "True" : "False"
+			, m_bNewVersion ? "True" : "False"
+			, csPortNum.GetData()
+			, nSwitchFlag ? "True" : "False"
+			, useOld ? "True" : "False"));
 
 	m_hDevHelper.SetAdapterName(GetEntityName());
     eErrDev = m_hDevHelper.LoadUp(dllName);
@@ -477,7 +501,6 @@ ErrorCodeEnum CGpioEntity::Initial()
         m_bOpening = false;
         return Error_DevLoadFileFailed;
     }
-
 	GpioInitParam initParam;
 	initParam.dwPort = m_adapterInfo.GetPortInt();
 	initParam.dwBaudRate = m_adapterInfo.GetBaudrateInt();
@@ -490,7 +513,7 @@ ErrorCodeEnum CGpioEntity::Initial()
 	if (m_bNewVersion) {
 		initParam.dwPortNum = 4;
 		initParam.dir[3] = true;
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("New available 4 port num");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("New available 4 port num");
 	}
     int initTries = 0;
 	ErrorCodeEnum err;

+ 4 - 3
Module/mod_healthmanager/HealthManagerFSM.cpp

@@ -180,13 +180,13 @@ unsigned int CHealthManagerFSM::s4_on_event(FSMEvent* pEvt)
 		pEvt->SetHandled();
 		if (pEvt->param1 == 1)
 		{
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402501V1").setLogCode("RTA510E")("VtmLoader load SIPphone entity failed, to Set TerminalStage M.");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402501V1").setResultCode("RTA510E")("VtmLoader load SIPphone entity failed, to Set TerminalStage M.");
 			SetVtmLoadResult(VtmLoad_MediaLoadFail);
 			return pEvt->param1;
 		}
 		else if (pEvt->param1 == 2)
 		{
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402501V1").setLogCode("RTA510F")("VtmLoader load SYNCSTART(boot cfg = 2) entity failed, to Set TerminalStage C.");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402501V1").setResultCode("RTA510F")("VtmLoader load SYNCSTART(boot cfg = 2) entity failed, to Set TerminalStage C.");
 			SetVtmLoadResult(VtmLoad_OtherSyncEntityLoadFail);
 			return pEvt->param1;
 		}
@@ -1129,7 +1129,8 @@ void CHealthManagerFSM::QueryHardwareInfo(SpReqAnsContext<HealthManagerService_Q
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("Connet to ResourceWatcher failed: %s", SpStrError(ec));
 		pClient->SafeDelete();
 	}
-
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402501Q1")("termNo:%s,termVersion:%s,env:%d,machineType:%s", ctx->Ans.terminalNo.GetData(), ctx->Ans.termVersion.GetData(), ctx->Ans.reserved1
+		, ctx->Ans.machineType.GetData());
 	ctx->Answer(Error_Succeed);
 }
 bool CHealthManagerFSM::CheckProcessExistByName(CSimpleStringA procName)

+ 15 - 10
Module/mod_healthmanager/mod_healthmanager.cpp

@@ -450,7 +450,8 @@ int CHealthManagerEntity::CheckGuardianIsRun(bool bStart)
 			do {
 				if (_stricmp(&pe.szExeFile[0], "guardian.exe") == 0)
 				{
-					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("guardian is running.");
+					if (!m_bSayIdle)
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("guardian is running.");
 					return 1;
 				}
 			} while (Process32Next(hSnapshot, &pe));
@@ -461,7 +462,8 @@ int CHealthManagerEntity::CheckGuardianIsRun(bool bStart)
 	DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("cannot find guardian.");
 	if (!m_bNeedGuardian)//no need guardian
 	{
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("no need guardian, so don't care about bStart flag");
+		if (!m_bSayIdle)
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("no need guardian, so don't care about bStart flag");
 		return 0;
 	}
 	else
@@ -490,12 +492,13 @@ int CHealthManagerEntity::CheckGuardianIsRun(bool bStart)
 		int ret = kill(pID, 0);
 		if (0 == ret)
 		{
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("guardian.exe is active, pid:%d", pID);
+			if (!m_bSayIdle)
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("guardian.exe is active, pid:%d", pID);
 			return 1;
 		}
 		else
 		{
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process: guardian.exe inactive, pID:%d", pID);
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process: guardian.exe inactive, pID:%d,ret:%d", pID, ret);
 		}
 	}
 	else
@@ -503,7 +506,8 @@ int CHealthManagerEntity::CheckGuardianIsRun(bool bStart)
 
 	if (!m_bNeedGuardian)//no need guardian
 	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("no need guardian, so don't care about bStart flag");
+		if (!m_bSayIdle)
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("no need guardian, so don't care about bStart flag");
 		return 0;
 	}
 	else
@@ -1238,17 +1242,18 @@ void CHealthManagerEntity::OnSysVarEvent(const char *pszKey, const char *pszValu
 	{
 		if (_strnicmp(pszValue, "M", strlen("M")) == 0)
 		{
-			CSmartPointer<IConfigInfo> spConfigRun;
-			ErrorCodeEnum eErr = GetFunction()->OpenConfig(Config_Run, spConfigRun);
 			m_bInMainPage = true;
 			m_bEnterMainPageEver = true;
-			spConfigRun->WriteConfigValueInt("Run", "UpgradeRestartTimes", 0);
-			spConfigRun->WriteConfigValueInt("Run", "UpgradeRestartOSTimes", 0);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("As have been in main page,reset UpgradeRestartTimes.");
+
 			if (!m_bHaveThrowMainPage)
 			{
 				m_bHaveThrowMainPage = true;
 				
+				CSmartPointer<IConfigInfo> spConfigRun;
+				ErrorCodeEnum eErr = GetFunction()->OpenConfig(Config_Run, spConfigRun);
+				spConfigRun->WriteConfigValueInt("Run", "UpgradeRestartTimes", 0);
+				spConfigRun->WriteConfigValueInt("Run", "UpgradeRestartOSTimes", 0);
+
 				ULONGLONG dwElapse = SP::Module::Comm::RVCGetTickCount();//使用机器启动时间秒数
 				DWORD elapseTimeTemp = dwElapse / 1000;
 				DWORD dwToMainPageCostTime = elapseTimeTemp - m_dwTimeOfAuthSuc;//从准入通过到首次收到进入首页事件

+ 1 - 1
Module/mod_healthmanager/mod_healthmanager.h

@@ -240,7 +240,7 @@ public:
 
 	void QueryHardwareInfo(SpReqAnsContext<HealthManagerService_QueryHardwareInfo_Req, HealthManagerService_QueryHardwareInfo_Ans>::Pointer ctx)
 	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402501Q1")();
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402501Q0")();
 		QueryHardwareInfoTask* pTask = new QueryHardwareInfoTask(&m_fsm);
 		pTask->ctx = ctx;
 		GetFunction()->PostThreadPoolTask(pTask);

+ 38 - 11
Module/mod_livenessdetection/RvcWsServer.cpp

@@ -7,6 +7,7 @@
 #include "jpeglib.h"
 #include "Event.h"
 #include "y2k_time.h"
+#include "CommEntityUtil.hpp"
 
 namespace LivenessDetection {
 
@@ -178,6 +179,14 @@ namespace LivenessDetection {
 					}
 				}
 			}
+			else {
+				if (ePreview_Type == eType) {
+					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA3E06")("视频流传输获取预览图像失败");
+				}
+				else {
+					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA3E07")("视频流传输获取抓拍图像失败");
+				}
+			}
 		}
 
 		return 0;
@@ -251,6 +260,7 @@ namespace LivenessDetection {
 		m_capbuffer = NULL;
 		m_ucapbuffer_size = 0;
 		m_ecameraid = eCamera_Env;
+		m_lstarttime = 0;
 	}
 
 
@@ -338,9 +348,6 @@ namespace LivenessDetection {
 			m_wsserver.set_reuse_addr(true);
 			m_wsserver.set_socket_init_handler(&on_socket_init);
 
-			//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get_max_message_size is %d.", m_wsserver.get_max_message_size());
-			//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get_max_http_body_size is %d.", m_wsserver.get_max_http_body_size());
-
 			m_wsserver.listen(m_listenport);
 			// Start the server accept loop
 			m_wsserver.start_accept();
@@ -412,12 +419,15 @@ namespace LivenessDetection {
 
 			if (RVC_MIN_VIDEO_TRANS_TIME >= utranstime) {
 				LogWarn(Severity_Middle, Error_Debug, LOG_EVT_AUTO_FACE_FAILED, CSimpleStringA::Format("auto face failed and transmit time is %us.", utranstime).GetData());
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA3E04")("流媒体传输时长不大于2秒.");
 			}
 
 			if (RVC_MAX_VIDEO_TRANS_TIME <= utranstime) {
 				LogWarn(Severity_Low, Error_Debug, LOG_EVT_AUTO_FACE_TIMEOUT, CSimpleStringA::Format("auto face timeout and transmit time is %us.", utranstime).GetData());
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA3E05")("流媒体传输时长不小于15秒.");
 			}
 		}
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402314L6")("断开流媒体传输连接");
 	}
 
 
@@ -425,11 +435,11 @@ namespace LivenessDetection {
 	void RvcWsServer::on_message(websocketpp::connection_hdl hdl, server::message_ptr msg)
 	{
 		try {
-
 			if (m_bconnected == false) {
 				m_struuid = "";
 				if (0 == msg->get_payload().compare(0, strlen(RVC_WS_INIT_STR), RVC_WS_INIT_STR)) {
 					handle_initial_instructions(hdl, msg->get_payload());
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402314L1")("流媒体传输连接初始化");
 				}
 			}
 			else {
@@ -438,21 +448,36 @@ namespace LivenessDetection {
 						m_bstarttrans = true;
 						m_hdl = hdl;
 						if (0 != StartVideoTransmit()) {
-							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start video transmit failed.");
+							DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402314L2").setResultCode("RTA3E01")("start video transmit failed.");
+						}
+						else {
+							m_lstarttime = SP::Module::Comm::RVCGetTickCount();
+							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402314L2")("start video transmit success.");
 						}
 					}
 					else if (0 == msg->get_payload().compare(m_struuid.length() + strlen(RVC_WS_CONNECT_IDENTIFIER), strlen(RVC_WS_STOP_TRANS_STR), RVC_WS_STOP_TRANS_STR)) {
-						StopVideoTransmit();
+						long costtime = SP::Module::Comm::RVCGetTickCount() - m_lstarttime;
+						if (0 != StopVideoTransmit()) {
+							DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setCostTime(costtime).setLogCode("QLR0402314L5").setResultCode("RTA3E02")("stop video transmit failed.");
+						}
+						else {
+							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setCostTime(costtime).setLogCode("QLR0402314L5")("stop video transmit success.");
+						}
 						m_bstarttrans = false;
 					}
 					else if (0 == msg->get_payload().compare(m_struuid.length() + strlen(RVC_WS_CONNECT_IDENTIFIER), strlen(RVC_WS_CHANGE_CAMERA_STR), RVC_WS_CHANGE_CAMERA_STR)) {
-						handle_change_camera_instructions(msg->get_payload());
+						if (0 != handle_change_camera_instructions(msg->get_payload())) {
+							DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402314L3").setResultCode("RTA3E03")("change transmit camera failed.");
+						}
+						else {
+							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402314L3")("change transmit camera success.");
+						}
 					}
 					else if (0 == msg->get_payload().compare(m_struuid.length() + strlen(RVC_WS_CONNECT_IDENTIFIER), strlen(RVC_WS_START_CAPTURE_STR), RVC_WS_START_CAPTURE_STR)) {
 						StartVideoCapTransmit();
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402314L4")("start video capture transmit success.");
 					}
-					else
-					{
+					else{
 						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("unknown request.");
 					}
 				}
@@ -518,14 +543,16 @@ namespace LivenessDetection {
 
 			if (RVC_MIN_VIDEO_TRANS_TIME >= utranstime) {
 				LogWarn(Severity_Middle, Error_Debug, LOG_EVT_AUTO_FACE_FAILED, CSimpleStringA::Format("auto face failed and transmit time is %us.", utranstime).GetData());
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA3E04")("流媒体传输时长不大于2秒.");
 			}
 
 			if (RVC_MAX_VIDEO_TRANS_TIME <= utranstime) {
 				LogWarn(Severity_Low, Error_Debug, LOG_EVT_AUTO_FACE_TIMEOUT, CSimpleStringA::Format("auto face timeout and transmit time is %us.", utranstime).GetData());
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA3E05")("流媒体传输时长不小于15秒.");
 			}
-
-			iRet = 0;
 		}
+		
+		iRet = 0;
 
 		return iRet;
 	}

+ 73 - 75
Module/mod_livenessdetection/RvcWsServer.h

@@ -66,80 +66,78 @@
 
 
 namespace LivenessDetection{
-
-enum eVideoType{
-	ePreview_Type,
-	eCapture_Type
-};
-
-enum eCameraType{
-	eCamera_Env,
-	eCamera_Opt
-};
-
-typedef websocketpp::server<websocketpp::config::asio> server;
-
-typedef struct websocket_callback_s  {
-	int (*on_get_videodata)(eVideoType eType, eCameraType ecameraid, int* width, int* height, unsigned char* bmpdata, int isize, void* user_data);
-	void *user_data;
-}websocket_callback_t;
-
-
-typedef struct rvc_video_param_s{
-	int iwidth;
-	int iheight;
-	int icapwidth;
-	int icapheight;
-}rvc_video_param_t;
-
-
-
-class RvcWsServer
-{
-public:
-	RvcWsServer(void);
-	~RvcWsServer(void);
-	int Init_WsServer(websocket_callback_t* pcallback, rvc_video_param_t* pparam, int iport = RVC_LIVENESS_WS_PORT);
-	int StartVideoTransmit();
-	int StopVideoTransmit();
-	int StartVideoCapTransmit();
-
-private:
-	bool validate(websocketpp::connection_hdl hdl);
-	void on_http(websocketpp::connection_hdl hdl);
-	void on_fail(websocketpp::connection_hdl hdl);
-	void on_open(websocketpp::connection_hdl hdl);
-	void on_close(websocketpp::connection_hdl hdl);
-	void on_message(websocketpp::connection_hdl hdl, server::message_ptr msg);
-
-	int handle_initial_instructions(websocketpp::connection_hdl hdl, std::string strinstrut);
-	int handle_change_camera_instructions(std::string strinstrut);
-
-public:
-	volatile bool m_bconnected;			// connect flag
-	volatile bool m_bstarttrans;		// start transmit
-	volatile eCameraType m_ecameraid;	// camera id
-#if defined(_WIN32)
-	HANDLE m_work_thread;
-	HANDLE m_evt;
-#else
-	pthread_t m_work_threadid;
-	sem_t m_semt;
-#endif //RVC_OS_WIN
-	websocket_callback_t m_callback;
-	server m_wsserver;					// websocket server,用于和业务层传输视频流,默认端口9100
-	websocketpp::connection_hdl m_hdl;
-	int m_cameraid;
-	int m_fps;
-	unsigned char* m_buffer;
-	size_t m_ubuffer_size;
-	unsigned char* m_capbuffer;
-	size_t m_ucapbuffer_size;
-	unsigned int m_utranstime;
-
-private:
-	int m_listenport;				  // websocket server监听端口
-	std::string m_struuid;		      // websocket connet flag
-};
+	enum eVideoType{
+		ePreview_Type,
+		eCapture_Type
+	};
+
+	enum eCameraType{
+		eCamera_Env,
+		eCamera_Opt
+	};
+
+	typedef websocketpp::server<websocketpp::config::asio> server;
+
+	typedef struct websocket_callback_s  {
+		int (*on_get_videodata)(eVideoType eType, eCameraType ecameraid, int* width, int* height, unsigned char* bmpdata, int isize, void* user_data);
+		void *user_data;
+	}websocket_callback_t;
+
+	typedef struct rvc_video_param_s{
+		int iwidth;
+		int iheight;
+		int icapwidth;
+		int icapheight;
+	}rvc_video_param_t;
+
+
+	class RvcWsServer
+	{
+	public:
+		RvcWsServer(void);
+		~RvcWsServer(void);
+		int Init_WsServer(websocket_callback_t* pcallback, rvc_video_param_t* pparam, int iport = RVC_LIVENESS_WS_PORT);
+		int StartVideoTransmit();
+		int StopVideoTransmit();
+		int StartVideoCapTransmit();
+
+	private:
+		bool validate(websocketpp::connection_hdl hdl);
+		void on_http(websocketpp::connection_hdl hdl);
+		void on_fail(websocketpp::connection_hdl hdl);
+		void on_open(websocketpp::connection_hdl hdl);
+		void on_close(websocketpp::connection_hdl hdl);
+		void on_message(websocketpp::connection_hdl hdl, server::message_ptr msg);
+
+		int handle_initial_instructions(websocketpp::connection_hdl hdl, std::string strinstrut);
+		int handle_change_camera_instructions(std::string strinstrut);
+
+	public:
+		volatile bool m_bconnected;			// connect flag
+		volatile bool m_bstarttrans;		// start transmit
+		volatile eCameraType m_ecameraid;	// camera id
+		long m_lstarttime;
+	#if defined(_WIN32)
+		HANDLE m_work_thread;
+		HANDLE m_evt;
+	#else
+		pthread_t m_work_threadid;
+		sem_t m_semt;
+	#endif //RVC_OS_WIN
+		websocket_callback_t m_callback;
+		server m_wsserver;					// websocket server,用于和业务层传输视频流,默认端口9100
+		websocketpp::connection_hdl m_hdl;
+		int m_cameraid;
+		int m_fps;
+		unsigned char* m_buffer;
+		size_t m_ubuffer_size;
+		unsigned char* m_capbuffer;
+		size_t m_ucapbuffer_size;
+		unsigned int m_utranstime;
+
+	private:
+		int m_listenport;				  // websocket server监听端口
+		std::string m_struuid;		      // websocket connet flag
+	};
 }
 

+ 1 - 0
Module/mod_recorder/mod_recorder.cpp

@@ -84,6 +84,7 @@ static const char* GetFileName(const char* pfilename)
 static void LogRecordFileInfo(const char* pszMessage)
 {
 	unsigned long ufilesize = GetFileSize(pszMessage);
+
 	char strhash[MAX_PATH] = { 0 };
 	get_file_sm3digest(strhash, MAX_PATH, pszMessage);
 

+ 1 - 0
Module/mod_upload/CMakeLists.txt

@@ -13,6 +13,7 @@ set(${MODULE_PREFIX}_SRCS
 	Upload_server_g.h
 	UploadFSM.cpp
 	UploadFSM.h
+	Upload_UserErrorCode.h
 	${ThirdPartyHeadRoot}/XZip/XZip.h
 	${ThirdPartyHeadRoot}/XZip/XZip.cpp
 	)

+ 38 - 47
Module/mod_upload/UploadFSM.cpp

@@ -35,7 +35,6 @@ UploadFSM::UploadFSM() : m_currUploadFile(NULL)
 	m_overLenFileList = new list<string>();
 	m_eachUploadLen=UPLOAD_CONTENT_EACH_LEN;
 	m_uploadMaxNum = 200;
-	//m_continueUpload = 0;
 	m_isOffLine=true;//初始离线状态为true
 	m_printPlan = true;//初始化为打印
 }
@@ -114,9 +113,6 @@ namespace Task
 					if(updateState(client,info,isLanTerminal,MD5str,branchFilePath,errmsg)){
 						if(operateFile(errmsg)){
 							sendOk = true;//成功
-							//if (m_fsm->m_continueUpload==0) {
-							//	m_fsm->deleteUploadedList(m_fsm->m_currUploadFile->filePath);
-							//}
 						}else{
 							m_fsm->m_uploadReport.operateFileFail++;//添加操作失败计数
 							DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("SendFileTask")("operateFile fail,file = %s",m_fsm->m_currUploadFile->filePath.c_str());
@@ -196,25 +192,6 @@ namespace Task
 				return false;
 			}
 
-			//兼容模式,通过配置控制
-			//if (m_fsm->m_continueUpload == 0) {
-			//	if (uploadedLen == 0) {
-			//		//记录文件列表
-			//		uploadedLen = 0;//改变文件游标偏移量 
-			//		m_fsm->insertUploadedList(m_fsm->m_currUploadFile->filePath);
-			//	}
-			//	else {
-			//		//查询是否在文件列表,做配置,过渡期时不在则从0开始上传,后面统一续传。
-			//		if (m_fsm->ifExistInUploadedList(m_fsm->m_currUploadFile->filePath)) {
-			//			uploadedLen = uploadedLen;//续传
-			//		}
-			//		else {
-			//			uploadedLen = 0;//重传服务器临时文件删除
-			//			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("文件[%s] 不是新上传文件,重新从0位置上传", m_fsm->m_currUploadFile->filePath.c_str());
-			//		}
-			//	}
-			//}
-
 	
 			DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("文件[%s] 开始传送位置 uploadedLen = %d, file len=%d",m_fsm->m_currUploadFile->filePath.c_str(), uploadedLen, m_fsm->m_currUploadFile->fileLen);
 			
@@ -227,6 +204,18 @@ namespace Task
 				return false;
 			}
 
+			//获取首次文件hash
+			CSimpleStringA firstSM3Str = "";
+			if (Error_Succeed == m_fsm->SM3FileToStr(m_fsm->m_currUploadFile->filePath.c_str(), firstSM3Str, false)) {
+				m_fsm->m_currUploadFile->firstMD5Str = firstSM3Str.GetData();
+				m_fsm->m_currUploadFile->lastMD5Str = "";
+			}
+			else {
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("uploadFile is fail, get file first SM3 hash fail");
+				errmsg = "uploadFile is fail , get file first SM3 hash fail";
+				return false;
+			}
+
 			bool uploadSucc= false;
 			while(true){
 				//续传
@@ -261,6 +250,16 @@ namespace Task
 						
 					string fileLastLenStr= CSimpleStringA::Format("%d",fileLastLen).GetData();//计算出解密后总长度
 
+					//获取最后文件hash
+					CSimpleStringA lastSM3Str = "";
+					if(Error_Succeed == m_fsm->SM3FileToStr(filepath.GetData(), lastSM3Str, false)) {
+						m_fsm->m_currUploadFile->lastMD5Str = lastSM3Str.GetData();
+					}
+					else {
+						errmsg = "uploadFile is fail , get file last SM3 hash fail";
+						break;//计算sm3出错
+					}
+
 					//最后一块
 					int uploadLen = m_fsm->m_currUploadFile->fileLen-uploadedLen;
 					unsigned char* contentEnd;
@@ -329,9 +328,9 @@ namespace Task
 			rootReq["first_file_length"] = CSimpleStringA::Format("%d",m_fsm->m_currUploadFile->fileLen).GetData();//加密后需要修改,服务端根据此长度做判断
 			rootReq["last_file_length"] = lastFileLength.c_str();//加密后需要修改,最后一次长度跟服务端保存长度做对比
 			rootReq["upload_length"] = CSimpleStringA::Format("%d",fileContentSize).GetData();
-			//rootReq["first_sm3"] = firstMD5Str.c_str();
-			//rootReq["last_sm3"] = lastMD5Str.c_str();
-			rootReq["file_head_custom"] = m_fsm->m_currUploadFile->decHeadJson.c_str();//自定义解密的头json格式,可为空
+			rootReq["first_sm3"] = m_fsm->m_currUploadFile->firstMD5Str.c_str();
+			rootReq["last_sm3"] = m_fsm->m_currUploadFile->lastMD5Str.c_str();
+			rootReq["file_head_custom"] = "";//自定义解密的头json格式,可为空
 #ifdef RVC_OS_WIN
 			rootReq["system_type"] = "W";//系统标记,代表路径分隔符
 #else
@@ -347,7 +346,11 @@ namespace Task
 			qTempReq.m_timeOut = 5*60;//设置超时时间
 			//qTempReq.m_printDbg=true;
 			//调用上传接口
-			if(!client->UploadFileBlock(qTempReq,qTempRet)){
+			//最后一次上传时,文件hash和长度告警
+			if (m_fsm->m_currUploadFile->lastMD5Str.length() != 0) {
+				LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_UPLOAD_FILE_INFO, CSimpleStringA::Format("upload %s file size is %s byte,sm3 digest is %s.", m_fsm->m_currUploadFile->fileName.c_str(), lastFileLength.c_str(), m_fsm->m_currUploadFile->lastMD5Str.c_str()).GetData());
+			}
+			if (!client->UploadFileBlock(qTempReq, qTempRet)) {
 				DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("uploadFile http req fail ,url =%s ,fileName = %s",httpUrl.c_str(), m_fsm->m_currUploadFile->fileName.c_str());
 				return false;
 			}
@@ -377,7 +380,12 @@ namespace Task
 					}
 			}else{
 				//失败
-				DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("uploadFile http [success] is false, url[%s],userCode[%s],errmsg[%s],fileName = %s",httpUrl.c_str(),qTempRet.m_userCode.c_str(),qTempRet.m_errMsg.c_str(),m_fsm->m_currUploadFile->fileName.c_str());
+				if (m_fsm->m_currUploadFile->lastMD5Str.length() == 0) {
+					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("uploadFile http [success] is false, url[%s],userCode[%s],errmsg[%s],fileName = %s", httpUrl.c_str(), qTempRet.m_userCode.c_str(), qTempRet.m_errMsg.c_str(), m_fsm->m_currUploadFile->fileName.c_str());
+				}
+				else {
+					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("uploadFile http [success] is false, url[%s],userCode[%s],errmsg[%s],fileName = %s,first_sm3 =[%s],last_sm3=[%s]", httpUrl.c_str(), qTempRet.m_userCode.c_str(), qTempRet.m_errMsg.c_str(), m_fsm->m_currUploadFile->fileName.c_str(), m_fsm->m_currUploadFile->firstMD5Str.c_str(), m_fsm->m_currUploadFile->lastMD5Str.c_str());
+				}
 				return false;
 			}
 		}	
@@ -834,19 +842,6 @@ ErrorCodeEnum UploadFSM::OnInit()
 			return Error;
 		}
 
-		//int continueUpload = 0;
-
-		//Error = spConfig->ReadConfigValueInt("upload", "ContinueUpload", continueUpload);
-		//if (Error == Error_Succeed)
-		//{
-		//	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[CenterUrl] ContinueUpload =%d", continueUpload);
-		//	m_continueUpload = continueUpload;
-		//}
-		//else
-		//{
-		//	return Error;
-		//}
-
 		//获取系统文件根路径
 		CSimpleStringA runPath ;
 		Error =this->GetEntityBase()->GetFunction()->GetPath("rvc",runPath);//例如:C:\\Run /opt/Run
@@ -1382,12 +1377,6 @@ bool UploadFSM::queryPlan()
 
 					m_uploadPlanList->push_back(p);
 				}
-				//行内需要判断分行服务url地址(废弃用终端场所判断,统一由后台服务返回文件上传地址)
-				//if(si.strSite.Compare("CMB.LIB",true)==0||si.strSite.Compare("CMB.SSB",true)==0){
-				//	if(m_branchIpList.size()==0){
-				//		return false;//告警分行服务ip为空,走旧模式
-				//	}
-				//}
 				if(m_branchIpList.size()==0){
 					LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_UPLOAD_QUERY_PLAN_DATA_ERROR, CSimpleStringA::Format("queryPlan http req fail, return upload_url count is 0, url is %s",m_centerUrl.queryPlanUrl.c_str()).GetData());
 					return false;//上传服务ip为空,走旧模式
@@ -1544,6 +1533,8 @@ void UploadFSM::scanDirfresh(UploadPlan* plan,const char *path)
 
 			//添加扫描文件
 			UploadFileInfo* upFile = new UploadFileInfo();
+			upFile->firstMD5Str = "";
+			upFile->lastMD5Str = "";
 			upFile->fileName = fileName;
 			upFile->filePath = file_path;
 			if(upFile->filePath.length()>900){

+ 3 - 4
Module/mod_upload/UploadFSM.h

@@ -17,6 +17,7 @@
 #endif
 #include <map>
 #include "json/json.h"
+#include "Upload_UserErrorCode.h"
 
 #define USER_EVT_JMP_DISABLE	EVT_USER+1
 #define USER_EVT_JMP_ENABLE		EVT_USER+2
@@ -33,8 +34,6 @@
 #define USER_EVT_UPLOAD_SUCC		EVT_USER+12
 #define USER_EVT_UPLOAD_FAIL		EVT_USER+13
 
-#define LOG_WARN_UPLOAD_MAX_ERROR 0x10400006 //查询扫描待上传文件个数超过阈值告警
-
 using namespace std;
 
 
@@ -174,7 +173,8 @@ struct UploadFileInfo:UploadPlan{
 	long decFileLen;//解密后的长度
 	string decHeadJson;//解密后自定义头
 	string editTime;//文件最后修改时间
-//	UploadPlan* plan;//对应的计划指针
+	string firstMD5Str;//开始传的MD5值
+	string lastMD5Str;//最后传的MD5值
 };
 
 struct UploadReport{
@@ -319,7 +319,6 @@ public:
 	int m_eachUploadLen;//每次上传数据的最大长度,单位K
 	UploadReport m_uploadReport;//每批次上传告警统计
 	int m_uploadMaxNum;//待上传最大告警数目阈值
-	//int m_continueUpload;//重启后是否支持续传
 
 	bool m_printPlan;//打印扫描计划
 

+ 13 - 0
Module/mod_upload/Upload_UserErrorCode.h

@@ -0,0 +1,13 @@
+#ifndef _UPLOAD_USER_ERRORCODE_H
+#define _UPLOAD_USER_ERRORCODE_H
+#pragma once
+
+#define LOG_WARN_UPLOAD_SCANFILE_LOCK_ERROR 0x10400001 //扫描文件时文件独占句柄失败
+#define LOG_WARN_UPLOAD_QUERY_PLAN_ERROR 0x10400002 //查询扫描计划http通讯报错
+#define LOG_WARN_UPLOAD_QUERY_FILE_OVER_LIMIT 0x10400003 //扫描文件文件过大告警
+#define LOG_WARN_UPLOAD_FILE_REPORT 0x10400004 //上传文件统计信息告警
+#define LOG_WARN_UPLOAD_QUERY_PLAN_DATA_ERROR 0x10400005 //查询扫描计划数据效验错误
+#define LOG_WARN_UPLOAD_MAX_ERROR 0x10400006 //查询扫描待上传文件个数超过阈值告警
+#define LOG_WARN_UPLOAD_FILE_INFO 0x10400007 //上传文件打印hash和长度
+
+#endif //_CARDISSUERSTORE_USER_ERRORCODE_H

+ 23 - 4
Module/mod_vtmloader/VtmLoaderFSM.cpp

@@ -1003,6 +1003,7 @@ int CVtmLoaderFSM::NetWorkCheckAndGetSetting()
 		GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "N");
 	}
 	//oilyang@20241017 to check if have copied dep directory
+	int copyTries = 0;
 	while (true)
 	{
 		if (m_eDepCopyStage == DepDirInitCopy_NoNeed || m_eDepCopyStage == DepDirInitCopy_CopySuc)
@@ -1019,6 +1020,15 @@ int CVtmLoaderFSM::NetWorkCheckAndGetSetting()
 		{
 			LogWarn(Severity_High, Error_Unexpect, VtmLoader_DepDirCopyFailed, "厂商适配器Dep文件拷贝失败,请联系分行IT排查是否安全软件干扰文件拷贝");
 			Sleep(60000);
+			copyTries++;
+			if (copyTries > 4)
+			{
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("have tried %d times, give up", copyTries);
+				return -1;
+			}
+			m_eDepCopyStage = DepDirInitCopy_Copying;
+			CopyDepFilesToNewDepPathTask* pCopyTask = new CopyDepFilesToNewDepPathTask(this);
+			GetEntityBase()->GetFunction()->PostThreadPoolTask(pCopyTask);
 		}
 	}
 	return EntityLoad();
@@ -1710,10 +1720,13 @@ bool CVtmLoaderFSM::GetConfig()
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("before GetConfig terminalNo:[%s]", m_sysInfo.strTerminalID.GetData());
 	//拉取配置前先检查root.ini文件
 	CSimpleStringA csTmpRootIni("");
-	if (!IsRootINIExist(csTmpRootIni) && m_terminalNoFromWeb.IsNullOrEmpty())
+	if (!IsRootINIExist(csTmpRootIni))
 	{
-		LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("root.ini不存在或安装页面未设置终端号,请检查(%s)", csTmpRootIni.GetData()).GetData());
-		return false;
+		if (m_terminalNoFromWeb.IsNullOrEmpty())
+		{
+			LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("安装页面未设置终端号,请检查(%s)", csTmpRootIni.GetData()).GetData());
+			return false;
+		}
 	}
 	else if (m_sysInfo.strTerminalID.IsNullOrEmpty())
 	{
@@ -2797,7 +2810,10 @@ bool CVtmLoaderFSM::CheckConfigInfoInTestRoom()
 		if (m_sysInfo.strMachineType.Compare("RVC.Stand2S") != 0 && m_sysInfo.strMachineType.Compare("RVC.CardStore")
 			&& m_sysInfo.strMachineType.Compare("RVC.CardPrinter") && m_sysInfo.strMachineType.Compare("RVC.Stand1SPlus"))
 		{
-			LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("机型(%s)不对,请检查", m_sysInfo.strMachineType.GetData()));
+			if (m_sysInfo.strMachineType.IsNullOrEmpty())
+				LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("机型machineType配置为空,请检查", m_sysInfo.strMachineType.GetData()));
+			else
+				LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("机型machineType(%s)不对,请检查", m_sysInfo.strMachineType.GetData()));
 			return false;
 		}
 
@@ -2938,7 +2954,10 @@ void CVtmLoaderFSM::CopyDepFilesToNewDepPath()
 		LogWarn(Severity_Low, Error_Succeed, VtmLoader_DepDirCopySuc, CSimpleStringA::Format("%d", ullCopyEndTick - ullCopyBeginTick));
 	}
 	else
+	{
 		m_eDepCopyStage = DepDirInitCopy_CopyFailed;
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA1F08")("copy dep to new dep path failed, failedContent:%s", failedContent.c_str());
+	}
 }
 bool CVtmLoaderFSM::IfInExcludedLoadList(CSimpleStringA csEntityName)
 {

+ 3 - 3
Other/libfilecryption/fileanalysis.cpp

@@ -76,9 +76,9 @@ int get_srcfile_hash(char* phash, uint32_t ulen, const char* pfilename)
 }
 
 
-unsigned long get_srcfile_size(const char* pfilename)
+uint32_t get_srcfile_size(const char* pfilename)
 {
-	unsigned long usize = 0;
+	uint32_t usize = 0;
 	if (NULL == pfilename){
 		return usize;
 	}
@@ -86,7 +86,7 @@ unsigned long get_srcfile_size(const char* pfilename)
 	FILE* pFile = fopen(pfilename, "rb");
 	if (pFile){
 		fseek(pFile, 0, SEEK_END);
-		usize = ftell(pFile);
+		usize = (uint32_t)ftell(pFile);
 		fclose(pFile);
 	}
 

+ 1 - 1
Other/libfilecryption/fileanalysis.h

@@ -14,7 +14,7 @@
 int get_srcfile_name(char* pname, uint32_t ulen, const char* pfilename);
 int get_srcfile_format(char* pformat, uint32_t ulen, const char* pfilename);
 int get_srcfile_hash(char* phash, uint32_t ulen, const char* pfilename);
-unsigned long get_srcfile_size(const char* pfilename);
+uint32_t get_srcfile_size(const char* pfilename);
 int get_encrytion_filename(char* strbuffer, uint32_t ulen, bool bencname, const char* strprefix, uint32_t uprefixlen, const char* pfilename);
 int get_decrytion_filename(char* strbuffer, uint32_t ulen, const char* strprefix, uint32_t uprefixlen, const char* pfilename);
 int SM4EncECBMode(unsigned char key[16], unsigned char *input, int length, unsigned char *output, int *output_len);

+ 1 - 1
Other/libfilecryption/filecryption.cpp

@@ -113,7 +113,7 @@ static int encrypt_mp4_file(char* poutfilename, char* phead, uint32_t uheaderlen
 	}
 
 	fseek(pSrcFile, 0, SEEK_END);
-	unsigned int usrcfilelen = ftell(pSrcFile);
+	uint32_t usrcfilelen = (uint32_t)ftell(pSrcFile);
 	rewind(pSrcFile);
 	safe_log(pcallback, FILECRYPT_LOG_INFO, "src file length is %u.", usrcfilelen);
 

+ 2 - 2
Other/libfilecryption/mp4info.cpp

@@ -16,9 +16,9 @@ static unsigned int big_to_small_endian_32bit(unsigned int const big)
 
 
 //ftyp, free, mdat box not encryt
-unsigned int get_noencrypt_boxs_size(FILE* pSrcFile, const filecryption_callback_t* pcallback, bool bgetmoov)
+uint32_t get_noencrypt_boxs_size(FILE* pSrcFile, const filecryption_callback_t* pcallback, bool bgetmoov)
 {
-	unsigned int uret = 0;
+	uint32_t uret = 0;
 	if (NULL == pSrcFile) {
 		return uret;
 	}

+ 5 - 5
Other/libfilecryption/rvcfileheader.cpp

@@ -33,9 +33,9 @@ int constrcut_rvc_file_header(char* pbuffer, uint32_t* ulen, const char* pfilena
 	}
 
 	//5. 源文件文件大小
-	unsigned long usize = get_srcfile_size(pfilename);
-	memcpy(pbuffer+udatalen, &usize, sizeof(unsigned long));
-	udatalen += sizeof(unsigned long);
+	uint32_t usize = get_srcfile_size(pfilename);
+	memcpy(pbuffer+udatalen, &usize, sizeof(uint32_t));
+	udatalen += sizeof(uint32_t);
 
 	//6. 源文件文件名
 	char strname[MAX_PATH] = {0};
@@ -80,8 +80,8 @@ int get_rvc_file_header_info(rvc_fileheader_t* pdata, char* pheadbuffer, uint32_
 		return iret;
 	}
 	//5. 源文件文件大小
-	memcpy(&pdata->usrcfilelen, pheadbuffer+uindex, sizeof(unsigned long));
-	uindex += sizeof(unsigned long);
+	memcpy(&pdata->usrcfilelen, pheadbuffer+uindex, sizeof(uint32_t));
+	uindex += sizeof(uint32_t);
 	//6. 源文件文件名
 	if (0 == get_tag_value_from_buffer((char*)pdata->strsrcfilename, MAX_PATH, pheadbuffer+uindex, ulen - uindex)){
 		uindex += (strlen(pdata->strsrcfilename) + sizeof(uint32_t));

+ 1 - 1
Other/libfilecryption/rvcfileheader.h

@@ -45,7 +45,7 @@ typedef struct rvc_fileheader_s{
 	size_t uheadlen;
 	char strcryptver[RVC_CRYPTION_VER_FLAG_LEN];
 	unsigned char strhash[RVC_FILE_HASH_LEN];
-	unsigned long usrcfilelen;
+	uint32_t usrcfilelen;
 	char strsrcfilename[MAX_PATH];
 	char strsrcfileformat[MAX_PATH];
 }rvc_fileheader_t;

+ 1 - 1
addin/cmake/DependencyConanFiles.cmake

@@ -69,7 +69,7 @@ if(MSVC)
 			#mod_chromium
 			CEFControl/1.0@LR04.02_ThirdParty/testing
 			#mod_chromium
-			cefclient_mutable/2.0.37@LR04.02_ThirdParty/testing
+			cefclient_mutable/2.0.51@LR04.02_ThirdParty/testing
 			#libaudiorender
 			speex/1.2.1@LR04.02_ThirdParty/testing
 			#libvideoframework

+ 1 - 1
addin/res/RunScript/startInit.sh

@@ -8,6 +8,6 @@ cefpath="${bindir}/RunScript/startMixBrower.sh"
 echo "3"$cefpath
 urlpath="${versiondir}/res/ManagerDesktop/initPassword.html"
 echo "4"$urlpath
-cmdpath="${cefpath} --incognito --new-window --allow-running-insecure-content --window-size=800,900 --window-position=240,62 --app=file:///${urlpath}"
+cmdpath="${cefpath} --new-window --allow-running-insecure-content --window-size=800,900 --window-position=240,62 --app=file:///${urlpath}"
 echo "5"$cmdpath
 exec ${cmdpath}

+ 1 - 1
addin/res/RunScript/startSettings.sh

@@ -8,6 +8,6 @@ cefpath="${bindir}/RunScript/startMixBrower.sh"
 echo "3"$cefpath
 urlpath="${versiondir}/res/ManagerDesktop/page.html#volumn"
 echo "4"$urlpath
-cmdpath="${cefpath} --kiosk --incognito --new-window --allow-running-insecure-content --disable-web-security --allow-file-access-from-files --app=file:///${urlpath}"
+cmdpath="${cefpath} --kiosk --new-window --allow-running-insecure-content --disable-web-security --allow-file-access-from-files --app=file:///${urlpath}"
 echo "5"$cmdpath
 exec ${cmdpath}

+ 342 - 0
addin/res/VTMModifyHeaders/background.js

@@ -0,0 +1,342 @@
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
+ *
+ * @author didierfred@gmail.com
+ * @version 0.4
+ */
+
+
+"use strict";
+
+let config;
+let started = 'on';
+let debug_mode = true;
+const isChrome = false;
+let config_read_type = 'websocket';//local,file,websocket,http
+const wsUrl = 'ws://127.0.0.1:9002';
+let socket = null;
+
+loadConfigurationFromLocalStorage();
+
+addListener();
+// listen for change in configuration or start/stop
+chrome.runtime.onMessage.addListener(notify);
+
+function connectWebSocket(callback_function) {
+  socket = new WebSocket(wsUrl);
+
+  socket.onmessage = function(event) {
+    log('Received message:' + event.data);
+    socket.close();
+    callback_function(event.data);
+    return;
+  };
+
+  socket.onopen = function() {
+    log('WebSocket connection established');
+    // 发送配置请求
+    let requestData = '{"messageType":131073}';
+    log('Send message:' + requestData)
+    socket.send(requestData);
+  };
+
+  socket.onerror = function() {
+    log('WebSocket connection error');
+  };
+
+  socket.onclose = function() {
+    log('WebSocket connection closed');
+  };
+}
+
+
+function loadConfigurationFromLocalStorage() {
+  if(config_read_type == 'local')
+  {
+    let headers = [];
+    headers.push({ url_contains: "", action: "add", header_name: "terminalno", header_value: "7555980178", comment: "test", apply_on: "req", status: "on" });
+    config = { format_version: "1.1", target_page: "", headers: headers, debug_mode: true, use_url_contains: false };
+    log("current new config" + JSON.stringify(config));
+
+
+    storeInBrowserStorage({ config: JSON.stringify(config) });
+    started = 'on';
+  }
+  else if(config_read_type == 'file')
+  {
+    log('loadConfigurationFromLocalStorage');
+    const filePath = 'file:///D:/Run/runinfo/runcfg/config.json'; // 指定本地文件路径
+    fetch(filePath)
+      .then(response => response.json())
+      .then(data => {
+        console.log('Current new config:', JSON.stringify(data));
+        config = data;
+        storeInBrowserStorage({ config: JSON.stringify(data) }); // 如果不需要存储到浏览器存储中,可以注释掉这行
+        started = 'on';
+      })
+      .catch(error => {
+        console.error('Error reading file:', error);
+      });
+  }
+  else if(config_read_type == 'websocket')
+  {
+    connectWebSocket(function(dataStr) {
+      let data = JSON.parse(dataStr);
+      log("current new config:" + JSON.stringify(data));
+      config = data
+      storeInBrowserStorage({ config: JSON.stringify(data) });
+      started = 'on';
+    });
+  }
+}
+
+
+
+
+function loadFromBrowserStorage(item, callback_function) {
+  chrome.storage.local.get(item, callback_function);
+}
+
+function storeInBrowserStorage(item, callback_function) {
+  chrome.storage.local.set(item, callback_function);
+}
+
+
+function cookie_keyvalues_set(original_cookies, key, value) {
+    let new_element = " " + key + "=" + value; // not used if value is undefined. 
+    let cookies_ar = original_cookies.split(";").filter(e => e.trim().length > 0);
+    let selected_cookie_index = cookies_ar.findIndex(kv => kv.trim().startsWith(key+"="));
+    if ((selected_cookie_index == -1) && (value != undefined)) cookies_ar.push(new_element);
+    else {
+        if (value === undefined)
+            cookies_ar.splice(selected_cookie_index, 1);
+        else
+            cookies_ar.splice(selected_cookie_index, 1, new_element);
+    }
+    return cookies_ar.join(";");
+}
+
+function set_cookie_modify_cookie_value(original_set_cookie_header_content, key, new_value) {
+    let trimmed = original_set_cookie_header_content.trimStart();
+    let original_attributes = trimmed.indexOf(";") === -1 ? "" : trimmed.substring(trimmed.indexOf(";"))
+    return key + "=" + new_value + original_attributes;
+}
+
+
+/*
+* Standard function to log messages
+*
+*/
+
+function log(message) {
+  console.log(new Date() + " SimpleModifyHeader : " + message);
+}
+
+/*
+* Rewrite the request header (add , modify or delete)
+*
+*/
+function rewriteRequestHeader(e) {
+  if (config.debug_mode) log("Start modify request headers for url " + e.url);
+  for (let to_modify of config.headers) {
+    if ((to_modify.status === "on") && (to_modify.apply_on === "req") && (!config.use_url_contains || (config.use_url_contains && e.url.includes(to_modify.url_contains.trim())))) {
+      if (to_modify.action === "add") {
+        let new_header = { "name": to_modify.header_name, "value": to_modify.header_value };
+        e.requestHeaders.push(new_header);
+        if (config.debug_mode) log("Add request header : name=" + to_modify.header_name +
+          ",value=" + to_modify.header_value + " for url " + e.url);
+      }
+      else if (to_modify.action === "modify") {
+        for (let header of e.requestHeaders) {
+          if (header.name.toLowerCase() === to_modify.header_name.toLowerCase()) {
+            if (config.debug_mode) log("Modify request header :  name= " + to_modify.header_name +
+              ",old value=" + header.value + ",new value=" + to_modify.header_value +
+              " for url " + e.url);
+            header.value = to_modify.header_value;
+          }
+        }
+      }
+      else if (to_modify.action === "delete") {
+        let index = -1;
+        for (let i = 0; i < e.requestHeaders.length; i++) {
+          if (e.requestHeaders[i].name.toLowerCase() === to_modify.header_name.toLowerCase()) index = i;
+        }
+        if (index !== -1) {
+          e.requestHeaders.splice(index, 1);
+          if (config.debug_mode) log("Delete request header :  name=" + to_modify.header_name.toLowerCase() +
+            " for url " + e.url);
+        }
+      }
+      else if (to_modify.action === "cookie_add_or_modify") {
+        let header_cookie = e.requestHeaders.find(header => header.name.toLowerCase() === "cookie");
+        let new_cookie = cookie_keyvalues_set(header_cookie === undefined ? "" : header_cookie.value, to_modify.header_name, to_modify.header_value);
+        if (header_cookie === undefined) {
+          e.requestHeaders.push({"name": "Cookie", "value": new_cookie});
+          if (config.debug_mode) log("cookie_add_or_modify.req new_header : name=Cookie,value=" + new_cookie + " for url " + e.url);
+        }
+        else {
+          header_cookie.value = new_cookie;
+          if (config.debug_mode) log("cookie_add_or_modify.req modify_header : name=Cookie,value=" + new_cookie + " for url " + e.url);
+        }
+      }
+      else if (to_modify.action === "cookie_delete") {
+        let header_cookie = e.requestHeaders.find(header => header.name.toLowerCase() === "cookie");
+        let new_cookie = cookie_keyvalues_set(header_cookie === undefined ? "" : header_cookie.value, to_modify.header_name, undefined);
+        if (header_cookie === undefined) {
+          if (config.debug_mode) log("cookie_delete.req: no cookie header found. doing nothing for url " + e.url);
+        }
+        else {
+          header_cookie.value = new_cookie;
+          if (config.debug_mode) log("cookie_delete.req modify_header : name=Cookie,value=" + new_cookie + " for url " + e.url);
+        }
+      }
+    }
+  }
+  if (config.debug_mode) log("End modify request headers for url " + e.url);
+  return { requestHeaders: e.requestHeaders };
+}
+
+
+/*
+* Rewrite the response header (add , modify or delete)
+*
+*/
+function rewriteResponseHeader(e) {
+  if (config.debug_mode) log("Start modify response headers for url " + e.url);
+  for (let to_modify of config.headers) {
+    if ((to_modify.status === "on") && (to_modify.apply_on === "res") && (!config.use_url_contains || (config.use_url_contains && e.url.includes(to_modify.url_contains.trim())))) {
+      if (to_modify.action === "add") {
+        let new_header = { "name": to_modify.header_name, "value": to_modify.header_value };
+        e.responseHeaders.push(new_header);
+        if (config.debug_mode) log("Add response header : name=" + to_modify.header_name
+          + ",value=" + to_modify.header_value + " for url " + e.url);
+      }
+      else if (to_modify.action === "modify") {
+        for (let header of e.responseHeaders) {
+          if (header.name.toLowerCase() === to_modify.header_name.toLowerCase()) {
+            if (config.debug_mode) log("Modify response header :  name= " + to_modify.header_name + ",old value="
+              + header.value + ",new value=" + to_modify.header_value + " for url " + e.url);
+            header.value = to_modify.header_value;
+          }
+        }
+      }
+      else if (to_modify.action === "delete") {
+        let index = -1;
+        for (let i = 0; i < e.responseHeaders.length; i++) {
+          if (e.responseHeaders[i].name.toLowerCase() === to_modify.header_name.toLowerCase()) index = i;
+        }
+        if (index !== -1) {
+          e.responseHeaders.splice(index, 1);
+          if (config.debug_mode) log("Delete response header :  name=" + to_modify.header_name.toLowerCase()
+            + " for url " + e.url);
+        }
+      }
+      else if (to_modify.action === "cookie_add_or_modify") {
+        let header_cookie = e.responseHeaders.find(header => 
+            header.name.toLowerCase() === "set-cookie" && 
+            header.value.toLowerCase().trim().startsWith(to_modify.header_name.toLowerCase()+"=")
+        );
+        let new_header_value = set_cookie_modify_cookie_value(header_cookie === undefined ? "" : header_cookie.value, to_modify.header_name, to_modify.header_value);
+        if (header_cookie === undefined) {
+          log("SimpleModifyHeaders.Warning: you're using cookie_add_or_modify in Response. While adding new cookie in response, this plugin only generates `Set-Cookie: cookie-name=cookie-value `, without ANY additional attributes. Add a `Set-Cookie` header if you need them. ");
+          e.responseHeaders.push({"name": "Set-Cookie", "value": new_header_value});
+          if (config.debug_mode) log("cookie_add_or_modify.resp new_header : name=Cookie,value=" + new_header_value + " for url " + e.url);
+        }
+        else {
+          header_cookie.value = new_header_value;
+          if (config.debug_mode) log("cookie_add_or_modify.resp modify_header : name=Cookie,value=" + new_header_value + " for url " + e.url);
+        }
+      }
+      else if (to_modify.action === "cookie_delete") {
+        let index = e.responseHeaders.findIndex(header => 
+            header.name.toLowerCase() === "set-cookie" && 
+            header.value.toLowerCase().trim().startsWith(to_modify.header_name.toLowerCase()+"=")
+        );
+        if (index === -1) {
+          if (config.debug_mode) log("cookie_delete.resp: no matching set-cookie header. doing nothing for url " + e.url);
+        }
+        else {
+          e.responseHeaders.splice(index, 1);
+          if (config.debug_mode) log("cookie_delete.resp delete_header : name=" + to_modify.header_name + " for url " + e.url);
+        }
+      }
+    }
+  }
+  if (config.debug_mode) log("End modify response headers for url " + e.url);
+  return { responseHeaders: e.responseHeaders };
+}
+
+
+/*
+* Listen for message form config.js
+* if message is reload : reload the configuration
+* if message is on : start the modify header
+* if message is off : stop the modify header
+*
+**/
+function notify(message) {
+  if (message === "reload") {
+    if (config.debug_mode) log("Reload configuration");
+    loadFromBrowserStorage(['config'], function (result) {
+      config = JSON.parse(result.config);
+      if (started === "on") {
+        removeListener();
+        addListener();
+      }
+    });
+  }
+  else if (message === "off") {
+    removeListener();
+    started = "off";
+    if (config.debug_mode) log("Stop modifying headers");
+  }
+  else if (message === "on") {
+    addListener();
+    started = "on";
+    if (config.debug_mode) log("Start modifying headers");
+  }
+}
+
+/*
+* Add rewriteRequestHeader as a listener to onBeforeSendHeaders, only for the target pages.
+* Add rewriteResponseHeader as a listener to onHeadersReceived, only for the target pages.
+* Make it "blocking" so we can modify the headers.
+*/
+function addListener() {
+  //return;
+  let target = "<all_urls>";
+  // need to had "extraHeaders" option for chrome https://developer.chrome.com/extensions/webRequest#life_cycle_footnote
+  if (isChrome) {
+    chrome.webRequest.onBeforeSendHeaders.addListener(rewriteRequestHeader,
+      { urls: target.split(";") },
+      ["blocking", "requestHeaders", "extraHeaders"]);
+
+    chrome.webRequest.onHeadersReceived.addListener(rewriteResponseHeader,
+      { urls: target.split(";") },
+      ["blocking", "responseHeaders", "extraHeaders"]);
+  }
+
+  else {
+    chrome.webRequest.onBeforeSendHeaders.addListener(rewriteRequestHeader,
+      { urls: target.split(";") },
+      ["blocking", "requestHeaders"]);
+    chrome.webRequest.onHeadersReceived.addListener(rewriteResponseHeader,
+      { urls: target.split(";") },
+      ["blocking", "responseHeaders"]);
+  }
+
+}
+
+
+/*
+* Remove the two listener
+*
+*/
+function removeListener() {
+  chrome.webRequest.onBeforeSendHeaders.removeListener(rewriteRequestHeader);
+  chrome.webRequest.onHeadersReceived.removeListener(rewriteResponseHeader);
+}
+
+

+ 23 - 0
addin/res/VTMModifyHeaders/manifest.json

@@ -0,0 +1,23 @@
+{
+  "description": "Modify Headers on VTM Devices",
+  "manifest_version": 2,
+  "name": "VTModifyHeaders",
+  "version": "1.0.0",
+  "icons": {
+  },
+  "permissions": [
+    "storage",
+    "webRequest",
+    "webRequestBlocking",
+    "<all_urls>",
+    "file:///D:/Run/runinfo/runcfg/config.json"
+  ],
+  "background": {
+    "scripts": [
+      "background.js"
+    ]
+  },
+  "browser_action": {
+    "default_title": "VTModifyHeaders"
+  }
+}