Эх сурвалжийг харах

Merge branch 'ST2' into dev_compiler_upgrade

80374374 1 жил өмнө
parent
commit
7a1df9d081
86 өөрчлөгдсөн 4423 нэмэгдсэн , 4814 устгасан
  1. 3 2
      CMakeLists.txt
  2. 2 2
      DevAdapter/self/liblog4vendor/log4cplus_helper.cpp
  3. 1 0
      DevAdapter/self/liblog4vendor/log4cplus_helper.h
  4. 2 2
      DevAdapter/self/liblog4vendor/log4upload.cpp
  5. 3 1
      DevAdapter/self/liblog4vendor/log4vendor.cpp
  6. 4 0
      Module/CMakeLists.txt
  7. 12 40
      Module/include/DevEntityCommBase.hpp
  8. 1 0
      Module/mod_CardIssuerStand/CMakeLists.txt
  9. 0 449
      Module/mod_CardIssuerStand/CardIssuer.xml
  10. 13 1
      Module/mod_CardIssuerStand/CardIssuerFSM.cpp
  11. 2 2
      Module/mod_CardIssuerStand/CardIssuerFSM.h
  12. 10 4
      Module/mod_CardIssuerStand/CardIssuer_UserErrorCode.h
  13. 0 1607
      Module/mod_CardIssuerStand/CardIssuer_client_g.h
  14. 0 999
      Module/mod_CardIssuerStand/CardIssuer_def_g.h
  15. 0 45
      Module/mod_CardIssuerStand/CardIssuer_msg_g.h
  16. 0 1001
      Module/mod_CardIssuerStand/CardIssuer_server_g.h
  17. 4 0
      Module/mod_CardIssuerStand/mod_cardissuer.h
  18. 2 2
      Module/mod_CenterSetting/CenterSettingConn.cpp
  19. 6 6
      Module/mod_FingerPrint/FingerPrintFSM.cpp
  20. 3 1
      Module/mod_FingerPrint/FingerPrintFSM.h
  21. 2 1
      Module/mod_FingerPrint/mod_FingerPrint.h
  22. 10 0
      Module/mod_IDCertificate/mod_IDCertificate.h
  23. 2 2
      Module/mod_ResourceWatcher/ResourceWatcherFSM.cpp
  24. 43 4
      Module/mod_ResourceWatcher/mod_ResourceWatcher.cpp
  25. 7 7
      Module/mod_accessauth/AccessAuthFSM.cpp
  26. 1 1
      Module/mod_accessauth/AccessAuthFSM.h
  27. 73 18
      Module/mod_accessauth/mod_AccessAuth.cpp
  28. 3 0
      Module/mod_accessauth/mod_AccessAuth.h
  29. 1 1
      Module/mod_alarm/AlarmFSM.cpp
  30. 33 33
      Module/mod_cardissuer/CardIssuer.xml
  31. 14 2
      Module/mod_cardissuer/CardIssuerFSM.cpp
  32. 2 2
      Module/mod_cardissuer/CardIssuerFSM.h
  33. 10 4
      Module/mod_cardissuer/CardIssuer_UserErrorCode.h
  34. 4 0
      Module/mod_cardissuer/mod_cardissuer.h
  35. 13 20
      Module/mod_chromium/CModTools.cpp
  36. 2 0
      Module/mod_chromium/CSocketClient.cpp
  37. 3 1
      Module/mod_chromium/CWebsocketServer.cpp
  38. 2 0
      Module/mod_chromium/CWebsocketServer.h
  39. 2 0
      Module/mod_chromium/mod_chromium.cpp
  40. 5 7
      Module/mod_chromium/mod_chromium.h
  41. 5 11
      Module/mod_counterconnector/ConnectorFSM.cpp
  42. 2 21
      Module/mod_counterconnector/ConnectorFSM.h
  43. 10 35
      Module/mod_counterconnector/mod_counterconnector.cpp
  44. 4 1
      Module/mod_counterconnector/mod_counterconnector.h
  45. 11 7
      Module/mod_healthmanager/HealthManagerFSM.cpp
  46. 9 6
      Module/mod_healthmanager/mod_healthmanager.cpp
  47. 10 0
      Module/mod_healthmanager/mod_healthmanager.h
  48. 3 0
      Module/mod_interactivecontrol/Event.h
  49. 45 0
      Module/mod_interactivecontrol/InteractiveControl.xml
  50. 308 0
      Module/mod_interactivecontrol/InteractiveControl_client_g.h
  51. 143 0
      Module/mod_interactivecontrol/InteractiveControl_def_g.h
  52. 192 0
      Module/mod_interactivecontrol/InteractiveControl_server_g.h
  53. 259 63
      Module/mod_interactivecontrol/mod_interactivecontrol.cpp
  54. 40 7
      Module/mod_interactivecontrol/mod_interactivecontrol.h
  55. 0 4
      Module/mod_livenessdetection/unix/mod_livenessdetection.cpp
  56. 2 0
      Module/mod_recorder/CMakeLists.txt
  57. 2 1
      Module/mod_recorder/Event.h
  58. 44 17
      Module/mod_recorder/mod_recorder.h
  59. 80 0
      Module/mod_recorder/recordinfo.cpp
  60. 90 0
      Module/mod_recorder/recordinfo.h
  61. 755 55
      Module/mod_recorder/unix/mod_recorder.cpp
  62. 3 6
      Module/mod_sipphone/Event.h
  63. 196 0
      Module/mod_sipphone/SIPPhone_client_g.h
  64. 102 0
      Module/mod_sipphone/SIPPhone_def_g.h
  65. 108 0
      Module/mod_sipphone/SIPPhone_server_g.h
  66. 28 0
      Module/mod_sipphone/SipService.xml
  67. 20 14
      Module/mod_sipphone/mod_sipphone.h
  68. 3 16
      Module/mod_sipphone/unix/endpoint.cpp
  69. 253 191
      Module/mod_sipphone/unix/mod_sipphone.cpp
  70. 796 15
      Module/mod_vtmloader/VtmLoaderFSM.cpp
  71. 87 6
      Module/mod_vtmloader/VtmLoaderFSM.h
  72. 5 0
      Module/mod_vtmloader/VtmLoader_UserCode.h
  73. 155 8
      Module/mod_vtmloader/VtmLoader_client_g.h
  74. 96 7
      Module/mod_vtmloader/VtmLoader_def_g.h
  75. 87 9
      Module/mod_vtmloader/VtmLoader_server_g.h
  76. 16 4
      Module/mod_vtmloader/mod_vtmloader.cpp
  77. 33 13
      Module/mod_vtmloader/mod_vtmloader.h
  78. 4 0
      Module/mod_vtmloader/tokenDefine.h
  79. 50 3
      Module/mod_vtmloader/vtmloader.xml
  80. 41 9
      Other/libRestfulFunc/RestfulFunc.h
  81. 7 0
      Other/libRestfulFunc/RestfulFuncImpl.cpp
  82. 3 3
      Other/libRestfulFunc/test/testNormlReqAns.cpp
  83. 1 1
      Other/liblog4rvcother/log4cplus_helper.cpp
  84. 6 5
      Other/unix/libvideorecord/libvideorecord_impl.cpp
  85. 2 9
      Tool/guardian/guardian.cpp
  86. 7 0
      addin/cfg/UserCodeToMsgTip.ini

+ 3 - 2
CMakeLists.txt

@@ -284,8 +284,8 @@ if(CONAN_CACHE_CLEAR)
 	conan_local_remove()
 endif(CONAN_CACHE_CLEAR)
 
-conan_cmake_run(REQUIRES RvcFramework/1.10.1.3@LR04.02_FrameworkLib/dev
-	Audio/2023.0509.01@LR04.02_MediaRes/testing
+conan_cmake_run(REQUIRES RvcFramework/1.2.0.97@LR04.02_FrameworkLib/dev
+	Audio/2024.0118.01@LR04.02_MediaRes/testing
 BASIC_SETUP CMAKE_TARGETS)
 
 include(DependencyConanFiles)
@@ -687,6 +687,7 @@ install(DIRECTORY "${CMAKE_SOURCE_DIR}/addin/cfg" DESTINATION "${PACK_INSTALL_PR
 install(FILES ${CMAKE_BINARY_DIR}/env.ini DESTINATION ${RVC_CONFIG_PATH} COMPONENT scripts)
 
 set(active_txt_file "${CMAKE_BINARY_DIR}/active.txt")
+message(STATUS "RVC_VERSION = ${RVC_VERSION}, RVC_VERSION_MAJOR=${RVC_VERSION_MAJOR}, RVC_VERSION_MINOR=${RVC_VERSION_MINOR}, RVC_VERSION_REVISION=${RVC_VERSION_REVISION}, RVC_VERSION_SUFFIX=${RVC_VERSION_SUFFIX}")
 file(WRITE ${active_txt_file} "${RVC_VERSION}")
 install(FILES ${active_txt_file} DESTINATION ${PACK_INSTALL_PREFIX_VERSION} COMPONENT scripts)
 # Install RunInfo Directory

+ 2 - 2
DevAdapter/self/liblog4vendor/log4cplus_helper.cpp

@@ -68,7 +68,7 @@ namespace cmb {
 		:_append_console(NULL),_append_file(NULL),_append_socket(NULL),_append_none(NULL)
 		,_socket_send_running(false)
 	    ,_initialized(false),_append_type(0),_log_server_port(0),_log_listen_port(0)
-		,_initilzed_zip(false),_cur_upload_log(""),_cur_upload_offset(0),_log_level(NOT_SET_LOG_LEVEL)
+		,_initilzed_zip(false),_cur_upload_log(""),_cur_upload_offset(0),_log_level(NOT_SET_LOG_LEVEL), _initialize_uploaded(false)
 	{
 		_log_dir.clear();
 		_log_server_ip.clear();
@@ -346,7 +346,7 @@ namespace cmb {
 	{
 #if !defined(NDEBUG)
 		if(_initialized) {
-			LOG4PLUS_LOG(INFO, get_logger(), text.c_str());
+			LOG4PLUS_LOG(DEBUG, get_logger(), text.c_str());
 			loglink(LOG_LEVEL_DEBUG, text);
 		}
 #endif //!defined(NDEBUG)

+ 1 - 0
DevAdapter/self/liblog4vendor/log4cplus_helper.h

@@ -175,6 +175,7 @@ namespace cmb {
 
 		int _log_level;
 
+		bool _initialize_uploaded;
 		upload_helper _upload_helper;
 	};
 }

+ 2 - 2
DevAdapter/self/liblog4vendor/log4upload.cpp

@@ -191,7 +191,7 @@ bool upload_helper::initialize(const cmb::log_init_config& cfg)
         pinst_log_producer_config_set_max_buffer_limit(config, 64 * 1024 * 1024);
         //set send thread count
         pinst_log_producer_config_set_send_thread_count(config, 2);
-        pinst_log_producer_config_set_persistent_max_log_count(config, 20 * 1000);
+        pinst_log_producer_config_set_persistent_max_log_count(config, 50 * 1000);
         pinst_log_producer_config_set_skyeye_servname(config, (char*)"Terminal");
         pinst_log_producer_config_set_skyeye_cmptId(config, (char*)"LR04");
         pinst_log_producer_config_set_skyeye_cmptname(config, (char*)"FrameworkLib");
@@ -216,7 +216,7 @@ bool upload_helper::initialize(const cmb::log_init_config& cfg)
 
         //新加统一日志配置
         pinst_log_producer_config_set_united_appname(config, (char*)"LR04");
-        pinst_log_producer_config_set_united_version(config, (char*)"1.0");
+        pinst_log_producer_config_set_united_version(config, (char*)"2.0");
         pinst_log_producer_config_set_united_needArchived(config, 0);
         pinst_log_producer_config_set_united_deployUnitId(config, (char*)"LR04.02@FrameworkLib_PRD_PRD");
         pinst_log_producer_config_set_united_serviceUnitId(config, (char*)"LR04.02_FrameworkLib");

+ 3 - 1
DevAdapter/self/liblog4vendor/log4vendor.cpp

@@ -87,6 +87,8 @@ namespace cmb {
 		const std::string record_type = toupper(env.record_type);
 		if(record_type.find("FILE") != std::string::npos)
 			config->log_type |= CMB_LOG_TYPE_FILE;
+		if (record_type.find("UPLOAD") != std::string::npos)
+			config->log_type |= CMB_LOG_TYPE_SOCKET;
 
 		/*get log level*/
 		const std::string record_level = toupper(env.record_level);
@@ -205,7 +207,7 @@ namespace cmb {
 
 		/*提前在这里赋值,以便让 LOG4VTM 宏生效*/
 		log4plus_initialized = true;
-        if (is_vtm_env) {
+        if (is_vtm_env && (lhs->log_type & CMB_LOG_TYPE_SOCKET) != 0) {
             log4cplus_helper::get_instance()->initialize_linklog(*lhs);
         }
 		LOG4VTM(INFO, "==============Log4Vendor(" << instance_name << ") start==============");

+ 4 - 0
Module/CMakeLists.txt

@@ -72,6 +72,10 @@ macro(add_module_libraries _module_prefix _module_name _module_version)
         ${CMAKE_CURRENT_BINARY_DIR}/version.rc
         @ONLY)
         set(${_module_prefix}_SRCS ${${_module_prefix}_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/version.rc)
+    else()
+        add_definitions(
+        -DRVC_VERSION_STR="${RVC_VERSION}"
+    )
     endif(WIN32)
 
     set(${_module_name}_TEST_SRCS)

+ 12 - 40
Module/include/DevEntityCommBase.hpp

@@ -248,48 +248,20 @@ inline void CDevAdptEntityBase::InitializeVendorLogSwitch()
 	}
 
 	bool fromLocal = false;
-	/*�Ӽ������ö�ȡ�Ŀ���Ϊ�رգ����Զ�ȡ���ص�����*/
-	if (stLogConfig.strLevel.Compare("OFF", true) == 0) {
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Try to read from global settings.");
-		CSmartPointer<IConfigInfo> spConfig;
-		ErrorCodeEnum erroCode = GetFunction()->OpenConfig(Config_Cache, spConfig);
-
-		CAutoArray<CSimpleStringA> adapters;
-		spConfig->ReadAllKeys("AdapterLogSwith", adapters);
-		CSimpleStringA strKey(true);
-		for (int i = 0; i < adapters.GetCount(); ++i) {
-            DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%d: %s, %s", i, adapters[i].GetData(), GetEntityName());
-			if (adapters[i].Compare(GetEntityName(), true) == 0) {
-				strKey = adapters[i];
-				break;
-			}
-		}
-		if (!strKey.IsNullOrEmpty()) {
-			CSimpleStringA strValue(true);
-			spConfig->ReadConfigValue("AdapterLogSwith", strKey, strValue);
-			CAutoArray<CSimpleStringA> settings;
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Value: %s", strValue.GetData());
-			if (!strValue.IsNullOrEmpty() && (settings = strValue.Split(',')).GetCount() == 2) {
-				if (settings[0].GetLength() == 1 && atoi(settings[0]) >= 1 && settings[1].GetLength() == 1) {
-					if (settings[1].Compare("1") == 0)  stLogConfig.strLevel = "Fatal";
-					else if (settings[1].Compare("2") == 0)  stLogConfig.strLevel = "Error";
-					else if (settings[1].Compare("3") == 0)  stLogConfig.strLevel = "Warn";
-					else if (settings[1].Compare("4") == 0)  stLogConfig.strLevel = "Info";
-					else if (settings[1].Compare("5") == 0)  stLogConfig.strLevel = "Trace";
-					else stLogConfig.strLevel = "All";
-					fromLocal = true;
-				}
-			}
-		}
-	} 
-
 	if (stLogConfig.strLevel.Compare("OFF", true) != 0) {
 
-		str.Clear();
-		centerConfig->ReadConfigValue(GetEntityName(), "Type", str);
-		if (!str.IsNullOrEmpty())
-			stLogConfig.strType = str;
-
+		//str.Clear();
+		//centerConfig->ReadConfigValue(GetEntityName(), "Type", str);
+		//if (!str.IsNullOrEmpty())
+		//	stLogConfig.strType = str;
+
+		stLogConfig.strType = "UPLOAD";
+		int nSaveFileOrNot(0);
+		centerConfig->ReadConfigValueInt("Common", "SaveFile", nSaveFileOrNot);
+		if ((nSaveFileOrNot & 1) == 1) {
+			if (!stLogConfig.strType.IsNullOrEmpty()) stLogConfig.strType += "|";
+			stLogConfig.strType += "FILE";
+		}
 		GetFunction()->GetPath("Dbg", stLogConfig.strLogPath);
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Dbg: %s", stLogConfig.strLogPath.GetData());
 		stLogConfig.Settle();

+ 1 - 0
Module/mod_CardIssuerStand/CMakeLists.txt

@@ -16,6 +16,7 @@ target_include_directories(${MODULE_NAME} PRIVATE
 	${ModuleCommonHeadPath}
 	${MODULE_BASE_DIR}/mod_heartbeat
 	${MODULE_BASE_DIR}/mod_accessauth
+	${MODULE_BASE_DIR}/mod_cardissuer
 	${RVC_OTHER_DEPENDENIES_DIR}/libpublicFun
 	${CONAN_INCLUDE_DIRS_OPENSSL}
 	${CONAN_INCLUDE_DIRS_JSONCPP}

+ 0 - 449
Module/mod_CardIssuerStand/CardIssuer.xml

@@ -1,449 +0,0 @@
-<?xml version="1.0" encoding="gb2312" ?>
-<entity name="CardIssuer">
-	<class name="CardIssuerService" overlap="true" exclusive="false">	
-		<twoway name="Insert" overlap="true">
-			<req>
-				<param name="aid" type="string"/>
-			</req>
-			<res>
-			</res>			
-		</twoway>
-		<oneway name="CancelInsert" overlap="true">			
-		</oneway>
-		<oneway name="InsertWaitMore" overlap="true">			
-		</oneway>					
-		<twoway name="Read" overlap="true">
-			<req>
-				<param name="aid" type="string"/>
-				<param name="reserved1" type="int"/>
-				<param name="reserved2" type="int"/>
-				<param name="reserved3" type="string"/>
-				<param name="reserved4" type="string"/>
-			</req>
-			<res>
-				<param name="track1" type="string"/>
-				<param name="track2" type="string"/>
-				<param name="track3" type="string"/>
-				<param name="ICType" type="int"/>
-				<param name="ICData" type="string"/>
-				<param name="status" type="int" />
-				<param name="t2Account" type="string" />
-				<param name="t2Region" type="string" />
-				<param name="t2CardSerial" type="string" />
-				<param name="t2CVC" type="string" />
-				<param name="t2ExpireDate" type="string" />
-				<param name="reserved1" type="int"/>
-				<param name="reserved2" type="int"/>
-				<param name="reserved3" type="string"/>
-				<param name="reserved4" type="string"/>
-			</res>
-		</twoway>			
-		<twoway name="Capture" overlap="true">
-			<req>
-			</req>
-			<res>
-			</res>			
-		</twoway>
-		<twoway name="Eject" overlap="true">
-			<req>
-			</req>
-			<res>
-			</res>			
-		</twoway>						
-		<twoway name="PreOnline" overlap="true">
-			<req>
-				<param name="businessData" type="string"/>
-				<param name="reserved1" type="string"/>
-				<param name="reserved2" type="string"/>
-			</req>
-			<res>
-				<param name="result" type="string"/>
-			</res>			
-		</twoway>
-		<twoway name="PostOnline" overlap="true">
-			<req>
-				<param name="data" type="string"/>
-			</req>
-			<res>
-				<param name="result" type="string"/>
-			</res>			
-		</twoway>
-		<oneway name="Exit" overlap="true">			
-		</oneway>			
-		<twoway name="Issue" overlap="true">
-			<req>
-			</req>
-			<res>
-			</res>			
-		</twoway>				
-		<twoway name="GetMaterialCount" overlap="true">
-			<req>
-			</req>
-			<res>
-				<param name="remains" type="int"/>
-				<param name="captured" type="int"/>
-				<param name="issued" type="int"/>
-				<param name="mixed" type="int"/>
-			</res>			
-		</twoway>
-		<twoway name="SetMaterialCount" overlap="true">
-			<req>
-				<param name="remains" type="int"/>
-				<param name="captured" type="int"/>
-				<param name="issued" type="int"/>
-				<param name="bRemains" type="bool"/>
-				<param name="bCaptured" type="bool"/>				
-				<param name="bIssued" type="bool"/>
-				<param name="mixed" type="int"/>
-				<param name="bMixed" type="bool"/>
-			</req>
-			<res>
-			</res>			
-		</twoway>
-		<oneway name="SetIssueFlag" overlap="true">			
-		</oneway>
-		<twoway name="ReadEx" overlap="true">
-			<req>
-				<param name="aid" type="string"/>
-				<param name="reserved1" type="string"/>
-				<param name="reserved2" type="string"/>
-			</req>
-			<res>
-				<param name="track1" type="string"/>
-				<param name="track2" type="string"/>
-				<param name="track3" type="string"/>
-				<param name="CDType" type="int"/>
-				<param name="ICType" type="int"/>
-				<param name="CMBType" type="int"/>
-				<param name="ICData" type="string"/>
-				<param name="status" type="int" />
-				<param name="t2Account" type="string" />
-				<param name="t2Region" type="string" />
-				<param name="t2CardSerial" type="string" />
-				<param name="t2CVC" type="string" />
-				<param name="t2ExpireDate" type="string" />
-				<param name="reserved1" type="string"/>
-				<param name="reserved2" type="string"/>
-			</res>
-		</twoway>
-		<twoway name="QueryCardInfo" overlap="true">
-			<req>
-			</req>
-			<res>
-				<param name="position" type="int"/>
-				<param name="reserved1" type="int"/>
-				<param name="reserved2" type="string"/>
-			</res>			
-		</twoway>
-		<twoway name="WriteTrack" overlap="true">
-			<req>
-				<param name="mode" type="int"/>
-				<param name="co" type="int"/>
-				<param name="track1" type="wstring"/>
-				<param name="track2" type="wstring"/>
-				<param name="track3" type="wstring"/>
-				<param name="reserved" type="wstring"/>
-			</req>
-			<res>
-				<param name="result" type="int"/>
-				<param name="reserved1" type="int"/>
-				<param name="reserved2" type="string"/>
-			</res>
-		</twoway>
-		<twoway name="GetMaterialCountEx" overlap="true">
-			<req>
-				<param name="GetHopper" type="array_int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>		
-			</req>
-			<res>
-				<param name="captured" type="int"/>
-				<param name="hasHopper" type="array_int"/>
-				<param name="CardBoxNo" type="array_string"/>
-				<param name="PsbCode" type="array_string"/>
-				<param name="PsbName" type="array_string"/>
-				<param name="Maintainer" type="array_string"/>
-				<param name="MaintainTime" type="array_string"/>
-				<param name="CardInit" type="array_int"/>
-				<param name="CardPercent" type="array_int"/>
-				<param name="remains" type="array_int"/>
-				<param name="issued" type="array_int"/>
-				<param name="mixed" type="array_int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>
-			</res>			
-		</twoway>
-		<twoway name="SetMaterialCountEx" overlap="true">
-			<req>
-				<param name="SetHopper" type="array_int"/>
-				<param name="SetCaptured" type="int"/>
-				<param name="captured" type="int"/>
-				<param name="CardBoxNo" type="array_string"/>
-				<param name="PsbCode" type="array_string"/>
-				<param name="PsbName" type="array_string"/>
-				<param name="Maintainer" type="array_string"/>
-				<param name="MaintainTime" type="array_string"/>
-				<param name="CardInit" type="array_int"/>
-				<param name="CardPercent" type="array_int"/>
-				<param name="remains" type="array_int"/>
-				<param name="issued" type="array_int"/>
-				<param name="mixed" type="array_int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>
-			</req>
-			<res>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>	
-			</res>			
-		</twoway>
-		<twoway name="SetSomeFlag" overlap="true">
-			<req>
-				<param name="IssueBusiness" type="int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>					
-			</req>
-			<res>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>
-			</res>				
-		</twoway>
-		<twoway name="GetSCIInfo" overlap="true">
-			<req>
-			</req>
-			<res>
-				<param name="connected" type="int"/>
-				<param name="DevSN" type="string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>
-			</res>			
-		</twoway>
-		<twoway name="IssueEx" overlap="true">
-			<req>
-				<param name="hopper" type="int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>			
-			</req>
-			<res>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>					
-			</res>			
-		</twoway>
-		<twoway name="OpenSafeLock" overlap="true">
-			<req>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>			
-			</req>
-			<res>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>					
-			</res>			
-		</twoway>
-		<twoway name="SAMICCommand" overlap="true">
-			<req>
-				<param name="cmdType" type="int"/>
-				<param name="param1" type="array_int"/>
-				<param name="param2" type="array_string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>			
-			</req>
-			<res>
-				<param name="ret1" type="array_int"/>
-				<param name="ret2" type="array_string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>					
-			</res>			
-		</twoway>
-		<twoway name="QueryPrinterStatus" overlap="true">
-			<req>
-				<param name="param1" type="array_int"/>
-				<param name="param2" type="array_string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>			
-			</req>
-			<res>
-				<param name="ret1" type="array_int"/>
-				<param name="ret2" type="array_string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>					
-			</res>			
-		</twoway>
-		<twoway name="Print" overlap="true">
-			<req>
-				<param name="data1" type="blob"/>
-				<param name="data2" type="blob"/>
-				<param name="data3" type="blob"/>
-				<param name="data4" type="blob"/>
-				<param name="data5" type="blob"/>
-				<param name="data6" type="blob"/>				
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>			
-			</req>
-			<res>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>					
-			</res>			
-		</twoway>
-		<twoway name="QuerySCIList" overlap="true">
-			<req>			
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>			
-			</req>
-			<res>
-				<param name="sciNo" type="array_string"/>
-        <param name="arrMateriel" type="array_string"/>
-        <param name="CardGroove" type="array_string"/>
-        <param name="CardBoxNo" type="array_string"/>
-        <param name="PsbCode" type="array_string"/>
-        <param name="PsbName" type="array_string"/>
-        <param name="CardInit" type="array_uint"/>
-        <param name="CardRemains" type="array_uint"/>
-        <param name="CardIssued" type="array_uint"/>
-        <param name="CardMixed" type="array_uint"/>
-        <param name="CardPercent" type="array_uint"/>
-        <param name="Maintainer" type="array_string"/>
-        <param name="MaintainTime" type="array_string"/>
-        <param name="UpdateTime" type="array_string"/>				
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>					
-			</res>			
-		</twoway>		
-		<twoway name="BindSCI" overlap="true">
-			<req>
-				<param name="type" type="int"/>
-				<param name="sciNo" type="string" />			
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>			
-			</req>
-			<res>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>					
-			</res>			
-		</twoway>
-		<twoway name="PreOnlineOnStore" overlap="true">
-			<req>
-				<param name="account" type="string"/>
-				<param name="termNo" type="string"/>
-				<param name="businessData" type="string"/>
-				<param name="slot" type="int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>
-			</req>
-			<res>
-				<param name="findCard" type="int"/>
-				<param name="cardPos" type="int"/>
-				<param name="result" type="string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>				
-			</res>			
-		</twoway>
-		<twoway name="NotifyPreonline" overlap="true">
-			<req>
-				<param name="findCard" type="int"/>
-				<param name="cardPos" type="int"/>			
-				<param name="errCode" type="int"/>			
-				<param name="account" type="string"/>
-				<param name="termNo" type="string"/>
-				<param name="data" type="string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>
-			</req>
-			<res>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>				
-			</res>			
-		</twoway>
-		<twoway name="QueryCardInfoOnStore" overlap="true">
-			<req>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>
-			</req>
-			<res>
-				<param name="findCard" type="int"/>
-				<param name="cardPos" type="int"/>					
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>				
-			</res>			
-		</twoway>
-		<twoway name="GetAddCardInfo" overlap="true">
-			<req>
-				<param name="isSync" type="int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>
-			</req>
-			<res>
-				<param name="count" type="int"/>
-				<param name="slot" type="array_int"/>
-				<param name="account" type="array_string"/>							
-				<param name="cardSerial" type="array_string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>				
-			</res>			
-		</twoway>		
-		<twoway name="PrintCardImmediately" overlap="true">
-			<req>
-				<param name="formFile" type="string"/>
-				<param name="printData" type="string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>
-			</req>
-			<res>
-				<param name="ret" type="int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>				
-			</res>			
-		</twoway>
-		<twoway name="QueryCIStatus" overlap="true">
-			<req>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>
-			</req>
-			<res>
-				<param name="retainBin" type="int"/>
-				<param name="hopperNo" type="array_int"/>
-				<param name="hopperStatus" type="array_int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>				
-			</res>			
-		</twoway>																		
-		<twoway name="GetDevInfo" overlap="true" method_id="65535">
-			<req>
-			</req>
-			<res>
-				<param name="type" type="string" />
-				<param name="model" type="string" />
-				<param name="version" type="string" />
-				<param name="state" type="int" />
-			</res>			
-		</twoway>							
-	</class>
-	<message name="FetchCard">
-			<param name="status" type="int"/>
-	</message>
-	<message name="SCIConnect">
-			<param name="status" type="int"/>
-	</message>			
-</entity>

+ 13 - 1
Module/mod_CardIssuerStand/CardIssuerFSM.cpp

@@ -5216,6 +5216,7 @@ int CCardIssuerFSM::SplitDevModelInfo()
 		return -1;
 	}
 	m_csCM = "";
+	m_csRF = "";
 	CSimpleStringA csTmpModel(m_devCat.szModel);
 	CAutoArray<CSimpleStringA> arrParam;
 	arrParam.Init(16);
@@ -5226,6 +5227,11 @@ int CCardIssuerFSM::SplitDevModelInfo()
 		{
 			m_csCM = arrParam[i].SubString(3, arrParam[i].GetLength() - 3);
 		}
+		if (_strnicmp(arrParam[i], "RF", 2) == 0)
+		{
+			m_csRF = arrParam[i].GetData();//获取非接支持的字段值
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("szModel: RF=%s", m_csRF.GetData());
+		}
 	}
 	return 0;
 }
@@ -5354,7 +5360,12 @@ bool CCardIssuerFSM::IfUseRf()
 {
 	if (m_bStopUseRF)
 		return false;
-	
+
+	//加入szmodel非接字段属性判断
+	if (m_csRF.Compare("Y") == 0) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("szModel,RF=%s", m_csRF.GetData());
+		return true;
+	}	
 	CAutoArray<CSimpleStringA> arr = m_rfVendorList.Split('|');
 	//Dbg("%s,%d", m_rfVendorList.GetData(),arr.GetCount());
 	for (int i = 0; i < arr.GetCount(); ++i)
@@ -5363,5 +5374,6 @@ bool CCardIssuerFSM::IfUseRf()
 		if (m_adapterInfo.adapterFilePath.IndexOf(arr[i].GetData()) > 0)
 			return true;
 	}
+
 	return false;
 }

+ 2 - 2
Module/mod_CardIssuerStand/CardIssuerFSM.h

@@ -956,8 +956,8 @@ private:
 
 	char *m_pDataToARQC;
 	long xxTest;
-	CSimpleStringA m_currCardNo, m_captureReason, m_csMachineType, m_csSite,m_terminalNo,m_addCardNo,m_addCardSerial
-		,m_csCM, m_rfVendorList, m_csDevSN;
+	CSimpleStringA m_currCardNo, m_captureReason, m_csMachineType, m_csSite, m_terminalNo, m_addCardNo, m_addCardSerial
+		, m_csCM, m_rfVendorList, m_csDevSN, m_csRF;
 	char m_AuthCode[2];
 	vector<CMBBin> m_vBin;
 	int SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData);

+ 10 - 4
Module/mod_CardIssuerStand/CardIssuer_UserErrorCode.h

@@ -37,7 +37,7 @@
 #define CardIssuer_UserErrorCode_NoCardRemains_Hopper6				(CardIssuer_UserErrorCode_Start + 30)	//卡箱6剩余卡片计数为0(空)
 #define CardIssuer_UserErrorCode_LogInfoAboutTerm					(CardIssuer_UserErrorCode_Start + 31)	//告警上送终端模块信息
 #define CardIssuer_UserErrorCode_KebaDeviceInfo						(CardIssuer_UserErrorCode_Start + 32)	//告警上送科堡机型信息
-//#define CardIssuer_UserErrorCode_RootInfo							(CardIssuer_UserErrorCode_Start + 33)  //root中版本批次号
+#define CardIssuer_UserErrorCode_RootInfo							(CardIssuer_UserErrorCode_Start + 33)  //root中版本批次号
 #define CardIssuer_UserErrorCode_Adapter_Version					(CardIssuer_UserErrorCode_Start + 34)//告警适配器版本号(长城卡库是将驱动版本号告警上来)
 #define CardIssuer_UserErrorCode_DevOpenTime						(CardIssuer_UserErrorCode_Start + 35) //统计DevOpen时长
 
@@ -53,6 +53,7 @@
 #define CardIssuer_UserErrorCode_PrintCardFaceRightNow				(CardIssuer_UserErrorCode_Start + 44) //卡面打印
 #define CardIssuer_UserErrorCode_InsertCardSucceed					(CardIssuer_UserErrorCode_Start + 45) //前端插卡
 
+#define CardIssuer_UserErrorCode_StandEntityInFailState				(CardIssuer_UserErrorCode_Start + 46)	//卡机处于故障态,请稍后重试,重试还有问题请联系厂商维护
 
 #define CardIssuer_UserErrorCode_CardStore_SlotNum					(CardIssuer_UserErrorCode_Start + 49) //记录卡库容量
 #define CardIssuer_UserErrorCode_Invoke_Access_IniDev_Failed		(CardIssuer_UserErrorCode_Start + 50) //建立加密通道时,调用准入接口失败
@@ -91,7 +92,7 @@
 #define CardIssuer_UserErrorCode_AddCardToStoreStepFirst			(CardIssuer_UserErrorCode_Start + 74)	//加卡第一步,从卡箱移到读卡器
 #define CardIssuer_UserErrorCode_AddCardToStoreStepLast				(CardIssuer_UserErrorCode_Start + 75)	//加卡第二步,从读卡器移到卡槽
 #define CardIssuer_UserErrorCode_ReadAccount_Data_Error				(CardIssuer_UserErrorCode_Start + 76)	//加卡过程,卡片数据有误
-//#define CardIssuer_UserErrorCode_FindFirstEmptySlot_Failed			(CardIssuer_UserErrorCode_Start + 77)	//加卡过程,未找到空卡槽
+#define CardIssuer_UserErrorCode_AddCardToStoreStepFirst_Failed		(CardIssuer_UserErrorCode_Start + 77)	//加卡过程,移卡到卡槽失败
 #define CardIssuer_UserErrorCode_NotifyPreonline_Wait_TooLong		(CardIssuer_UserErrorCode_Start + 78)	//NotifyPreonline收到时已经超过等待时间
 
 //临时 后续去除
@@ -183,7 +184,7 @@
 #define CardIssuer_UserErrorCode_HopperCardMixed					(CardIssuer_UserErrorCode_Start + 164)	//卡箱中的卡片放置不对
 #define CardIssuer_UserErrorCode_CardActive_CardStore_OffLine		(CardIssuer_UserErrorCode_Start + 165)	//跨机时卡库不在线
 #define CardIssuer_UserErrorCode_ReadByRF							(CardIssuer_UserErrorCode_Start + 166)	//非接读取成功
-#define CardIssuer_UserErrorCode_CardActive_CardStore_Issuing		(CardIssuer_UserErrorCode_Start + 167)	//跨机时卡库正在本地领卡
+#define CardIssuer_UserErrorCode_CardActive_CardStore_Issuing		(CardIssuer_UserErrorCode_Start + 167)	//跨机时卡库正在本地领卡或加卡
 #define CardIssuer_UserErrorCode_CardActive_CardStore_CallByOther	(CardIssuer_UserErrorCode_Start + 168)	//跨机时卡库正在其他VTM调用
 #define CardIssuer_UserErrorCode_ReadAccount_Cost_Time				(CardIssuer_UserErrorCode_Start + 169)	//ReadAccount耗时
 #define CardIssuer_UserErrorCode_CardActive_CardIssuer_InFaultState	(CardIssuer_UserErrorCode_Start + 170)	//卡库收到跨机请求时卡机未成功打开
@@ -202,4 +203,9 @@
 #define CardIssuer_UserErrorCode_Dev_CardJammed				(CardIssuer_UserErrorCode_Start + 189)//塞卡
 #define CardIssuer_UserErrorCode_Dev_SlotJammed				(CardIssuer_UserErrorCode_Start + 190)//卡槽堵塞
 #define CardIssuer_UserErrorCode_Dev_SlotInvalid			(CardIssuer_UserErrorCode_Start + 191)//卡槽地址非法(越界等)
-#endif //_CARDISSUER_USER_ERRORCODE_H
+
+//盘库异常明细报错
+#define CardIssuer_UserErrorCode_KakuPanKu_MoveCardFromSlot_Failed				(CardIssuer_UserErrorCode_Start + 200)	//卡库盘库失败,卡槽移卡失败
+#define CardIssuer_UserErrorCode_KakuPanKu_ReadAccount_Failed					(CardIssuer_UserErrorCode_Start + 201)	//卡库盘库失败,读卡失败吞卡
+#define CardIssuer_UserErrorCode_KakuPanKu_MoveCardToSlot_Failed				(CardIssuer_UserErrorCode_Start + 202)	//卡库盘库失败,卡移回卡槽失败
+#endif //_CARDISSUERSTAND_USER_ERRORCODE_H

+ 0 - 1607
Module/mod_CardIssuerStand/CardIssuer_client_g.h

@@ -1,1607 +0,0 @@
-
-#ifndef __CARDISSUER_CLIENT_G_H
-#define __CARDISSUER_CLIENT_G_H
-
-#pragma once
-
-// This code is generated by spgen tool!
-
-#include "CardIssuer_def_g.h"
-
-namespace CardIssuer {
-class CardIssuerService_ClientBase : public CClientSessionBase {
-public:
-	explicit CardIssuerService_ClientBase(CEntityBase *pEntity) : m_pEntityBase(pEntity), m_bSysManaged(false) {}
-
-	CardIssuerService_ClientBase* operator () (const linkContext &curLink) 
-	{
-		m_context = curLink;
-		return this;
-	}
-
-protected:
-	virtual ~CardIssuerService_ClientBase()
-	{
-		/// override by user
-	}
-public:
-
-	void OnConnectSucceed()
-	{
-		bSessionClosed = false;
-	}
-	void OnClose(ErrorCodeEnum)
-	{
-		Dbg("session closed.");
-		bSessionClosed = true;
-	}
-	bool QuerySessionClosed()
-	{
-		return bSessionClosed;
-	}
-	ErrorCodeEnum Connect(CSmartPointer<IAsynWaitSp> &spAsyncWait)
-	{
-		CSmartPointer<IEntityFunction> pFunc = m_pEntityBase->GetFunction();
-		ErrorCodeEnum Error = pFunc->ConnectRemoteEntity(this, "CardIssuer", "CardIssuerService", spAsyncWait);
-		if (Error == Error_Succeed) {
-			m_bSysManaged = true;
-			bSessionClosed = false;
-		}
-		return Error;
-	}
-	ErrorCodeEnum Connect()
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Connect(spAsyncWait);
-		if (Error == Error_Succeed) {
-			Error = spAsyncWait->WaitAnswer();
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum Insert(CardIssuerService_Insert_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_Insert, CardIssuerService_MethodSignature_Insert, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum Insert(CardIssuerService_Insert_Req &Req, CardIssuerService_Insert_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Insert(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Insert(CardIssuerService_Insert_Req &Req, CardIssuerService_Insert_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Insert(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Insert(CardIssuerService_Insert_Req &Req, CardIssuerService_Insert_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Insert(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum CancelInsert()
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->OnewayCall(CardIssuerService_Method_CancelInsert, CardIssuerService_MethodSignature_CancelInsert, m_context);
-		m_context.clear();
-		return ret;
-	}
-
-	ErrorCodeEnum InsertWaitMore()
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->OnewayCall(CardIssuerService_Method_InsertWaitMore, CardIssuerService_MethodSignature_InsertWaitMore, m_context);
-		m_context.clear();
-		return ret;
-	}
-
-	ErrorCodeEnum Read(CardIssuerService_Read_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_Read, CardIssuerService_MethodSignature_Read, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum Read(CardIssuerService_Read_Req &Req, CardIssuerService_Read_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Read(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Read(CardIssuerService_Read_Req &Req, CardIssuerService_Read_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Read(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Read(CardIssuerService_Read_Req &Req, CardIssuerService_Read_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Read(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum Capture(CardIssuerService_Capture_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_Capture, CardIssuerService_MethodSignature_Capture, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum Capture(CardIssuerService_Capture_Req &Req, CardIssuerService_Capture_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Capture(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Capture(CardIssuerService_Capture_Req &Req, CardIssuerService_Capture_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Capture(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Capture(CardIssuerService_Capture_Req &Req, CardIssuerService_Capture_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Capture(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum Eject(CardIssuerService_Eject_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_Eject, CardIssuerService_MethodSignature_Eject, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum Eject(CardIssuerService_Eject_Req &Req, CardIssuerService_Eject_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Eject(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Eject(CardIssuerService_Eject_Req &Req, CardIssuerService_Eject_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Eject(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Eject(CardIssuerService_Eject_Req &Req, CardIssuerService_Eject_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Eject(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum PreOnline(CardIssuerService_PreOnline_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_PreOnline, CardIssuerService_MethodSignature_PreOnline, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum PreOnline(CardIssuerService_PreOnline_Req &Req, CardIssuerService_PreOnline_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = PreOnline(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum PreOnline(CardIssuerService_PreOnline_Req &Req, CardIssuerService_PreOnline_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = PreOnline(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum PreOnline(CardIssuerService_PreOnline_Req &Req, CardIssuerService_PreOnline_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = PreOnline(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum PostOnline(CardIssuerService_PostOnline_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_PostOnline, CardIssuerService_MethodSignature_PostOnline, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum PostOnline(CardIssuerService_PostOnline_Req &Req, CardIssuerService_PostOnline_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = PostOnline(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum PostOnline(CardIssuerService_PostOnline_Req &Req, CardIssuerService_PostOnline_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = PostOnline(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum PostOnline(CardIssuerService_PostOnline_Req &Req, CardIssuerService_PostOnline_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = PostOnline(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum Exit()
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->OnewayCall(CardIssuerService_Method_Exit, CardIssuerService_MethodSignature_Exit, m_context);
-		m_context.clear();
-		return ret;
-	}
-
-	ErrorCodeEnum Issue(CardIssuerService_Issue_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_Issue, CardIssuerService_MethodSignature_Issue, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum Issue(CardIssuerService_Issue_Req &Req, CardIssuerService_Issue_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Issue(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Issue(CardIssuerService_Issue_Req &Req, CardIssuerService_Issue_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Issue(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Issue(CardIssuerService_Issue_Req &Req, CardIssuerService_Issue_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Issue(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum GetMaterialCount(CardIssuerService_GetMaterialCount_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_GetMaterialCount, CardIssuerService_MethodSignature_GetMaterialCount, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum GetMaterialCount(CardIssuerService_GetMaterialCount_Req &Req, CardIssuerService_GetMaterialCount_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetMaterialCount(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum GetMaterialCount(CardIssuerService_GetMaterialCount_Req &Req, CardIssuerService_GetMaterialCount_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetMaterialCount(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum GetMaterialCount(CardIssuerService_GetMaterialCount_Req &Req, CardIssuerService_GetMaterialCount_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetMaterialCount(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum SetMaterialCount(CardIssuerService_SetMaterialCount_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_SetMaterialCount, CardIssuerService_MethodSignature_SetMaterialCount, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum SetMaterialCount(CardIssuerService_SetMaterialCount_Req &Req, CardIssuerService_SetMaterialCount_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = SetMaterialCount(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum SetMaterialCount(CardIssuerService_SetMaterialCount_Req &Req, CardIssuerService_SetMaterialCount_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = SetMaterialCount(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum SetMaterialCount(CardIssuerService_SetMaterialCount_Req &Req, CardIssuerService_SetMaterialCount_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = SetMaterialCount(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum SetIssueFlag()
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->OnewayCall(CardIssuerService_Method_SetIssueFlag, CardIssuerService_MethodSignature_SetIssueFlag, m_context);
-		m_context.clear();
-		return ret;
-	}
-
-	ErrorCodeEnum ReadEx(CardIssuerService_ReadEx_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_ReadEx, CardIssuerService_MethodSignature_ReadEx, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum ReadEx(CardIssuerService_ReadEx_Req &Req, CardIssuerService_ReadEx_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = ReadEx(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum ReadEx(CardIssuerService_ReadEx_Req &Req, CardIssuerService_ReadEx_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = ReadEx(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum ReadEx(CardIssuerService_ReadEx_Req &Req, CardIssuerService_ReadEx_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = ReadEx(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum QueryCardInfo(CardIssuerService_QueryCardInfo_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_QueryCardInfo, CardIssuerService_MethodSignature_QueryCardInfo, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum QueryCardInfo(CardIssuerService_QueryCardInfo_Req &Req, CardIssuerService_QueryCardInfo_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = QueryCardInfo(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum QueryCardInfo(CardIssuerService_QueryCardInfo_Req &Req, CardIssuerService_QueryCardInfo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = QueryCardInfo(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum QueryCardInfo(CardIssuerService_QueryCardInfo_Req &Req, CardIssuerService_QueryCardInfo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = QueryCardInfo(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum WriteTrack(CardIssuerService_WriteTrack_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_WriteTrack, CardIssuerService_MethodSignature_WriteTrack, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum WriteTrack(CardIssuerService_WriteTrack_Req &Req, CardIssuerService_WriteTrack_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = WriteTrack(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum WriteTrack(CardIssuerService_WriteTrack_Req &Req, CardIssuerService_WriteTrack_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = WriteTrack(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum WriteTrack(CardIssuerService_WriteTrack_Req &Req, CardIssuerService_WriteTrack_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = WriteTrack(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum GetMaterialCountEx(CardIssuerService_GetMaterialCountEx_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_GetMaterialCountEx, CardIssuerService_MethodSignature_GetMaterialCountEx, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum GetMaterialCountEx(CardIssuerService_GetMaterialCountEx_Req &Req, CardIssuerService_GetMaterialCountEx_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetMaterialCountEx(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum GetMaterialCountEx(CardIssuerService_GetMaterialCountEx_Req &Req, CardIssuerService_GetMaterialCountEx_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetMaterialCountEx(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum GetMaterialCountEx(CardIssuerService_GetMaterialCountEx_Req &Req, CardIssuerService_GetMaterialCountEx_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetMaterialCountEx(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum SetMaterialCountEx(CardIssuerService_SetMaterialCountEx_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_SetMaterialCountEx, CardIssuerService_MethodSignature_SetMaterialCountEx, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum SetMaterialCountEx(CardIssuerService_SetMaterialCountEx_Req &Req, CardIssuerService_SetMaterialCountEx_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = SetMaterialCountEx(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum SetMaterialCountEx(CardIssuerService_SetMaterialCountEx_Req &Req, CardIssuerService_SetMaterialCountEx_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = SetMaterialCountEx(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum SetMaterialCountEx(CardIssuerService_SetMaterialCountEx_Req &Req, CardIssuerService_SetMaterialCountEx_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = SetMaterialCountEx(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum SetSomeFlag(CardIssuerService_SetSomeFlag_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_SetSomeFlag, CardIssuerService_MethodSignature_SetSomeFlag, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum SetSomeFlag(CardIssuerService_SetSomeFlag_Req &Req, CardIssuerService_SetSomeFlag_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = SetSomeFlag(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum SetSomeFlag(CardIssuerService_SetSomeFlag_Req &Req, CardIssuerService_SetSomeFlag_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = SetSomeFlag(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum SetSomeFlag(CardIssuerService_SetSomeFlag_Req &Req, CardIssuerService_SetSomeFlag_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = SetSomeFlag(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum GetSCIInfo(CardIssuerService_GetSCIInfo_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_GetSCIInfo, CardIssuerService_MethodSignature_GetSCIInfo, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum GetSCIInfo(CardIssuerService_GetSCIInfo_Req &Req, CardIssuerService_GetSCIInfo_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetSCIInfo(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum GetSCIInfo(CardIssuerService_GetSCIInfo_Req &Req, CardIssuerService_GetSCIInfo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetSCIInfo(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum GetSCIInfo(CardIssuerService_GetSCIInfo_Req &Req, CardIssuerService_GetSCIInfo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetSCIInfo(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum IssueEx(CardIssuerService_IssueEx_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_IssueEx, CardIssuerService_MethodSignature_IssueEx, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum IssueEx(CardIssuerService_IssueEx_Req &Req, CardIssuerService_IssueEx_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = IssueEx(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum IssueEx(CardIssuerService_IssueEx_Req &Req, CardIssuerService_IssueEx_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = IssueEx(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum IssueEx(CardIssuerService_IssueEx_Req &Req, CardIssuerService_IssueEx_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = IssueEx(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum OpenSafeLock(CardIssuerService_OpenSafeLock_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_OpenSafeLock, CardIssuerService_MethodSignature_OpenSafeLock, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum OpenSafeLock(CardIssuerService_OpenSafeLock_Req &Req, CardIssuerService_OpenSafeLock_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = OpenSafeLock(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum OpenSafeLock(CardIssuerService_OpenSafeLock_Req &Req, CardIssuerService_OpenSafeLock_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = OpenSafeLock(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum OpenSafeLock(CardIssuerService_OpenSafeLock_Req &Req, CardIssuerService_OpenSafeLock_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = OpenSafeLock(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum SAMICCommand(CardIssuerService_SAMICCommand_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_SAMICCommand, CardIssuerService_MethodSignature_SAMICCommand, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum SAMICCommand(CardIssuerService_SAMICCommand_Req &Req, CardIssuerService_SAMICCommand_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = SAMICCommand(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum SAMICCommand(CardIssuerService_SAMICCommand_Req &Req, CardIssuerService_SAMICCommand_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = SAMICCommand(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum SAMICCommand(CardIssuerService_SAMICCommand_Req &Req, CardIssuerService_SAMICCommand_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = SAMICCommand(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum QueryPrinterStatus(CardIssuerService_QueryPrinterStatus_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_QueryPrinterStatus, CardIssuerService_MethodSignature_QueryPrinterStatus, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum QueryPrinterStatus(CardIssuerService_QueryPrinterStatus_Req &Req, CardIssuerService_QueryPrinterStatus_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = QueryPrinterStatus(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum QueryPrinterStatus(CardIssuerService_QueryPrinterStatus_Req &Req, CardIssuerService_QueryPrinterStatus_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = QueryPrinterStatus(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum QueryPrinterStatus(CardIssuerService_QueryPrinterStatus_Req &Req, CardIssuerService_QueryPrinterStatus_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = QueryPrinterStatus(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum Print(CardIssuerService_Print_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_Print, CardIssuerService_MethodSignature_Print, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum Print(CardIssuerService_Print_Req &Req, CardIssuerService_Print_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Print(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Print(CardIssuerService_Print_Req &Req, CardIssuerService_Print_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Print(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Print(CardIssuerService_Print_Req &Req, CardIssuerService_Print_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Print(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum QuerySCIList(CardIssuerService_QuerySCIList_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_QuerySCIList, CardIssuerService_MethodSignature_QuerySCIList, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum QuerySCIList(CardIssuerService_QuerySCIList_Req &Req, CardIssuerService_QuerySCIList_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = QuerySCIList(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum QuerySCIList(CardIssuerService_QuerySCIList_Req &Req, CardIssuerService_QuerySCIList_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = QuerySCIList(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum QuerySCIList(CardIssuerService_QuerySCIList_Req &Req, CardIssuerService_QuerySCIList_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = QuerySCIList(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum BindSCI(CardIssuerService_BindSCI_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_BindSCI, CardIssuerService_MethodSignature_BindSCI, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum BindSCI(CardIssuerService_BindSCI_Req &Req, CardIssuerService_BindSCI_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = BindSCI(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum BindSCI(CardIssuerService_BindSCI_Req &Req, CardIssuerService_BindSCI_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = BindSCI(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum BindSCI(CardIssuerService_BindSCI_Req &Req, CardIssuerService_BindSCI_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = BindSCI(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum PreOnlineOnStore(CardIssuerService_PreOnlineOnStore_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_PreOnlineOnStore, CardIssuerService_MethodSignature_PreOnlineOnStore, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum PreOnlineOnStore(CardIssuerService_PreOnlineOnStore_Req &Req, CardIssuerService_PreOnlineOnStore_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = PreOnlineOnStore(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum PreOnlineOnStore(CardIssuerService_PreOnlineOnStore_Req &Req, CardIssuerService_PreOnlineOnStore_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = PreOnlineOnStore(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum PreOnlineOnStore(CardIssuerService_PreOnlineOnStore_Req &Req, CardIssuerService_PreOnlineOnStore_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = PreOnlineOnStore(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum NotifyPreonline(CardIssuerService_NotifyPreonline_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_NotifyPreonline, CardIssuerService_MethodSignature_NotifyPreonline, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum NotifyPreonline(CardIssuerService_NotifyPreonline_Req &Req, CardIssuerService_NotifyPreonline_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = NotifyPreonline(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum NotifyPreonline(CardIssuerService_NotifyPreonline_Req &Req, CardIssuerService_NotifyPreonline_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = NotifyPreonline(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum NotifyPreonline(CardIssuerService_NotifyPreonline_Req &Req, CardIssuerService_NotifyPreonline_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = NotifyPreonline(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum QueryCardInfoOnStore(CardIssuerService_QueryCardInfoOnStore_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_QueryCardInfoOnStore, CardIssuerService_MethodSignature_QueryCardInfoOnStore, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum QueryCardInfoOnStore(CardIssuerService_QueryCardInfoOnStore_Req &Req, CardIssuerService_QueryCardInfoOnStore_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = QueryCardInfoOnStore(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum QueryCardInfoOnStore(CardIssuerService_QueryCardInfoOnStore_Req &Req, CardIssuerService_QueryCardInfoOnStore_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = QueryCardInfoOnStore(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum QueryCardInfoOnStore(CardIssuerService_QueryCardInfoOnStore_Req &Req, CardIssuerService_QueryCardInfoOnStore_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = QueryCardInfoOnStore(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum GetAddCardInfo(CardIssuerService_GetAddCardInfo_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_GetAddCardInfo, CardIssuerService_MethodSignature_GetAddCardInfo, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum GetAddCardInfo(CardIssuerService_GetAddCardInfo_Req &Req, CardIssuerService_GetAddCardInfo_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetAddCardInfo(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum GetAddCardInfo(CardIssuerService_GetAddCardInfo_Req &Req, CardIssuerService_GetAddCardInfo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetAddCardInfo(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum GetAddCardInfo(CardIssuerService_GetAddCardInfo_Req &Req, CardIssuerService_GetAddCardInfo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetAddCardInfo(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum PrintCardImmediately(CardIssuerService_PrintCardImmediately_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_PrintCardImmediately, CardIssuerService_MethodSignature_PrintCardImmediately, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum PrintCardImmediately(CardIssuerService_PrintCardImmediately_Req &Req, CardIssuerService_PrintCardImmediately_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = PrintCardImmediately(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum PrintCardImmediately(CardIssuerService_PrintCardImmediately_Req &Req, CardIssuerService_PrintCardImmediately_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = PrintCardImmediately(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum PrintCardImmediately(CardIssuerService_PrintCardImmediately_Req &Req, CardIssuerService_PrintCardImmediately_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = PrintCardImmediately(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum QueryCIStatus(CardIssuerService_QueryCIStatus_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_QueryCIStatus, CardIssuerService_MethodSignature_QueryCIStatus, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum QueryCIStatus(CardIssuerService_QueryCIStatus_Req &Req, CardIssuerService_QueryCIStatus_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = QueryCIStatus(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum QueryCIStatus(CardIssuerService_QueryCIStatus_Req &Req, CardIssuerService_QueryCIStatus_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = QueryCIStatus(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum QueryCIStatus(CardIssuerService_QueryCIStatus_Req &Req, CardIssuerService_QueryCIStatus_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = QueryCIStatus(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum GetDevInfo(CardIssuerService_GetDevInfo_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(CardIssuerService_Method_GetDevInfo, CardIssuerService_MethodSignature_GetDevInfo, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum GetDevInfo(CardIssuerService_GetDevInfo_Req &Req, CardIssuerService_GetDevInfo_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetDevInfo(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum GetDevInfo(CardIssuerService_GetDevInfo_Req &Req, CardIssuerService_GetDevInfo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetDevInfo(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum GetDevInfo(CardIssuerService_GetDevInfo_Req &Req, CardIssuerService_GetDevInfo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetDevInfo(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-
-	bool SafeDelete()
-	{
-		if (!m_bSysManaged) {
-			delete this;
-		}
-		return m_bSysManaged;
-	}
-
-protected:
-	bool m_bSysManaged;
-	CEntityBase *m_pEntityBase;
-	linkContext m_context;
-	bool bSessionClosed;
-};
-
-///////////////////////////
-
-} // namespace CardIssuer
-#endif // __CARDISSUER_CLIENT_G_H

+ 0 - 999
Module/mod_CardIssuerStand/CardIssuer_def_g.h

@@ -1,999 +0,0 @@
-#ifndef __CARDISSUER_DEF_G_H
-#define __CARDISSUER_DEF_G_H
-
-#pragma once
-
-// This code is generated by spgen tool!
-
-#include "SpHelper.h"
-
-namespace CardIssuer {
-//
-// const goes here
-//
-
-#define CardIssuerService_Method_Insert 0
-#define CardIssuerService_Method_CancelInsert 1
-#define CardIssuerService_Method_InsertWaitMore 2
-#define CardIssuerService_Method_Read 3
-#define CardIssuerService_Method_Capture 4
-#define CardIssuerService_Method_Eject 5
-#define CardIssuerService_Method_PreOnline 6
-#define CardIssuerService_Method_PostOnline 7
-#define CardIssuerService_Method_Exit 8
-#define CardIssuerService_Method_Issue 9
-#define CardIssuerService_Method_GetMaterialCount 10
-#define CardIssuerService_Method_SetMaterialCount 11
-#define CardIssuerService_Method_SetIssueFlag 12
-#define CardIssuerService_Method_ReadEx 13
-#define CardIssuerService_Method_QueryCardInfo 14
-#define CardIssuerService_Method_WriteTrack 15
-#define CardIssuerService_Method_GetMaterialCountEx 16
-#define CardIssuerService_Method_SetMaterialCountEx 17
-#define CardIssuerService_Method_SetSomeFlag 18
-#define CardIssuerService_Method_GetSCIInfo 19
-#define CardIssuerService_Method_IssueEx 20
-#define CardIssuerService_Method_OpenSafeLock 21
-#define CardIssuerService_Method_SAMICCommand 22
-#define CardIssuerService_Method_QueryPrinterStatus 23
-#define CardIssuerService_Method_Print 24
-#define CardIssuerService_Method_QuerySCIList 25
-#define CardIssuerService_Method_BindSCI 26
-#define CardIssuerService_Method_PreOnlineOnStore 27
-#define CardIssuerService_Method_NotifyPreonline 28
-#define CardIssuerService_Method_QueryCardInfoOnStore 29
-#define CardIssuerService_Method_GetAddCardInfo 30
-#define CardIssuerService_Method_PrintCardImmediately 31
-#define CardIssuerService_Method_QueryCIStatus 32
-#define CardIssuerService_Method_GetDevInfo 65535
-
-#define CardIssuerService_MethodSignature_Insert 1091033773
-#define CardIssuerService_MethodSignature_CancelInsert -1202478828
-#define CardIssuerService_MethodSignature_InsertWaitMore 493791658
-#define CardIssuerService_MethodSignature_Read 591445479
-#define CardIssuerService_MethodSignature_Capture -1807054569
-#define CardIssuerService_MethodSignature_Eject -377455114
-#define CardIssuerService_MethodSignature_PreOnline 640958030
-#define CardIssuerService_MethodSignature_PostOnline 923284555
-#define CardIssuerService_MethodSignature_Exit -1158854104
-#define CardIssuerService_MethodSignature_Issue 438783077
-#define CardIssuerService_MethodSignature_GetMaterialCount -605917749
-#define CardIssuerService_MethodSignature_SetMaterialCount 870103115
-#define CardIssuerService_MethodSignature_SetIssueFlag 187641303
-#define CardIssuerService_MethodSignature_ReadEx -842531343
-#define CardIssuerService_MethodSignature_QueryCardInfo 154962579
-#define CardIssuerService_MethodSignature_WriteTrack -1424799012
-#define CardIssuerService_MethodSignature_GetMaterialCountEx 1356148904
-#define CardIssuerService_MethodSignature_SetMaterialCountEx -1512312761
-#define CardIssuerService_MethodSignature_SetSomeFlag -2033418025
-#define CardIssuerService_MethodSignature_GetSCIInfo 1097494981
-#define CardIssuerService_MethodSignature_IssueEx 1390328640
-#define CardIssuerService_MethodSignature_OpenSafeLock 177980614
-#define CardIssuerService_MethodSignature_SAMICCommand 406988293
-#define CardIssuerService_MethodSignature_QueryPrinterStatus -890728447
-#define CardIssuerService_MethodSignature_Print 2096006675
-#define CardIssuerService_MethodSignature_QuerySCIList -1772231453
-#define CardIssuerService_MethodSignature_BindSCI -1242011672
-#define CardIssuerService_MethodSignature_PreOnlineOnStore 158325869
-#define CardIssuerService_MethodSignature_NotifyPreonline -808637659
-#define CardIssuerService_MethodSignature_QueryCardInfoOnStore 1217447214
-#define CardIssuerService_MethodSignature_GetAddCardInfo 684031940
-#define CardIssuerService_MethodSignature_PrintCardImmediately -1976184201
-#define CardIssuerService_MethodSignature_QueryCIStatus -1907000703
-#define CardIssuerService_MethodSignature_GetDevInfo 296205965
-
-#define CardIssuerService_LogCode_Insert "QLR040220300"
-#define CardIssuerService_LogCode_CancelInsert "QLR040220301"
-#define CardIssuerService_LogCode_InsertWaitMore "QLR040220302"
-#define CardIssuerService_LogCode_Read "QLR040220303"
-#define CardIssuerService_LogCode_Capture "QLR040220304"
-#define CardIssuerService_LogCode_Eject "QLR040220305"
-#define CardIssuerService_LogCode_PreOnline "QLR040220306"
-#define CardIssuerService_LogCode_PostOnline "QLR040220307"
-#define CardIssuerService_LogCode_Exit "QLR040220308"
-#define CardIssuerService_LogCode_Issue "QLR040220309"
-#define CardIssuerService_LogCode_GetMaterialCount "QLR040220310"
-#define CardIssuerService_LogCode_SetMaterialCount "QLR040220311"
-#define CardIssuerService_LogCode_SetIssueFlag "QLR040220312"
-#define CardIssuerService_LogCode_ReadEx "QLR040220313"
-#define CardIssuerService_LogCode_QueryCardInfo "QLR040220314"
-#define CardIssuerService_LogCode_WriteTrack "QLR040220315"
-#define CardIssuerService_LogCode_GetMaterialCountEx "QLR040220316"
-#define CardIssuerService_LogCode_SetMaterialCountEx "QLR040220317"
-#define CardIssuerService_LogCode_SetSomeFlag "QLR040220318"
-#define CardIssuerService_LogCode_GetSCIInfo "QLR040220319"
-#define CardIssuerService_LogCode_IssueEx "QLR040220320"
-#define CardIssuerService_LogCode_OpenSafeLock "QLR040220321"
-#define CardIssuerService_LogCode_SAMICCommand "QLR040220322"
-#define CardIssuerService_LogCode_QueryPrinterStatus "QLR040220323"
-#define CardIssuerService_LogCode_Print "QLR040220324"
-#define CardIssuerService_LogCode_QuerySCIList "QLR040220325"
-#define CardIssuerService_LogCode_BindSCI "QLR040220326"
-#define CardIssuerService_LogCode_PreOnlineOnStore "QLR040220327"
-#define CardIssuerService_LogCode_NotifyPreonline "QLR040220328"
-#define CardIssuerService_LogCode_QueryCardInfoOnStore "QLR040220329"
-#define CardIssuerService_LogCode_GetAddCardInfo "QLR040220330"
-#define CardIssuerService_LogCode_PrintCardImmediately "QLR040220331"
-#define CardIssuerService_LogCode_QueryCIStatus "QLR040220332"
-#define CardIssuerService_LogCode_GetDevInfo "QLR040220399"
-
-struct CardIssuerService_Insert_Req
-{
-	CSimpleStringA aid;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & aid;
-	}
-
-};
-
-struct CardIssuerService_Insert_Ans
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct CardIssuerService_CancelInsert_Info
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct CardIssuerService_InsertWaitMore_Info
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct CardIssuerService_Read_Req
-{
-	CSimpleStringA aid;
-	int reserved1;
-	int reserved2;
-	CSimpleStringA reserved3;
-	CSimpleStringA reserved4;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & aid & reserved1 & reserved2 & reserved3 & reserved4;
-	}
-
-};
-
-struct CardIssuerService_Read_Ans
-{
-	CSimpleStringA track1;
-	CSimpleStringA track2;
-	CSimpleStringA track3;
-	int ICType;
-	CSimpleStringA ICData;
-	int status;
-	CSimpleStringA t2Account;
-	CSimpleStringA t2Region;
-	CSimpleStringA t2CardSerial;
-	CSimpleStringA t2CVC;
-	CSimpleStringA t2ExpireDate;
-	int reserved1;
-	int reserved2;
-	CSimpleStringA reserved3;
-	CSimpleStringA reserved4;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & track1 & track2 & track3 & ICType & ICData & status & t2Account & t2Region & t2CardSerial & t2CVC & t2ExpireDate & reserved1 & reserved2 & reserved3 & reserved4;
-	}
-
-};
-
-struct CardIssuerService_Capture_Req
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct CardIssuerService_Capture_Ans
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct CardIssuerService_Eject_Req
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct CardIssuerService_Eject_Ans
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct CardIssuerService_PreOnline_Req
-{
-	CSimpleStringA businessData;
-	CSimpleStringA reserved1;
-	CSimpleStringA reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & businessData & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_PreOnline_Ans
-{
-	CSimpleStringA result;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & result;
-	}
-
-};
-
-struct CardIssuerService_PostOnline_Req
-{
-	CSimpleStringA data;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & data;
-	}
-
-};
-
-struct CardIssuerService_PostOnline_Ans
-{
-	CSimpleStringA result;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & result;
-	}
-
-};
-
-struct CardIssuerService_Exit_Info
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct CardIssuerService_Issue_Req
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct CardIssuerService_Issue_Ans
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct CardIssuerService_GetMaterialCount_Req
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct CardIssuerService_GetMaterialCount_Ans
-{
-	int remains;
-	int captured;
-	int issued;
-	int mixed;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & remains & captured & issued & mixed;
-	}
-
-};
-
-struct CardIssuerService_SetMaterialCount_Req
-{
-	int remains;
-	int captured;
-	int issued;
-	bool bRemains;
-	bool bCaptured;
-	bool bIssued;
-	int mixed;
-	bool bMixed;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & remains & captured & issued & bRemains & bCaptured & bIssued & mixed & bMixed;
-	}
-
-};
-
-struct CardIssuerService_SetMaterialCount_Ans
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct CardIssuerService_SetIssueFlag_Info
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct CardIssuerService_ReadEx_Req
-{
-	CSimpleStringA aid;
-	CSimpleStringA reserved1;
-	CSimpleStringA reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & aid & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_ReadEx_Ans
-{
-	CSimpleStringA track1;
-	CSimpleStringA track2;
-	CSimpleStringA track3;
-	int CDType;
-	int ICType;
-	int CMBType;
-	CSimpleStringA ICData;
-	int status;
-	CSimpleStringA t2Account;
-	CSimpleStringA t2Region;
-	CSimpleStringA t2CardSerial;
-	CSimpleStringA t2CVC;
-	CSimpleStringA t2ExpireDate;
-	CSimpleStringA reserved1;
-	CSimpleStringA reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & track1 & track2 & track3 & CDType & ICType & CMBType & ICData & status & t2Account & t2Region & t2CardSerial & t2CVC & t2ExpireDate & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_QueryCardInfo_Req
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct CardIssuerService_QueryCardInfo_Ans
-{
-	int position;
-	int reserved1;
-	CSimpleStringA reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & position & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_WriteTrack_Req
-{
-	int mode;
-	int co;
-	CSimpleStringW track1;
-	CSimpleStringW track2;
-	CSimpleStringW track3;
-	CSimpleStringW reserved;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & mode & co & track1 & track2 & track3 & reserved;
-	}
-
-};
-
-struct CardIssuerService_WriteTrack_Ans
-{
-	int result;
-	int reserved1;
-	CSimpleStringA reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & result & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_GetMaterialCountEx_Req
-{
-	CAutoArray<int> GetHopper;
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & GetHopper & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_GetMaterialCountEx_Ans
-{
-	int captured;
-	CAutoArray<int> hasHopper;
-	CAutoArray<CSimpleStringA> CardBoxNo;
-	CAutoArray<CSimpleStringA> PsbCode;
-	CAutoArray<CSimpleStringA> PsbName;
-	CAutoArray<CSimpleStringA> Maintainer;
-	CAutoArray<CSimpleStringA> MaintainTime;
-	CAutoArray<int> CardInit;
-	CAutoArray<int> CardPercent;
-	CAutoArray<int> remains;
-	CAutoArray<int> issued;
-	CAutoArray<int> mixed;
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & captured & hasHopper & CardBoxNo & PsbCode & PsbName & Maintainer & MaintainTime & CardInit & CardPercent & remains & issued & mixed & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_SetMaterialCountEx_Req
-{
-	CAutoArray<int> SetHopper;
-	int SetCaptured;
-	int captured;
-	CAutoArray<CSimpleStringA> CardBoxNo;
-	CAutoArray<CSimpleStringA> PsbCode;
-	CAutoArray<CSimpleStringA> PsbName;
-	CAutoArray<CSimpleStringA> Maintainer;
-	CAutoArray<CSimpleStringA> MaintainTime;
-	CAutoArray<int> CardInit;
-	CAutoArray<int> CardPercent;
-	CAutoArray<int> remains;
-	CAutoArray<int> issued;
-	CAutoArray<int> mixed;
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & SetHopper & SetCaptured & captured & CardBoxNo & PsbCode & PsbName & Maintainer & MaintainTime & CardInit & CardPercent & remains & issued & mixed & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_SetMaterialCountEx_Ans
-{
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_SetSomeFlag_Req
-{
-	int IssueBusiness;
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & IssueBusiness & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_SetSomeFlag_Ans
-{
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_GetSCIInfo_Req
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct CardIssuerService_GetSCIInfo_Ans
-{
-	int connected;
-	CSimpleStringA DevSN;
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & connected & DevSN & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_IssueEx_Req
-{
-	int hopper;
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & hopper & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_IssueEx_Ans
-{
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_OpenSafeLock_Req
-{
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_OpenSafeLock_Ans
-{
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_SAMICCommand_Req
-{
-	int cmdType;
-	CAutoArray<int> param1;
-	CAutoArray<CSimpleStringA> param2;
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & cmdType & param1 & param2 & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_SAMICCommand_Ans
-{
-	CAutoArray<int> ret1;
-	CAutoArray<CSimpleStringA> ret2;
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & ret1 & ret2 & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_QueryPrinterStatus_Req
-{
-	CAutoArray<int> param1;
-	CAutoArray<CSimpleStringA> param2;
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & param1 & param2 & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_QueryPrinterStatus_Ans
-{
-	CAutoArray<int> ret1;
-	CAutoArray<CSimpleStringA> ret2;
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & ret1 & ret2 & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_Print_Req
-{
-	CBlob data1;
-	CBlob data2;
-	CBlob data3;
-	CBlob data4;
-	CBlob data5;
-	CBlob data6;
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & data1 & data2 & data3 & data4 & data5 & data6 & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_Print_Ans
-{
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_QuerySCIList_Req
-{
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_QuerySCIList_Ans
-{
-	CAutoArray<CSimpleStringA> sciNo;
-	CAutoArray<CSimpleStringA> arrMateriel;
-	CAutoArray<CSimpleStringA> CardGroove;
-	CAutoArray<CSimpleStringA> CardBoxNo;
-	CAutoArray<CSimpleStringA> PsbCode;
-	CAutoArray<CSimpleStringA> PsbName;
-	CAutoArray<unsigned int> CardInit;
-	CAutoArray<unsigned int> CardRemains;
-	CAutoArray<unsigned int> CardIssued;
-	CAutoArray<unsigned int> CardMixed;
-	CAutoArray<unsigned int> CardPercent;
-	CAutoArray<CSimpleStringA> Maintainer;
-	CAutoArray<CSimpleStringA> MaintainTime;
-	CAutoArray<CSimpleStringA> UpdateTime;
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & sciNo & arrMateriel & CardGroove & CardBoxNo & PsbCode & PsbName & CardInit & CardRemains & CardIssued & CardMixed & CardPercent & Maintainer & MaintainTime & UpdateTime & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_BindSCI_Req
-{
-	int type;
-	CSimpleStringA sciNo;
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & type & sciNo & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_BindSCI_Ans
-{
-	CAutoArray<int> reserved1;
-	CAutoArray<CSimpleStringA> reserved2;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & reserved1 & reserved2;
-	}
-
-};
-
-struct CardIssuerService_PreOnlineOnStore_Req
-{
-	CSimpleStringA account;
-	CSimpleStringA termNo;
-	CSimpleStringA businessData;
-	int slot;
-	CAutoArray<int> reserved1;
-	CAutoArray<int> reserved2;
-	CAutoArray<CSimpleStringA> reserved3;
-	CAutoArray<CSimpleStringA> reserved4;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & account & termNo & businessData & slot & reserved1 & reserved2 & reserved3 & reserved4;
-	}
-
-};
-
-struct CardIssuerService_PreOnlineOnStore_Ans
-{
-	int findCard;
-	int cardPos;
-	CSimpleStringA result;
-	CAutoArray<int> reserved1;
-	CAutoArray<int> reserved2;
-	CAutoArray<CSimpleStringA> reserved3;
-	CAutoArray<CSimpleStringA> reserved4;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & findCard & cardPos & result & reserved1 & reserved2 & reserved3 & reserved4;
-	}
-
-};
-
-struct CardIssuerService_NotifyPreonline_Req
-{
-	int findCard;
-	int cardPos;
-	int errCode;
-	CSimpleStringA account;
-	CSimpleStringA termNo;
-	CSimpleStringA data;
-	CAutoArray<int> reserved1;
-	CAutoArray<int> reserved2;
-	CAutoArray<CSimpleStringA> reserved3;
-	CAutoArray<CSimpleStringA> reserved4;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & findCard & cardPos & errCode & account & termNo & data & reserved1 & reserved2 & reserved3 & reserved4;
-	}
-
-};
-
-struct CardIssuerService_NotifyPreonline_Ans
-{
-	CAutoArray<int> reserved1;
-	CAutoArray<int> reserved2;
-	CAutoArray<CSimpleStringA> reserved3;
-	CAutoArray<CSimpleStringA> reserved4;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & reserved1 & reserved2 & reserved3 & reserved4;
-	}
-
-};
-
-struct CardIssuerService_QueryCardInfoOnStore_Req
-{
-	CAutoArray<int> reserved1;
-	CAutoArray<int> reserved2;
-	CAutoArray<CSimpleStringA> reserved3;
-	CAutoArray<CSimpleStringA> reserved4;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & reserved1 & reserved2 & reserved3 & reserved4;
-	}
-
-};
-
-struct CardIssuerService_QueryCardInfoOnStore_Ans
-{
-	int findCard;
-	int cardPos;
-	CAutoArray<int> reserved1;
-	CAutoArray<int> reserved2;
-	CAutoArray<CSimpleStringA> reserved3;
-	CAutoArray<CSimpleStringA> reserved4;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & findCard & cardPos & reserved1 & reserved2 & reserved3 & reserved4;
-	}
-
-};
-
-struct CardIssuerService_GetAddCardInfo_Req
-{
-	int isSync;
-	CAutoArray<int> reserved1;
-	CAutoArray<int> reserved2;
-	CAutoArray<CSimpleStringA> reserved3;
-	CAutoArray<CSimpleStringA> reserved4;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & isSync & reserved1 & reserved2 & reserved3 & reserved4;
-	}
-
-};
-
-struct CardIssuerService_GetAddCardInfo_Ans
-{
-	int count;
-	CAutoArray<int> slot;
-	CAutoArray<CSimpleStringA> account;
-	CAutoArray<CSimpleStringA> cardSerial;
-	CAutoArray<int> reserved1;
-	CAutoArray<int> reserved2;
-	CAutoArray<CSimpleStringA> reserved3;
-	CAutoArray<CSimpleStringA> reserved4;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & count & slot & account & cardSerial & reserved1 & reserved2 & reserved3 & reserved4;
-	}
-
-};
-
-struct CardIssuerService_PrintCardImmediately_Req
-{
-	CSimpleStringA formFile;
-	CSimpleStringA printData;
-	CAutoArray<int> reserved1;
-	CAutoArray<int> reserved2;
-	CAutoArray<CSimpleStringA> reserved3;
-	CAutoArray<CSimpleStringA> reserved4;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & formFile & printData & reserved1 & reserved2 & reserved3 & reserved4;
-	}
-
-};
-
-struct CardIssuerService_PrintCardImmediately_Ans
-{
-	int ret;
-	CAutoArray<int> reserved1;
-	CAutoArray<int> reserved2;
-	CAutoArray<CSimpleStringA> reserved3;
-	CAutoArray<CSimpleStringA> reserved4;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & ret & reserved1 & reserved2 & reserved3 & reserved4;
-	}
-
-};
-
-struct CardIssuerService_QueryCIStatus_Req
-{
-	CAutoArray<int> reserved1;
-	CAutoArray<int> reserved2;
-	CAutoArray<CSimpleStringA> reserved3;
-	CAutoArray<CSimpleStringA> reserved4;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & reserved1 & reserved2 & reserved3 & reserved4;
-	}
-
-};
-
-struct CardIssuerService_QueryCIStatus_Ans
-{
-	int retainBin;
-	CAutoArray<int> hopperNo;
-	CAutoArray<int> hopperStatus;
-	CAutoArray<int> reserved1;
-	CAutoArray<int> reserved2;
-	CAutoArray<CSimpleStringA> reserved3;
-	CAutoArray<CSimpleStringA> reserved4;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & retainBin & hopperNo & hopperStatus & reserved1 & reserved2 & reserved3 & reserved4;
-	}
-
-};
-
-struct CardIssuerService_GetDevInfo_Req
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct CardIssuerService_GetDevInfo_Ans
-{
-	CSimpleStringA type;
-	CSimpleStringA model;
-	CSimpleStringA version;
-	int state;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & type & model & version & state;
-	}
-
-};
-
-
-///////////////////////////
-
-} // namespace CardIssuer
-
-#endif // __CARDISSUER_DEF_G_H

+ 0 - 45
Module/mod_CardIssuerStand/CardIssuer_msg_g.h

@@ -1,45 +0,0 @@
-
-#ifndef __CARDISSUER_MSG_G_H
-#define __CARDISSUER_MSG_G_H
-
-#pragma once
-
-// This code is generated by spgen tool!
-
-#include "SpHelper.h"
-
-namespace CardIssuer {
-#define eMsg_FetchCard 0
-#define eMsg_SCIConnect 1
-
-#define eMsgSig_FetchCard 1110804794
-#define eMsgSig_SCIConnect 721962700
-
-struct FetchCard
-{
-	int status;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & status;
-	}
-
-};
-
-///////////////////////////
-
-struct SCIConnect
-{
-	int status;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & status;
-	}
-
-};
-
-///////////////////////////
-
-} // namespace CardIssuer
-#endif // __CARDISSUER_MSG_G_H

+ 0 - 1001
Module/mod_CardIssuerStand/CardIssuer_server_g.h

@@ -1,1001 +0,0 @@
-
-#ifndef __CARDISSUER_SERVER_G_H
-#define __CARDISSUER_SERVER_G_H
-
-#pragma once
-
-// This code is generated by spgen tool!
-
-#include "CardIssuer_def_g.h"
-
-namespace CardIssuer {
-class CardIssuerService_ServerSessionBase : public CServerSessionBase
-{
-public:
-	CardIssuerService_ServerSessionBase()
-	{
-		/// override by user
-	}
-
-	virtual ~CardIssuerService_ServerSessionBase()
-	{
-		/// override by user
-	}
-
-	virtual bool IsExclusive() { return false; }
-
-	virtual bool IsSessionOverlap() { return true; }
-
-	virtual ErrorCodeEnum GetMessageAttr(DWORD dwMessageID, DWORD dwSignature, bool &bOverlap)
-	{
-		ErrorCodeEnum Error = Error_Succeed;
-		switch (dwMessageID) {
-		case CardIssuerService_Method_Insert:
-			if (dwSignature == CardIssuerService_MethodSignature_Insert) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_CancelInsert:
-			if (dwSignature == CardIssuerService_MethodSignature_CancelInsert) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_InsertWaitMore:
-			if (dwSignature == CardIssuerService_MethodSignature_InsertWaitMore) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_Read:
-			if (dwSignature == CardIssuerService_MethodSignature_Read) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_Capture:
-			if (dwSignature == CardIssuerService_MethodSignature_Capture) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_Eject:
-			if (dwSignature == CardIssuerService_MethodSignature_Eject) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_PreOnline:
-			if (dwSignature == CardIssuerService_MethodSignature_PreOnline) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_PostOnline:
-			if (dwSignature == CardIssuerService_MethodSignature_PostOnline) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_Exit:
-			if (dwSignature == CardIssuerService_MethodSignature_Exit) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_Issue:
-			if (dwSignature == CardIssuerService_MethodSignature_Issue) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_GetMaterialCount:
-			if (dwSignature == CardIssuerService_MethodSignature_GetMaterialCount) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_SetMaterialCount:
-			if (dwSignature == CardIssuerService_MethodSignature_SetMaterialCount) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_SetIssueFlag:
-			if (dwSignature == CardIssuerService_MethodSignature_SetIssueFlag) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_ReadEx:
-			if (dwSignature == CardIssuerService_MethodSignature_ReadEx) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_QueryCardInfo:
-			if (dwSignature == CardIssuerService_MethodSignature_QueryCardInfo) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_WriteTrack:
-			if (dwSignature == CardIssuerService_MethodSignature_WriteTrack) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_GetMaterialCountEx:
-			if (dwSignature == CardIssuerService_MethodSignature_GetMaterialCountEx) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_SetMaterialCountEx:
-			if (dwSignature == CardIssuerService_MethodSignature_SetMaterialCountEx) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_SetSomeFlag:
-			if (dwSignature == CardIssuerService_MethodSignature_SetSomeFlag) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_GetSCIInfo:
-			if (dwSignature == CardIssuerService_MethodSignature_GetSCIInfo) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_IssueEx:
-			if (dwSignature == CardIssuerService_MethodSignature_IssueEx) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_OpenSafeLock:
-			if (dwSignature == CardIssuerService_MethodSignature_OpenSafeLock) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_SAMICCommand:
-			if (dwSignature == CardIssuerService_MethodSignature_SAMICCommand) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_QueryPrinterStatus:
-			if (dwSignature == CardIssuerService_MethodSignature_QueryPrinterStatus) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_Print:
-			if (dwSignature == CardIssuerService_MethodSignature_Print) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_QuerySCIList:
-			if (dwSignature == CardIssuerService_MethodSignature_QuerySCIList) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_BindSCI:
-			if (dwSignature == CardIssuerService_MethodSignature_BindSCI) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_PreOnlineOnStore:
-			if (dwSignature == CardIssuerService_MethodSignature_PreOnlineOnStore) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_NotifyPreonline:
-			if (dwSignature == CardIssuerService_MethodSignature_NotifyPreonline) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_QueryCardInfoOnStore:
-			if (dwSignature == CardIssuerService_MethodSignature_QueryCardInfoOnStore) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_GetAddCardInfo:
-			if (dwSignature == CardIssuerService_MethodSignature_GetAddCardInfo) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_PrintCardImmediately:
-			if (dwSignature == CardIssuerService_MethodSignature_PrintCardImmediately) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_QueryCIStatus:
-			if (dwSignature == CardIssuerService_MethodSignature_QueryCIStatus) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_GetDevInfo:
-			if (dwSignature == CardIssuerService_MethodSignature_GetDevInfo) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		default:
-			Error = Error_MethodNotFound;
-			break;
-		}
-		return Error;
-	}
-
-	int CheckMessageSignature(DWORD dwMessageID, DWORD dwSignature)
-	{
-		ErrorCodeEnum Error = Error_Succeed;
-		switch (dwMessageID) {
-		case CardIssuerService_Method_Insert:
-			if (dwSignature != CardIssuerService_MethodSignature_Insert) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_CancelInsert:
-			if (dwSignature != CardIssuerService_MethodSignature_CancelInsert) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_InsertWaitMore:
-			if (dwSignature != CardIssuerService_MethodSignature_InsertWaitMore) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_Read:
-			if (dwSignature != CardIssuerService_MethodSignature_Read) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_Capture:
-			if (dwSignature != CardIssuerService_MethodSignature_Capture) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_Eject:
-			if (dwSignature != CardIssuerService_MethodSignature_Eject) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_PreOnline:
-			if (dwSignature != CardIssuerService_MethodSignature_PreOnline) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_PostOnline:
-			if (dwSignature != CardIssuerService_MethodSignature_PostOnline) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_Exit:
-			if (dwSignature != CardIssuerService_MethodSignature_Exit) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_Issue:
-			if (dwSignature != CardIssuerService_MethodSignature_Issue) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_GetMaterialCount:
-			if (dwSignature != CardIssuerService_MethodSignature_GetMaterialCount) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_SetMaterialCount:
-			if (dwSignature != CardIssuerService_MethodSignature_SetMaterialCount) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_SetIssueFlag:
-			if (dwSignature != CardIssuerService_MethodSignature_SetIssueFlag) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_ReadEx:
-			if (dwSignature != CardIssuerService_MethodSignature_ReadEx) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_QueryCardInfo:
-			if (dwSignature != CardIssuerService_MethodSignature_QueryCardInfo) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_WriteTrack:
-			if (dwSignature != CardIssuerService_MethodSignature_WriteTrack) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_GetMaterialCountEx:
-			if (dwSignature != CardIssuerService_MethodSignature_GetMaterialCountEx) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_SetMaterialCountEx:
-			if (dwSignature != CardIssuerService_MethodSignature_SetMaterialCountEx) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_SetSomeFlag:
-			if (dwSignature != CardIssuerService_MethodSignature_SetSomeFlag) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_GetSCIInfo:
-			if (dwSignature != CardIssuerService_MethodSignature_GetSCIInfo) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_IssueEx:
-			if (dwSignature != CardIssuerService_MethodSignature_IssueEx) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_OpenSafeLock:
-			if (dwSignature != CardIssuerService_MethodSignature_OpenSafeLock) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_SAMICCommand:
-			if (dwSignature != CardIssuerService_MethodSignature_SAMICCommand) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_QueryPrinterStatus:
-			if (dwSignature != CardIssuerService_MethodSignature_QueryPrinterStatus) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_Print:
-			if (dwSignature != CardIssuerService_MethodSignature_Print) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_QuerySCIList:
-			if (dwSignature != CardIssuerService_MethodSignature_QuerySCIList) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_BindSCI:
-			if (dwSignature != CardIssuerService_MethodSignature_BindSCI) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_PreOnlineOnStore:
-			if (dwSignature != CardIssuerService_MethodSignature_PreOnlineOnStore) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_NotifyPreonline:
-			if (dwSignature != CardIssuerService_MethodSignature_NotifyPreonline) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_QueryCardInfoOnStore:
-			if (dwSignature != CardIssuerService_MethodSignature_QueryCardInfoOnStore) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_GetAddCardInfo:
-			if (dwSignature != CardIssuerService_MethodSignature_GetAddCardInfo) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_PrintCardImmediately:
-			if (dwSignature != CardIssuerService_MethodSignature_PrintCardImmediately) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_QueryCIStatus:
-			if (dwSignature != CardIssuerService_MethodSignature_QueryCIStatus) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case CardIssuerService_Method_GetDevInfo:
-			if (dwSignature != CardIssuerService_MethodSignature_GetDevInfo) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		default:
-			Error = Error_MethodNotFound;
-			break;
-		}
-		return Error;
-	}
-
-	virtual void Handle_Insert(SpReqAnsContext<CardIssuerService_Insert_Req, CardIssuerService_Insert_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_CancelInsert(SpOnewayCallContext<CardIssuerService_CancelInsert_Info>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_InsertWaitMore(SpOnewayCallContext<CardIssuerService_InsertWaitMore_Info>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_Read(SpReqAnsContext<CardIssuerService_Read_Req, CardIssuerService_Read_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_Capture(SpReqAnsContext<CardIssuerService_Capture_Req, CardIssuerService_Capture_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_Eject(SpReqAnsContext<CardIssuerService_Eject_Req, CardIssuerService_Eject_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_PreOnline(SpReqAnsContext<CardIssuerService_PreOnline_Req, CardIssuerService_PreOnline_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_PostOnline(SpReqAnsContext<CardIssuerService_PostOnline_Req, CardIssuerService_PostOnline_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_Exit(SpOnewayCallContext<CardIssuerService_Exit_Info>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_Issue(SpReqAnsContext<CardIssuerService_Issue_Req, CardIssuerService_Issue_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_GetMaterialCount(SpReqAnsContext<CardIssuerService_GetMaterialCount_Req, CardIssuerService_GetMaterialCount_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_SetMaterialCount(SpReqAnsContext<CardIssuerService_SetMaterialCount_Req, CardIssuerService_SetMaterialCount_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_SetIssueFlag(SpOnewayCallContext<CardIssuerService_SetIssueFlag_Info>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_ReadEx(SpReqAnsContext<CardIssuerService_ReadEx_Req, CardIssuerService_ReadEx_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_QueryCardInfo(SpReqAnsContext<CardIssuerService_QueryCardInfo_Req, CardIssuerService_QueryCardInfo_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_WriteTrack(SpReqAnsContext<CardIssuerService_WriteTrack_Req, CardIssuerService_WriteTrack_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_GetMaterialCountEx(SpReqAnsContext<CardIssuerService_GetMaterialCountEx_Req, CardIssuerService_GetMaterialCountEx_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_SetMaterialCountEx(SpReqAnsContext<CardIssuerService_SetMaterialCountEx_Req, CardIssuerService_SetMaterialCountEx_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_SetSomeFlag(SpReqAnsContext<CardIssuerService_SetSomeFlag_Req, CardIssuerService_SetSomeFlag_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_GetSCIInfo(SpReqAnsContext<CardIssuerService_GetSCIInfo_Req, CardIssuerService_GetSCIInfo_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_IssueEx(SpReqAnsContext<CardIssuerService_IssueEx_Req, CardIssuerService_IssueEx_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_OpenSafeLock(SpReqAnsContext<CardIssuerService_OpenSafeLock_Req, CardIssuerService_OpenSafeLock_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_Req, CardIssuerService_SAMICCommand_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_QueryPrinterStatus(SpReqAnsContext<CardIssuerService_QueryPrinterStatus_Req, CardIssuerService_QueryPrinterStatus_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_Print(SpReqAnsContext<CardIssuerService_Print_Req, CardIssuerService_Print_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_QuerySCIList(SpReqAnsContext<CardIssuerService_QuerySCIList_Req, CardIssuerService_QuerySCIList_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_BindSCI(SpReqAnsContext<CardIssuerService_BindSCI_Req, CardIssuerService_BindSCI_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_PreOnlineOnStore(SpReqAnsContext<CardIssuerService_PreOnlineOnStore_Req, CardIssuerService_PreOnlineOnStore_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_NotifyPreonline(SpReqAnsContext<CardIssuerService_NotifyPreonline_Req, CardIssuerService_NotifyPreonline_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_QueryCardInfoOnStore(SpReqAnsContext<CardIssuerService_QueryCardInfoOnStore_Req, CardIssuerService_QueryCardInfoOnStore_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_GetAddCardInfo(SpReqAnsContext<CardIssuerService_GetAddCardInfo_Req, CardIssuerService_GetAddCardInfo_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_PrintCardImmediately(SpReqAnsContext<CardIssuerService_PrintCardImmediately_Req, CardIssuerService_PrintCardImmediately_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_QueryCIStatus(SpReqAnsContext<CardIssuerService_QueryCIStatus_Req, CardIssuerService_QueryCIStatus_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_GetDevInfo(SpReqAnsContext<CardIssuerService_GetDevInfo_Req, CardIssuerService_GetDevInfo_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)
-	{
-		CAutoBuffer Buf;
-		DWORD dwMessageID;
-		DWORD dwMessageSignature;
-		ErrorCodeEnum Error = pTransactionContext->GetReceiveBuffer(dwMessageID, dwMessageSignature, Buf);
-		if (Error == Error_Succeed) {
-#ifdef DEBUG
-			assert(CheckMessageSignature(dwMessageID, dwMessageSignature) == Error_Succeed);
-#else
-			if (CheckMessageSignature(dwMessageID, dwMessageSignature) != Error_Succeed) {
-				pTransactionContext->SendAnswer(Error_MethodSignatureFailed);
-				return;
-			}
-#endif
-			switch (dwMessageID) {
-				case CardIssuerService_Method_Insert:
-					{
-						SpReqAnsContext<CardIssuerService_Insert_Req,CardIssuerService_Insert_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_Insert_Req,CardIssuerService_Insert_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_Insert(ctx);
-					}
-					break;
-				case CardIssuerService_Method_CancelInsert:
-					{
-						SpOnewayCallContext<CardIssuerService_CancelInsert_Info>::Pointer ctx;
-						ctx.Attach(new SpOnewayCallContext<CardIssuerService_CancelInsert_Info>());
-						SpBuffer2Object(Buf, ctx->Info);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_CancelInsert(ctx);
-					}
-					break;
-				case CardIssuerService_Method_InsertWaitMore:
-					{
-						SpOnewayCallContext<CardIssuerService_InsertWaitMore_Info>::Pointer ctx;
-						ctx.Attach(new SpOnewayCallContext<CardIssuerService_InsertWaitMore_Info>());
-						SpBuffer2Object(Buf, ctx->Info);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_InsertWaitMore(ctx);
-					}
-					break;
-				case CardIssuerService_Method_Read:
-					{
-						SpReqAnsContext<CardIssuerService_Read_Req,CardIssuerService_Read_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_Read_Req,CardIssuerService_Read_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_Read(ctx);
-					}
-					break;
-				case CardIssuerService_Method_Capture:
-					{
-						SpReqAnsContext<CardIssuerService_Capture_Req,CardIssuerService_Capture_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_Capture_Req,CardIssuerService_Capture_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_Capture(ctx);
-					}
-					break;
-				case CardIssuerService_Method_Eject:
-					{
-						SpReqAnsContext<CardIssuerService_Eject_Req,CardIssuerService_Eject_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_Eject_Req,CardIssuerService_Eject_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_Eject(ctx);
-					}
-					break;
-				case CardIssuerService_Method_PreOnline:
-					{
-						SpReqAnsContext<CardIssuerService_PreOnline_Req,CardIssuerService_PreOnline_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_PreOnline_Req,CardIssuerService_PreOnline_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_PreOnline(ctx);
-					}
-					break;
-				case CardIssuerService_Method_PostOnline:
-					{
-						SpReqAnsContext<CardIssuerService_PostOnline_Req,CardIssuerService_PostOnline_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_PostOnline_Req,CardIssuerService_PostOnline_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_PostOnline(ctx);
-					}
-					break;
-				case CardIssuerService_Method_Exit:
-					{
-						SpOnewayCallContext<CardIssuerService_Exit_Info>::Pointer ctx;
-						ctx.Attach(new SpOnewayCallContext<CardIssuerService_Exit_Info>());
-						SpBuffer2Object(Buf, ctx->Info);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_Exit(ctx);
-					}
-					break;
-				case CardIssuerService_Method_Issue:
-					{
-						SpReqAnsContext<CardIssuerService_Issue_Req,CardIssuerService_Issue_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_Issue_Req,CardIssuerService_Issue_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_Issue(ctx);
-					}
-					break;
-				case CardIssuerService_Method_GetMaterialCount:
-					{
-						SpReqAnsContext<CardIssuerService_GetMaterialCount_Req,CardIssuerService_GetMaterialCount_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_GetMaterialCount_Req,CardIssuerService_GetMaterialCount_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_GetMaterialCount(ctx);
-					}
-					break;
-				case CardIssuerService_Method_SetMaterialCount:
-					{
-						SpReqAnsContext<CardIssuerService_SetMaterialCount_Req,CardIssuerService_SetMaterialCount_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_SetMaterialCount_Req,CardIssuerService_SetMaterialCount_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_SetMaterialCount(ctx);
-					}
-					break;
-				case CardIssuerService_Method_SetIssueFlag:
-					{
-						SpOnewayCallContext<CardIssuerService_SetIssueFlag_Info>::Pointer ctx;
-						ctx.Attach(new SpOnewayCallContext<CardIssuerService_SetIssueFlag_Info>());
-						SpBuffer2Object(Buf, ctx->Info);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_SetIssueFlag(ctx);
-					}
-					break;
-				case CardIssuerService_Method_ReadEx:
-					{
-						SpReqAnsContext<CardIssuerService_ReadEx_Req,CardIssuerService_ReadEx_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_ReadEx_Req,CardIssuerService_ReadEx_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_ReadEx(ctx);
-					}
-					break;
-				case CardIssuerService_Method_QueryCardInfo:
-					{
-						SpReqAnsContext<CardIssuerService_QueryCardInfo_Req,CardIssuerService_QueryCardInfo_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_QueryCardInfo_Req,CardIssuerService_QueryCardInfo_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_QueryCardInfo(ctx);
-					}
-					break;
-				case CardIssuerService_Method_WriteTrack:
-					{
-						SpReqAnsContext<CardIssuerService_WriteTrack_Req,CardIssuerService_WriteTrack_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_WriteTrack_Req,CardIssuerService_WriteTrack_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_WriteTrack(ctx);
-					}
-					break;
-				case CardIssuerService_Method_GetMaterialCountEx:
-					{
-						SpReqAnsContext<CardIssuerService_GetMaterialCountEx_Req,CardIssuerService_GetMaterialCountEx_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_GetMaterialCountEx_Req,CardIssuerService_GetMaterialCountEx_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_GetMaterialCountEx(ctx);
-					}
-					break;
-				case CardIssuerService_Method_SetMaterialCountEx:
-					{
-						SpReqAnsContext<CardIssuerService_SetMaterialCountEx_Req,CardIssuerService_SetMaterialCountEx_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_SetMaterialCountEx_Req,CardIssuerService_SetMaterialCountEx_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_SetMaterialCountEx(ctx);
-					}
-					break;
-				case CardIssuerService_Method_SetSomeFlag:
-					{
-						SpReqAnsContext<CardIssuerService_SetSomeFlag_Req,CardIssuerService_SetSomeFlag_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_SetSomeFlag_Req,CardIssuerService_SetSomeFlag_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_SetSomeFlag(ctx);
-					}
-					break;
-				case CardIssuerService_Method_GetSCIInfo:
-					{
-						SpReqAnsContext<CardIssuerService_GetSCIInfo_Req,CardIssuerService_GetSCIInfo_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_GetSCIInfo_Req,CardIssuerService_GetSCIInfo_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_GetSCIInfo(ctx);
-					}
-					break;
-				case CardIssuerService_Method_IssueEx:
-					{
-						SpReqAnsContext<CardIssuerService_IssueEx_Req,CardIssuerService_IssueEx_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_IssueEx_Req,CardIssuerService_IssueEx_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_IssueEx(ctx);
-					}
-					break;
-				case CardIssuerService_Method_OpenSafeLock:
-					{
-						SpReqAnsContext<CardIssuerService_OpenSafeLock_Req,CardIssuerService_OpenSafeLock_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_OpenSafeLock_Req,CardIssuerService_OpenSafeLock_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_OpenSafeLock(ctx);
-					}
-					break;
-				case CardIssuerService_Method_SAMICCommand:
-					{
-						SpReqAnsContext<CardIssuerService_SAMICCommand_Req,CardIssuerService_SAMICCommand_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_SAMICCommand_Req,CardIssuerService_SAMICCommand_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_SAMICCommand(ctx);
-					}
-					break;
-				case CardIssuerService_Method_QueryPrinterStatus:
-					{
-						SpReqAnsContext<CardIssuerService_QueryPrinterStatus_Req,CardIssuerService_QueryPrinterStatus_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_QueryPrinterStatus_Req,CardIssuerService_QueryPrinterStatus_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_QueryPrinterStatus(ctx);
-					}
-					break;
-				case CardIssuerService_Method_Print:
-					{
-						SpReqAnsContext<CardIssuerService_Print_Req,CardIssuerService_Print_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_Print_Req,CardIssuerService_Print_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_Print(ctx);
-					}
-					break;
-				case CardIssuerService_Method_QuerySCIList:
-					{
-						SpReqAnsContext<CardIssuerService_QuerySCIList_Req,CardIssuerService_QuerySCIList_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_QuerySCIList_Req,CardIssuerService_QuerySCIList_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_QuerySCIList(ctx);
-					}
-					break;
-				case CardIssuerService_Method_BindSCI:
-					{
-						SpReqAnsContext<CardIssuerService_BindSCI_Req,CardIssuerService_BindSCI_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_BindSCI_Req,CardIssuerService_BindSCI_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_BindSCI(ctx);
-					}
-					break;
-				case CardIssuerService_Method_PreOnlineOnStore:
-					{
-						SpReqAnsContext<CardIssuerService_PreOnlineOnStore_Req,CardIssuerService_PreOnlineOnStore_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_PreOnlineOnStore_Req,CardIssuerService_PreOnlineOnStore_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_PreOnlineOnStore(ctx);
-					}
-					break;
-				case CardIssuerService_Method_NotifyPreonline:
-					{
-						SpReqAnsContext<CardIssuerService_NotifyPreonline_Req,CardIssuerService_NotifyPreonline_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_NotifyPreonline_Req,CardIssuerService_NotifyPreonline_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_NotifyPreonline(ctx);
-					}
-					break;
-				case CardIssuerService_Method_QueryCardInfoOnStore:
-					{
-						SpReqAnsContext<CardIssuerService_QueryCardInfoOnStore_Req,CardIssuerService_QueryCardInfoOnStore_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_QueryCardInfoOnStore_Req,CardIssuerService_QueryCardInfoOnStore_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_QueryCardInfoOnStore(ctx);
-					}
-					break;
-				case CardIssuerService_Method_GetAddCardInfo:
-					{
-						SpReqAnsContext<CardIssuerService_GetAddCardInfo_Req,CardIssuerService_GetAddCardInfo_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_GetAddCardInfo_Req,CardIssuerService_GetAddCardInfo_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_GetAddCardInfo(ctx);
-					}
-					break;
-				case CardIssuerService_Method_PrintCardImmediately:
-					{
-						SpReqAnsContext<CardIssuerService_PrintCardImmediately_Req,CardIssuerService_PrintCardImmediately_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_PrintCardImmediately_Req,CardIssuerService_PrintCardImmediately_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_PrintCardImmediately(ctx);
-					}
-					break;
-				case CardIssuerService_Method_QueryCIStatus:
-					{
-						SpReqAnsContext<CardIssuerService_QueryCIStatus_Req,CardIssuerService_QueryCIStatus_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_QueryCIStatus_Req,CardIssuerService_QueryCIStatus_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_QueryCIStatus(ctx);
-					}
-					break;
-				case CardIssuerService_Method_GetDevInfo:
-					{
-						SpReqAnsContext<CardIssuerService_GetDevInfo_Req,CardIssuerService_GetDevInfo_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<CardIssuerService_GetDevInfo_Req,CardIssuerService_GetDevInfo_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_GetDevInfo(ctx);
-					}
-					break;
-				default:
-					assert(0);
-					break;
-			}
-			
-		} else {
-			pTransactionContext->SendAnswer(Error);
-		}
-	}
-
-};
-
-
-///////////////////////////
-
-} // namespace CardIssuer
-#endif // __CARDISSUER_SERVER_G_H

+ 4 - 0
Module/mod_CardIssuerStand/mod_cardissuer.h

@@ -257,9 +257,13 @@ public:
 	void IssueEx(SpReqAnsContext<CardIssuerService_IssueEx_Req, CardIssuerService_IssueEx_Ans>::Pointer ctx)
 	{
 		LOG_FUNCTION();
+		int state = m_fsm.GetFSMState();
 		if (!m_fsm.GetDevInitFlag()) {
 			ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed);
 		}
+		else if (state == 9) {
+			ctx->Answer(Error_InvalidState, CardIssuer_UserErrorCode_StandEntityInFailState);
+		}
 		else {
 			m_bNewSessionInit = false;
 			CardIssueExEvent* pEvt = new CardIssueExEvent();

+ 2 - 2
Module/mod_CenterSetting/CenterSettingConn.cpp

@@ -514,7 +514,7 @@ void CenterSettingsMicroServiceHelper::UpdateVersion()
     m_pCenterConfig->ReadConfigValue("CenterSetting", "UpdateVersionUrl", url);
 
     HttpClientResponseResult result;
-    HttpClientRequestConfig config(HttpRequestMethod::POST, url.GetData());
+    HttpClientRequestConfig config(HttpRequestMethod::POST, url.GetData(), &SpGetToken);
 
     updateVersionReq.terminal_no = m_terminalInfo.strTerminalID.GetData();
     updateVersionReq.version_no = m_strVersion;
@@ -698,7 +698,7 @@ int CenterSettingsMicroServiceHelper::GetCenterSettingsFromHttp(CenterSettingReq
     }getCenterSettingAns;
 
     HttpClientResponseResult result;
-    HttpClientRequestConfig config(HttpRequestMethod::POST, req.m_url);
+    HttpClientRequestConfig config(HttpRequestMethod::POST, req.m_url, &SpGetToken);
     if (req.m_timeOut > 0) config.SetTimeout(req.m_timeOut);
 
     getCenterSettingReq.m_terminal_no = req.m_terminal_no;

+ 6 - 6
Module/mod_FingerPrint/FingerPrintFSM.cpp

@@ -931,13 +931,13 @@ ErrorCodeEnum CFingerPrintFSM::GetDevCatInfo(DevCategoryInfo& devInfo)
 {
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("DevCatgoryInfo len:%d, %d, %d", strlen(m_devCatInfo.szModel), strlen(m_devCatInfo.szType), strlen(m_devCatInfo.szVendor));
 #ifdef RVC_OS_WIN
-	strncpy_s(devInfo.szModel, m_devCatInfo.szModel, (MAX_DEV_MODEL_LEN > strlen(m_devCatInfo.szModel)) ? strlen(m_devCatInfo.szModel) : MAX_DEV_MODEL_LEN);
-	strncpy_s(devInfo.szType, m_devCatInfo.szType, (MAX_DEV_TYPE_LEN > strlen(m_devCatInfo.szType)) ? strlen(m_devCatInfo.szType) : MAX_DEV_TYPE_LEN);
-	strncpy_s(devInfo.szVendor, m_devCatInfo.szVendor, (MAX_DEV_VENDOR_LEN > strlen(m_devCatInfo.szVendor)) ? strlen(m_devCatInfo.szVendor) : MAX_DEV_VENDOR_LEN);
+	strncpy_s(devInfo.szModel, m_devCatInfo.szModel, (MAX_DEV_MODEL_LEN > strlen(m_devCatInfo.szModel)) ? strlen(m_devCatInfo.szModel) : MAX_DEV_MODEL_LEN-1);
+	strncpy_s(devInfo.szType, m_devCatInfo.szType, (MAX_DEV_TYPE_LEN > strlen(m_devCatInfo.szType)) ? strlen(m_devCatInfo.szType) : MAX_DEV_TYPE_LEN-1);
+	strncpy_s(devInfo.szVendor, m_devCatInfo.szVendor, (MAX_DEV_VENDOR_LEN > strlen(m_devCatInfo.szVendor)) ? strlen(m_devCatInfo.szVendor) : MAX_DEV_VENDOR_LEN-1);
 #else
-	strncpy(devInfo.szModel, m_devCatInfo.szModel, (MAX_DEV_MODEL_LEN > strlen(m_devCatInfo.szModel)) ? strlen(m_devCatInfo.szModel) : MAX_DEV_MODEL_LEN);
-	strncpy(devInfo.szType, m_devCatInfo.szType, (MAX_DEV_TYPE_LEN > strlen(m_devCatInfo.szType)) ? strlen(m_devCatInfo.szType) : MAX_DEV_TYPE_LEN);
-	strncpy(devInfo.szVendor, m_devCatInfo.szVendor, (MAX_DEV_VENDOR_LEN > strlen(m_devCatInfo.szVendor)) ? strlen(m_devCatInfo.szVendor) : MAX_DEV_VENDOR_LEN);
+	strncpy(devInfo.szModel, m_devCatInfo.szModel, (MAX_DEV_MODEL_LEN > strlen(m_devCatInfo.szModel)) ? strlen(m_devCatInfo.szModel) : MAX_DEV_MODEL_LEN-1);
+	strncpy(devInfo.szType, m_devCatInfo.szType, (MAX_DEV_TYPE_LEN > strlen(m_devCatInfo.szType)) ? strlen(m_devCatInfo.szType) : MAX_DEV_TYPE_LEN-1);
+	strncpy(devInfo.szVendor, m_devCatInfo.szVendor, (MAX_DEV_VENDOR_LEN > strlen(m_devCatInfo.szVendor)) ? strlen(m_devCatInfo.szVendor) : MAX_DEV_VENDOR_LEN-1);
 #endif // RVC_OS_WIN
 
 	return Error_Succeed;

+ 3 - 1
Module/mod_FingerPrint/FingerPrintFSM.h

@@ -278,7 +278,9 @@ public:
 	void ResetDevInitFlag() { m_bOpened = false; }//À¶ÑÀ¶àºÏһʹÓÃ
 	void SetInWhatPage(int bValue) { m_iInWhatPage = bValue; }
 
-
+	DevStateEnum GetDevState(){
+		return m_devState;
+	}
 
 	void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
 

+ 2 - 1
Module/mod_FingerPrint/mod_FingerPrint.h

@@ -144,13 +144,14 @@ public:
 		LogWarn(Severity_Low, Error_Unexpect, LOG_ERR_FINGERPRINT_REQUEST_REFUSE, "web invoke CheckAndMatch request refuse");
 		ctx->Answer(Error_Exception);
 	}
-	//废弃
+	//设备安装状态使用
 	void GetDevInfo(SpReqAnsContext<FingerPrintService_GetDevInfo_Req, FingerPrintService_GetDevInfo_Ans>::Pointer ctx)
 	{
 		DevCategoryInfo devCatInfo;
 		m_fsm.GetDevCatInfo(devCatInfo);
 		ctx->Ans.model = devCatInfo.szModel;
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetDevInfo model is:%s", (const char*)ctx->Ans.model);
+		ctx->Ans.state = (int)m_fsm.GetDevState();
 		ctx->Answer(Error_Succeed);
 	}
 	//废弃

+ 10 - 0
Module/mod_IDCertificate/mod_IDCertificate.h

@@ -183,6 +183,16 @@ public:
 		if (ctx->Ans.model.GetLength() < 256)
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetDevInfo")
 			("%s", (const char*)ctx->Ans.model);
+
+		if (m_fsm.GetDevInitFlag())
+		{
+			ctx->Ans.state = DEVICE_STATUS_NORMAL;
+		}
+		else
+		{
+			ctx->Ans.state = DEVICE_STATUS_NOT_READY;
+		}
+
 		ctx->Answer(Error_Succeed);
 	}
 

+ 2 - 2
Module/mod_ResourceWatcher/ResourceWatcherFSM.cpp

@@ -667,10 +667,10 @@ ErrorCodeEnum ResourceWatcherFSM::OnInit()
     mLastACLineStatus = -1;
     mLastBatteryPercent = -1;
     mLastNetStatus = -1;
-    terminalStatusSwitch = 0; //默认关闭
+    //terminalStatusSwitch = 0; //默认关闭
     tmpMessageWindFlag = false;
 
-    spCtSettingConfig->ReadConfigValueInt("ResourceWatcher", "TerminalStatusSwitch", terminalStatusSwitch);
+    //spCtSettingConfig->ReadConfigValueInt("ResourceWatcher", "TerminalStatusSwitch", terminalStatusSwitch);
     if (m_RvcSysinfo.strMachineType == "RVC.CardPrinter") {
         CSimpleStringA tType("");
         spCtSettingConfig->ReadConfigValue("Chromium", "WebMask_RVC.CardPrinter", tType);

+ 43 - 4
Module/mod_ResourceWatcher/mod_ResourceWatcher.cpp

@@ -1617,11 +1617,17 @@ void ResourceWatcherEntity::DoCheckSogouProcessStatus()
             }
         }
     } else {
-        if (sogouProcessRun == 0)//进程未运行
+        SogouInstallInfo info;
+        GetSogouInstallInfo(info);
+
+        if (!info.program.IsTSFVersion()) //如果是旧版本搜狗,则检测是否启动
         {
-            LogWarn(Severity_Middle, Error_Debug, LOG_RESOURCEWATCHER_SOGOU_PROCESS_STATUS_CHANGE, "搜狗进程未启动!");
-            DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR040250A01Z101").setResultCode("RTA5A01")("搜狗未启动!");
-            sogouProcessRun = -1; //进程未启动告警一次即可
+            if (sogouProcessRun == 0)//进程未运行
+            {
+                LogWarn(Severity_Middle, Error_Debug, LOG_RESOURCEWATCHER_SOGOU_PROCESS_STATUS_CHANGE, "搜狗进程未启动!");
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR040250A01Z101").setResultCode("RTA5A01")("搜狗未启动!");
+                sogouProcessRun = -1; //进程未启动告警一次即可
+            }
         }
     }
     CloseHandle(hProcessSnap);
@@ -2764,8 +2770,41 @@ void ResourceWatcherEntity::FetchSystemSnapshot(
     }
 }
 
+#if defined(RVC_OS_WIN)
+
 SP_BEGIN_ENTITY_MAP()
 SP_ENTITY(ResourceWatcherEntity)
 SP_END_ENTITY_MAP()
 
+#else
+ResourceWatcherEntity cur;
+class SpEntityModuleStub : public ModuleBase
+{
+public:
+    SpEntityModuleStub()
+    {
+
+        try {
+            //ResourceWatcherEntity* cur = new ResourceWatcherEntity();
+            // 内存分配成功
+            m_pEntityArray[m_nEntityCount++] = dynamic_cast<CEntityBase*>(&cur);
+        }
+        catch (const std::bad_alloc& e) {
+            // 内存分配失败,捕获异常
+            Dbg("ResourceWatcher Error: Memory allocation failed for ResourceWatcherEntity.  %s", e.what());
+            // 处理错误
+        }
+        catch (...) {
+            Dbg("ResourceWatcher Error: other for ResourceWatcherEntity");
+        }
+        Dbg("ResourceWatcher SpEntityModuleStub end");
+    }
+};
+SpEntityModuleStub g_ModuleInst;
+extern "C" void __attribute__((constructor)) SoMain() {
+    g_ModuleInst.DllMain(NULL, DLL_PROCESS_ATTACH, NULL);
+}
+
+#endif
+
 

+ 7 - 7
Module/mod_accessauth/AccessAuthFSM.cpp

@@ -196,7 +196,7 @@ struct TimeSynTask : ITaskSp
 		timeSyncReq.curTime = CSmallDateTime::GetNow().GetTime64();
 
 		HttpClientResponseResult result;
-		HttpClientRequestConfig config(HttpRequestMethod::POST, m_fsm->GetmAccessAuthHost().GetData());
+		HttpClientRequestConfig config(HttpRequestMethod::POST, m_fsm->GetmAccessAuthHost().GetData(), &SpGetToken);
 		config.SetChildUri("/api/v3/sessionkey");
 		SP::Module::Restful::FulfillRequestJsonBody(&config, timeSyncReq);
 		RestfulClient client = RestfulClient::getInstance();
@@ -362,7 +362,7 @@ struct UpdateWKTask : ITaskSp
 			}
 			else {
 				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("LoadKeysToPinPadNew")
-					("UpdateWKTask 加载秘钥到密码键盘失败,请检查密码键盘连接状态. error = %08X", eLoadErr);
+					("UpdateWKTask 密钥加载失败,请检查密码键盘连接. error = %08X", eLoadErr);
 			}
 		}
 		else {
@@ -382,8 +382,8 @@ struct UpdateWKTask : ITaskSp
 #else
 		struct UpdateWKReq
 		{
-			string terminalNo;
-			string encRandom;
+			std::string terminalNo;
+			std::string encRandom;
 			string tpkKeyCheck; //tpk密钥校验值
 			string edkKeyCheck; //edk密钥校验值
 			string keyIndex; //密钥序号
@@ -436,7 +436,7 @@ struct UpdateWKTask : ITaskSp
 		}
 
 		HttpClientResponseResult result;
-		HttpClientRequestConfig config(HttpRequestMethod::POST, m_fsm->GetmAccessAuthHost().GetData());
+		HttpClientRequestConfig config(HttpRequestMethod::POST, m_fsm->GetmAccessAuthHost().GetData(), &SpGetToken);
 		config.SetChildUri("/api/v5/wkupdate");
 
 		SP::Module::Restful::FulfillRequestJsonBody(&config, updateWKReq);
@@ -472,7 +472,7 @@ struct UpdateWKTask : ITaskSp
 				return;
 			}
 			else {
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("UpdateWKTask 加载秘钥到密码键盘失败,请检查密码键盘连接状态. error = %08X", rc);
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("UpdateWKTask 密钥加载失败,请检查密码键盘连接。 error = %08X", rc);
 			}
 		}
 		else {
@@ -622,7 +622,7 @@ struct GetTokenTask : ITaskSp
 		} getTokenAns;
 
 		HttpClientResponseResult result;
-		HttpClientRequestConfig config(HttpRequestMethod::POST, m_fsm->GetmAccessAuthHost().GetData());
+		HttpClientRequestConfig config(HttpRequestMethod::POST, m_fsm->GetmAccessAuthHost().GetData(), &SpGetToken);
 		config.SetChildUri("/api/v3/access");
 
 		getTokenReqJson.installVersion = getTokenReq.installVersion;

+ 1 - 1
Module/mod_accessauth/AccessAuthFSM.h

@@ -307,7 +307,7 @@ typedef struct CInitlizerMKReq : CHTTPReq {
 		rvcJson.AddNumberToObject(REFLECTION(loginWay), loginWay);
 		rvcJson.AddStringToObject(REFLECTION(encRandom), (char*)encRandom.c_str());
 		rvcJson.AddStringToObject(REFLECTION(tpkKeyCheck), (char*)tpkKeyCheck.c_str());
-		rvcJson.AddStringToObject(REFLECTION(edkKeyCheck), (char*)edkKeyCheck.c_str());;
+		rvcJson.AddStringToObject(REFLECTION(edkKeyCheck), (char*)edkKeyCheck.c_str());
 		rvcJson.AddStringToObject(REFLECTION(keyIndex), (char*)keyIndex.c_str());
 		string ret;
 		char* tmp = rvcJson.GetJsonStr();

+ 73 - 18
Module/mod_accessauth/mod_AccessAuth.cpp

@@ -69,11 +69,37 @@ struct InitializerInitMKTask : ITaskSp
 					, initMKRet.m_userCode.c_str(), initMKRet.m_errMsg.c_str()));
 				return;
 			}
+
+			//服务端返回成功再将数据写入AcessAuthourization.ini
+			CSmartPointer<IConfigInfo> pConfig;
+			auto rc = m_entity->GetFunction()->OpenConfig(Config_Run, pConfig);
+			rc = pConfig->WriteConfigValue("TerminalPD", "PublicKey", m_entity->m_publicKey);
+			if (rc != Error_Succeed) {
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("write public key failed.");
+				m_entity->EndInitMK(ERR_INITIALIZER_INIT_EXCEPTION, "公钥写入失败,请重新初始化。");
+				return;
+			}
+			else
+			{
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("write public key success.");
+			}
+
+			rc = pConfig->WriteConfigValue("TerminalPD", "PrivateKey", m_entity->m_privateKey);
+			if (rc != Error_Succeed) {
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("write pri key failed.");
+				m_entity->EndInitMK(ERR_INITIALIZER_INIT_EXCEPTION, "私钥写入失败,请重新初始化。");
+				return;
+			}
+			else
+			{
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("write pri key success.");
+			}
+
 			if (m_entity->HasPinPad()) {
 				if (m_entity->LoadKeysToPinPadACS(tmkpair.second, initMKRet.tpk, initMKRet.edk, initMKRet.keyIndex) == Error_Succeed)
 					m_entity->EndInitMK(Error_Succeed, "");
 				else
-					m_entity->EndInitMK(ERR_ACCESSAUTH_CONNECT_PINPAD, "加载秘钥到密码键盘失败,请检查密码键盘连接状态,多次失败请联系厂商排查。");//,待完善细化错误码oiltest
+					m_entity->EndInitMK(ERR_ACCESSAUTH_CONNECT_PINPAD, "密钥加载失败,请检查密码键盘连接。");//,待完善细化错误码oiltest
 			}
 			else
 				m_entity->EndInitMK(Error_Succeed, "");
@@ -82,6 +108,7 @@ struct InitializerInitMKTask : ITaskSp
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("InitializerInitMKTask").setBeginTime(beg).setEndTime(end).
 				setResultCode(std::to_string(LONGLONG(initMKRet.m_sysCode)).c_str()).
 				setResultMsg(initMKRet.m_errMsg.c_str())("InitializerInitMKTask Connect Failed.");
+			m_entity->EndInitMK(ERR_INITIALIZER_INIT_EXCEPTION, CSimpleStringA::Format("初始化服务连接失败。%d", ret).GetData());
 		}
 		client->Destory();
 #else
@@ -165,7 +192,7 @@ struct InitializerInitMKTask : ITaskSp
 		} instanceAns;
 
 		HttpClientResponseResult result;
-		HttpClientRequestConfig config(HttpRequestMethod::POST, m_entity->GetInitUrl().GetData());
+		HttpClientRequestConfig config(HttpRequestMethod::POST, m_entity->GetInitUrl().GetData(), &SpGetToken);
 		config.SetChildUri("/api/v5/initmk");
 		SP::Module::Restful::FulfillRequestJsonBody(&config, instanceReq);
 
@@ -186,6 +213,31 @@ struct InitializerInitMKTask : ITaskSp
 				m_entity->EndInitMK(ERR_INITIALIZER_INIT_EXCEPTION, responseStatus.errorMsg.c_str());
 			}
 			else {
+				//服务端返回成功再将数据写入AcessAuthourization.ini
+				CSmartPointer<IConfigInfo> pConfig;
+				auto rc = m_entity->GetFunction()->OpenConfig(Config_Run, pConfig);
+				rc = pConfig->WriteConfigValue("TerminalPD", "PublicKey", m_entity->m_publicKey);
+				if (rc != Error_Succeed) {
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("write public key failed.");
+					m_entity->EndInitMK(ERR_INITIALIZER_INIT_EXCEPTION, "公钥写入失败,请重新初始化。");
+					return;
+				}
+				else
+				{
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("write public key success.");
+				}
+
+				rc = pConfig->WriteConfigValue("TerminalPD", "PrivateKey", m_entity->m_privateKey);
+				if (rc != Error_Succeed) {
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("write pri key failed.");
+					m_entity->EndInitMK(ERR_INITIALIZER_INIT_EXCEPTION, "私钥写入失败,请重新初始化。");
+					return;
+				}
+				else
+				{
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("write pri key success.");
+				}
+
 				if (m_entity->HasPinPad()) {
 					const bool testResult = SP::Module::Restful::ExtractDataFromDebranchResponse(result.content, instanceAns);
 					Dbg("ExtractDataFromDebranchResponse returned: %d", testResult);
@@ -193,7 +245,7 @@ struct InitializerInitMKTask : ITaskSp
 						m_entity->EndInitMK(Error_Succeed, "");
 					}
 					else {
-						m_entity->EndInitMK(ERR_ACCESSAUTH_CONNECT_PINPAD, "加载秘钥到密码键盘失败,请检查密码键盘连接状态,多次失败请联系厂商排查。");//,待完善细化错误码oiltest
+						m_entity->EndInitMK(ERR_ACCESSAUTH_CONNECT_PINPAD, "密钥加载失败,请检查密码键盘连接。");//,待完善细化错误码oiltest
 					}
 				}
 				else {
@@ -203,7 +255,7 @@ struct InitializerInitMKTask : ITaskSp
 		}
 		else {
 			Dbg("post wk failed: %s", result.WhatError().c_str());
-			m_entity->EndInitMK(ERR_INITIALIZER_INIT_EXCEPTION, result.WhatError().c_str());
+			m_entity->EndInitMK(ERR_INITIALIZER_INIT_EXCEPTION, CSimpleStringA::Format("初始化服务连接失败。%s", result.WhatError().c_str()).GetData());
 		}
 #endif //RVC_OS_WIN
 	}
@@ -651,7 +703,7 @@ bool CAccessAuthEntity::SaveAuthKey(BYTE *pKey)
 #endif // RVC_OS_WIN
 		if (strlen(privateKey) <= 0)
 		{
-			printPasswdError("密钥集丢失(私钥为空),请重新初始化密钥!");
+			printPasswdError("密钥集丢失(私钥为空),请重置秘钥进行初始化");
 			return false;
 		}
 	}
@@ -670,8 +722,8 @@ bool CAccessAuthEntity::SaveAuthKey(BYTE *pKey)
 	int decryprtLen = BUF_SIZE;
 	if (!DecWithSM4_ECB("s5da69gnh4!963@6s5da69gnh4!963@6", (BYTE*)pDecodedPrivateKey, decodedPrivateKeyLen, (BYTE*)pDecryptPrivateKey, &decryprtLen)) {
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("SaveAuthVerAndKey")
-			("DecWithSM4_ECB decrypt privateKey error.");
-		printPasswdError("密钥集丢失(SM4解密私钥失败),请重新初始化密钥!");
+			("DecWithSM4_ECB decrypt privateKey error. SM4解密私钥失败");
+		printPasswdError("终端初始化未完成,请重置秘钥进行初始化");
 		delete[] pDecodedPrivateKey;
 		return false;
 	}
@@ -696,7 +748,7 @@ bool CAccessAuthEntity::SaveAuthKey(BYTE *pKey)
 	memcpy(key, pKey + 4, kenLen);
 	if (!DecWithSM2PriKey((BYTE*)key, kenLen, (BYTE*)pPlainKey, &plainKeyLen, (BYTE*)pDecryptPrivateKey, decryprtLen)) {
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("SaveAuthVerAndKey")("使用私钥解密失败!");
-		printPasswdError("密钥集丢失(使用私钥解密失败),请重新初始化密钥!");
+		printPasswdError("终端初始化未完成,请重置秘钥进行初始化");
 		return false;
 	}
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SaveAuthVerAndKey")("使用私钥解密成功。。。");
@@ -963,7 +1015,7 @@ bool CAccessAuthEntity::GetTerminalPublicKey(BYTE *pBuf, int &nBufLen)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("GetTerminalPublicKey")("读取公钥失败,公钥长度小于等于零!");
 			if (!ExistsFileA(iniPath))
-				printPasswdError("密钥集丢失(公钥为空),请重新初始化密钥!");
+				printPasswdError("密钥集丢失(公钥为空),请重置秘钥进行初始化");
 			return false;
 		}
 	}
@@ -1041,8 +1093,10 @@ bool CAccessAuthEntity::GetTerminalPublicKey(BYTE *pBuf, int &nBufLen, string &p
 #endif // RVC_OS_WIN
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetTerminalPublicKey")("pEncode=%s,%d", pEncode, strlen(pEncode));
 
-	rc = pConfig->WriteConfigValue("TerminalPD", "PublicKey", pEncode);
-	assert(rc == Error_Succeed);
+	/*rc = pConfig->WriteConfigValue("TerminalPD", "PublicKey", pEncode);
+	assert(rc == Error_Succeed);*/
+
+	m_publicKey = pEncode;
 	pubkey = pEncode;
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetTerminalPublicKey")("write public key success.");
 
@@ -1050,7 +1104,8 @@ bool CAccessAuthEntity::GetTerminalPublicKey(BYTE *pBuf, int &nBufLen, string &p
 	int cryptPrivateKeyLen = BUF_SIZE;
 	if (!EncWithSM4_ECB("s5da69gnh4!963@6s5da69gnh4!963@6", btPrivateKey, iPrivateKeyLen, pCryptPrivateKey, &cryptPrivateKeyLen)) {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetTerminalPublicKey")("sm4 crypt privateKey error.");
-		rc = pConfig->WriteConfigValue("TerminalPD", "PublicKey", "");
+		/*rc = pConfig->WriteConfigValue("TerminalPD", "PublicKey", "");*/
+		m_publicKey = "";
 		delete[] pEncode;
 		return false;
 	}
@@ -1065,13 +1120,14 @@ bool CAccessAuthEntity::GetTerminalPublicKey(BYTE *pBuf, int &nBufLen, string &p
 #endif // RVC_OS_WIN
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetTerminalPublicKey")("encode pri key success.");
 
-	rc = pConfig->WriteConfigValue("TerminalPD", "PrivateKey", pEncodedCryptPrivateKey);
+	m_privateKey = pEncodedCryptPrivateKey;
+	/*rc = pConfig->WriteConfigValue("TerminalPD", "PrivateKey", pEncodedCryptPrivateKey);
 	if (rc != Error_Succeed) {
 		rc = pConfig->WriteConfigValue("TerminalPD", "PublicKey", "");
 		delete[] pEncodedCryptPrivateKey;
 		return false;
 	}
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetTerminalPublicKey")("write pri key success.");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetTerminalPublicKey")("write pri key success.");*/
 	publicKey = pEncode;
 	delete[] pEncode;
 	delete[] pEncodedCryptPrivateKey;
@@ -1427,7 +1483,7 @@ bool CAccessAuthEntity::IsMachineTypeConfigurePinPad(CSimpleStringA strMachineTy
 		if (tmpFWBDevSN.IsNullOrEmpty())
 		{
 			return false;
-}
+		}
 		else
 		{
 			return true;
@@ -1541,15 +1597,14 @@ bool CAccessAuthEntity::SendInitMKReqACS(CInitlizerMKReq& initMKReq)
 	CSimpleStringA strPinPadID = "", strDeviceID = "";
 	bool hasPinPad;
 	int nRet = GetPinPadIDAndDeviceID(strPinPadID, strDeviceID, hasPinPad);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SendInitMKReqACS")
+		("GetPinPadIDAndDeviceID ret: %d, PinPadID: %s, DeviceID: %s", nRet, (const char*)strPinPadID, (const char*)strDeviceID);
 
 	if (nRet < 0)
 	{
 		return false; //具有pinpad的设备调用pinpad失败
 	}
 
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SendInitMKReqACS")
-		("GetPinPadIDAndDeviceID ret: %d, PinPadID: %s, DeviceID: %s", nRet, (const char*)strPinPadID, (const char*)strDeviceID);
-
 	// 从系统获取设备信息和硬件信息	
 	// 变长结构初始化
 	char buf2[512];

+ 3 - 0
Module/mod_accessauth/mod_AccessAuth.h

@@ -184,6 +184,9 @@ public:
 	pair<string, string> EncryptedByPubKey(CSimpleStringA pubKey, bool bNeed04Head = false);
 	void GetTermSysInfo();
 
+	CSimpleStringA m_publicKey;
+	CSimpleStringA m_privateKey;
+
 protected:
 	CAccessAuthFSM m_FSM;
 	CSystemStaticInfo m_info;

+ 1 - 1
Module/mod_alarm/AlarmFSM.cpp

@@ -135,7 +135,7 @@ namespace Task
 #else
 		bool SendAlarmTaskImpl() {
 			HttpClientResponseResult result;
-			HttpClientRequestConfig config(HttpRequestMethod::POST, m_fsm->m_sendUrl.GetData());
+			HttpClientRequestConfig config(HttpRequestMethod::POST, m_fsm->m_sendUrl.GetData(), &SpGetToken);
 
 			string reqStr = "";
 			if(m_fsm->m_unSendAlarm.IsNullOrEmpty()){

+ 33 - 33
Module/mod_cardissuer/CardIssuer.xml

@@ -1,18 +1,18 @@
 <?xml version="1.0" encoding="gb2312" ?>
 <entity name="CardIssuer">
 	<class name="CardIssuerService" overlap="true" exclusive="false">	
-		<twoway name="Insert" overlap="true">
+		<twoway name="Insert" overlap="true" method_id="0">
 			<req>
 				<param name="aid" type="string"/>
 			</req>
 			<res>
 			</res>			
 		</twoway>
-		<oneway name="CancelInsert" overlap="true">			
+		<oneway name="CancelInsert" overlap="true" method_id="1">			
 		</oneway>
-		<oneway name="InsertWaitMore" overlap="true">			
+		<oneway name="InsertWaitMore" overlap="true" method_id="2">			
 		</oneway>					
-		<twoway name="Read" overlap="true">
+		<twoway name="Read" overlap="true" method_id="3">
 			<req>
 				<param name="aid" type="string"/>
 				<param name="reserved1" type="int"/>
@@ -38,19 +38,19 @@
 				<param name="reserved4" type="string"/>
 			</res>
 		</twoway>			
-		<twoway name="Capture" overlap="true">
+		<twoway name="Capture" overlap="true" method_id="4">
 			<req>
 			</req>
 			<res>
 			</res>			
 		</twoway>
-		<twoway name="Eject" overlap="true">
+		<twoway name="Eject" overlap="true" method_id="5">
 			<req>
 			</req>
 			<res>
 			</res>			
 		</twoway>						
-		<twoway name="PreOnline" overlap="true">
+		<twoway name="PreOnline" overlap="true" method_id="6">
 			<req>
 				<param name="businessData" type="string"/>
 				<param name="reserved1" type="string"/>
@@ -60,7 +60,7 @@
 				<param name="result" type="string"/>
 			</res>			
 		</twoway>
-		<twoway name="PostOnline" overlap="true">
+		<twoway name="PostOnline" overlap="true" method_id="7">
 			<req>
 				<param name="data" type="string"/>
 			</req>
@@ -68,15 +68,15 @@
 				<param name="result" type="string"/>
 			</res>			
 		</twoway>
-		<oneway name="Exit" overlap="true">			
+		<oneway name="Exit" overlap="true" method_id="8">			
 		</oneway>			
-		<twoway name="Issue" overlap="true">
+		<twoway name="Issue" overlap="true" method_id="9">
 			<req>
 			</req>
 			<res>
 			</res>			
 		</twoway>				
-		<twoway name="GetMaterialCount" overlap="true">
+		<twoway name="GetMaterialCount" overlap="true" method_id="10">
 			<req>
 			</req>
 			<res>
@@ -86,7 +86,7 @@
 				<param name="mixed" type="int"/>
 			</res>			
 		</twoway>
-		<twoway name="SetMaterialCount" overlap="true">
+		<twoway name="SetMaterialCount" overlap="true" method_id="11">
 			<req>
 				<param name="remains" type="int"/>
 				<param name="captured" type="int"/>
@@ -100,9 +100,9 @@
 			<res>
 			</res>			
 		</twoway>
-		<oneway name="SetIssueFlag" overlap="true">			
+		<oneway name="SetIssueFlag" overlap="true" method_id="12">			
 		</oneway>
-		<twoway name="ReadEx" overlap="true">
+		<twoway name="ReadEx" overlap="true" method_id="13">
 			<req>
 				<param name="aid" type="string"/>
 				<param name="reserved1" type="string"/>
@@ -126,7 +126,7 @@
 				<param name="reserved2" type="string"/>
 			</res>
 		</twoway>
-		<twoway name="QueryCardInfo" overlap="true">
+		<twoway name="QueryCardInfo" overlap="true" method_id="14">
 			<req>
 			</req>
 			<res>
@@ -135,7 +135,7 @@
 				<param name="reserved2" type="string"/>
 			</res>			
 		</twoway>
-		<twoway name="WriteTrack" overlap="true">
+		<twoway name="WriteTrack" overlap="true" method_id="15">
 			<req>
 				<param name="mode" type="int"/>
 				<param name="co" type="int"/>
@@ -150,7 +150,7 @@
 				<param name="reserved2" type="string"/>
 			</res>
 		</twoway>
-		<twoway name="GetMaterialCountEx" overlap="true">
+		<twoway name="GetMaterialCountEx" overlap="true" method_id="16">
 			<req>
 				<param name="GetHopper" type="array_int"/>
 				<param name="reserved1" type="array_int"/>
@@ -173,7 +173,7 @@
 				<param name="reserved2" type="array_string"/>
 			</res>			
 		</twoway>
-		<twoway name="SetMaterialCountEx" overlap="true">
+		<twoway name="SetMaterialCountEx" overlap="true" method_id="17">
 			<req>
 				<param name="SetHopper" type="array_int"/>
 				<param name="SetCaptured" type="int"/>
@@ -196,7 +196,7 @@
 				<param name="reserved2" type="array_string"/>	
 			</res>			
 		</twoway>
-		<twoway name="SetSomeFlag" overlap="true">
+		<twoway name="SetSomeFlag" overlap="true" method_id="18">
 			<req>
 				<param name="IssueBusiness" type="int"/>
 				<param name="reserved1" type="array_int"/>
@@ -207,7 +207,7 @@
 				<param name="reserved2" type="array_string"/>
 			</res>				
 		</twoway>
-		<twoway name="GetSCIInfo" overlap="true">
+		<twoway name="GetSCIInfo" overlap="true" method_id="19">
 			<req>
 			</req>
 			<res>
@@ -217,7 +217,7 @@
 				<param name="reserved2" type="array_string"/>
 			</res>			
 		</twoway>
-		<twoway name="IssueEx" overlap="true">
+		<twoway name="IssueEx" overlap="true" method_id="20">
 			<req>
 				<param name="hopper" type="int"/>
 				<param name="reserved1" type="array_int"/>
@@ -228,7 +228,7 @@
 				<param name="reserved2" type="array_string"/>					
 			</res>			
 		</twoway>
-		<twoway name="OpenSafeLock" overlap="true">
+		<twoway name="OpenSafeLock" overlap="true" method_id="21">
 			<req>
 				<param name="reserved1" type="array_int"/>
 				<param name="reserved2" type="array_string"/>			
@@ -238,7 +238,7 @@
 				<param name="reserved2" type="array_string"/>					
 			</res>			
 		</twoway>
-		<twoway name="SAMICCommand" overlap="true">
+		<twoway name="SAMICCommand" overlap="true" method_id="22">
 			<req>
 				<param name="cmdType" type="int"/>
 				<param name="param1" type="array_int"/>
@@ -253,7 +253,7 @@
 				<param name="reserved2" type="array_string"/>					
 			</res>			
 		</twoway>
-		<twoway name="QueryPrinterStatus" overlap="true">
+		<twoway name="QueryPrinterStatus" overlap="true" method_id="23">
 			<req>
 				<param name="param1" type="array_int"/>
 				<param name="param2" type="array_string"/>
@@ -267,7 +267,7 @@
 				<param name="reserved2" type="array_string"/>					
 			</res>			
 		</twoway>
-		<twoway name="Print" overlap="true">
+		<twoway name="Print" overlap="true" method_id="24">
 			<req>
 				<param name="data1" type="blob"/>
 				<param name="data2" type="blob"/>
@@ -283,7 +283,7 @@
 				<param name="reserved2" type="array_string"/>					
 			</res>			
 		</twoway>
-		<twoway name="QuerySCIList" overlap="true">
+		<twoway name="QuerySCIList" overlap="true" method_id="25">
 			<req>			
 				<param name="reserved1" type="array_int"/>
 				<param name="reserved2" type="array_string"/>			
@@ -307,7 +307,7 @@
 				<param name="reserved2" type="array_string"/>					
 			</res>			
 		</twoway>		
-		<twoway name="BindSCI" overlap="true">
+		<twoway name="BindSCI" overlap="true" method_id="26">
 			<req>
 				<param name="type" type="int"/>
 				<param name="sciNo" type="string" />			
@@ -319,7 +319,7 @@
 				<param name="reserved2" type="array_string"/>					
 			</res>			
 		</twoway>
-		<twoway name="PreOnlineOnStore" overlap="true">
+		<twoway name="PreOnlineOnStore" overlap="true" method_id="27">
 			<req>
 				<param name="account" type="string"/>
 				<param name="termNo" type="string"/>
@@ -340,7 +340,7 @@
 				<param name="reserved4" type="array_string"/>				
 			</res>			
 		</twoway>
-		<twoway name="NotifyPreonline" overlap="true">
+		<twoway name="NotifyPreonline" overlap="true" method_id="28">
 			<req>
 				<param name="findCard" type="int"/>
 				<param name="cardPos" type="int"/>			
@@ -360,7 +360,7 @@
 				<param name="reserved4" type="array_string"/>				
 			</res>			
 		</twoway>
-		<twoway name="QueryCardInfoOnStore" overlap="true">
+		<twoway name="QueryCardInfoOnStore" overlap="true" method_id="29">
 			<req>
 				<param name="reserved1" type="array_int"/>
 				<param name="reserved2" type="array_int"/>
@@ -376,7 +376,7 @@
 				<param name="reserved4" type="array_string"/>				
 			</res>			
 		</twoway>
-		<twoway name="GetAddCardInfo" overlap="true">
+		<twoway name="GetAddCardInfo" overlap="true" method_id="30">
 			<req>
 				<param name="isSync" type="int"/>
 				<param name="reserved1" type="array_int"/>
@@ -395,7 +395,7 @@
 				<param name="reserved4" type="array_string"/>				
 			</res>			
 		</twoway>		
-		<twoway name="PrintCardImmediately" overlap="true">
+		<twoway name="PrintCardImmediately" overlap="true" method_id="31">
 			<req>
 				<param name="formFile" type="string"/>
 				<param name="printData" type="string"/>
@@ -412,7 +412,7 @@
 				<param name="reserved4" type="array_string"/>				
 			</res>			
 		</twoway>
-		<twoway name="QueryCIStatus" overlap="true">
+		<twoway name="QueryCIStatus" overlap="true" method_id="32">
 			<req>
 				<param name="reserved1" type="array_int"/>
 				<param name="reserved2" type="array_int"/>

+ 14 - 2
Module/mod_cardissuer/CardIssuerFSM.cpp

@@ -1516,6 +1516,7 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 
 		if (eErrDev == Error_Succeed)
 		{
+			ToLogRootINIInfo();
 			m_bOpened = true;
 			m_devOpenFailedCount = 0;
 			ZeroMemory(m_devCat.szModel, sizeof(m_devCat.szModel));
@@ -5070,7 +5071,6 @@ void CCardIssuerFSM::GetVendorDllName(CSimpleStringA& strDevAdaptorPath)
 	pEntity->LoadVendorLibName();
 	FulfillAdapterInfoFrom(pEntity->vendorLibInfo);
 	strDevAdaptorPath = m_adapterInfo.adapterFilePath;
-	ToLogRootINIInfo();
 	return;
 }
 bool CCardIssuerFSM::AccountExchange(const char *origAcc, CSimpleStringA &acc, int dir)
@@ -5218,6 +5218,7 @@ int CCardIssuerFSM::SplitDevModelInfo()
 		return -1;
 	}
 	m_csCM = "";
+	m_csRF = "";
 	CSimpleStringA csTmpModel(m_devCat.szModel);
 	CAutoArray<CSimpleStringA> arrParam;
 	arrParam.Init(16);
@@ -5228,6 +5229,11 @@ int CCardIssuerFSM::SplitDevModelInfo()
 		{
 			m_csCM = arrParam[i].SubString(3, arrParam[i].GetLength() - 3);
 		}
+		if (_strnicmp(arrParam[i], "RF", 2) == 0)
+		{
+			m_csRF = arrParam[i].GetData();//获取非接支持的字段值
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("szModel: RF=%s", m_csRF.GetData());
+		}
 	}
 	return 0;
 }
@@ -5356,7 +5362,12 @@ bool CCardIssuerFSM::IfUseRf()
 {
 	if (m_bStopUseRF)
 		return false;
-	
+
+	//加入szmodel非接字段属性判断
+	if (m_csRF.Compare("Y") == 0) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("szModel,RF=%s", m_csRF.GetData());
+		return true;
+	}	
 	CAutoArray<CSimpleStringA> arr = m_rfVendorList.Split('|');
 	//Dbg("%s,%d", m_rfVendorList.GetData(),arr.GetCount());
 	for (int i = 0; i < arr.GetCount(); ++i)
@@ -5365,5 +5376,6 @@ bool CCardIssuerFSM::IfUseRf()
 		if (m_adapterInfo.adapterFilePath.IndexOf(arr[i].GetData()) > 0)
 			return true;
 	}
+
 	return false;
 }

+ 2 - 2
Module/mod_cardissuer/CardIssuerFSM.h

@@ -955,8 +955,8 @@ private:
 
 	char *m_pDataToARQC;
 	long xxTest;
-	CSimpleStringA m_currCardNo, m_captureReason, m_csMachineType, m_csSite,m_terminalNo,m_addCardNo,m_addCardSerial
-		,m_csCM, m_rfVendorList, m_csDevSN;
+	CSimpleStringA m_currCardNo, m_captureReason, m_csMachineType, m_csSite, m_terminalNo, m_addCardNo, m_addCardSerial
+		, m_csCM, m_rfVendorList, m_csDevSN, m_csRF;
 	char m_AuthCode[2];
 	vector<CMBBin> m_vBin;
 	int SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData);

+ 10 - 4
Module/mod_cardissuer/CardIssuer_UserErrorCode.h

@@ -1,5 +1,5 @@
-#ifndef _CARDISSUERSTAND_USER_ERRORCODE_H
-#define _CARDISSUERSTAND_USER_ERRORCODE_H
+#ifndef _CARDISSUER_USER_ERRORCODE_H
+#define _CARDISSUER_USER_ERRORCODE_H
 #pragma once
 
 #define CardIssuer_UserErrorCode_Start 0x20300200
@@ -53,6 +53,7 @@
 #define CardIssuer_UserErrorCode_PrintCardFaceRightNow				(CardIssuer_UserErrorCode_Start + 44) //卡面打印
 #define CardIssuer_UserErrorCode_InsertCardSucceed					(CardIssuer_UserErrorCode_Start + 45) //前端插卡
 
+#define CardIssuer_UserErrorCode_StandEntityInFailState				(CardIssuer_UserErrorCode_Start + 46)	//卡机处于故障态,请稍后重试,重试还有问题请联系厂商维护
 
 #define CardIssuer_UserErrorCode_CardStore_SlotNum					(CardIssuer_UserErrorCode_Start + 49) //记录卡库容量
 #define CardIssuer_UserErrorCode_Invoke_Access_IniDev_Failed		(CardIssuer_UserErrorCode_Start + 50) //建立加密通道时,调用准入接口失败
@@ -91,7 +92,7 @@
 #define CardIssuer_UserErrorCode_AddCardToStoreStepFirst			(CardIssuer_UserErrorCode_Start + 74)	//加卡第一步,从卡箱移到读卡器
 #define CardIssuer_UserErrorCode_AddCardToStoreStepLast				(CardIssuer_UserErrorCode_Start + 75)	//加卡第二步,从读卡器移到卡槽
 #define CardIssuer_UserErrorCode_ReadAccount_Data_Error				(CardIssuer_UserErrorCode_Start + 76)	//加卡过程,卡片数据有误
-//#define CardIssuer_UserErrorCode_FindFirstEmptySlot_Failed			(CardIssuer_UserErrorCode_Start + 77)	//加卡过程,未找到空卡槽
+#define CardIssuer_UserErrorCode_AddCardToStoreStepFirst_Failed		(CardIssuer_UserErrorCode_Start + 77)	//加卡过程,移卡到卡槽失败
 #define CardIssuer_UserErrorCode_NotifyPreonline_Wait_TooLong		(CardIssuer_UserErrorCode_Start + 78)	//NotifyPreonline收到时已经超过等待时间
 
 //临时 后续去除
@@ -183,7 +184,7 @@
 #define CardIssuer_UserErrorCode_HopperCardMixed					(CardIssuer_UserErrorCode_Start + 164)	//卡箱中的卡片放置不对
 #define CardIssuer_UserErrorCode_CardActive_CardStore_OffLine		(CardIssuer_UserErrorCode_Start + 165)	//跨机时卡库不在线
 #define CardIssuer_UserErrorCode_ReadByRF							(CardIssuer_UserErrorCode_Start + 166)	//非接读取成功
-#define CardIssuer_UserErrorCode_CardActive_CardStore_Issuing		(CardIssuer_UserErrorCode_Start + 167)	//跨机时卡库正在本地领卡
+#define CardIssuer_UserErrorCode_CardActive_CardStore_Issuing		(CardIssuer_UserErrorCode_Start + 167)	//跨机时卡库正在本地领卡或加卡
 #define CardIssuer_UserErrorCode_CardActive_CardStore_CallByOther	(CardIssuer_UserErrorCode_Start + 168)	//跨机时卡库正在其他VTM调用
 #define CardIssuer_UserErrorCode_ReadAccount_Cost_Time				(CardIssuer_UserErrorCode_Start + 169)	//ReadAccount耗时
 #define CardIssuer_UserErrorCode_CardActive_CardIssuer_InFaultState	(CardIssuer_UserErrorCode_Start + 170)	//卡库收到跨机请求时卡机未成功打开
@@ -202,4 +203,9 @@
 #define CardIssuer_UserErrorCode_Dev_CardJammed				(CardIssuer_UserErrorCode_Start + 189)//塞卡
 #define CardIssuer_UserErrorCode_Dev_SlotJammed				(CardIssuer_UserErrorCode_Start + 190)//卡槽堵塞
 #define CardIssuer_UserErrorCode_Dev_SlotInvalid			(CardIssuer_UserErrorCode_Start + 191)//卡槽地址非法(越界等)
+
+//盘库异常明细报错
+#define CardIssuer_UserErrorCode_KakuPanKu_MoveCardFromSlot_Failed				(CardIssuer_UserErrorCode_Start + 200)	//卡库盘库失败,卡槽移卡失败
+#define CardIssuer_UserErrorCode_KakuPanKu_ReadAccount_Failed					(CardIssuer_UserErrorCode_Start + 201)	//卡库盘库失败,读卡失败吞卡
+#define CardIssuer_UserErrorCode_KakuPanKu_MoveCardToSlot_Failed				(CardIssuer_UserErrorCode_Start + 202)	//卡库盘库失败,卡移回卡槽失败
 #endif //_CARDISSUER_USER_ERRORCODE_H

+ 4 - 0
Module/mod_cardissuer/mod_cardissuer.h

@@ -257,9 +257,13 @@ public:
 	void IssueEx(SpReqAnsContext<CardIssuerService_IssueEx_Req, CardIssuerService_IssueEx_Ans>::Pointer ctx)
 	{
 		LOG_FUNCTION();
+		int state = m_fsm.GetFSMState();
 		if (!m_fsm.GetDevInitFlag()) {
 			ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed);
 		}
+		else if (state == 9) {
+			ctx->Answer(Error_InvalidState, CardIssuer_UserErrorCode_StandEntityInFailState);
+		}
 		else {
 			m_bNewSessionInit = false;
 			CardIssueExEvent* pEvt = new CardIssueExEvent();

+ 13 - 20
Module/mod_chromium/CModTools.cpp

@@ -122,14 +122,14 @@ namespace Chromium {
 
 		return true;
 #else
-		do 
+		do
 		{
-            boost::process::child child_process("sudo killall -9 cefclient");
-            child_process.wait();
+			boost::process::child child_process("sudo killall -9 uosbrowser");
+			child_process.wait();
 		} while (false);
 		do 
 		{
-            boost::process::child child_process("sudo killall -9 uosbrowser");
+            boost::process::child child_process("sudo killall -9 cefclient");
             child_process.wait();
 		} while (false);
 
@@ -231,20 +231,10 @@ namespace Chromium {
 		break;
 		case ERR_PAGE_REASON::ErrNotify:
 		{
-			errPageParams.Append(CSimpleStringA("reason=")).Append(std::get<0>(exParam).c_str())
-			.Append(CSimpleStringA(generate_url_prefix())).Append("&errmsg=").Append(std::get<1>(exParam).c_str());
-            if (std::get<2>(exParam).length() > 5 && showRebootTime)
-				errPageParams.Append(CSimpleStringA(generate_url_prefix())).Append("&reboottime=").Append(std::get<2>(exParam).c_str());
+			errPageParams.Append(CSimpleStringA("reason=")).Append(std::get<0>(exParam).c_str()).Append(CSimpleStringA(generate_url_prefix()));
 
 			errPageParams.Append(CSimpleStringA(generate_url_prefix())).Append(CSimpleStringA("&showlimit=")).Append(std::to_string((unsigned long long)1).c_str());
-			errPageParams.Append(CSimpleStringA(generate_url_prefix())).Append(CSimpleStringA("&terminalno=")).Append(std::get<0>(norParam).c_str());
-			errPageParams.Append(CSimpleStringA(generate_url_prefix())).Append(CSimpleStringA("&errtime=")).Append(std::get<1>(norParam).c_str());
-
-            CSimpleStringA strSysCode = CSimpleStringA::Format("0x%X", std::get<3>(exParam));
-            CSimpleStringA strUsrCode = CSimpleStringA::Format("0x%X", std::get<4>(exParam));
 
-			errPageParams.Append(CSimpleStringA(generate_url_prefix())).Append(CSimpleStringA("&syscode=")).Append(strSysCode);
-			errPageParams.Append(CSimpleStringA(generate_url_prefix())).Append(CSimpleStringA("&usercode=")).Append(strUsrCode);
 		}
 		break;
 		default:
@@ -516,7 +506,7 @@ namespace Chromium {
 	std::string CModTools::generateInstallCmd(std::string installUrl)
 	{
 #if defined(RVC_OS_LINUX)
-		return generateBrowserCMDForEverything(installUrl, 1);
+		return generateBrowserCMDForEverything(installUrl, 0);
 #else
 		CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
 		strCmdLine.Append(strChromiumPath).Append(" --url=").Append(installUrl.c_str());
@@ -768,8 +758,8 @@ namespace Chromium {
 		{
 			std::vector<std::string> installUrls;
 #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
-			installUrls.push_back("http://deviceinstallweb.paasst.cmbchina.cn");
-			installUrls.push_back("http://deviceinstallweb.paasst.cmbchina.com");
+			installUrls.push_back("https://deviceinstallweb.paasst.cmbchina.cn/inputTerminalNo");
+			installUrls.push_back("https://deviceinstallweb.paasst.cmbchina.cn/inputTerminalNo");
 #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
 			installUrls.push_back("http://deviceinstallweb.paasuat.cmbchina.cn");
 			installUrls.push_back("http://deviceinstallweb.paasuat.cmbchina.com");
@@ -777,8 +767,8 @@ namespace Chromium {
 			installUrls.push_back("http://deviceinstallweb.paas.cmbchina.cn");
 			installUrls.push_back("http://deviceinstallweb.paas.cmbchina.com");
 #else/*本地编译等非DevOps环境编译的版本*/
-			installUrls.push_back("http://deviceinstallweb.paasst.cmbchina.cn");
-			installUrls.push_back("http://deviceinstallweb.paasst.cmbchina.com");
+			installUrls.push_back("https://deviceinstallweb.paasst.cmbchina.cn/inputTerminalNo");
+			installUrls.push_back("https://deviceinstallweb.paasst.cmbchina.cn/inputTerminalNo");
 #endif
 			auto checkRet = DetectActiveHttp(installUrls);
 			if (!checkRet.first)
@@ -787,6 +777,9 @@ namespace Chromium {
 					CSimpleString::Format("install page check err, can not connect to %s or %s", installUrls[0].c_str(), installUrls[1].c_str()).GetData());
 			}
 			std::string dstInstallUrl = checkRet.first ? checkRet.second : installUrls[0];
+			CSimpleString runningVer = "";
+			m_pEntity->GetFunction()->GetRunningVersion(runningVer);
+			dstInstallUrl.append("?version=").append(runningVer.GetData());
 			auto strCmdLine = generateInstallCmd(dstInstallUrl);
 			auto openCefRet = openCef(strCmdLine, false);
 			if (Error_Succeed == openCefRet.first)

+ 2 - 0
Module/mod_chromium/CSocketClient.cpp

@@ -9,7 +9,9 @@
 #include <vector>
 #include <string>
 #include "publicFunExport.h"
+#if defined(RVC_OS_LINUX)
 #include <RestfulFunc.h>
+#endif
 #pragma comment(lib, "libpublicFun.lib")
 
 using boost::asio::ip::tcp;

+ 3 - 1
Module/mod_chromium/CWebsocketServer.cpp

@@ -642,7 +642,8 @@ namespace Chromium {
 
 	void CWebsocketServer::open_handler(websocketpp::connection_hdl hdl) {
 		// hand shake here
-		DbgEx("new connection to ws server : %u", hdl.lock().get());
+		server::connection_ptr con = m_wsserver.get_con_from_hdl(hdl);
+		DbgEx("new connection to ws server : %u, isSecure:%d, curUrl:%s", hdl.lock().get(), con->get_uri()->get_secure(), con->get_uri()->str().c_str());
 
 		m_connection_hdls.insert(std::pair<unsigned int, websocketpp::connection_hdl>((long)hdl.lock().get(), hdl));
 	}
@@ -1016,6 +1017,7 @@ namespace Chromium {
 			catch (...)
 			{
 				bSockUseError = true;
+				DbgEx("%s sock %d error", __FUNCTION__, DEFAULT_SERVER_PORT);
 			}
 			//释放
 			if (!bSockUseError && pSockTcp != NULL)

+ 2 - 0
Module/mod_chromium/CWebsocketServer.h

@@ -25,6 +25,7 @@ namespace Chromium {
 		
 		static void stopServer() {
 			m_wsserver.stop();
+			DbgEx("%s end", __FUNCTION__);
 		}
 
 		~CWebsocketServer()
@@ -34,6 +35,7 @@ namespace Chromium {
 			m_doRunThread.join();
 			m_doReLinkThread.join();
 			m_wsserver.stop();
+			DbgEx("%s end", __FUNCTION__);
 		}
 
 		void run();

+ 2 - 0
Module/mod_chromium/mod_chromium.cpp

@@ -501,9 +501,11 @@ namespace Chromium {
 
 	void CChromiumEntity::openInstallPage()
 	{
+		/*
 		LogWarn(Severity_Middle, Error_NotSupport, LOG_WARN_CHROMIUM_INSTALL_NOTSURPORT,
 			CSimpleStringA::Format("Not surport install mode").GetData());
 		return;
+		*/
 		auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::Install);
 		DbgEx("open page install %s, pid:%d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
 	}

+ 5 - 7
Module/mod_chromium/mod_chromium.h

@@ -35,14 +35,12 @@
 
 
 #pragma once
-namespace Chromium
-{
+namespace Chromium {
 
-#define BROWSER_TIMER_ID 0xF002
-#define BROWSER_TIMER_INTERVAL 3600000
+	#define BROWSER_TIMER_ID 0xF002
+	#define BROWSER_TIMER_INTERVAL 3600000
 
-	typedef struct
-	{
+	typedef struct {
 		std::string key;
 		std::string value;
 		std::string oldValue;
@@ -136,7 +134,7 @@ namespace Chromium
 		int getBrowserStartTimes();
 	private:
 		//subscribe
-		CUUID m_uidCameraListener, m_uuidAccessAuth, m_uuidResourceWatch, m_uidBrowserListenser, m_uuidAccessAuthErr, m_uuidAllFault, m_uuidVTMLoader;
+		CUUID m_uidCameraListener, m_uuidAccessAuth, m_uuidResourceWatch,m_uidBrowserListenser, m_uuidAccessAuthErr, m_uuidAllFault, m_uuidVTMLoader;
 		virtual void OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nLogID, const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
 			const DWORD dwSysError, const DWORD dwUserCode, const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
 			const CAutoArray<DWORD>& Param, const char* pszEntityName, const char* pszModuleName, const char* pszMessage, const linkContext& pLinkInfo);

+ 5 - 11
Module/mod_counterconnector/ConnectorFSM.cpp

@@ -259,27 +259,24 @@ BOOL ACMCallFSM::ReConnectionAssistchan()
 	return TRUE;
 }
 
-BOOL ACMCallFSM::ReConnectionSipphone()
+BOOL ACMCallFSM::ReConnectionSipphone(bool bLog)
 {
 	if (m_pPhoneClient != NULL){
 		m_pPhoneClient->GetFunction()->CloseSession();
 		m_pPhoneClient = NULL;
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Close sip Session");
 	}
 
 	if (m_pPhoneClient == NULL){
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ReConnection sip Session");
 		m_pPhoneClient = new MyPhoneClient(m_pEntity, this);
 		ErrorCodeEnum Error = m_pPhoneClient->Connect();
 		if (Error != Error_Succeed) {
-			LogWarn(Severity_Low, Error_Debug, EVENT_MOD_CONNECT_SIPPHONE_ERROR, "connect sip phone error");
+			if (bLog) {
+				LogWarn(Severity_Low, Error_Debug, EVENT_MOD_CONNECT_SIPPHONE_ERROR, "connect sip phone error");
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_phoneClient connect fail!");
+			}
 			m_pPhoneClient = NULL;
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_phoneClient connect fail!");
 			return FALSE;
 		}
-		else {
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("m_phoneClient connect success!");
-		}
 
 		if (Error == Error_Succeed)
 		{
@@ -291,9 +288,6 @@ BOOL ACMCallFSM::ReConnectionSipphone()
 				m_pPhoneClient = NULL;
 				return FALSE;
 			}
-			else {
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("BeginState sip success!");
-			}
 		}
 	}
 	return TRUE;

+ 2 - 21
Module/mod_counterconnector/ConnectorFSM.h

@@ -164,26 +164,7 @@ struct SessionParam
 #ifndef SUBID_LENGTH
 #define SUBID_LENGTH	8
 #endif
-//被动呼叫模式参数
-struct RVCCallingParam
-{
-	//呼叫模式,0:可视柜台正常呼叫,1:PAD主动外呼,2:PAD被动呼叫,来源PAD,3:PAD被动呼叫,来源手机端
-	int nCallType;
-	//分行编号
-	char strBranNo[MAX_LENGTH_OF_BRANCHNO];
-	//会话标识16位
-	char strConnectSession[MAX_LENGTH_OF_SESSIONID];
-	//连接IP 16位
-	char strConnectIp[MAX_LENGTH_OF_CONNECTIP]; 
-	//SIP端口
-	int nSipPort;
-	//协助通道端口
-	int nAsisstPort;
-	//客户经理subid
-	char strSubid[MAX_LENGTH_OF_SUBID]; 
-	//分行网关指令服务端口
-	int nInstructPort;
-};
+
 
 class ACMCallFSM : public FSMImpl<ACMCallFSM>, public IFSMStateHooker
 {
@@ -405,7 +386,7 @@ public:
 	unsigned int m_nLiveDetctionTime;
 
 	BOOL ReConnectionAssistchan();
-	BOOL ReConnectionSipphone();
+	BOOL ReConnectionSipphone(bool bLog = true);
 	BOOL ReConnectionSyncService();
 	
 	int GetCallRouteList();

+ 10 - 35
Module/mod_counterconnector/mod_counterconnector.cpp

@@ -108,8 +108,7 @@ void CCounterConnectorEntity::OnStarted()
 	CSimpleStringA uiState;
 	GetFunction()->GetSysVar("UIState", uiState);
 	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Get UIState %s", uiState.GetData());
-	if (uiState.GetLength() > 0 && uiState[0] == 'M')
-	{
+	if (uiState.GetLength() > 0 && uiState[0] == 'M'){
 		if (FALSE == m_bHasLaunched) {
 			m_bHasLaunched = TRUE;
 			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("UI has launched success.");
@@ -628,7 +627,6 @@ void CCounterConnectorEntity::OnTimeout(DWORD dwTimerID)
 		}
 	}
 	else if(2 == dwTimerID) {
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("m_fsm.m_bConAssist is %s.", m_fsm.m_bConAssist ? "TRUE" : "FALSE");
 		if (FALSE == m_fsm.m_bConAssist) {
 			if (m_fsm.ReConnectionAssistchan()) {
 				m_fsm.m_bConAssist = TRUE;
@@ -640,14 +638,17 @@ void CCounterConnectorEntity::OnTimeout(DWORD dwTimerID)
 		}
 	}
 	else if (3 == dwTimerID) {
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("m_fsm.m_bConSipphone is %s.", m_fsm.m_bConSipphone ? "TRUE" : "FALSE");
 		if (FALSE == m_fsm.m_bConSipphone) {
-			if (m_fsm.ReConnectionSipphone()) {
+			if (m_fsm.ReConnectionSipphone(false)) {
 				m_fsm.m_bConSipphone = TRUE;
 			}
+			else {
+				m_iConSipphoneFaileTimes++;
+				GetFunction()->ResetTimer(3, m_iConSipphoneFaileTimes*3000);
+			}
 		}
 
-		if (TRUE == m_fsm.m_bConSipphone) {
+		if (TRUE == m_fsm.m_bConSipphone || m_iConSipphoneFaileTimes >= 5) {
 			GetFunction()->KillTimer(3);
 		}
 	}
@@ -1027,22 +1028,7 @@ void CCounterConnectorSession::Handle_StartCallExternal(SpReqAnsContext<ConnectS
 {
 	DbgToBeidou(ctx->link, __FUNCTION__)();
 	ErrorCodeEnum rc = Error_Succeed;
-	RVCCallingParam* callparam = (RVCCallingParam*)ctx->Req.CommandParam.m_pData;
-
-	if (callparam){
-		m_pEntity->m_fsm.m_CallingParam.connect_ip = callparam->strConnectIp ; 
-		m_pEntity->m_fsm.m_CallingParam.connect_port = callparam->nSipPort;
-		m_pEntity->m_fsm.m_CallingParam.nCallType	= (CallingTypeEnum)callparam->nCallType;
-		m_pEntity->m_fsm.m_CallingParam.connect_session	= callparam->strConnectSession;
-		m_pEntity->m_fsm.m_CallingParam.subid = callparam->strSubid;
-		m_pEntity->m_fsm.m_CallingParam.assistant_port = callparam->nAsisstPort;
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Handle_StartCallExternal strConnectIp=%s, nSipPort=%d, nCallType=%d, strConnectSession=%s, strSubid=%s, nAsisstPort=%d", callparam->strConnectIp,
-			callparam->nSipPort, callparam->nCallType, callparam->strConnectSession, callparam->strSubid, callparam->nAsisstPort);
-	}
-	else{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get RVCCallingParam Failed!");
-	}
-	m_pEntity->m_fsm.m_bNeedQueueName = TRUE;
+
 	m_pEntity->m_fsm.PostEventFIFO(new FSMEvent(USER_EVT_COMMAND_CALL));
 	ctx->Answer((ErrorCodeEnum)rc);
 }
@@ -1051,19 +1037,8 @@ void CCounterConnectorSession::Handle_StopCall(SpReqAnsContext<ConnectService_St
 {
 	DbgToBeidou(ctx->link, __FUNCTION__)();
 	ErrorCodeEnum rc = Error_Succeed;
-	RVCCallingParam* callparam = (RVCCallingParam*)ctx->Req.SessionParam.m_pData;
-
-	if (callparam){
-		m_pEntity->m_fsm.m_SessionParam.connect_ip = callparam->strConnectIp ; 
-		m_pEntity->m_fsm.m_SessionParam.connect_session = callparam->strConnectSession;
-		m_pEntity->m_fsm.m_SessionParam.event_port = callparam->nInstructPort;
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Handle_StopCall strConnectIp=%s, strConnectSession=%s,event_port=%d", m_pEntity->m_fsm.m_SessionParam.connect_ip.GetData(),
-			m_pEntity->m_fsm.m_SessionParam.connect_session.GetData(), m_pEntity->m_fsm.m_SessionParam.event_port);
-	}
-	else{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get SessionParam Failed!");
-	}
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("holder hangup call!");
+
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Terminal hangup call!");
 	m_pEntity->m_fsm.PostEventFIFO(new FSMEvent(USER_EVT_HANGUP));
 	ctx->Answer((ErrorCodeEnum)rc);
 }

+ 4 - 1
Module/mod_counterconnector/mod_counterconnector.h

@@ -51,7 +51,9 @@ private:
 class CCounterConnectorEntity : public CEntityBase, public ILogListener, public ISysVarListener, public ITimerListener
 {
 public:
-	CCounterConnectorEntity() : m_fsm(), m_pCounterConnectorChannel(NULL), m_bConnectAssist(FALSE), m_bConnectSipphone(FALSE), m_iRouteType(0), m_iPickUpCallType(0){}
+	CCounterConnectorEntity() : m_fsm(), m_pCounterConnectorChannel(NULL), m_bConnectAssist(FALSE), m_bConnectSipphone(FALSE), m_iRouteType(0), m_iPickUpCallType(0){
+		m_iConSipphoneFaileTimes = 0;
+	}
 	virtual ~CCounterConnectorEntity() {}
 	virtual const char *GetEntityName() const { return "CounterConnector"; }
 	const char* GetEntityVersion() const { return MODULE_VERSION_FULL; }
@@ -108,6 +110,7 @@ private:
 	CUUID m_uidlivenessListener;
 	BOOL m_bConnectAssist;
 	BOOL m_bConnectSipphone;
+	int m_iConSipphoneFaileTimes;
 };
 
 #endif

+ 11 - 7
Module/mod_healthmanager/HealthManagerFSM.cpp

@@ -145,9 +145,10 @@ ErrorCodeEnum CHealthManagerFSM::Initial()
 	if (m_wkUpdatePeriod <= 0 || m_wkUpdatePeriod > 365)
 		m_wkUpdatePeriod = 30;//default
 	spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "DoNotUpdateWKDaily", m_iDoNotUpdateWKDaily);
-
-	//oilyang@20210929
-	GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "X");
+	CSimpleStringA csTmpTS("");
+	GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", csTmpTS);
+	if (csTmpTS.Compare("N") != 0)
+		GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "X");
 	WaitDeamonFinishTask* task = new WaitDeamonFinishTask(this);
 	GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
 
@@ -1806,11 +1807,14 @@ void CHealthManagerFSM::WKUpdatePeriod()
 	else
 	{
 		//if have exceed the time,we should update working key in the next peroid
-		int xTerm = atoi(m_sysInfo.strTerminalID.SubString(m_sysInfo.strTerminalID.GetLength() - 7, 7));
-		if ((todayDays % m_wkUpdatePeriod) != (xTerm % m_wkUpdatePeriod))
+		if (todayDays - lastUpdateDays < m_wkUpdatePeriod * 2)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("todayDays:%d, xTerm:%d, m_wkUpdatePeriod:%d", todayDays, xTerm, m_wkUpdatePeriod);
-			return;
+			int xTerm = atoi(m_sysInfo.strTerminalID.SubString(m_sysInfo.strTerminalID.GetLength() - 7, 7));
+			if ((todayDays % m_wkUpdatePeriod) != (xTerm % m_wkUpdatePeriod))
+			{
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("todayDays:%d, xTerm:%d, m_wkUpdatePeriod:%d", todayDays, xTerm, m_wkUpdatePeriod);
+				return;
+			}
 		}
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("begin update WK now");
 		ErrorCodeEnum eErrCode = Error_Succeed;

+ 9 - 6
Module/mod_healthmanager/mod_healthmanager.cpp

@@ -1107,7 +1107,9 @@ bool CHealthManagerEntity::DoRestart()
 
 	m_currentVer = m_sysStaticInfo.InstallVersion.ToString();
 	DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("DoRestart")("get current version [%s]", (LPCTSTR)m_currentVer);
-	if(csimpleStrMachineTypeCfg.IndexOf(m_sysStaticInfo.strMachineType)>=0)
+	CSimpleStringA csTermStage("");
+	GetFunction()->GetSysVar("TerminalStage", csTermStage);
+	if(csimpleStrMachineTypeCfg.IndexOf(m_sysStaticInfo.strMachineType)>=0 || csTermStage.Compare("N") == 0)//oilyang@20240104 N for install vtm app
 	{
 		LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_Need_No_Guardian, "terminal is not need start up guardian");
 		bool bStop = StopGuardian();
@@ -1621,7 +1623,8 @@ void CHealthManagerEntity::OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nL
 
 		if (msg.GetLength() != 0)
 		{
-			StartManagerDesktopPage("warnPrompt.html");
+			WarnPromptTask* task = new WarnPromptTask(this); //通过工作线程弹窗并告警
+			GetFunction()->PostThreadPoolTask(task);
 		}
 
 		break;
@@ -2342,7 +2345,7 @@ void CHealthManagerEntity::DeployTerminal(SpReqAnsContext<HealthManagerService_D
 			CSimpleStringA matchInfo(true);
 
             //走总行服务
-            HttpClientRequestConfig config(serverIP.GetData());
+            HttpClientRequestConfig config(serverIP.GetData(), &SpGetToken);
             HttpClientResponseResult result;
             config.SetChildUri(URLPATH_REGISTER_FULL_LIST);
             config.AppendQuery("terminalNo", terminalNo.GetData());
@@ -3233,9 +3236,9 @@ void CHealthManagerEntity::ToCalcRebootHourAndMinute(int restartBegin, int resta
 		restartBegin = 1;
 		restartEnd = 6;
 	}
-	//以1分钟对重启区间进行切片,截取终端号后7位进行取模hash到重启区间
-	int modNum = (restartEnd - restartBegin) * 60;
-	int xTerm = atoi(m_sysStaticInfo.strTerminalID.SubString(m_sysStaticInfo.strTerminalID.GetLength() - 7, 7));
+	//以1分钟对重启区间进行切片,截取终端号前6位+最后1位,进行取模hash到重启区间
+	int modNum = (restartEnd - restartBegin) * 60 -1;//if the modNum like 300 or 200 ,the remainder is not random ,because the TerminalNo is not random
+	int xTerm = atoi(m_sysStaticInfo.strTerminalID.SubString(0, 6) + m_sysStaticInfo.strTerminalID.SubString(m_sysStaticInfo.strTerminalID.GetLength() - 1, 1));
 	int minutes = xTerm % modNum;
 	m_restartHour = 1 + (minutes / 60);
 	m_restartMinute = minutes - (m_restartHour - 1) * 60;

+ 10 - 0
Module/mod_healthmanager/mod_healthmanager.h

@@ -347,4 +347,14 @@ struct FrameworkRestartTask : public ITaskSp
 	{
 		m_entity->WarnAndRestartFramwork();
 	}
+};
+
+struct WarnPromptTask : public ITaskSp
+{
+	CHealthManagerEntity* m_entity;
+	WarnPromptTask(CHealthManagerEntity* entity) : m_entity(entity) {}
+	void Process()
+	{
+		m_entity->StartManagerDesktopPage("warnPrompt.html");
+	}
 };

+ 3 - 0
Module/mod_interactivecontrol/Event.h

@@ -47,6 +47,7 @@
 #define LOG_EVT_CONNECT_SIPPHONE_FAILED				0x30B1000C				//连接SipPhone实体失败
 #define LOG_EVT_CONNECT_MEDIACTROLLER_FAILED		0x30B1000D				//连接MediaCtroller实体失败
 #define LOG_EVT_CONNECT_RECORDER_FAILED				0x30B1000E				//连接Recorder实体失败
+#define LOG_EVT_CONNECT_COUNTERCONNECTOR_FAILED		0x30B1000F				//连接CounterConnector实体失败
 
 #define LOG_EVT_START_TRANSACTIONRECORD_SUCCESS		0x30B10010				//启动交易录像成功
 #define LOG_EVT_START_TRANSACTIONRECORD_FAILED		0x30B10011				//启动交易录像失败
@@ -61,4 +62,6 @@
 #define LOG_EVT_DELETE_RECORD_FAILED				0x30B10018				//删除录像失败
 #define LOG_EVT_RECORD_APPEND_WATERMARK_SUCCESS		0x30B10019				//录像添加水印成功
 #define LOG_EVT_RECORD_APPEND_WATERMARK_FAILED		0x30B1001A				//录像添加水印失败
+#define LOG_EVT_START_BUSINESSRECORD_FAILED			0x30B1001B				//开始交易录像失败
+
 /*----End--InteractiveControl------------------------------*/

+ 45 - 0
Module/mod_interactivecontrol/InteractiveControl.xml

@@ -421,6 +421,51 @@
 				<param name="StrVideoName" type="string"/>
 			</req>
 		</twoway>
+		<!--»ñÈ¡ºô½Ð״̬-->
+		<twoway name="GetCallState" overlap="true">
+			<req>
+			</req>
+			<res>
+				<param name="iState" type="int"/>
+			</res>
+		</twoway>
+		<oneway name="HangupCall" overlap="true">
+		</oneway>
+		<twoway name="GetTransactionRecordState" overlap="true">
+			<req>
+			</req>
+			<res>
+				<param name="iRecordState" type="int"/>
+			</res>
+		</twoway>
+		<twoway name="GetHandfreeInVolume" overlap="true">
+			<req>
+			</req>
+			<res>
+				<param name="Volume" type="int"/>
+			</res>
+		</twoway>
+		<twoway name="SetHandfreeInVolume" overlap="true">
+			<req>
+				<param name="Volume" type="int"/>
+			</req>
+			<res>
+			</res>
+		</twoway>
+		<twoway name="GetPickupInVolume" overlap="true">
+			<req>
+			</req>
+			<res>
+				<param name="Volume" type="int"/>
+			</res>
+		</twoway>
+		<twoway name="SetPickupInVolume" overlap="true">
+			<req>
+				<param name="Volume" type="int"/>
+			</req>
+			<res>
+			</res>
+		</twoway>
 	</class>
 	
 

+ 308 - 0
Module/mod_interactivecontrol/InteractiveControl_client_g.h

@@ -2269,6 +2269,314 @@ public:
 		return Error;
 	}
 
+	ErrorCodeEnum GetCallState(UIService_GetCallState_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(UIService_Method_GetCallState, UIService_MethodSignature_GetCallState, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum GetCallState(UIService_GetCallState_Req &Req, UIService_GetCallState_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetCallState(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetCallState(UIService_GetCallState_Req &Req, UIService_GetCallState_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetCallState(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetCallState(UIService_GetCallState_Req &Req, UIService_GetCallState_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetCallState(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum HangupCall()
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->OnewayCall(UIService_Method_HangupCall, UIService_MethodSignature_HangupCall, m_context);
+		m_context.clear();
+		return ret;
+	}
+
+	ErrorCodeEnum GetTransactionRecordState(UIService_GetTransactionRecordState_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(UIService_Method_GetTransactionRecordState, UIService_MethodSignature_GetTransactionRecordState, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum GetTransactionRecordState(UIService_GetTransactionRecordState_Req &Req, UIService_GetTransactionRecordState_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetTransactionRecordState(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetTransactionRecordState(UIService_GetTransactionRecordState_Req &Req, UIService_GetTransactionRecordState_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetTransactionRecordState(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetTransactionRecordState(UIService_GetTransactionRecordState_Req &Req, UIService_GetTransactionRecordState_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetTransactionRecordState(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum GetHandfreeInVolume(UIService_GetHandfreeInVolume_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(UIService_Method_GetHandfreeInVolume, UIService_MethodSignature_GetHandfreeInVolume, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum GetHandfreeInVolume(UIService_GetHandfreeInVolume_Req &Req, UIService_GetHandfreeInVolume_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetHandfreeInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetHandfreeInVolume(UIService_GetHandfreeInVolume_Req &Req, UIService_GetHandfreeInVolume_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetHandfreeInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetHandfreeInVolume(UIService_GetHandfreeInVolume_Req &Req, UIService_GetHandfreeInVolume_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetHandfreeInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum SetHandfreeInVolume(UIService_SetHandfreeInVolume_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(UIService_Method_SetHandfreeInVolume, UIService_MethodSignature_SetHandfreeInVolume, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum SetHandfreeInVolume(UIService_SetHandfreeInVolume_Req &Req, UIService_SetHandfreeInVolume_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetHandfreeInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum SetHandfreeInVolume(UIService_SetHandfreeInVolume_Req &Req, UIService_SetHandfreeInVolume_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetHandfreeInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum SetHandfreeInVolume(UIService_SetHandfreeInVolume_Req &Req, UIService_SetHandfreeInVolume_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetHandfreeInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum GetPickupInVolume(UIService_GetPickupInVolume_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(UIService_Method_GetPickupInVolume, UIService_MethodSignature_GetPickupInVolume, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum GetPickupInVolume(UIService_GetPickupInVolume_Req &Req, UIService_GetPickupInVolume_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetPickupInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetPickupInVolume(UIService_GetPickupInVolume_Req &Req, UIService_GetPickupInVolume_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetPickupInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetPickupInVolume(UIService_GetPickupInVolume_Req &Req, UIService_GetPickupInVolume_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetPickupInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum SetPickupInVolume(UIService_SetPickupInVolume_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(UIService_Method_SetPickupInVolume, UIService_MethodSignature_SetPickupInVolume, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum SetPickupInVolume(UIService_SetPickupInVolume_Req &Req, UIService_SetPickupInVolume_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetPickupInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum SetPickupInVolume(UIService_SetPickupInVolume_Req &Req, UIService_SetPickupInVolume_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetPickupInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum SetPickupInVolume(UIService_SetPickupInVolume_Req &Req, UIService_SetPickupInVolume_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetPickupInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
 
 	bool SafeDelete()
 	{

+ 143 - 0
Module/mod_interactivecontrol/InteractiveControl_def_g.h

@@ -74,6 +74,13 @@ namespace InteractiveControl {
 #define UIService_Method_GetRecordMode 52
 #define UIService_Method_StartTransactionRecord 53
 #define UIService_Method_StopTransactionRecord 54
+#define UIService_Method_GetCallState 55
+#define UIService_Method_HangupCall 56
+#define UIService_Method_GetTransactionRecordState 57
+#define UIService_Method_GetHandfreeInVolume 58
+#define UIService_Method_SetHandfreeInVolume 59
+#define UIService_Method_GetPickupInVolume 60
+#define UIService_Method_SetPickupInVolume 61
 
 #define UIService_MethodSignature_SetUIState -649355360
 #define UIService_MethodSignature_SendAgentText -389826246
@@ -130,6 +137,13 @@ namespace InteractiveControl {
 #define UIService_MethodSignature_GetRecordMode -1617187757
 #define UIService_MethodSignature_StartTransactionRecord 339746588
 #define UIService_MethodSignature_StopTransactionRecord 1197230846
+#define UIService_MethodSignature_GetCallState -1446312706
+#define UIService_MethodSignature_HangupCall 478500367
+#define UIService_MethodSignature_GetTransactionRecordState -923839253
+#define UIService_MethodSignature_GetHandfreeInVolume -973146972
+#define UIService_MethodSignature_SetHandfreeInVolume -1471315400
+#define UIService_MethodSignature_GetPickupInVolume -735373015
+#define UIService_MethodSignature_SetPickupInVolume 35636029
 
 #define UIService_LogCode_SetUIState "QLR040230B00"
 #define UIService_LogCode_SendAgentText "QLR040230B01"
@@ -1209,6 +1223,135 @@ struct UIService_StopTransactionRecord_Ans
 
 };
 
+struct UIService_GetCallState_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct UIService_GetCallState_Ans
+{
+	int iState;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & iState;
+	}
+
+};
+
+struct UIService_HangupCall_Info
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct UIService_GetTransactionRecordState_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct UIService_GetTransactionRecordState_Ans
+{
+	int iRecordState;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & iRecordState;
+	}
+
+};
+
+struct UIService_GetHandfreeInVolume_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct UIService_GetHandfreeInVolume_Ans
+{
+	int Volume;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & Volume;
+	}
+
+};
+
+struct UIService_SetHandfreeInVolume_Req
+{
+	int Volume;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & Volume;
+	}
+
+};
+
+struct UIService_SetHandfreeInVolume_Ans
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct UIService_GetPickupInVolume_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct UIService_GetPickupInVolume_Ans
+{
+	int Volume;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & Volume;
+	}
+
+};
+
+struct UIService_SetPickupInVolume_Req
+{
+	int Volume;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & Volume;
+	}
+
+};
+
+struct UIService_SetPickupInVolume_Ans
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
 
 ///////////////////////////
 

+ 192 - 0
Module/mod_interactivecontrol/InteractiveControl_server_g.h

@@ -415,6 +415,55 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case UIService_Method_GetCallState:
+			if (dwSignature == UIService_MethodSignature_GetCallState) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case UIService_Method_HangupCall:
+			if (dwSignature == UIService_MethodSignature_HangupCall) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case UIService_Method_GetTransactionRecordState:
+			if (dwSignature == UIService_MethodSignature_GetTransactionRecordState) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case UIService_Method_GetHandfreeInVolume:
+			if (dwSignature == UIService_MethodSignature_GetHandfreeInVolume) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case UIService_Method_SetHandfreeInVolume:
+			if (dwSignature == UIService_MethodSignature_SetHandfreeInVolume) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case UIService_Method_GetPickupInVolume:
+			if (dwSignature == UIService_MethodSignature_GetPickupInVolume) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case UIService_Method_SetPickupInVolume:
+			if (dwSignature == UIService_MethodSignature_SetPickupInVolume) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -701,6 +750,41 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case UIService_Method_GetCallState:
+			if (dwSignature != UIService_MethodSignature_GetCallState) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case UIService_Method_HangupCall:
+			if (dwSignature != UIService_MethodSignature_HangupCall) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case UIService_Method_GetTransactionRecordState:
+			if (dwSignature != UIService_MethodSignature_GetTransactionRecordState) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case UIService_Method_GetHandfreeInVolume:
+			if (dwSignature != UIService_MethodSignature_GetHandfreeInVolume) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case UIService_Method_SetHandfreeInVolume:
+			if (dwSignature != UIService_MethodSignature_SetHandfreeInVolume) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case UIService_Method_GetPickupInVolume:
+			if (dwSignature != UIService_MethodSignature_GetPickupInVolume) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case UIService_Method_SetPickupInVolume:
+			if (dwSignature != UIService_MethodSignature_SetPickupInVolume) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -983,6 +1067,41 @@ public:
 	/// override by user
 	}
 
+	virtual void Handle_GetCallState(SpReqAnsContext<UIService_GetCallState_Req, UIService_GetCallState_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_HangupCall(SpOnewayCallContext<UIService_HangupCall_Info>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_GetTransactionRecordState(SpReqAnsContext<UIService_GetTransactionRecordState_Req, UIService_GetTransactionRecordState_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_GetHandfreeInVolume(SpReqAnsContext<UIService_GetHandfreeInVolume_Req, UIService_GetHandfreeInVolume_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_SetHandfreeInVolume(SpReqAnsContext<UIService_SetHandfreeInVolume_Req, UIService_SetHandfreeInVolume_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_GetPickupInVolume(SpReqAnsContext<UIService_GetPickupInVolume_Req, UIService_GetPickupInVolume_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_SetPickupInVolume(SpReqAnsContext<UIService_SetPickupInVolume_Req, UIService_SetPickupInVolume_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
 	virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		CAutoBuffer Buf;
@@ -1525,6 +1644,7 @@ public:
 						ctx.Attach(new SpReqAnsContext<UIService_GetRecordMode_Req,UIService_GetRecordMode_Ans>(pTransactionContext));
 						SpBuffer2Object(Buf, ctx->Req);
 						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
 						Handle_GetRecordMode(ctx);
 					}
 					break;
@@ -1534,6 +1654,7 @@ public:
 						ctx.Attach(new SpReqAnsContext<UIService_StartTransactionRecord_Req,UIService_StartTransactionRecord_Ans>(pTransactionContext));
 						SpBuffer2Object(Buf, ctx->Req);
 						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
 						Handle_StartTransactionRecord(ctx);
 					}
 					break;
@@ -1543,9 +1664,80 @@ public:
 						ctx.Attach(new SpReqAnsContext<UIService_StopTransactionRecord_Req,UIService_StopTransactionRecord_Ans>(pTransactionContext));
 						SpBuffer2Object(Buf, ctx->Req);
 						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
 						Handle_StopTransactionRecord(ctx);
 					}
 					break;
+				case UIService_Method_GetCallState:
+					{
+						SpReqAnsContext<UIService_GetCallState_Req,UIService_GetCallState_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<UIService_GetCallState_Req,UIService_GetCallState_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_GetCallState(ctx);
+					}
+					break;
+				case UIService_Method_HangupCall:
+					{
+						SpOnewayCallContext<UIService_HangupCall_Info>::Pointer ctx;
+						ctx.Attach(new SpOnewayCallContext<UIService_HangupCall_Info>());
+						SpBuffer2Object(Buf, ctx->Info);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_HangupCall(ctx);
+					}
+					break;
+				case UIService_Method_GetTransactionRecordState:
+					{
+						SpReqAnsContext<UIService_GetTransactionRecordState_Req,UIService_GetTransactionRecordState_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<UIService_GetTransactionRecordState_Req,UIService_GetTransactionRecordState_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_GetTransactionRecordState(ctx);
+					}
+					break;
+				case UIService_Method_GetHandfreeInVolume:
+					{
+						SpReqAnsContext<UIService_GetHandfreeInVolume_Req,UIService_GetHandfreeInVolume_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<UIService_GetHandfreeInVolume_Req,UIService_GetHandfreeInVolume_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_GetHandfreeInVolume(ctx);
+					}
+					break;
+				case UIService_Method_SetHandfreeInVolume:
+					{
+						SpReqAnsContext<UIService_SetHandfreeInVolume_Req,UIService_SetHandfreeInVolume_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<UIService_SetHandfreeInVolume_Req,UIService_SetHandfreeInVolume_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_SetHandfreeInVolume(ctx);
+					}
+					break;
+				case UIService_Method_GetPickupInVolume:
+					{
+						SpReqAnsContext<UIService_GetPickupInVolume_Req,UIService_GetPickupInVolume_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<UIService_GetPickupInVolume_Req,UIService_GetPickupInVolume_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_GetPickupInVolume(ctx);
+					}
+					break;
+				case UIService_Method_SetPickupInVolume:
+					{
+						SpReqAnsContext<UIService_SetPickupInVolume_Req,UIService_SetPickupInVolume_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<UIService_SetPickupInVolume_Req,UIService_SetPickupInVolume_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_SetPickupInVolume(ctx);
+					}
+					break;
 				default:
 					assert(0);
 					break;

+ 259 - 63
Module/mod_interactivecontrol/mod_interactivecontrol.cpp

@@ -10,8 +10,6 @@
 #define MAX_PATH 260
 #endif
 
-
-
 #include "../mod_sipphone/SIPPhone_client_g.h"
 #include "../mod_sipphone/SIPPhone_def_g.h"
 using namespace SIPPhone;
@@ -33,6 +31,32 @@ struct CRecvValue
 };
 
 
+static int GetCallStateId(const CSimpleStringA strCallState)
+{
+	char* sts[] = {
+		"O", // Offline
+		"C", // Connecting
+		"H", // HandFree
+		"P", // Pickup
+		"B", // Broken
+		"F", // Fail
+		"R", // Releasing
+		"L", // LiveDetect
+		"V"  // Recording
+	};
+
+	int iCallState = 0;
+	for (int i = 0; i < sizeof(sts) / sizeof(char*); i++) {
+		if (0 == strCallState.Compare(sts[i])) {
+			iCallState = i;
+			break;
+		}
+	}
+
+	return iCallState;
+}
+
+
 void CITCtrlEntity::OnAudioPlayRet(const char *pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, LocalMediaPlay::AudioPlayRet &evt)
 {
 	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("AudioPlayRet %s", (LPCTSTR)evt.AudioNames);
@@ -92,6 +116,10 @@ void CITCtrlEntity::OnStarted()
 	if (Error_Succeed != ConnectToSipPhone(false)) {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ConnectToSipPhone Failed!");
 	}
+
+	if (Error_Succeed != ConnectCounterConnector(false)) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Connect To CounterConnector Failed!");
+	}
 }
 
 
@@ -410,7 +438,7 @@ void CITCtrlEntity::OnSysVarEvent(const char *pszKey, const char *pszValue,const
 				CSimpleStringA strValue;
 				Func->GetSysVar("DesktopType", strValue);
 				if (strValue == CSimpleStringA("U")) {
-				#ifdef _WIN32
+				#ifdef RVC_OS_WIN
 					MessageBoxA(NULL, (LPCSTR)CSimpleStringA::Format("%s摄像头故障!", (strlen(pszValue) <= 1 ? "" : pszValue + 1)), NULL, MB_SYSTEMMODAL);
 				#endif
 				}
@@ -951,7 +979,7 @@ ErrorCodeEnum CITCtrlEntity::SendBusinessDesktopCmd(CSimpleStringA xapName, CSim
 	return Error_Succeed;
 }
 
-ErrorCodeEnum CITCtrlEntity::GetHandfreeCallOutVolume(int& nVolume, DWORD dwTimeout)
+ErrorCodeEnum CITCtrlEntity::GetHandfreeVolume(int iType, int& nVolume, DWORD dwTimeout)
 {
 	auto rc = Error_Succeed;
 
@@ -960,99 +988,120 @@ ErrorCodeEnum CITCtrlEntity::GetHandfreeCallOutVolume(int& nVolume, DWORD dwTime
 	}
 	else
 	{
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("pSipPhoneClient connected success!");
-		PhoneService_GetHandfreeOutVolume_Req req;
-		PhoneService_GetHandfreeOutVolume_Ans ans;
-		rc = (*m_pSipPhoneClient)(EntityResource::getLink().upgradeLink())->GetHandfreeOutVolume(req, ans, 1000);
-		nVolume = ans.Volume;
-		if(Error_Succeed == rc)
-		{
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("get hand free out volume success.");
+		if (0 == iType) {
+			PhoneService_GetHandfreeInVolume_Req req;
+			PhoneService_GetHandfreeInVolume_Ans ans;
+			rc = (*m_pSipPhoneClient)(EntityResource::getLink().upgradeLink())->GetHandfreeInVolume(req, ans, 1000);
+			nVolume = ans.Volume;
 		}
-		else
-		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get hand free out volume failed for 0x%08x", rc);
+		else {
+			PhoneService_GetHandfreeOutVolume_Req req;
+			PhoneService_GetHandfreeOutVolume_Ans ans;
+			rc = (*m_pSipPhoneClient)(EntityResource::getLink().upgradeLink())->GetHandfreeOutVolume(req, ans, 1000);
+			nVolume = ans.Volume;
+		}
+
+		if(Error_Succeed == rc){
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("get hand free volume success.");
+		}
+		else{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get hand free volume failed for 0x%08x", rc);
 		}
 	}
 
 	return rc;
 }
 
-ErrorCodeEnum CITCtrlEntity::SetHandfreeCallOutVolume(int nVolume, DWORD dwTimeout)
+ErrorCodeEnum CITCtrlEntity::SetHandfreeVolume(int iType, int nVolume, DWORD dwTimeout)
 {
 	auto rc = Error_Succeed;
 
 	if (!IsSipPhoneEntityAvailable()) {
 		rc = Error_DevConnFailed;
 	}
-	else
-	{
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("pSipPhoneClient connected success!");
-		PhoneService_SetHandfreeOutVolume_Req req;
-		req.Volume = nVolume;
-		PhoneService_SetHandfreeOutVolume_Ans ans;
-		rc = (*m_pSipPhoneClient)(EntityResource::getLink().upgradeLink())->SetHandfreeOutVolume(req, ans, 1000);
-		if(Error_Succeed == rc)
-		{
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("set hand free out volume success.");
+	else{
+		if (0 == iType) {
+			PhoneService_SetHandfreeInVolume_Req req;
+			req.Volume = nVolume;
+			PhoneService_SetHandfreeInVolume_Ans ans;
+			rc = (*m_pSipPhoneClient)(EntityResource::getLink().upgradeLink())->SetHandfreeInVolume(req, ans, 1000);
 		}
-		else
-		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set hand free out volume failed for 0x%08x", rc);
+		else {
+			PhoneService_SetHandfreeOutVolume_Req req;
+			req.Volume = nVolume;
+			PhoneService_SetHandfreeOutVolume_Ans ans;
+			rc = (*m_pSipPhoneClient)(EntityResource::getLink().upgradeLink())->SetHandfreeOutVolume(req, ans, 1000);
+		}
+
+		if(Error_Succeed == rc){
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("set hand free volume success.");
+		}
+		else{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set hand free volume failed for 0x%08x", rc);
 		}
 	}
 
 	return rc;
 }
 
-ErrorCodeEnum CITCtrlEntity::GetPickupCallOutVolume(int& nVolume, DWORD dwTimeout)
+ErrorCodeEnum CITCtrlEntity::GetPickupVolume(int iType, int& nVolume, DWORD dwTimeout)
 {
 	auto rc = Error_Succeed;
 
 	if (!IsSipPhoneEntityAvailable()) {
 		rc = Error_DevConnFailed;
 	}
-	else
-	{
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("pSipPhoneClient connected success!");
-		PhoneService_GetPickupOutVolume_Req req;
-		PhoneService_GetPickupOutVolume_Ans ans;
-		rc = (*m_pSipPhoneClient)(EntityResource::getLink().upgradeLink())->GetPickupOutVolume(req, ans, 1000);
-		nVolume = ans.Volume;
-		if(Error_Succeed == rc)
-		{
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("get pickup out volume success.");
+	else{
+		if (0 == iType) {
+			PhoneService_GetPickupInVolume_Req req;
+			PhoneService_GetPickupInVolume_Ans ans;
+			rc = (*m_pSipPhoneClient)(EntityResource::getLink().upgradeLink())->GetPickupInVolume(req, ans, 1000);
+			nVolume = ans.Volume;
 		}
-		else
-		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get pickup out volume failed for 0x%08x", rc);
+		else {
+			PhoneService_GetPickupOutVolume_Req req;
+			PhoneService_GetPickupOutVolume_Ans ans;
+			rc = (*m_pSipPhoneClient)(EntityResource::getLink().upgradeLink())->GetPickupOutVolume(req, ans, 1000);
+			nVolume = ans.Volume;
+		}
+
+		if(Error_Succeed == rc){
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("get pickup volume success.");
+		}
+		else{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get pickup volume failed for 0x%08x", rc);
 		}
 	}
 
 	return rc;
 }
 
-ErrorCodeEnum CITCtrlEntity::SetPickupCallOutVolume(int nVolume, DWORD dwTimeout)
+ErrorCodeEnum CITCtrlEntity::SetPickupVolume(int iType, int nVolume, DWORD dwTimeout)
 {
 	auto rc = Error_Succeed;
 
 	if (!IsSipPhoneEntityAvailable()) {
 		rc = Error_DevConnFailed;
 	}
-	else
-	{
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("pSipPhoneClient connected success!");
-		PhoneService_SetPickupOutVolume_Req req;
-		req.Volume = nVolume;
-		PhoneService_SetPickupOutVolume_Ans ans;
-		rc = (*m_pSipPhoneClient)(EntityResource::getLink().upgradeLink())->SetPickupOutVolume(req, ans, 1000);
-		if(Error_Succeed == rc)
-		{
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("set pickup out volume success.");
+	else{
+		if (0 == iType) {
+			PhoneService_SetPickupInVolume_Req req;
+			req.Volume = nVolume;
+			PhoneService_SetPickupInVolume_Ans ans;
+			rc = (*m_pSipPhoneClient)(EntityResource::getLink().upgradeLink())->SetPickupInVolume(req, ans, 1000);
 		}
-		else
-		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set pickup out volume failed for 0x%08x", rc);
+		else {
+			PhoneService_SetPickupOutVolume_Req req;
+			req.Volume = nVolume;
+			PhoneService_SetPickupOutVolume_Ans ans;
+			rc = (*m_pSipPhoneClient)(EntityResource::getLink().upgradeLink())->SetPickupOutVolume(req, ans, 1000);
+		}
+
+		if(Error_Succeed == rc){
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("set pickup volume success.");
+		}
+		else{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set pickup volume failed for 0x%08x", rc);
 		}
 	}
 
@@ -1228,7 +1277,6 @@ ErrorCodeEnum CITCtrlEntity::StartEwsCamera(CSimpleStringA &errMsg)
 ErrorCodeEnum CITCtrlEntity::StopEwsCamera()
 {
 	auto rc = Error_Succeed;
-
 	return rc;
 }
 
@@ -1642,6 +1690,58 @@ ErrorCodeEnum CITCtrlEntity::ConnectAssistChannel()
 }
 
 
+bool CITCtrlEntity::IsCounterConnectorEntityAvailable()
+{
+	if (Error_Succeed == ConnectCounterConnector()) {
+		return true;
+	}
+	else {
+		return false;
+	}
+}
+
+
+ErrorCodeEnum CITCtrlEntity::ConnectCounterConnector(bool blogevt)
+{
+	if (!IsCounterConnectSessionOK()) {
+		FreeCounterClient();
+		m_pConnectClient = new ConnectClient(this);
+		ErrorCodeEnum erroCode = m_pConnectClient->Connect();
+		if (Error_Succeed != erroCode) {
+			m_pConnectClient->SafeDelete();
+			m_pConnectClient = NULL;
+			if (blogevt) {
+				LogWarn(Severity_Middle, Error_InvalidState, LOG_EVT_CONNECT_COUNTERCONNECTOR_FAILED,
+					CSimpleStringA::Format("Connect to counter connector entity failed:0x%08x.", erroCode));
+			}
+			return Error_InvalidState;
+		}
+		else {
+			if (blogevt) {
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Connect to CounterConnector Succeed!");
+			}
+		}
+	}
+
+	return Error_Succeed;
+}
+
+
+bool CITCtrlEntity::IsCounterConnectSessionOK()
+{
+	return (m_pConnectClient != NULL && !m_pConnectClient->QuerySessionClosed());
+}
+
+
+void CITCtrlEntity::FreeCounterClient()
+{
+	if (m_pConnectClient) {
+		m_pConnectClient->GetFunction()->CloseSession();
+		m_pConnectClient = NULL;
+	}
+}
+
+
 ErrorCodeEnum CITCtrlEntity::ConnectToLocalPlayer(bool blogevt)
 {
 	if (!IsPlayerConnectSessionOK()) {
@@ -1935,6 +2035,29 @@ ErrorCodeEnum CITCtrlEntity::StopTransactionRecord(CSimpleStringA strVideoName)
 	return rc;
 }
 
+ErrorCodeEnum CITCtrlEntity::HangupCall()
+{
+	auto rc = Error_Succeed;
+
+	if (!IsCounterConnectorEntityAvailable()) {
+		rc = Error_DevConnFailed;
+	}
+	else {
+		ConnectService_StopCall_Req req;
+		ConnectService_StopCall_Ans ans;
+		rc = (*m_pConnectClient)(EntityResource::getLink().upgradeLink())->StopCall(req, ans, 5000);
+
+		if (Error_Succeed == rc) {
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hangup call success.");
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("hangup call failed for 0x%08x.", rc);
+		}
+	}
+	
+	return rc;
+}
+
 bool CITCtrlEntity::IsRecordEntityAvailable()
 {
 	if (Error_Succeed == ConnectToRecord()) {
@@ -2168,6 +2291,7 @@ void UIServiceSession::Handle_HidePersonArea(SpOnewayCallContext<UIService_HideP
 	/// override by user
 	LogEvent(Severity_Middle,LOG_EVT_UI_HIDEPERSONAREA,"UI send Hide Person area");
 }
+
 void UIServiceSession::Handle_ShowPersonArea(SpOnewayCallContext<UIService_ShowPersonArea_Info>::Pointer ctx)
 {
 	DbgToBeidou(ctx->link, __FUNCTION__)();
@@ -2175,7 +2299,6 @@ void UIServiceSession::Handle_ShowPersonArea(SpOnewayCallContext<UIService_ShowP
 	LogEvent(Severity_Middle,LOG_EVT_UI_SHOWPERSONAREA,"UI send show Person area");
 }
 
-
 void UIServiceSession::Handle_AnswerPacket(SpReqAnsContext<UIService_AnswerPacket_Req, UIService_AnswerPacket_Ans>::Pointer ctx)
 {
 	DbgToBeidou(ctx->link, __FUNCTION__)();
@@ -2361,7 +2484,7 @@ void UIServiceSession::Handle_StartPlaySalesRecord(SpReqAnsContext<UIService_Sta
 void UIServiceSession::Handle_GetHandfreeOutVolume(SpReqAnsContext<UIService_GetHandfreeOutVolume_Req, UIService_GetHandfreeOutVolume_Ans>::Pointer ctx)
 {
 	DbgToBeidou(ctx->link, __FUNCTION__)();
-	ErrorCodeEnum Error = m_pEntity->GetHandfreeCallOutVolume(ctx->Ans.Volume, 2000);
+	ErrorCodeEnum Error = m_pEntity->GetHandfreeVolume(1, ctx->Ans.Volume, 2000);
 	ctx->Answer(Error);
 }
 
@@ -2369,7 +2492,7 @@ void UIServiceSession::Handle_GetHandfreeOutVolume(SpReqAnsContext<UIService_Get
 void UIServiceSession::Handle_SetHandfreeOutVolume(SpReqAnsContext<UIService_SetHandfreeOutVolume_Req, UIService_SetHandfreeOutVolume_Ans>::Pointer ctx)
 {
 	DbgToBeidou(ctx->link, __FUNCTION__)();
-	ErrorCodeEnum Error = m_pEntity->SetHandfreeCallOutVolume(ctx->Req.Volume, 2000);
+	ErrorCodeEnum Error = m_pEntity->SetHandfreeVolume(1, ctx->Req.Volume, 2000);
 	ctx->Answer(Error);
 }
 
@@ -2377,7 +2500,7 @@ void UIServiceSession::Handle_SetHandfreeOutVolume(SpReqAnsContext<UIService_Set
 void UIServiceSession::Handle_GetPickupOutVolume(SpReqAnsContext<UIService_GetPickupOutVolume_Req, UIService_GetPickupOutVolume_Ans>::Pointer ctx)
 {
 	DbgToBeidou(ctx->link, __FUNCTION__)();
-	ErrorCodeEnum Error = m_pEntity->GetPickupCallOutVolume(ctx->Ans.Volume, 2000);
+	ErrorCodeEnum Error = m_pEntity->GetPickupVolume(1, ctx->Ans.Volume, 2000);
 	ctx->Answer(Error);
 }
 
@@ -2385,7 +2508,7 @@ void UIServiceSession::Handle_GetPickupOutVolume(SpReqAnsContext<UIService_GetPi
 void UIServiceSession::Handle_SetPickupOutVolume(SpReqAnsContext<UIService_SetPickupOutVolume_Req, UIService_SetPickupOutVolume_Ans>::Pointer ctx)
 {
 	DbgToBeidou(ctx->link, __FUNCTION__)();
-	ErrorCodeEnum Error = m_pEntity->SetPickupCallOutVolume(ctx->Req.Volume, 2000);
+	ErrorCodeEnum Error = m_pEntity->SetPickupVolume(1, ctx->Req.Volume, 2000);
 	ctx->Answer(Error);
 }
 
@@ -2502,6 +2625,10 @@ void UIServiceSession::Handle_StartTransactionRecord(SpReqAnsContext<UIService_S
 				snprintf(strmsg, MAX_PATH, "摄像头故障,启动交易录像 %s 失败.", ctx->Req.StrVideoName.GetData());
 				LogWarn(Severity_Middle, Error_Debug, LOG_EVT_START_TRANSACTIONRECORD_FAILED, strmsg);
 			}
+
+			if (!m_pEntity->m_bRecording) {
+				LogEvent(Severity_Middle, LOG_EVT_START_BUSINESSRECORD_FAILED, ctx->Req.StrVideoName.GetData());
+			}
 		}
 		else {
 			ctx->Ans.ErrorCode = Error_Param;
@@ -2531,6 +2658,70 @@ void UIServiceSession::Handle_StopTransactionRecord(SpReqAnsContext<UIService_St
 }
 
 
+void UIServiceSession::Handle_GetCallState(SpReqAnsContext<UIService_GetCallState_Req, UIService_GetCallState_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+
+	CSimpleStringA strCallState("");
+	ErrorCodeEnum errorCode = m_pEntity->GetFunction()->GetSysVar("CallState", strCallState);
+	if (Error_Succeed == errorCode) {
+		ctx->Ans.iState = GetCallStateId(strCallState);
+		ctx->Answer(Error_Succeed);
+	}
+	else {
+		ctx->Answer(Error_Unexpect);
+	}
+}
+
+void UIServiceSession::Handle_HangupCall(SpOnewayCallContext<UIService_HangupCall_Info>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	m_pEntity->HangupCall();
+}
+
+void UIServiceSession::Handle_GetTransactionRecordState(SpReqAnsContext<UIService_GetTransactionRecordState_Req, UIService_GetTransactionRecordState_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+
+	if (m_pEntity->m_bRecording) {
+		ctx->Ans.iRecordState = 1;
+	}
+	else {
+		ctx->Ans.iRecordState = 0;
+	}
+
+	ctx->Answer(Error_Succeed);
+}
+
+void UIServiceSession::Handle_GetHandfreeInVolume(SpReqAnsContext<UIService_GetHandfreeInVolume_Req, UIService_GetHandfreeInVolume_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	ErrorCodeEnum Error = m_pEntity->GetHandfreeVolume(0, ctx->Ans.Volume, 2000);
+	ctx->Answer(Error);
+}
+
+void UIServiceSession::Handle_SetHandfreeInVolume(SpReqAnsContext<UIService_SetHandfreeInVolume_Req, UIService_SetHandfreeInVolume_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	ErrorCodeEnum Error = m_pEntity->SetHandfreeVolume(0, ctx->Req.Volume, 2000);
+	ctx->Answer(Error);
+}
+
+void UIServiceSession::Handle_GetPickupInVolume(SpReqAnsContext<UIService_GetPickupInVolume_Req, UIService_GetPickupInVolume_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	ErrorCodeEnum Error = m_pEntity->GetPickupVolume(0, ctx->Ans.Volume, 2000);
+	ctx->Answer(Error);
+}
+
+void UIServiceSession::Handle_SetPickupInVolume(SpReqAnsContext<UIService_SetPickupInVolume_Req, UIService_SetPickupInVolume_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	ErrorCodeEnum Error = m_pEntity->SetPickupVolume(0, ctx->Req.Volume, 2000);
+	ctx->Answer(Error);
+}
+
+
 ChannelClient::ChannelClient( CITCtrlEntity *pEntity ) : ChannelService_ClientBase(pEntity)
 {
 
@@ -2584,6 +2775,11 @@ RecordClient::RecordClient(CITCtrlEntity* pEntity) : RecorderSerVice_ClientBase(
 
 }
 
+ConnectClient::ConnectClient(CITCtrlEntity* pEntity) : ConnectService_ClientBase(pEntity)
+{
+
+}
+
 SP_BEGIN_ENTITY_MAP()
 	SP_ENTITY(CITCtrlEntity)
 SP_END_ENTITY_MAP()

+ 40 - 7
Module/mod_interactivecontrol/mod_interactivecontrol.h

@@ -8,8 +8,6 @@
 #include "InteractiveControl_server_g.h"
 using namespace InteractiveControl;
 
-
-
 #include "../mod_localmediaplay/LocalMediaPlay_msg_g.h"
 #include "../mod_localmediaplay/LocalMediaPlay_client_g.h"
 using namespace LocalMediaPlay;
@@ -30,6 +28,8 @@ using namespace MediaController;
 #include "../mod_recorder/Recorder_client_g.h"
 using namespace Recorder;
 
+#include "../mod_counterconnector/CounterConnector_client_g.h"
+using namespace CounterConnector;
 
 enum eRecordDeviceState{
 	eNormal,					
@@ -89,6 +89,13 @@ public:
 };
 
 
+class ConnectClient : public ConnectService_ClientBase
+{
+public:
+	ConnectClient(CITCtrlEntity* pEntity);
+};
+
+
 class CITCtrlEntity : public CEntityBase, public ISysVarListener, public ILogListener, public IBroadcastListener, public ITimerListener
 {
 public:
@@ -97,7 +104,9 @@ public:
 		m_bAdvOnFlag = false;
 		m_iRecordMode = 0;
 		m_bRecording = FALSE;
+		m_pConnectClient = NULL;
 	}
+
 	virtual ~CITCtrlEntity() {}
 	virtual const char *GetEntityName() const { return "InteractiveControl"; }
 	virtual bool IsService()const{return true;}
@@ -166,13 +175,13 @@ public:
 
 	ErrorCodeEnum SendBusinessDesktopCmd(CSimpleStringA xapName, CSimpleStringA command);
 
-	ErrorCodeEnum GetHandfreeCallOutVolume(int& nVolume, DWORD dwTimeout);
+	ErrorCodeEnum GetHandfreeVolume(int iType, int& nVolume, DWORD dwTimeout);
 
-	ErrorCodeEnum SetHandfreeCallOutVolume(int nVolume, DWORD dwTimeout);
+	ErrorCodeEnum SetHandfreeVolume(int iType, int nVolume, DWORD dwTimeout);
 
-	ErrorCodeEnum GetPickupCallOutVolume(int& nVolume, DWORD dwTimeout);
+	ErrorCodeEnum GetPickupVolume(int iType, int& nVolume, DWORD dwTimeout);
 
-	ErrorCodeEnum SetPickupCallOutVolume(int nVolume, DWORD dwTimeout);
+	ErrorCodeEnum SetPickupVolume(int iType, int nVolume, DWORD dwTimeout);
 
 	void OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
 		const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, 
@@ -212,6 +221,8 @@ public:
 
 	ErrorCodeEnum StopTransactionRecord(CSimpleStringA strVideoName);
 
+	ErrorCodeEnum HangupCall();
+
 private:
 	ErrorCodeEnum ConnectAssistChannel();
 
@@ -259,6 +270,14 @@ private:
 
 	void FreeRecordClient();
 
+	bool IsCounterConnectorEntityAvailable();
+
+	ErrorCodeEnum ConnectCounterConnector(bool blogevt = true);
+
+	bool IsCounterConnectSessionOK();
+
+	void FreeCounterClient();
+
 
 	SP_BEGIN_MSG_DISPATCH_MAP(CITCtrlEntity)
 		SP_BEGIN_ENTITY_MSG("LocalMediaPlay")
@@ -293,6 +312,7 @@ private:
 	SipPhoneClient* m_pSipPhoneClient;
 	MediaControlClient* m_pMediaCtlClient;
 	RecordClient* m_pRecordClient;
+	ConnectClient* m_pConnectClient;
 	CAutoArray<CUUID> m_arrListener;
 	CUUID m_uidLocalMediaListenser;
 	int m_nSysCallType;//0:ÆÕͨģʽ£¬1£ºp2pģʽ
@@ -413,7 +433,20 @@ public:
 	virtual void Handle_StartTransactionRecord(SpReqAnsContext<UIService_StartTransactionRecord_Req, UIService_StartTransactionRecord_Ans>::Pointer ctx);
 
 	virtual void Handle_StopTransactionRecord(SpReqAnsContext<UIService_StopTransactionRecord_Req, UIService_StopTransactionRecord_Ans>::Pointer ctx);
-	
+
+	virtual void Handle_GetCallState(SpReqAnsContext<UIService_GetCallState_Req, UIService_GetCallState_Ans>::Pointer ctx);
+
+	virtual void Handle_HangupCall(SpOnewayCallContext<UIService_HangupCall_Info>::Pointer ctx);
+
+	virtual void Handle_GetTransactionRecordState(SpReqAnsContext<UIService_GetTransactionRecordState_Req, UIService_GetTransactionRecordState_Ans>::Pointer ctx);
+
+	virtual void Handle_GetHandfreeInVolume(SpReqAnsContext<UIService_GetHandfreeInVolume_Req, UIService_GetHandfreeInVolume_Ans>::Pointer ctx);
+
+	virtual void Handle_SetHandfreeInVolume(SpReqAnsContext<UIService_SetHandfreeInVolume_Req, UIService_SetHandfreeInVolume_Ans>::Pointer ctx);
+
+	virtual void Handle_GetPickupInVolume(SpReqAnsContext<UIService_GetPickupInVolume_Req, UIService_GetPickupInVolume_Ans>::Pointer ctx);
+
+	virtual void Handle_SetPickupInVolume(SpReqAnsContext<UIService_SetPickupInVolume_Req, UIService_SetPickupInVolume_Ans>::Pointer ctx);
 
 private:
 	CITCtrlEntity *m_pEntity;

+ 0 - 4
Module/mod_livenessdetection/unix/mod_livenessdetection.cpp

@@ -176,15 +176,12 @@ void CLivenessDetectionEntity::OnLog( const CAutoArray<CUUID> &SubIDs, const CUU
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("user_code = 0x%08x", dwUserCode);
 	switch (dwUserCode) {
 	case LOG_EVT_BEGIN_HANDLE_BUSINESS:
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("begin handle business.");
 		break;
 
 	case LOG_EVT_END_HANDLE_BUSINESS:
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("end handle business.");
 		break;
 
 	case LOG_EVT_MEDIACONTROLLER_CAMERA_STARTED:
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start camera, begin facetracking.");
 		if (!m_pFaceVideo) {
 			m_pFaceVideo = new RvcFaceVideo();
 		}
@@ -197,7 +194,6 @@ void CLivenessDetectionEntity::OnLog( const CAutoArray<CUUID> &SubIDs, const CUU
 		break;
 
 	case LOG_EVT_MEDIACONTROLLER_CAMERA_STOPPED:
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("stop camera, end facetracking.");
 		if (m_pFaceVideo){
 			delete m_pFaceVideo;
 			m_pFaceVideo = NULL;

+ 2 - 0
Module/mod_recorder/CMakeLists.txt

@@ -3,6 +3,7 @@ define_module("recorder")
 
 set(${MODULE_PREFIX}_SRCS
 	${CMAKE_CURRENT_SOURCE_DIR}/${MODULE_PLAFORM_SUBDIR}/mod_recorder.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/recordinfo.cpp
 )
 
 set(MOD_VERSION_STRING "1.0.0-dev1")
@@ -18,6 +19,7 @@ target_include_directories(${MODULE_NAME} PRIVATE
     ${OTHER_LIB_PLATFORM_BASE_DIR}/libvideorecord
     ${OTHER_LIB_PLATFORM_BASE_DIR}/rvcmediacommon
     ${OTHER_LIB_PLATFORM_BASE_DIR}/libfilecryption
+    ${CONAN_INCLUDE_DIRS_JSONCPP}
     )
 
 target_link_directories(${MODULE_NAME} PRIVATE

+ 2 - 1
Module/mod_recorder/Event.h

@@ -11,4 +11,5 @@
 #define LOG_EVT_RECORDER_MOVE_FAILED			    0x31210004				//文件移动失败
 #define LOG_EVT_DELETE_BIG_LOGFILE					0x31210005				//删除过大日志文件
 #define LOG_EVT_RECORDING_FAILED					0x31210006				//交易录像录制失败
-#define LOG_EVT_RECORD_ENTITY_EXCEPTION				0x31210007				//录像实体异常
+#define LOG_EVT_RECORD_ENTITY_EXCEPTION				0x31210007				//录像实体异常
+#define LOG_EVT_POST_RECORDINFO_FAILED				0x31210008				//上报录像信息失败

+ 44 - 17
Module/mod_recorder/mod_recorder.h

@@ -2,6 +2,7 @@
 
 #include "SpBase.h"
 #include "SpIni.h"
+#include "libvideorecord.h"
 #include "EventCode.h"
 #if defined(RVC_OS_WIN)
 #include "fileutil.h"
@@ -18,16 +19,32 @@
 #include "Recorder_def_g.h"
 #include "Recorder_server_g.h"
 
+#include "recordinfo.h"
+
+
+#ifndef RVC_UPLOAD_VIDEORECORDING_HTTP_API
+#define RVC_UPLOAD_VIDEORECORDING_HTTP_API "/api/upload/video_recording"
+#endif // !RVC_CALLROUTE_HTTP_API
+
+
+#ifndef RVC_HTTPTIMEOUT
+#define RVC_HTTPTIMEOUT 10
+#endif // !RVC_HTTPTIMEOUT
 
 namespace Recorder {
 	class CRecorderEntity : public CEntityBase, public CHostApi, public ILogListener, public ISysVarListener
 	{
 	public:
-#if defined(RVC_OS_WIN)
-		CRecorderEntity() : m_bStarted(false), m_pRecorder(NULL), m_LastSaveSessionId("N"), m_iSeriesNum(0), m_iMovedSeriesNum(0), m_bMoveFlag(false), m_bEncFlag(false), m_eRecordType(eWMV), m_iRecordMode(0) {}
-#else
-		CRecorderEntity() : m_bStarted(false), m_pRecorder(NULL), m_eRecordType(eMP4) {}
-#endif //RVC_OS_WIN
+		CRecorderEntity() : m_bStarted(false), m_pRecorder(NULL), m_LastSaveSessionId("N"), m_iSeriesNum(0), m_iMovedSeriesNum(0), m_bMoveFlag(false), m_bEncFlag(false), m_eRecordType(eMP4), m_iRecordMode(0){
+			m_strHttpServerAPI = RVC_UPLOAD_VIDEORECORDING_HTTP_API;
+			m_iHttpTimeOut = RVC_HTTPTIMEOUT;
+			m_strHttpServerAddr = NULL;
+			m_strAppVersion = NULL;
+			m_strTerminalId = NULL;
+			memset(m_strRecordName, 0, MAX_PATH);
+			m_eBusinessStatus = eInterrupt;
+		}
+
 		virtual ~CRecorderEntity() {}
 		virtual const char* GetEntityName() const { return "Recorder"; }
 
@@ -39,13 +56,14 @@ namespace Recorder {
 		ErrorCodeEnum __OnStart(ErrorCodeEnum preOperationError);
 		ErrorCodeEnum __OnClose(ErrorCodeEnum preOperationError);
 #if defined(RVC_OS_WIN)
-		virtual void OnStarted();
 		virtual void WmpDebug(const char* fmt, ...);
 #else
 		bool InitRecorder();
 		bool ReleaseRecorder();
 #endif //RVC_OS_WIN
 
+		virtual void OnStarted();
+
 		virtual void Debug(record_loglevel elevel, const char* fmt, ...);
 		virtual void vDebug(record_loglevel elevel, const char* str, va_list list);
 		virtual int GetActiveCamera();
@@ -58,29 +76,29 @@ namespace Recorder {
 			const DWORD dwSysError, const DWORD dwUserCode, const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
 			const CAutoArray<DWORD>& Param, const char* pszEntityName, const char* pszModuleName, const char* pszMessage, const linkContext& pLinkInfo);
 
-#if defined(RVC_OS_WIN)
-		void StartRecord(const char* wmvfilename);
-#else
 		void StartRecord(const char* videofilename);
-#endif //RVC_OS_WIN
 		void StopRecord();
 		bool GetStartFlag() { return m_bStarted; }
+		void SetRecordSessionID(const char* strRecordID);
+		void GetRecordSessionID(char* strRecordID, size_t uLen);
 
 	private:
 		virtual void OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName);
 		virtual void OnSelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext);
 
 		DeviceTypeEnum RvcGetDeviceType();
-#if defined(RVC_OS_WIN)
-		ErrorCodeEnum DecideCameraCount(int& nCount);
-		int HandleSaveVideoRecord(const char* wmvfilename);
-		int GetRecordVideoInfo(const char* wmvfilename, char* strSession, size_t uSessionLen, int* iSeriesNum, char* strFormat, size_t uFormatLen);
-		int HandleFinishedVideoRecord(const char* wmvfilename);
+		int HandleSaveVideoRecord(const char* videofilename);
+		int GetRecordVideoInfo(const char* videofilename, char* strSession, size_t uSessionLen, int* iSeriesNum, char* strFormat, size_t uFormatLen);
+		int HandleFinishedVideoRecord(const char* videofilename);
 		int SaveExceptionRecordVideos();
-		int HandleEncryptVideoRecord(const char* wmvfilename);
+		int HandleEncryptVideoRecord(const char* videofilename);
 		bool IsCurrentTerminalMathed();
 		int DeleteExceptionLogFiles();
-#endif //RVC_OS_WIN
+		ErrorCodeEnum LoadEntityConfig();
+		ErrorCodeEnum PostVideoRecordInfos();
+		ErrorCodeEnum AddToVideoRecordList(const char* videofilename);
+		ErrorCodeEnum HandleExceptionRecordVideos();
+
 	private:
 		DeviceTypeEnum m_eDeviceType;
 		int m_iActiveCamera;
@@ -99,6 +117,15 @@ namespace Recorder {
 		bool m_bEncFlag;
 		eVideoFormat m_eRecordType;
 		int m_iRecordMode;
+
+		CSimpleStringA m_strHttpServerAddr;
+		CSimpleStringA m_strHttpServerAPI;
+		int m_iHttpTimeOut;
+		CSimpleStringA m_strAppVersion;
+		CSimpleStringA m_strTerminalId;
+		vector<record_item_t> m_vRecordList;
+		char m_strRecordName[MAX_PATH];
+		eRvcBusinessStatus m_eBusinessStatus;
 	};
 
 

+ 80 - 0
Module/mod_recorder/recordinfo.cpp

@@ -0,0 +1,80 @@
+#include "recordinfo.h"
+#include "strutil.h"
+#include "Event.h"
+
+
+void HttpsLogCallBack(const char* logtxt) {
+	//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("HttpsLogCallBack")("HttpsLogCallBack: %s.", logtxt);
+}
+
+
+int post_video_recordinfo_list(video_record_info_t* pinfo, int itimeout, bool bprintdbg)
+{
+	int iret = -1;
+	IHttpFunc* client = create_http(HttpsLogCallBack);
+	RecordInfoHTTPReq req;
+	req.m_timeOut = itimeout;
+	if (bprintdbg) {
+		req.m_printDbg = true;
+	}
+	const char* pData = pinfo->strServerURL.GetData();
+	if (pData) {
+		req.m_url = pData;
+	}
+
+	pData = pinfo->strAPI.GetData();
+	if (pData) {
+		req.m_url.append(pData);
+	}
+
+	Json::Value rootReq;
+
+	pData = pinfo->strTerminalNo.GetData();
+	if (pData) {
+		rootReq["terminal_no"] = pData;
+	}
+
+	pData = pinfo->strAppVersion.GetData();
+	if (pData) {
+		rootReq["app_version"] = pData;
+	}
+
+	pData = pinfo->strRecordEndTime.GetData();
+	if (pData) {
+		rootReq["upload_time"] = pData;
+	}
+
+	pData = pinfo->strRecordID.GetData();
+	if (pData) {
+		rootReq["video_serial_id"] = pData;
+	}
+
+	rootReq["business_status"] = pinfo->iBusinessStatus;
+
+	for (vector<record_item_t>::iterator it = pinfo->vRecordList.begin(); it < pinfo->vRecordList.end(); ++it) {
+		Json::Value item;
+		item["file_name"] = it->file_name;
+		item["file_path"] = it->file_path;
+		item["file_length"] = it->file_length;
+		rootReq["file_list"].append(item);
+	}
+
+	Json::StyledWriter sw;
+	req.m_reqContent = sw.write(rootReq);
+
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_reqContent is %s.", req.m_reqContent.c_str());
+
+	//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("begin http get request, timeout is %d, printdbg flag is %s.", req.m_timeOut, req.m_printDbg ? "true" : "false");
+
+	RecordInfoHTTPRet ret;
+	if (client->Post(req, ret)) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Post result is %s, returnCode:%s, code:%s, errorMsg:%s, message:%s.",
+			ret.m_success ? "success" : "failed", ret.m_returnCode.c_str(), ret.m_code.c_str(), ret.m_errorMsg.c_str(), ret.m_message.c_str());
+		iret = 0;
+	}
+	else {
+		LogWarn(Severity_Middle, Error_Exception, LOG_EVT_POST_RECORDINFO_FAILED, CSimpleStringA::Format("Post video record infos fail, url=%s, syscode=%d, usercode=%s, errmsg=%s", req.m_url.c_str(), ret.m_sysCode, ret.m_userCode.c_str(), ret.m_errMsg.c_str()).GetData());
+	}
+
+	return iret;
+}

+ 90 - 0
Module/mod_recorder/recordinfo.h

@@ -0,0 +1,90 @@
+#ifndef _RECORDINFO_H_
+#define _RECORDINFO_H_
+
+#include "IHttpFunc.h"
+#include "json/json.h"
+#include "SpBase.h"
+
+
+#ifndef RVC_MAX_JSON_LENGTH
+#define RVC_MAX_JSON_LENGTH 512
+#endif // !RVC_MAX_JSON_LENGTH
+
+
+#ifndef RVC_MAX_RECORDITEM_JSON_LENGTH
+#define RVC_MAX_RECORDITEM_JSON_LENGTH 260
+#endif // !RVC_MAX_RECORDITEM_JSON_LENGTH
+
+
+#define REFLECTION(var) #var
+
+//业务状态(0 - 失败,1 - 成功,2 - 取消,3 - 中断)
+enum eRvcBusinessStatus {
+	eFailed,
+	eSuccess,
+	eCancel,
+	eInterrupt
+};
+
+typedef struct record_item_s {
+	std::string file_name;
+	std::string file_path;
+	int file_length;
+}record_item_t;
+
+
+//video_record_info_t
+typedef struct video_record_info_s {
+	CSimpleStringA strServerURL;
+	CSimpleStringA strAPI;
+	CSimpleStringA strTerminalNo;
+	CSimpleStringA strAppVersion;
+	CSimpleStringA strRecordEndTime;
+	CSimpleStringA strRecordID;
+	int iBusinessStatus;
+	vector<record_item_t> vRecordList;
+}video_record_info_t;
+
+
+struct RecordInfoHTTPReq : CHTTPReq {
+	std::string m_reqContent;
+	virtual string ToJson() {
+		return m_reqContent;
+	}
+};
+
+
+struct RecordInfoHTTPRet : CHTTPRet {
+	std::string m_request;
+	bool	m_success;
+	std::string m_code;
+	std::string m_message;
+	std::string m_returnCode;
+	std::string m_errorMsg;
+	bool	m_data;
+
+	virtual bool Parse(string strData) {
+		Json::Value root;
+		Json::Reader reader;
+
+		if (reader.parse(strData, root, false)) {
+			m_success = root[REFLECTION(success)].asBool();
+			m_code = root[REFLECTION(code)].asString();
+			m_message = root[REFLECTION(message)].asString();
+			m_returnCode = root[REFLECTION(returnCode)].asString();
+			m_errorMsg = root[REFLECTION(errorMsg)].asString();
+			m_data = root[REFLECTION(data)].asBool();
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("reader parse failed!");
+			m_success = false;
+		}
+
+		return m_success;
+	}
+};
+
+
+int post_video_recordinfo_list(video_record_info_t* pinfo, int itimeout, bool bprintdbg);
+
+#endif

+ 755 - 55
Module/mod_recorder/unix/mod_recorder.cpp

@@ -1,19 +1,25 @@
 #include "mod_recorder.h"
 
 #include "fileutil.h"
+#include "Event.h"
 #include "array.h"
 #include <memutil.h>
 #include <algorithm>
 #include <sys/stat.h>
+#include "y2k_time.h"
 
 #include "mod_customeraware/Event.h"
 #include "mod_facetracking/sysvar.h"
+#include "mod_interactivecontrol/Event.h"
 
 #include <assert.h>
-#include "Event.h"
 
 using namespace Recorder;
 
+
+#ifndef RVC_MAX_VIDEO_NAME_LEN
+#define RVC_MAX_VIDEO_NAME_LEN 256
+#endif
 #ifndef MAX_LOG_LEN
 #define MAX_LOG_LEN 512
 #endif
@@ -24,8 +30,37 @@ using namespace Recorder;
 #endif // !RVC_TRANSATCION_RECORD_SUFFIX
 
 
+static unsigned long GetFileSize(const char* filename)
+{
+	struct stat statbuf;
+	stat(filename, &statbuf);
+	return statbuf.st_size;
+}
+
+
+static const char* GetFileName(const char* pfilename)
+{
+	if (NULL == pfilename) {
+		return NULL;
+	}
+
+	return strstr(pfilename, RVC_TRANSATCION_RECORD_SUFFIX);
+}
+
+
+static void LogVideoSizeInfo(const char* pszMessage)
+{
+	unsigned long ufilesize = GetFileSize(pszMessage);
+	char strmsg[MAX_PATH] = { 0 };
+	snprintf(strmsg, MAX_PATH, "%s file size is %u byte.", pszMessage, ufilesize);
+
+	LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORDER_VIDEO_SIZE, strmsg);
+}
+
+
 void RecordServiceSession::Handle_StartTransactionRecord(SpReqAnsContext<RecorderSerVice_StartTransactionRecord_Req, RecorderSerVice_StartTransactionRecord_Ans>::Pointer ctx)
 {
+	DbgToBeidou(ctx->link, __FUNCTION__)();
 	if (m_pEntity->GetStartFlag()) {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Current is recording, stop it.");
 		m_pEntity->StopRecord();
@@ -35,6 +70,8 @@ void RecordServiceSession::Handle_StartTransactionRecord(SpReqAnsContext<Recorde
 	snprintf(strVideoName, MAX_PATH, "%s%s",RVC_TRANSATCION_RECORD_SUFFIX, ctx->Req.VideoName.GetData());
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("StartRecord and video name is %s.", strVideoName);
 
+	m_pEntity->SetRecordSessionID(ctx->Req.VideoName.GetData());
+
 	m_pEntity->StartRecord(strVideoName);
 
 	ctx->Answer(Error_Succeed);
@@ -42,6 +79,8 @@ void RecordServiceSession::Handle_StartTransactionRecord(SpReqAnsContext<Recorde
 
 void RecordServiceSession::Handle_StopTransactionRecord(SpReqAnsContext<RecorderSerVice_StopTransactionRecord_Req, RecorderSerVice_StopTransactionRecord_Ans>::Pointer ctx)
 {
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	
 	m_pEntity->StopRecord();
 
 	ctx->Answer(Error_Succeed);
@@ -61,6 +100,7 @@ void CRecorderEntity::OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<
 	pTransactionContext->SendAnswer(Error); 
 }
 
+
 ErrorCodeEnum CRecorderEntity::__OnStart(ErrorCodeEnum preOperationError)
 {	
 	ErrorCodeEnum Error = Error_Succeed;
@@ -69,32 +109,22 @@ ErrorCodeEnum CRecorderEntity::__OnStart(ErrorCodeEnum preOperationError)
 	if (preOperationError != Error_Succeed) {
 		return preOperationError;
 	}
-			
+	
 	m_iActiveCamera = CAMERA_TYPE_ENV;
 	m_iCameraState = 'N';
 
-	int iRecordMode = 0;
-	CSmartPointer<IConfigInfo> spConfig;
-	CSmartPointer<IEntityFunction> spFunction = GetFunction();
-	if (spFunction->OpenConfig(Config_CenterSetting, spConfig) == Error_Succeed) {
-		spConfig->ReadConfigValueInt("InteractiveControl", "RecordMode", iRecordMode);
-	}
-
-	if (1 == iRecordMode) {
-		m_iRecordMode = 1;
-	}
-
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Record Mode is %d.", m_iRecordMode);
-
 	InitRecorder();
 		
 	int i = 0;
-	m_arrListener.Init(5);
+	m_arrListener.Init(8);
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, EVENT_MOD_BEGIN_RECORD, NULL, false);
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, EVENT_MOD_END_RECORD, NULL, false);
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_RETURNMENU, NULL, false);
+	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, EVENT_MOD_PAUSE_RECORD, NULL, false);
+	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, EVENT_MOD_CONTINUE_RECORD, NULL, false);
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, LOG_EVT_RECORDER_SECTION_FINISHED, NULL, false);
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, LOG_EVT_RECORDER_WHOLE_FINISHED, NULL, false);
+	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, LOG_EVT_START_BUSINESSRECORD_FAILED, NULL, false);
 
 	GetFunction()->RegistSysVarEvent(SYSVAR_ACTIVETRACKINGCAMERA,this);
 	GetFunction()->RegistSysVarEvent(SYSVAR_CAMERASTATE,this);
@@ -103,17 +133,20 @@ ErrorCodeEnum CRecorderEntity::__OnStart(ErrorCodeEnum preOperationError)
 	m_iCameraState = strValue[0];
 	if (strValue[0] == 'E'){
 		m_iActiveCamera = CAMERA_TYPE_OPT;
+		if (eStand1SPlusType == m_eDeviceType){
+			m_iActiveCamera = CAMERA_TYPE_ERROR;
+		}
 	}
 	else if (strValue[0] == 'O'){
 		m_iActiveCamera = CAMERA_TYPE_ENV;
 	}
 	else if(strValue[0] == 'B'){
-			m_iActiveCamera = CAMERA_TYPE_ERROR;
+		m_iActiveCamera = CAMERA_TYPE_ERROR;
 	}
 	else if (strValue[0] == 'N'){
 		m_iActiveCamera = CAMERA_TYPE_ENV;
 	}
-		
+
 	Error = GetFunction()->RegistSysVarEvent("SessionID", this);
 	if (Error != Error_Succeed) {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("register sysvar %s failed!", "SessionID");
@@ -122,56 +155,59 @@ ErrorCodeEnum CRecorderEntity::__OnStart(ErrorCodeEnum preOperationError)
 	Error = GetFunction()->GetPath("Temp", m_TempDir);
 	if (Error != Error_Succeed) {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get global record temp path failed!");
-	}
-		
+	}	
 	if (m_TempDir.GetLength() > 0 && m_TempDir[m_TempDir.GetLength()-1] != SPLIT_SLASH) {
 		m_TempDir += SPLIT_SLASH_STR;
 	}
+
 	Error = GetFunction()->GetPath("UploadVideo", m_RecordSaveDir);
 	if (Error != Error_Succeed) {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get global record save path failed!");
 	}
+
 	if (m_RecordSaveDir.GetLength() > 0 && m_RecordSaveDir[m_RecordSaveDir.GetLength()-1] != SPLIT_SLASH) {
 		m_RecordSaveDir += SPLIT_SLASH_STR;
 	}
+
 	return Error;
 }
 
 
-ErrorCodeEnum CRecorderEntity::__OnClose(ErrorCodeEnum preOperationError)
+void CRecorderEntity::OnStarted()
 {
-	if (preOperationError != Error_Succeed) {
-		return preOperationError;
+	CSystemStaticInfo si;
+	ErrorCodeEnum Error = GetFunction()->GetSystemStaticInfo(si);
+	if (Error == Error_Succeed) {
+		m_strAppVersion = si.InstallVersion.ToString();
+		m_strTerminalId = si.strTerminalID;
 	}
 	
-	for (int i = 0; i < m_arrListener.GetCount(); ++i) {
-		GetFunction()->UnsubscribeLog(m_arrListener[i]);
-	}
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("TerminalID is %s, Application Version is %s", m_strTerminalId.GetData(), m_strAppVersion.GetData());
 
-	GetFunction()->UnregistSysVarEvent(SYSVAR_ACTIVETRACKINGCAMERA);
-	GetFunction()->UnregistSysVarEvent(SYSVAR_CAMERASTATE);
-	StopRecord();
+	LoadEntityConfig();
+	//DeleteExceptionLogFiles();
+	SaveExceptionRecordVideos();
 
-	return Error_Succeed;
+	if (m_vRecordList.size() > 0) {
+		HandleExceptionRecordVideos();
+		PostVideoRecordInfos();
+	}
 }
 
-
 bool CRecorderEntity::InitRecorder()
 {
 	bool bRet = false;
 
-	if ((ePadtype == m_eDeviceType) || (eMobilePadType == m_eDeviceType) || (eDesk2SType == m_eDeviceType)) {
-		//pad 版增加远端视频队列
+	if ((eMobilePadType == m_eDeviceType) || (eStand1SPlusType == m_eDeviceType)) {
 		m_pRecorder = new Clibvideorecord(&bRet, this, REC_COMMON_AUDIO_SHM_QUEUE,
 			REC_COMMON_VIDEO_ENV_SHM_RTP_QUEUE, NULL);
 	}
 	else {
-		//  == 2
 		m_pRecorder = new Clibvideorecord(&bRet, this, REC_COMMON_AUDIO_SHM_QUEUE,
 			REC_COMMON_VIDEO_ENV_SHM_RTP_QUEUE, REC_COMMON_VIDEO_OPT_SHM_RTP_QUEUE);
 	}
 
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("init libvideorecord success!");
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("init libvideorecord success!");
 
 	return bRet;
 }
@@ -182,8 +218,31 @@ bool CRecorderEntity::ReleaseRecorder()
 		delete m_pRecorder;
 		m_pRecorder = NULL;
 	}
+
+	return true;
 }
 
+ErrorCodeEnum CRecorderEntity::__OnClose(ErrorCodeEnum preOperationError)
+{
+	if (preOperationError != Error_Succeed) {
+		return preOperationError;
+	}
+	
+	for (int i = 0; i < m_arrListener.GetCount(); ++i) {
+		GetFunction()->UnsubscribeLog(m_arrListener[i]);
+	}
+
+	GetFunction()->UnregistSysVarEvent(SYSVAR_ACTIVETRACKINGCAMERA);
+	GetFunction()->UnregistSysVarEvent(SYSVAR_CAMERASTATE);
+
+	StopRecord();
+
+	return Error_Succeed;
+}
+
+
+
+
 CServerSessionBase* CRecorderEntity::OnNewSession(const char* pszRemoteEntityName, const char* pszClass)
 {
 	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s connected class = %s!", pszRemoteEntityName, pszClass);
@@ -231,19 +290,174 @@ void CRecorderEntity::vDebug(record_loglevel elevel, const char* str, va_list li
 	}
 }
 
+
 int CRecorderEntity::GetActiveCamera()
 {
 	return m_iActiveCamera;
 }
 
-int CRecorderEntity::GetCameraState()
+ErrorCodeEnum CRecorderEntity::LoadEntityConfig()
 {
-	return m_iCameraState;
+	ErrorCodeEnum Error = Error_Succeed;
+
+	int iEncrytion = 0;
+	int iRecordType = 0;
+	int iRecordMode = 0;
+	UINT64 uMtype = 0x0;
+	int iTimeOut = RVC_HTTPTIMEOUT;
+	CSmartPointer<IConfigInfo> spConfig;
+	CSmartPointer<IEntityFunction> spFunction = GetFunction();
+	if (spFunction->OpenConfig(Config_CenterSetting, spConfig) == Error_Succeed) {
+
+#ifdef RVC_OS_WIN
+		spConfig->ReadConfigValueInt("Recorder", "Encryption", iEncrytion);
+		spConfig->ReadConfigValueHexInt("Recorder", "EncMtype", uMtype);
+#endif // RVC_OS_WIN
+		spConfig->ReadConfigValueInt("Recorder", "RecordType", iRecordType);
+		spConfig->ReadConfigValueInt("InteractiveControl", "RecordMode", iRecordMode);
+		spConfig->ReadConfigValue("Recorder", "http_video_record_addr", m_strHttpServerAddr);
+		spConfig->ReadConfigValueInt("Recorder", "http_timeout", iTimeOut);
+	}
+	else {
+		Error = Error_Failed;
+	}
+
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Encryption flag is %d, and EncMtype is 0x%08x.", iEncrytion, uMtype);
+
+#ifdef RVC_OS_WIN
+	if (1 == iEncrytion && (uMtype & GetDeviceTypeValue(m_eDeviceType))) {
+		m_bEncFlag = true;
+	}
+#endif // RVC_OS_WIN
+
+	if (1 == iRecordMode) {
+		m_iRecordMode = 1;
+	}
+
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Record Mode is %d, HttpServerAddr is %s.", m_iRecordMode, m_strHttpServerAddr.GetData());
+
+	if (eMobilePadType != m_eDeviceType) {
+		if (0 != iRecordType) {
+			m_eRecordType = eMP4;
+		}
+	}
+
+	if (iTimeOut > 0 && iTimeOut < 20 * RVC_HTTPTIMEOUT) {
+		m_iHttpTimeOut = iTimeOut;
+	}
+
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("EncFlag is %s, video format is %s, and http timeout is %d.", m_bEncFlag ? "true" : "false", m_eRecordType == eMP4 ? RECORD_MP4_SUFFIX : RECORD_WMV_SUFFIX, m_iHttpTimeOut);
+
+	return Error;
 }
 
 
+
+ErrorCodeEnum CRecorderEntity::PostVideoRecordInfos()
+{
+	ErrorCodeEnum Error = Error_Failed;
+
+	char strtimenow[MAX_PATH] = { 0 };
+	y2k_time_t nowtime = y2k_time_now();
+	y2k_to_string(nowtime, strtimenow, MAX_PATH);
+
+	video_record_info_t video_params;
+	video_params.strServerURL = m_strHttpServerAddr;
+	video_params.strAPI = m_strHttpServerAPI;
+	video_params.strAppVersion = m_strAppVersion;
+	video_params.strRecordEndTime = strtimenow;
+
+	video_params.strTerminalNo = m_strTerminalId;
+
+	video_params.iBusinessStatus = (int)m_eBusinessStatus;
+	if (eFailed == m_eBusinessStatus) {
+		if (m_vRecordList.size() > 0) {
+			video_params.iBusinessStatus = eInterrupt;
+		}
+	}
+
+	video_params.strRecordID = m_strRecordName;
+	for (vector<record_item_t>::iterator it = m_vRecordList.begin(); it < m_vRecordList.end(); ++it) {
+		video_params.vRecordList.push_back(*it);
+	}
+
+	if (0 == post_video_recordinfo_list(&video_params, m_iHttpTimeOut, false)) {
+		Error = Error_Succeed;
+	}
+	else {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Post video record info failed.");
+	}
+
+	m_vRecordList.clear();
+
+	return Error;
+}
+
+
+ErrorCodeEnum CRecorderEntity::HandleExceptionRecordVideos()
+{
+	ErrorCodeEnum Error = Error_Failed;
+	const char* videofilename = m_vRecordList[0].file_path.c_str();
+	if (NULL == videofilename) {
+		return Error;
+	}
+
+	char strSession[RVC_MAX_VIDEO_NAME_LEN] = { 0 };
+	int iSeriesNum = -1;
+	char strFormat[RVC_MAX_VIDEO_NAME_LEN] = { 0 };
+
+	if (-1 == GetRecordVideoInfo(videofilename, strSession, RVC_MAX_VIDEO_NAME_LEN, &iSeriesNum, strFormat, RVC_MAX_VIDEO_NAME_LEN)) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[%s] get record video info failed.", videofilename);
+		return Error;
+	}
+
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("videofilename = %s, strSession = [%s], iSeriesNum = %d.", videofilename, strSession, iSeriesNum);
+
+	SetRecordSessionID(strSession + strlen(RVC_TRANSATCION_RECORD_SUFFIX));
+
+	while (--iSeriesNum >= 0) {
+		char strFilePath[MAX_PATH] = { 0 };
+		snprintf(strFilePath, MAX_PATH, "%s%s_%d.%s", m_RecordSaveDir.GetData(), strSession, iSeriesNum, strFormat);
+		if (ExistsFile(strFilePath)) {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("File {%s} is exist, add to video record list.", strFilePath);
+			AddToVideoRecordList(strFilePath);
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("File {%s} is not exist.", strFilePath);
+		}
+	}
+}
+
+
+ErrorCodeEnum CRecorderEntity::AddToVideoRecordList(const char* videofilename)
+{
+	ErrorCodeEnum Error = Error_Failed;
+	if (NULL == videofilename) {
+		return Error;
+	}
+
+	record_item_t* item = new record_item_t();
+
+	item->file_path = videofilename;
+
+	item->file_length = (int)GetFileSize(videofilename);
+
+	const char* strfilename = GetFileName(videofilename);
+	if (strfilename) {
+		item->file_name = strfilename;
+	}
+
+	m_vRecordList.push_back(*item);
+
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_vRecordList size = %d.", m_vRecordList.size());
+
+	Error = Error_Succeed;
+
+	return Error;
+}
 void CRecorderEntity::OnRecordFailed(eRvcRecordFailedCase eCase, const char *pszMessage, bool bRecordDevFault)
 {
+	m_eBusinessStatus = eFailed;
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnRecordFailed!");
 	if (!bRecordDevFault){
 		LogEvent(Severity_Middle,LOG_EVT_RECORDFAILED,"0");
@@ -259,7 +473,6 @@ void CRecorderEntity::OnRecordFailed(eRvcRecordFailedCase eCase, const char *psz
 	}
 }
 
-
 void CRecorderEntity::OnRecordEntityExcption()
 {
 	LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORD_ENTITY_EXCEPTION, "OnRecordEntityExcption!");
@@ -270,30 +483,20 @@ void CRecorderEntity::OnRecordFinished()
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnRecordFinished!");
 }
 
-
-static unsigned long GetFileSize(const char* filename)
+int CRecorderEntity::GetCameraState()
 {
-	struct stat statbuf;
-	stat(filename, &statbuf);
-	return statbuf.st_size;
+	return m_iCameraState;
 }
 
-static void LogVideoSizeInfo(const char* pszMessage)
-{
-	unsigned long ufilesize = GetFileSize(pszMessage);
-	char strmsg[MAX_PATH] = { 0 };
-	snprintf(strmsg, MAX_PATH, "%s file size is %u byte.", pszMessage, ufilesize);
-
-	LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORDER_VIDEO_SIZE, strmsg);
-}
 
 void CRecorderEntity::OnASectionFinished(const char* pszMessage, int iSerialNum, bool bfinished)
 {
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("file %s finished.(SerialNum %d)", pszMessage, iSerialNum);
-	if (false == bfinished) {
+	m_iSeriesNum = iSerialNum;
+	if (false == bfinished){
 		LogEvent(Severity_Middle, LOG_EVT_RECORDER_SECTION_FINISHED, pszMessage);
 	}
-	else {
+	else{
 		LogEvent(Severity_Middle, LOG_EVT_RECORDER_WHOLE_FINISHED, pszMessage);
 	}
 }
@@ -331,12 +534,29 @@ void CRecorderEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,
 		}
 		break;
 
+	case EVENT_MOD_PAUSE_RECORD:
+		if (m_bStarted && (0 == m_iRecordMode)){
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("manipulate media device function called, pause record!");
+			m_pRecorder->PauseRecord();
+			m_pRecorder->CloseVideoFile();
+		}
+		break;
+
+	case EVENT_MOD_CONTINUE_RECORD:
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("manipulate media device function called, continue record!");
+		m_pRecorder->ContinueRecord();
+		break;
+
 	case LOG_EVT_RECORDER_SECTION_FINISHED:
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("recorder section finished, and message is %s.", pszMessage);
 			if (m_iRecordMode) {
 				LogVideoSizeInfo(pszMessage);
 			}
+			if (m_bEncFlag){
+				HandleEncryptVideoRecord(pszMessage);
+			}
+			HandleSaveVideoRecord(pszMessage);
 		}
 		break;
 
@@ -346,9 +566,19 @@ void CRecorderEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,
 			if (m_iRecordMode) {
 				LogVideoSizeInfo(pszMessage);
 			}
+			if (m_bEncFlag){
+				HandleEncryptVideoRecord(pszMessage);
+			}
+			HandleFinishedVideoRecord(pszMessage);
+			PostVideoRecordInfos();
 		}
 		break;
 
+	case LOG_EVT_START_BUSINESSRECORD_FAILED:
+		m_eBusinessStatus = eFailed;
+		PostVideoRecordInfos();
+		break;
+
 	default:
 		break;
 	}
@@ -363,6 +593,9 @@ void CRecorderEntity::OnSysVarEvent(const char *pszKey, const char *pszValue,con
 		m_iCameraState = pszValue[0]; 
 		if (pszValue[0] == 'E'){
 			m_iActiveCamera = CAMERA_TYPE_OPT;
+			if (eDesk1SType == m_eDeviceType || eDesk2SIntegratedType == m_eDeviceType){
+				m_iActiveCamera = CAMERA_TYPE_ERROR;
+			}
 		}
 		else if (pszValue[0] == 'O'){
 			m_iActiveCamera = CAMERA_TYPE_ENV;
@@ -422,9 +655,10 @@ void CRecorderEntity::StartRecord(const char *videofilename)
 	tAudioParams.bIsTransOn = false;
 	tAudioParams.iAudioChannels = 1;
 
-	if (m_pRecorder->StartVideoRecord(fps, 75, m_eRecordType, &tAudioParams, NULL, FALSE, TRUE, (LPCSTR)m_RecordSaveDir, m_RecordSaveDir.GetLength(), videofilename, strlen(videofilename)))
+	if (m_pRecorder->StartVideoRecord(fps, 75, m_eRecordType, &tAudioParams, NULL, FALSE, TRUE, (LPCSTR)m_TempDir, m_RecordSaveDir.GetLength(), videofilename, strlen(videofilename)))
 	{
-		m_bStarted = TRUE;
+		m_bStarted = true;
+		m_eBusinessStatus = eSuccess;
 	}
 }
 
@@ -438,6 +672,22 @@ void CRecorderEntity::StopRecord()
 }
 
 
+void CRecorderEntity::SetRecordSessionID(const char* strRecordID)
+{
+	if (NULL != strRecordID) {
+		memset(m_strRecordName, 0 , MAX_PATH);
+		snprintf(m_strRecordName, MAX_PATH, "%s", strRecordID);
+	}
+}
+
+void CRecorderEntity::GetRecordSessionID(char* strRecordID, size_t uLen)
+{
+	if (NULL != strRecordID) {
+		snprintf(strRecordID, uLen, "%s", m_strRecordName);
+	}
+}
+
+
 DeviceTypeEnum CRecorderEntity::RvcGetDeviceType()
 {
 	DeviceTypeEnum eType = eStand2sType;
@@ -481,10 +731,460 @@ DeviceTypeEnum CRecorderEntity::RvcGetDeviceType()
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("device type is %s.", Device_Type_Table[eType]);
 	}
 
+	m_terminalNo = stStaticinfo.strTerminalID;
+
 	return eType;
 }
 
 
+int CRecorderEntity::HandleFinishedVideoRecord(const char* videofilename)
+{
+	int iRet = -1;
+	if (NULL == videofilename){
+		return iRet;
+	}
+
+	char strSession[RVC_MAX_VIDEO_NAME_LEN] = {0};
+	int iSeriesNum = -1;
+	char strFormat[RVC_MAX_VIDEO_NAME_LEN] = {0};
+
+	if (-1 == GetRecordVideoInfo(videofilename, strSession, RVC_MAX_VIDEO_NAME_LEN, &iSeriesNum, strFormat, RVC_MAX_VIDEO_NAME_LEN)){
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[%s] get record video info failed.", videofilename);
+		return iRet;
+	}
+
+	if (iSeriesNum >= 1 || m_iRecordMode){
+		CSimpleStringA srcfile = CSimpleStringA::Format("%s%s_%d_end.%s",(LPCTSTR)m_TempDir,(LPCTSTR)strSession, iSeriesNum, strFormat);
+		CSimpleStringA dstfile = CSimpleStringA::Format("%s%s_%d_end.%s",(LPCTSTR)m_RecordSaveDir,(LPCTSTR)strSession, iSeriesNum, strFormat);
+		BOOL bRet = FALSE;
+		if (ExistsFile(srcfile.GetData())){
+			if(rename(srcfile.GetData(), dstfile.GetData())) {
+				char strmsg[MAX_PATH] = {0};
+				snprintf(strmsg, MAX_PATH, "Error Code %u while move %s ", GetLastError(), srcfile.GetData());
+				LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORDER_MOVE_FAILED, strmsg);
+			}
+			else {
+				AddToVideoRecordList(dstfile.GetData());
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("record finished move file form %s to %s success.", srcfile.GetData(), dstfile.GetData());
+			}
+		}
+
+		srcfile = CSimpleStringA::Format("%s%s_%d.%s",(LPCTSTR)m_TempDir,(LPCTSTR)strSession, iSeriesNum-1, strFormat);
+		dstfile = CSimpleStringA::Format("%s%s_%d.%s",(LPCTSTR)m_RecordSaveDir,(LPCTSTR)strSession, iSeriesNum-1, strFormat);
+		if (ExistsFile(srcfile.GetData())){
+			if(rename(srcfile.GetData(), dstfile.GetData())) {
+				char strinfo[MAX_PATH] = {0};
+				snprintf(strinfo, MAX_PATH, "Error Code %u while move %s ", GetLastError(), srcfile.GetData());
+				LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORDER_MOVE_FAILED, strinfo);
+			}
+			else {
+				AddToVideoRecordList(dstfile.GetData());
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("record finished move file form %s to %s success.", srcfile.GetData(), dstfile.GetData());
+			}
+		}
+	}
+
+	iRet =  0;
+
+	return iRet;
+}
+
+
+int CRecorderEntity::HandleEncryptVideoRecord(const char* videofilename)
+{
+	int iRet = -1;
+	if (NULL == videofilename){
+		return iRet;
+	}
+
+#ifdef RVC_OS_WIN
+	filecryption_callback_t cb = { 0 };
+	cb.dbg = &rvcDbg;
+
+	char strOutFile[MAX_PATH] = { 0 };
+	int iresult = encryption_file(strOutFile, MAX_PATH, videofilename, &cb, eVerA);
+	if (0 != iresult) {
+		char strmsg[MAX_PATH] = { 0 };
+		_snprintf(strmsg, MAX_PATH, "encryption file %s failed, delete out temp file %s!", videofilename, strOutFile);
+		LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORDER_ENCRYPT_FAILED, strmsg);
+		if (DeleteFile(strOutFile)) {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("DeleteFile file %s success!", strOutFile);
+		}
+		return iRet;
+	}
+	else {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Encrypt file %s Success!", videofilename);
+	}
+
+	BOOL bRet = DeleteFile(videofilename);
+	if (!bRet) {
+		char strinfo[MAX_PATH] = { 0 };
+		_snprintf(strinfo, MAX_PATH, "Error Code %lu while delete %s, delete out temp file[%s]!", GetLastError(), videofilename, strOutFile);
+		LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORDER_DELETE_FAILED, videofilename);
+		if (DeleteFile(strOutFile)) {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("DeleteFile file %s success!", strOutFile);
+		}
+		return iRet;
+	}
+	else {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Delete %s Success!", videofilename);
+		if (!rename(strOutFile, videofilename)) {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("rename %s to %s Success!", strOutFile, videofilename);
+			iRet = 0;
+		}
+		else {
+			char strtext[MAX_PATH] = { 0 };
+			_snprintf(strtext, MAX_PATH, "Error Code %lu while rename %s.", GetLastError(), strOutFile);
+			LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORDER_RENAME_FAILED, strtext);
+		}
+	}
+#endif // RVC_OS_WIN
+
+
+
+	return iRet;
+}
+
+
+
+int CRecorderEntity::HandleSaveVideoRecord(const char* videofilename)
+{
+	int iRet = -1;
+	if (NULL == videofilename){
+		return iRet;
+	}
+
+	char strSession[RVC_MAX_VIDEO_NAME_LEN] = {0};
+	int iSeriesNum = -1;
+	char strFormat[RVC_MAX_VIDEO_NAME_LEN] = {0};
+
+	if (-1 == GetRecordVideoInfo(videofilename, strSession, RVC_MAX_VIDEO_NAME_LEN, &iSeriesNum, strFormat, RVC_MAX_VIDEO_NAME_LEN)){
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[%s] get record video info failed.", videofilename);
+		return iRet;
+	}
+
+	if (1 == m_iRecordMode) {
+		CSimpleStringA srcfile = CSimpleStringA::Format("%s%s_%d.%s", (LPCTSTR)m_TempDir, (LPCTSTR)strSession, iSeriesNum, strFormat);
+		CSimpleStringA dstfile = CSimpleStringA::Format("%s%s_%d.%s", (LPCTSTR)m_RecordSaveDir, (LPCTSTR)strSession, iSeriesNum, strFormat);
+		if (ExistsFile(srcfile.GetData())) {
+			if (rename(srcfile.GetData(), dstfile.GetData())) {
+				char strmsg[MAX_PATH] = { 0 };
+				snprintf(strmsg, MAX_PATH, "Error Code %u while move %s ", GetLastError(), srcfile.GetData());
+				LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORDER_MOVE_FAILED, strmsg);
+			}
+			else {
+				AddToVideoRecordList(dstfile.GetData());
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("section finished move file form %s to %s success.", srcfile.GetData(), dstfile.GetData());
+			}
+		}
+	}
+	else {
+		if (iSeriesNum >= 1) {
+			CSimpleStringA srcfile = CSimpleStringA::Format("%s%s_%d.%s", (LPCTSTR)m_TempDir, (LPCTSTR)strSession, iSeriesNum - 1, strFormat);
+			CSimpleStringA dstfile = CSimpleStringA::Format("%s%s_%d.%s", (LPCTSTR)m_RecordSaveDir, (LPCTSTR)strSession, iSeriesNum - 1, strFormat);
+			if (ExistsFile(srcfile.GetData())) {
+				if (rename(srcfile.GetData(), dstfile.GetData())) {
+					char strmsg[MAX_PATH] = { 0 };
+					snprintf(strmsg, MAX_PATH, "Error Code %u while move %s ", GetLastError(), srcfile.GetData());
+					LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORDER_MOVE_FAILED, strmsg);
+				}
+				else {
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("section finished move file form %s to %s success.", srcfile.GetData(), dstfile.GetData());
+				}
+				m_iMovedSeriesNum = iSeriesNum - 1;
+			}
+		}
+		else {
+			if (0 == m_iMovedSeriesNum) {
+				if (false == m_bMoveFlag) {
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("First record video, ignore it.");
+					m_bMoveFlag = true;
+				}
+				else {
+					CSimpleStringA srcfile = CSimpleStringA::Format("%s%s_%d_end.%s", (LPCTSTR)m_TempDir, (LPCTSTR)m_LastSaveSessionId, 0, strFormat);
+					if (ExistsFile(srcfile.GetData())) {
+						CSimpleStringA dstfile = CSimpleStringA::Format("%s%s_%d_end.%s", (LPCTSTR)m_RecordSaveDir, (LPCTSTR)m_LastSaveSessionId, 0, strFormat);
+						if (rename(srcfile.GetData(), dstfile.GetData())) {
+							char strtext[MAX_PATH] = { 0 };
+							snprintf(strtext, MAX_PATH, "Error Code %u while move %s ", GetLastError(), srcfile.GetData());
+							LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORDER_MOVE_FAILED, strtext);
+						}
+						else {
+							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("section finished move file form %s to %s success.", srcfile.GetData(), dstfile.GetData());
+							AddToVideoRecordList(dstfile.GetData());
+						}
+					}
+				}
+			}
+			else {
+				CSimpleStringA srcfile = CSimpleStringA::Format("%s%s_%d_end.%s", (LPCTSTR)m_TempDir, (LPCTSTR)m_LastSaveSessionId, m_iMovedSeriesNum + 1, strFormat);
+				if (ExistsFile(srcfile.GetData())) {
+					CSimpleStringA dstfile = CSimpleStringA::Format("%s%s_%d_end.%s", (LPCTSTR)m_RecordSaveDir, (LPCTSTR)m_LastSaveSessionId, m_iMovedSeriesNum + 1, strFormat);
+					if (rename(srcfile.GetData(), dstfile.GetData())) {
+						char strinfo[MAX_PATH] = { 0 };
+						snprintf(strinfo, MAX_PATH, "Error Code %u while move %s ", GetLastError(), srcfile.GetData());
+						LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORDER_MOVE_FAILED, strinfo);
+					}
+					else {
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("section finished move file form %s to %s success.", srcfile.GetData(), dstfile.GetData());
+						AddToVideoRecordList(dstfile.GetData());
+					}
+				}
+				m_iMovedSeriesNum = 0;
+			}
+
+			m_LastSaveSessionId = strSession;
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("New set last save session id is %s ", m_LastSaveSessionId.GetData());
+		}
+	}
+
+	iRet =  0;
+
+	return iRet;
+}
+
+
+int CRecorderEntity::GetRecordVideoInfo(const char* videofilename, char* strSession, size_t uSessionLen, int* iSeriesNum, char* strFormat, size_t uFormatLen)
+{
+	int iRet = -1;
+
+	char strFileName[RVC_MAX_VIDEO_NAME_LEN] = {0};
+	size_t uLen = strlen(videofilename);
+	if (uLen <= RVC_MAX_VIDEO_NAME_LEN){
+		const char *pIndex = strrchr(videofilename, SPLIT_SLASH);
+		if (pIndex){
+			snprintf(strFileName, RVC_MAX_VIDEO_NAME_LEN, "%s", pIndex + 1);
+		}
+	}
+	else{
+		return iRet;
+	}
+
+	int ioffset = 0;
+	if (0 == memcmp(strFileName, RVC_TRANSATCION_RECORD_SUFFIX, strlen(RVC_TRANSATCION_RECORD_SUFFIX))) {
+		ioffset = strlen(RVC_TRANSATCION_RECORD_SUFFIX);
+	}
+
+	char* pNum = strstr(strFileName+ioffset, "_");
+	if (pNum){
+		*pNum = 0;
+		strcpy(strSession, strFileName);
+		pNum++;
+	}
+	else{
+		return iRet;
+	}
+
+	char* pend = strstr(pNum, "_end");
+	if (pend){
+		*pend = 0;
+		*iSeriesNum = atoi(pNum);
+		pNum = pend + 1;
+	}
+
+	char* pFormat = strstr(pNum, ".");
+	if (pFormat){
+		*pFormat = 0;
+		pFormat++;
+		strcpy(strFormat, pFormat);
+	}
+	else{
+		return iRet;
+	}
+
+	if (NULL == pend){
+		*iSeriesNum = atoi(pNum);
+	}
+
+	iRet = 0;
+
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("video name info:(session is %s, series number is %d, video format is %s).", strSession, *iSeriesNum, strFormat);
+
+	return iRet;
+}
+
+
+int CRecorderEntity::SaveExceptionRecordVideos()
+{
+	int iRet = -1;
+#ifdef RVC_OS_WIN
+	char srcFilePath[MAX_PATH]={0};
+	WIN32_FIND_DATA FindFileData;
+	HANDLE hFind;
+	bool fFinished = false;
+	char strVideoFormat[MAX_PATH] = { 0 };
+	if (eMP4 == m_eRecordType) {
+		sprintf_s(strVideoFormat, MAX_PATH, "%s", RECORD_MP4_SUFFIX);
+	}
+	else {
+		sprintf_s(strVideoFormat, MAX_PATH, "%s", RECORD_WMV_SUFFIX);                                                                                                                                                                                                                                                         
+	}
+
+	sprintf_s(srcFilePath, MAX_PATH, "%s*.%s", m_TempDir.GetData(), strVideoFormat);
+
+	hFind = FindFirstFile(srcFilePath, &FindFileData);
+
+	if (INVALID_HANDLE_VALUE != hFind)
+	{
+		while (!fFinished){
+			if (FILE_ATTRIBUTE_DIRECTORY & FindFileData.dwFileAttributes){
+				goto on_next;
+			}
+
+			if (NULL == strstr(FindFileData.cFileName, "S_") && NULL == strstr(FindFileData.cFileName, "G_")){
+				CSimpleStringA srcfile = CSimpleStringA::Format("%s%s",m_TempDir.GetData(), FindFileData.cFileName);
+				if (m_bEncFlag){
+					filecryption_callback_t cb = {0};
+					cb.dbg = &rvcDbg;
+					if (false == is_file_encrypted(srcfile.GetData(), &cb)){
+						HandleEncryptVideoRecord(srcfile.GetData());
+					}
+					else{
+						char* pIndex = NULL;
+						if (pIndex = strstr(FindFileData.cFileName, RVC_FILEENC_STR)){
+							char strname[MAX_PATH] = {0};
+							memcpy(strname, pIndex+strlen(RVC_FILEENC_STR), strlen(pIndex+strlen(RVC_FILEENC_STR)));
+							CSimpleStringA tempsrcfile = CSimpleStringA::Format("%s%s",m_TempDir.GetData(), strname);
+							if (!rename(srcfile.GetData(),tempsrcfile.GetData())){
+								DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("rename %s to %s Success!",srcfile.GetData(),tempsrcfile.GetData());
+								srcfile = tempsrcfile;
+								memset(FindFileData.cFileName, 0, MAX_PATH);
+								memcpy(FindFileData.cFileName, strname, strlen(strname));
+							}
+							else{
+								char strinfo[MAX_PATH] = {0};
+								_snprintf(strinfo, MAX_PATH, "Error Code %lu while rename %s.", GetLastError(), srcfile.GetData());
+								LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORDER_RENAME_FAILED, strinfo);
+							}
+						}
+					}
+				}
+
+				CSimpleStringA dstfile = CSimpleStringA::Format("%s%s",m_RecordSaveDir.GetData(), FindFileData.cFileName);
+				BOOL bRet = MoveFile(srcfile.GetData(), dstfile.GetData());
+				if(!bRet) {
+					char strmsg[MAX_PATH] = {0};
+					_snprintf(strmsg, MAX_PATH, "Error Code %u while move %s -> %s", GetLastError(), srcfile.GetData(), dstfile.GetData());
+					LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORDER_MOVE_FAILED, strmsg);
+				}
+				else{
+					AddToVideoRecordList(dstfile.GetData());
+					iRet = 0;
+				}
+			}
+
+on_next:
+			if (!FindNextFile(hFind, &FindFileData)){
+				if (GetLastError() == ERROR_NO_MORE_FILES){
+					fFinished = true;
+				}
+				else{
+					break;
+				}
+			}
+		}
+		FindClose(hFind);
+	}
+#endif // RVC_OS_WIN
+
+	return iRet;
+}
+
+
+int CRecorderEntity::DeleteExceptionLogFiles()
+{
+	CSimpleStringA strDbgPath;
+#ifdef RVC_OS_WIN
+
+	WIN32_FIND_DATA FindFileData;
+	HANDLE hFind;
+	bool fFinished = false;
+
+	auto pFunc = GetFunction();
+	pFunc->GetPath("Dbg", strDbgPath);
+
+	char logPath[MAX_PATH] = "";
+	sprintf(logPath, "%s\\%s", strDbgPath.GetData(), MOD_RECORDER_NAME);
+
+	char srcFilePath[MAX_PATH]={0};
+	sprintf_s(srcFilePath, MAX_PATH, "%s\\*.*", logPath);
+
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("srcFilePath is %s.", srcFilePath);
+	hFind = FindFirstFile(srcFilePath, &FindFileData);
+
+	if (INVALID_HANDLE_VALUE != hFind)
+	{
+		while (!fFinished)
+		{
+			if (FILE_ATTRIBUTE_DIRECTORY & FindFileData.dwFileAttributes)
+			{
+				goto on_next;
+			}
+
+			__int64 nSize = ((__int64)FindFileData.nFileSizeHigh << 32) + FindFileData.nFileSizeLow;
+			if (nSize > MAX_LOGFILE_SIZE)
+			{
+				CSimpleStringA dstfile = CSimpleStringA::Format("%s\\%s",logPath, FindFileData.cFileName);
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("srcFilePath is %s.", dstfile.GetData());
+				BOOL bRet = DeleteFile(dstfile.GetData());
+				if(bRet) {
+					LogWarn(Severity_Low, Error_Debug, LOG_EVT_DELETE_BIG_LOGFILE, dstfile.GetData());
+				}
+			}
+on_next:
+			if (!FindNextFile(hFind, &FindFileData)){
+				if (GetLastError() == ERROR_NO_MORE_FILES){
+					fFinished = true;
+				}
+				else{
+					break;
+				}
+			}
+		}
+		FindClose(hFind);
+	}
+
+#endif // RVC_OS_WIN
+
+	return 0;
+}
+
+
+bool CRecorderEntity::IsCurrentTerminalMathed()
+{
+	bool bRet = false;
+	CSimpleStringA TerminalList ="";
+	CSmartPointer<IEntityFunction> spFunction = GetFunction();
+	CSmartPointer<IConfigInfo> spConfig;
+
+	ErrorCodeEnum Error = spFunction->OpenConfig(Config_CenterSetting, spConfig);
+	Error = spConfig->ReadConfigValue("Recorder", "TerminalList", TerminalList);
+	if (Error_Succeed == Error){
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get TerminalList=%s from CenterSetting.ini", TerminalList);
+		if (TerminalList.GetLength() > 0){
+			CSystemStaticInfo systemStaticInfo;
+			auto rc =  GetFunction()->GetSystemStaticInfo(systemStaticInfo);
+			CAutoArray<CSimpleStringA> tList = TerminalList.Split('|');
+			for(int i=0; i<tList.GetCount(); i++){
+				if(tList[i] == systemStaticInfo.strTerminalID){
+					bRet = true;
+					break;
+				}
+			}
+		}
+		else{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("TerminalList length from CenterSetting.ini is zero.");
+			bRet = true;
+		}
+	} 
+	else{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get TerminalList section from CenterSetting.ini failed!");
+		bRet = true;
+	}
+
+	return bRet;
+};
+
 SP_BEGIN_ENTITY_MAP()
 	SP_ENTITY(CRecorderEntity)
 SP_END_ENTITY_MAP()

+ 3 - 6
Module/mod_sipphone/Event.h

@@ -209,13 +209,10 @@
 #define CALLTYPE_NORMAL 'N' // 呼叫类型,普通模式
 #define CALLTYPE_MOBILE	'M' // 呼叫类型,手机模式
 	
+#define LOG_EVT_UI_STARTRECORD					0x30B00001				//开始录像
+#define LOG_EVT_UI_STOPRECORD					0x30B00002				//停止录像
+#define LOG_EVT_UI_RETURNMENU					0x30B00006				//退出到主菜单
 
-//event add by ly@20180725
-#define LOG_EVT_UI_STARTRECORD		0x30B00001				//开始录像
-#define LOG_EVT_UI_STOPRECORD		0x30B00002				//停止录像
-#define LOG_EVT_UI_RETURNMENU		0x30B00006				//退出到主菜单
-
-// add by clp  20191106
 #define LOG_EVT_UI_STARTREMOTERECORD			0x30B0000F				//开始远程双录
 #define LOG_EVT_UI_STOPREMOTERECORD				0x30B00018				//停止远程录像
 

+ 196 - 0
Module/mod_sipphone/SIPPhone_client_g.h

@@ -519,6 +519,202 @@ public:
 		return ret;
 	}
 
+	ErrorCodeEnum GetHandfreeInVolume(PhoneService_GetHandfreeInVolume_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(PhoneService_Method_GetHandfreeInVolume, PhoneService_MethodSignature_GetHandfreeInVolume, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum GetHandfreeInVolume(PhoneService_GetHandfreeInVolume_Req &Req, PhoneService_GetHandfreeInVolume_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetHandfreeInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetHandfreeInVolume(PhoneService_GetHandfreeInVolume_Req &Req, PhoneService_GetHandfreeInVolume_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetHandfreeInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetHandfreeInVolume(PhoneService_GetHandfreeInVolume_Req &Req, PhoneService_GetHandfreeInVolume_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetHandfreeInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum SetHandfreeInVolume(PhoneService_SetHandfreeInVolume_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(PhoneService_Method_SetHandfreeInVolume, PhoneService_MethodSignature_SetHandfreeInVolume, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum SetHandfreeInVolume(PhoneService_SetHandfreeInVolume_Req &Req, PhoneService_SetHandfreeInVolume_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetHandfreeInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum SetHandfreeInVolume(PhoneService_SetHandfreeInVolume_Req &Req, PhoneService_SetHandfreeInVolume_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetHandfreeInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum SetHandfreeInVolume(PhoneService_SetHandfreeInVolume_Req &Req, PhoneService_SetHandfreeInVolume_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetHandfreeInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum SetPickupInVolume(PhoneService_SetPickupInVolume_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(PhoneService_Method_SetPickupInVolume, PhoneService_MethodSignature_SetPickupInVolume, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum SetPickupInVolume(PhoneService_SetPickupInVolume_Req &Req, PhoneService_SetPickupInVolume_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetPickupInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum SetPickupInVolume(PhoneService_SetPickupInVolume_Req &Req, PhoneService_SetPickupInVolume_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetPickupInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum SetPickupInVolume(PhoneService_SetPickupInVolume_Req &Req, PhoneService_SetPickupInVolume_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetPickupInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum GetPickupInVolume(PhoneService_GetPickupInVolume_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(PhoneService_Method_GetPickupInVolume, PhoneService_MethodSignature_GetPickupInVolume, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum GetPickupInVolume(PhoneService_GetPickupInVolume_Req &Req, PhoneService_GetPickupInVolume_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetPickupInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetPickupInVolume(PhoneService_GetPickupInVolume_Req &Req, PhoneService_GetPickupInVolume_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetPickupInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetPickupInVolume(PhoneService_GetPickupInVolume_Req &Req, PhoneService_GetPickupInVolume_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetPickupInVolume(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
 
 	bool SafeDelete()
 	{

+ 102 - 0
Module/mod_sipphone/SIPPhone_def_g.h

@@ -35,6 +35,10 @@ namespace SIPPhone {
 #define PhoneService_Method_GetPickupOutVolume 13
 #define PhoneService_Method_StartVideoRender 14
 #define PhoneService_Method_StopVideoRender 15
+#define PhoneService_Method_GetHandfreeInVolume 16
+#define PhoneService_Method_SetHandfreeInVolume 17
+#define PhoneService_Method_SetPickupInVolume 18
+#define PhoneService_Method_GetPickupInVolume 19
 
 #define PhoneService_MethodSignature_MakeCall -1045574280
 #define PhoneService_MethodSignature_HangupCall 507892508
@@ -52,6 +56,24 @@ namespace SIPPhone {
 #define PhoneService_MethodSignature_GetPickupOutVolume 1201465844
 #define PhoneService_MethodSignature_StartVideoRender 570775603
 #define PhoneService_MethodSignature_StopVideoRender -1920889093
+#define PhoneService_MethodSignature_GetHandfreeInVolume -973146972
+#define PhoneService_MethodSignature_SetHandfreeInVolume -1471315400
+#define PhoneService_MethodSignature_SetPickupInVolume 35636029
+#define PhoneService_MethodSignature_GetPickupInVolume -735373015
+
+#define PhoneService_LogCode_MakeCall "QLR040230100"
+#define PhoneService_LogCode_HangupCall "QLR040230101"
+#define PhoneService_LogCode_StartVideo "QLR040230102"
+#define PhoneService_LogCode_StopVideo "QLR040230103"
+#define PhoneService_LogCode_RealErrorCheck "QLR040230104"
+#define PhoneService_LogCode_ReleaseCall "QLR040230105"
+#define PhoneService_LogCode_SetCallingParam "QLR040230109"
+#define PhoneService_LogCode_GetHandfreeOutVolume "QLR040230110"
+#define PhoneService_LogCode_SetHandfreeOutVolume "QLR040230111"
+#define PhoneService_LogCode_SetPickupOutVolume "QLR040230112"
+#define PhoneService_LogCode_GetPickupOutVolume "QLR040230113"
+#define PhoneService_LogCode_StartVideoRender "QLR040230114"
+#define PhoneService_LogCode_StopVideoRender "QLR040230115"
 
 #define PhoneService_LogCode_MakeCall "QLR040230100"
 #define PhoneService_LogCode_HangupCall "QLR040230101"
@@ -328,6 +350,86 @@ struct PhoneService_StopVideoRender_Info
 
 };
 
+struct PhoneService_GetHandfreeInVolume_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct PhoneService_GetHandfreeInVolume_Ans
+{
+	int Volume;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & Volume;
+	}
+
+};
+
+struct PhoneService_SetHandfreeInVolume_Req
+{
+	int Volume;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & Volume;
+	}
+
+};
+
+struct PhoneService_SetHandfreeInVolume_Ans
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct PhoneService_SetPickupInVolume_Req
+{
+	int Volume;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & Volume;
+	}
+
+};
+
+struct PhoneService_SetPickupInVolume_Ans
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct PhoneService_GetPickupInVolume_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct PhoneService_GetPickupInVolume_Ans
+{
+	int Volume;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & Volume;
+	}
+
+};
+
 
 ///////////////////////////
 

+ 108 - 0
Module/mod_sipphone/SIPPhone_server_g.h

@@ -135,6 +135,34 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case PhoneService_Method_GetHandfreeInVolume:
+			if (dwSignature == PhoneService_MethodSignature_GetHandfreeInVolume) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case PhoneService_Method_SetHandfreeInVolume:
+			if (dwSignature == PhoneService_MethodSignature_SetHandfreeInVolume) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case PhoneService_Method_SetPickupInVolume:
+			if (dwSignature == PhoneService_MethodSignature_SetPickupInVolume) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case PhoneService_Method_GetPickupInVolume:
+			if (dwSignature == PhoneService_MethodSignature_GetPickupInVolume) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -221,6 +249,26 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case PhoneService_Method_GetHandfreeInVolume:
+			if (dwSignature != PhoneService_MethodSignature_GetHandfreeInVolume) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case PhoneService_Method_SetHandfreeInVolume:
+			if (dwSignature != PhoneService_MethodSignature_SetHandfreeInVolume) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case PhoneService_Method_SetPickupInVolume:
+			if (dwSignature != PhoneService_MethodSignature_SetPickupInVolume) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case PhoneService_Method_GetPickupInVolume:
+			if (dwSignature != PhoneService_MethodSignature_GetPickupInVolume) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -303,6 +351,26 @@ public:
 	/// override by user
 	}
 
+	virtual void Handle_GetHandfreeInVolume(SpReqAnsContext<PhoneService_GetHandfreeInVolume_Req, PhoneService_GetHandfreeInVolume_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_SetHandfreeInVolume(SpReqAnsContext<PhoneService_SetHandfreeInVolume_Req, PhoneService_SetHandfreeInVolume_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_SetPickupInVolume(SpReqAnsContext<PhoneService_SetPickupInVolume_Req, PhoneService_SetPickupInVolume_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_GetPickupInVolume(SpReqAnsContext<PhoneService_GetPickupInVolume_Req, PhoneService_GetPickupInVolume_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
 	virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		CAutoBuffer Buf;
@@ -465,6 +533,46 @@ public:
 						Handle_StopVideoRender(ctx);
 					}
 					break;
+				case PhoneService_Method_GetHandfreeInVolume:
+					{
+						SpReqAnsContext<PhoneService_GetHandfreeInVolume_Req,PhoneService_GetHandfreeInVolume_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<PhoneService_GetHandfreeInVolume_Req,PhoneService_GetHandfreeInVolume_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_GetHandfreeInVolume(ctx);
+					}
+					break;
+				case PhoneService_Method_SetHandfreeInVolume:
+					{
+						SpReqAnsContext<PhoneService_SetHandfreeInVolume_Req,PhoneService_SetHandfreeInVolume_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<PhoneService_SetHandfreeInVolume_Req,PhoneService_SetHandfreeInVolume_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_SetHandfreeInVolume(ctx);
+					}
+					break;
+				case PhoneService_Method_SetPickupInVolume:
+					{
+						SpReqAnsContext<PhoneService_SetPickupInVolume_Req,PhoneService_SetPickupInVolume_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<PhoneService_SetPickupInVolume_Req,PhoneService_SetPickupInVolume_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_SetPickupInVolume(ctx);
+					}
+					break;
+				case PhoneService_Method_GetPickupInVolume:
+					{
+						SpReqAnsContext<PhoneService_GetPickupInVolume_Req,PhoneService_GetPickupInVolume_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<PhoneService_GetPickupInVolume_Req,PhoneService_GetPickupInVolume_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_GetPickupInVolume(ctx);
+					}
+					break;
 				default:
 					assert(0);
 					break;

+ 28 - 0
Module/mod_sipphone/SipService.xml

@@ -106,6 +106,34 @@
 		</oneway>
 		<oneway name="StopVideoRender" overlap="true">
 		</oneway>
+		<twoway name="GetHandfreeInVolume" overlap="true">
+			<req>
+			</req>
+			<res>
+				<param name="Volume" type="int"/>
+			</res>
+		</twoway>
+		<twoway name="SetHandfreeInVolume" overlap="true">
+			<req>
+				<param name="Volume" type="int"/>
+			</req>
+			<res>
+			</res>
+		</twoway>
+		<twoway name="SetPickupInVolume" overlap="true">
+			<req>
+				<param name="Volume" type="int"/>
+			</req>
+			<res>
+			</res>
+		</twoway>
+		<twoway name="GetPickupInVolume" overlap="true">
+			<req>
+			</req>
+			<res>
+				<param name="Volume" type="int"/>
+			</res>
+		</twoway>
 	</class>
 	<!-- ÊÓÆµ¿ò¿ªÊ¼Òƶ¯ÏûÏ¢ -->
 	<message name="VideoBoxStartMove">

+ 20 - 14
Module/mod_sipphone/mod_sipphone.h

@@ -83,15 +83,15 @@ struct CFpsValue
 
 struct stVideoParam
 {
-	int nWindowState;	 //瑙嗛�绐楀彛鏄剧ず鐘舵€侊紝0锛氭�甯稿ぇ灏忔樉绀猴紝1锛氭斁澶т竴鍊嶆樉绀猴紝2锛氶殣钘忓叏閮ㄧ獥鍙o紝3:浠庨殣钘忕姸鎬佹仮澶嶄负鍏ㄩ儴鏄剧ず锛�4锛氭樉绀鸿繙绋嬬獥鍙o紝闅愯棌鏈�湴绐楀彛, 5锛氱缉鏀炬樉绀�
-	int bShowActiveImg;  //娲讳綋妫€娴嬫樉绀哄浘鐗�
-	int bActiveInspect;  //鏄�惁鍚�姩娲讳綋妫€娴�
+	int nWindowState;	 //视频窗口显示状态,0:正常大小显示,1:放大一倍显示,2:隐藏全部窗口,3:从隐藏状态恢复为全部显示,4:显示远程窗口,隐藏本地窗口, 5:缩放显示
+	int bShowActiveImg;  //活体检测显示图片
+	int bActiveInspect;  //是否启动活体检测
 	int iActiveCamera;	 // set by facetracking
 	int iCameraSwitch;	 // set by agent and camerastate
-	int nUpDynamicFps;	 // 褰撳墠瑙嗛�涓婅�鐨勫抚棰戯紝鐢卞悗绔�€氱煡鍓嶇�鏇存敼棰戠巼,鍙�湁绉诲姩鐗堟墠浣跨敤
+	int nUpDynamicFps;	 // 当前视频上行的帧频,由后端通知前端更改频率,只有移动版才使用
 	int iCameraState;	 // set by agent and camerastate
-	int bShowPersonArea; //鏄�惁鏄剧ず浜哄舰妗�
-	int bShowRecordArea; //鏄�惁鏄剧ず褰曞儚浜哄舰杞�粨
+	int bShowPersonArea; //是否显示人形框
+	int bShowRecordArea; //是否显示录像人形轮廓
 };
 
 
@@ -236,6 +236,10 @@ public:
 	virtual void Handle_SetPickupOutVolume(SpReqAnsContext<PhoneService_SetPickupOutVolume_Req, PhoneService_SetPickupOutVolume_Ans>::Pointer ctx);
 	virtual void Handle_StartVideoRender(SpOnewayCallContext<PhoneService_StartVideoRender_Info>::Pointer ctx);
 	virtual void Handle_StopVideoRender(SpOnewayCallContext<PhoneService_StopVideoRender_Info>::Pointer ctx);
+	virtual void Handle_GetHandfreeInVolume(SpReqAnsContext<PhoneService_GetHandfreeInVolume_Req, PhoneService_GetHandfreeInVolume_Ans>::Pointer ctx);
+	virtual void Handle_SetHandfreeInVolume(SpReqAnsContext<PhoneService_SetHandfreeInVolume_Req, PhoneService_SetHandfreeInVolume_Ans>::Pointer ctx);
+	virtual void Handle_SetPickupInVolume(SpReqAnsContext<PhoneService_SetPickupInVolume_Req, PhoneService_SetPickupInVolume_Ans>::Pointer ctx);
+	virtual void Handle_GetPickupInVolume(SpReqAnsContext<PhoneService_GetPickupInVolume_Req, PhoneService_GetPickupInVolume_Ans>::Pointer ctx);
 
 public:
 	void on_call_state(int state, const char *state_desc, const char *phrase);
@@ -304,6 +308,8 @@ public:
 	void SendAudioDeviceVolumn(int nDevice);
 	ErrorCodeEnum SetHandfreeOutVolume(int iVolume);
 	ErrorCodeEnum SetPickupOutVolume(int iVolume);
+	ErrorCodeEnum SetHandfreeInVolume(int iVolume);
+	ErrorCodeEnum SetPickupInVolume(int iVolume);
 
 	virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext);
 	ErrorCodeEnum __OnClose(ErrorCodeEnum preOperationError);
@@ -335,9 +341,9 @@ private:
 	void HandleAudioDeviceErrorEvent();
 	ErrorCodeEnum AutoCorrectAudioConfig();
 
-	//杞藉叆杩愯�鏃堕厤缃�
+	//载入运行时配置
 	ErrorCodeEnum LoadRestartRunConfig(unsigned int& utime);
-	//淇濆瓨杩愯�鏃�
+	//保存运行时
 	ErrorCodeEnum SaveRestartRunConfig(unsigned int utime);
 #else
 	void InitFreshTimeConfig();
@@ -348,9 +354,9 @@ private:
 #endif //RVC_OS_WIN
 	ErrorCodeEnum AudioDspFlagsUseCentersetting(endpoint_conf_t* conf);
 
-	//杞藉叆杩愯�鏃堕厤缃�
+	//载入运行时配置
 	ErrorCodeEnum LoadAudioRunConfig(int&nHandfreeout,int&nPickupout,int&nHandfreein,int&nPickupin);
-	//淇濆瓨杩愯�鏃�
+	//保存运行时
 	ErrorCodeEnum SaveAudioRunConfig(int nHandfreeout,int nPickupout,int nHandfreein,int nPickupin);
 	// we use root.ini Video section config to decide camera count
 	ErrorCodeEnum DecideCameraCount(int &nCount);
@@ -394,16 +400,16 @@ public:
 	rvc_video_render_t* m_render;
 	int m_iAudioDspUseCenter;
 #endif
-	//int m_nDownDynamicFps;	//褰撳墠瑙嗛�涓嬭�鐨勫抚棰戯紝鐢卞墠绔�€氱煡鍚庣�鏇存敼棰戠巼,鍙�湁绉诲姩鐗堟墠浣跨敤
+	
 	CSystemStaticInfo staticInfo;
-	char m_localip[256];		//鏈�湴ip
+	char m_localip[RVC_MAX_IP_LEN];		//本地ip
 	endpoint_conf_t conf;
 	endpoint_t *m_pEndpoint;
 	int m_iPickupPhoneState;
 	ErrorCodeEnum m_SipErrorCode;
 	DeviceTypeEnum m_eDeviceType;
-	CallingTypeEnum m_nCallType;    //鍛煎彨妯″紡锛�0锛氬彲瑙嗘煖鍙版�甯稿懠鍙�紝1锛歅AD涓诲姩澶栧懠锛�2:PAD琚�姩鍛煎彨锛屾潵婧怭AD,3:PAD琚�姩鍛煎彨锛屾潵婧愭墜鏈虹
-	int m_nSysCallType;//0:鏅�€氭ā寮忥紝1锛歱2p妯″紡
+	CallingTypeEnum m_nCallType;    //呼叫模式,0:可视柜台正常呼叫,1:PAD主动外呼,2:PAD被动呼叫,来源PAD,3:PAD被动呼叫,来源手机端
+	int m_nSysCallType;				//0:普通模式,1:p2p模式
 	volatile stVideoParam m_stVideoParam;
 	volatile int m_bIsSalesRecord;
 	record_echo_location_t m_RecordVideoLocation;

+ 3 - 16
Module/mod_sipphone/unix/endpoint.cpp

@@ -966,7 +966,7 @@ void terminatedcall(endpoint_call_t *call)
 	int st = TERMINATED;
 	g_IsExternalTerminalted = TRUE;
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("g_IsExternalTerminalted = TRUE");
-	LOG_TRACE("terminated! by timeout!");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("terminated! by timeout!");
 	{
 		media_desc_t audio_desc = {0};
 		audio_desc.media_dir = DIR_NONE;
@@ -1458,21 +1458,9 @@ int endpoint_call_start_video(endpoint_call_t* call, endpoint_call_param_t* pcal
 			video_desc.remote_port = call->sdpvieo_desc.remote_rtp_port;
 			video_desc.remote_pt = call->sdpvieo_desc.remote_pt;
 		}
-		//video_desc.param[i++] = pcallparam->local_view_x;
-		//video_desc.param[i++] = pcallparam->local_view_y;
-		//video_desc.param[i++] = pcallparam->local_view_cx;
-		//video_desc.param[i++] = pcallparam->local_view_cy;
-		//video_desc.param[i++] = pcallparam->remote_view_x;
-		//video_desc.param[i++] = pcallparam->remote_view_y;
-		//video_desc.param[i++] = pcallparam->remote_view_cx;
-		//video_desc.param[i++] = pcallparam->remote_view_cy;
+
 		video_desc.param[i++] = pcallparam->remote_width;
 		video_desc.param[i++] = pcallparam->remote_height;
-		////add by clp 20190823
-		//video_desc.param[i++] = pcallparam->local_hwd_move;
-		//video_desc.param[i++] = pcallparam->remote_hwd_move;
-		//video_desc.param[i++] = pcallparam->local_fresh_time;
-		//video_desc.param[i++] = pcallparam->remote_fresh_time;
 		endpoint_media_update_video(call, &video_desc, render_cb);
 
 		char str_local_ip[RVC_MAX_IP_LEN]={0};
@@ -1484,8 +1472,7 @@ int endpoint_call_start_video(endpoint_call_t* call, endpoint_call_param_t* pcal
 		
 		return 0;
 	} 
-	else 
-	{	
+	else {	
 		return Error_Param;
 	}
 } 

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 253 - 191
Module/mod_sipphone/unix/mod_sipphone.cpp


+ 796 - 15
Module/mod_vtmloader/VtmLoaderFSM.cpp

@@ -3,8 +3,11 @@
 #include "VtmLoaderFSM.h"
 #include "VtmLoader_UserCode.h"
 #include "EventCode.h"
+
+
 #if defined(RVC_OS_WIN)
 #include <io.h>
+#include "..\RvcVer.h"
 #else
 #include <unistd.h>
 #include <fcntl.h>
@@ -12,7 +15,23 @@
 #include "RestfulFunc.h"
 #endif //RVC_OS_WIN
 #include "../mod_healthmanager/HealthManager_client_g.h"
+#include "../mod_pinpad/PinPad_client_g.h"
+#include "../mod_cardissuer/CardIssuer_client_g.h"
+#include "../mod_IDCertificate/IDCertificate_client_g.h"
+#include "../mod_HSPScanner/HSPScanner_client_g.h"
+#include "../mod_ContactlessCard/ContactlessCard_client_g.h"
+#include "../mod_FingerPrint/FingerPrint_client_g.h"
+#include "../mod_gpio/Gpio_client_g.h"
+
 using namespace HealthManager;
+using namespace PinPad;
+using namespace CardIssuer;
+using namespace IDCertificate;
+using namespace HSPScanner;
+using namespace ContactlessCard;
+using namespace FingerPrint;
+using namespace Gpio;
+
 using namespace SP::Module::Net;
 
 #define ALLOW_MULTI_NETWORKD_CARDS
@@ -43,13 +62,31 @@ struct callback_entry : public IReleasable
 DWORD tokenUpdate(void* param)
 {
 	CVtmLoaderFSM* t_entity = (CVtmLoaderFSM*)param;
+	DWORD lastUpdateTime = 0; // 获取当前时间(以毫秒为单位)
+
 	while (true)
 	{
+		DWORD currentTime = SP::Module::Comm::RVCGetTickCount(); // 获取当前时间
+		DWORD elapsedTime = currentTime - lastUpdateTime; // 计算与上次更新的时间间隔(毫秒)
+
+		if (elapsedTime >= (t_entity->m_refreshWaitSec * 1000))
+		{
+			// 如果距离上次更新时间已经超过了指定的刷新间隔
 		if (t_entity->refreshToken())
-			Sleep(t_entity->m_refreshWaitSec * 1000);
+			{
+				// 更新成功,更新上次更新时间
+				lastUpdateTime = currentTime;
+			}
 		else
-			Sleep(20 * 1000);
+			{
+				// 更新失败,可以处理一些错误逻辑
 	}
+		}
+
+		// 等待一段时间后再次检查
+		Sleep(20000); // 20秒
+	}
+
 	return 0;
 }
 DWORD checkUrlActive(LPVOID param)
@@ -104,8 +141,14 @@ DWORD checkUrlActive(LPVOID param)
 				, t_upload_TerminalSys_Suc, t_upload_TerminalUser_Suc, t_upload_BussinessSys_Suc, t_upload_BussinessUser_Suc, t_upload_beidou_Suc,
 				t_upload_TerminalSys_Err, t_upload_TerminalUser_Err, t_upload_BussinessSys_Err, t_upload_BussinessUser_Err, t_upload_beidou_Err).GetData());
 	}
+	return 0;
+}
 
-
+DWORD AlarmVersionErr(LPVOID param)
+{
+	CVtmLoaderFSM* cur = (CVtmLoaderFSM*)param;
+	Sleep(5000);//wait mod_alarm start
+	LogWarn(Severity_Middle, Error_Bug, VtmLoader_DETECT_VERSION_ERR, cur->m_verShowMsg.GetData());
 	return 0;
 }
 
@@ -129,6 +172,7 @@ CVtmLoaderFSM::CVtmLoaderFSM()
 	m_iCanIgnoreAddrDetect = 0;
 	m_ullMaxAddrDetectTime = 10*60*1000;//10 minutes
 	m_iDetectInterval = 5000;
+	m_terminalNoFromWeb = m_verShowMsg = "";
 }
 
 CVtmLoaderFSM::~CVtmLoaderFSM()
@@ -170,9 +214,27 @@ unsigned int CVtmLoaderFSM::s0_on_event(FSMEvent* pEvt)
 	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s0_on_event,pEvt:%d,pEvt->param1:%d", pEvt->iEvt, pEvt->param1);
 	switch (pEvt->iEvt)
 	{
-	case Event_NetworkCheck_Passed:
+	case USER_EVT_NetworkCheck_Passed:
 		pEvt->SetHandled();
 		return pEvt->param1;
+	case USER_EVT_CHECK_DEVICE_ENTITY:
+		pEvt->SetHandled();
+		{
+			CheckDeviceEntityEvent* cdee = dynamic_cast<CheckDeviceEntityEvent*>(pEvt);
+			CheckDeviceEntityTask* pTask = new CheckDeviceEntityTask(this);
+			pTask->ctx = cdee->ctx;
+			GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
+		}
+		break;
+	case USER_EVT_SAVE_TERMINALNO:
+		pEvt->SetHandled();
+		{
+			SaveTerminalNoEvent* stne = dynamic_cast<SaveTerminalNoEvent*>(pEvt);
+			SaveTerminalNoTask* pTask = new SaveTerminalNoTask(this);
+			pTask->ctx = stne->ctx;
+			GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
+		}
+		break;
 	default:
 		break;
 	}
@@ -356,7 +418,8 @@ void CVtmLoaderFSM::s2_on_entry()
 	DWORD elapseTimeTemp = dwElapse / 1000;
 	CSimpleStringA xMsg = CSimpleStringA::Format("{\"Decripstion\":\"Enter safeload state.\",\"version\":\"%s\",\"elapseTime\":\"%d\"}", m_sysInfo.InstallVersion.ToString().GetData(), elapseTimeTemp);
 	//LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_Enter_SafeLoad_State, xMsg.GetData());
-
+	if (!VerifyVer())
+		return;
 
 	bool bAsync = false;
 	m_eStage = LOADSTAGE_SAFELOAD;
@@ -738,7 +801,7 @@ unsigned int CVtmLoaderFSM::s4_on_event(FSMEvent* pEvt)
 void CVtmLoaderFSM::s5_on_entry()
 {
 	LOG_FUNCTION();
-	LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, "实体加载失败,启动终止。请排查启动失败实体或重启应用");
+	LogWarn(Severity_High, Error_Unexpect, VtmLoader_EntityLoad_Failed, "实体加载失败,启动终止。请排查启动失败实体或重启应用");
 	NoticeEntityLoadTask* pTask = new NoticeEntityLoadTask(this, Event_VtmLoader_EntityLoad_Failed);
 	GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
 	CSmartPointer<IConfigInfo> spConfigCen, spConfigRun;
@@ -888,6 +951,7 @@ int CVtmLoaderFSM::NetWorkCheckAndGetSetting()
 	}
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F11")("connect to http(s) service ok.");
 	m_ullNetDetectCost = (SP::Module::Comm::RVCGetTickCount() - ullTmpStart) / 1000;//second
+	ToCheckIfInstalling();
 	ullTmpStart = SP::Module::Comm::RVCGetTickCount();
 	//拉取配置并通知提前启动的实体(Chromium)
 	//重试5次,失败则放弃
@@ -907,9 +971,15 @@ int CVtmLoaderFSM::NetWorkCheckAndGetSetting()
 
 	m_ullGetConfigCost = (SP::Module::Comm::RVCGetTickCount() - ullTmpStart) / 1000;//second
 	//加载实体列表
-	EntityLoad();
 
-	return 0;
+	CSimpleStringA csTmpRootIni("");
+	if (!IsRootINIExist(csTmpRootIni))
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)(CSimpleStringA::Format("root.ini不存在(%s),Set TerminalStage N ", csTmpRootIni.GetData()).GetData());
+		GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "N");
+	}
+	return EntityLoad();
+
 }
 int CVtmLoaderFSM::EntityLoad()
 {
@@ -1055,6 +1125,57 @@ int CVtmLoaderFSM::EntityLoad()
 		//m_operatingOpt[arrEntity[0].GetData()].initSn = opNum;
 		//opNum++;
 	}
+
+	//oilyang if install VTM ,just wait for msg to start entity
+	CSimpleStringA csTermStage("");
+	ErrorCodeEnum eErrCode;
+	eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", csTermStage);
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("TerminalStage %s.", csTermStage.GetData());
+	if (csTermStage.Compare("N") == 0)//"N" for installing
+	{
+		//start UpgradeManager
+		CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = m_pEntity->GetFunction().ConvertCase<IEntityFunctionPrivilege>();
+		CSmartPointer<IAsynWaitSp> spWait;
+		eErrCode = pFuncPrivilege->StartEntity("UpgradeManager", NULL, spWait);
+		if (eErrCode == Error_Succeed)
+		{
+			if (spWait != NULL)
+				eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
+		}
+		else
+		{
+			DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("StartEntity UpgradeManager failed(%d).", eErrCode);
+			return -1;
+		}
+		eErrCode = pFuncPrivilege->StartEntity("HealthManager", NULL, spWait);
+		if (eErrCode == Error_Succeed)
+		{
+			if (spWait != NULL)
+				eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
+		}
+		else
+		{
+			DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("StartEntity HealthManager failed(%d).", eErrCode);
+			return -1;
+		}
+		eErrCode = pFuncPrivilege->StartEntity("InteractiveControl", NULL, spWait);
+		if (eErrCode == Error_Succeed)
+		{
+			if (spWait != NULL)
+				eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
+		}
+		else
+		{
+			DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("StartEntity InteractiveControl failed(%d).", eErrCode);
+			return -1;
+		}
+		//wait for all the things have beed done,then save TerminalNo to root.ini
+		while (true)
+		{	
+			m_hSaveTerminalNoVar.Wait();
+			return 1;
+		}
+	}
 	return 0;
 }
 int CVtmLoaderFSM::CheckLoadResult(LoadStage eStage)
@@ -1362,13 +1483,59 @@ bool CVtmLoaderFSM::IsRootINIExist(CSimpleStringA& path)
 		return false;
 	}
 }
+
+bool CVtmLoaderFSM::VerifyVer()
+{
+	CSmartPointer<IConfigInfo> pConfig;
+	GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, pConfig);
+
+	int VerifyVersion = 0;
+	CSimpleStringA activeVer;
+	bool isVerEqual = false;
+	if (Error_Succeed != pConfig->ReadConfigValueInt("Common", "VerifyVersion", VerifyVersion) || Error_Succeed != GetEntityBase()->GetFunction()->GetRunningVersion(activeVer))
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("read [Common]VerifyVersion failed");
+#ifdef RVC_OS_WIN
+	std::string curVer = std::to_string((ULONGLONG)VER_Major) + "." + std::to_string((ULONGLONG)VER_Minor)
+		+ "." + std::to_string((ULONGLONG)VER_Revision) + "." + std::to_string((ULONGLONG)VER_Build);
+#else
+	std::string curVer = std::string(RVC_VERSION_STR);
+#endif
+	if (curVer == activeVer.GetData())
+		isVerEqual = true;
+	
+	if (!isVerEqual)
+	{
+		CSimpleString showMsg = CSimpleString::Format("version not equal, file version:%s, acitve verion:%s", curVer.c_str(), activeVer.GetData());
+		switch (VerifyVersion)
+		{
+		case 0:
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(showMsg.GetData());
+			break;
+		case 1:
+			m_verShowMsg = showMsg;
+			CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&AlarmVersionErr, this, 0, NULL));
+			break;
+		case 2:
+			m_verShowMsg = showMsg;
+			CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&AlarmVersionErr, this, 0, NULL));
+			return false;
+			break;
+		default:
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("VerifyVersion not support param:%d", VerifyVersion);
+			break;
+		}
+	}
+	return true;
+}
+
+
 bool CVtmLoaderFSM::GetConfig()
 {
 	//拉取配置前先检查root.ini文件
 	CSimpleStringA csTmpRootIni("");
-	if (!IsRootINIExist(csTmpRootIni))
+	if (!IsRootINIExist(csTmpRootIni) && m_terminalNoFromWeb.IsNullOrEmpty())
 	{
-		LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("root.ini不存在,请检查(%s)", csTmpRootIni.GetData()));
+		LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("root.ini不存在或安装页面未设置终端号,请检查(%s)", csTmpRootIni.GetData()).GetData());
 		return false;
 	}
 	ErrorCodeEnum eErr = Error_Succeed;
@@ -1394,7 +1561,8 @@ bool CVtmLoaderFSM::GetConfig()
 	CSimpleString CenterConfigTotal = "https://accessproxy-service.paasst.cmbchina.cn/centerconfig";
 #endif
 	LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "开始拉取配置");
-	if (Error_Succeed != (eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->InitCfgUrl(channelId, tokenSecret, CommonLaunchUrl, CenterConfigTotal)))
+	VTMInitParam vtmInitParam(m_terminalNoFromWeb.GetData(), channelId, tokenSecret, CommonLaunchUrl, CenterConfigTotal);
+	if (Error_Succeed != (eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->InitCfgUrl(vtmInitParam)))
 	{
 		LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("拉取配置,初始化配置地址失败:0x%x(%s)", eErr, SpStrError(eErr)).GetData());
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210F13").setResultCode("RTA1F01")("Get config,InitCfgUrl failed.");
@@ -1465,6 +1633,10 @@ bool CVtmLoaderFSM::GetConfig()
 		GetEntityBase()->GetFunction()->GetPrivilegeFunction()->BeginLogSend(default_endpoint, topicSys, topicUser, topicBeidou, topicBussSys, topicBussUser);
 	}
 
+	
+	
+	
+
 	GetEntityBase()->GetFunction()->GetSystemStaticInfo(m_sysInfo);
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("terminalNo:%s, MachineType:%s, MachineVersion:%s, Site:%s, Screen:%d, EnrolGPS:%f.%f, EnrolAddr:%s"
 		, m_sysInfo.strTerminalID.GetData(), m_sysInfo.strMachineType.GetData(), m_sysInfo.MachineVersion.ToString().GetData()
@@ -1521,7 +1693,7 @@ int CVtmLoaderFSM::HttpConnCheck(CSimpleStringA csHttAddr, HttpAddrType eType)
 #endif
 		if (!bCheckOK)
 		{
-			LogWarn(Severity_Middle, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("尝试连接总行服务失败(%s),%d 秒后自动重试(第%d次重试)。请确认终端到总行服务网络是否正常", csHttAddr.GetData(), m_iDetectInterval/1000, httpcheckCount).GetData());
+			LogWarn(Severity_Middle, Error_Unexpect, VtmLoader_ConnectDetect_Failed, CSimpleStringA::Format("尝试连接总行服务失败(%s),%d 秒后自动重试(第%d次重试)。请确认终端到总行服务网络是否正常", csHttAddr.GetData(), m_iDetectInterval/1000, httpcheckCount).GetData());
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210F11").setResultCode("RTA1F06")("connect to http(s) service(%s) failed.", csHttAddr.GetData());
 			m_httpCheckResult[eType] = HttpConnResult_Failed;
 			Sleep(m_iDetectInterval);
@@ -1532,7 +1704,7 @@ int CVtmLoaderFSM::HttpConnCheck(CSimpleStringA csHttAddr, HttpAddrType eType)
 				string tmpDns;
 				GetDns(tmpDns);
 				for (int i = 0; i < netList.GetCount(); i++) {
-					LogWarn(Severity_Middle, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("(%d)interface:%s; ip:%s; mac:%s; %s", i, netList[i].description.c_str()
+					LogWarn(Severity_Low, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("(%d)interface:%s; ip:%s; mac:%s; %s", i, netList[i].description.c_str()
 						, netList[i].ip.c_str(), netList[i].mac.c_str(), tmpDns.c_str()).GetData());
 				}
 			}
@@ -1542,10 +1714,10 @@ int CVtmLoaderFSM::HttpConnCheck(CSimpleStringA csHttAddr, HttpAddrType eType)
 			m_httpCheckResult[eType] = HttpConnResult_OK;
 			if ((SP::Module::Comm::RVCGetTickCount() - beginTick) > 3000)
 			{
-				LogWarn(Severity_Low, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("第(%d)次尝试连接总行服务成功(%s),但是网络偏慢,连接花了(%d)秒,请检查网络!"
+				LogWarn(Severity_Middle, Error_Unexpect, VtmLoader_ConnectDetect_Slow, CSimpleStringA::Format("第(%d)次尝试连接总行服务成功(%s),但是网络偏慢,连接花了(%d)秒,请检查网络!"
 					, httpcheckCount, csHttAddr.GetData(), (SP::Module::Comm::RVCGetTickCount() - beginTick)/1000).GetData());
 			}
-			LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, CSimpleStringA::Format("尝试连接总行服务成功(%s)", csHttAddr.GetData()).GetData());
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210F11")("尝试连接总行服务成功(%s)", csHttAddr.GetData());
 			return 0;
 		}
 	} 
@@ -1584,3 +1756,612 @@ void CVtmLoaderFSM::GetDns(string& dns)
 #endif
 	return;
 }
+void CVtmLoaderFSM::ToCheckIfInstalling()
+{
+	//拉取配置前先检查root.ini文件
+	CSimpleStringA csTmpRootIni("");
+	if (!IsRootINIExist(csTmpRootIni))
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)(CSimpleStringA::Format("root.ini is not exist(%s).maybe we are in installing,to wait for terminalno", csTmpRootIni.GetData()).GetData());
+		//oiltest
+		//OilTestTask* task = new OilTestTask(this);
+		//GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+		while (true)
+		{
+			m_hWaitTerminalNoVar.Wait();
+			break;
+		}
+	}
+}
+void CVtmLoaderFSM::CheckDeviceEntity(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx)
+{
+	if (!RefreshDeviceConfig(ctx))
+	{
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("RefreshDeviceConfig failed.");
+		ctx->Answer(Error_Unexpect);
+	}
+
+	CEntityStaticInfo staticInfo;
+	if (m_pEntity->GetFunction()->GetEntityStaticInfo(ctx->Req.entityName.GetData(), staticInfo) != Error_Succeed)
+	{
+		ctx->Answer(Error_Unexpect, VtmLoader_FailToGetEntityInfo);
+		return;
+	}
+
+	switch (staticInfo.wEntityDevelopID)
+	{
+	case 0x201:
+	case 0x203:
+	case 0x204:
+	case 0x206:
+	case 0x213:
+	case 0x217:
+		CheckDeviceBaseEntity(ctx, staticInfo.wEntityDevelopID);
+		break;
+	case 0x209://Gpio
+	case 0x301://SIPPhone
+		CheckEntityRestartIdle(ctx);
+		break;
+	case 0x208://MediaController
+		CheckVideo(ctx);
+	default:
+		break;
+	}
+	return;
+}
+void CVtmLoaderFSM::SaveTerminalNo(SpReqAnsContext<VtmLoaderService_SaveTerminalNo_Req, VtmLoaderService_SaveTerminalNo_Ans>::Pointer ctx)
+{
+	if (ctx->Req.terminalNo.IsNullOrEmpty())
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("terminalNo is null or empty");
+		ctx->Answer(Error_Param);
+		return;
+	}
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("write terminalNo[%s] to root.ini", ctx->Req.terminalNo.GetData());
+	ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->WriteTerminalNoToRootIni(ctx->Req.terminalNo);
+	ctx->Answer(eErr);
+}
+bool CVtmLoaderFSM::RefreshDeviceConfig(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx)
+{
+	if (ctx->Req.entityName.IsNullOrEmpty() || ctx->Req.paramNum <= 0)
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("param error! nothing to refresh");
+		return false;
+	}
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("entityName:%s,paramNum:%d,module.GetCount:%d",ctx->Req.entityName.GetData(),ctx->Req.paramNum,ctx->Req.module.GetCount());
+	if (ctx->Req.module.GetCount() < ctx->Req.paramNum || ctx->Req.name.GetCount() < ctx->Req.paramNum || ctx->Req.value.GetCount() < ctx->Req.paramNum)
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("param array length error! nothing to refresh");
+		return false;
+	}
+	for (int i = 0; i < ctx->Req.paramNum; i++)
+	{
+		MemCfgParam tmpParam("root", ctx->Req.module[i].GetData(), ctx->Req.name[i].GetData(), ctx->Req.value[i].GetData());
+		GetEntityBase()->GetFunction()->GetPrivilegeFunction()->ModifyMemCfgParam(tmpParam);
+	}
+	return true;
+}
+void CVtmLoaderFSM::CheckDeviceBaseEntity(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx, WORD wEntityID)
+{
+	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = m_pEntity->GetFunction().ConvertCase<IEntityFunctionPrivilege>();
+	CSmartPointer<IAsynWaitSp> spWait;
+	CEntityRunInfo runInfo;
+
+	//to check entity state
+	ErrorCodeEnum eErrCode = m_pEntity->GetFunction()->GetEntityRunInfo(ctx->Req.entityName.GetData(), runInfo);
+	if (eErrCode == Error_Succeed)
+	{
+		if (runInfo.eState != EntityState_NoStart)
+		{
+			eErrCode = pFuncPrivilege->TerminateEntity(ctx->Req.entityName.GetData(), spWait);
+			if (spWait != NULL)
+				eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
+		}
+	}
+	else
+	{
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F24")
+			("GetEntityRunInfo %s failed(%d).", ctx->Req.entityName.GetData(), eErrCode);
+		ctx->Answer(Error_Unexpect, VtmLoader_FailToGetEntityInfo);
+		return;
+	}
+
+	//(re)start entity
+	eErrCode = pFuncPrivilege->StartEntity(ctx->Req.entityName.GetData(), NULL, spWait);
+	if (eErrCode == Error_Succeed)
+	{
+		if (spWait != NULL)
+			eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
+	}
+	else
+	{
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F21")
+			("StartEntity %s failed(%d).", ctx->Req.entityName.GetData(), eErrCode);
+		ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
+		return;
+	}
+		
+	//TODO we should wait for device entity open suc?
+	int count = 0;
+	do
+	{
+		CEntityRunInfo runInfo;
+		eErrCode = m_pEntity->GetFunction()->GetEntityRunInfo(ctx->Req.entityName.GetData(), runInfo);
+		if (eErrCode == Error_Succeed)
+		{
+			if (runInfo.eState == EntityState_Idle)
+				break;
+			else if (runInfo.eState == EntityState_Lost || runInfo.eState == EntityState_Close || runInfo.eState == EntityState_Killed)
+			{
+				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F21")
+					("entity state:%d", runInfo.eState);
+				ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
+				return;
+			}
+			count++;
+			if (count > 3)
+			{
+				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F21")
+					("entity state:%d", runInfo.eState);
+				ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
+				return;
+			}
+			Sleep(1000);
+		}
+		else
+		{
+			DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F21")
+				("GetEntityRunInfo failed:%d", eErrCode);
+			ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
+			return;
+		}
+	} while (true);
+	
+	const int retryGetDevInfoInterval = 5000;//5 seconds
+	const int maxRetryTimes = 16;//16*5 = 80 seconds ,the web timeout setting is 90s
+	CClientSessionBase* pClient;
+	int entityState = 0;
+	switch (wEntityID)
+	{
+	case 0x206: //pinpad
+	{
+		PinPadService_ClientBase* pClient = new PinPadService_ClientBase(this->m_pEntity);
+		if (pClient != NULL)
+		{
+			eErrCode = pClient->Connect();
+			if (eErrCode == Error_Succeed)
+			{
+				int retryTimes = maxRetryTimes;
+				do {
+					PinPadService_GetDevInfo_Req reqQ;
+					PinPadService_GetDevInfo_Ans ansQ;
+					eErrCode = (*pClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(reqQ, ansQ, 5000);
+					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("eErrCode:%d,ansQ.state:%d", eErrCode, ansQ.state);
+					if (eErrCode == Error_Succeed && ansQ.state == 1)// 1 for "DEVICE_STATUS_NORMAL" defined in  DeviceBaseClass.h
+					{
+						DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("return to caller");
+						ctx->Answer(Error_Succeed);
+						break;
+					}
+					Sleep(retryGetDevInfoInterval);
+					retryTimes--;
+				} while (retryTimes > 0);
+				if (retryTimes == 0)
+				{
+					DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")
+						("after have tried x times");
+					ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
+				}
+			}
+			else {
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
+					("connect to %s failed.error code:%d", ctx->Req.entityName.GetData(), eErrCode);
+				ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
+			}
+		}
+		else
+		{
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
+				("new client failed.");
+			ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
+		}
+	}
+		break;
+	case 0x201: //IDCertificate
+	{
+		IDCertService_ClientBase* pClient = new IDCertService_ClientBase(this->m_pEntity);
+		if (pClient != NULL)
+		{
+			eErrCode = pClient->Connect();
+			if (eErrCode == Error_Succeed)
+			{
+				int retryTimes = maxRetryTimes;
+				do {
+					IDCertService_GetDevInfo_Req reqQ;
+					IDCertService_GetDevInfo_Ans ansQ;
+					eErrCode = (*pClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(reqQ, ansQ, 5000);
+					if (eErrCode == Error_Succeed && ansQ.state == 1)// 1 for "DEVICE_STATUS_NORMAL" defined in  DeviceBaseClass.h
+					{
+						DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("return to caller");
+						ctx->Answer(Error_Succeed);
+						break;
+					}
+					Sleep(retryGetDevInfoInterval);
+					retryTimes--;
+				} while (retryTimes > 0);
+				if (retryTimes == 0)
+				{
+					DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")
+						("after have tried x times");
+					ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
+				}
+			}
+			else {
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
+					("connect to %s failed.error code:%d", ctx->Req.entityName.GetData(), eErrCode);
+				ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
+			}
+		}
+		else
+		{
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
+				("new client failed.");
+			ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
+		}
+	}
+		break;
+	case 0x204: //FingerPrint
+	{
+		FingerPrintService_ClientBase* pClient = new FingerPrintService_ClientBase(this->m_pEntity);
+		if (pClient != NULL)
+		{
+			eErrCode = pClient->Connect();
+			if (eErrCode == Error_Succeed)
+			{
+				int retryTimes = maxRetryTimes;
+				do {
+					FingerPrintService_GetDevInfo_Req reqQ;
+					FingerPrintService_GetDevInfo_Ans ansQ;
+					eErrCode = (*pClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(reqQ, ansQ, 5000);
+					if (eErrCode == Error_Succeed && ansQ.state == 1)// 1 for "DEVICE_STATUS_NORMAL" defined in  DeviceBaseClass.h
+					{
+						DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("return to caller");
+						ctx->Answer(Error_Succeed);
+						break;
+					}
+					Sleep(retryGetDevInfoInterval);
+					retryTimes--;
+				} while (retryTimes > 0);
+				if (retryTimes == 0)
+				{
+					DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")
+						("after have tried x times");
+					ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
+				}
+			}
+			else {
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
+					("connect to %s failed.error code:%d", ctx->Req.entityName.GetData(), eErrCode);
+				ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
+			}
+		}
+		else
+		{
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
+				("new client failed.");
+			ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
+		}
+	}
+	break;
+	case 0x203: //CardIssuer
+	{
+		CardIssuerService_ClientBase* pClient = new CardIssuerService_ClientBase(this->m_pEntity);
+		if (pClient != NULL)
+		{
+			eErrCode = pClient->Connect();
+			if (eErrCode == Error_Succeed)
+			{
+				int retryTimes = maxRetryTimes;
+				do {
+					CardIssuerService_GetDevInfo_Req reqQ;
+					CardIssuerService_GetDevInfo_Ans ansQ;
+					eErrCode = (*pClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(reqQ, ansQ, 5000);
+					if (eErrCode == Error_Succeed && ansQ.state == 1)// 1 for "DEVICE_STATUS_NORMAL" defined in  DeviceBaseClass.h
+					{
+						DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("return to caller");
+						ctx->Answer(Error_Succeed);
+						break;
+					}
+					Sleep(retryGetDevInfoInterval);
+					retryTimes--;
+				} while (retryTimes > 0);
+				if (retryTimes == 0)
+				{
+					DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")
+						("after have tried x times");
+					ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
+				}
+			}
+			else {
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
+					("connect to %s failed.error code:%d", ctx->Req.entityName.GetData(), eErrCode);
+				ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
+			}
+		}
+		else
+		{
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
+				("new client failed.");
+			ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
+		}
+	}
+	break;
+	case 0x213: //ContactlessCard
+	{
+		ContactlessCardService_ClientBase* pClient = new ContactlessCardService_ClientBase(this->m_pEntity);
+		if (pClient != NULL)
+		{
+			eErrCode = pClient->Connect();
+			if (eErrCode == Error_Succeed)
+			{
+				int retryTimes = maxRetryTimes;
+				do {
+					ContactlessCardService_GetDevInfo_Req reqQ;
+					ContactlessCardService_GetDevInfo_Ans ansQ;
+					eErrCode = (*pClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(reqQ, ansQ, 5000);
+					if (eErrCode == Error_Succeed && ansQ.state == 1)// 1 for "DEVICE_STATUS_NORMAL" defined in  DeviceBaseClass.h
+					{
+						DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("return to caller");
+						ctx->Answer(Error_Succeed);
+						break;
+					}
+					Sleep(retryGetDevInfoInterval);
+					retryTimes--;
+				} while (retryTimes > 0);
+				if (retryTimes == 0)
+				{
+					DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")
+						("after have tried x times");
+					ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
+				}
+			}
+			else {
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
+					("connect to %s failed.error code:%d", ctx->Req.entityName.GetData(), eErrCode);
+				ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
+			}
+		}
+		else
+		{
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
+				("new client failed.");
+			ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
+		}
+	}
+	break;
+	case 0x217:
+	{
+		HSPScannerService_ClientBase* pClient = new HSPScannerService_ClientBase(this->m_pEntity);
+		if (pClient != NULL)
+		{
+			eErrCode = pClient->Connect();
+			if (eErrCode == Error_Succeed)
+			{
+				int retryTimes = maxRetryTimes;
+				do {
+					HSPScannerService_GetDevInfo_Req reqQ;
+					HSPScannerService_GetDevInfo_Ans ansQ;
+					eErrCode = (*pClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(reqQ, ansQ, 5000);
+					if (eErrCode == Error_Succeed && ansQ.state == 1)// 1 for "DEVICE_STATUS_NORMAL" defined in  DeviceBaseClass.h
+					{
+						DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("return to caller");
+						ctx->Answer(Error_Succeed);
+						break;
+					}
+					Sleep(retryGetDevInfoInterval);
+					retryTimes--;
+				} while (retryTimes > 0);
+				if (retryTimes == 0)
+				{
+					DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F23")
+						("after have tried x times");
+					ctx->Answer(Error_Unexpect, VtmLoader_EntityNotInNormal);
+				}
+			}
+			else {
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
+					("connect to %s failed.error code:%d", ctx->Req.entityName.GetData(), eErrCode);
+				ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
+			}
+		}
+		else
+		{
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_CheckDeviceEntity).setResultCode("RTA1F22")
+				("new client failed.");
+			ctx->Answer(Error_Unexpect, VtmLoader_FailToConnectEntity);
+		}
+	}
+	break;
+	default:
+		break;
+	}
+	return;
+}
+void CVtmLoaderFSM::CheckEntityRestartIdle(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx)
+{
+	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = m_pEntity->GetFunction().ConvertCase<IEntityFunctionPrivilege>();
+	CSmartPointer<IAsynWaitSp> spWait;
+	CEntityRunInfo runInfo;
+
+	//to check entity state
+	ErrorCodeEnum eErrCode = m_pEntity->GetFunction()->GetEntityRunInfo(ctx->Req.entityName.GetData(), runInfo);
+	if (eErrCode == Error_Succeed)
+	{
+		if (runInfo.eState != EntityState_NoStart)
+		{
+			eErrCode = pFuncPrivilege->TerminateEntity(ctx->Req.entityName.GetData(), spWait);
+			if (spWait != NULL)
+				eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
+		}
+	}
+	else
+	{
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("GetEntityRunInfo %s failed(%d).", ctx->Req.entityName.GetData(), eErrCode);
+		ctx->Answer(Error_Unexpect, VtmLoader_FailToGetEntityInfo);
+		return;
+	}
+
+	//(re)start entity
+	eErrCode = pFuncPrivilege->StartEntity(ctx->Req.entityName.GetData(), NULL, spWait);
+	if (eErrCode == Error_Succeed)
+	{
+		if (spWait != NULL)
+			eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
+	}
+	else
+	{
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("StartEntity %s failed(%d).", ctx->Req.entityName.GetData(), eErrCode);
+		ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
+		return;
+	}
+
+	//TODO we should wait for device entity open suc?
+	int count = 0;
+	do
+	{
+		CEntityRunInfo runInfo;
+		eErrCode = m_pEntity->GetFunction()->GetEntityRunInfo(ctx->Req.entityName.GetData(), runInfo);
+		if (eErrCode == Error_Succeed)
+		{
+			if (runInfo.eState == EntityState_Idle)
+			{
+				ctx->Answer(Error_Succeed);
+				return;
+			}
+			else if (runInfo.eState == EntityState_Lost || runInfo.eState == EntityState_Close || runInfo.eState == EntityState_Killed)
+			{
+				ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
+				return;
+			}
+			count++;
+			if (count > 5)
+			{
+				ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
+				return;
+			}
+			Sleep(2000);
+		}
+		else
+		{
+			ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
+			return;
+		}
+	} while (true);
+
+}
+void CVtmLoaderFSM::CheckVideo(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx)
+{
+	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = m_pEntity->GetFunction().ConvertCase<IEntityFunctionPrivilege>();
+	CSmartPointer<IAsynWaitSp> spWait;
+	CEntityRunInfo runInfo;
+
+	//to check entity state
+	ErrorCodeEnum eErrCode = m_pEntity->GetFunction()->GetEntityRunInfo(ctx->Req.entityName.GetData(), runInfo);
+	if (eErrCode == Error_Succeed)
+	{
+		if (runInfo.eState != EntityState_NoStart)
+		{
+			eErrCode = pFuncPrivilege->TerminateEntity(ctx->Req.entityName.GetData(), spWait);
+			if (spWait != NULL)
+				eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
+		}
+	}
+	else
+	{
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("GetEntityRunInfo %s failed(%d).", ctx->Req.entityName.GetData(), eErrCode);
+		ctx->Answer(Error_Unexpect, VtmLoader_FailToGetEntityInfo);
+		return;
+	}
+
+	//(re)start entity
+	eErrCode = pFuncPrivilege->StartEntity(ctx->Req.entityName.GetData(), NULL, spWait);
+	if (eErrCode == Error_Succeed)
+	{
+		if (spWait != NULL)
+			eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
+	}
+	else
+	{
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("StartEntity %s failed(%d).", ctx->Req.entityName.GetData(), eErrCode);
+		ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
+		return;
+	}
+
+	//TODO we should wait for device entity open suc?
+	int count = 0;
+	do
+	{
+		CEntityRunInfo runInfo;
+		eErrCode = m_pEntity->GetFunction()->GetEntityRunInfo(ctx->Req.entityName.GetData(), runInfo);
+		if (eErrCode == Error_Succeed)
+		{
+			if (runInfo.eState == EntityState_Idle)
+			{
+				CSimpleStringA csCameraState("");
+				eErrCode = GetEntityBase()->GetFunction()->GetSysVar("CameraState", csCameraState);
+				if (eErrCode == Error_Succeed && csCameraState.Compare("N") == 0)
+					ctx->Answer(Error_Succeed);
+				else
+					ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
+				return;
+			}
+			else if (runInfo.eState == EntityState_Lost || runInfo.eState == EntityState_Close || runInfo.eState == EntityState_Killed)
+			{
+				ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
+				return;
+			}
+			count++;
+			if (count > 5)
+			{
+				ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
+				return;
+			}
+			Sleep(2000);
+		}
+		else
+		{
+			ctx->Answer(Error_Unexpect, VtmLoader_FailToStartEntity);
+			return;
+		}
+	} while (true);
+}
+void CVtmLoaderFSM::Oiltest()
+{
+	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = m_pEntity->GetFunction().ConvertCase<IEntityFunctionPrivilege>();
+	CSmartPointer<IAsynWaitSp> spWait;
+	//(re)start entity
+	ErrorCodeEnum eErrCode = pFuncPrivilege->StartEntity("HealthManager", NULL, spWait);
+	if (eErrCode == Error_Succeed)
+	{
+		if (spWait != NULL)
+			eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
+	}
+	else
+	{
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("StartEntity %s failed(%d).", "HealthManager", eErrCode);
+		return;
+	}
+
+	DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("StartEntity %s suc.", "HealthManager");
+	return;
+
+
+	SetTerminalNo(NULL);
+	Sleep(11000);
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to save to root.ini");
+	SaveTerminalNo(NULL);
+	m_hSaveTerminalNoVar.Broadcast();
+	
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("continue boot");
+	
+}

+ 87 - 6
Module/mod_vtmloader/VtmLoaderFSM.h

@@ -2,15 +2,21 @@
 #include "SpBase.h"
 #include "SpFSM.h"
 //#include "IHttpFunc.h"
+#include "SpUtility.h"
 #include "CommEntityUtil.hpp"
+#include "VtmLoader_server_g.h"
+using namespace VtmLoader;
+
 enum EvtType
 {
-	Event_NetworkCheck_Passed = EVT_USER + 1,		// 网络检查通过,包括网卡及到总行服务的连通性
+	USER_EVT_NetworkCheck_Passed = EVT_USER + 1,		// 网络检查通过,包括网卡及到总行服务的连通性
 	USER_EVT_COREBOOT_FINISHED,
 	USER_EVT_SAFELOAD_FINISHED,
 	USER_EVT_SAFELOAD_EXMINE_FINISHED,
 	USER_EVT_OPERATING_FINISHED,
 	USER_EVT_ACCESSAUTH_FINISHED,
+	USER_EVT_CHECK_DEVICE_ENTITY,
+	USER_EVT_SAVE_TERMINALNO,
 };
 
 enum LoadStage
@@ -90,7 +96,7 @@ private:
 	END_FSM_STATE()
 
 	BEGIN_FSM_RULE(CVtmLoaderFSM,s0)
-		FSM_RULE_ENTRY(s0, s1, Event_NetworkCheck_Passed,0)
+		FSM_RULE_ENTRY(s0, s1, USER_EVT_NetworkCheck_Passed,0)
 		FSM_RULE_ENTRY(s1, s2, USER_EVT_COREBOOT_FINISHED, 0)
 		FSM_RULE_ENTRY(s1, s2, USER_EVT_COREBOOT_FINISHED, 1)
 		FSM_RULE_ENTRY(s1, s5, USER_EVT_COREBOOT_FINISHED, 2)
@@ -102,8 +108,10 @@ private:
 	END_FSM_RULE()
 public:
 	int m_refreshWaitSec, m_uploadLogInfo_waitSec;
+	CSimpleString m_verShowMsg;
 	int NetWorkCheckAndGetSetting();
 	bool GetConfig();
+	bool VerifyVer();
 	bool DetectHttpActive();
 	bool refreshToken();
 	int EntityLoad();
@@ -112,7 +120,18 @@ public:
 	BOOL DetectNetworkLegality(CSimpleStringA& strInfo);
 	int CheckLoadResult(LoadStage eStage);
 	int HttpConnCheck(CSimpleStringA csHttAddr, HttpAddrType eType);
-	
+	SP::Toolkit::CConditionVarPlus m_hWaitTerminalNoVar,m_hWaiDeviceEntityVar,m_hSaveTerminalNoVar;
+	void SetTerminalNo(SpReqAnsContext<VtmLoaderService_SetTerminalNo_Req, VtmLoaderService_SetTerminalNo_Ans>::Pointer ctx)
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("set terminalNo to [%s]", ctx->Req.terminalNo.GetData());
+		m_terminalNoFromWeb = ctx->Req.terminalNo;
+		ctx->Answer(Error_Succeed);
+		m_hWaitTerminalNoVar.Broadcast();
+	}
+	void NoticeAppReady(SpReqAnsContext<VtmLoaderService_NoticeAppReady_Req, VtmLoaderService_NoticeAppReady_Ans>::Pointer ctx) { }
+	void CheckDeviceEntity(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx);
+	void SaveTerminalNo(SpReqAnsContext<VtmLoaderService_SaveTerminalNo_Req, VtmLoaderService_SaveTerminalNo_Ans>::Pointer ctx);
+	void Oiltest();
 private:
 	void s0_on_entry();
 	void s0_on_exit();
@@ -144,10 +163,12 @@ private:
 	ErrorCodeEnum SubscribeEntitysEvents();
 	void ShowEntityBootFailedAtFront(LPCTSTR lpcszEntityName, ErrorCodeEnum bootFailedResult, bool isBlock = true);
 	void GetDns(string& dns);
+	void ToCheckIfInstalling();
+
 
 private:
 	CSystemStaticInfo m_sysInfo;
-	CSimpleStringA m_strNetworkCheckUrl, m_csErrEntity, m_defaultSystemId;
+	CSimpleStringA m_strNetworkCheckUrl, m_csErrEntity, m_defaultSystemId, m_terminalNoFromWeb;
 	int m_sleepEnterOpMS, m_iCanIgnoreAddrDetect, m_iDetectInterval;
 	ULLINT m_ullMaxAddrDetectTime, m_ullNetCardCost, m_ullNetDetectCost, m_ullGetConfigCost, m_ullEntityLoadStart;
 	int m_httpCheckResult[2];
@@ -159,15 +180,45 @@ private:
 	map<CSimpleStringA, EntityLoadInfo> m_coreBootOpt;
 	map<CSimpleStringA, EntityLoadInfo> m_safeLoadOpt;
 	map<CSimpleStringA, EntityLoadInfo> m_operatingOpt;
-};
 
+	bool RefreshDeviceConfig(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx);
+	void CheckDeviceBaseEntity(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx, WORD wEntityID);
+	void CheckEntityRestartIdle(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx);
+	void CheckVideo(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx);
+	
+	
+};
+class CheckDeviceEntityEvent : public FSMEvent
+{
+public:
+	CheckDeviceEntityEvent() : FSMEvent(USER_EVT_CHECK_DEVICE_ENTITY) {}
+	~CheckDeviceEntityEvent() {}
+	SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx;
+	virtual void OnUnhandled()
+	{
+		if (ctx != NULL)
+			ctx->Answer(Error_InvalidState);
+	}
+};
+class SaveTerminalNoEvent : public FSMEvent
+{
+public:
+	SaveTerminalNoEvent() : FSMEvent(USER_EVT_SAVE_TERMINALNO) {}
+	~SaveTerminalNoEvent() {}
+	SpReqAnsContext<VtmLoaderService_SaveTerminalNo_Req, VtmLoaderService_SaveTerminalNo_Ans>::Pointer ctx;
+	virtual void OnUnhandled()
+	{
+		if (ctx != NULL)
+			ctx->Answer(Error_InvalidState);
+	}
+};
 struct NetWorkCheckAndGetSettingTask : public ITaskSp
 {
 	CVtmLoaderFSM* fsm;
 	NetWorkCheckAndGetSettingTask(CVtmLoaderFSM* f) : fsm(f) {}
 	void Process()
 	{
-		FSMEvent* pEvt = new FSMEvent(Event_NetworkCheck_Passed);
+		FSMEvent* pEvt = new FSMEvent(USER_EVT_NetworkCheck_Passed);
 		pEvt->param1 = fsm->NetWorkCheckAndGetSetting();
 		fsm->PostEventFIFO(pEvt);
 	}
@@ -195,3 +246,33 @@ struct HttpConnCheckTask : public ITaskSp
 		fsm->HttpConnCheck(csHttAddr, eType);
 	}
 };
+
+struct CheckDeviceEntityTask : public ITaskSp
+{
+	CVtmLoaderFSM* fsm;
+	SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx;
+	CheckDeviceEntityTask(CVtmLoaderFSM* f) : fsm(f){}
+	void Process()
+	{
+		fsm->CheckDeviceEntity(ctx);
+	}
+};
+struct SaveTerminalNoTask : public ITaskSp
+{
+	CVtmLoaderFSM* fsm;
+	SpReqAnsContext<VtmLoaderService_SaveTerminalNo_Req, VtmLoaderService_SaveTerminalNo_Ans>::Pointer ctx;
+	SaveTerminalNoTask(CVtmLoaderFSM* f) : fsm(f) {}
+	void Process()
+	{
+		fsm->SaveTerminalNo(ctx);
+	}
+};
+struct OilTestTask : public ITaskSp
+{
+	CVtmLoaderFSM* fsm;
+	OilTestTask(CVtmLoaderFSM* f) : fsm(f) {}
+	void Process()
+	{
+		fsm->Oiltest();
+	}
+};

+ 5 - 0
Module/mod_vtmloader/VtmLoader_UserCode.h

@@ -11,3 +11,8 @@ const int VtmLoader_FailToStartEntity = 0x10f0020a;
 const int VtmLoader_FailToConnectEntity = 0x10f0020b;
 const int VtmLoader_EntityNotInNormal = 0x10f0020c;
 const int VtmLoader_FailToGetEntityInfo = 0x10f0020d;
+const int VtmLoader_FailToTermEntity = 0x10f0020e;
+const int VtmLoader_EntityLoad_Failed = 0x10f0020f;
+const int VtmLoader_ConnectDetect_Failed = 0x10f00210;
+const int VtmLoader_ConnectDetect_Slow = 0x10f00211;
+const int VtmLoader_DETECT_VERSION_ERR = 0x10f00212;

+ 155 - 8
Module/mod_vtmloader/VtmLoader_client_g.h

@@ -59,7 +59,7 @@ public:
 		return Error;
 	}
 
-	ErrorCodeEnum notice(VtmLoaderService_notice_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	ErrorCodeEnum SetTerminalNo(VtmLoaderService_SetTerminalNo_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
 	{
 		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
 		CAutoBuffer Buf = SpObject2Buffer(Req);
@@ -69,14 +69,14 @@ public:
 			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
 			m_context = m_context.upgradeLink();
 		}
-		auto ret = pFunc->AsyncRequest(VtmLoaderService_Method_notice, VtmLoaderService_MethodSignature_notice, Buf, spAsyncWait, m_context, dwTimeout);
+		auto ret = pFunc->AsyncRequest(VtmLoaderService_Method_SetTerminalNo, VtmLoaderService_MethodSignature_SetTerminalNo, Buf, spAsyncWait, m_context, dwTimeout);
 		m_context.clear();
 		return ret;
 	}
-	ErrorCodeEnum notice(VtmLoaderService_notice_Req &Req, VtmLoaderService_notice_Ans &Ans, DWORD dwTimeout)
+	ErrorCodeEnum SetTerminalNo(VtmLoaderService_SetTerminalNo_Req &Req, VtmLoaderService_SetTerminalNo_Ans &Ans, DWORD dwTimeout)
 	{
 		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = notice(Req, spAsyncWait, dwTimeout);
+		ErrorCodeEnum Error = SetTerminalNo(Req, spAsyncWait, dwTimeout);
 		if (Error == Error_Succeed) {
 			bool bEnd = false;
 			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
@@ -84,10 +84,10 @@ public:
 		}
 		return Error;
 	}
-	ErrorCodeEnum notice(VtmLoaderService_notice_Req &Req, VtmLoaderService_notice_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	ErrorCodeEnum SetTerminalNo(VtmLoaderService_SetTerminalNo_Req &Req, VtmLoaderService_SetTerminalNo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
 	{
 		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = notice(Req, spAsyncWait, dwTimeout);
+		ErrorCodeEnum Error = SetTerminalNo(Req, spAsyncWait, dwTimeout);
 		if (Error == Error_Succeed) {
 			bool bEnd = false;
 			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
@@ -95,10 +95,157 @@ public:
 		}
 		return Error;
 	}
-	ErrorCodeEnum notice(VtmLoaderService_notice_Req &Req, VtmLoaderService_notice_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	ErrorCodeEnum SetTerminalNo(VtmLoaderService_SetTerminalNo_Req &Req, VtmLoaderService_SetTerminalNo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
 	{
 		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = notice(Req, spAsyncWait, dwTimeout);
+		ErrorCodeEnum Error = SetTerminalNo(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum NoticeAppReady(VtmLoaderService_NoticeAppReady_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(VtmLoaderService_Method_NoticeAppReady, VtmLoaderService_MethodSignature_NoticeAppReady, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum NoticeAppReady(VtmLoaderService_NoticeAppReady_Req &Req, VtmLoaderService_NoticeAppReady_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = NoticeAppReady(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum NoticeAppReady(VtmLoaderService_NoticeAppReady_Req &Req, VtmLoaderService_NoticeAppReady_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = NoticeAppReady(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum NoticeAppReady(VtmLoaderService_NoticeAppReady_Req &Req, VtmLoaderService_NoticeAppReady_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = NoticeAppReady(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum CheckDeviceEntity(VtmLoaderService_CheckDeviceEntity_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(VtmLoaderService_Method_CheckDeviceEntity, VtmLoaderService_MethodSignature_CheckDeviceEntity, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum CheckDeviceEntity(VtmLoaderService_CheckDeviceEntity_Req &Req, VtmLoaderService_CheckDeviceEntity_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = CheckDeviceEntity(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum CheckDeviceEntity(VtmLoaderService_CheckDeviceEntity_Req &Req, VtmLoaderService_CheckDeviceEntity_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = CheckDeviceEntity(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum CheckDeviceEntity(VtmLoaderService_CheckDeviceEntity_Req &Req, VtmLoaderService_CheckDeviceEntity_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = CheckDeviceEntity(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum SaveTerminalNo(VtmLoaderService_SaveTerminalNo_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(VtmLoaderService_Method_SaveTerminalNo, VtmLoaderService_MethodSignature_SaveTerminalNo, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum SaveTerminalNo(VtmLoaderService_SaveTerminalNo_Req &Req, VtmLoaderService_SaveTerminalNo_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SaveTerminalNo(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum SaveTerminalNo(VtmLoaderService_SaveTerminalNo_Req &Req, VtmLoaderService_SaveTerminalNo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SaveTerminalNo(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum SaveTerminalNo(VtmLoaderService_SaveTerminalNo_Req &Req, VtmLoaderService_SaveTerminalNo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SaveTerminalNo(Req, spAsyncWait, dwTimeout);
 		if (Error == Error_Succeed) {
 			bool bEnd = false;
 			CSimpleString str;

+ 96 - 7
Module/mod_vtmloader/VtmLoader_def_g.h

@@ -12,27 +12,116 @@ namespace VtmLoader {
 // const goes here
 //
 
-#define VtmLoaderService_Method_notice 0
+#define VtmLoaderService_Method_SetTerminalNo 1
+#define VtmLoaderService_Method_NoticeAppReady 2
+#define VtmLoaderService_Method_CheckDeviceEntity 3
+#define VtmLoaderService_Method_SaveTerminalNo 4
+
+#define VtmLoaderService_MethodSignature_SetTerminalNo 616197282
+#define VtmLoaderService_MethodSignature_NoticeAppReady -656753321
+#define VtmLoaderService_MethodSignature_CheckDeviceEntity 217616252
+#define VtmLoaderService_MethodSignature_SaveTerminalNo -1817061577
+
+#define VtmLoaderService_LogCode_SetTerminalNo "QLR040210F01"
+#define VtmLoaderService_LogCode_NoticeAppReady "QLR040210F02"
+#define VtmLoaderService_LogCode_CheckDeviceEntity "QLR040210F03"
+#define VtmLoaderService_LogCode_SaveTerminalNo "QLR040210F04"
+
+struct VtmLoaderService_SetTerminalNo_Req
+{
+	CSimpleStringA terminalNo;
+	CSimpleStringA reqReserved1;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & terminalNo & reqReserved1;
+	}
+
+};
+
+struct VtmLoaderService_SetTerminalNo_Ans
+{
+	CSimpleStringA resReserved1;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & resReserved1;
+	}
+
+};
+
+struct VtmLoaderService_NoticeAppReady_Req
+{
+	CSimpleStringA reqReserved1;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & reqReserved1;
+	}
+
+};
 
-#define VtmLoaderService_MethodSignature_notice -1920069053
+struct VtmLoaderService_NoticeAppReady_Ans
+{
+	CSimpleStringA resReserved1;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & resReserved1;
+	}
+
+};
+
+struct VtmLoaderService_CheckDeviceEntity_Req
+{
+	CSimpleStringA entityName;
+	int paramNum;
+	CAutoArray<CSimpleStringA> module;
+	CAutoArray<CSimpleStringA> name;
+	CAutoArray<CSimpleStringA> value;
+	CSimpleStringA reqReserved1;
+	CSimpleStringA reqReserved2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & entityName & paramNum & module & name & value & reqReserved1 & reqReserved2;
+	}
+
+};
+
+struct VtmLoaderService_CheckDeviceEntity_Ans
+{
+	int devState;
+	CSimpleStringA msg;
+	CSimpleStringA resReserved1;
+	CSimpleStringA resReserved2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & devState & msg & resReserved1 & resReserved2;
+	}
+
+};
 
-struct VtmLoaderService_notice_Req
+struct VtmLoaderService_SaveTerminalNo_Req
 {
-	int stage;
-	CSimpleStringA test1;
+	CSimpleStringA terminalNo;
+	CSimpleStringA reqReserved1;
 
 	void Serialize(SpBuffer &Buf)
 	{
-		auto & buf = Buf & stage & test1;
+		auto & buf = Buf & terminalNo & reqReserved1;
 	}
 
 };
 
-struct VtmLoaderService_notice_Ans
+struct VtmLoaderService_SaveTerminalNo_Ans
 {
+	CSimpleStringA resReserved1;
 
 	void Serialize(SpBuffer &Buf)
 	{
+		auto & buf = Buf & resReserved1;
 	}
 
 };

+ 87 - 9
Module/mod_vtmloader/VtmLoader_server_g.h

@@ -30,8 +30,29 @@ public:
 	{
 		ErrorCodeEnum Error = Error_Succeed;
 		switch (dwMessageID) {
-		case VtmLoaderService_Method_notice:
-			if (dwSignature == VtmLoaderService_MethodSignature_notice) {
+		case VtmLoaderService_Method_SetTerminalNo:
+			if (dwSignature == VtmLoaderService_MethodSignature_SetTerminalNo) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case VtmLoaderService_Method_NoticeAppReady:
+			if (dwSignature == VtmLoaderService_MethodSignature_NoticeAppReady) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case VtmLoaderService_Method_CheckDeviceEntity:
+			if (dwSignature == VtmLoaderService_MethodSignature_CheckDeviceEntity) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case VtmLoaderService_Method_SaveTerminalNo:
+			if (dwSignature == VtmLoaderService_MethodSignature_SaveTerminalNo) {
 				bOverlap = true;
 			} else {
 				Error = Error_MethodSignatureFailed;
@@ -48,8 +69,23 @@ public:
 	{
 		ErrorCodeEnum Error = Error_Succeed;
 		switch (dwMessageID) {
-		case VtmLoaderService_Method_notice:
-			if (dwSignature != VtmLoaderService_MethodSignature_notice) {
+		case VtmLoaderService_Method_SetTerminalNo:
+			if (dwSignature != VtmLoaderService_MethodSignature_SetTerminalNo) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case VtmLoaderService_Method_NoticeAppReady:
+			if (dwSignature != VtmLoaderService_MethodSignature_NoticeAppReady) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case VtmLoaderService_Method_CheckDeviceEntity:
+			if (dwSignature != VtmLoaderService_MethodSignature_CheckDeviceEntity) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case VtmLoaderService_Method_SaveTerminalNo:
+			if (dwSignature != VtmLoaderService_MethodSignature_SaveTerminalNo) {
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
@@ -60,7 +96,22 @@ public:
 		return Error;
 	}
 
-	virtual void Handle_notice(SpReqAnsContext<VtmLoaderService_notice_Req, VtmLoaderService_notice_Ans>::Pointer ctx)
+	virtual void Handle_SetTerminalNo(SpReqAnsContext<VtmLoaderService_SetTerminalNo_Req, VtmLoaderService_SetTerminalNo_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_NoticeAppReady(SpReqAnsContext<VtmLoaderService_NoticeAppReady_Req, VtmLoaderService_NoticeAppReady_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_CheckDeviceEntity(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_SaveTerminalNo(SpReqAnsContext<VtmLoaderService_SaveTerminalNo_Req, VtmLoaderService_SaveTerminalNo_Ans>::Pointer ctx)
 	{
 	/// override by user
 	}
@@ -81,13 +132,40 @@ public:
 			}
 #endif
 			switch (dwMessageID) {
-				case VtmLoaderService_Method_notice:
+				case VtmLoaderService_Method_SetTerminalNo:
+					{
+						SpReqAnsContext<VtmLoaderService_SetTerminalNo_Req,VtmLoaderService_SetTerminalNo_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<VtmLoaderService_SetTerminalNo_Req,VtmLoaderService_SetTerminalNo_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						Handle_SetTerminalNo(ctx);
+					}
+					break;
+				case VtmLoaderService_Method_NoticeAppReady:
+					{
+						SpReqAnsContext<VtmLoaderService_NoticeAppReady_Req,VtmLoaderService_NoticeAppReady_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<VtmLoaderService_NoticeAppReady_Req,VtmLoaderService_NoticeAppReady_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						Handle_NoticeAppReady(ctx);
+					}
+					break;
+				case VtmLoaderService_Method_CheckDeviceEntity:
+					{
+						SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req,VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req,VtmLoaderService_CheckDeviceEntity_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						Handle_CheckDeviceEntity(ctx);
+					}
+					break;
+				case VtmLoaderService_Method_SaveTerminalNo:
 					{
-						SpReqAnsContext<VtmLoaderService_notice_Req,VtmLoaderService_notice_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<VtmLoaderService_notice_Req,VtmLoaderService_notice_Ans>(pTransactionContext));
+						SpReqAnsContext<VtmLoaderService_SaveTerminalNo_Req,VtmLoaderService_SaveTerminalNo_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<VtmLoaderService_SaveTerminalNo_Req,VtmLoaderService_SaveTerminalNo_Ans>(pTransactionContext));
 						SpBuffer2Object(Buf, ctx->Req);
 						pTransactionContext->GetLinkContext(ctx->link);
-						Handle_notice(ctx);
+						Handle_SaveTerminalNo(ctx);
 					}
 					break;
 				default:

+ 16 - 4
Module/mod_vtmloader/mod_vtmloader.cpp

@@ -7,6 +7,22 @@
 #include "tokenDefine.h"
 #include <SpIni.h>
 
+void VtmLoaderServerSession::Handle_SetTerminalNo(SpReqAnsContext<VtmLoaderService_SetTerminalNo_Req, VtmLoaderService_SetTerminalNo_Ans>::Pointer ctx)
+{
+	m_pEntity->SetTerminalNo(ctx);
+}
+void VtmLoaderServerSession::Handle_NoticeAppReady(SpReqAnsContext<VtmLoaderService_NoticeAppReady_Req, VtmLoaderService_NoticeAppReady_Ans>::Pointer ctx)
+{
+	//m_pEntity->NoticeAppReady(ctx);
+}
+void VtmLoaderServerSession::Handle_CheckDeviceEntity(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx)
+{
+	m_pEntity->CheckDeviceEntity(ctx);
+}
+void VtmLoaderServerSession::Handle_SaveTerminalNo(SpReqAnsContext<VtmLoaderService_SaveTerminalNo_Req, VtmLoaderService_SaveTerminalNo_Ans>::Pointer ctx)
+{
+	m_pEntity->SaveTerminalNo(ctx);
+}
 
 void CVtmLoaderEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext) 
 {
@@ -22,10 +38,6 @@ void CVtmLoaderEntity::OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer
 	pTransactionContext->SendAnswer(Error_Succeed); 
 }	
 
-CServerSessionBase *CVtmLoaderEntity::OnNewSession(const char* /*pszRemoteEntityName*/, const char * /*pszParam*/)
-{
-	return new CVtmLoaderSession(this);
-}
 
 void CVtmLoaderEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
 	const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, 

+ 33 - 13
Module/mod_vtmloader/mod_vtmloader.h

@@ -5,8 +5,21 @@
 //#include "IHttpFunc.h"
 #include "VtmLoader_server_g.h"
 using namespace VtmLoader;
+class CVtmLoaderEntity;
+
+class VtmLoaderServerSession : public VtmLoaderService_ServerSessionBase
+{
+public:
+	VtmLoaderServerSession(CVtmLoaderEntity* pEntity) :m_pEntity(pEntity) {}
+	virtual ~VtmLoaderServerSession() {}
+	virtual void Handle_SetTerminalNo(SpReqAnsContext<VtmLoaderService_SetTerminalNo_Req, VtmLoaderService_SetTerminalNo_Ans>::Pointer ctx);
+	virtual void Handle_NoticeAppReady(SpReqAnsContext<VtmLoaderService_NoticeAppReady_Req, VtmLoaderService_NoticeAppReady_Ans>::Pointer ctx);
+	virtual void Handle_CheckDeviceEntity(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx);
+	virtual void Handle_SaveTerminalNo(SpReqAnsContext<VtmLoaderService_SaveTerminalNo_Req, VtmLoaderService_SaveTerminalNo_Ans>::Pointer ctx);
+private:
+	CVtmLoaderEntity* m_pEntity;
+};
 
-// 
 class CVtmLoaderEntity : public CEntityBase, public ILogListener
 {
 public:
@@ -21,7 +34,10 @@ public:
 
 	virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext);
 	virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext) ;
-	virtual CServerSessionBase *OnNewSession(const char* /*pszRemoteEntityName*/, const char * /*pszParam*/);
+	virtual CServerSessionBase *OnNewSession(const char* /*pszRemoteEntityName*/, const char * /*pszParam*/)
+	{
+		return new VtmLoaderServerSession(this);
+	}
 	virtual void OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
 		const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, 
 		const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext &pLinkInfo);
@@ -29,7 +45,21 @@ public:
 	ErrorCodeEnum UnsubscribeEntitysEvents();
 	CSimpleStringA GetCurMaintainer(){ return m_strUserID;}
 
-
+	void SetTerminalNo(SpReqAnsContext<VtmLoaderService_SetTerminalNo_Req, VtmLoaderService_SetTerminalNo_Ans>::Pointer ctx) { m_FSM.SetTerminalNo(ctx); }
+	//void NoticeAppReady(SpReqAnsContext<VtmLoaderService_NoticeAppReady_Req, VtmLoaderService_NoticeAppReady_Ans>::Pointer ctx);
+	void CheckDeviceEntity(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx)
+	{
+		CheckDeviceEntityEvent* pEvt = new CheckDeviceEntityEvent();
+		pEvt->ctx = ctx;
+		m_FSM.PostEventFIFO(pEvt);
+	}
+	void SaveTerminalNo(SpReqAnsContext<VtmLoaderService_SaveTerminalNo_Req, VtmLoaderService_SaveTerminalNo_Ans>::Pointer ctx)
+	{
+		SaveTerminalNoEvent* pEvt = new SaveTerminalNoEvent();
+		pEvt->ctx = ctx;
+		m_FSM.PostEventFIFO(pEvt);
+	}
+	
 protected:
 	//GUITask m_task;
 	CVtmLoaderFSM m_FSM;
@@ -51,13 +81,3 @@ public:
 	//IHttpFunc* m_pHttpFunc;
 };
 
-class CVtmLoaderSession : public VtmLoaderService_ServerSessionBase
-{
-public:
-	CVtmLoaderSession(CVtmLoaderEntity *pEntity) : m_pEntity(pEntity) {}
-	virtual ~CVtmLoaderSession() {}
-	
-private:
-	CVtmLoaderEntity *m_pEntity;
-};
-

+ 4 - 0
Module/mod_vtmloader/tokenDefine.h

@@ -1,7 +1,11 @@
 #pragma once
 #include "IHttpFunc.h"
 #include <string>
+#if defined(RVC_OS_WIN)
+#include "json.h"
+#else
 #include "json/json.h"
+#endif
 #include "SpSecureClient.h"
 
 #define TOKEN_GETURL_ERR 0x10A00001

+ 50 - 3
Module/mod_vtmloader/vtmloader.xml

@@ -1,11 +1,58 @@
 <?xml version="1.0" encoding="gb2312"?>
 <entity name="VtmLoader">
   <class name="VtmLoaderService" overlap="true" exclusive="false">
-	<twoway name="notice" overlap="true">
+	<!--终端号检查通过后,通知终端应用-->
+	<twoway name="SetTerminalNo" overlap="true" method_id="1">
       <req>
-        <param name="stage" type="int"/>
-		<param name="test1" type="string"/>
+	  <!--terminalNo:终端号-->
+		<param name="terminalNo" type="string"/>
+		<param name="reqReserved1" type="string"/>
       </req>
+	  <res>
+		<param name="resReserved1" type="string"/>
+	  </res>
+    </twoway>
+	<!--暂未使用-->
+	<twoway name="NoticeAppReady" overlap="true" method_id="2">
+      <req>
+		<param name="reqReserved1" type="string"/>
+      </req>
+	  <res>
+		<param name="resReserved1" type="string"/>
+	  </res>
+    </twoway>
+	<!--硬件实体验证-->
+	<twoway name="CheckDeviceEntity" overlap="true" method_id="3">
+      <req>
+		<!--实体名称,与终端应用的GetEntityName相同-->
+        <param name="entityName" type="string"/>
+		<!--需要刷新的配置数量-->
+		<param name="paramNum" type="int"/>
+		<!--配置模块名-->
+		<param name="module" type="array_string"/>
+		<!--配置项名称-->
+		<param name="name" type="array_string"/>
+		<!--配置值-->
+		<param name="value" type="array_string"/>
+        <param name="reqReserved1" type="string" />
+        <param name="reqReserved2" type="string" />		
+      </req>
+	  <res>
+        <param name="devState" type="int" />
+        <param name="msg" type="string" />
+        <param name="resReserved1" type="string" />
+        <param name="resReserved2" type="string" />
+	  </res>	  
+    </twoway>
+	<twoway name="SaveTerminalNo" overlap="true" method_id="4">
+      <req>
+	  <!--terminalNo:终端号-->
+        <param name="terminalNo" type="string"/>
+		<param name="reqReserved1" type="string" />
+      </req>
+	  <res>
+		<param name="resReserved1" type="string"/>
+	  </res>	  
     </twoway>
   </class>
 </entity>

+ 41 - 9
Other/libRestfulFunc/RestfulFunc.h

@@ -32,6 +32,9 @@
 * -2:超时
 * -3:地址不符合规范
 */
+
+typedef void (*restFul_GetTokenCallBack)(char *, char *);
+
 RESTFULFUNC_API int HttpProbe(const std::string& url, std::string& out_msg, uint32_t wait_max_secs = (uint32_t)-1);
 
 /*!
@@ -118,20 +121,23 @@ struct HttpClientRequestConfig
      * @param[out] 
      * @return : 
      */
-    HttpClientRequestConfig(const std::string& uri) 
+    HttpClientRequestConfig(const std::string& uri, restFul_GetTokenCallBack t_getToken)
         :mMethod(HttpRequestMethod::GET), mUri(uri), mToValidCert(false)
-        , mBodyContent(""), mContentType(""), mHeaderAcceptType("application/json"), mTimeoutSecs(0)
+        , mBodyContent(""), mContentType(""), mHeaderAcceptType("application/json"), mTimeoutSecs(0), m_withToken(true)
     {
+        InitGetToken(t_getToken);
     }
-    HttpClientRequestConfig(HttpRequestMethod method)
-        : mMethod(method), mToValidCert(false), mBodyContent(""), mHeaderAcceptType("application/json")
+    HttpClientRequestConfig(HttpRequestMethod method, restFul_GetTokenCallBack t_getToken)
+        : mMethod(method), mToValidCert(false), mBodyContent(""), mHeaderAcceptType("application/json"), m_withToken(true)
         , mContentType(""), mTimeoutSecs(0)
     {
+        InitGetToken(t_getToken);
     }
-    HttpClientRequestConfig(HttpRequestMethod method, const std::string& uri) 
-        :mMethod(method), mUri(uri), mToValidCert(false), mBodyContent("")
+    HttpClientRequestConfig(HttpRequestMethod method, const std::string& uri, restFul_GetTokenCallBack t_getToken)
+        :mMethod(method), mUri(uri), mToValidCert(false), mBodyContent(""), m_withToken(true)
         , mContentType(""), mHeaderAcceptType("application/json"), mTimeoutSecs(0)
     {
+        InitGetToken(t_getToken);
     }
 
     void SetRequestType(HttpRequestMethod method) { mMethod = method; }
@@ -175,6 +181,22 @@ struct HttpClientRequestConfig
     virtual void PreDo() {}
     virtual void PostDo() {}
 
+    bool getToken(std::string & t_channelId, std::string &t_token) const {
+        char channelId[256] = "";
+        char token[256] = "";
+        if (m_withToken && g_tokenCall != NULL)
+        {
+            g_tokenCall(channelId, token);
+            if (std::string(channelId).length() > 0 && std::string(token).length() > 0)
+            {
+                t_channelId = channelId;
+                t_token = token;
+                return true;
+            }
+        }
+        return false;
+    }
+
 private:
 
     HttpRequestMethod mMethod;
@@ -186,20 +208,30 @@ private:
 
     std::map<std::string, std::string> mQueryPairs;
 
+    bool m_withToken;
     bool mToValidCert;
     uint32_t mTimeoutSecs;
+    restFul_GetTokenCallBack g_tokenCall;
+    void InitGetToken(restFul_GetTokenCallBack t_getToken) {
+        if (t_getToken)
+            g_tokenCall = t_getToken;
+        else
+            g_tokenCall = nullptr;
+
+        
+    };
 };
 
 struct HttpClientPostTypeRequest : public HttpClientRequestConfig
 {
     HttpClientPostTypeRequest(const std::string& uri)
-        :HttpClientRequestConfig(HttpRequestMethod::POST, uri) {}
+        :HttpClientRequestConfig(HttpRequestMethod::POST, uri, nullptr) {}
 };
 
 struct HttpClientUploadRequest : public HttpClientRequestConfig
 {
     HttpClientUploadRequest(const std::string& uri)
-        :HttpClientRequestConfig(HttpRequestMethod::DOWNLOAD, uri)
+        :HttpClientRequestConfig(HttpRequestMethod::DOWNLOAD, uri, nullptr)
     {
     }
 
@@ -236,7 +268,7 @@ private:
 struct HttpClientDownloadRequest : public HttpClientRequestConfig
 {
     HttpClientDownloadRequest(const std::string& uri) 
-        :HttpClientRequestConfig(HttpRequestMethod::DOWNLOAD, uri) {
+        :HttpClientRequestConfig(HttpRequestMethod::DOWNLOAD, uri, nullptr) {
         SetAcceptType("*/*");
     }
 };

+ 7 - 0
Other/libRestfulFunc/RestfulFuncImpl.cpp

@@ -181,6 +181,13 @@ void RestfulClient::Do(const HttpClientRequestConfig* const pRequestConfig, Http
 	request.set_request_uri(urib.to_string());
 	request.headers().add(header_names::accept, STRW(pRequestConfig->GetAcceptType()));
 
+	std::string token, channelId;
+	if (pRequestConfig->getToken(channelId, token))
+	{
+		request.headers().add("channelId", channelId);
+		request.headers().add("token", token);
+	}
+
 	if (pRequestConfig->GetRequestType() != HttpRequestMethod::GET) {
 		request.set_body(STRW(pRequestConfig->GetBodyContent()), STRW(pRequestConfig->GetContentType()));
 	}

+ 3 - 3
Other/libRestfulFunc/test/testNormlReqAns.cpp

@@ -4,7 +4,7 @@
 
 TEST_CASE("test api manage", "[restful]")
 {
-    HttpClientRequestConfig config("https://rvcgateway.paasst.cmbchina.cn/terminal");
+    HttpClientRequestConfig config("https://rvcgateway.paasst.cmbchina.cn/terminal", NULL);
     HttpClientResponseResult result;
     config.SetChildUri("/api/manage/regist/7555980103");
     RestfulClient client = RestfulClient::getInstance();
@@ -15,7 +15,7 @@ TEST_CASE("test api manage", "[restful]")
 
 TEST_CASE("test  api stage get api", "[restful]")
 {
-    HttpClientRequestConfig config("https://rvcterminal.paasst.cmbchina.cn");
+    HttpClientRequestConfig config("https://rvcterminal.paasst.cmbchina.cn", NULL);
     HttpClientResponseResult result;
     config.SetChildUri("/api/stage");
     config.AppendQuery("terminalNo", "7555980001");
@@ -27,7 +27,7 @@ TEST_CASE("test  api stage get api", "[restful]")
 
 TEST_CASE("test  api stage post api", "[restful]")
 {
-    HttpClientRequestConfig config("https://rvcterminal.paasst.cmbchina.cn");
+    HttpClientRequestConfig config("https://rvcterminal.paasst.cmbchina.cn", NULL);
     config.SetRequestType(HttpRequestMethod::POST);
     config.SetChildUri("/api/stage");
     config.SetJsonBody("{\"terminalNo\":\"7555980001\", \"errEntityList\":\"566666\"}");

+ 1 - 1
Other/liblog4rvcother/log4cplus_helper.cpp

@@ -346,7 +346,7 @@ namespace cmb {
 	{
 #if !defined(NDEBUG)
 		if(_initialized) {
-			LOG4PLUS_LOG(INFO, get_logger(), text.c_str());
+			LOG4PLUS_LOG(DEBUG, get_logger(), text.c_str());
 			loglink(LOG_LEVEL_DEBUG, text);
 		}
 #endif //!defined(NDEBUG)

+ 6 - 5
Other/unix/libvideorecord/libvideorecord_impl.cpp

@@ -761,7 +761,7 @@ bool libvideorecord_impl::GetRecordVideoFrameSize()
 			ts.tv_sec += (unsec / 1000000000);
 			ts.tv_nsec = (unsec % 1000000000);
 			if (0 != sem_timedwait(&m_semt, &ts) && (ETIMEDOUT == errno)) {
-				if (0 == i % 500) {
+				if (0 != i && 0 == i % 500) {
 					m_pHostApi->Debug(RECORD_LOG_ERROR, "GetDestTypeVideoFrameSize failed %d times.", i);
 				}
 			}
@@ -794,19 +794,20 @@ bool libvideorecord_impl::GetRecordAudioFrameSize()
 			ts.tv_sec += (unsec / 1000000000);
 			ts.tv_nsec = (unsec % 1000000000);
 			if (0 != sem_timedwait(&m_semt, &ts) && (ETIMEDOUT == errno)) {
-			
+				if (0 != i && 0 == i % 500) {
+					m_pHostApi->Debug(RECORD_LOG_ERROR, "get local audio frame size failed %d times.", i);
+				}
 			}
-
-			m_pHostApi->Debug(RECORD_LOG_DEBUG, "get local audio frame size failed %d times.", i);
 		}
 		else {
+			m_pHostApi->Debug(RECORD_LOG_INFO, "get audio frame size failed time is %d.", i);
 			bRet = true;
 			break;
 		}
 	}
 
 	if (bRet) {
-		m_pHostApi->Debug(RECORD_LOG_DEBUG, "Local Audio Frame Size = %d", m_iAudioFrameSize);
+		m_pHostApi->Debug(RECORD_LOG_DEBUG, "local audio frame size = %d.", m_iAudioFrameSize);
 	}
 
 	return bRet;

+ 2 - 9
Tool/guardian/guardian.cpp

@@ -747,7 +747,6 @@ void CheckDoWork(int sig)
 	cout << "CheckDoWork" << endl;
 	if (SIGALRM == sig)
 	{
-		LOG4VTM(INFO, "to check value(linux)");
 		EnterCriticalSectionRVC(g_cs);
 
 		if (!g_bFrameQuit)
@@ -818,14 +817,11 @@ void* DoNetControlLinux(void* arg)
 void DataProcessLinux(int socket,const char*data)
 {
 	GuardianInfo* pInfo = (GuardianInfo*)data;
-	LOG4VTM(INFO, "eType:" << pInfo->eType);
-	LOG4VTM(INFO, "dwParam1:" << pInfo->dwParam1);
 	LOG4VTM(DEBUG, "eType:" << pInfo->eType << ",p1:" << pInfo->dwParam1 << ",p2:" << pInfo->dwParam2 << ",dwSize:" << pInfo->dwSize);
 	switch (pInfo->eType)
 	{
 	case GdOpShakeHand:
 	{
-		LOG4VTM(INFO, "Shake hand.");
 		if (!g_bFrameOnline)
 		{
 			g_bFrameOnline = true;
@@ -973,18 +969,16 @@ void DataProcessLinux(int socket,const char*data)
 	default:
 		break;
 	}
-	LOG4VTM(INFO, "quit of DataProcessLinux");
+	LOG4VTM(DEBUG, "quit of DataProcessLinux");
 }
 #else
 void DataProcess(LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIoData)
 {
 	GuardianInfo* pInfo = (GuardianInfo*)pPerIoData->Buffer;
-	LOG4VTM(INFO, "eType:" << pInfo->eType);
 	switch(pInfo->eType)
 	{
 	case GdOpShakeHand:
 		{
-			LOG4VTM(INFO, "Shake hand.");
 			if (!g_bFrameOnline)
 			{
 				g_bFrameOnline = true;
@@ -1181,7 +1175,6 @@ DWORD WINAPI DoWork(void* pData)
 	while(1)
 	{
 		WaitForSingleObject(hTimer,INFINITE);
-		LOG4VTM(INFO, "to check value");
 		EnterCriticalSectionRVC(g_cs);
 
 		if (!g_bFrameQuit)
@@ -1461,7 +1454,7 @@ void AcceptReqRVC()
 				ev.data.fd = sockfd;
 				ev.events = EPOLLOUT | EPOLLET;
 				epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);
-				LOG4VTM(INFO, "out DataProcessLinux");
+				LOG4VTM(DEBUG, "out DataProcessLinux");
 
 			}
 			else if (events[i].events & EPOLLOUT)

+ 7 - 0
addin/cfg/UserCodeToMsgTip.ini

@@ -1,4 +1,10 @@
 [UserCodeToMsgTip]
+0x10F0020A=[RTA1F21] 打开实体失败,请联系总行开发人员进行排查
+0x10F0020B=[RTA1F22] 连接实体失败,请联系总行开发人员进行排查
+0x10F0020C=[RTA1F23] [HW] 设备打开失败,请检查配置是否正确,模块是否正常
+0x10F0020D=[RTA1F24] 取实体状态失败,请联系总行开发人员进行排查
+0x10F0020E=[RTA1F25] 终止实体失败,请联系总行开发人员进行排查
+
 0x2010020D=[RTA2101] [HWC] 身份证模块未成功连接,请联系厂商排查
 0x20100215=[RTA2102] [HWC] 身份证模块未成功连接,请确认是否已连接蓝牙多合一
 0x20100216=[RTA2103] [HW] 蓝牙多合一断开,请确认蓝牙多合一连接正常后重试
@@ -15,6 +21,7 @@
 0x20200239=[RTA2208] [HW] 设备离线,请检查设备是否已经连上
 0x2020023A=[RTA2209] [HW] 设备离线,请检查设备是否已经连上
 
+0x2030022E=[RTA2300] [HW] 读/发卡器故障,请稍后重试或联系厂商排查
 0x2030000D=[RTA2302] [HW] 读卡失败,请重试或联系厂商排查
 0x2030002E=[RTA2303] [HW] 卡片从读卡器移回到卡槽失败,请联系卡库厂商排查
 0x2030002F=[RTA2304] [HW] 从卡槽移动卡片到读卡器失败,请联系卡库厂商排查

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно