Explorar o código

!10523 归并st2分支到hash链路分支
Merge pull request !10523 from 80174520/ST2

刘文涛80174520 hai 10 meses
pai
achega
3d79ceb024
Modificáronse 69 ficheiros con 2896 adicións e 963 borrados
  1. 2 2
      DevAdapter/CMakeLists.txt
  2. 6 5
      DevAdapter/liblog4vendor/log4upload.cpp
  3. 5 5
      DevAdapter/self/dep/liblog4vendor/liblog4vendor/log4upload.cpp
  4. 1 0
      DevAdapter/self/dep/liblog4vendor/liblog4vendor/log4upload.h
  5. 4 1
      Framework/Common/SpBase.h
  6. 4 4
      Framework/Common/SpDefine.h
  7. 1 0
      Framework/Common/def.h
  8. 115 0
      Framework/RvcLogSdk/log_db.cpp
  9. 2 4
      Framework/RvcLogSdk/log_persistent_manager.c
  10. 8 0
      Framework/RvcLogSdk/log_producer_config.c
  11. 7 2
      Framework/RvcLogSdk/log_producer_config.h
  12. 3 2
      Framework/RvcLogSdk/log_producer_manager.c
  13. 5 3
      Framework/RvcLogSdk/log_producer_sender.c
  14. 69 7
      Framework/spbase/SpEntityPrivilege.cpp
  15. 2 1
      Framework/spbase/SpEntityPrivilege.h
  16. 46 9
      Framework/spbase/sp_cfg.cpp
  17. 6 0
      Framework/spbase/sp_cfg.h
  18. 73 10
      Framework/spbase/sp_logwithlink.cpp
  19. 4 2
      Framework/spbase/sp_tbs_unix.cpp
  20. 8 5
      Framework/spbase/sp_tbs_win.cpp
  21. 1 0
      Framework/spshell/app.cpp
  22. 71 0
      Framework/spshell/svc.cpp
  23. 1 0
      Framework/spshell/svc.h
  24. 1 1
      Module/mod_ResourceWatcher/ResourceWatcherFSM.cpp
  25. 3 15
      Module/mod_UpgradeMgr/UpgradeTaskFSM.cpp
  26. 5 0
      Module/mod_cardissuerstore/CardIssuerFSM.cpp
  27. 116 71
      Module/mod_chromium/CModTools.cpp
  28. 4 8
      Module/mod_chromium/CModTools.h
  29. 95 34
      Module/mod_chromium/CWSCodec.cpp
  30. 64 13
      Module/mod_chromium/CWSCodec.h
  31. 231 129
      Module/mod_chromium/CWebsocketServer.cpp
  32. 5 11
      Module/mod_chromium/CWebsocketServer.h
  33. 124 27
      Module/mod_chromium/EntitySessionManager.cpp
  34. 12 9
      Module/mod_chromium/EntitySessionManager.h
  35. 6 0
      Module/mod_chromium/MessageType.h
  36. 10 1
      Module/mod_chromium/ReadMe.md
  37. 686 29
      Module/mod_chromium/baseEx.cpp
  38. 404 11
      Module/mod_chromium/baseEx.h
  39. 169 137
      Module/mod_chromium/mod_chromium.cpp
  40. 7 56
      Module/mod_chromium/mod_chromium.h
  41. 30 44
      Module/mod_counterconnector/ConnectorFSM.cpp
  42. 0 22
      Module/mod_counterconnector/ConnectorFSM.h
  43. 0 2
      Module/mod_counterconnector/mod_counterconnector.cpp
  44. 1 0
      Module/mod_localmediaplay/mod_localmediaplay.cpp
  45. 1 1
      Module/mod_mediacontroller/CMakeLists.txt
  46. 38 12
      Module/mod_mediacontroller/capture.cpp
  47. 5 0
      Module/mod_mediacontroller/capture.h
  48. 42 28
      Module/mod_mediacontroller/mod_mediacontroller.cpp
  49. 1 0
      Module/mod_mediacontroller/mod_mediacontroller.h
  50. 1 0
      Module/mod_sipphone/CMakeLists.txt
  51. 3 7
      Module/mod_sipphone/Event.h
  52. 102 170
      Module/mod_sipphone/audio_session.cpp
  53. 1 0
      Module/mod_sipphone/audio_session.h
  54. 22 5
      Module/mod_sipphone/endpoint.cpp
  55. 63 11
      Module/mod_sipphone/mod_sipphone.cpp
  56. 9 1
      Module/mod_sipphone/mod_sipphone.h
  57. 7 4
      Module/mod_vtmloader/VtmLoaderFSM.cpp
  58. 21 1
      Other/libaudiomgr/iaudiomgrinterface.h
  59. 15 2
      Other/libaudiomgr/linux/libaudiomgr_linux.cpp
  60. 1 19
      Other/libaudiomgr/linux/libaudiomgr_linux.h
  61. 4 0
      Other/libaudiomgr/win/libaudiomgr_win.cpp
  62. 1 8
      Other/libaudiomgr/win/libaudiomgr_win.h
  63. 5 2
      Other/libfilecryption/fileanalysis.cpp
  64. 6 5
      Other/liblog4rvcother/log4upload.cpp
  65. 15 1
      Other/unix/libmediadeviceinfo/imediadeviceinfo.h
  66. 64 2
      Other/unix/libmediadeviceinfo/linux/videodevice_info_linux.cpp
  67. 2 2
      Other/win/libmediadeviceinfo/linux/videodevice_info_linux.cpp
  68. 44 0
      Other/win/libvideoframework/videocap.cpp
  69. 6 0
      Other/win/libvideoframework/videocap.h

+ 2 - 2
DevAdapter/CMakeLists.txt

@@ -291,8 +291,8 @@ if(DEVADAPTER_USING_CONAN)
     endif(MSVC)
 
     if(MSVC)
-        #合入目前全量包中的DEP文件内容
-        conan_cmake_run(REQUIRES VendorDLL/7.6.0@LR04.02_VendorLib/testing
+        #CardLibDB_CMB.db3
+        conan_cmake_run(REQUIRES VendorDLL/2024.11.1401@LR04.02_VendorLib/testing
             BASIC_SETUP CMAKE_TARGETS)
         set(SELF_CONAN_LIB_NAME self/2024.1025.01@LR04.02_VendorLib/testing)
         add_subdirectory(self)

+ 6 - 5
DevAdapter/liblog4vendor/log4upload.cpp

@@ -1,5 +1,6 @@
 #include "log4upload.h"
 #include "log4vendor.h"
+#include "SpDefine.h"
 #include <algorithm>
 #include <string>
 #include <cctype>
@@ -193,8 +194,8 @@ bool upload_helper::initialize(const cmb::log_init_config& cfg)
         pinst_log_producer_config_set_send_thread_count(config, 1);
         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");
+        pinst_log_producer_config_set_skyeye_cmptId(config, (char*)SpDefine::cmptId);
+        pinst_log_producer_config_set_skyeye_cmptname(config, (char*)SpDefine::CmptName);
         pinst_log_producer_config_set_skyeye_version(config, (char*)"1.0");
         pinst_log_producer_config_set_persistent(config, 1);
 
@@ -215,11 +216,11 @@ bool upload_helper::initialize(const cmb::log_init_config& cfg)
 #endif
 
         //新加统一日志配置
-        pinst_log_producer_config_set_united_appname(config, (char*)"LR04");
+        pinst_log_producer_config_set_united_appname(config, (char*)SpDefine::cmptId);
         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");
+        pinst_log_producer_config_set_united_deployUnitId(config, (char*)SpDefine::deployUnitId);
+        pinst_log_producer_config_set_united_serviceUnitId(config, (char*)SpDefine::serviceUnitId);
 
         _client = pinst_create_log_producer_client(config, NULL, NULL);
         res = (_client != nullptr);

+ 5 - 5
DevAdapter/self/dep/liblog4vendor/liblog4vendor/log4upload.cpp

@@ -193,8 +193,8 @@ bool upload_helper::initialize(const cmb::log_init_config& cfg)
         pinst_log_producer_config_set_send_thread_count(config, 2);
         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");
+        pinst_log_producer_config_set_skyeye_cmptId(config, (char*)SpDefine::cmptId);
+        pinst_log_producer_config_set_skyeye_cmptname(config, (char*)SpDefine::CmptName);
         pinst_log_producer_config_set_skyeye_version(config, (char*)"1.0");
         pinst_log_producer_config_set_persistent(config, 1);
 
@@ -215,11 +215,11 @@ bool upload_helper::initialize(const cmb::log_init_config& cfg)
 #endif
 
         //мÓͳһÈÕÖ¾ÅäÖÃ
-        pinst_log_producer_config_set_united_appname(config, (char*)"LR04");
+        pinst_log_producer_config_set_united_appname(config, (char*)SpDefine::cmptId);
         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");
+        pinst_log_producer_config_set_united_deployUnitId(config, (char*)SpDefine::deployUnitId);
+        pinst_log_producer_config_set_united_serviceUnitId(config, (char*)SpDefine::serviceUnitId);
 
         _client = pinst_create_log_producer_client(config, NULL, NULL);
         res = (_client != nullptr);

+ 1 - 0
DevAdapter/self/dep/liblog4vendor/liblog4vendor/log4upload.h

@@ -6,6 +6,7 @@
 #include <stdint.h>
 #include "log4vendor.h"
 #include "log_define.h"
+#include "SpDefine.h"
 
 #if defined(_MSC_VER)
 

+ 4 - 1
Framework/Common/SpBase.h

@@ -1133,7 +1133,8 @@ struct IEntityFunctionPrivilege
 	virtual void GetSendLogInfo(unsigned long* t_upload_TerminalSys_Suc, unsigned long* t_upload_TerminalUser_Suc,
 		unsigned long* t_upload_BussinessSys_Suc, unsigned long* t_upload_BussinessUser_Suc, unsigned long* t_upload_beidou_Suc,
 		unsigned long* t_upload_TerminalSys_Err, unsigned long* t_upload_TerminalUser_Err,
-		unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err) = 0;
+		unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err,
+		unsigned long* t_discard_full, unsigned long* t_discard_RTI1002, unsigned long* curLogNum) = 0;
 
 	
 	//replace params with VTMInitParam; if one param in VTMInitParam equals to "", it will not replace to old value
@@ -1615,6 +1616,8 @@ SPBASE_API void destroy_log_producer_default();
 SPBASE_API void load_debugLevelInCentersetting(const char* fileName);
 SPBASE_API bool refreshLogLevel();
 SPBASE_API int getCurLogLevel();
+SPBASE_API int getReduceSpbaseLog();
+SPBASE_API void setReduceSpbaseLog(int isNor);
 SPBASE_API ErrorCodeEnum GetAllEntityIdx(CAutoArray<CSimpleStringA>& strEntityNames, CAutoArray<WORD>& wEntityDevelopIDs);
 
 

+ 4 - 4
Framework/Common/SpDefine.h

@@ -42,10 +42,10 @@ public:
 	static constexpr const char* topicVTMWeb = "LR18_23_VTMWebSDKUserLog";
 
 	//const log params
-	static constexpr const char* cmptId = "LR04";
-	static constexpr const char* CmptName = "FrameworkLib";
-	static constexpr const char* deployUnitId = "LR04.02@FrameworkLib_PRD_PRD";
-	static constexpr const char* serviceUnitId = "LR04.02_FrameworkLib";
+	static constexpr const char* cmptId = "LR04.02";
+	static constexpr const char* CmptName = "RVCTerminalPlus";
+	static constexpr const char* deployUnitId = "LR04.02_RVCTerminalPlus";
+	static constexpr const char* serviceUnitId = "LR04.02@RVCTerminalPlus_PRD_PRD";
 
 
 };

+ 1 - 0
Framework/Common/def.h

@@ -16,6 +16,7 @@
 #define SHELL_CMD_REQ_WRITE_TERMINALNO			10
 #define SHELL_CMD_REQ_MODIFY_MEM_CFG			11
 #define SHELL_CMD_REQ_TRY_UPDATE_VTMERRMSG		12
+#define SHELL_CMD_REQ_GET_UPLOAD_LOGS_INFO			13
 
 #define SHELL_CMD_INFO_MACHINE_REBOOT		        1
 #define SHELL_CMD_INFO_BLUESCREEN_DISPLAY	    2

+ 115 - 0
Framework/RvcLogSdk/log_db.cpp

@@ -20,6 +20,7 @@
 #include <sys/stat.h>
 #include "zlib.h"
 #include "base64_openssl.h"
+#include <chrono>
 
 #ifndef _WIN32
 
@@ -91,6 +92,7 @@ const std::string COLUMN_Encrypt = "encrypt";
 const std::string COLUMN_Content = "content";
 
 long LOG_GET_TIME() { return time(NULL); }
+int db_move_to_main(log_db_manager* manager);
 
 struct _log_db_manager {
 	log_producer_config* config;
@@ -734,7 +736,61 @@ int db_delete_one(log_db_manager* manager, char* uuid) {
 	return ret;
 }
 
+
+
+#if defined(_WIN32)
+#include <windows.h>
+#else
+#include <dirent.h>
+#include <cstring>
+#endif
+#include <winpr/file.h>
+#include <uuid4.h>
+#include <winpr/library.h>
+#include "../libtoolkit/path.h"
+
+std::vector<std::string> scan_db_files(const std::string& directory) {
+	std::vector<std::string> db_files;
+
+#if defined(_WIN32)
+	std::string search_path = directory + "/RvcLogSdk_*.db";
+	WIN32_FIND_DATA find_file_data;
+	HANDLE hFind = FindFirstFile(search_path.c_str(), &find_file_data);
+
+	if (hFind == INVALID_HANDLE_VALUE) {
+		std::cerr << "No files found." << std::endl;
+	}
+	else {
+		do {
+			std::string filename = find_file_data.cFileName;
+			if (filename.size() > 3 && filename.substr(filename.size() - 3) == ".db") {
+				db_files.push_back(directory + "/" + filename);
+			}
+		} while (FindNextFile(hFind, &find_file_data) != 0);
+		FindClose(hFind);
+	}
+#else
+	DIR* dir = opendir(directory.c_str());
+	if (dir != nullptr) {
+		struct dirent* entry;
+		while ((entry = readdir(dir)) != nullptr) {
+			std::string filename = entry->d_name;
+			if (filename.rfind("RvcLogSdk_", 0) == 0 && filename.size() > 3 && filename.substr(filename.size() - 3) == ".db") {
+				db_files.push_back(directory + "/" + filename);
+			}
+		}
+		closedir(dir);
+	}
+	else {
+		std::cerr << "Failed to open directory." << std::endl;
+	}
+#endif
+
+	return db_files;
+}
+
 int db_get_count(log_db_manager* manager) {
+	static auto start_time = std::chrono::high_resolution_clock::now();
 	if (manager == NULL || manager->db == NULL) {
 		aos_error_log((LB, "get db %s count failed for null.", manager->file_name.c_str()));
 		return 0;
@@ -747,6 +803,7 @@ int db_get_count(log_db_manager* manager) {
 
 	try {
 		ret = manager->db->execScalar(sql.c_str());
+		g_notUploadLogNum = ret;
 		//aos_debug_log((LB, "db %s get count %d", manager->file_name.c_str(), ret));
 	}
 	catch (CppSQLite3Exception& e)
@@ -754,9 +811,67 @@ int db_get_count(log_db_manager* manager) {
 		aos_error_log((LB, "get db %s count error %s", manager->file_name.c_str(), e.errorMessage()));
 		ret = 0;
 	}
+	
+	
+
+
+	auto elapsed_time = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::high_resolution_clock::now() - start_time);
+	if (elapsed_time.count() > 120 && ret < 500)
+	{
+		db_move_to_main(manager);
+		start_time = std::chrono::high_resolution_clock::now();
+	}
+	
+
 	return ret;
 }
 
+
+int db_move_to_main(log_db_manager* manager)
+{
+	if (manager == NULL || manager->db == NULL) {
+		aos_error_log((LB, "db_move_to_main get db %s count failed for null.", manager->file_name.c_str()));
+		return 0;
+	}
+	char tmp[MAX_PATH];
+	GetModuleFileNameA(NULL, tmp, MAX_PATH);
+	*strrchr(tmp, SPLIT_SLASH) = 0;
+	*strrchr(tmp, SPLIT_SLASH) = 0;
+	*strrchr(tmp, SPLIT_SLASH) = 0;
+	*strrchr(tmp, SPLIT_SLASH) = 0;
+	*strrchr(tmp, SPLIT_SLASH) = 0;
+	sprintf(tmp, "%s" SPLIT_SLASH_STR "rvc" SPLIT_SLASH_STR "terminaldbstorage" SPLIT_SLASH_STR "RVC.LogSdk", tmp);
+
+
+	auto db_files = scan_db_files(tmp);
+	if (db_files.size() == 0)
+		return 0;
+
+	auto uuidStr = "sql"+uuid4_generate(8);
+	int ret = true;
+	char *zSql = sqlite3_mprintf(
+		"ATTACH DATABASE \"%s\" AS %s;\n"
+		"INSERT OR IGNORE INTO RvcLogTable SELECT * FROM %s.RvcLogTable;\n"
+		"DELETE FROM %s.RvcLogTable;\n"
+		"DETACH DATABASE %s;\n",
+		db_files[0].c_str(), uuidStr.c_str(), uuidStr.c_str(), uuidStr.c_str(), uuidStr.c_str()
+	);
+	std::string sqlStr = zSql;
+	sqlite3_free(zSql);
+	try {
+		ret = manager->db->execDML(sqlStr.c_str()); // if failed, it will throw exception
+		DeleteFile(db_files[0].c_str());
+	}
+	catch (CppSQLite3Exception& e)
+	{
+		ret = false;
+	}
+	return ret;
+
+
+}
+
+
 int db_update_status(log_db_manager* manager, char* uuid, log_db_status_e status) {
 	if (manager == NULL || manager->db == NULL) {
 		aos_error_log((LB, "db %s update log status failed for null.", manager->file_name.c_str()));

+ 2 - 4
Framework/RvcLogSdk/log_persistent_manager.c

@@ -177,8 +177,7 @@ void on_log_persistent_manager_send_done_uuid(
         return;
     }
 
-    strcat(tmpFileName, "RvcLogSdk"/*manager->config->skyeyeEntityName*/);
-    strcat(tmpFileName, ".db");
+    strcat(tmpFileName, "RvcLogSdk.db"/*manager->config->skyeyeEntityName*/);
     /*如果异常,则将条目恢复成待发送状态*/
     if (result != LOG_PRODUCER_OK && result != LOG_PRODUCER_DROP_ERROR && result != LOG_PRODUCER_INVALID)
     {
@@ -226,8 +225,7 @@ static int log_persistent_manager_init(log_persistent_manager* manager, log_prod
         strcat(tmpFilePath, SPLIT_SLASH_STR);
         strcat(tmpFilePath, DB_PATH);
     }
-    strcat(tmpFileName, "RvcLogSdk");//config->skyeyeEntityName);
-    strcat(tmpFileName, ".db");
+    strcat(tmpFileName, "RvcLogSdk.db");//config->skyeyeEntityName);
     manager->db_manager = create_log_db(config, tmpFilePath, tmpFileName, DB_TABLE_NAME);
     _copy_config_string(tmpFileName, &manager->db_name);
 

+ 8 - 0
Framework/RvcLogSdk/log_producer_config.c

@@ -354,6 +354,14 @@ void log_producer_config_get_upload_info(unsigned long* t_upload_TerminalSys_Suc
     *t_upload_beidou_Err = g_upload_beidou_Err;
 }
 
+void log_producer_config_get_upload_info2(unsigned long* t_discard_full, unsigned long* t_discard_RTI1002, unsigned long* curLogNum)
+{
+    *t_discard_full = g_discardMsgNum_since_full;
+    *t_discard_RTI1002 = g_discardMsgNum_since_serverRet_RTI1002;
+    *curLogNum = g_notUploadLogNum;
+}
+
+
 LOG_EXPORT void log_producer_config_set_dbgFun(dbg_callback t_callback)
 {
     g_callback = t_callback;

+ 7 - 2
Framework/RvcLogSdk/log_producer_config.h

@@ -80,6 +80,9 @@ extern unsigned long g_upload_TerminalUser_Err;
 extern unsigned long g_upload_BussinessSys_Err;
 extern unsigned long g_upload_BussinessUser_Err;
 extern unsigned long g_upload_beidou_Err;
+extern unsigned long g_discardMsgNum_since_full;
+extern unsigned long g_discardMsgNum_since_serverRet_RTI1002;
+extern unsigned long g_notUploadLogNum;
 
 
 /**
@@ -137,11 +140,13 @@ LOG_EXPORT void log_producer_config_set_united_needArchived(log_producer_config*
 LOG_EXPORT void log_producer_config_set_united_deployUnitId(log_producer_config* config, char* deployUnitId);
 LOG_EXPORT void log_producer_config_set_united_serviceUnitId(log_producer_config* config, char* serviceUnitId);
 
-LOG_EXPORT void log_producer_config_get_upload_info(unsigned long *t_upload_TerminalSys_Suc, unsigned long *t_upload_TerminalUser_Suc, 
-    unsigned long *t_upload_BussinessSys_Suc, unsigned long *t_upload_BussinessUser_Suc, unsigned long *t_upload_beidou_Suc,
+LOG_EXPORT void log_producer_config_get_upload_info(unsigned long* t_upload_TerminalSys_Suc, unsigned long* t_upload_TerminalUser_Suc,
+    unsigned long* t_upload_BussinessSys_Suc, unsigned long* t_upload_BussinessUser_Suc, unsigned long* t_upload_beidou_Suc,
     unsigned long* t_upload_TerminalSys_Err, unsigned long* t_upload_TerminalUser_Err,
     unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err);
 
+LOG_EXPORT void log_producer_config_get_upload_info2(unsigned long* t_discard_full, unsigned long* t_discard_RTI1002, unsigned long* curLogNum);
+
 typedef void (*dbg_callback)(const char*);
 extern dbg_callback g_callback;
 // 日志回调函数

+ 3 - 2
Framework/RvcLogSdk/log_producer_manager.c

@@ -232,11 +232,11 @@ void* log_producer_read_persistent_thread(void* param)
                 else {
                     if ((producer_manager->send_param_queue_write - producer_manager->send_param_queue_read) < producer_manager->send_param_queue_size)
                     {
-                        sleepMs = 1200 * LOG_PRODUCER_READ_INTERVAL_MS;//120s send once if can not get enough
+                        sleepMs = 600 * LOG_PRODUCER_READ_INTERVAL_MS;//60s send once if can not get enough
                         forceClean = 1;
                     }                        
                     else
-                        sleepMs = 10 * LOG_PRODUCER_READ_INTERVAL_MS;//普通暂停时间,等待发送线程发送
+                        sleepMs = 3 * LOG_PRODUCER_READ_INTERVAL_MS;//普通暂停时间,等待发送线程发送
                     //aos_debug_log((LB, "get from persistent is null."));
                     break;
                 }
@@ -335,6 +335,7 @@ void* log_producer_write_persistent_thread(void* param)
         t_count = db_get_count(persistent_manager->db_manager);
         if (t_count > (persistent_manager->config->maxPersistentLogCount + 2000)) {
             discardMsg = 1;
+            g_discardMsgNum_since_full = g_discardMsgNum_since_full + 1;
             aos_warn_log((LB, "give up the db content, bcz db count %d exceeds max count %d", t_count, persistent_manager->config->maxPersistentLogCount));
         }
         else {

+ 5 - 3
Framework/RvcLogSdk/log_producer_sender.c

@@ -33,7 +33,6 @@ const char* LOGE_TIME_EXPIRED = "RequestTimeExpired";
 
 ///**TODO(Gifur@4/27/2023): 这套在Linux下行不通!! */
 
-#pragma data_seg("LOG_SEND_INFO")
 unsigned long g_upload_TerminalSys_Suc = 0;
 unsigned long g_upload_TerminalUser_Suc = 0;
 unsigned long g_upload_BussinessSys_Suc = 0;
@@ -46,8 +45,9 @@ unsigned long g_upload_BussinessSys_Err = 0;
 unsigned long g_upload_BussinessUser_Err = 0;
 unsigned long g_upload_beidou_Err = 0;
 unsigned long g_upload_vtmsdk_Err = 0;
-#pragma data_seg()
-#pragma comment(linker,"/section:LOG_SEND_INFO,rws")
+unsigned long g_discardMsgNum_since_full = 0;
+unsigned long g_discardMsgNum_since_serverRet_RTI1002 = 0;
+unsigned long g_notUploadLogNum = 0;
 
 
 //#define SEND_TIME_INVALID_FIX
@@ -271,6 +271,8 @@ void * log_producer_send_fun(void * param)
             default:
                 break;
             }
+            if(rst->statusCode == 300)
+                g_discardMsgNum_since_serverRet_RTI1002 += send_buf->n_logs;
         }
 
         sleepMs = log_producer_on_send_done(send_param, rst, &error_info) / 2;//执行senddone,删除数据库中内容

+ 69 - 7
Framework/spbase/SpEntityPrivilege.cpp

@@ -39,6 +39,7 @@
 #include <winpr/crt.h>
 #include <winpr/file.h>
 #endif //RVC_OS_WIN
+#include <SpHelper.h>
 
 static ErrorCodeEnum ControlEntity(
 	SpEntity *pEntity, 
@@ -905,18 +906,79 @@ ErrorCodeEnum SpEntityPrivilege::TryUpdateCenterCfg(bool& isUpdate, bool& isRese
 		
 	return (ErrorCodeEnum)ret;
 }
+struct Log_Info
+{
+	unsigned int t_upload_TerminalSys_Suc;
+	unsigned int t_upload_TerminalUser_Suc;
+	unsigned int t_upload_BussinessSys_Suc;
+	unsigned int t_upload_BussinessUser_Suc;
+	unsigned int t_upload_beidou_Suc;
+	unsigned int t_upload_TerminalSys_Err;
+	unsigned int t_upload_TerminalUser_Err;
+	unsigned int t_upload_BussinessSys_Err;
+	unsigned int t_upload_BussinessUser_Err;
+	unsigned int t_upload_beidou_Err;
+	unsigned int t_discard_full;
+	unsigned int t_discard_RTI1002;
+	unsigned int curLogNum;
+
+	void Serialize(SpBuffer& Buf)
+	{
+		auto& buf = Buf & 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 & t_discard_full & t_discard_RTI1002 & curLogNum;
+	}
+};
+
 
 void SpEntityPrivilege::GetSendLogInfo(unsigned long* t_upload_TerminalSys_Suc, unsigned long* t_upload_TerminalUser_Suc,
 	unsigned long* t_upload_BussinessSys_Suc, unsigned long* t_upload_BussinessUser_Suc, unsigned long* t_upload_beidou_Suc,
 	unsigned long* t_upload_TerminalSys_Err, unsigned long* t_upload_TerminalUser_Err,
-	unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err)
+	unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err, 
+	unsigned long* t_discard_full, unsigned long* t_discard_RTI1002, unsigned long* curLogNum)
 {
-#if defined(_MSC_VER)
-	log_producer_config_get_upload_info(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);
-#else
-	///*TODO(80374374@3/9/2023):  */
-#endif //_MSC_VER
+	iobuffer_t* req_pkt = iobuffer_create(-1, -1);
+	SpAsyncWaitRPC* pAsyncWait = new SpAsyncWaitRPC(this, &req_pkt, SHELL_CMD_REQ_GET_UPLOAD_LOGS_INFO);
+	ErrorCodeEnum Error = pAsyncWait->Begin();
+
+	if (Error == Error_Succeed)
+	{
+		Error = pAsyncWait->WaitAnswer(30000);//WaitAnswer如果设定为INFINE,则最大10s,在http访问中会触发超时
+		if (Error == Error_Succeed)
+		{
+			CAutoBuffer AnsBuf;
+			bool bEnd;
+			Error = pAsyncWait->AsyncGetAnswer(AnsBuf, bEnd);
+			if (Error == Error_Succeed)
+			{
+				Log_Info cur;
+				SpBuffer2Object(AnsBuf, cur);
+
+				*t_upload_TerminalSys_Suc = cur.t_upload_TerminalSys_Suc;
+				*t_upload_TerminalUser_Suc = cur.t_upload_TerminalUser_Suc;
+				*t_upload_BussinessSys_Suc = cur.t_upload_BussinessSys_Suc;
+				*t_upload_BussinessUser_Suc = cur.t_upload_BussinessUser_Suc;
+				*t_upload_beidou_Suc = cur.t_upload_beidou_Suc;
+				*t_upload_TerminalSys_Err = cur.t_upload_TerminalSys_Err;
+				*t_upload_TerminalUser_Err = cur.t_upload_TerminalUser_Err;
+				*t_upload_BussinessSys_Err = cur.t_upload_BussinessSys_Err;
+				*t_upload_BussinessUser_Err = cur.t_upload_BussinessUser_Err;
+				*t_upload_beidou_Err = cur.t_upload_beidou_Err;
+				*t_discard_full = cur.t_discard_full;
+				*t_discard_RTI1002 = cur.t_discard_RTI1002;
+				*curLogNum = cur.curLogNum;
+				/*
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("checkUrlActive::GetSendLogInfo, TS_Suc:%d, TU_Suc:%d, BS_Suc:%d, BU_Suc:%d, beidou_Suc:%d, TS_Err:%d, TU_Err:%d, BS_Err:%d, BU_Err:%d, beidou_Err:%d, discard_forFull:%d, discard_forRTI1002:%d, curNum:%d"
+					, cur.t_upload_TerminalSys_Suc, cur.t_upload_TerminalUser_Suc, cur.t_upload_BussinessSys_Suc, cur.t_upload_BussinessUser_Suc, cur.t_upload_beidou_Suc,
+					cur.t_upload_TerminalSys_Err, cur.t_upload_TerminalUser_Err, cur.t_upload_BussinessSys_Err, cur.t_upload_BussinessUser_Err, cur.t_upload_beidou_Err
+					, cur.t_discard_full, cur.t_discard_RTI1002, cur.curLogNum);
+				*/
+			}
+		}
+	}
+	pAsyncWait->DecrementRef();
+	if (req_pkt)
+		iobuffer_dec_ref(req_pkt);
 
 }
 

+ 2 - 1
Framework/spbase/SpEntityPrivilege.h

@@ -56,7 +56,8 @@ public:
 	virtual void GetSendLogInfo(unsigned long* t_upload_TerminalSys_Suc, unsigned long* t_upload_TerminalUser_Suc,
 		unsigned long* t_upload_BussinessSys_Suc, unsigned long* t_upload_BussinessUser_Suc, unsigned long* t_upload_beidou_Suc,
 		unsigned long* t_upload_TerminalSys_Err, unsigned long* t_upload_TerminalUser_Err,
-		unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err);
+		unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err,
+		unsigned long* t_discard_full, unsigned long* t_discard_RTI1002, unsigned long* curLogNum);
 
 	//先调用这个去初始化url
 	virtual ErrorCodeEnum InitCfgUrl(VTMInitParam& info);

+ 46 - 9
Framework/spbase/sp_cfg.cpp

@@ -47,6 +47,7 @@
 #include "JsonConvertHelper.hpp"
 #endif //_MSC_VER
 #include "sp_checkEntity.h"
+#include <log_producer_config.h>
 
 
 
@@ -568,17 +569,31 @@ SPBASE_API int sp_cfg_getVer(char *ver)
 	if (s_terminalVer.GetLength() == 0)//only init s_terminalVer one time
 	{
 		CSimpleStringA strActiveFile = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "active.txt", sp_get_env()->dir->root_ver_path);
-		char version[SP_MAX_VER_LEN];
-		int result;
-		if ((result = sp_dir_inner_get_content(strActiveFile, version)) == 0) {
-			s_terminalVer = version;
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("read active.txt, version[%s]", s_terminalVer.GetData());
-		}
-		else {
-			return result;
+		std::ifstream iFile(strActiveFile.GetData());
+		if (!iFile.is_open()) {
+			LogError(Severity_Low, Error_Unexpect, 0, "open active.txt fail");
+			return Error_Unexpect;
 		}
+
+		std::ostringstream buffer;
+		buffer << iFile.rdbuf();
+		std::string myString = buffer.str();
+		// 去除空格
+		myString.erase(std::remove(myString.begin(), myString.end(), ' '), myString.end());
+		// 去除换行符
+		myString.erase(std::remove(myString.begin(), myString.end(), '\r'), myString.end());
+		myString.erase(std::remove(myString.begin(), myString.end(), '\n'), myString.end());
+
+		s_terminalVer = myString.c_str();
+
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("read active.txt, version[%s]", s_terminalVer.GetData());
 	}
+	
+#ifdef RVC_OS_LINUX
+	sprintf(ver, "%s", s_terminalVer.GetData());
+#else
 	sprintf_s(ver, SP_MAX_VER_LEN, "%s", s_terminalVer.GetData());
+#endif
 	return Error_Succeed;
 }
 
@@ -600,11 +615,25 @@ SPBASE_API int sp_cfg_getDepVer(char* ver)
 	int result;
 	if ((result = sp_dir_inner_get_content(path, version)) == 0) {
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("read dep version text, version[%s]", version);
-		sprintf_s(ver, SP_MAX_VER_LEN, "%s", version);
+		sprintf(ver, "%s", version);
 	}
 	return result;
 }
 
+void get_upload_info(unsigned long* t_upload_TerminalSys_Suc, unsigned long* t_upload_TerminalUser_Suc,
+	unsigned long* t_upload_BussinessSys_Suc, unsigned long* t_upload_BussinessUser_Suc, unsigned long* t_upload_beidou_Suc,
+	unsigned long* t_upload_TerminalSys_Err, unsigned long* t_upload_TerminalUser_Err,
+	unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err)
+{
+	log_producer_config_get_upload_info(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);
+}
+
+void get_upload_info2(unsigned long* t_discard_full, unsigned long* t_discard_RTI1002, unsigned long* curLogNum)
+{
+	log_producer_config_get_upload_info2(t_discard_full, t_discard_RTI1002, curLogNum);
+}
+
 int sp_TryUpdateToken(char *oldToken, char *newToken)
 {
 	auto cfg = sp_get_env()->cfg;
@@ -700,7 +729,11 @@ int sp_tryReadFromCacheConfig(int cfgType, const char* section, const char* key,
 		return ErrorCodeEnum::Error_NoDefine;
 	else
 	{
+#ifdef RVC_OS_LINUX
+		sprintf(dst, "%s", curSection[key].c_str());
+#else
 		sprintf_s(dst, max_len, "%s", curSection[key].c_str());
+#endif
 		return Error_Succeed;
 	}
 }
@@ -746,7 +779,11 @@ int sp_tryReadFromCenterSetting(const char* section, const char* key, char *dst,
 		return ErrorCodeEnum::Error_NoDefine;
 	else
 	{
+#ifdef RVC_OS_LINUX
+		sprintf(dst, "%s", curSection[key].c_str());
+#else
 		sprintf_s(dst, max_len, "%s", curSection[key].c_str());
+#endif
 		return Error_Succeed;
 	}
 }

+ 6 - 0
Framework/spbase/sp_cfg.h

@@ -264,6 +264,12 @@ SPBASE_API LARGE_TIME sp_cfg_getShellFirstStartTime();
 
 SPBASE_API int sp_cfg_getVer(char* ver);
 SPBASE_API int sp_cfg_getDepVer(char* ver);
+SPBASE_API void get_upload_info(unsigned long* t_upload_TerminalSys_Suc, unsigned long* t_upload_TerminalUser_Suc,
+	unsigned long* t_upload_BussinessSys_Suc, unsigned long* t_upload_BussinessUser_Suc, unsigned long* t_upload_beidou_Suc,
+	unsigned long* t_upload_TerminalSys_Err, unsigned long* t_upload_TerminalUser_Err,
+	unsigned long* t_upload_BussinessSys_Err, unsigned long* t_upload_BussinessUser_Err, unsigned long* t_upload_beidou_Err);
+
+SPBASE_API void get_upload_info2(unsigned long* t_discard_full, unsigned long* t_discard_RTI1002, unsigned long* curLogNum);
 
 #define SP_MAX_VER_LEN		128
 #define SPSHELL_NAME		"SpShell"

+ 73 - 10
Framework/spbase/sp_logwithlink.cpp

@@ -24,6 +24,9 @@
 #include <winpr/file.h>
 #include <winpr/wlog.h>
 #include "sp_httpDefine.h"
+#include <fstream>
+#include <iostream>
+#include "SpDefine.h"
 #include <mutex>
 #define TAG SPBASE_TAG("sp_logwithlink")
 
@@ -38,6 +41,7 @@ int g_curEntityIdx = 0;
 std::map<std::string, int> g_entityDebugLevelArr;
 void* g_logProduceSender = NULL;
 int curEntityLogLevel = 1;
+int g_spbaseLogNor = 1;
 std::mutex g_logMtx;
 
 
@@ -639,11 +643,11 @@ SPBASE_API void* create_log_producer_storage(CSimpleStringA entityName, CSimpleS
     if(CmptId.GetLength() > 0)
         log_producer_config_set_skyeye_cmptId(config, (char*)CmptId.GetData());
     else
-        log_producer_config_set_skyeye_cmptId(config, (char*)"LR04");
+        log_producer_config_set_skyeye_cmptId(config, (char*)SpDefine::cmptId);
     if(CmptName.GetLength() > 0)
         log_producer_config_set_skyeye_cmptname(config, (char*)CmptName.GetData());
     else
-        log_producer_config_set_skyeye_cmptname(config, (char*)"FrameworkLib");
+        log_producer_config_set_skyeye_cmptname(config, (char*)SpDefine::CmptName);
     log_producer_config_set_skyeye_version(config, (char*)"1.0");
     log_producer_config_set_persistent(config, 1);
 
@@ -680,11 +684,11 @@ SPBASE_API void* create_log_producer_storage(CSimpleStringA entityName, CSimpleS
     }
 
     //新加统一日志配置
-    log_producer_config_set_united_appname(config, (char*)"LR04");
+    log_producer_config_set_united_appname(config, (char*)SpDefine::cmptId);
     log_producer_config_set_united_version(config, (char*)"2.0");
     log_producer_config_set_united_needArchived(config, 0);
-    log_producer_config_set_united_deployUnitId(config, (char*)"LR04.02_FrameworkLib");
-    log_producer_config_set_united_serviceUnitId(config, (char*)"LR04.02@FrameworkLib_PRD_PRD");
+    log_producer_config_set_united_deployUnitId(config, (char*)SpDefine::deployUnitId);
+    log_producer_config_set_united_serviceUnitId(config, (char*)SpDefine::serviceUnitId);
 
 #ifndef _WIN32
     //log_producer_config_set_dbgFun(logCallback);
@@ -736,8 +740,8 @@ SPBASE_API void* create_log_producer_send(CSimpleStringA endpoint, CSimpleString
     log_producer_config_set_send_thread_count(config, 1);
     log_producer_config_set_persistent_max_log_count(config, 20 * 1000);
     log_producer_config_set_skyeye_servname(config, (char*)"Terminal");
-    log_producer_config_set_skyeye_cmptId(config, (char*)"LR04");
-    log_producer_config_set_skyeye_cmptname(config, (char*)"FrameworkLib");
+    log_producer_config_set_skyeye_cmptId(config, (char*)SpDefine::cmptId);
+    log_producer_config_set_skyeye_cmptname(config, (char*)SpDefine::CmptName);
     log_producer_config_set_skyeye_version(config, (char*)"1.0");
     log_producer_config_set_persistent(config, 1);
     log_producer_config_set_openDb(config, 1);
@@ -771,11 +775,11 @@ SPBASE_API void* create_log_producer_send(CSimpleStringA endpoint, CSimpleString
     }
 
     //新加统一日志配置
-    log_producer_config_set_united_appname(config, (char*)"LR04");
+    log_producer_config_set_united_appname(config, (char*)SpDefine::cmptId);
     log_producer_config_set_united_version(config, (char*)"2.0");
     log_producer_config_set_united_needArchived(config, 0);
-    log_producer_config_set_united_deployUnitId(config, (char*)"LR04.02_FrameworkLib");
-    log_producer_config_set_united_serviceUnitId(config, (char*)"LR04.02@FrameworkLib_PRD_PRD");
+    log_producer_config_set_united_deployUnitId(config, (char*)SpDefine::deployUnitId);
+    log_producer_config_set_united_serviceUnitId(config, (char*)SpDefine::serviceUnitId);
     log_producer_config_set_enable_guard(config, 1);
 
 #ifndef _WIN32
@@ -828,8 +832,67 @@ SPBASE_API int getCurLogLevel()
     return curEntityLogLevel;
 }
 
+SPBASE_API void setReduceSpbaseLog(int isNor)
+{
+    g_spbaseLogNor = isNor;
+}
+
+int changeDbtoNew()
+{
+    char tmp[MAX_PATH];
+    GetModuleFileNameA(NULL, tmp, MAX_PATH);
+    *strrchr(tmp, SPLIT_SLASH) = 0;
+    *strrchr(tmp, SPLIT_SLASH) = 0;
+    *strrchr(tmp, SPLIT_SLASH) = 0;
+    *strrchr(tmp, SPLIT_SLASH) = 0;
+    *strrchr(tmp, SPLIT_SLASH) = 0;
+    sprintf(tmp, "%s" SPLIT_SLASH_STR "rvc" SPLIT_SLASH_STR "terminaldbstorage" SPLIT_SLASH_STR "RVC.LogSdk" SPLIT_SLASH_STR "RvcLogSdk.db", tmp);
+
+
+    // 检查文件是否存在
+    std::string filePath = tmp;
+    std::ifstream file(filePath);
+    if (!file.good()) {
+        return 1;
+    }
+
+    // 检查文件是否被占用
+    file.close();
+
+    // 获取当前日期和时间
+    time_t now = time(0);
+    tm* ltm = localtime(&now);
+
+    // 格式化日期和时间
+    char date[11];
+    strftime(date, 11, "%Y%m%d", ltm);
+
+    auto uuidStr = uuid4_generateStr(8);
+
+    // 生成新文件名
+    std::string newFilePath = filePath;
+    size_t pos = newFilePath.find_last_of('.');
+    newFilePath.insert(pos, "_" + std::string(date) + "_" + std::string(uuidStr.GetData()));
+
+    if (!std::rename(filePath.c_str(), newFilePath.c_str())) {
+        // 重命名文件失败
+        return 3;
+    }
+
+    
+    return 0;
+}
+
+SPBASE_API int getReduceSpbaseLog()
+{
+    return g_spbaseLogNor;
+}
+
+
 SPBASE_API bool create_log_producer_default(CSimpleStringA entityName, int idx)
 {
+    if (entityName.Compare("SpShell", true) == 0)
+        changeDbtoNew();
     refreshLogLevel();
 
     CSimpleString idxStr = CSimpleString::Format("%d", idx);

+ 4 - 2
Framework/spbase/sp_tbs_unix.cpp

@@ -857,7 +857,8 @@ static void on_session(sp_tbs_t *tbs, sock_connection *conn, int tsx_id, char *e
 
 	rc = create_sub_session(tbs, conn, tsx_id, entity_name, function_name, class_name, &session);
 	if (rc == 0) {
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("start create sub session!");
+		if(getReduceSpbaseLog())
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("start create sub session!");
 		//post_session_ack(tbs, conn, session->id, tsx_id, rc, NULL);
 	} else {
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create_sub_session failed! entity: %s, err = %d %s %d",
@@ -906,7 +907,8 @@ static void __bcm_on_message_raw(sp_bcm_listener_t *listener, int from_client_id
 	*msg_pkt = NULL;
 	sp_bcm_listener_inc_ref(listener); //@
 	post_msg(entry->conn->tbs, MSG_ON_EVENT, (param_size_t)entry, (param_size_t)pkt);
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("post event from_client_id:%d", from_client_id);
+	if (getReduceSpbaseLog())
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("post event from_client_id:%d", from_client_id);
 }
 
 static void __bcm_on_destroy(sp_bcm_listener_t *listener, void *user_data)

+ 8 - 5
Framework/spbase/sp_tbs_win.cpp

@@ -512,7 +512,8 @@ static void uac_on_connect(sp_tbs_t *tbs, sock_connection *conn, sub_session *se
 {
 	if (!error) {
 		post_session_ack(tbs, conn, session->id, session->tsx_id, error, NULL);
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("sub session created ok! ses_id = %d, tsx_id = %d", session->id, session->tsx_id);
+		if(getReduceSpbaseLog())
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("sub session created ok! ses_id = %d, tsx_id = %d", session->id, session->tsx_id);
 	} else {
 		sp_ses_uac_t *uac = session->uac;
 		post_session_ack(tbs, conn, CONN_INVALID_ID, session->tsx_id, error, get_err_msg(error));
@@ -721,7 +722,8 @@ static void on_session(sp_tbs_t *tbs, sock_connection *conn, int tsx_id, char *e
 
 	rc = create_sub_session(tbs, conn, tsx_id, entity_name, function_name, class_name, &session);
 	if (rc == 0) {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start create sub session!");
+		if (getReduceSpbaseLog())
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start create sub session!");
 		//post_session_ack(tbs, conn, session->id, tsx_id, rc, NULL);
 	} else {
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create_sub_session failed! entity: %s, err = %d %s %d",
@@ -771,7 +773,8 @@ static void __bcm_on_message_raw(sp_bcm_listener_t *listener, int from_client_id
 	*msg_pkt = NULL;
 	sp_bcm_listener_inc_ref(listener); //@
 	post_msg(entry->conn->tbs, MSG_ON_EVENT, (int)entry, (int)pkt);
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("post event from_client_id:%d", from_client_id);
+	if(getReduceSpbaseLog())
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("post event from_client_id:%d", from_client_id);
 }
 
 static void __bcm_on_destroy(sp_bcm_listener_t *listener, void *user_data)
@@ -1111,7 +1114,7 @@ static void process_tcp_pkt(sp_tbs_t *tbs, sock_connection *conn, iobuffer_t **p
 				class_name = (char *)malloc(n);
 				WideCharToMultiByte(CP_ACP, 0, wclass_name, -1, class_name, n, NULL, NULL);
 				FREE(wclass_name);
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("recv PKT_TYPE_SESSION tsx_id=%d entity_name=%s function_name=%s class_name=%s", tsx_id, entity_name, function_name, class_name);
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("recv PKT_TYPE_SESSION tsx_id=%d entity_name=%s function_name=%s class_name=%s", tsx_id, entity_name, function_name, class_name);
 				on_session(tbs, conn, tsx_id, entity_name, function_name, class_name);
 				if (entity_name)
 					free(entity_name);
@@ -1162,7 +1165,7 @@ static void process_tcp_pkt(sp_tbs_t *tbs, sock_connection *conn, iobuffer_t **p
 				function_name = (char*)malloc(n);
 				WideCharToMultiByte(CP_ACP, 0, wfunction_name, -1, function_name, n, NULL, NULL);
 				FREE(wfunction_name);
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("recv PKT_TYPE_REGISTER_EVENT register_id=%d, entity_name=%s, function_name=%s", register_id, entity_name, function_name);
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("recv PKT_TYPE_REGISTER_EVENT register_id=%d, entity_name=%s, function_name=%s", register_id, entity_name, function_name);
 				on_register_event(tbs, conn, register_id, entity_name, function_name);
 				if (entity_name)
 					free(entity_name);

+ 1 - 0
Framework/spshell/app.cpp

@@ -118,6 +118,7 @@ static void on_req(sp_rpc_server_t *server, int epid, int svc_id, int rpc_id, in
 		HANDLE_REQ(SHELL_CMD_REQ_WRITE_TERMINALNO, on_write_terminalNo)
 		HANDLE_REQ(SHELL_CMD_REQ_MODIFY_MEM_CFG, on_modify_mem_cfg)
 		HANDLE_REQ(SHELL_CMD_REQ_TRY_UPDATE_VTMERRMSG, on_try_update_VTMERRMSG)
+		HANDLE_REQ(SHELL_CMD_REQ_GET_UPLOAD_LOGS_INFO, on_try_upload_logs_info)
 	END_REQ_MAP()
 }
 

+ 71 - 0
Framework/spshell/svc.cpp

@@ -841,6 +841,9 @@ iobuffer_t* on_try_update_VTMERRMSG(sp_rpc_server_t* server, int epid, int svc_i
 	return ans_pkt;
 }
 
+
+
+
 iobuffer_t* on_try_update_cfg(sp_rpc_server_t* server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t** req_pkt)
 {
 	iobuffer_t* ans_pkt = iobuffer_create(-1, -1);
@@ -925,3 +928,71 @@ iobuffer_t* on_modify_mem_cfg(sp_rpc_server_t* server, int epid, int svc_id, int
 	
 	return ans_pkt;
 }
+
+iobuffer_t* on_try_upload_logs_info(sp_rpc_server_t* server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t** req_pkt)
+{
+	iobuffer_t* ans_pkt = iobuffer_create(-1, -1);
+	unsigned long t_upload_TerminalSys_Suc = 0,
+		t_upload_TerminalUser_Suc = 0,
+		t_upload_BussinessSys_Suc = 0,
+		t_upload_BussinessUser_Suc = 0,
+		t_upload_beidou_Suc = 0,
+		t_upload_TerminalSys_Err = 0,
+		t_upload_TerminalUser_Err = 0,
+		t_upload_BussinessSys_Err = 0,
+		t_upload_BussinessUser_Err = 0,
+		t_upload_beidou_Err = 0;
+	unsigned long t_discard_full = 0,
+		t_discard_RTI1002 = 0,
+		curLogNum = 0;
+	get_upload_info(&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);
+
+	get_upload_info2(&t_discard_full, &t_discard_RTI1002, &curLogNum);
+
+	ErrorCodeEnum nRet = Error_Succeed;
+	int end = 0;
+
+	//iobuffer_write(ans_pkt, IOBUF_T_I4, &nRet, 0);//dwSysError
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &nRet, 0);//UserError
+	//char* tmpStr = "";
+	//iobuffer_write(ans_pkt, IOBUF_T_STR, tmpStr, 0);
+	//iobuffer_write(ans_pkt, IOBUF_T_I4, &end, 0);//end
+
+	unsigned int i_upload_TerminalSys_Suc = t_upload_TerminalSys_Suc;
+	unsigned int i_upload_TerminalUser_Suc = t_upload_TerminalUser_Suc;
+	unsigned int i_upload_BussinessSys_Suc = t_upload_BussinessSys_Suc;
+	unsigned int i_upload_BussinessUser_Suc = t_upload_BussinessUser_Suc;
+	unsigned int i_upload_beidou_Suc = t_upload_beidou_Suc;
+	unsigned int i_upload_TerminalSys_Err = t_upload_TerminalSys_Err;
+	unsigned int i_upload_TerminalUser_Err = t_upload_TerminalUser_Err;
+	unsigned int i_upload_BussinessSys_Err = t_upload_BussinessSys_Err;
+	unsigned int i_upload_BussinessUser_Err = t_upload_BussinessUser_Err;
+	unsigned int i_upload_beidou_Err = t_upload_beidou_Err;
+	unsigned int i_discard_full = t_discard_full;
+	unsigned int i_discard_RTI1002 = t_discard_RTI1002;
+	unsigned int i_curLogNum = curLogNum;
+
+
+
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_TerminalSys_Suc, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_TerminalUser_Suc, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_BussinessSys_Suc, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_BussinessUser_Suc, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_beidou_Suc, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_TerminalSys_Err, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_TerminalUser_Err, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_BussinessSys_Err, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_BussinessUser_Err, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_upload_beidou_Err, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_discard_full, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_discard_RTI1002, 0);
+	iobuffer_write(ans_pkt, IOBUF_T_I4, &i_curLogNum, 0);
+	
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("checkUrlActive::GetSendLogInfo, TS_Suc:%d, TU_Suc:%d, BS_Suc:%d, BU_Suc:%d, beidou_Suc:%d, TS_Err:%d, TU_Err:%d, BS_Err:%d, BU_Err:%d, beidou_Err:%d, discard_forFull:%d, discard_forRTI1002:%d, curNum:%d"
+		, 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
+		, t_discard_full, t_discard_RTI1002, curLogNum);
+
+	return ans_pkt;
+}

+ 1 - 0
Framework/spshell/svc.h

@@ -89,6 +89,7 @@ iobuffer_t* on_try_update_cfg(sp_rpc_server_t * server, int epid, int svc_id, in
 iobuffer_t* on_write_terminalNo(sp_rpc_server_t * server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t * *req_pkt);
 iobuffer_t* on_modify_mem_cfg(sp_rpc_server_t * server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t * *req_pkt);
 iobuffer_t* on_try_update_VTMERRMSG(sp_rpc_server_t * server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t * *req_pkt);
+iobuffer_t* on_try_upload_logs_info(sp_rpc_server_t * server, int epid, int svc_id, int rpc_id, int call_type, iobuffer_t * *req_pkt);
 
 int  stop_all_stated_entity(void* param);
 int KickoffSpRestart(bool bRestart);

+ 1 - 1
Module/mod_ResourceWatcher/ResourceWatcherFSM.cpp

@@ -4157,7 +4157,7 @@ void ResourceWatcherFSM::InitUserInfo()
 	if (pBuffer) {
 		WTSFreeMemory(pBuffer);
 	}
-    const int diff_flag = IsUserSameName() ? 1 : 0;
+    const int diff_flag = IsUserSameName() ? 0 : 1;
 	LogWarn(Severity_Low, Error_Debug, LOG_INFO_USRNAME_INFO, CSimpleStringA::Format("{\"subject\":\"user_info\",\"username\":\"%s\",\"login_username\":\"%s\",\"diff\":%d}"
         ,m_strCurrentUserName.GetData(), m_strLoginedUserName.GetData(), diff_flag));
 }

+ 3 - 15
Module/mod_UpgradeMgr/UpgradeTaskFSM.cpp

@@ -1691,7 +1691,7 @@ namespace Task
 }
 
 //完成
-// 创建新版本目录,拷贝当前版本bin、cfg、dep、mod、imdep、res、install.ini,并修改Shell.ini相关配置
+// 创建新版本目录,拷贝当前版本bin、cfg、dep、mod、imdep、res
 ErrorCodeEnum CUpgradeTaskFSM::CreateNewVersion(CVersion NewSoftwareVersion,CSimpleStringA &strErrInfo)
 {
 	// 创建安装包日志文件
@@ -1830,13 +1830,7 @@ ErrorCodeEnum CUpgradeTaskFSM::CreateNewVersion(CVersion NewSoftwareVersion,CSim
 	}
 	else
 	{
-		if (!CreateDirA(strDest, TRUE))
-		{
-			DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create res dir fail");
-			strErrInfo = "create res dir fail";
-			return Error_Unexpect;
-		}
-		DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create res dir succ");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("res dir is not exist,ignore copy");
 	}
 
 	strSource = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "imdep", strCurVerPath.GetData());
@@ -1855,13 +1849,7 @@ ErrorCodeEnum CUpgradeTaskFSM::CreateNewVersion(CVersion NewSoftwareVersion,CSim
 	}
 	else
 	{
-		if (!CreateDirA(strDest, TRUE))
-		{
-			DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create imdep dir fail");
-			strErrInfo = "create imdep dir fail";
-			return Error_Unexpect;
-		}
-		DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create imdep dir succ");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("imdep dir is not exist,ignore copy");
 	}
 	return Error_Succeed;
 }

+ 5 - 0
Module/mod_cardissuerstore/CardIssuerFSM.cpp

@@ -7692,6 +7692,8 @@ int CCardIssuerFSM::AddAndReadCardFromBoxJS(SpReqAnsContext<CardIssuerStoreServi
 		CardNo card;
 		memset(&card, 0, sizeof(card));
 
+		ctx->Ans.reserved1.Init(3);
+
 		m_mapJsonErr["cardNo"] = JsonElem("");
 		l_beginTime = GetTickCountRVC();
 		eErr = m_hDevHelper->ReadAccount(card);
@@ -7707,6 +7709,9 @@ int CCardIssuerFSM::AddAndReadCardFromBoxJS(SpReqAnsContext<CardIssuerStoreServi
 			ctx->Ans.cardNo = card.account;
 			ctx->Ans.track2 = card.track2;
 			ctx->Ans.track3 = card.track3;
+			ctx->Ans.reserved1[0] = card.dwSize;
+			ctx->Ans.reserved1[1] = card.dwTrack2Size;
+			ctx->Ans.reserved1[2] = card.dwTrack3Size;
 			if (card.dwTrack3Size == 2)
 			{
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("maybe only IC card.");

+ 116 - 71
Module/mod_chromium/CModTools.cpp

@@ -84,15 +84,34 @@ namespace Chromium {
 		this->m_pEntity = pEntity;
 		m_UseUOSBrowser = 0;
 		m_isGuardMainBrowser = false;
+		CSmartPointer<IConfigInfo> spConfig;
+		ErrorCodeEnum Error = m_pEntity->GetFunction()->OpenConfig(Config_Root, spConfig);
+		if (Error == Error_Succeed)
+		{
+			Error = spConfig->ReadConfigValue("Terminal", "MachineType", ConfigManager::getInstance().m_strMachineType);
+			if (Error == Error_Succeed)
+			{
+				Error = spConfig->ReadConfigValue("Terminal", "Site", ConfigManager::getInstance().m_strSite);
+				if (Error != Error_Succeed)
+				{
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ReadConfigValue, get Site value failed");
+				}
+			}
+			else
+			{
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ReadConfigValue, get MachineType value failed");
+			}
+		}
+
 		auto configRet = ReadCenterConfigStr();
-		m_UserMgrUrlStr = std::get<0>(configRet);
-		m_UserMgrUrlNoSidebarStr = std::get<1>(configRet);
-		m_UserMgrUrlNoSidebarMutiStr = std::get<2>(configRet);
-		m_UserMgrUrlFultureStr = std::get<3>(configRet);
-		m_UserMgrAdStr = std::get<4>(configRet);
+		ConfigManager::getInstance().m_UserMgrUrlStr = std::get<0>(configRet);
+		ConfigManager::getInstance().m_UserMgrUrlNoSidebarStr = std::get<1>(configRet);
+		ConfigManager::getInstance().m_UserMgrUrlNoSidebarMutiStr = std::get<2>(configRet);
+		ConfigManager::getInstance().m_UserMgrUrlFultureStr = std::get<3>(configRet);
+		ConfigManager::getInstance().m_UserMgrAdStr = std::get<4>(configRet);
 		notifyExist = breakdownExist = m_isAdOpen = false;
 		m_magicStr = uuid4_generate(8);
-		m_withMin = false;
+		ConfigManager::getInstance().m_withMin = false;
 
 #if defined(RVC_OS_LINUX)
         InitBrowserUseMode();
@@ -161,8 +180,9 @@ namespace Chromium {
 
 	std::pair<bool, std::string> CModTools::getAdUrl()
 	{
-		auto AdUrl = m_UserMgrAdStr;
-		auto strUrl = detectUrls(AdUrl.GetData());
+		auto AdUrl = ConfigManager::getInstance().m_UserMgrAdStr;
+		std::string strUrl = AdUrl.GetData();
+		//auto strUrl = detectUrls(AdUrl.GetData());
 		return strUrl.length() > 0 ? std::make_pair(true, strUrl) : std::make_pair(false, strUrl);
 	}
 
@@ -218,7 +238,7 @@ namespace Chromium {
 		case ERR_PAGE_REASON::audioErr:
 		{
 			errPageParams.Append(CSimpleStringA("showlimit=1"));
-			if (m_withMin) {
+			if (ConfigManager::getInstance().m_withMin) {
 				errPageParams.Append(CSimpleStringA(generate_url_prefix())).Append(CSimpleStringA("&showmin=1"));
 			}
 		}
@@ -240,16 +260,17 @@ namespace Chromium {
 		errPageUrl.Append(" ");
         CSimpleStringA cachePath;
         this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
-        cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "").Append(errType._to_string());
+        cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
+			Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "").Append(errType._to_string());
 		errPageUrl.Append(" --cache-path=").Append(cachePath);
-        if (g_useMagic)
+        if (ConfigManager::getInstance().isUseMagic())
 			errPageUrl.Append(" --magic-str=").Append(m_magicStr.c_str());
-		if (g_withMedia)
+		if (ConfigManager::getInstance().m_withMedia)
 			errPageUrl.Append(" --enable-media-stream=1 --enable-speech-input=1");
-		if (g_withConsole)
+		if (ConfigManager::getInstance().m_withConsole)
 			errPageUrl.Append(" --with-console");
-		if(g_sogouForce != 0)
-			errPageUrl.Append(" --adapt-sogou=").Append(std::to_string(g_sogouForce).c_str());
+		if(ConfigManager::getInstance().getSogouForce() != 0)
+			errPageUrl.Append(" --adapt-sogou=").Append(std::to_string(ConfigManager::getInstance().getSogouForce()).c_str());
 		errPageUrl.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame  --winhttp-proxy-resolver").Append(" --always-on-top");
 
         switch (errType) {
@@ -416,8 +437,8 @@ namespace Chromium {
 		CSimpleStringA strUrl;
 		bool isOpenExtend = false;
 
-		auto mainUrl = m_UserMgrUrlFultureStr;
-		strUrl = detectUrls(mainUrl.GetData()).c_str();
+		auto mainUrl = ConfigManager::getInstance().m_UserMgrUrlFultureStr;
+		//strUrl = detectUrls(mainUrl.GetData()).c_str();
 		strUrl = mainUrl;
 		isOpenExtend = false;
 
@@ -428,10 +449,10 @@ namespace Chromium {
 	{
 		CSimpleStringA strUrl;
 
-		if (m_UserMgrUrlNoSidebarStr.Compare(""))
+		if (ConfigManager::getInstance().m_UserMgrUrlNoSidebarStr.Compare(""))
 		{
-			auto mainUrl = m_UserMgrUrlNoSidebarStr;
-			auto exUrl = m_UserMgrUrlNoSidebarMutiStr;
+			auto mainUrl = ConfigManager::getInstance().m_UserMgrUrlNoSidebarStr;
+			auto exUrl = ConfigManager::getInstance().m_UserMgrUrlNoSidebarMutiStr;
 			auto t_Arr = exUrl.Split('|');
 			std::vector<std::string> urlArr;
 			urlArr.emplace_back(mainUrl.GetData());
@@ -445,7 +466,7 @@ namespace Chromium {
 				strUrl = mainUrl;
 		}
 		else
-			strUrl = m_UserMgrUrlStr;
+			strUrl = ConfigManager::getInstance().m_UserMgrUrlStr;
 
 		return std::make_pair(strUrl.GetLength() > 0, strUrl.GetData());
 	}
@@ -453,24 +474,24 @@ namespace Chromium {
 
 
 	std::string CModTools::generateAdCmd(std::string AdUrl) {
-		
 #if defined(RVC_OS_LINUX)
-		return generateBrowserCMDForEverything(AdUrl, 1, g_unsafeAd);
+		return generateBrowserCMDForEverything(AdUrl, 1, ConfigManager::getInstance().m_withUnsafeAd);
 #else
         CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
         strCmdLine.Append(strChromiumPath).Append(" --url=").Append(AdUrl.c_str());
         CSimpleStringA cachePath;
         this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
-        cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "").Append((+ERR_PAGE_REASON::Ad)._to_string());
+        cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
+			Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "").Append((+ERR_PAGE_REASON::Ad)._to_string());
         strCmdLine.Append(" --cache-path=").Append(cachePath);
-        if (g_useMagic)
+        if (ConfigManager::getInstance().isUseMagic())
             strCmdLine.Append(" --magic-str=").Append(m_magicStr.c_str());
-		if (g_withMedia)
+		if (ConfigManager::getInstance().m_withMedia)
 			strCmdLine.Append(" --enable-media-stream=1 --enable-speech-input=1");
-		if (g_withConsole)
+		if (ConfigManager::getInstance().m_withConsole)
 			strCmdLine.Append(" --with-console");
-		if (g_sogouForce != 0)
-			strCmdLine.Append(" --adapt-sogou=").Append(std::to_string(g_sogouForce).c_str());
+		if (ConfigManager::getInstance().getSogouForce() != 0)
+			strCmdLine.Append(" --adapt-sogou=").Append(std::to_string(ConfigManager::getInstance().getSogouForce()).c_str());
         strCmdLine.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame  --winhttp-proxy-resolver");
         strCmdLine.Append(" --logextend=").Append((+PAGE_TYPE::Ad)._to_string());
         strCmdLine.Append(" --top=-1");
@@ -491,20 +512,21 @@ namespace Chromium {
         }
         CSimpleStringA cachePath;
         this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
-        cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "")
+        cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
+			Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "")
             .Append(isExtend ? (+ERR_PAGE_REASON::extend)._to_string() : (+ERR_PAGE_REASON::main)._to_string());
         //strCmdLine.Append(" --hide-controls=true")
         strCmdLine.Append(" --cache-path=").Append(cachePath);
         strCmdLine.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame  --winhttp-proxy-resolver --hide-tabs");
-		if (g_useMagic)
+		if (ConfigManager::getInstance().isUseMagic())
             strCmdLine.Append(" --magic-str=").Append(m_magicStr.c_str());
-		if (g_withMedia)
+		if (ConfigManager::getInstance().m_withMedia)
 			strCmdLine.Append(" --enable-media-stream=1 --enable-speech-input=1");
-		if (g_withConsole)
+		if (ConfigManager::getInstance().m_withConsole)
 			strCmdLine.Append(" --with-console");
-		if (g_sogouForce != 0)
-			strCmdLine.Append(" --adapt-sogou=").Append(std::to_string(g_sogouForce).c_str());
-        if (m_withDebugMode)
+		if (ConfigManager::getInstance().getSogouForce() != 0)
+			strCmdLine.Append(" --adapt-sogou=").Append(std::to_string(ConfigManager::getInstance().getSogouForce()).c_str());
+        if (ConfigManager::getInstance().m_withDebugMode)
             strCmdLine.Append(" --remote-debugging-port=9222");
         if (isExtend) {
             strCmdLine.Append(" --logextend=").Append((+PAGE_TYPE::extend)._to_string());
@@ -534,7 +556,9 @@ namespace Chromium {
 		strCmdLine.Append(strChromiumPath).Append(" --url=").Append(installUrl.c_str());
 		CSimpleStringA cachePath;
 		this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
-		cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "").Append((+ERR_PAGE_REASON::Ad)._to_string());
+		cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
+			Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "").
+			Append((+ERR_PAGE_REASON::Ad)._to_string());
 		strCmdLine.Append(" --cache-path=").Append(cachePath);
 		strCmdLine.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame  --winhttp-proxy-resolver --hide-tabs");
 		strCmdLine.Append(" --lang=zh-CN");//install page need language chinese
@@ -604,7 +628,7 @@ namespace Chromium {
 			cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("UOSBrowser_").Append(name.c_str());
 			strParams.Append(" --disk-cache-dir=").Append(cachePath);
 			strParams.Append(" --disk-cache-size=").Append("2147483647"); //2G
-			if (g_withMedia)
+			if (ConfigManager::getInstance().m_withMedia)
 				strParams.Append(" 	--use-fake-ui-for-media-stream");
 
 			CSimpleStringA usrDataPath(tempPath);
@@ -627,7 +651,7 @@ namespace Chromium {
 			cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("Browser_").Append(name.c_str());
 			strParams.Append(" --disk-cache-dir=").Append(cachePath);
 			strParams.Append(" --disk-cache-size=").Append("2147483647"); //2G
-			if (g_withMedia)
+			if (ConfigManager::getInstance().m_withMedia)
 				strParams.Append(" 	--use-fake-ui-for-media-stream");
 
 			CSimpleStringA usrDataPath(tempPath);
@@ -649,7 +673,8 @@ namespace Chromium {
 		}
 		CSimpleStringA cachePath;
 		this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
-		cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "").Append(name.c_str());
+		cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
+			Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "").Append(name.c_str());
 		strCmdLine.Append(" --cache-path=").Append(cachePath);
 		strCmdLine.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame  --winhttp-proxy-resolver --hide-tabs");
 		strCmdLine.Append(" --lang=zh-CN");//install page need language chinese
@@ -668,18 +693,20 @@ namespace Chromium {
         CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
         strCmdLine.Append(strChromiumPath).Append(" --url=").Append(mainUrl.c_str());
         this->m_pEntity->GetFunction()->GetPath("Temp", cachePath);
-        cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").Append(m_strCacheHead.length() > 0 ? m_strCacheHead.c_str() : "").Append(m_specialPage_temp_name.c_str());
+        cachePath.Append(CSimpleStringA(SPLIT_SLASH_STR)).Append("cefCache_").
+			Append(ConfigManager::getInstance().m_strCacheHead.length() > 0 ? ConfigManager::getInstance().m_strCacheHead.c_str() : "").
+			Append(m_specialPage_temp_name.c_str());
         //strCmdLine.Append(" --hide-controls=true")
         strCmdLine.Append(" --cache-path=").Append(cachePath);
         strCmdLine.Append(" --no-sandbox").Append(" --hide-controls --hide-overlays --hide-frame  --winhttp-proxy-resolver  --hide-tabs");;//don't use single-process, it will affect the cef log
-        if (g_useMagic)
+        if (ConfigManager::getInstance().isUseMagic())
             strCmdLine.Append(" --magic-str=").Append(m_magicStr.c_str());
-		if (g_withMedia)
+		if (ConfigManager::getInstance().m_withMedia)
 			strCmdLine.Append(" --enable-media-stream=1 --enable-speech-input=1");
-		if (g_withConsole)
+		if (ConfigManager::getInstance().m_withConsole)
 			strCmdLine.Append(" --with-console");
-		if (g_sogouForce != 0)
-			strCmdLine.Append(" --adapt-sogou=").Append(std::to_string(g_sogouForce).c_str());
+		if (ConfigManager::getInstance().getSogouForce() != 0)
+			strCmdLine.Append(" --adapt-sogou=").Append(std::to_string(ConfigManager::getInstance().getSogouForce()).c_str());
         strCmdLine.Append(" --logextend=").Append(m_specialPage_temp_name.c_str());
         if (m_specialPage_temp_size.length() > 0)
             strCmdLine.Append(" --center-size=").Append(m_specialPage_temp_size.c_str());
@@ -752,7 +779,7 @@ namespace Chromium {
             }
             strParams.Append(" --disk-cache-dir=").Append(cachePath);
             strParams.Append(" --disk-cache-size=").Append("2147483647"); //2G
-			if (g_withMedia)
+			if (ConfigManager::getInstance().m_withMedia)
 			{
 				strParams.Append(" 	--use-fake-ui-for-media-stream");
 			}
@@ -812,7 +839,7 @@ namespace Chromium {
             }
             strParams.Append(" --disk-cache-dir=").Append(cachePath);
             strParams.Append(" --disk-cache-size=").Append("2147483647"); //2G
-			if (g_withMedia)
+			if (ConfigManager::getInstance().m_withMedia)
 			{
 				strParams.Append(" 	--use-fake-ui-for-media-stream");
 			}
@@ -892,7 +919,7 @@ namespace Chromium {
 
 			if (0 == mainUrlRet.second.length())
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("StartChromiumBrowser get %s url failed!", reason._to_string());
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), 0, 2, "none", Error_Unexpect, "StartChromiumBrowser get url failed!");
 				LogWarn(Severity_High, Error_Unexpect, LOG_EVT_CHROMIUM_DETECT_MAIN_URL_EMPTY,
 						CSimpleStringA::Format("StartChromiumBrowser get %s url failed!", reason._to_string()));
 				return std::make_pair(Error_Unexpect, 0);
@@ -904,21 +931,27 @@ namespace Chromium {
 			if (Error_Succeed == openCefRet.first) {
                 LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_OPEN_MAIN_URL,
                         CSimpleStringA::Format("StartChromiumBrowser %s", mainUrlRet.second.c_str()));
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
 				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)(CSimpleStringA::Format("StartChromiumBrowser %s", mainUrlRet.second.c_str()).GetData());
+				/*
 #ifndef DEVOPS_ON_PRD
                 LogEvent(Severity_High, LOG_EVT_CHROMIUM_OPEN_MAIN_URL, CSimpleStringA::Format("当前打开的业务链接:%s", mainUrlRet.second.c_str()));
 #endif
+*/
                 return std::make_pair(Error_Succeed, openCefRet.second);
 			}
 		}
 		else if (reason._to_integral() == ERR_PAGE_REASON::extend)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("do not support freerdp");
+			LogManager::getInstance().logEntityOpenPage(reason._to_string(), 0, 2, "open", Error_Unexpect, "do not support freerdp");
 		}
 		else if (reason._to_integral() == ERR_PAGE_REASON::Ad)
 		{
 			auto AdRet = openAdPage();
-			if (!AdRet.first) DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s", AdRet.second.c_str());
+			if(AdRet.first)
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), 0, 0, "open");
+			else
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), 0, 2, "none", Error_Unexpect, AdRet.second);
 			return std::make_pair(AdRet.first ? Error_Succeed : Error_Unexpect, 0);
 		}
 		 else if (reason._to_integral() == ERR_PAGE_REASON::OutsideRequest) {
@@ -929,19 +962,27 @@ namespace Chromium {
 			auto strCmdLine = generateBrowserCMDForEverything(std::get<0>(normalParam), 3, false);
 #endif //RVC_OS_WIN
 	        auto openCefRet = openCef(strCmdLine, false);
-	        if (Error_Succeed == openCefRet.first)
-	            return std::make_pair(Error_Succeed, openCefRet.second);
-		 	else 
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open cef for %s failed: %d", reason._to_string(), openCefRet.first);
+			if (Error_Succeed == openCefRet.first)
+			{
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
+				return std::make_pair(Error_Succeed, openCefRet.second);
+			}
+			else
+			{
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "none", openCefRet.first, "");
+			}
 	    }
 		 else if (reason._to_integral() == ERR_PAGE_REASON::SpecialPageFromOtherEntity)
 		{
 			auto strCmdLine = generateSpecialPageFromOtherEntityCmd(std::get<0>(normalParam));
 			auto openCefRet = openCef(strCmdLine, false);
 			if (Error_Succeed == openCefRet.first)
+			{
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
 				return std::make_pair(Error_Succeed, openCefRet.second);
+			}
 			else
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open cef for %s failed: %d", reason._to_string(), openCefRet.first);
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "none", openCefRet.first, "");
 		}
 		 else if (reason._to_integral() == ERR_PAGE_REASON::startup)
 		{
@@ -951,25 +992,27 @@ namespace Chromium {
 #else
 			auto strCmdline = generateCommonPage(url, (+ERR_PAGE_REASON::startup)._to_string(), 900, 650, -1, -1, (int)HWND_NOTOPMOST);
 #endif
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("startup page %s", strCmdline.c_str());
 			auto openCefRet = openCef(strCmdline, false);
 			if (Error_Succeed == openCefRet.first)
+			{
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
 				return std::make_pair(Error_Succeed, openCefRet.second);
+			}
 			else
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open cef %s for %s failed: %d", (+ERR_PAGE_REASON::startup)._to_string(),
-					reason._to_string(), openCefRet.first);
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "none", openCefRet.first, "");
 		}
 		 else if (reason._to_integral() == ERR_PAGE_REASON::performance_monitor)
 		{
 			auto url = std::string(R"(file:///)") + getErrUrl(reason).second;
 			auto strCmdline = generateCommonPage(url, (+ERR_PAGE_REASON::performance_monitor)._to_string(), 900, 600, -1, -1, (int)HWND_NOTOPMOST);
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("startup page %s", strCmdline.c_str());
 			auto openCefRet = openCef(strCmdline, false);
 			if (Error_Succeed == openCefRet.first)
+			{
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
 				return std::make_pair(Error_Succeed, openCefRet.second);
+			}
 			else
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open cef %s for %s failed: %d", (+ERR_PAGE_REASON::performance_monitor)._to_string(),
-					reason._to_string(), openCefRet.first);
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "none", openCefRet.first, "");
 		}
 		 else if (reason._to_integral() == ERR_PAGE_REASON::Install)
 		{
@@ -1007,9 +1050,12 @@ namespace Chromium {
 			auto strCmdLine = generateInstallCmd(dstInstallUrl);
 			auto openCefRet = openCef(strCmdLine, false);
 			if (Error_Succeed == openCefRet.first)
+			{
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "open");
 				return std::make_pair(Error_Succeed, openCefRet.second);
+			}
 			else
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("open cef for %s failed: %d", reason._to_string(), openCefRet.first);
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), openCefRet.second, 0, "none", openCefRet.first, "");
 		}
 		else
 		{
@@ -1026,7 +1072,7 @@ namespace Chromium {
 			auto errPageUrl = GenerateErrPage(reason, normalParam, exParam);
 			if (!errPageUrl.first)
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("errPage get url failed!");
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), 2, 0, "none", Error_Unexpect, "errPage get url failed!");
 				return std::make_pair(Error_Unexpect, 0);
 			}
 			auto errPageRet = openCef(errPageUrl.second);
@@ -1038,8 +1084,10 @@ namespace Chromium {
 					|| reason._to_integral() == ERR_PAGE_REASON::warnPrompt
 					|| reason._to_integral() == ERR_PAGE_REASON::audioErr)
 					breakdownExist = true;
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), errPageRet.second, 0, "open");
 			}
-
+			else
+				LogManager::getInstance().logEntityOpenPage(reason._to_string(), errPageRet.second, 0, "none", errPageRet.first, "");
 
 			return std::make_pair(errPageRet.first, 0);
 
@@ -1150,6 +1198,7 @@ namespace Chromium {
 		return (int)mktime(&stm);
 	}
 
+
 	bool CModTools::findRestartCode(DWORD userCode) {
 		DWORD authArr_noretry_norestart[] = ERRARR_ACCESSAUTH_NORETRY_NORESTART;
 		DWORD authArr_retry_norestart[] = ERRARR_ACCESSAUTH_RETRY_NORESTART;
@@ -1411,15 +1460,11 @@ namespace Chromium {
 
 		SpIniMappingTable table;
 		// clean cache every time
-		table.AddEntryString(entityName, "UserMgrUrl", str, "");
-		table.AddEntryString(entityName, "UserMgrUrlNoSidebar", strNew, "");
-		table.AddEntryString(entityName, "UserMgrUrlNoSidebarMuti", strEx, "");
 		table.AddEntryString(entityName, "UserMgrUrlFulture", strFulture, "");
 		table.AddEntryString(entityName, "UserMgrAd", strAd, "");
 		table.AddEntryString(entityName, "CacheHead", strCacheHead, "");
 		if (Error_Succeed == table.Load(spCerConfig))
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(CSimpleString::Format("read centersetting config : UserMgrUrl-%s, UserMgrUrlNoSidebar-%s, UserMgrUrlNoSidebarMuti-%s, UserMgrUrlFulture-%s, UserMgrAd-%s",
-				str.GetData(), strNew.GetData(), strEx.GetData(), strFulture.GetData(), strAd.GetData()));
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(CSimpleString::Format("read centersetting config : UserMgrUrlFulture-%s, UserMgrAd-%s", strFulture.GetData(), strAd.GetData()));
 
 		CChromiumEntity* pChromiumEntity = reinterpret_cast<CChromiumEntity*>(m_pEntity);
 		if (pChromiumEntity != nullptr && pChromiumEntity->HasCustomMainUrl()) {
@@ -1428,7 +1473,7 @@ namespace Chromium {
 			LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_USE_CUSTOM_FULTURE_URL, strTmp);
 		}
 
-		m_strCacheHead = strCacheHead.GetData();
+		ConfigManager::getInstance().m_strCacheHead = strCacheHead.GetData();
 
 		return std::make_tuple(str, strNew, strEx, strFulture, strAd);
 	}

+ 4 - 8
Module/mod_chromium/CModTools.h

@@ -49,17 +49,14 @@ namespace Chromium {
 		void killAllChromiumByThread(int seconds);
 		bool killChromiumByName(std::string name);
 		bool RestartProxyServer();
-		void setWithMin(bool t_withMin) { m_withMin = t_withMin; };
-		void setWithClose(bool t_withClose) { m_withClose = t_withClose; };
-		void setWithDebugMode(bool t_withDebugMode) { m_withDebugMode = t_withDebugMode; };
 		std::string getMagicStr() { return m_magicStr; };
 		int getUosBrowser() { return m_UseUOSBrowser; };
 		bool IsConfigWork()
 		{
-			return m_UserMgrUrlFultureStr.GetLength() > 0;
+			return ConfigManager::getInstance().m_UserMgrUrlFultureStr.GetLength() > 0;
 		}
 		CSimpleString getFultureUrl() {
-			return m_UserMgrUrlFultureStr; 
+			return ConfigManager::getInstance().m_UserMgrUrlFultureStr;
 		}
 		void lockGuard();
 		void unlockGuard();
@@ -129,8 +126,7 @@ namespace Chromium {
 	public:
 		bool notifyExist, breakdownExist, m_isAdOpen;	//if notify exist, do not start other err page
 	private:
-		CSimpleString m_UserMgrUrlStr, m_UserMgrUrlNoSidebarStr, m_UserMgrUrlNoSidebarMutiStr, m_UserMgrUrlFultureStr, m_UserMgrAdStr;
-		bool m_withMin, m_withClose, m_withDebugMode;
+
 		std::string m_magicStr;
 		/** 0:使用CefClient,1:使用旧版UOS浏览器uos-browser-stable ;2:使用新版UOS浏览器org.deepin.browser  [Gifur@2022228]*/
 		int m_UseUOSBrowser;
@@ -139,7 +135,7 @@ namespace Chromium {
 		//for special page
 		std::string m_specialPage_temp_name, m_specialPage_temp_size, m_specialPage_temp_point;
 		int m_specialPage_temp_top;
-		std::string m_strCacheHead;
+		
 	};
 
 	template<class T>

+ 95 - 34
Module/mod_chromium/CWSCodec.cpp

@@ -399,7 +399,7 @@ namespace Chromium {
 		cJSON_AddStringToObject(ret, PARAMLIST_HEAD, dstPayLoad.c_str());
 	}
 
-	void CWSCodec::DeserializeRequestAck(CMessage & msg, std::map<int, entity_def_struct>::iterator & it, int& rpos, cJSON * ret) {
+	std::pair<bool, std::string>  CWSCodec::DeserializeRequestAck(CMessage & msg, std::map<int, entity_def_struct>::iterator & it, int& rpos, cJSON * ret) {
 		entity_def_struct* p_struct = &it->second;
 		CMedthodInterface* mi = mInterpreter->getFunctionInterface(p_struct->entity_name, p_struct->class_name, p_struct->methodID);
 		CTransStruct ts = mi->mResponseInterpreter;
@@ -407,6 +407,7 @@ namespace Chromium {
 		try
 		{
 			DeserializeBase(msg, ts, rpos, ret, !mi->m_forceNewReturn);
+			return std::make_pair(true, mi->mMethodName);
 		}
 		catch (...)
 		{
@@ -424,8 +425,9 @@ namespace Chromium {
 #else
 			throw std::exception(std::logic_error("error DeserializeRequestAck"));
 #endif
-
+			return std::make_pair(false, mi->mMethodName);
 		}
+		
 	}
 
 	void CWSCodec::DeserializeEvent(CMessage & msg,
@@ -467,7 +469,7 @@ namespace Chromium {
 	}
 
 
-	std::string CWSCodec::BufferToJson(CMessage & msg, boost::function<void(int, int)> dealErrcodeFun, int replaceTransId) {
+	std::string CWSCodec::BufferToJson(CMessage & msg, boost::function<void(int, int)> dealErrcodeFun, socket_msgInfo& msgInfo, int replaceTransId) {
 		//replaceTransId==0,MessageType为8(Event),其他都应该有值
 		int rpos = 16;
 		cJSON* ret = cJSON_CreateObject();
@@ -483,6 +485,9 @@ namespace Chromium {
 		int srcTransId = msg.getTransID();
 		// 通用反序列化
 		cJSON_AddNumberToObject(ret, "messageType", msg.getMessageType());
+		msgInfo.messageType = msg.getMessageType();
+		msgInfo.inner_transID = srcTransId;
+		msgInfo.msgBytes = msg.printfHEX();
 		switch (msg.getMessageType()) {
 		case MessageType::RequestAck: //PKT_TYPE_REQACK
 			cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
@@ -507,7 +512,13 @@ namespace Chromium {
 				}
 					
 				cJSON_AddStringToObject(ret, "errorMsg", userCodeInfo.second.errMsg.c_str());
+
+				msgInfo.userCodeVal = errorCode;
+				msgInfo.userCode = userCodeInfo.second.userCode;
+				msgInfo.rtaCode = userCodeInfo.second.VTMCode;
+				msgInfo.warnMsg = userCodeInfo.second.errMsg;
 			}
+			msgInfo.sessionId = msg.getSessionID();
 			break;
 		case MessageType::SessionAck:
 			cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
@@ -524,7 +535,13 @@ namespace Chromium {
 				}
 
 				cJSON_AddStringToObject(ret, "errorMsg", userCodeInfo.second.errMsg.c_str());
+				msgInfo.userCodeVal = errorCode;
+				msgInfo.userCode = userCodeInfo.second.userCode;
+				msgInfo.rtaCode = userCodeInfo.second.VTMCode;
+				msgInfo.warnMsg = userCodeInfo.second.errMsg;
 			}
+			msgInfo.inner_transID = srcTransId;
+			msgInfo.sessionId = msg.getSessionID();
 			break;
 		case MessageType::Event:
 			cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
@@ -546,6 +563,11 @@ namespace Chromium {
 					cJSON_AddStringToObject(ret, "rtaCode", userCodeInfo.second.VTMCode.c_str());
 				}
 				cJSON_AddStringToObject(ret, "errorMsg", userCodeInfo.second.errMsg.c_str());
+
+				msgInfo.userCodeVal = errorCode;
+				msgInfo.userCode = userCodeInfo.second.userCode;
+				msgInfo.rtaCode = userCodeInfo.second.VTMCode;
+				msgInfo.warnMsg = userCodeInfo.second.errMsg;
 			}
 			break;
 		case MessageType::GetVarAck:
@@ -567,7 +589,9 @@ namespace Chromium {
 			, replaceTransId, errorCode, SpStrError((ErrorCodeEnum)errorCode));
 
 		if (Error_Succeed != errorCode)
+		{
 			dealErrcodeFun(errorCode, srcTransId);
+		}
 
 		if(replaceTransId) msg.setTransID(replaceTransId);
 		// RequestAck 返回的有问题 要删除对应的回调list项
@@ -612,9 +636,12 @@ namespace Chromium {
 				free(str);
 				return s;
 			}
-			DeserializeRequestAck(msg, it, rpos, ret);
+			auto deserializeRet = DeserializeRequestAck(msg, it, rpos, ret);
+			msgInfo.entityName = it->second.entity_name;
+			msgInfo.className = it->second.class_name;
+			msgInfo.functionName = deserializeRet.second;			
 			
-			m_AckCallbackList.erase(it);
+			m_AckCallbackList.erase(it);//remove callback
 		}
 		else if (MessageType::Event == msg.getMessageType())
 		{
@@ -638,11 +665,12 @@ namespace Chromium {
 		cJSON_Delete(ret);
 		std::string s(str);
 		free(str);
+		msgInfo.payLoad = s;
 		//delete []str;
 		return s;
 	}
 
-	std::pair<int, CMessage*> CWSCodec::JsonToBuffer(std::string strJson) {
+	std::pair<int, CMessage*> CWSCodec::JsonToBuffer(std::string strJson, ws_msgInfo &msgInfo) {
 		//int pos = strJson.find('}'); //try to test json with linkInfo
 		//strJson = strJson.substr(0, pos) + ",\"BussinessId\":\"DoInit\",\"TraceId\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\"SpanId\":\"AAAAAAAAAAAAAAAA\",\"ParentSpanId\":\"AAAAAAAAAAAAAAAA\",\"Timestamp\":\"\",\"ReservedControl\":0}";
 		cJSON* pJson = cJSON_Parse(strJson.c_str());
@@ -653,6 +681,7 @@ namespace Chromium {
 
 		// 查找序列化结构 有用户定义数据部分的只有 Info 和 Request
 		CMedthodInterface* mi = NULL;
+		msgInfo.messageType = messageType;
 		if (MessageType::Request == messageType || MessageType::Info == messageType)
 		{
 			entity_def_struct st = { 0 };
@@ -665,8 +694,13 @@ namespace Chromium {
 				return std::make_pair(messageType, nullptr);
 			}
 			else
+			{
+				msgInfo.entityName = st.entity_name;
+				msgInfo.className = st.class_name;
+				msgInfo.functionName = mi->mMethodName;
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("JsonToBuffer parse method success, entityName:%s, className:%s, methodID:%d, DstMethodName:%s, DstMethodParamNum:%d",
 					st.entity_name, st.class_name, st.methodID, mi->mMethodName.c_str(), mi->mRequestInterpreter.mParamList.size());	//如出错,可对比方法名和变量数量
+			}
 			if (MessageType::Request == messageType) {
 				// 维护回调列表 Request
 				auto transid = json_deal::getIntergerFromCjsonObj(pJson, "transId");
@@ -675,6 +709,7 @@ namespace Chromium {
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CWSCodec::JsonToBuffer get transId failed");
 					return std::make_pair(messageType, nullptr);
 				}
+
 				m_ackMutex.lock();
 				m_AckCallbackList.insert(std::pair<int, entity_def_struct>(transid.second, st));
 				m_ackMutex.unlock();
@@ -702,7 +737,11 @@ namespace Chromium {
 			{
 				auto rc = SpSendBroadcast(m_pFunc, eMsg_ChromiumBroadcast, eMsgSig_ChromiumBroadcast, e);
 				if (Error_Succeed != rc)
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Broadcast Msg Error:%d", rc);
+				{
+					LogManager::getInstance().logWebSocketBroadcast(msgInfo.hdlId, "", 2, "none", msgInfo.payLoad, rc, "Broadcast Msg Error");
+				}					
+				else
+					LogManager::getInstance().logWebSocketBroadcast(msgInfo.hdlId, "", 0, "send", msgInfo.payLoad);
 			}
 			else
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("json is too long, do not send out sp broadcast!");
@@ -750,41 +789,41 @@ namespace Chromium {
 		switch (messageType) {
 			//info和request由于有其他信息,需要在数据中获得context
 		case MessageType::Info:
-			SerializeInfo(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeInfo(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			break;
 		case MessageType::Request:
-			SerializeRequest(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeRequest(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			break;
 		case MessageType::BeginSession:
-			SerializeBeginSession(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeBeginSession(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case MessageType::EndSession:
-			SerializeEndSession(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeEndSession(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case MessageType::Register:
-			SerializeRegister(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeRegister(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case MessageType::Unregister:
-			SerializeUnregister(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeUnregister(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case MessageType::LogEventMsgType:
-			SerializeLogEvent(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeLogEvent(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case MessageType::LogWarnMsgType:
-			SerializeLogWarn(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeLogWarn(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case MessageType::SetVarReq:
-			SerializeSetVarReq(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeSetVarReq(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		case MessageType::GetVarReq:
-			SerializeGetVarReq(pJson, data, &wpos, &capacity, mi, errmsg);
+			SerializeGetVarReq(pJson, data, &wpos, &capacity, mi, errmsg, msgInfo);
 			SerializeLinkInfo(pJson, data, &wpos, &capacity, errmsg);
 			break;
 		default:
@@ -815,7 +854,6 @@ namespace Chromium {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("string too long, discard");
 			return std::make_pair(messageType, nullptr);
 		}
-
 		return std::make_pair(messageType, &m_SerializeCache);
 	}
 
@@ -868,7 +906,7 @@ namespace Chromium {
 	}
 
 
-	void CWSCodec::SerializeInfo(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
+	void CWSCodec::SerializeInfo(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo) {
 
 		auto sessionID = json_deal::getIntergerFromCjsonObj(js, "sessionID");
 		if (sessionID.first == false)
@@ -921,13 +959,19 @@ namespace Chromium {
 				{
 #endif
 					if (paramInfo.mName == repeatName)
-						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("request参数名字重复, MethodName:%s, repeatParam:%s", pI->mMethodName.c_str(), paramInfo.mName.c_str());
+					{
+						CSimpleStringA warnStr = CSimpleString::Format("request参数名字重复, MethodName:%s, repeatParam:%s"
+							, pI->mMethodName.c_str(), paramInfo.mName.c_str());
+						msgInfo.warnMsg = warnStr;
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(warnStr.GetData());
+					}
 				}
 			}
 			//如果存在重复,可能数据已经脏了,所以也不需要作删除参数处理
 
 			paramJs = js;
 		}
+		msgInfo.functionName = pI->mMethodName;
 		GeneralSerialize(paramJs, data, wpos, capacity, pI, errmsg);
 
 		return;
@@ -961,21 +1005,23 @@ namespace Chromium {
 
 	}
 
-	void CWSCodec::SerializeBeginSession(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
+	void CWSCodec::SerializeBeginSession(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo) {
 		int i4 = 0;
 		GetCJsonIntergerValue(js, "transID", i4, errmsg);
 		WriteT(data, i4, wpos, capacity);
 		CSimpleStringA s = "";
 		GetCJsonObjectValue(js, "entity", s, errmsg);
 		WriteT(data, s, wpos, capacity);
+		msgInfo.entityName = s;
 		GetCJsonObjectValue(js, "method", s, errmsg);
 		WriteT(data, s, wpos, capacity);
+		msgInfo.functionName = s;
 		GetCJsonObjectValue(js, "class", s, errmsg);
 		WriteT(data, s, wpos, capacity);
-
+		msgInfo.className = s;
 	}
 
-	void CWSCodec::SerializeEndSession(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) 
+	void CWSCodec::SerializeEndSession(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo)
 	{
 		auto sessionID = json_deal::getIntergerFromCjsonObj(js, "sessionID");
 		if (sessionID.first == false)
@@ -986,7 +1032,7 @@ namespace Chromium {
 		WriteT(data, sessionID.second, wpos, capacity);
 	}
 
-	void CWSCodec::SerializeRequest(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) 
+	void CWSCodec::SerializeRequest(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo)
 	{
 
 		auto transID = json_deal::getIntergerFromCjsonObj(js, "transID");
@@ -1026,6 +1072,7 @@ namespace Chromium {
 		WriteT(data, signature.second, wpos, capacity);
 		WriteT(data, timeout.second, wpos, capacity);
 		SerializeLinkInfo(js, data, wpos, capacity, errmsg);
+		msgInfo.timeout = timeout.second;
 
 		if (NULL == pI)
 		{
@@ -1052,16 +1099,21 @@ namespace Chromium {
 				{
 #endif
 					if (paramInfo.mName == repeatName)
-						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("request参数名字重复, MethodName:%s, repeatParam:%s", pI->mMethodName.c_str(), paramInfo.mName.c_str());
+					{
+						CSimpleStringA warnStr = CSimpleString::Format("request参数名字重复, MethodName:%s, repeatParam:%s", pI->mMethodName.c_str(), paramInfo.mName.c_str());
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(warnStr.GetData());
+						msgInfo.warnMsg = warnStr;
+					}
+						
 				}
 			}
 			//如果存在重复,可能数据已经脏了,所以也不需要作删除参数处理
 			paramJs = js;
-				}
+		}
 		GeneralSerialize(paramJs, data, wpos, capacity, pI, errmsg);
-			}
+	}
 
-	void CWSCodec::SerializeRegister(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
+	void CWSCodec::SerializeRegister(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo) {
 
 		auto transID = json_deal::getIntergerFromCjsonObj(js, "transID");
 		if (transID.first == false)
@@ -1075,14 +1127,14 @@ namespace Chromium {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CWSCodec::SerializeRegister get entity failed");
 			return;
 		}
-
+		msgInfo.entityName = entity.second;
 		WriteT(data, transID.second, wpos, capacity);
 		WriteT(data, entity.second, wpos, capacity);
 		CSimpleStringA tmp = "";
 		WriteT(data, tmp, wpos, capacity);//订阅实体全局,不限定方法
 	}
 
-	void CWSCodec::SerializeUnregister(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
+	void CWSCodec::SerializeUnregister(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo) {
 		auto transID = json_deal::getIntergerFromCjsonObj(js, "transID");
 		if (transID.first == false)
 		{
@@ -1093,7 +1145,7 @@ namespace Chromium {
 		WriteT(data, transID.second, wpos, capacity);
 	}
 
-	void CWSCodec::SerializeLogEvent(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
+	void CWSCodec::SerializeLogEvent(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo) {
 
 		auto securityLevel = json_deal::getIntergerFromCjsonObj(js, "securityLevel");
 		if (securityLevel.first == false)
@@ -1117,6 +1169,9 @@ namespace Chromium {
 		WriteT(data, securityLevel.second, wpos, capacity);
 		WriteT(data, eventCode.second, wpos, capacity);
 		WriteT(data, message.second, wpos, capacity);
+		msgInfo.securityLevel = securityLevel.second;
+		msgInfo.eventCode = eventCode.second;
+		msgInfo.message = message.second;
 	}
 
 	inline CSimpleStringA DWORD2Hex(DWORD cur)
@@ -1124,7 +1179,7 @@ namespace Chromium {
 		return CSimpleStringA::Format("%X", cur);
 	}
 
-	void CWSCodec::SerializeLogWarn(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
+	void CWSCodec::SerializeLogWarn(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo) {
 		auto securityLevel = json_deal::getIntergerFromCjsonObj(js, "securityLevel");
 		if (securityLevel.first == false)
 		{
@@ -1147,13 +1202,16 @@ namespace Chromium {
 		WriteT(data, securityLevel.second, wpos, capacity);
 		WriteT(data, eventCode.second, wpos, capacity);
 		WriteT(data, message.second, wpos, capacity);
+		msgInfo.securityLevel = securityLevel.second;
+		msgInfo.eventCode = eventCode.second;
+		msgInfo.message = message.second;
 
 		DbgWithLink(securityLevel.second == SeverityLevelEnum::Severity_Low ? LOG_LEVEL_INFO : LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)
 			.setResultCode(DWORD2Hex(eventCode.second).GetData())
 			("receive warn from web, Warn: {%s}(sc=0x%X, uc=0x%X)", message.second.GetData(), 0, eventCode.second);
 	}
 
-	void CWSCodec::SerializeSetVarReq(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg)
+	void CWSCodec::SerializeSetVarReq(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo)
 	{
 		auto transID = json_deal::getIntergerFromCjsonObj(js, "transID");
 		if (transID.first == false)
@@ -1177,6 +1235,8 @@ namespace Chromium {
 		WriteT(data, transID.second, wpos, capacity);
 		WriteT(data, name.second, wpos, capacity);
 		WriteT(data, value.second, wpos, capacity);
+		msgInfo.name = name.second;
+		msgInfo.value = value.second;
 	}
 
 	using namespace std;
@@ -1218,7 +1278,7 @@ namespace Chromium {
 		return result;
 	}
 
-	void CWSCodec::SerializeGetVarReq(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
+	void CWSCodec::SerializeGetVarReq(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg, ws_msgInfo& msgInfo) {
 		auto  transID = json_deal::getIntergerFromCjsonObj(js, "transID");
 		if (transID.first == false)
 		{
@@ -1234,6 +1294,7 @@ namespace Chromium {
 
 		WriteT(data, transID.second, wpos, capacity);
 		WriteT(data, name.second, wpos, capacity);
+		msgInfo.name = name.second;
 	}
 
 

+ 64 - 13
Module/mod_chromium/CWSCodec.h

@@ -14,7 +14,58 @@
 #include <boost/thread/mutex.hpp>
 
 
+class ws_msgInfo {
+public:
+	std::string payLoad;
+	int transId;
+	int messageType;
+	unsigned int hdlId;
 
+	std::string entityName;
+	std::string className;
+	std::string functionName;
+
+	std::string warnMsg;
+
+	int timeout;
+	std::string name;
+	std::string value;
+
+	int securityLevel;
+	int eventCode;
+	std::string message;
+
+	ws_msgInfo(std::string t_payLoad, int t_transId, int t_messageType)
+		: payLoad(t_payLoad), transId(t_transId), messageType(t_messageType) {};
+};
+
+class socket_msgInfo {
+public:
+	int web_transID;
+	int inner_transID;
+	int sessionId;
+	int messageType;
+	unsigned int hdlId;
+
+	std::string entityName;
+	std::string className;
+	std::string functionName;
+
+	long userCodeVal;
+	std::string userCode;
+	std::string rtaCode;
+	std::string warnMsg;
+
+	int timeout;
+	std::string name;
+	std::string value;
+
+	std::string payLoad;
+	std::string msgBytes;
+
+	socket_msgInfo(int t_web_transID, int t_inner_transID, int t_sessionId)
+		: web_transID(t_web_transID), inner_transID(t_inner_transID), sessionId(t_sessionId) {};
+};
 
 
 namespace Chromium {
@@ -33,15 +84,15 @@ namespace Chromium {
 		void init(const char* xmlPath);
 		void setEntityHandler(CSmartPointer<IEntityFunction> p);
 
-		std::pair<int, CMessage*> JsonToBuffer(std::string strJson);
-		std::string BufferToJson(CMessage& msg, boost::function<void(int,int)> dealErrcodeFun, int replaceTransId = 0);
+		std::pair<int, CMessage*> JsonToBuffer(std::string strJson, ws_msgInfo& msgInf);
+		std::string BufferToJson(CMessage& msg, boost::function<void(int,int)> dealErrcodeFun, socket_msgInfo &msgInfo, int replaceTransId = 0);
 
 		std::string GetEntityName(std::string strJson);
 		std::string GetClassName(std::string strJson);
 
 		bool checkEntityHasService(std::string entityName);
 	private:
-		void DeserializeRequestAck(CMessage& msg, std::map<int, entity_def_struct>::iterator& it, int& rpos, cJSON* ret);
+		std::pair<bool, std::string> DeserializeRequestAck(CMessage& msg, std::map<int, entity_def_struct>::iterator& it, int& rpos, cJSON* ret);
 		void DeserializeEvent(CMessage& msg, std::vector<CMedthodInterface>* list, int& rpos, cJSON* ret);
 		void DeserializeBase(CMessage& msg, CTransStruct& ts, int& rpos, cJSON* ret, bool writeToOldParam);	//解析json->buffer
 
@@ -49,17 +100,17 @@ namespace Chromium {
 
 		std::pair<bool, std::tuple<CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, int>> GetLinkContex(cJSON* js, char* data, char* errmsg);
 
-		void SerializeInfo(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
-		void SerializeBeginSession(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
-		void SerializeEndSession(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
-		void SerializeRequest(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
-		void SerializeRegister(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
-		void SerializeUnregister(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
+		void SerializeInfo(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
+		void SerializeBeginSession(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
+		void SerializeEndSession(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
+		void SerializeRequest(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
+		void SerializeRegister(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
+		void SerializeUnregister(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
 		/*	void SerializeEvent(cJSON* js, char* data, int* wpos, int* capacity, unsigned int* len);*/
-		void SerializeLogEvent(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
-		void SerializeLogWarn(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
-		void SerializeSetVarReq(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
-		void SerializeGetVarReq(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
+		void SerializeLogEvent(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
+		void SerializeLogWarn(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
+		void SerializeSetVarReq(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
+		void SerializeGetVarReq(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg, ws_msgInfo& msgInfo);
 		void GeneralSerialize(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg);
 		void SerializeLinkInfo(cJSON* js, char* data, int* wpos, int* capacity, char* errmsg);
 

+ 231 - 129
Module/mod_chromium/CWebsocketServer.cpp

@@ -69,8 +69,8 @@ namespace Chromium {
 	{
 		//存储的消息应具备时效性,保证一个hdl只有一个记录的消息
 
-		auto it = m_msg_pool.find(entityName);
-		if (it != m_msg_pool.end())
+		auto it = ConfigManager::getInstance().m_msg_pool.find(entityName);
+		if (it != ConfigManager::getInstance().m_msg_pool.end())
 		{
 			auto& curArr = it->second;
 			for (auto i = curArr.begin(); i != curArr.end(); i++)
@@ -88,38 +88,38 @@ namespace Chromium {
 		{
 			std::vector<std::pair<websocketpp::connection_hdl, std::string>> t_saveMsgs;
 			t_saveMsgs.emplace_back(std::make_pair(hdl, payload));
-			m_msg_pool.insert(std::make_pair(entityName, t_saveMsgs));
+			ConfigManager::getInstance().m_msg_pool.insert(std::make_pair(entityName, t_saveMsgs));
 		}
 	}
 
 	void CWebsocketServer::updateNotifyPool(unsigned hdl, unsigned transId)
 	{
-		auto it = m_notifyPool.find(hdl);
-		if (it != m_notifyPool.end())
+		auto it = ConfigManager::getInstance().m_notifyPool.find(hdl);
+		if (it != ConfigManager::getInstance().m_notifyPool.end())
 		{
 			if (transId == 0)
-				m_notifyPool.erase(it);
+				ConfigManager::getInstance().m_notifyPool.erase(it);
 			else
 				it->second = transId;
 		}
 		else if (transId != 0)
-			m_notifyPool.insert(std::make_pair(hdl, transId));
+			ConfigManager::getInstance().m_notifyPool.insert(std::make_pair(hdl, transId));
 
 
 	}
 
 	void CWebsocketServer::storeEntityWithCLass(std::string entityName, std::string entityClass)
 	{
-		if (m_entityAndClass.end() == m_entityAndClass.find(entityName)) {
-			m_entityAndClass.insert(std::make_pair(entityName, entityClass));	//not exist
+		if (ConfigManager::getInstance().m_entityAndClass.end() == ConfigManager::getInstance().m_entityAndClass.find(entityName)) {
+			ConfigManager::getInstance().m_entityAndClass.insert(std::make_pair(entityName, entityClass));	//not exist
 			//DbgEx("storeEntityWithCLass, %s:%s", entityName.c_str(), entityClass.c_str());
 		}
 	}
 
 	std::pair<bool, std::string> CWebsocketServer::getEntityClass(std::string entityName)
 	{
-		auto it = m_entityAndClass.find(entityName);
-		if (m_entityAndClass.end() == it)
+		auto it = ConfigManager::getInstance().m_entityAndClass.find(entityName);
+		if (ConfigManager::getInstance().m_entityAndClass.end() == it)
 			return std::make_pair(false, "");
 		else
 			return std::make_pair(true, it->second);
@@ -128,7 +128,8 @@ namespace Chromium {
 	void CWebsocketServer::do_sendJsonStartSession(std::string entityName, std::string entityClass)
 	{
 		auto startSessionReq = m_esm->GetStartSessionRequest(entityName, entityClass);
-		auto sessionBuf = this->m_serializer->JsonToBuffer(startSessionReq.second).second;
+		ws_msgInfo cur(startSessionReq.second, 0, 0);
+		auto sessionBuf = this->m_serializer->JsonToBuffer(startSessionReq.second, cur).second;
 		if (nullptr == sessionBuf)
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("JsonToBuffer return NULL !");
@@ -140,9 +141,13 @@ namespace Chromium {
 		if (m_esm->checkBeginSession(entityName)) {
 			m_esm->updateBeginSessionTime(entityName);
 			WriteToFramework(sessionBuf);
+			LogManager::getInstance().logWebSocketBeginSession(-1, -1, cur.transId, cur.entityName, cur.className, 0, "auto_send", cur.payLoad);
 		}
 		else
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Already begin session in 5s, %s", entityName.c_str());
+		{
+			LogManager::getInstance().logWebSocketBeginSession(-1, -1, cur.transId, cur.entityName, cur.className, 1, "none", cur.payLoad,
+				Error_Duplication, "already begin session in 5 seconds");
+		}
 	}
 
 	void CWebsocketServer::WriteToFramework(CMessage* msg)
@@ -224,7 +229,7 @@ namespace Chromium {
 				break;
 			}
 			DbgWithLink(changeMessageTypeToLogLevel(messageType), LOG_TYPE_BUSINESS_SYSTEM)
-				.withLogProducer(logProducer).setAPI("logMsg").withExtendLog(false).setResultMsg(msg.second.GetData())();
+				.withLogProducer(ConfigManager::getInstance().getLogProducer()).setAPI("logMsg").withExtendLog(false).setResultMsg(msg.second.GetData())();
 			break;
 		}
 		case METHOD_SYSTEM_DETAIL_LOG_DEBUG:
@@ -263,7 +268,8 @@ namespace Chromium {
 			}
 
 			//create the logProduer if not exist
-			if (g_logProducerArr.find(t_entityName.second.GetData()) == g_logProducerArr.end())//can not find the logProducer
+			auto t_logProducerArr = ConfigManager::getInstance().getLogProducerArr();
+			if (t_logProducerArr.find(t_entityName.second.GetData()) == t_logProducerArr.end())//can not find the logProducer
 			{
 				auto t_CmptId = json_deal::getStringFromCjsonObj(pJson.get(), msg_CmptId);
 				auto t_CmptName = json_deal::getStringFromCjsonObj(pJson.get(), msg_CmptName);
@@ -278,19 +284,19 @@ namespace Chromium {
 				else
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create producer sueccess, entityName:%s, CmptId:%s, t_CmptName:%s"
 						, t_entityName.second.GetData(), t_CmptId.second.GetData(), t_CmptName.second.GetData());
-				g_logProducerArr.insert(std::make_pair(t_entityName.second.GetData(), t_producer));
+				t_logProducerArr.insert(std::make_pair(t_entityName.second.GetData(), t_producer));
 			}
-			auto t_logProducer = g_logProducerArr[t_entityName.second.GetData()];
+			auto t_logProducer = t_logProducerArr[t_entityName.second.GetData()];
 
 
 			auto logType = json_deal::getStringFromCjsonObj(pJson.get(), msg_logType);//it can be equal to Sys/User/VTMWeb
-			LOG_TYPE_E t_type = LOG_TYPE_SYSTEM;
+			LOG_TYPE_E t_type = LOG_TYPE_BUSINESS_SYSTEM;
 			if (logType.second.Compare("User", true) == 0)
-				t_type = LOG_TYPE_USER;
+				t_type = LOG_TYPE_BUSINESS_USER;
 			else if (logType.second.Compare("VTMWeb", true) == 0)
 				t_type = LOG_TYPE_VTMWEB;
 			else if(logType.second.Compare("Sys", true) == 0)
-				t_type = LOG_TYPE_SYSTEM;
+				t_type = LOG_TYPE_BUSINESS_SYSTEM;
 
 			//通过变量方式进行处理
 			DbgWithLink t_obj(changeMessageTypeToLogLevel(messageType), t_type);
@@ -478,25 +484,29 @@ namespace Chromium {
 
 		std::string js = CSimpleString::Format("{\"messageType\":5,\"errorCode\":\"%d\",\"errorMsg\":\"1537 session break\",\"sessionID\":-1,\"transID\":125}", Error_DevNotAvailable).GetData();
 
-		js = restroreTransId(js);
+		auto dst_js = restroreTransId(js);
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("deal_sessionBreakMsg, len:%d, srcPayLoad:%s, ret:%s", payload.length()
-			, payload.length() > 800 ? payload.substr(0, 800).append("...").c_str() : payload.c_str(), js.c_str());
+			, payload.length() > 800 ? payload.substr(0, 800).append("...").c_str() : payload.c_str(), dst_js.second.c_str());
 		do_send_msg(hdl, js);
 	}
 
 
-	void CWebsocketServer::deal_msg(std::string& payload, websocketpp::connection_hdl hdl)
+	void CWebsocketServer::deal_msg(std::string& payload, websocketpp::connection_hdl hdl, int srcTransId)
 	{
 		boost::lock_guard<boost::mutex> lock(m_dealMsgLock);	//在buffer和json处理时,deal_msg会调用多次,导致transId存在重复可能
-		auto ret = this->m_serializer->JsonToBuffer(payload);
+		ws_msgInfo cur(payload, 0, 0);
+		cur.hdlId = (long)hdl.lock().get();
+		cur.transId = srcTransId;
+		auto ret = this->m_serializer->JsonToBuffer(payload, cur);
 		CMessage* p = ret.second;
-		if (ret.first == Broadcast && nullptr == p)
+		
+		if (ret.first == MessageType::Broadcast && nullptr == p)
 		{
 			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("JsonToBuffer return NULL, perhaps an event happened");
 			do_sendJsonBroadcast(payload);
 			return;
 		}
-		else if(ret.first == Request || ret.first == Info)
+		else if(ret.first == MessageType::Request || ret.first == MessageType::Info)
 		{
 			if(nullptr == p)
 			{
@@ -509,9 +519,9 @@ namespace Chromium {
 				if (transIdJson.first)
 				{
 					std::string errRetJs = "{\"messageType\":4,\"transID\":" + std::to_string((LONGLONG)transIdJson.second) + ",\"errorCode\":103,\"errorMsg\":\"can not find entity or class!\"}";
-					auto js = restroreTransId(errRetJs);
+					auto dst_js = restroreTransId(errRetJs);
 					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("deal_msg %s get null msg, ret:%s", ret.first == Request ? "Request" : "Info", errRetJs.c_str());
-					do_send_msg(hdl, js);
+					do_send_msg(hdl, dst_js.second);
 				}
 				else
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CWebsocketServer::deal_msg get transIdJson failed");
@@ -519,7 +529,7 @@ namespace Chromium {
 				return;
 			}
 		}
-		else if (ret.first == GetSession)
+		else if (ret.first == MessageType::GetSession)
 		{
 			std::shared_ptr<cJSON> pJson(cJSON_Parse(payload.c_str()), [](cJSON* p) {
 				if (nullptr != p)
@@ -536,19 +546,36 @@ namespace Chromium {
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("sessionJson:%s", sessionRet.second.c_str());
 				if (sessionRet.first)
 				{
-					auto js = restroreTransId(sessionRet.second);
-					do_send_msg(hdl, js);
+					auto dst_js = restroreTransId(sessionRet.second);
+					do_send_msg(hdl, dst_js.second);
 				}
 			}
 			else
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CWebsocketServer::deal_msg get transIdJson failed");
 			return;
 		}
-		else if (ret.first == BeginSession)
+		else if (ret.first == MessageType::WEB_GET_HTTP_HEADER)
+		{
+			CSystemStaticInfo staticInfo;
+			m_pEntity->GetFunction()->GetSystemStaticInfo(staticInfo);
+
+			std::string dst_js = "";
+
+			if (staticInfo.strTerminalID.GetLength() == 0) // terminalno is empty
+				dst_js = "";
+			else
+				dst_js = m_esm->Get_getconfig_ack(staticInfo.strTerminalID.GetData()).second;
+			do_send_msg(hdl, dst_js);
+
+			
+		}
+		else if (ret.first == MessageType::BeginSession)
 			storeEntityWithCLass(m_serializer->GetEntityName(payload), m_serializer->GetClassName(payload));
 
+		
+
 		// Try to manage entity session
-		RequestProcessType processType = this->m_esm->RequestProcess(p, m_serializer->GetEntityName(payload), (long)hdl.lock().get());
+		RequestProcessType processType = this->m_esm->RequestProcess(p, m_serializer->GetEntityName(payload), (long)hdl.lock().get(), cur);
 
 		switch (processType)
 		{
@@ -556,7 +583,6 @@ namespace Chromium {
 			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("do PROCESS_NOTHING");
 			return;
 		case Chromium::PROCESS_SEND:
-			//DbgEx("do PROCESS_SEND");
 			if (nullptr != p)
 				WriteToFramework(p);
 			break;
@@ -577,8 +603,8 @@ namespace Chromium {
 		{
 			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("do PROCESS_FINDSESSION");
 			std::string js = m_esm->GetStartSessionAck(p, m_serializer->GetEntityName(payload));
-			js = restroreTransId(js);
-			do_send_msg(hdl, js);
+			auto dst_js = restroreTransId(js);
+			do_send_msg(hdl, dst_js.second);
 		}
 		break;
 		case Chromium::PROCESS_RECORDMSG:
@@ -613,7 +639,7 @@ namespace Chromium {
 			return;
 		}
 
-		switch (m_ws_sm2_hdls_manager[curHdl]->getState())
+		switch (ConfigManager::getInstance().m_ws_sm2_hdls_manager[curHdl]->getState())
 		{
 		case SM2ProtocolState::WAIT_KEY_EXCHANGE:
 		{
@@ -623,8 +649,8 @@ namespace Chromium {
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("pubKey == null");
 				return;
 			}
-			m_ws_sm2_hdls_manager[curHdl]->setOpposite(pubKey.second.GetData());
-			auto encPub = m_ws_sm2_hdls_manager[curHdl]->GenerateEncPubKey();
+			ConfigManager::getInstance().m_ws_sm2_hdls_manager[curHdl]->setOpposite(pubKey.second.GetData());
+			auto encPub = ConfigManager::getInstance().m_ws_sm2_hdls_manager[curHdl]->GenerateEncPubKey();
 			if (!encPub.first)
 			{
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CWebsocketServer -> message_handler_ws_sm2 err:%s", encPub.second.c_str());
@@ -634,7 +660,7 @@ namespace Chromium {
 			std::string js = CSimpleString::Format("{\"encPub\":\"%s\"}", encPub.second.c_str()).GetData();
 			//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CWebsocketServer -> message_handler_ws_sm2 send js:%s", js.c_str());
 			do_send_msg(hdl, js);
-			m_ws_sm2_hdls_manager[curHdl]->setState(SM2ProtocolState::DATA_EXCHANGE);
+			ConfigManager::getInstance().m_ws_sm2_hdls_manager[curHdl]->setState(SM2ProtocolState::DATA_EXCHANGE);
 		}
 		break;
 		case SM2ProtocolState::DATA_EXCHANGE:
@@ -653,7 +679,7 @@ namespace Chromium {
 				return;
 			}
 
-			auto decMsg = m_ws_sm2_hdls_manager[curHdl]->DecryptMsg(sign.second.GetData(), msgData.second.GetData());
+			auto decMsg = ConfigManager::getInstance().m_ws_sm2_hdls_manager[curHdl]->DecryptMsg(sign.second.GetData(), msgData.second.GetData());
 			if(decMsg.first == false)
 			{
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("DecryptMsg err:%s", decMsg.second.c_str());
@@ -708,9 +734,10 @@ namespace Chromium {
 			}
 
 			auto transIdJson = cJSON_GetObjectItem(pJson.get(), "transId");//不做相关改造,因为这里还使用了set
+			int transid = 0;
 			if (transIdJson != nullptr)
 			{
-				int transid = transIdJson->valueint;
+				transid = transIdJson->valueint;
 				int modifyT = t_hdlArr[hdlPos] << 24;
 				int dstTransId = transid ^ modifyT;
 				cJSON_SetIntValue(transIdJson, dstTransId);
@@ -728,16 +755,20 @@ namespace Chromium {
 			delete[]unformateStr;
 
 			auto messageType = messageTypeJson.second;
-			if (messageType < WEB_CHROMIUM_MSG_BEGIN)
+			if (messageType < MessageType::WEB_SPECICAL_MANAGE_END)
 			{
+				/*
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("deal_msg, messageType:%d(%s), len:%d, payload:%s", messageType, GetMessageTypeString(messageType).c_str(),
 					payload.length(), payload.length() > 800 ? payload.substr(0, 800).append("...").c_str() : payload.c_str());
-				deal_msg(dstPayLoad, hdl);
+					*/
+				deal_msg(dstPayLoad, hdl, transid);
 			}				
 			else if (messageType > WEB_CHROMIUM_MSG_BEGIN && messageType < WEB_CHROMIUM_MSG_END)
 			{
+				/*
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("deal_webchromium_msg, messageType:%d(%s), len:%d, payload:%s", messageType, GetMessageTypeString(messageType).c_str(),
  payload.length(), payload.length() > 800 ? payload.substr(0, 800).append("...").c_str() : payload.c_str());
+ */
 				deal_webchromium_msg(dstPayLoad, hdl, messageType);
 			}				
 			else if (messageType > METHOD_SYSTEM_START && messageType < METHOD_SYSTEM_END)
@@ -749,61 +780,64 @@ namespace Chromium {
 		dealMsgThread.join();
 	}
 
-	std::string CWebsocketServer::restroreTransId(std::string payLoad)
+	std::pair<int, std::string> CWebsocketServer::restroreTransId(std::string payLoad)
 	{
 		std::shared_ptr<cJSON> pJson(cJSON_Parse(payLoad.c_str()), [](cJSON* p) {
 			if (nullptr != p)
 				cJSON_Delete(p);
 			});
 		auto transIdJson = cJSON_GetObjectItem(pJson.get(), "transId");//不改动,因为需要set
+		int dstTransId = 0;
 		if (transIdJson != nullptr)
 		{
 			int transid = transIdJson->valueint;
-			int dstTransId = transid & 0x00FFFFFF;
+			dstTransId = transid & 0x00FFFFFF;
 			cJSON_SetIntValue(transIdJson, dstTransId);
 		}
 
 		char* unformateStr = cJSON_PrintUnformatted(pJson.get());
 		std::string dstPayLoad = unformateStr;
 		delete[]unformateStr;
-		return dstPayLoad;
+		return std::make_pair(dstTransId, dstPayLoad);
 	}
 
 
 	void CWebsocketServer::open_handler(websocketpp::connection_hdl hdl) {
 		// hand shake here
 		server::connection_ptr con = m_wsserver.get_con_from_hdl(hdl);
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new ws connection to ws server : %u, isSecure:%d, url:%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));
+		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new ws connection to ws server : %u, isSecure:%d, url:%s", hdl.lock().get(), con->get_uri()->get_secure(), con->get_uri()->str().c_str());
+		LogManager::getInstance().logWebSocketBuild((uint64_t)hdl.lock().get(), con->get_uri()->str(), "unsafe");
+		ConfigManager::getInstance().m_connection_hdls.insert(std::pair<unsigned int, websocketpp::connection_hdl>((long)hdl.lock().get(), hdl));
 	}
 
 	void CWebsocketServer::open_handler_wss(websocketpp::connection_hdl hdl) {
 		// hand shake here
 		auto con = m_server_wss.get_con_from_hdl(hdl);
 		unsigned int dstHdl = (long)hdl.lock().get();//start from 0, be different from ws
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new wss connection to ws server : %u, isSecure:%d, url:%s", dstHdl, con->get_uri()->get_secure(), con->get_uri()->str().c_str());
-
-		m_connection_wss_hdls.insert(std::pair<unsigned int, websocketpp::connection_hdl>((long)dstHdl, hdl));
+		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new wss connection to ws server : %u, isSecure:%d, url:%s", dstHdl, con->get_uri()->get_secure(), con->get_uri()->str().c_str());
+		LogManager::getInstance().logWebSocketBuild((uint64_t)hdl.lock().get(), con->get_uri()->str(), "wss");
+		ConfigManager::getInstance().m_connection_wss_hdls.insert(std::pair<unsigned int, websocketpp::connection_hdl>((long)dstHdl, hdl));
 	}
 
 	void CWebsocketServer::open_handler_ws_sm2(websocketpp::connection_hdl hdl) {
 		// hand shake here
 		auto con = m_ws_sm2_server.get_con_from_hdl(hdl);
 		unsigned int dstHdl = (long)hdl.lock().get();//start from 0, be different from ws
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new ws by encrypt connection to ws server : %u, isSecure:%d, url:%s", dstHdl, con->get_uri()->get_secure(), con->get_uri()->str().c_str());
-		m_connection_ws_sm2_hdls.insert(std::pair<unsigned int, websocketpp::connection_hdl>(dstHdl, hdl));
-		m_ws_sm2_hdls_manager.insert(std::make_pair(dstHdl, new SM2_Encrypt_Manager()));
+		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("new ws by encrypt connection to ws server : %u, isSecure:%d, url:%s", dstHdl, con->get_uri()->get_secure(), con->get_uri()->str().c_str());
+		LogManager::getInstance().logWebSocketBuild((uint64_t)hdl.lock().get(), con->get_uri()->str(), "ws_sm2");
+		ConfigManager::getInstance().m_connection_ws_sm2_hdls.insert(std::pair<unsigned int, websocketpp::connection_hdl>(dstHdl, hdl));
+		ConfigManager::getInstance().m_ws_sm2_hdls_manager.insert(std::make_pair(dstHdl, new SM2_Encrypt_Manager()));
 	}
 
 	void CWebsocketServer::close_handler(websocketpp::connection_hdl hdl) {
 		// hand shake here
 
-		auto connectionIter = m_connection_hdls.find((long)hdl.lock().get());
-		if (m_connection_hdls.end() != connectionIter)
+		auto connectionIter = ConfigManager::getInstance().m_connection_hdls.find((long)hdl.lock().get());
+		if (ConfigManager::getInstance().m_connection_hdls.end() != connectionIter)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ws connection with ws server closed : %u", hdl.lock().get());
-			m_connection_hdls.erase(connectionIter);
+			LogManager::getInstance().logWebSocketClose((uint64_t)hdl.lock().get());
+			//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ws connection with ws server closed : %u", hdl.lock().get());
+			ConfigManager::getInstance().m_connection_hdls.erase(connectionIter);
 		}
 		else
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ws connection close erase failed : %u", hdl.lock().get());
@@ -813,11 +847,12 @@ namespace Chromium {
 	void CWebsocketServer::close_handler_wss(websocketpp::connection_hdl hdl) {
 		// hand shake here
 
-		auto connectionIter = m_connection_wss_hdls.find((long)hdl.lock().get());
-		if (m_connection_wss_hdls.end() != connectionIter)
+		auto connectionIter = ConfigManager::getInstance().m_connection_wss_hdls.find((long)hdl.lock().get());
+		if (ConfigManager::getInstance().m_connection_wss_hdls.end() != connectionIter)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("wss connection with ws server closed : %u", hdl.lock().get());
-			m_connection_wss_hdls.erase(connectionIter);
+			LogManager::getInstance().logWebSocketClose((uint64_t)hdl.lock().get());
+			//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("wss connection with ws server closed : %u", hdl.lock().get());
+			ConfigManager::getInstance().m_connection_wss_hdls.erase(connectionIter);
 		}
 		else
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("wss connection close erase failed : %u", hdl.lock().get());
@@ -827,12 +862,13 @@ namespace Chromium {
 	{
 		// hand shake here
 
-		auto connectionIter = m_connection_ws_sm2_hdls.find((long)hdl.lock().get());
-		if (m_connection_ws_sm2_hdls.end() != connectionIter)
+		auto connectionIter = ConfigManager::getInstance().m_connection_ws_sm2_hdls.find((long)hdl.lock().get());
+		if (ConfigManager::getInstance().m_connection_ws_sm2_hdls.end() != connectionIter)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ws sm2 connection with ws server closed : %u", hdl.lock().get());
-			m_connection_ws_sm2_hdls.erase(connectionIter);
-			m_ws_sm2_hdls_manager.erase((long)hdl.lock().get());
+			LogManager::getInstance().logWebSocketClose((uint64_t)hdl.lock().get());
+			//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ws sm2 connection with ws server closed : %u", hdl.lock().get());
+			ConfigManager::getInstance().m_connection_ws_sm2_hdls.erase(connectionIter);
+			ConfigManager::getInstance().m_ws_sm2_hdls_manager.erase((long)hdl.lock().get());
 		}
 		else
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ws sm2 connection close erase failed : %u", hdl.lock().get());
@@ -940,7 +976,18 @@ namespace Chromium {
 			}
 			catch (...)
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("exception in do_relink");
+				std::exception_ptr p = std::current_exception();
+				if (p) {
+					try {
+						std::rethrow_exception(p);
+					}
+					catch (const boost::thread_interrupted& e) {
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("thread interrupted");
+					}
+					catch (const std::exception& e) {
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("exception: %s", e.what());
+					}
+				}
 			}
 		}
 
@@ -985,9 +1032,9 @@ namespace Chromium {
 
 	void CWebsocketServer::do_sendJsonBroadcast(std::string js)
 	{
-		js = restroreTransId(js);
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("message broadcast : json = %s", js.c_str());
-		if (js.empty())
+		auto dst_js = restroreTransId(js);
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("message broadcast : json = %s", dst_js.second.c_str());
+		if (dst_js.second.empty())
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("string empty");
 			return;
@@ -1003,23 +1050,17 @@ namespace Chromium {
 			return ss.str();
 		};
 
-		if (!sendBroadCast(m_connection_hdls, m_wsserver, js))
+		if (!sendBroadCast(ConfigManager::getInstance().m_connection_hdls, m_wsserver, dst_js.second))
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ws server broadcast error");
 		}
 
-		if (!sendBroadCast(m_connection_ws_sm2_hdls, m_ws_sm2_server, js))
+		if (!sendBroadCast(ConfigManager::getInstance().m_connection_ws_sm2_hdls, m_ws_sm2_server, dst_js.second))
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("ws_sm2 server broadcast error");
 		}
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("do_sendJsonBroadcast: broadcasts have already send to these terminals, no_security:%s, security:%s",
-			formatMapToString(m_connection_hdls).c_str(), formatMapToString(m_connection_ws_sm2_hdls).c_str());
-		/*
-		if (!sendBroadCast(m_connection_wss_hdls, m_server_wss, js))
-		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("wss server broadcast error");
-		}
-		*/
+			formatMapToString(ConfigManager::getInstance().m_connection_hdls).c_str(), formatMapToString(ConfigManager::getInstance().m_connection_ws_sm2_hdls).c_str());
 	}
 
 	void CWebsocketServer::do_send_msg(int hdl, std::string msg)
@@ -1027,8 +1068,8 @@ namespace Chromium {
 		//send ws
 				try
 				{
-			std::map<unsigned int, websocketpp::connection_hdl>::iterator it = m_connection_hdls.find(hdl);
-			if (m_connection_hdls.end() != it)
+			std::map<unsigned int, websocketpp::connection_hdl>::iterator it = ConfigManager::getInstance().m_connection_hdls.find(hdl);
+			if (ConfigManager::getInstance().m_connection_hdls.end() != it)
 			{
 				do_send_msg(it->second, msg);
 				return;
@@ -1048,8 +1089,8 @@ namespace Chromium {
 		//send ws sm2
 		try
 		{
-			std::map<unsigned int, websocketpp::connection_hdl>::iterator it = m_connection_ws_sm2_hdls.find(hdl);
-			if (m_connection_ws_sm2_hdls.end() != it)
+			std::map<unsigned int, websocketpp::connection_hdl>::iterator it = ConfigManager::getInstance().m_connection_ws_sm2_hdls.find(hdl);
+			if (ConfigManager::getInstance().m_connection_ws_sm2_hdls.end() != it)
 			{
 				//DbgEx("Send....");
 				do_send_msg(it->second, msg);
@@ -1072,8 +1113,8 @@ namespace Chromium {
 		try
 		{
 			//DbgEx("do_send_notifyMsg Enter...");
-			std::map<unsigned int, websocketpp::connection_hdl>::iterator it = m_connection_hdls.find(hdlID);
-			if (m_connection_hdls.end() != it)
+			std::map<unsigned int, websocketpp::connection_hdl>::iterator it = ConfigManager::getInstance().m_connection_hdls.find(hdlID);
+			if (ConfigManager::getInstance().m_connection_hdls.end() != it)
 			{
 				//DbgEx("Send....");
 				websocketpp::connection_hdl hdl = it->second;
@@ -1101,20 +1142,21 @@ namespace Chromium {
 		unsigned int dstHdl = (long)hdl.lock().get();
 
 		websocketpp::lib::error_code dstExption;
-		if (m_connection_hdls.find(dstHdl) != m_connection_hdls.end())
+		if (ConfigManager::getInstance().m_connection_hdls.find(dstHdl) != ConfigManager::getInstance().m_connection_hdls.end())
 		{
 			m_wsserver.send(hdl, msg, websocketpp::frame::opcode::TEXT, dstExption);
 		}
-		else if (m_connection_ws_sm2_hdls.find(dstHdl) != m_connection_ws_sm2_hdls.end())
+		else if (ConfigManager::getInstance().m_connection_ws_sm2_hdls.find(dstHdl) != ConfigManager::getInstance().m_connection_ws_sm2_hdls.end())
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("dstHdl:%d, save:%d", dstHdl, m_connection_ws_sm2_hdls[dstHdl].lock().get());
-			if(m_ws_sm2_hdls_manager[dstHdl]->getState() == SM2ProtocolState::WAIT_KEY_EXCHANGE)
-				m_ws_sm2_server.send(m_connection_ws_sm2_hdls[dstHdl], msg, websocketpp::frame::opcode::TEXT, dstExption);
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("dstHdl:%d, save:%d", dstHdl,
+				ConfigManager::getInstance().m_connection_ws_sm2_hdls[dstHdl].lock().get());
+			if(ConfigManager::getInstance().m_ws_sm2_hdls_manager[dstHdl]->getState() == SM2ProtocolState::WAIT_KEY_EXCHANGE)
+				m_ws_sm2_server.send(ConfigManager::getInstance().m_connection_ws_sm2_hdls[dstHdl], msg, websocketpp::frame::opcode::TEXT, dstExption);
 			else
 			{
-				auto dst = m_ws_sm2_hdls_manager[dstHdl]->EncryptMsg(msg);
+				auto dst = ConfigManager::getInstance().m_ws_sm2_hdls_manager[dstHdl]->EncryptMsg(msg);
 				std::string js = CSimpleString::Format("{\"sign\":\"%s\",\"msg\":\"%s\"}", dst.first.c_str(), dst.second.c_str()).GetData();
-				m_ws_sm2_server.send(m_connection_ws_sm2_hdls[dstHdl], js, websocketpp::frame::opcode::TEXT, dstExption);
+				m_ws_sm2_server.send(ConfigManager::getInstance().m_connection_ws_sm2_hdls[dstHdl], js, websocketpp::frame::opcode::TEXT, dstExption);
 			}
 		}
 			
@@ -1135,32 +1177,87 @@ namespace Chromium {
 
 
 
-	void CWebsocketServer::do_sendJson(std::string js, int messageType, int hdlID, unsigned int id)
+	void CWebsocketServer::do_sendJson(std::string js, int messageType, int hdlID, unsigned int id, socket_msgInfo& msgInfo)
 	{
-		js = restroreTransId(js);
-		if(g_withLinkLog)
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("WebSocket Search message_from_socket : json = %s", js.c_str());
-		else if(messageType != MessageType::RequestAck && messageType != MessageType::Event)//do not upload message which messageType equals to RequestAck or Event
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("WebSocket Search message_from_socket : json = %s", js.c_str());
-		if (js.empty())
+		auto dst_js = restroreTransId(js);
+		js = dst_js.second;
+
+		if (messageType == MessageType::RequestAck)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("string empty");
-			return;
-		}
-		if (m_connection_hdls.empty() && m_connection_ws_sm2_hdls.empty())
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("message_from_socket : no websocket client connection");
-		else {
 #if(defined _WIN32 || defined _WIN64)
 			js = string_to_utf8(js);
 #endif
 			if (js.empty())
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("string empty 2");
+				LogManager::getInstance().logVtmRequestAck(hdlID, dst_js.first, msgInfo.inner_transID, msgInfo.sessionId,
+					msgInfo.entityName, msgInfo.functionName, 2, "none", msgInfo.payLoad, msgInfo.msgBytes, Error_Null, "string empty");
+				return;
+			}
+			if (ConfigManager::getInstance().m_connection_hdls.empty() && ConfigManager::getInstance().m_connection_ws_sm2_hdls.empty())
+				LogManager::getInstance().logVtmRequestAck(hdlID, dst_js.first, msgInfo.inner_transID, msgInfo.sessionId,
+					msgInfo.entityName, msgInfo.functionName, 2, "none", msgInfo.payLoad, msgInfo.msgBytes, Error_Null, "no websocket client connection");
+			else
+			{
+				if(msgInfo.userCodeVal == 0)
+					LogManager::getInstance().logVtmRequestAck(hdlID, dst_js.first, msgInfo.inner_transID, msgInfo.sessionId,
+						msgInfo.entityName, msgInfo.functionName, 0, "send", msgInfo.payLoad, msgInfo.msgBytes);
+				else
+					LogManager::getInstance().logVtmRequestAck(hdlID, dst_js.first, msgInfo.inner_transID, msgInfo.sessionId,
+						msgInfo.entityName, msgInfo.functionName, 2, "send", msgInfo.payLoad, msgInfo.msgBytes, msgInfo.userCodeVal, msgInfo.warnMsg);
+				do_send_msg(hdlID, js);
+			}
+		}
+		else if (messageType == MessageType::SessionAck)
+		{
+			if (js.empty())
+			{
+				LogManager::getInstance().logVtmSessionAck(hdlID, dst_js.first, msgInfo.inner_transID, msgInfo.sessionId, msgInfo.entityName, 2, "none",
+					msgInfo.payLoad, msgInfo.msgBytes, Error_Null, "string empty");
 				return;
 			}
+			if (ConfigManager::getInstance().m_connection_hdls.empty() && ConfigManager::getInstance().m_connection_ws_sm2_hdls.empty())
+				LogManager::getInstance().logVtmSessionAck(hdlID, dst_js.first, msgInfo.inner_transID, msgInfo.sessionId,
+					msgInfo.entityName, 2, "none", msgInfo.payLoad, msgInfo.msgBytes, Error_Null, "no websocket client connection");
+			else
+			{
+				if(msgInfo.userCodeVal == 0)
+					LogManager::getInstance().logVtmSessionAck(hdlID, dst_js.first, msgInfo.inner_transID, msgInfo.sessionId,
+						msgInfo.entityName, 0, "send", msgInfo.payLoad, msgInfo.msgBytes);
+				else
+					LogManager::getInstance().logVtmSessionAck(hdlID, dst_js.first, msgInfo.inner_transID, msgInfo.sessionId,
+						msgInfo.entityName, 2, "send", msgInfo.payLoad, msgInfo.msgBytes, msgInfo.userCodeVal, msgInfo.warnMsg);
+				
+				do_send_msg(hdlID, js);
+			}
+		}
+		else
+		{
+			if (ConfigManager::getInstance().m_withLinkLog)
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("WebSocket Search message_from_socket : json = %s", js.c_str());
+			else if (messageType != MessageType::RequestAck && messageType != MessageType::Event)//do not upload message which messageType equals to RequestAck or Event
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("WebSocket Search message_from_socket : json = %s", js.c_str());
+			if (js.empty())
+			{
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("string empty");
+				return;
+			}
+			if (ConfigManager::getInstance().m_connection_hdls.empty() && ConfigManager::getInstance().m_connection_ws_sm2_hdls.empty())
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("message_from_socket : no websocket client connection");
+			else {
+#if(defined _WIN32 || defined _WIN64)
+				js = string_to_utf8(js);
+#endif
+				if (js.empty())
+				{
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("string empty 2");
+					return;
+				}
 
-			do_send_msg(hdlID, js);
+				do_send_msg(hdlID, js);
+			}
 		}
+
+		
 	}
 
 	// socket message handler
@@ -1188,12 +1285,12 @@ namespace Chromium {
 			replaceTransId = tmpReplace.first == true ? tmpReplace.second : 0;
 		}
 		// 处理session ack,获取hdlID
+		socket_msgInfo cur_from_socket(replaceTransId, msg.getTransID(), msg.getSessionID());
 
 		unsigned int hdlID = 0;
 		std::vector<std::pair<int, int>> sendArr;
 		if (MessageType::Event == msg.getMessageType())
 		{
-
 			auto formatVectorToString = [](const std::vector<std::pair<int, int>>& vec) -> std::string {
 				std::stringstream ss;
 				ss << "[";
@@ -1216,27 +1313,32 @@ namespace Chromium {
 			for (auto i = sendArr.begin(); i != sendArr.end(); i++)
 			{
 				msg.setTransID(i->first);
-				std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), 0);
-				do_sendJson(js, msg.getMessageType(), i->second, id);
+				std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), cur_from_socket, 0);
+				do_sendJson(js, msg.getMessageType(), i->second, id, cur_from_socket);
 				unaccurate_js = js;
 			}
 			auto signatureID = msg.getSignatureID();
+			auto sessionId = msg.getSessionID();
+			auto sessionEntityName = EntitySessionManager::FromSessionIdToEntityName(sessionId);
 			if (sendArr.size() == 0)
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("message_from_socket event sendArr.size() == 0");
+				LogManager::getInstance().logVtmEvent(-1, -1, sessionId, sessionEntityName.second, 0, "send", sendArr,
+					cur_from_socket.payLoad, cur_from_socket.msgBytes, Error_NotExist, "message_from_socket event sendArr.size() == 0");
 			else if (signatureID != eMsgSig_LogInfo && signatureID != eMsgSig_EntityStatus && signatureID != eMsgSig_PerformanceList)//fiter guiconsole msg
 			{
-#ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
+				LogManager::getInstance().logVtmEvent(-1, -1, sessionId, sessionEntityName.second, 0, "send", sendArr,
+					cur_from_socket.payLoad, cur_from_socket.msgBytes);
+				/*
+#ifdef DEVOPS_ON_ST 
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("message_from_socket event %s send to arr:%s"
 					, unaccurate_js.c_str(), formatVectorToString(sendArr).c_str());
-#elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
+#elif defined(DEVOPS_ON_UAT)
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("message_from_socket event %s send to arr:%s"
 					, unaccurate_js.c_str(), formatVectorToString(sendArr).c_str());
 #else
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("message_from_socket event send to arr:%s", formatVectorToString(sendArr).c_str());
 #endif
+				*/
 			}
-				
-
 		}
 		else if (MessageType::EndSession == msg.getMessageType())	//session end
 		{
@@ -1244,10 +1346,9 @@ namespace Chromium {
 
 			auto ret = m_esm->DoSessionRemove(sessionId);
 			if (ret.first)
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("MessgeType:%s, detect session %s:%d lost!remove success", GetMessageTypeString(2).c_str(), ret.second.c_str(), sessionId);
+				LogManager::getInstance().logVtmEndSession(-1, ret.second, sessionId, 0, "clean", "", Error_Succeed, "remove session success");
 			else
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("MessgeType:%s, detect session %d lost!remove failed", GetMessageTypeString(2).c_str(), sessionId);
-
+				LogManager::getInstance().logVtmEndSession(-1, ret.second, sessionId, 1, "clean", "", Error_NotExist, "detect session lost!remove failed");
 		}
 		else if (MessageType::SessionAck == msg.getMessageType())
 		{//sessionAck
@@ -1255,25 +1356,26 @@ namespace Chromium {
 			auto sessionId = msg.getSessionID();
 			if (ACKPROCESS_NOTHING == ret.first)
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("MessgeType:%s, can not find save session, process noting, %s", GetMessageTypeString(2).c_str(), ret.second.c_str());//error
+				LogManager::getInstance().logVtmSessionAck(hdlID, -1, -1, sessionId, cur_from_socket.entityName, 2, "none", cur_from_socket.payLoad, cur_from_socket.msgBytes,
+					Error_NotExist, "can not find save session, process noting");
 				return;
 			}
 			if (0 != hdlID)
 			{//hdlId为0时,说明本地发起的session
-				std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), replaceTransId);
-				do_sendJson(js, msg.getMessageType(), hdlID, id);	//发给首记录的CMessage
+				std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), cur_from_socket, replaceTransId);
+				do_sendJson(js, msg.getMessageType(), hdlID, id, cur_from_socket);	//发给首记录的CMessage
 			}
 
-			for (auto cur = m_msg_pool.begin(); cur != m_msg_pool.end(); cur++)
+			for (auto cur = ConfigManager::getInstance().m_msg_pool.begin(); cur != ConfigManager::getInstance().m_msg_pool.end(); cur++)
 			{//sessionId为-1时需处理,否则会引发消息风暴
 				if (cur->first == ret.second)
 				{
 					std::vector<std::pair<websocketpp::connection_hdl, std::string>> msgArr(cur->second);
-					m_msg_pool.erase(cur);	//为防止处理消息时引发消息风暴,拷贝并删除原msg_pool
+					ConfigManager::getInstance().m_msg_pool.erase(cur);	//为防止处理消息时引发消息风暴,拷贝并删除原msg_pool
 					if (-1 != sessionId) {
 						DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Session with %s Make, deal with record Msg:%d", ret.second.c_str(), msgArr.size());
 						for (auto msg = msgArr.begin(); msg != msgArr.end(); msg++)
-							deal_msg(msg->second, msg->first);
+							deal_msg(msg->second, msg->first, 1);
 						break;
 					}
 					else
@@ -1296,8 +1398,8 @@ namespace Chromium {
 		else
 		{
 			m_esm->AckProcess(&msg, hdlID); //替换真实的transId,update session map
-			std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), replaceTransId);
-			do_sendJson(js, msg.getMessageType(), hdlID, id);
+			std::string js = this->m_serializer->BufferToJson(msg, boost::bind(&EntitySessionManager::doWithErrorCode, m_esm, _1, _2), cur_from_socket, replaceTransId);
+			do_sendJson(js, msg.getMessageType(), hdlID, id, cur_from_socket);
 		}
 
 	}

+ 5 - 11
Module/mod_chromium/CWebsocketServer.h

@@ -58,7 +58,7 @@ namespace Chromium {
 		void message_from_socket(CMessage& msg, unsigned int id);
 		bool isWebSocketSuceess() { return m_initSuccess; }
 		const std::map<unsigned, unsigned>& getNotifyPool() {
-			return m_notifyPool;
+			return ConfigManager::getInstance().m_notifyPool;
 		};
 		void do_send_notifyMsg(unsigned hdlID, unsigned transId, const std::string& reason, const std::string& errmsg, const std::string& rebootTime, const DWORD& dwSysError, const DWORD& dwUserCode);
 		//static server m_wsserver;
@@ -67,7 +67,7 @@ namespace Chromium {
 	private:
 		void message_handler(websocketpp::connection_hdl hdl, server::message_ptr msg);
 		void message_handler_ws_sm2(websocketpp::connection_hdl hdl, server::message_ptr msg);
-		void deal_msg(std::string& payload, websocketpp::connection_hdl hdl);
+		void deal_msg(std::string& payload, websocketpp::connection_hdl hdl, int srcTransId);
 		void deal_webchromium_msg(std::string& payload, websocketpp::connection_hdl hdl, int messageType);
 		void deal_sessionBreakMsg(std::string& payload, websocketpp::connection_hdl hdl);
 		void deal_logMsg(std::string& payload, websocketpp::connection_hdl hdl, int messageType);
@@ -80,7 +80,7 @@ namespace Chromium {
 		void do_run();
 		void init_websocket();
 		void init_entity_sessions();
-		void do_sendJson(std::string js, int messageType, int hdlID, unsigned int id);
+		void do_sendJson(std::string js, int messageType, int hdlID, unsigned int id, socket_msgInfo &msgInfo);
 		void do_sendJsonBroadcast(std::string js);
 		template <typename T, typename Y>
 		bool sendBroadCast(T &connections, Y &senders, std::string msg);
@@ -95,7 +95,7 @@ namespace Chromium {
 		std::pair<bool, std::string> getEntityClass(std::string entityName);
 		void do_sendJsonStartSession(std::string entityName, std::string entityClass);
 		void do_relink();
-		std::string restroreTransId(std::string payLoad);
+		std::pair<int, std::string> restroreTransId(std::string payLoad);
 		void updateNotifyPool(unsigned hdl, unsigned transId);	//if transId == 0 , unregister the item, else insert a register
 
 
@@ -106,16 +106,10 @@ namespace Chromium {
 		EntitySessionManager* m_esm;
 		boost::asio::io_service m_ios;
 		boost::thread m_doRunThread, m_doReLinkThread;
-		std::map<unsigned int, websocketpp::connection_hdl> m_connection_hdls;
-		std::map<unsigned int, websocketpp::connection_hdl> m_connection_ws_sm2_hdls;
-		std::map<unsigned int, websocketpp::connection_hdl> m_connection_wss_hdls;
-		std::map<unsigned int, std::shared_ptr<SM2_Encrypt_Manager>> m_ws_sm2_hdls_manager;
-		std::map<std::string, std::vector<std::pair<websocketpp::connection_hdl, std::string>> > m_msg_pool;
-		std::map<std::string, std::string> m_entityAndClass;//不知道为什么不能用map<string,map<>>,猜测应该是websocketpp::connection_hdl生成问题
 		CEntityBase* m_pEntity;
 		boost::mutex m_dealMsgLock;
 		bool m_initSuccess;
-		std::map<unsigned, unsigned> m_notifyPool; //hdl和notify transId对应
+		
 	};
 }
 #endif

+ 124 - 27
Module/mod_chromium/EntitySessionManager.cpp

@@ -98,43 +98,53 @@ namespace Chromium {
 		return;
 	}
 
-	RequestProcessType EntitySessionManager::RequestProcess(CMessage* msg, std::string entityName, unsigned int hdlID) {
+	RequestProcessType EntitySessionManager::RequestProcess(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo) {
 		if (msg == NULL)
 			return PROCESS_NOTHING;
 		RequestProcessType ret = PROCESS_NOTHING;
 
 		switch (msg->getMessageType() & 0x0000FFFF) {
 		case MessageType::Info:
-			ret = ProcessWithInfo(msg, entityName, hdlID);
+			ret = ProcessWithInfo(msg, entityName, hdlID, msgInfo);
 			break;
 		case MessageType::BeginSession:
-			ret = ProcessWithBeginSession(msg, entityName, hdlID);
+			ret = ProcessWithBeginSession(msg, entityName, hdlID, msgInfo);
 			break;
 		case MessageType::EndSession:
 			ret = ProcessWithEndSession(msg, entityName, hdlID);
 			break;
 		case MessageType::Request:
-			ret = ProcessWithRequest(msg, entityName, hdlID);
+			ret = ProcessWithRequest(msg, entityName, hdlID, msgInfo);
 			break;
 		case MessageType::Register:
-			ret = ProcessWithRegister(msg, entityName, hdlID);
+			ret = ProcessWithRegister(msg, entityName, hdlID, msgInfo);
 			break;
 		case MessageType::Unregister:
 			ret = ProcessWithUnregister(msg, entityName, hdlID);
 			break;
-		case MessageType::Event:
+		case MessageType::Event://receive
 			ret = PROCESS_SEND;
 			break;
 		case MessageType::LogEventMsgType:
+			/*
+			do not print
+			"eventCode": 1074790401,
+			"message": "RvcCore MouseOperation onClick",
+			"operate": "send",
+			"payload": "{\"messageType\":9,\"securityLevel\":2,\"eventCode\":1074790401,\"message\":\"RvcCore MouseOperation onClick\"}",
+			*/
+			if(msgInfo.eventCode != 0x40100001)
+				LogManager::getInstance().logWsLogEvent(msgInfo.hdlId, msgInfo.securityLevel, msgInfo.eventCode, msgInfo.message, 0, "send", msgInfo.payLoad);
 			ret = PROCESS_SEND;
 			break;
 		case MessageType::LogWarnMsgType:
+			LogManager::getInstance().logWsLogWarn(msgInfo.hdlId, msgInfo.securityLevel, msgInfo.eventCode, msgInfo.message, 0, "send", msgInfo.payLoad);
 			return PROCESS_SEND;
 		case MessageType::SetVarReq:
-			ret = ProcessWithSetVarReq(msg, entityName, hdlID);
+			ret = ProcessWithSetVarReq(msg, entityName, hdlID, msgInfo);
 			break;
 		case MessageType::GetVarReq:
-			ret = ProcessWithGetVarReq(msg, entityName, hdlID);
+			ret = ProcessWithGetVarReq(msg, entityName, hdlID, msgInfo);
 			break;
 		case MessageType::Broadcast:
 			return PROCESS_NOTHING;
@@ -150,15 +160,17 @@ namespace Chromium {
 		return ret;
 	}
 
-	RequestProcessType EntitySessionManager::ProcessWithInfo(CMessage* msg, std::string entityName, unsigned int hdlID) {
+	RequestProcessType EntitySessionManager::ProcessWithInfo(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo) {
 		auto it = m_session_map.find(entityName);
 		if (it == m_session_map.end() || -1 == it->second)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("no session found for entity : %s", UtfToGbk(entityName.c_str()).c_str());
+			LogManager::getInstance().logWebSocketInfo(hdlID, msgInfo.transId, -1, msgInfo.entityName, msgInfo.functionName, 1,
+				"startSession", Error_NoTarget, "no session found", msgInfo.payLoad);
 			return PROCESS_STARTSESSION;
 		}
 		msg->setSessionID(it->second, false);
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithInfo, replace sessionID:%d", it->second);
+		LogManager::getInstance().logWebSocketInfo(hdlID, msgInfo.transId, it->second, msgInfo.entityName, msgInfo.functionName, (msgInfo.warnMsg.length() ==0 ? 0 : 1),
+			"send", 0, msgInfo.warnMsg, msgInfo.payLoad);
 		return PROCESS_SEND;
 	}
 
@@ -179,18 +191,22 @@ namespace Chromium {
 		auto curSession = t_BeginSessionTime.find(entityName);
 		if (curSession == t_BeginSessionTime.end() || curSession->second < now_time - 5)
 		{
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("checkBeginSession record begin session msg, oldTime:%lld, newTime:%lld", curSession != t_BeginSessionTime.end() ? curSession->second : -1, now_time);
+			//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("checkBeginSession record begin session msg, oldTime:%lld, newTime:%lld", curSession != t_BeginSessionTime.end() ? curSession->second : -1, now_time);
 			return true;//5s内不重复发起session
 		}
 		else
 			return false;
 	}
 
-	RequestProcessType EntitySessionManager::ProcessWithBeginSession(CMessage* msg, std::string entityName, unsigned int hdlID) {
+	RequestProcessType EntitySessionManager::ProcessWithBeginSession(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo) {
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithBeginSession");
 		auto s = GetSessionIDByEntityName(entityName);
 		if (s.first && -1 != s.second)
+		{
+			LogManager::getInstance().logWebSocketBeginSession(hdlID, msgInfo.transId, -1, msgInfo.entityName, msgInfo.className, 1, "none", msgInfo.payLoad, 
+				Error_Duplication, "session already existed");
 			return PROCESS_FINDSESSION;
+		}
 
 		if (checkBeginSession(entityName))
 		{
@@ -198,10 +214,15 @@ namespace Chromium {
 			int transID = MakeNewTransID(msg, hdlID);
 			msg->setTransID(transID);
 			updateBeginSessionTime(entityName);
+			LogManager::getInstance().logWebSocketBeginSession(hdlID, msgInfo.transId, transID, msgInfo.entityName, msgInfo.className, 0, "send", msgInfo.payLoad);
 			return PROCESS_SEND;
 		}
 		else
+		{
+			LogManager::getInstance().logWebSocketBeginSession(hdlID, msgInfo.transId, -1, msgInfo.entityName, msgInfo.className, 1, "record", msgInfo.payLoad,
+				Error_Duplication, "already begin session in 5 seconds");
 			return PROCESS_RECORDMSG;//5s内发起过session
+		}
 	}
 
 	RequestProcessType EntitySessionManager::ProcessWithEndSession(CMessage* msg, std::string entityName,
@@ -211,23 +232,28 @@ namespace Chromium {
 	}
 
 	RequestProcessType EntitySessionManager::ProcessWithRequest(CMessage* msg, std::string entityName,
-		unsigned int hdlID) {
+		unsigned int hdlID, const ws_msgInfo& msgInfo) {
 		
 		auto it = m_session_map.find(entityName);
 		if (it == m_session_map.end() || -1 == it->second)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("no session found for entity : %s", UtfToGbk(entityName.c_str()).c_str());
+			LogManager::getInstance().logWebSocketRequest(msgInfo.hdlId, msgInfo.transId, -1, -1, msgInfo.entityName, msgInfo.functionName, 1,
+				"startSession", msgInfo.payLoad, Error_NoTarget, "no session found, try startSession");
 			return PROCESS_STARTSESSION;
 		}
 		msg->setSessionID(it->second, true);
 		auto transId = MakeNewTransID(msg, hdlID);
 		msg->setTransID(transId);
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithRequest, replace sessionID:%d, replace transId:%d", it->second, transId);
+
+		LogManager::getInstance().logWebSocketRequest(msgInfo.hdlId, msgInfo.transId, transId, it->second, msgInfo.entityName, msgInfo.functionName,
+			(msgInfo.warnMsg.length() == 0 ? 0 : 1), "send", msgInfo.payLoad, Error_Succeed, msgInfo.warnMsg);
+
+		//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithRequest, replace sessionID:%d, replace transId:%d", it->second, transId);
 		return PROCESS_SEND;
 	}
 
-	RequestProcessType EntitySessionManager::ProcessWithRegister(CMessage* msg, std::string entityName, unsigned int hdlID) {
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithRegister");
+	RequestProcessType EntitySessionManager::ProcessWithRegister(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo) {
+		//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithRegister");
 		auto _broadcast_it = m_broadcast_map.find(entityName);
 		if (_broadcast_it == m_broadcast_map.end())
 		{
@@ -235,6 +261,8 @@ namespace Chromium {
 			int transid = MakeNewTransID(msg, hdlID);
 			msg->setTransID(transid);
 			m_broadcast_map.insert(std::pair<std::string, int>(entityName, transid));
+			LogManager::getInstance().logWebSocketRegister(hdlID, msgInfo.transId, transid, msgInfo.entityName,
+				msgInfo.className, 0, "send", msgInfo.payLoad, Error_Succeed, "first register");
 			return PROCESS_SEND;
 		}
 
@@ -245,7 +273,8 @@ namespace Chromium {
 			int transid = MakeNewTransID(msg, hdlID);
 			msg->setTransID(transid);
 			m_broadcast_map.insert(std::pair<std::string, int>(entityName, transid));
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithRegister %s first register, send", entityName.c_str());
+			LogManager::getInstance().logWebSocketRegister(hdlID, msgInfo.transId, transid, msgInfo.entityName,
+				msgInfo.className, 0, "send", msgInfo.payLoad, Error_Succeed, "first register");
 			return PROCESS_SEND;
 		}
 		// 已经有过订阅 在链表后加
@@ -253,6 +282,8 @@ namespace Chromium {
 		if (pNode->hdlID == hdlID)
 		{
 			// 该客户端订阅过,避免重复订阅
+			LogManager::getInstance().logWebSocketRegister(hdlID, msgInfo.transId, -1, msgInfo.entityName,
+				msgInfo.className, 0, "none", msgInfo.payLoad, Error_Duplication, "already register");
 			return PROCESS_NOTHING;
 		}
 		while (pNode->next != NULL) {
@@ -268,8 +299,9 @@ namespace Chromium {
 		pNode->next->next = NULL;
 		pNode->next->hdlID = hdlID;
 		pNode->next->transID = msg->getTransID();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)
-			("EntitySessionManager::ProcessWithRegister %s already register, add hdl %d", entityName.c_str(), hdlID);
+		CSimpleString warnStr = CSimpleString::Format("EntitySessionManager::ProcessWithRegister %s already register, add hdl %d", entityName.c_str(), hdlID);
+		LogManager::getInstance().logWebSocketRegister(hdlID, pNode->next->transID, -1, msgInfo.entityName,
+			msgInfo.className, 1, "none", msgInfo.payLoad, Error_Duplication, warnStr.GetData());
 		return PROCESS_NOTHING;
 	}
 
@@ -327,16 +359,22 @@ namespace Chromium {
 	}
 
 	RequestProcessType EntitySessionManager::ProcessWithSetVarReq(CMessage* msg, std::string entityName,
-		unsigned int hdlID) {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithSetVarReq");
-		msg->setTransID(MakeNewTransID(msg, hdlID));
+		unsigned int hdlID, const ws_msgInfo& msgInfo) {
+		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithSetVarReq");
+		int transId = MakeNewTransID(msg, hdlID);
+		msg->setTransID(transId);
+		LogManager::getInstance().logWebSocketSetVar(msgInfo.hdlId, msgInfo.transId, transId, msgInfo.name, msgInfo.value, 0, "send", msgInfo.payLoad);
 		return PROCESS_SEND;
 	}
 
 	RequestProcessType EntitySessionManager::ProcessWithGetVarReq(CMessage* msg, std::string entityName,
-		unsigned int hdlID) {
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithGetVarReq");
-		msg->setTransID(MakeNewTransID(msg, hdlID));
+		unsigned int hdlID, const ws_msgInfo& msgInfo) {
+		//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithGetVarReq");
+		int transId = MakeNewTransID(msg, hdlID);
+		msg->setTransID(transId);
+		LogManager::getInstance().logWebSocketGetVar(msgInfo.hdlId, msgInfo.transId, transId, msgInfo.name, 0, "send", msgInfo.payLoad);
+
+
 		return PROCESS_SEND;
 	}
 
@@ -367,10 +405,59 @@ namespace Chromium {
 		{
 			char sessionJs[10240] = "";
 			sprintf(sessionJs, "{\"messageType\":%d,\"transID\":%d,\"InitCfg\":%d,\"%s\":%s}", 16, transId, isInitCfg, PARAMLIST_HEAD, sessionJson.second.c_str());
+			LogManager::getInstance().logEntityStatus(CSimpleString::Format("GetSessionRequest, InitCfg\":%d,\"entityConnect\":%s", isInitCfg, sessionJson.second.c_str()).GetData(),
+				LOG_LEVEL_INFO, 0, "send");
 			return std::make_pair(true, sessionJs);
 		}
 		return std::make_pair(false, "error generateJsonStr");
 	}
+	/*
+	{
+		"format_version": "1.1",
+		"target_page": "",
+		"headers": [
+		  {
+			"url_contains": "",
+			"action": "add",
+			"header_name": "zzzz_terminalno",
+			"header_value": "7555980178",
+			"comment": "test",
+			"apply_on": "req",
+			"status": "on"
+		  }
+		],
+		"debug_mode": True,
+		"use_url_contains": False
+	}
+	
+	*/
+
+	std::pair<int, std::string> EntitySessionManager::Get_getconfig_ack(std::string terminalno)
+	{
+		Json::Value root;
+		root["format_version"] = "1.1";
+		root["target_page"] = "";
+
+		Json::Value headers;
+		Json::Value header;
+		header["url_contains"] = "";
+		header["action"] = "add";
+		header["header_name"] = "VTM_terminalno";
+		header["header_value"] = terminalno;
+		header["comment"] = "test";
+		header["apply_on"] = "req";
+		header["status"] = "on";
+		headers.append(header);
+
+		root["headers"] = headers;
+		root["debug_mode"] = true;
+		root["use_url_contains"] = false;
+
+		Json::StyledWriter writer;
+		std::string output = writer.write(root);
+
+		return std::make_pair(true, output);
+	}
 
 	std::string EntitySessionManager::GetStartSessionAck(CMessage* msg, std::string entityname) {
 		auto s = GetSessionIDByEntityName(entityname);
@@ -487,6 +574,16 @@ namespace Chromium {
 		}
 	}
 
+	std::pair<bool, std::string> EntitySessionManager::FromSessionIdToEntityName(int sessionId)
+	{
+		for (auto it : m_session_map)
+		{
+			if (it.second == sessionId)
+				return std::make_pair(true, it.first);
+		}
+		return std::make_pair(false, "");
+	}
+
 	AckProcessType EntitySessionManager::ProcessWithRecvEvent(CMessage* msg, unsigned int& hdlID) {
 		WSClientReqInfoStruct* p = ReduceOriginTransID(msg);
 		if (NULL == p)

+ 12 - 9
Module/mod_chromium/EntitySessionManager.h

@@ -6,7 +6,7 @@
 #include <string>
 #include "CMessage.h"
 // #include "CSocketClient.h"
-// #include "CWSCodec.h"
+#include "CWSCodec.h"
 
 namespace Chromium {
 
@@ -37,8 +37,8 @@ namespace Chromium {
 
 		std::pair<int, std::string> GetStartSessionRequest(std::string entityname, std::string className);	//返回分配的transId和生成的beginSession串
 		std::pair<int, std::string> GetAllSessionRequest(int transId, bool isInitCfg);
-		RequestProcessType RequestProcess(CMessage* msg, std::string entityName,
-			unsigned int hdlID);
+		std::pair<int, std::string> Get_getconfig_ack(std::string terminalno);
+		RequestProcessType RequestProcess(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo &msgInfo);
 		AckProcessType AckProcess(CMessage* msg, unsigned int& hdlID);
 		AckProcessType AskProcessEvent(CMessage* msg, std::vector<std::pair<int, int>>& transIdandHdlIDArr);
 		std::pair<AckProcessType, std::string> AskProcessSession(CMessage* msg, unsigned int& hdlID);
@@ -56,6 +56,9 @@ namespace Chromium {
 		std::vector<std::string> queryUnLinkSession();
 		static std::map<std::string, int> queryAllSessionInfo();
 		void doWithErrorCode(int errorCode, int transId);
+
+		static std::pair<bool, std::string> FromSessionIdToEntityName(int sessionId);
+
 	private:
 
 		static std::map<std::string, int> m_session_map;	// entity name -> session id
@@ -74,14 +77,14 @@ namespace Chromium {
 		std::string UpdateSessionMap(int transid, int sessionId);	//更新session表并返回更新的实体名
 
 		// process with requests
-		RequestProcessType ProcessWithInfo(CMessage* msg, std::string entityName, unsigned int hdlID);
-		RequestProcessType ProcessWithBeginSession(CMessage* msg, std::string entityName, unsigned int hdlID);
+		RequestProcessType ProcessWithInfo(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo);
+		RequestProcessType ProcessWithBeginSession(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo);
 		RequestProcessType ProcessWithEndSession(CMessage* msg, std::string entityName, unsigned int hdlID);
-		RequestProcessType ProcessWithRequest(CMessage* msg, std::string entityName, unsigned int hdlID);
-		RequestProcessType ProcessWithRegister(CMessage* msg, std::string entityName, unsigned int hdlID);
+		RequestProcessType ProcessWithRequest(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo);
+		RequestProcessType ProcessWithRegister(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo);
 		RequestProcessType ProcessWithUnregister(CMessage* msg, std::string entityName, unsigned int hdlID);
-		RequestProcessType ProcessWithSetVarReq(CMessage* msg, std::string entityName, unsigned int hdlID);
-		RequestProcessType ProcessWithGetVarReq(CMessage* msg, std::string entityName, unsigned int hdlID);
+		RequestProcessType ProcessWithSetVarReq(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo);
+		RequestProcessType ProcessWithGetVarReq(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo);
 
 		AckProcessType ProcessWithAck(CMessage* msg, unsigned int& hdlID);
 		AckProcessType ProcessWithRecvEvent(CMessage* msg, unsigned int& hdlID);

+ 6 - 0
Module/mod_chromium/MessageType.h

@@ -25,6 +25,8 @@ enum MessageType : int
 	GetSession = 16,	//chromium session info
 	// 0x00 00 00 00 - 0x00 00 FF FF	 for web to binary, communicate with other entity
 
+	
+
 
 	// 0x00 01 00 00 - 0x00 01 FF FF	 for web to chromium
 	WEB_CHROMIUM_MSG_BEGIN = 0x00010000,
@@ -32,6 +34,10 @@ enum MessageType : int
 	UnRegisterNotify, //web unregister Notify
 	WEB_CHROMIUM_MSG_END = 0x0001FFFF,
 
+	WEB_SPECICAL_MANAGE_BEGIN = 0x00020000,
+	WEB_GET_HTTP_HEADER,
+	WEB_SPECICAL_MANAGE_END = 0x0002FFFF,
+
 	METHOD_SYSTEM_START = 0x2F0000,
 	METHOD_SYSTEM_LOG_DEBUG,
 	METHOD_SYSTEM_LOG_INFO,

+ 10 - 1
Module/mod_chromium/ReadMe.md

@@ -8,4 +8,13 @@
 * {"entity":"ResourceWatcher","class":"ResourceWatcherService","transID":1,"methodID":6,"signature":651862197,"timeout":60000,"messageType":3,"filter":1,"sessionID":190924109}
 
 # RequestAck:
-* {"messageType":4,"sessionID":190924110,"transID":3,"isEnd":1,"errorCode":0,"errorMsg":"","errMsg":"密钥集丢失(私钥为空),请重置秘钥进行初始化","reserved1":"","reserved2":"","{e12a3dc0-3a0b-47c4-a8c3-75190a42ae68}":"{\"errMsg\":\"密钥集丢失(私钥为空),请重置秘钥进行初始化\",\"reserved1\":\"\",\"reserved2\":\"\"}
+* {"messageType":4,"sessionID":190924110,"transID":3,"isEnd":1,"errorCode":0,"errorMsg":"","errMsg":"密钥集丢失(私钥为空),请重置秘钥进行初始化","reserved1":"","reserved2":"","{e12a3dc0-3a0b-47c4-a8c3-75190a42ae68}":"{\"errMsg\":\"密钥集丢失(私钥为空),请重置秘钥进行初始化\",\"reserved1\":\"\",\"reserved2\":\"\"}
+
+# LogEventMsgType:
+* {"messageType":9,"securityLevel":2,"eventCode":1074790401,"message":"RvcCore MouseOperation onClick"}
+
+# Event:
+* {"messageType":8,"transID":16777233,"eventID":0,"signatureID":175614460,"state":2,"status":"Customer:Control","session_id":"2E23B43E00000013","{e12a3dc0-3a0b-47c4-a8c3-75190a42ae68}":"{\"state\":2,\"status\":\"Customer:Control\",\"session_id\":\"2E23B43E00000013\"}"}
+
+# Info:
+* {"messageType":0,"entity":"CardReadAdapter","class":"CardReadAdapterService","sessionID":3753187,"methodID":1,"signature":-342104338,"ParentSpanId":"0","TraceId":"3741f0ce50404c37b436b0df16ab412c","SpanId":"487c70f8bc4c4177","RVCSessionID":"7555980262-1720747934874000"}

+ 686 - 29
Module/mod_chromium/baseEx.cpp

@@ -13,7 +13,8 @@
 #include <boost/thread/mutex.hpp>
 #include <boost/thread/lock_guard.hpp>
 #include <boost/algorithm/hex.hpp>
-
+#include "winpr/sysinfo.h"
+#include "winpr/timezone.h"
 #include "EventCode.h"
 #include "exLog/log.h"
 #include "cJSON.h"
@@ -33,18 +34,7 @@ using namespace boost::interprocess;
 #include <signal.h>
 #endif
 
-void* logProducer = nullptr;
-std::map<std::string, void*> g_logProducerArr;
-bool g_useMagic = false;
-bool g_loggerInitSuccess = false;
-bool g_logToFile = true;
-bool g_withMedia = false;
-bool g_withConsole = false;
-bool g_withSpecialTest = false;
-bool g_withLinkLog = false;
-bool g_hasInitCfg = false;
-bool g_unsafeAd = false;
-int g_sogouForce = 0;
+
 std::string g_usercodeTranslateFile = "";
 std::map<std::string, std::vector<std::string>> g_networkParse;
 std::map<std::string, clock_t> g_networkExpiredData;
@@ -133,12 +123,14 @@ struct cefclientLog {
 
 bool InitFileLogger(std::string dbgPath)
 {
-	return g_loggerInitSuccess = logger::init(dbgPath.c_str(), "cefLog");
+	auto ret = logger::init(dbgPath.c_str(), "cefLog");
+	ConfigManager::getInstance().setLoggerInitSuccess(ret);
+	return ret;
 }
 
 void DbgToFileLogger(std::string msg)
 {
-	if(g_loggerInitSuccess)
+	if(ConfigManager::getInstance().isLoggerInitSuccess())
 		logger::showLog(msg);
 }
 
@@ -152,7 +144,7 @@ void DbgEx(const char* str, ...)
 	char* buf = (char*)malloc(n + 1);
 	vsprintf(buf, str, arg);
 	auto modifyStr = CSimpleString::Format("%s", buf);
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).withExtendLog(g_logToFile).setResultMsg(modifyStr.GetData())();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).withExtendLog(!ConfigManager::getInstance().m_withNoFileLog).setResultMsg(modifyStr.GetData())();
 	free(buf);
 #else
 	auto modifyStr = CSimpleString::Format("%s", str);
@@ -252,8 +244,8 @@ DWORD SaveCefclientLog(std::string magicStr)
 		boost::interprocess::permissions cur;
 		cur.set_unrestricted();
 		message_queue mq(create_only, dstGuid.c_str(), 100, sizeof(cefclientLog), cur);
-		g_useMagic = true;
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SaveCefclientLog thread begin");
+		ConfigManager::getInstance().setUseMagic(true);
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SaveCefclientLog thread begin");
 		while (true)
 		{
 			cefclientLog t_data;
@@ -265,14 +257,14 @@ DWORD SaveCefclientLog(std::string magicStr)
 			unsigned int t_priority = 0;
 			mq.receive(&t_data, sizeof(cefclientLog), t_recvSize, t_priority);
 			std::string source = std::string(t_data.m_filename) + "(" + std::to_string((ULONGLONG)t_data.m_filePos) + ")";
-#ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
-			DbgWithLink(t_data.m_level, t_data.m_type).withLogProducer(logProducer).setSourceType(source.c_str()).withExtendLog(true).setResultMsg(t_data.m_cefLog)();
+#ifdef OUTPUT_DETAIL_LOG /*DevOps流水线编译,ST环境*/
+			DbgWithLink(t_data.m_level, t_data.m_type).withLogProducer(ConfigManager::getInstance().getLogProducer()).setSourceType(source.c_str()).withExtendLog(true).setResultMsg(t_data.m_cefLog)();
 #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
-			DbgWithLink(t_data.m_level, t_data.m_type).withLogProducer(logProducer).setSourceType(source.c_str()).withExtendLog(true).setResultMsg(t_data.m_cefLog)();
+			DbgWithLink(t_data.m_level, t_data.m_type).withLogProducer(ConfigManager::getInstance().getLogProducer()).setSourceType(source.c_str()).withExtendLog(true).setResultMsg(t_data.m_cefLog)();
 #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
-			DbgWithLink(t_data.m_level, t_data.m_type).withLogProducer(logProducer).setSourceType(source.c_str()).withExtendLog(false).setResultMsg(t_data.m_cefLog)();
+			DbgWithLink(t_data.m_level, t_data.m_type).withLogProducer(ConfigManager::getInstance().getLogProducer()).setSourceType(source.c_str()).withExtendLog(false).setResultMsg(t_data.m_cefLog)();
 #else
-			DbgWithLink(t_data.m_level, t_data.m_type).withLogProducer(logProducer).setSourceType(source.c_str()).withExtendLog(true).setResultMsg(t_data.m_cefLog)();
+			DbgWithLink(t_data.m_level, t_data.m_type).withLogProducer(ConfigManager::getInstance().getLogProducer()).setSourceType(source.c_str()).withExtendLog(false).setResultMsg(t_data.m_cefLog)();
 #endif // DEVOPS
 			if (sizeof(cefclientLog) != t_recvSize)
 				break;
@@ -289,11 +281,11 @@ DWORD SaveCefclientLog(std::string magicStr)
 	}
 	catch (interprocess_exception& ex) {
 		message_queue::remove(dstGuid.c_str());
-		g_useMagic = false;
+		ConfigManager::getInstance().setUseMagic(false);
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s run exception, for %s", dstGuid.c_str(), ex.what());
 		return 1;
 	}
-	g_useMagic = false;
+	ConfigManager::getInstance().setUseMagic(false);
 	message_queue::remove(dstGuid.c_str());
 	return 0;
 }
@@ -374,7 +366,7 @@ std::pair<unsigned long, ErrMsgStruct> getErrMsgByRemark(std::string srcMsg)
 {
 	const std::string headerStr = "UserError=";
 	if (srcMsg.find(headerStr) != 0)
-		return std::make_pair(0, ErrMsgStruct("", srcMsg));
+		return std::make_pair(0, ErrMsgStruct("", srcMsg, headerStr));
 
 	unsigned long userCode = std::stoi(srcMsg.substr(headerStr.length()));
 	std::string userCodeStr = CSimpleString::Format("0x%X", userCode).GetData();
@@ -383,7 +375,7 @@ std::pair<unsigned long, ErrMsgStruct> getErrMsgByRemark(std::string srcMsg)
 	if (g_UserCodeToMsgTip.size() == 0)
 	{
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA42F0").setAPI(__FUNCTION__)("RTA42F0|微服务异常|(%s)", srcMsg.c_str());
-		return std::make_pair(0, ErrMsgStruct("RTA42F0", CSimpleString::Format("RTA42F0|微服务异常|(%s)", srcMsg.c_str()).GetData()));
+		return std::make_pair(0, ErrMsgStruct("RTA42F0", CSimpleString::Format("RTA42F0|微服务异常|(%s)", srcMsg.c_str(), userCodeStr).GetData()));
 	}
 
 	if (g_UserCodeToMsgTip.find(userCodeStr) != g_UserCodeToMsgTip.end())
@@ -394,7 +386,7 @@ std::pair<unsigned long, ErrMsgStruct> getErrMsgByRemark(std::string srcMsg)
 	else
 	{
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA42F1").setAPI(__FUNCTION__)("RTA42F1|错误映射异常|(%s)", srcMsg.c_str());
-		return std::make_pair(userCode, ErrMsgStruct("RTA42F1", CSimpleString::Format("RTA42F1|错误映射异常|(%s)", srcMsg.c_str()).GetData()));
+		return std::make_pair(userCode, ErrMsgStruct("RTA42F1", CSimpleString::Format("RTA42F1|错误映射异常|(%s)", srcMsg.c_str()).GetData(), userCodeStr));
 	}
 }
 
@@ -551,6 +543,8 @@ long printSEG()
 #include <boost/stacktrace.hpp>
 #include "CModTools.h"
 #include "CWebsocketServer.h"
+#include <winpr/sysinfo.h>
+#include <winpr/timezone.h>
 
 std::string g_backtracePath = "";
 
@@ -928,4 +922,667 @@ std::vector<int> getUosBrowserPIDs(int UseUOSBrowser)
 	}
 	return pids;
 }
-#endif
+#endif
+
+
+ConfigManager& ConfigManager::getInstance() {
+	static ConfigManager instance;
+	return instance;
+}
+
+ConfigManager::ConfigManager()
+	: m_iTcpBridgePort(4504), m_strCustomMainUrl(""), m_strCustomAdUrl(""), m_runAd(false), m_runMain(false), m_runExtend(false), m_runLogin(false), m_withBrowser(false), m_withMin(false), m_withClose(false)
+	, m_withDebugMode(false), m_withMagic(false), m_withNoFileLog(false), m_installMode(false), m_withMedia(false), m_withSpecialTest(false), m_withConsole(false),
+	m_withLinkLog(false), m_withUnsafeAd(false), m_noStartupPage(false)
+{
+	void* logProducer = nullptr;
+	std::map<std::string, void*> g_logProducerArr;
+	bool g_useMagic = false;
+	bool g_loggerInitSuccess = false;
+	bool g_withSpecialTest = false;
+	bool g_hasInitCfg = false;//can discard
+	int g_sogouForce = 0;
+}
+
+
+LogManager& LogManager::getInstance() {
+	static LogManager instance;
+	return instance;
+}
+
+void LogManager::logWebSocketBuild(int64_t hdl, const std::string& url, const std::string& isSecurity) {
+	Json::Value log;
+	log["hdl"] = hdl;
+	log["78173721_logType"] = "ws_build";
+
+	Json::Value detail;
+	detail["url"] = url;
+	detail["isSecurity"] = isSecurity;
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+	writeLog(log);
+}
+
+void LogManager::writeLog(const Json::Value& log) {
+	Json::FastWriter writer;
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(writer.write(log).c_str());
+}
+
+std::string LogManager::getCurrentTimestamp() {
+	/*
+	FILETIME ft;
+	SYSTEMTIME st;
+	GetSystemTime(&st);
+	SystemTimeToFileTime(&st, &ft);
+
+	FILETIME utc_ft, local_ft;
+#ifdef _WIN32
+	utc_ft.dwLowDateTime = (DWORD)ft.dwLowDateTime;
+	utc_ft.dwHighDateTime = (DWORD)ft.dwHighDateTime;
+	FileTimeToLocalFileTime(&utc_ft, &local_ft);
+	FileTimeToSystemTime(&local_ft, &st);
+#else
+	GetLocalTime(&st);
+#endif // _WIN32
+*/
+
+
+	using namespace std::chrono;
+
+	auto now = system_clock::now();
+	auto ms = duration_cast<milliseconds>(now.time_since_epoch()) % 1000;
+	auto timer = system_clock::to_time_t(now);
+
+	std::ostringstream oss;
+	oss << std::put_time(std::localtime(&timer), "%Y-%m-%d %H:%M:%S")
+		<< '.' << std::setfill('0') << std::setw(3) << ms.count();
+
+	return oss.str();
+}
+
+void LogManager::logWebSocketBeginSession(int64_t hdl,
+	int64_t web_transID,
+	int64_t inner_transID,
+	const std::string& entity,
+	const std::string& entityClass,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = hdl;
+	log["78173721_logType"] = "ws_beginSession";
+
+	Json::Value detail;
+	detail["web_transID"] = web_transID;
+	detail["inner_transID"] = inner_transID;
+	detail["entity"] = entity;
+	detail["class"] = entityClass;
+	detail["ret"] = ret;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+	detail["operate"] = operate;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logWebSocketClose(int64_t hdl) {
+	Json::Value log;
+	log["hdl"] = hdl;
+	log["78173721_logType"] = "ws_close";
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+	writeLog(log);
+}
+
+void LogManager::logWebSocketInfo(int64_t hdl,
+	int64_t web_transID,
+	int64_t sessionId,
+	const std::string& entity,
+	const std::string& function,
+	int ret,
+	const std::string& operate,
+	int retDetail,
+	const std::string& reason,
+	const std::string& payload) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "ws_info";
+
+	Json::Value detail;
+	detail["web_transID"] = Json::Int64(web_transID);
+	detail["sessionId"] = Json::Int64(sessionId);
+	detail["entity"] = entity;
+	detail["function"] = function;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logWebSocketRegister(int64_t hdl,
+	int64_t web_transID,
+	int64_t inner_transID,
+	const std::string& entity,
+	const std::string& entityClass,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "ws_register";
+
+	Json::Value detail;
+	detail["web_transID"] = Json::Int64(web_transID);
+	detail["inner_transID"] = Json::Int64(inner_transID);
+	detail["entity"] = entity;
+	detail["class"] = entityClass;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logWebSocketRequest(int64_t hdl,
+	int64_t web_transID,
+	int64_t inner_transID,
+	int64_t sessionId,
+	const std::string& entity,
+	const std::string& function,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "ws_request";
+
+	Json::Value detail;
+	detail["web_transID"] = Json::Int64(web_transID);
+	detail["inner_transID"] = Json::Int64(inner_transID);
+	detail["sessionId"] = Json::Int64(sessionId);
+	detail["entity"] = entity;
+	detail["function"] = function;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logWebSocketSetVar(int64_t hdl,
+	int64_t web_transID,
+	int64_t inner_transID,
+	const std::string& name,
+	const std::string& value,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "ws_setvar";
+
+	Json::Value detail;
+	detail["web_transID"] = Json::Int64(web_transID);
+	detail["inner_transID"] = Json::Int64(inner_transID);
+	detail["name"] = name;
+	detail["value"] = value;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logWebSocketGetVar(int64_t hdl,
+	int64_t web_transID,
+	int64_t inner_transID,
+	const std::string& name,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "ws_getvar";
+
+	Json::Value detail;
+	detail["web_transID"] = Json::Int64(web_transID);
+	detail["inner_transID"] = Json::Int64(inner_transID);
+	detail["name"] = name;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logWebSocketBroadcast(int64_t hdl,
+	const std::string& entity,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "ws_broadcast";
+
+	Json::Value detail;
+	detail["entity"] = entity;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logVtmEndSession(int64_t hdl,
+	const std::string& entity,
+	int64_t sessionId,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "vtm_endsession";
+
+	Json::Value detail;
+	detail["entity"] = entity;
+	detail["sessionId"] = Json::Int64(sessionId);
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logVtmRequestAck(int64_t hdl,
+	int64_t web_transID,
+	int64_t inner_transID,
+	int64_t sessionId,
+	const std::string& entity,
+	const std::string& function,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	const std::string& srcByte,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "vtm_requestAck";
+
+	Json::Value detail;
+	detail["web_transID"] = Json::Int64(web_transID);
+	detail["inner_transID"] = Json::Int64(inner_transID);
+	detail["sessionId"] = Json::Int64(sessionId);
+	detail["entity"] = entity;
+	detail["function"] = function;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+	detail["srcByte"] = srcByte;
+#endif
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logVtmEvent(int64_t hdl,
+	int64_t inner_transID,
+	int64_t sessionId,
+	const std::string& entity,
+	int ret,
+	const std::string& operate,
+	const std::vector<std::pair<int, int>>& transIdAndhdl_arr,
+	const std::string& payload,
+	const std::string& srcByte,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "vtm_event";
+
+	Json::Value detail;
+	detail["inner_transID"] = Json::Int64(inner_transID);
+	detail["sessionId"] = Json::Int64(sessionId);
+	detail["entity"] = entity;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+
+	Json::Value transIdAndhdl_json(Json::arrayValue);
+	for (const auto& pair : transIdAndhdl_arr) {
+		Json::Value pairJson(Json::objectValue);
+		pairJson["transId"] = Json::Int64(pair.first);
+		pairJson["hdl"] = Json::Int64(pair.second);
+		transIdAndhdl_json.append(pairJson);
+	}
+	detail["transIdAndhdl_arr"] = transIdAndhdl_json;
+
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+	detail["srcByte"] = srcByte;
+#endif
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logVtmSessionAck(int64_t hdl,
+	int64_t web_transID,
+	int64_t inner_transID,
+	int64_t sessionId,
+	const std::string& entity,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	const std::string& srcByte,
+	int retDetail,
+	const std::string& reason) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "vtm_sessionAck";
+
+	Json::Value detail;
+	detail["web_transID"] = Json::Int64(web_transID);
+	detail["inner_transID"] = Json::Int64(inner_transID);
+	detail["sessionId"] = Json::Int64(sessionId);
+	detail["entity"] = entity;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+	detail["srcByte"] = srcByte;
+#endif
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logWsLogEvent(
+	int64_t hdl,
+	int securityLevel,
+	int eventCode,
+	const std::string& message,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason
+) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "ws_logEvent";
+
+	Json::Value detail;
+	detail["securityLevel"] = securityLevel;
+	detail["eventCode"] = eventCode;
+	detail["message"] = message;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logWsLogWarn(
+	int64_t hdl,
+	int securityLevel,
+	int eventCode,
+	const std::string& message,
+	int ret,
+	const std::string& operate,
+	const std::string& payload,
+	int retDetail,
+	const std::string& reason
+) {
+	Json::Value log;
+	log["hdl"] = Json::Int64(hdl);
+	log["78173721_logType"] = "ws_logWarn";
+
+	Json::Value detail;
+	detail["securityLevel"] = securityLevel;
+	detail["eventCode"] = eventCode;
+	
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+#ifdef OUTPUT_DETAIL_LOG
+	detail["payload"] = payload;
+	detail["message"] = message;
+#endif
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logEntityOnLog(
+	const std::string& entity,
+	int64_t usercode,
+	const std::string& usercodeStr,
+	int ret,
+	const std::string& operate,
+	int retDetail,
+	const std::string& reason
+) {
+	Json::Value log;
+	log["78173721_logType"] = "entity_onlog";
+
+	Json::Value detail;
+	detail["entity"] = entity;
+	detail["usercode"] = Json::Int64(usercode);
+	detail["usercodeStr"] = usercodeStr;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+	log["detail"] = detail;
+	log["timestamp"] = getCurrentTimestamp();
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+
+	writeLog(log);
+}
+
+void LogManager::logEntityBegin(int no_startup) {
+	Json::Value log;
+	log["78173721_logType"] = "entity_begin";
+
+	Json::Value detail;
+	detail["no_startup"] = no_startup;
+
+	log["detail"] = detail;
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+	log["timestamp"] = getCurrentTimestamp();
+
+	writeLog(log);
+}
+
+void LogManager::logEntityOpenPage(
+	const std::string& pageType,
+	int64_t pid,
+	int ret,
+	const std::string& operate,
+	int retDetail,
+	const std::string& reason
+) {
+	Json::Value log;
+	log["78173721_logType"] = "entity_openPage";
+
+	Json::Value detail;
+	detail["pageType"] = pageType;
+	detail["pid"] = Json::Int64(pid);
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+	log["detail"] = detail;
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+	log["timestamp"] = getCurrentTimestamp();
+
+	writeLog(log);
+}
+
+void LogManager::logEntityStageChange(
+	const std::string& stage,
+	int ret,
+	const std::string& operate,
+	int retDetail,
+	const std::string& reason
+) {
+	Json::Value log;
+	log["78173721_logType"] = "entity_stageChange";
+
+	Json::Value detail;
+	detail["stage"] = stage;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+	log["detail"] = detail;
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+	log["timestamp"] = getCurrentTimestamp();
+
+	writeLog(log);
+}
+
+void LogManager::logEntityStatus(
+	const std::string& status,
+	int level,
+	int ret,
+	const std::string& operate,
+	int retDetail,
+	const std::string& reason
+) {
+	Json::Value log;
+	log["78173721_logType"] = "entity_status";
+
+	Json::Value detail;
+	detail["status"] = status;
+	detail["level"] = level;
+	detail["ret"] = ret;
+	detail["operate"] = operate;
+	detail["retDetail"] = retDetail;
+	detail["reason"] = reason;
+
+	log["detail"] = detail;
+	log["threadId"] = Json::Int64(GetCurrentThreadId());
+	log["timestamp"] = getCurrentTimestamp();
+
+	writeLog(log);
+}

+ 404 - 11
Module/mod_chromium/baseEx.h

@@ -3,17 +3,11 @@
 #include<vector>
 #include<string>
 #include<map>
+#include<deque>
+#include "websocketpp/config/asio.hpp"
+#include "websocketpp/server.hpp"
+#include "json/json.h"
 
-extern void* logProducer;
-extern std::map<std::string, void*> g_logProducerArr;
-extern bool g_useMagic;
-extern bool g_logToFile;
-extern bool g_withMedia;
-extern bool g_withConsole;
-extern bool g_withLinkLog;
-extern bool g_hasInitCfg;
-extern bool g_unsafeAd;
-extern int g_sogouForce;
 
 #define DEFAULT_KEY_LEN 256
 
@@ -35,9 +29,11 @@ void InitUserCodeToMsgTip(CAutoArray<CSimpleStringA>& strErrorCodeArr, CAutoArra
 struct ErrMsgStruct {
 	std::string VTMCode;
 	std::string errMsg;
+	std::string userCode;
 
 	// 带参数的构造函数,参数有默认值
-	ErrMsgStruct(const std::string& tmp_VTMCode = "", const std::string& tmp_errMsg = "") : VTMCode(tmp_VTMCode), errMsg(tmp_errMsg) {}
+	ErrMsgStruct(const std::string& tmp_VTMCode = "", const std::string& tmp_errMsg = "", const std::string& tmp_userCode = "") 
+		: VTMCode(tmp_VTMCode), errMsg(tmp_errMsg), userCode(tmp_userCode) {}
 };
 
 
@@ -112,3 +108,400 @@ private:
 	SM2ProtocolState m_state;
 	
 };
+
+struct SYS_EVENT_PARAM
+{
+	std::string key;
+	std::string value;
+	std::string oldValue;
+	std::string entityName;
+
+	// 默认构造函数
+	SYS_EVENT_PARAM() = default;
+
+	// 带参数的构造函数
+	SYS_EVENT_PARAM(const std::string& k, const std::string& v, const std::string& ov, const std::string& en)
+		: key(k), value(v), oldValue(ov), entityName(en) {}
+
+	// 拷贝构造函数
+	SYS_EVENT_PARAM(const SYS_EVENT_PARAM& other)
+		: key(other.key), value(other.value), oldValue(other.oldValue), entityName(other.entityName) {}
+
+	// 拷贝赋值运算符
+	SYS_EVENT_PARAM& operator=(const SYS_EVENT_PARAM& other) {
+		if (this != &other) {
+			key = other.key;
+			value = other.value;
+			oldValue = other.oldValue;
+			entityName = other.entityName;
+		}
+		return *this;
+	}
+
+	// 禁用移动构造函数
+	SYS_EVENT_PARAM(SYS_EVENT_PARAM&&) = delete;
+
+	// 禁用移动赋值运算符
+	SYS_EVENT_PARAM& operator=(SYS_EVENT_PARAM&&) = delete;
+};
+
+class ConfigManager {
+public:
+    static ConfigManager& getInstance();
+private:
+	//old global params
+	void* logProducer;
+	std::map<std::string, void*> g_logProducerArr;
+	bool g_useMagic;
+	bool g_hasInitCfg;
+	int g_sogouForce;
+	bool g_loggerInitSuccess;
+public:
+	void* getLogProducer() const { return logProducer; };
+	void setLogProducer(void* t_logProducer) { logProducer = t_logProducer; };
+
+	std::map<std::string, void*>& getLogProducerArr() { return g_logProducerArr; };
+
+	bool isUseMagic() const{ return g_useMagic; };
+	void setUseMagic(bool useMagic) { g_useMagic = useMagic; };
+
+
+	bool isHasInitCfg() const { return g_hasInitCfg; };
+	void setHasInitCfg(bool hasInitCfg) { g_hasInitCfg = hasInitCfg; };
+
+	int getSogouForce() const { return g_sogouForce; };
+	void setSogouForce(int sogouForce) { g_sogouForce = sogouForce; };
+
+	bool isLoggerInitSuccess() const { return g_loggerInitSuccess; };
+	void setLoggerInitSuccess(bool loggerInitSuccess) { g_loggerInitSuccess = loggerInitSuccess; };
+
+//params from chromium
+private:
+	CSystemStaticInfo m_sysInfo;
+	int m_iTcpBridgePort;
+	
+	//for now on, easy modify
+
+public:
+	std::string m_strCustomMainUrl, m_strCustomAdUrl;
+	bool m_runAd/*广告*/, m_runMain/*业务*/, m_runExtend/*低柜副屏*/, m_runLogin/*用户桌面,可能木有用*/, m_withBrowser/*是否需要与browser交互*/;
+	bool m_withDebugMode/*是否启动debug模式*/, m_withMagic/*启用随机共享内存*/, m_withNoFileLog/*是否不需要本地日志落盘*/, m_withMedia/*开启多媒体选项*/;
+	bool m_withUnsafeAd/*Ad页面忽略安全选项*/;
+	bool m_withConsole;
+	bool m_withSpecialTest/*开启一些终端功能的测试*/, m_withLinkLog/*开启链路中的中间链路日志*/;
+	bool m_withMin, m_withClose, m_installMode;
+	std::deque<SYS_EVENT_PARAM> m_eventArr;
+	bool m_noStartupPage;
+	std::map<std::string, std::vector<int>> m_commonPageArr;
+
+public:
+	CSystemStaticInfo& getSysInfo() { return m_sysInfo; };
+
+	int getTcpBridgePort() const { return m_iTcpBridgePort; };
+	void setTcpBridgePort(int iTcpBridgePort) { m_iTcpBridgePort = iTcpBridgePort; };
+
+//params from CModTools
+public:
+	CSimpleString m_strSite, m_strMachineType;
+	CSimpleString m_UserMgrUrlStr, m_UserMgrUrlNoSidebarStr, m_UserMgrUrlNoSidebarMutiStr, m_UserMgrUrlFultureStr, m_UserMgrAdStr;
+	std::string m_strCacheHead;
+
+
+//params for CWebsocketServer
+public:
+	std::map<unsigned int, websocketpp::connection_hdl> m_connection_hdls;
+	std::map<unsigned int, websocketpp::connection_hdl> m_connection_ws_sm2_hdls;
+	std::map<unsigned int, websocketpp::connection_hdl> m_connection_wss_hdls;
+	std::map<unsigned int, std::shared_ptr<SM2_Encrypt_Manager>> m_ws_sm2_hdls_manager;
+	std::map<std::string, std::vector<std::pair<websocketpp::connection_hdl, std::string>> > m_msg_pool;
+	std::map<std::string, std::string> m_entityAndClass;//不知道为什么不能用map<string,map<>>,猜测应该是websocketpp::connection_hdl生成问题
+	std::map<unsigned, unsigned> m_notifyPool; //hdl和notify transId对应
+
+private:
+    ConfigManager();
+    ConfigManager(const ConfigManager&) = delete;
+    ConfigManager& operator=(const ConfigManager&) = delete;
+};
+
+
+class LogManager {
+public:
+	static LogManager& getInstance();
+
+	void logWebSocketBuild(int64_t hdl, const std::string& url, const std::string& isSecurity);
+	void logWebSocketClose(int64_t hdl);
+	/**
+	 * @brief 记录 WebSocket 会话开始的日志
+	 *
+	 * @param hdl WebSocket 的唯一标识符
+	 * @param transID 事务ID
+	 * @param entity 实体名称
+	 * @param entityClass 实体类名
+	 * @param ret 返回状态(0: 成功, 1: 警告, 2: 错误)
+	 * @param retDetail 详细的返回代码
+	 * @param reason 警告或失败的原因
+	 * @param srcMsg 源消息
+	 */
+	void logWebSocketBeginSession(int64_t hdl,
+		int64_t web_transID,
+		int64_t inner_transID,
+		const std::string& entity,
+		const std::string& entityClass,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	/**
+	 * @brief 记录 WebSocket 信息日志
+	 *
+	 * @param hdl WebSocket 的唯一标识符
+	 * @param web_transID Web 端事务 ID
+	 * @param sessionId 会话 ID
+	 * @param entity 实体名称
+	 * @param function 函数名称
+	 * @param ret 返回状态(0: 成功, 1: 警告, 2: 错误)
+	 * @param operate 操作描述
+	 * @param retDetail 详细的返回代码
+	 * @param reason 警告或失败的原因
+	 * @param payload 有效载荷
+	 */
+	void logWebSocketInfo(int64_t hdl,
+		int64_t web_transID,
+		int64_t sessionId,
+		const std::string& entity,
+		const std::string& function,
+		int ret,
+		const std::string& operate,
+		int retDetail,
+		const std::string& reason,
+		const std::string& payload);
+
+	/**
+	 * @brief 记录 WebSocket 注册信息日志
+	 *
+	 * @param hdl WebSocket 的唯一标识符
+	 * @param web_transID Web 端事务 ID
+	 * @param inner_transID 内部事务 ID
+	 * @param entity 实体名称
+	 * @param entityClass 实体类名
+	 * @param ret 返回状态(0: 成功, 1: 警告, 2: 错误)
+	 * @param operate 操作描述
+	 * @param payload 有效载荷
+	 * @param retDetail 详细的返回代码(默认为0)
+	 * @param reason 警告或失败的原因(默认为空字符串)
+	 */
+	void logWebSocketRegister(int64_t hdl,
+		int64_t web_transID,
+		int64_t inner_transID,
+		const std::string& entity,
+		const std::string& entityClass,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+
+	/**
+	 * @brief 记录 WebSocket 请求信息日志
+	 *
+	 * @param hdl WebSocket 的唯一标识符
+	 * @param web_transID Web 端事务 ID
+	 * @param inner_transID 内部事务 ID
+	 * @param sessionId 会话 ID
+	 * @param entity 实体名称
+	 * @param function 函数名称
+	 * @param ret 返回状态(0: 成功, 1: 警告, 2: 错误)
+	 * @param operate 操作描述
+	 * @param payload 有效载荷
+	 * @param retDetail 详细的返回代码(默认为0)
+	 * @param reason 警告或失败的原因(默认为空字符串)
+	 */
+	void logWebSocketRequest(int64_t hdl,
+		int64_t web_transID,
+		int64_t inner_transID,
+		int64_t sessionId,
+		const std::string& entity,
+		const std::string& function,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	/**
+	 * @brief 记录 WebSocket 设置变量的日志
+	 *
+	 * @param hdl WebSocket 的唯一标识符
+	 * @param web_transID Web 端事务 ID
+	 * @param inner_transID 内部事务 ID
+	 * @param name 变量名称
+	 * @param value 变量值
+	 * @param ret 返回状态(0: 成功, 1: 警告, 2: 错误)
+	 * @param operate 操作描述
+	 * @param payload 有效载荷
+	 * @param retDetail 详细的返回代码(默认为0)
+	 * @param reason 警告或失败的原因(默认为空字符串)
+	 */
+	void logWebSocketSetVar(int64_t hdl,
+		int64_t web_transID,
+		int64_t inner_transID,
+		const std::string& name,
+		const std::string& value,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	/**
+	 * @brief 记录 WebSocket 获取变量的日志
+	 *
+	 * @param hdl WebSocket 的唯一标识符
+	 * @param web_transID Web 端事务 ID
+	 * @param inner_transID 内部事务 ID
+	 * @param name 变量名称
+	 * @param ret 返回状态(0: 成功, 1: 警告, 2: 错误)
+	 * @param operate 操作描述
+	 * @param payload 有效载荷
+	 * @param retDetail 详细的返回代码(默认为0)
+	 * @param reason 警告或失败的原因(默认为空字符串)
+	 */
+	void logWebSocketGetVar(int64_t hdl,
+		int64_t web_transID,
+		int64_t inner_transID,
+		const std::string& name,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	void logWebSocketBroadcast(int64_t hdl,
+		const std::string& entity,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	void logVtmEndSession(int64_t hdl,
+		const std::string& entity,
+		int64_t sessionId,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	void logVtmRequestAck(int64_t hdl,
+		int64_t web_transID,
+		int64_t inner_transID,
+		int64_t sessionId,
+		const std::string& entity,
+		const std::string& function,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		const std::string& srcByte,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	void logVtmEvent(int64_t hdl,
+		int64_t inner_transID,
+		int64_t sessionId,
+		const std::string& entity,
+		int ret,
+		const std::string& operate,
+		const std::vector<std::pair<int, int>>& transIdAndhdl_arr,
+		const std::string& payload,
+		const std::string& srcByte,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	void logVtmSessionAck(int64_t hdl,
+		int64_t web_transID,
+		int64_t inner_transID,
+		int64_t sessionId,
+		const std::string& entity,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		const std::string& srcByte,
+		int retDetail = 0,
+		const std::string& reason = "");
+
+	void logWsLogEvent(
+		int64_t hdl,
+		int securityLevel,
+		int eventCode,
+		const std::string& message,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = ""
+	);
+
+	void logWsLogWarn(
+		int64_t hdl,
+		int securityLevel,
+		int eventCode,
+		const std::string& message,
+		int ret,
+		const std::string& operate,
+		const std::string& payload,
+		int retDetail = 0,
+		const std::string& reason = ""
+	);
+
+	void logEntityOnLog(
+		const std::string& entity,
+		int64_t usercode,
+		const std::string& usercodeStr,
+		int ret,
+		const std::string& operate,
+		int retDetail = 0,
+		const std::string& reason = ""
+	);
+
+	void logEntityBegin(int no_startup);
+
+	void logEntityOpenPage(
+		const std::string& pageType,
+		int64_t pid,
+		int ret,
+		const std::string& operate,
+		int retDetail = 0,
+		const std::string& reason = ""
+	);
+
+	void logEntityStageChange(
+		const std::string& stage,
+		int ret,
+		const std::string& operate,
+		int retDetail = 0,
+		const std::string& reason = ""
+	);
+
+	void logEntityStatus(
+		const std::string& status,
+		int level,
+		int ret,
+		const std::string& operate,
+		int retDetail = 0,
+		const std::string& reason = ""
+	);
+
+private:
+	LogManager() = default;
+	LogManager(const LogManager&) = delete;
+	LogManager& operator=(const LogManager&) = delete;
+
+	void writeLog(const Json::Value& log);
+	std::string getCurrentTimestamp();
+};
+
+

+ 169 - 137
Module/mod_chromium/mod_chromium.cpp

@@ -76,10 +76,7 @@ namespace Chromium {
 	}
 
 
-	CChromiumEntity::CChromiumEntity() :m_pWsServer(NULL), m_iTcpBridgePort(4504), m_pTimerListener(NULL), m_strCustomMainUrl(true)
-		, m_runAd(false), m_runMain(false), m_runExtend(false), m_runLogin(false), m_withBrowser(false), m_withMin(false), m_withClose(false)
-		, m_withDebugMode(false), m_withMagic(false), m_withNoFileLog(false), m_installMode(false), m_withMedia(false), m_withSpecialTest(false), m_withConsole(false),
-		m_withLinkLog(false), m_withUnsafeAd(false), m_noStartupPage(false)
+	CChromiumEntity::CChromiumEntity() :m_pWsServer(NULL), m_pTimerListener(NULL)
 	{
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CChromiumEntity constructor");
 
@@ -181,10 +178,10 @@ namespace Chromium {
 			std::this_thread::sleep_for(std::chrono::seconds(2));
 			auto dstPids = getUosBrowserPIDs(CModTools::get_mutable_instance().getUosBrowser());
 
-			if (m_commonPageArr.find(strTitle) == m_commonPageArr.end())
+			if (ConfigManager::getInstance().m_commonPageArr.find(strTitle) == ConfigManager::getInstance().m_commonPageArr.end())
 			{
 				std::vector<int> tmp;
-				m_commonPageArr[strTitle] = tmp;
+				ConfigManager::getInstance().m_commonPageArr[strTitle] = tmp;
 			}
 			std::vector<int> difference;
 			// 使用 std::set_difference 查找差值
@@ -198,7 +195,7 @@ namespace Chromium {
 			for (auto it : difference)
 			{
 				//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("open commonPage %d", it);
-				m_commonPageArr[strTitle].push_back(it);
+				ConfigManager::getInstance().m_commonPageArr[strTitle].push_back(it);
 			}
 #endif
 			ctx->Answer(ret.first, ret.first);
@@ -218,9 +215,9 @@ namespace Chromium {
 			std::this_thread::sleep_for(std::chrono::seconds(1));
 			CModTools::get_mutable_instance().stopCommonPage(strName);
 #else
-			if (m_commonPageArr.find(strName) != m_commonPageArr.end())
+			if (ConfigManager::getInstance().m_commonPageArr.find(strName) != ConfigManager::getInstance().m_commonPageArr.end())
 			{
-				auto arr = m_commonPageArr[strName];
+				auto arr = ConfigManager::getInstance().m_commonPageArr[strName];
 				for (auto it : arr)
 				{
 					CSimpleStringA cmd = CSimpleStringA::Format("sudo kill -9 %d", it);
@@ -228,7 +225,7 @@ namespace Chromium {
 					system(cmd.GetData());
 				}
 				arr.clear();
-				m_commonPageArr[strName] = arr;
+				ConfigManager::getInstance().m_commonPageArr[strName] = arr;
 			}
 			std::this_thread::sleep_for(std::chrono::seconds(1));
 #endif // RVC_OS_WIN
@@ -312,7 +309,7 @@ namespace Chromium {
 
 	void CChromiumEntity::OnPreStart_Init(CAutoArray<CSimpleStringA>& strArgs, CSmartPointer<ITransactionContext>& pTransactionContext)
 	{
-		LOG_FUNCTION();
+		LogManager::getInstance().logEntityStageChange("OnPreStart_Init", 0, "begin");
 #ifdef OPEN_PERF
 		auto profStr = CSimpleString::Format("chromiumAnalyze_%s.prof", generateTimeStr(true).c_str());
 		std::thread([](std::string str) {
@@ -334,23 +331,24 @@ namespace Chromium {
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("strArgs[%d] = %s", i, strArgs[i].GetData());
 				}
 				if (ArgsCount == 1) {
-					m_strCustomMainUrl = strArgs[0];
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Get custom main ulr: %s", m_strCustomMainUrl.GetData());
+					ConfigManager::getInstance().m_strCustomMainUrl = strArgs[0].GetData();
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Get custom main ulr: %s", ConfigManager::getInstance().m_strCustomMainUrl.c_str());
 				}
 				else if (ArgsCount == 2)
 				{
-					m_strCustomMainUrl = strArgs[0];
-					m_strCustomAdUrl = strArgs[1];
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Get custom main url: %s, ad url: %s", m_strCustomMainUrl.GetData(), m_strCustomAdUrl.GetData());
+					ConfigManager::getInstance().m_strCustomMainUrl = strArgs[0].GetData();
+					ConfigManager::getInstance().m_strCustomAdUrl = strArgs[1].GetData();
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Get custom main url: %s, ad url: %s"
+						, ConfigManager::getInstance().m_strCustomMainUrl.c_str(), ConfigManager::getInstance().m_strCustomAdUrl.c_str());
 				}
 #endif
 
-				GetFunction()->GetSystemStaticInfo(m_sysInfo);
+				GetFunction()->GetSystemStaticInfo(ConfigManager::getInstance().getSysInfo());
 				if (!IsConfigMode()) {
 				CSmartPointer<IConfigInfo> spConfig;
 				if (Error_Succeed == GetFunction()->OpenConfig(Config_CenterSetting, spConfig))//特别坑,这个OpenConfig返回一直都是success
 				{
-					auto webMaskKey = CSimpleString::Format("WebMask_%s", m_sysInfo.strMachineType.GetData());
+					auto webMaskKey = CSimpleString::Format("WebMask_%s", ConfigManager::getInstance().getSysInfo().strMachineType.GetData());
 					CSimpleString webMaskStr;
 					bool no_startup = false;
 					if (Error_Succeed == spConfig->ReadConfigValue("Chromium", webMaskKey.GetData(), webMaskStr))
@@ -360,69 +358,71 @@ namespace Chromium {
 						{
 							auto trimStr = maskArr[i].Trim();
 							if (!trimStr.Compare("ad", true))//will open ad browser
-								m_runAd = true;
+								ConfigManager::getInstance().m_runAd = true;
 							else if (!trimStr.Compare("main", true))//will open main browser
-								m_runMain = true;
+								ConfigManager::getInstance().m_runMain = true;
 							else if (!trimStr.Compare("extend", true))//will open extend browser
-								m_runExtend = true;
+								ConfigManager::getInstance().m_runExtend = true;
 							else if (!trimStr.Compare("login", true))//will open login(User Desktop) browser
-								m_runLogin = true;
+								ConfigManager::getInstance().m_runLogin = true;
 							else if (!trimStr.Compare("with_browser", true))//will not open any browser
-								m_withBrowser = true;
+								ConfigManager::getInstance().m_withBrowser = true;
 							else if (!trimStr.Compare("with_min", true))//the errPage contains min button
-								m_withMin = true;
+								ConfigManager::getInstance().m_withMin = true;
 							else if (!trimStr.Compare("with_close", true))//the errPage contains close button
-								m_withClose = true;
+								ConfigManager::getInstance().m_withClose = true;
 							else if (!trimStr.Compare("with_debugmode", true))//the browser will open remote control function
-								m_withDebugMode = true;
+								ConfigManager::getInstance().m_withDebugMode = true;
 							else if (!trimStr.Compare("with_magic", true))//the browser will open special queue for log sender.
-								m_withMagic = true;
+								ConfigManager::getInstance().m_withMagic = true;
 							else if (!trimStr.Compare("with_media", true))//the browser will support media play and RTC function
-								m_withMedia = true;
+								ConfigManager::getInstance().m_withMedia = true;
 							else if (!trimStr.Compare("with_unsafe_ad", true))
-								m_withUnsafeAd = g_unsafeAd = true;
+								ConfigManager::getInstance().m_withUnsafeAd = true;
 							else if (!trimStr.Compare("with_specialTest", true))//chromium will run specical test
-								m_withSpecialTest = true;
+								ConfigManager::getInstance().m_withSpecialTest = true;
 							else if (!trimStr.Compare("with_LinkLog", true))//control do_sendJson to print more logs(request)
-								m_withLinkLog = true;
+								ConfigManager::getInstance().m_withLinkLog = true;
 							else if (!trimStr.Compare("with_nofilelog", true))//DbgEx do not print logs to local storage, but DbgEx() is discard.
-								m_withNoFileLog = true;
+								ConfigManager::getInstance().m_withNoFileLog = true;
 							else if (!trimStr.Compare("with_console", true))//control browser will print console logs
-								g_withConsole = m_withConsole = true;
+								ConfigManager::getInstance().m_withConsole = true;
 							else if (!trimStr.Compare("no_startup", true))//control browser will print console logs
 								no_startup = true;
 							else if (!trimStr.Compare("sogou_force", true))//force click setfocus page every time
-								g_sogouForce = 1;
+								ConfigManager::getInstance().setSogouForce(1);
 							else if (!trimStr.Compare("sogou_no", true))//not adapt to sogou
-								g_sogouForce = 2;
+								ConfigManager::getInstance().setSogouForce(2);
 						}
 						CSmartPointer<IConfigInfo> chromiumCfg;
-						if (m_runMain == true && Error_Succeed == GetFunction()->OpenConfig(Config_Cache, chromiumCfg))
+						if (ConfigManager::getInstance().m_runMain == true && Error_Succeed == GetFunction()->OpenConfig(Config_Cache, chromiumCfg))
 							chromiumCfg->WriteConfigValueInt("Run", "no_startup", no_startup ? 1 : 0);
 
 
 
 #if (defined _WIN32 || defined _WIN64)
-						if (m_withDebugMode)
-							CModTools::get_mutable_instance().setWithDebugMode(m_withDebugMode);
 #else
 						//对于UOS来说,没有最小化和关闭按钮
-						m_withMin = false;
-						m_withClose = false;
+						ConfigManager::getInstance().m_withMin = false;
+						ConfigManager::getInstance().m_withClose = false;
 #endif
+						CSimpleString msg = CSimpleString::Format("MachineType: %s, find %s, readStr:%s, m_runAd:%d, m_runMain:%d, m_runExtend:%d, m_runLogin:%d, \
+							m_withBrowser:%d, with_min:%d, with_close:%d, m_withDebugMode:%d, m_withMagic:%d, m_withNoFileLog:%d, m_withMedia:%d, m_withSpecialTest:%d, m_withConsole:%d, m_withLinkLog:%d",
+							ConfigManager::getInstance().getSysInfo().strMachineType.GetData(), webMaskKey.GetData(), webMaskStr.GetData(),
+							ConfigManager::getInstance().m_runAd, ConfigManager::getInstance().m_runMain, ConfigManager::getInstance().m_runExtend, 
+							ConfigManager::getInstance().m_runLogin, ConfigManager::getInstance().m_withBrowser, ConfigManager::getInstance().m_withMin,
+							ConfigManager::getInstance().m_withClose, ConfigManager::getInstance().m_withDebugMode, ConfigManager::getInstance().m_withMagic, 
+							ConfigManager::getInstance().m_withNoFileLog, ConfigManager::getInstance().m_withMedia, ConfigManager::getInstance().m_withSpecialTest, 
+							ConfigManager::getInstance().m_withConsole, ConfigManager::getInstance().m_withLinkLog);
+						LogManager::getInstance().logEntityStatus(msg.GetData(), LOG_LEVEL_INFO, 0, "none");
+						/*
 						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("MachineType: %s, find %s, readStr:%s, m_runAd:%d, m_runMain:%d, m_runExtend:%d, m_runLogin:%d, \
 							m_withBrowser:%d, with_min:%d, with_close:%d, m_withDebugMode:%d, m_withMagic:%d, m_withNoFileLog:%d, m_withMedia:%d, m_withSpecialTest:%d, m_withConsole:%d, m_withLinkLog:%d",
 							m_sysInfo.strMachineType.GetData(), webMaskKey.GetData(), webMaskStr.GetData(), m_runAd, m_runMain, m_runExtend, m_runLogin, m_withBrowser
 						,m_withMin, m_withClose, m_withDebugMode, m_withMagic, m_withNoFileLog, m_withMedia, m_withSpecialTest, m_withConsole, m_withLinkLog);
+						*/
+
 						
-						if (m_withMin)
-							CModTools::get_mutable_instance().setWithMin(m_withMin);
-						if (m_withClose)
-							CModTools::get_mutable_instance().setWithClose(m_withClose);
-						
-						g_logToFile = !m_withNoFileLog;
-						g_withMedia = m_withMedia;
-						g_withLinkLog = m_withLinkLog;
 
 
 						int forceCacheClean = false;
@@ -438,32 +438,37 @@ namespace Chromium {
 					else
 						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("can not find %s, use default", webMaskKey.GetData());
 				}
-				if (!m_runAd && !m_runMain && !m_runExtend && !m_withBrowser)
+				if (!ConfigManager::getInstance().m_runAd &&
+					!ConfigManager::getInstance().m_runMain &&
+					!ConfigManager::getInstance().m_runExtend &&
+					!ConfigManager::getInstance().m_withBrowser)
 				{
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("can not open centerSetting, maybe fault");
 				}
 #ifdef RVC_OS_WIN
-				if (m_withMagic)
+				if (ConfigManager::getInstance().m_withMagic)
 				{
 					std::string magicStr = CModTools::get_mutable_instance().getMagicStr();
 					boost::thread(boost::bind(SaveCefclientLog, magicStr)).detach();
 				}
 #endif
 		}
-		if (m_withSpecialTest)
+		if (ConfigManager::getInstance().m_withSpecialTest)
 		{
 			CSimpleString strPath;
 			GetFunction()->GetPath("Downloads", strPath);
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Downloads path %s, ", strPath.GetData());
 		}
+		LogManager::getInstance().logEntityStageChange("OnPreStart_Init", 0, "end");
 	}
 
 	bool CChromiumEntity::OnPreStart_socketStart(CAutoArray<CSimpleStringA>& strArgs, CSmartPointer<ITransactionContext>& pTransactionContext)
 	{
+		LogManager::getInstance().logEntityStageChange("OnPreStart_socketStart", 0, "begin");
 		ErrorCodeEnum Error;
-		if (Error_Succeed != (Error = GetFunction()->StartTcpBridgeServer(m_iTcpBridgePort)))
+		if (Error_Succeed != (Error = GetFunction()->StartTcpBridgeServer(ConfigManager::getInstance().getTcpBridgePort())))
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("start tcp bridge server failed!");
+			LogManager::getInstance().logEntityStageChange("OnPreStart_socketStart", 2, "end", Error_Unexpect, "start tcp bridge server failed!");
 			pTransactionContext->SendAnswer(Error);
 			return false;
 		}
@@ -475,11 +480,13 @@ namespace Chromium {
 		m_pWsServer = new CWebsocketServer(strStructPath, this);
 		m_pWsServer->run();
 
+		LogManager::getInstance().logEntityStageChange("OnPreStart_socketStart", 0, "end");
 		return true;
 	}
 
 	bool CChromiumEntity::OnPreStart_register(CAutoArray<CSimpleStringA>& strArgs, CSmartPointer<ITransactionContext>& pTransactionContext)
 	{
+		LogManager::getInstance().logEntityStageChange("OnPreStart_register", 0, "begin");
 		ErrorCodeEnum Error;
 
 #if defined(RVC_OS_LINUX)
@@ -491,32 +498,43 @@ namespace Chromium {
         }
 #endif //RVC_OS_LINUX
 
-		if (!m_withBrowser)
+		if (!ConfigManager::getInstance().m_withBrowser)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("subscribe AccessAuthorization %s, %d",
-				Error_Succeed == (Error = GetFunction()->SubscribeLog(m_uuidAccessAuth, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "AccessAuthorization")) ? "success" : "failed", Error);
+			if (Error_Succeed == (Error = GetFunction()->SubscribeLog(m_uuidAccessAuth, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "AccessAuthorization")))
+				LogManager::getInstance().logEntityStatus("订阅AccessAuthorization消息成功", LOG_LEVEL_INFO, 0, "none");
+			else
+				LogManager::getInstance().logEntityStatus("订阅AccessAuthorization消息失败", LOG_LEVEL_ERROR, 2, "none", Error, "");
+
+
+			if (Error_Succeed == (Error = GetFunction()->SubscribeBroadcast("ResourceWatcher", NULL, this, m_uuidResourceWatch)))
+				LogManager::getInstance().logEntityStatus("订阅ResourceWatcher广播成功", LOG_LEVEL_INFO, 0, "none");
+			else
+				LogManager::getInstance().logEntityStatus("订阅ResourceWatcher广播失败", LOG_LEVEL_ERROR, 2, "none", Error, "");
+
 
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("subscribe ResourceWatcher %s, %d",
-				Error_Succeed == (Error = GetFunction()->SubscribeBroadcast("ResourceWatcher", NULL, this, m_uuidResourceWatch)) ? "success" : "failed", Error);
 
 
-			if (Error_Succeed != GetFunction()->RegistSysVarEvent("UIState", this))
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("RegistSysVarEvent UIState failed!");
-			if (Error_Succeed != GetFunction()->RegistSysVarEvent("TerminalStage", this))
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("RegistSysVarEvent TerminalStage failed!");
-			if (Error_Succeed != GetFunction()->RegistSysVarEvent("CardStoreInUse", this))
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("RegistSysVarEvent CardStoreInUse failed!");
+			if (Error_Succeed != (Error = GetFunction()->RegistSysVarEvent("UIState", this)))
+				LogManager::getInstance().logEntityStatus("订阅消息UIState失败", LOG_LEVEL_ERROR, 2, "none", Error, "RegistSysVarEvent UIState failed!");
+
+			if (Error_Succeed != (Error = GetFunction()->RegistSysVarEvent("TerminalStage", this)))
+				LogManager::getInstance().logEntityStatus("订阅消息TerminalStage失败", LOG_LEVEL_ERROR, 2, "none", Error, "RegistSysVarEvent TerminalStage failed!");
+
+			if (Error_Succeed != (Error = GetFunction()->RegistSysVarEvent("CardStoreInUse", this)))
+				LogManager::getInstance().logEntityStatus("订阅消息CardStoreInUse失败", LOG_LEVEL_ERROR, 2, "none", Error, "RegistSysVarEvent CardStoreInUse failed!");
 		}
 
+		LogManager::getInstance().logEntityStageChange("OnPreStart_register", 0, "end");
 		return true;
 }
 
 	bool CChromiumEntity::OnPreStart_openWeb()
 	{
-		if (m_runExtend)
+		LogManager::getInstance().logEntityStageChange("OnPreStart_openWeb", 0, "begin");
+		if (ConfigManager::getInstance().m_runExtend)
 			openExtendPage();
 
-		if (!m_runMain)//不启动页面
+		if (!ConfigManager::getInstance().m_runMain)//不启动页面
 			return true;
 
 		do
@@ -525,12 +543,13 @@ namespace Chromium {
 			ErrorCodeEnum rc = ErrorCodeEnum::Error_Succeed;
 			if ((rc = GetFunction()->GetSysVar("TerminalStage", t_terminalState)) != ErrorCodeEnum::Error_Succeed)
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s read TerminalStage Error %d, maybe not exist", __FUNCTION__, rc);
+				LogManager::getInstance().logEntityStatus("读取TerminalStage失败,可能不存在", LOG_LEVEL_ERROR, 2, "none", rc, "");
+				//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s read TerminalStage Error %d, maybe not exist", __FUNCTION__, rc);
 				break;
 			}
 		    else if ('A' != t_terminalState[0] &&  'Z' != t_terminalState[0])
 			{
-				if (m_withBrowser)
+				if (ConfigManager::getInstance().m_withBrowser)
 					break;//run IEBrowser
 				if ('X' == t_terminalState[0])
 				{
@@ -540,35 +559,38 @@ namespace Chromium {
 				else if ('S' == t_terminalState[0])
 				{
 					auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::warnPrompt,
-						std::tuple <std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("access failed, open page warnPrompt %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+						std::tuple <std::string, std::string>(ConfigManager::getInstance().getSysInfo().strTerminalID.GetData(), generateTimeStr()));
+					//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("access failed, open page warnPrompt %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
 				}
 				else if ('M' == t_terminalState[0])
 				{
 					auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::audioErr,
-						std::tuple <std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("access failed, open page audioErr %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+						std::tuple <std::string, std::string>(ConfigManager::getInstance().getSysInfo().strTerminalID.GetData(), generateTimeStr()));
+					//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("access failed, open page audioErr %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
 				}
 				else
 				{
 					auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::breakdown,
-						std::tuple <std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("access failed, open page breakdown %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+						std::tuple <std::string, std::string>(ConfigManager::getInstance().getSysInfo().strTerminalID.GetData(), generateTimeStr()));
+					//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("access failed, open page breakdown %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
 				}
+				LogManager::getInstance().logEntityStageChange("OnPreStart_openWeb", 1, "end", Error_Unexpect
+					, CSimpleString::Format("terminalStage is %s, access failed", t_terminalState.GetData()).GetData());
+				return true;
 			}
 			else
 			{
-				if (m_runAd) openAdPage();
+				if (ConfigManager::getInstance().m_runAd) openAdPage();
 				openMainPage();
 #if (defined _WIN32 || defined _WIN64)
-				if (m_withDebugMode)
+				if (ConfigManager::getInstance().m_withDebugMode)
 					getNetworkInfo(L"127.0.0.1:9222", L"", &DbgByCefControl);
 #endif
 			}
 		} while (false);
 		
 
-
+		LogManager::getInstance().logEntityStageChange("OnPreStart_openWeb", 0, "end");
 		return true;
 	}
 
@@ -588,37 +610,29 @@ namespace Chromium {
 	void CChromiumEntity::openAdPage()
 	{
 		auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::Ad);
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open page Ad %s, pid:%d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+		//LogManager::getInstance().logEntityOpenPage((+ERR_PAGE_REASON::Ad)._to_string(), openRet.second, openRet.first, "openPage");
 	}
 	void CChromiumEntity::openExtendPage()
 	{
 		auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::extend);
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open page extend %s, pid:%d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+		//LogManager::getInstance().logEntityOpenPage((+ERR_PAGE_REASON::extend)._to_string(), openRet.second, openRet.first, "openPage");
 	}
 
 	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);
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open page install %s, pid:%d",
-			Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+		//LogManager::getInstance().logEntityOpenPage((+ERR_PAGE_REASON::Install)._to_string(), openRet.second, openRet.first, "openPage");
 	}
 
 	void CChromiumEntity::openStartupPage()
 	{
 		auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::startup);
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open page startup %s, pid:%d",
-			Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+		//LogManager::getInstance().logEntityOpenPage((+ERR_PAGE_REASON::startup)._to_string(), openRet.second, openRet.first, "openPage");
 	}
 	void CChromiumEntity::openPerformanceMonitorPage() 
 	{
 		auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::performance_monitor);
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open page performance_monitor %s, pid:%d",
-			Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
+		//LogManager::getInstance().logEntityOpenPage((+ERR_PAGE_REASON::performance_monitor)._to_string(), openRet.second, openRet.first, "openPage");
 	}
 
 
@@ -635,9 +649,9 @@ namespace Chromium {
 #if (defined _WIN32 || defined _WIN64)
 			if (m_strArgs.GetCount())
 			{
-				if (!m_strCustomMainUrl.IsNullOrEmpty())
+				if (ConfigManager::getInstance().m_strCustomMainUrl.length() > 0)
 					openMainPage();
-				if (!m_strCustomAdUrl.IsNullOrEmpty())
+				if (ConfigManager::getInstance().m_strCustomAdUrl.length() > 0)
 					openAdPage();
 				return;
 			}
@@ -648,7 +662,6 @@ namespace Chromium {
 		}
 		else
 		{
-			
 			openInstallPage();
 			LogEvent(Severity_High, LOG_EVT_CHROMIUM_OPEN_INSTALLPAGE, CSimpleStringA::Format("open install page"));
 		}
@@ -662,7 +675,11 @@ namespace Chromium {
 		if (Error_Succeed == GetFunction()->OpenConfig(Config_Cache, chromiumCfg))
 			chromiumCfg->ReadConfigValueInt("Run", "no_startup", noStartup);
 
-		m_noStartupPage = (noStartup == 1);
+		ConfigManager::getInstance().m_noStartupPage = (noStartup == 1);
+
+		LogManager::getInstance().logEntityBegin(noStartup);
+
+		setReduceSpbaseLog(0);
 
 
 #if defined(RVC_OS_LINUX)
@@ -704,8 +721,8 @@ namespace Chromium {
 			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("OnPreStart - startFun");
 			// init cef logger first
 #if (defined _WIN32 || defined _WIN64)
-			if (!logProducer)
-				logProducer = create_log_producer_storage("cefclient_logger", "0", "", "", "");
+			if (nullptr == ConfigManager::getInstance().getLogProducer())
+				ConfigManager::getInstance().setLogProducer(create_log_producer_storage("cefclient_logger", "0", "", "", ""));
 #else
 			CSimpleString dbgPath;
 			GetFunction()->GetPath("Dbg", dbgPath);
@@ -718,19 +735,19 @@ namespace Chromium {
 			if (!OnPreStart_socketStart(m_strArgs, m_pTransactionContext)) {//OnPreStart_socketStart()->new CWebsocketServer(strStructPath, this) 时间过长
 				return;
 			}
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("OnPreStart - OnPreStart_socketStartF end");
-
 
 			//the system info may be not complete.If the device is not install ,it can't not read the terminalNo.
 			CSystemStaticInfo t_sysInfo;
 			GetFunction()->GetSystemStaticInfo(t_sysInfo);
 			if (t_sysInfo.strTerminalID.GetLength() == 0)// the machine is in install mode, hence start a simple init and open the install page 
 			{
-				if(!m_noStartupPage) openStartupPage();//open startup page in install mode
-				m_installMode = true;
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("subscribe VtmLoader %s",
-					(Error_Succeed == GetFunction()->SubscribeLog(m_uuidVTMLoader, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "VtmLoader")) ? "success" : "failed");
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("startWithCfg:open install page");
+				if(!ConfigManager::getInstance().m_noStartupPage) openStartupPage();//open startup page in install mode
+				ConfigManager::getInstance().m_installMode = true;
+				ErrorCodeEnum rc = Error_Succeed;
+				if (Error_Succeed == (rc = GetFunction()->SubscribeLog(m_uuidVTMLoader, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "VtmLoader")))
+					LogManager::getInstance().logEntityStatus("订阅VtmLoader消息成功", LOG_LEVEL_INFO, 0, "none");
+				else
+					LogManager::getInstance().logEntityStatus("订阅VtmLoader消息失败", LOG_LEVEL_ERROR, 2, "none", rc, "");
 
 				//if in install mode, need clear 
 				CSimpleString tmpCacheDir;
@@ -751,8 +768,8 @@ namespace Chromium {
 					{
 						LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_BROWSER_CACHE_CLEAER, CSimpleStringA::Format("clear chromium browser cache %s %s", it.c_str(),
 							RemoveDirRecursive(it.c_str()) ? "success" : "fail"));
-		}
-	};
+					}
+				};
 				runCacheClean(tmpDirArr);
 
 #else
@@ -805,7 +822,7 @@ namespace Chromium {
 				if (Error_Succeed == ret)
 					InitUserCodeToMsgTip(strErrorCodeArr, strDescriptionArr, strRemarkArr);
 
-				if (m_withSpecialTest)
+				if (ConfigManager::getInstance().m_withSpecialTest)
 				{
 					CSimpleStringA strDescription, strVTMCode;
 					GetFunction()->GetVTMErrMsg(123456, strDescription, strVTMCode);
@@ -816,9 +833,12 @@ namespace Chromium {
 			}
 			else
 			{
-				if (!m_noStartupPage) openStartupPage();//open startup page in normal mode
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("subscribe VtmLoader %s",
-					(Error_Succeed == GetFunction()->SubscribeLog(m_uuidVTMLoader, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "VtmLoader")) ? "success" : "failed");
+				if (!ConfigManager::getInstance().m_noStartupPage) openStartupPage();//open startup page in normal mode
+				ErrorCodeEnum rc = Error_Succeed;
+				if (Error_Succeed == (rc = GetFunction()->SubscribeLog(m_uuidVTMLoader, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "VtmLoader")))
+					LogManager::getInstance().logEntityStatus("订阅VtmLoader成功", LOG_LEVEL_INFO, 0, "none");
+				else
+					LogManager::getInstance().logEntityStatus("订阅VtmLoader失败", LOG_LEVEL_ERROR, 2, "none", rc, "");
 			}
 				
 		};
@@ -868,7 +888,7 @@ namespace Chromium {
 	}
 
 	bool CChromiumEntity::CheckIsCardStore() {
-		return m_sysInfo.strMachineType.IsEndWith("CardStore", true) || m_sysInfo.strMachineType.IsEndWith("CardPrinter", true);
+		return ConfigManager::getInstance().getSysInfo().strMachineType.IsEndWith("CardStore", true) || ConfigManager::getInstance().getSysInfo().strMachineType.IsEndWith("CardPrinter", true);
 	}
 
 	void CChromiumEntity::DoWithSysVarEvent()
@@ -876,14 +896,14 @@ namespace Chromium {
 		//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("create thread:%s", __FUNCTION__);
 		while (true)
 		{
-			if (m_eventArr.size() == 0)
+			if (ConfigManager::getInstance().m_eventArr.size() == 0)
 			{
 				boost::this_thread::sleep_for(boost::chrono::microseconds(100));
 				continue;
 			}
 			m_eventContorl.lock();
-			SYS_EVENT_PARAM curEvent = m_eventArr.front();
-			m_eventArr.pop_front();
+			SYS_EVENT_PARAM curEvent = ConfigManager::getInstance().m_eventArr.front();
+			ConfigManager::getInstance().m_eventArr.pop_front();
 			m_eventContorl.unlock();
 			if ((strnicmp(curEvent.key.c_str(), "UIState", strlen("UIState")) == 0))
 			{
@@ -914,7 +934,7 @@ namespace Chromium {
 							auto srcPids = getUosBrowserPIDs(CModTools::get_mutable_instance().getUosBrowser());
 #endif // RVC_OS_UOS
 
-							if (m_runAd) openAdPage();
+							if (ConfigManager::getInstance().m_runAd) openAdPage();
 							openMainPage();
 							CModTools::get_mutable_instance().StopChromiumBrowser(ERR_PAGE_REASON::breakdown);
 
@@ -947,7 +967,7 @@ namespace Chromium {
 				{
 					try
 					{
-						if (!m_withBrowser)
+						if (!ConfigManager::getInstance().m_withBrowser)
 						{
 #if defined(RVC_OS_LINUX)
 							auto srcPids = getUosBrowserPIDs(CModTools::get_mutable_instance().getUosBrowser());
@@ -972,7 +992,7 @@ namespace Chromium {
 								reson = ERR_PAGE_REASON::audioErr;
 
 							auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(reson, 
-								std::tuple < std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
+								std::tuple < std::string, std::string>(ConfigManager::getInstance().getSysInfo().strTerminalID.GetData(), generateTimeStr()));
 							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("access failed, open err page %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
 							CModTools::get_mutable_instance().StopChromiumBrowser(ERR_PAGE_REASON::main);
 						}
@@ -991,7 +1011,7 @@ namespace Chromium {
 					if (0 == CSimpleStringA("Y").Compare(curEvent.value.c_str(), true))
 					{
 						auto openRet = CModTools::get_mutable_instance().StartChromiumBrowser(ERR_PAGE_REASON::CardStoreIsBusy,
-							std::tuple <std::string, std::string>(m_sysInfo.strTerminalID.GetData(), generateTimeStr()));
+							std::tuple <std::string, std::string>(ConfigManager::getInstance().getSysInfo().strTerminalID.GetData(), generateTimeStr()));
 						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("CardStoreIsBusy, open page CardStoreIsBusy %s, %d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
 					}
 					else
@@ -1027,15 +1047,15 @@ namespace Chromium {
 		curEvent.oldValue = std::string(pszOldValue);
 		curEvent.entityName = std::string(pszEntityName);
 		boost::unique_lock<boost::mutex> eventArrLock(m_eventContorl);
-		m_eventArr.push_back(curEvent);
+		ConfigManager::getInstance().m_eventArr.push_back(curEvent);
 
 	}
 
 	void CChromiumEntity::OnPreClose(EntityCloseCauseEnum eCloseCause, CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Chromium Run OnPreClose");
-		exitClean();
 		pTransactionContext->SendAnswer(Error_Succeed);
+		exitClean();
 	}
 
 	void CChromiumEntity::exitClean()
@@ -1052,7 +1072,6 @@ namespace Chromium {
 				delete m_pTimerListener;
 				m_pTimerListener = NULL;
 			}
-			GetFunction()->UnsubscribeBroadcast("IEBrowser");
 		}
 	}
 
@@ -1067,11 +1086,11 @@ namespace Chromium {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("strArgs[%d] = %s", i, strArgs[i].GetData());
         }
         if (ArgsCount == 1) {
-            m_strCustomMainUrl = strArgs[0];
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Get custom main url: %s", m_strCustomMainUrl.GetData());
-			if (!m_strCustomMainUrl.IsNullOrEmpty()) {
+			ConfigManager::getInstance().m_strCustomMainUrl = strArgs[0].GetData();
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Get custom main url: %s", ConfigManager::getInstance().m_strCustomMainUrl.c_str());
+			if (!ConfigManager::getInstance().m_strCustomMainUrl.length() > 0) {
                 LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_DETECT_CUSTOM_FULTURE_URL_FROM_START,
-						CSimpleStringA::Format("从模块入参获取自定义链接:%s", m_strCustomMainUrl.GetData()));
+						CSimpleStringA::Format("从模块入参获取自定义链接:%s", ConfigManager::getInstance().m_strCustomMainUrl.c_str()));
 			}
 		} else {
             CSmartPointer<IConfigInfo> pConfig;
@@ -1082,11 +1101,12 @@ namespace Chromium {
 			if (cnt > 0 && currentUsing > 0) {
 				CSimpleStringA strAdUrl(true);
                 CSimpleStringA strSection = CSimpleStringA::Format("CustomWebUrl%d", currentUsing);
-                pConfig->ReadConfigValue(strSection, "FultureUrl", m_strCustomMainUrl);
+				CSimpleString t_mainUrl = ConfigManager::getInstance().m_strCustomMainUrl.c_str();
+                pConfig->ReadConfigValue(strSection, "FultureUrl", t_mainUrl);
                 pConfig->ReadConfigValue(strSection, "AdUrl", strAdUrl);
-				if (!m_strCustomMainUrl.IsNullOrEmpty()) {
+				if (!t_mainUrl.IsNullOrEmpty()) {
                     LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_DETECT_CUSTOM_FULTURE_URL_FROM_CONFIG,
-							CSimpleStringA::Format("从本地维护桌面获取自定义链接:%s", m_strCustomMainUrl.GetData()));
+							CSimpleStringA::Format("从本地维护桌面获取自定义链接:%s", t_mainUrl.GetData()));
 				}
 			}
 		}
@@ -1097,19 +1117,25 @@ namespace Chromium {
 		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)
 	{
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("OnLog %x from entity %s, msg : %s", dwUserCode, NULL == pszEntityName ? "" : pszEntityName, NULL == pszMessage ? "" : pszMessage);
+		//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("OnLog %x from entity %s, msg : %s", dwUserCode, NULL == pszEntityName ? "" : pszEntityName, NULL == pszMessage ? "" : pszMessage);
 		switch (dwUserCode)
 		{
 		case Event_VtmLoader_GetConfig_Suc:
-			g_hasInitCfg = true;
+			LogManager::getInstance().logEntityOnLog(NULL == pszEntityName ? "" : pszEntityName, dwUserCode, "Event_VtmLoader_GetConfig_Suc",
+				0, "none", Error_Succeed, "setHasInitCfg");
+			ConfigManager::getInstance().setHasInitCfg(true);
 		case Event_VtmLoader_GetConfig_Fail:
 			refreshLogLevel();//后置后需要刷新log level,因为chromium是先启动的实体
-			if (m_installMode)//Do not init Entity again in install mode
+			if (ConfigManager::getInstance().m_installMode)//Do not init Entity again in install mode
 				break;
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("startWithCfg:open error or normal page");
+			//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("startWithCfg:open error or normal page");
+			LogManager::getInstance().logEntityOnLog(NULL == pszEntityName ? "" : pszEntityName, dwUserCode, "Event_VtmLoader_GetConfig_Suc",
+				0, "openPage", Error_Succeed, "startWithCfg:open error or normal page");
 			startWithCfg();//open errPage or normal page
 			break;
 		case Event_VtmLoader_GetVTMERRMSG_Suc:
+			LogManager::getInstance().logEntityOnLog(NULL == pszEntityName ? "" : pszEntityName, dwUserCode, "Event_VtmLoader_GetVTMERRMSG_Suc",
+				0, "none");
 			/*
 				CSimpleString translatePath;
 				GetFunction()->GetPath("Cfg", translatePath);
@@ -1119,9 +1145,10 @@ namespace Chromium {
 			*/
 			if (!GetFunction()->HasPrivilege())
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("no privilege");
+				LogManager::getInstance().logEntityOnLog(NULL == pszEntityName ? "" : pszEntityName, dwUserCode, "Event_VtmLoader_GetVTMERRMSG_Suc",
+					2, "none", Error_NoPrivilege, "no privilege");
 				break;
-		}
+			}
 			{
 				CAutoArray<CSimpleStringA> strErrorCodeArr;
 				CAutoArray<CSimpleStringA> strDescriptionArr;
@@ -1130,9 +1157,14 @@ namespace Chromium {
 				if (Error_Succeed == ret)
 					InitUserCodeToMsgTip(strErrorCodeArr, strDescriptionArr, strRemarkArr);
 				else
-					LogWarn(Severity_Low, Error_Debug, LOG_WARN_CHROMIUM_VTMUSERMSG_ERR, CSimpleStringA::Format("GetVTMErrMsgArr err:%d", ret));
+				{
+					CSimpleString warnMsg = CSimpleStringA::Format("GetVTMErrMsgArr err:%d", ret);
+					LogWarn(Severity_Low, Error_Debug, LOG_WARN_CHROMIUM_VTMUSERMSG_ERR, warnMsg.GetData());
+					LogManager::getInstance().logEntityOnLog(NULL == pszEntityName ? "" : pszEntityName, dwUserCode, "Event_VtmLoader_GetVTMERRMSG_Suc",
+						2, "none", Error_Bug, warnMsg.GetData());
+				}
 
-				if (m_withSpecialTest)
+				if (ConfigManager::getInstance().m_withSpecialTest)
 				{
 					CSimpleStringA strDescription, strVTMCode;
 					GetFunction()->GetVTMErrMsg(123456, strDescription, strVTMCode);
@@ -1181,7 +1213,7 @@ namespace Chromium {
 
 		CModTools::get_mutable_instance().unlockGuard();
 		/*
-		if (m_runAd)
+		if (ConfigManager::getInstance().m_runAd)
 		{
 			CModTools::get_mutable_instance().m_isAdOpen = false;
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("OnBrowserCacheClean open add page");
@@ -1208,7 +1240,7 @@ namespace Chromium {
 			delete m_pTimerListener;
 			m_pTimerListener = NULL;
 		}
-		if(!m_installMode)
+		if(!ConfigManager::getInstance().m_installMode)
 			OnPreStart_openWeb();//重新调用open web
 
 #endif 

+ 7 - 56
Module/mod_chromium/mod_chromium.h

@@ -41,42 +41,6 @@ namespace Chromium {
 	#define BROWSER_TIMER_ID 0xF002
 	#define BROWSER_TIMER_INTERVAL 3600000
 
-	struct SYS_EVENT_PARAM
-	{
-		std::string key;
-		std::string value;
-		std::string oldValue;
-		std::string entityName;
-
-		// 默认构造函数
-		SYS_EVENT_PARAM() = default;
-
-		// 带参数的构造函数
-		SYS_EVENT_PARAM(const std::string& k, const std::string& v, const std::string& ov, const std::string& en)
-			: key(k), value(v), oldValue(ov), entityName(en) {}
-
-		// 拷贝构造函数
-		SYS_EVENT_PARAM(const SYS_EVENT_PARAM& other)
-			: key(other.key), value(other.value), oldValue(other.oldValue), entityName(other.entityName) {}
-
-		// 拷贝赋值运算符
-		SYS_EVENT_PARAM& operator=(const SYS_EVENT_PARAM& other) {
-			if (this != &other) {
-				key = other.key;
-				value = other.value;
-				oldValue = other.oldValue;
-				entityName = other.entityName;
-			}
-			return *this;
-		}
-
-		// 禁用移动构造函数
-		SYS_EVENT_PARAM(SYS_EVENT_PARAM&&) = delete;
-
-		// 禁用移动赋值运算符
-		SYS_EVENT_PARAM& operator=(SYS_EVENT_PARAM&&) = delete;
-	};
-
 
 	class CChromiumEntity;
 
@@ -123,13 +87,13 @@ namespace Chromium {
 		//void CefClintNotify();
 		void exitClean();
 		void FetchCustomMainUrl(CAutoArray<CSimpleStringA>& strArgs);
-		bool HasCustomMainUrl() const { return !m_strCustomMainUrl.IsNullOrEmpty(); }
-		const char* GetCustomMainUrl()  const { return m_strCustomMainUrl; }
-		bool HasCustomAdUrl() const { return !m_strCustomAdUrl.IsNullOrEmpty(); }
-		const char* GetCustomAdUrl()  const { return m_strCustomAdUrl; }
+		bool HasCustomMainUrl() const { return ConfigManager::getInstance().m_strCustomMainUrl.length() > 0; }
+		const char* GetCustomMainUrl()  const { return ConfigManager::getInstance().m_strCustomMainUrl.c_str(); }
+		bool HasCustomAdUrl() const { return ConfigManager::getInstance().m_strCustomAdUrl.length() > 0; }
+		const char* GetCustomAdUrl()  const { return ConfigManager::getInstance().m_strCustomAdUrl.c_str(); }
 		bool IsConfigMode()
 		{
-			return m_installMode;
+			return ConfigManager::getInstance().m_installMode;
 		}
 
 	private:
@@ -149,31 +113,18 @@ namespace Chromium {
 		bool CheckIsCardStore();
 
 	private:
-		CSystemStaticInfo m_sysInfo;
 		CWebsocketServer* m_pWsServer;
 		ITimerListener* m_pTimerListener, * pBusinessLimitTimerListener;//浏览器监控Timer,业务禁用Timer
-		int m_iTcpBridgePort;
 		HANDLE m_hIOCP;
 		HANDLE m_hThreadIOCP;
-		CSimpleStringA m_strCustomMainUrl, m_strCustomAdUrl;
-		bool m_runAd/*广告*/, m_runMain/*业务*/, m_runExtend/*低柜副屏*/, m_runLogin/*用户桌面,可能木有用*/, m_withBrowser/*是否需要与browser交互*/;
-		bool m_withDebugMode/*是否启动debug模式*/, m_withMagic/*启用随机共享内存*/, m_withNoFileLog/*是否不需要本地日志落盘*/, m_withMedia/*开启多媒体选项*/;
-		bool m_withUnsafeAd/*Ad页面忽略安全选项*/;
-		bool m_withConsole;
-		bool m_withSpecialTest/*开启一些终端功能的测试*/, m_withLinkLog/*开启链路中的中间链路日志*/;
-		bool m_withMin, m_withClose, m_installMode;
-		std::deque<SYS_EVENT_PARAM> m_eventArr;
-		//boost::container::deque<SYS_EVENT_PARAM> m_eventArr;
+
 		boost::mutex m_eventContorl, m_eventConditionMu; //sysvarEvent变化时阻塞修改
 		boost::mutex m_commonPageLock;//
 		boost::condition_variable_any m_eventCondition;//满足有数据时激活线程
 		CAutoArray<CSimpleStringA> m_strArgs;
 		CSmartPointer<ITransactionContext> m_pTransactionContext;
-		bool m_noStartupPage;
 		
-#ifdef RVC_OS_LINUX
-		std::map<std::string, std::vector<int>> m_commonPageArr;
-#endif
+		
 	public:
 		boost::timed_mutex m_firstStartMain;//首次启动主页
 		int getBrowserStartTimes();

+ 30 - 44
Module/mod_counterconnector/ConnectorFSM.cpp

@@ -194,7 +194,7 @@ ErrorCodeEnum ACMCallFSM::OnInit()
 	m_bAgentHandFree = true;
 	m_bIsAgentControl = false;
 	m_nSipErrorNum = 0;
-	memset(&m_CallingParam,0,sizeof(m_CallingParam));
+	memset(&m_CallingParam, 0, sizeof(m_CallingParam));
 	m_uConnectTime = 0;
 	m_bConnected = false;
 	m_lConnectCostTime = 0;
@@ -438,7 +438,6 @@ static int GetCallInfoFromConfig(char* strcallurl, size_t ucalllen, char* strass
 #if defined(RVC_OS_LINUX)
 namespace
 {
-
 	char* _ultoa(unsigned long value, char* pstring, int radix)
 	{
 		char tmp[33] = { 0 };
@@ -622,10 +621,10 @@ void ACMCallFSM::OnStateTrans(int iSrcState, int iDstState)
 
 						char strerrmsg[MAX_PATH] = {0};
 						if (m_bHangup){
-							_snprintf(strerrmsg, MAX_PATH, "connect failed for %s and last state is %d, and current src state is %d.","接通前客户主动挂机", m_iFailedLastState, iSrcState);
+							snprintf(strerrmsg, MAX_PATH, "connect failed for %s and last state is %d, and current src state is %d.","接通前客户主动挂机", m_iFailedLastState, iSrcState);
 						} 
 						else{
-							_snprintf(strerrmsg, MAX_PATH, "connect failed for %s and last state is %d, and current src state is %d.",CSimpleStringW2A(evt.errinfo).GetData(), m_iFailedLastState, iSrcState);
+							snprintf(strerrmsg, MAX_PATH, "connect failed for %s and last state is %d, and current src state is %d.",CSimpleStringW2A(evt.errinfo).GetData(), m_iFailedLastState, iSrcState);
 						}
 						LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_CONNECT_FAILED, strerrmsg);
 						
@@ -637,6 +636,7 @@ void ACMCallFSM::OnStateTrans(int iSrcState, int iDstState)
 				} 
 				else{
 					LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_AUTO_RECONNECT,CSimpleString::Format("state from %d to %d, auto reconnect, not broadcast state to ui.", st1, st2).GetData());
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C5")("system auto reconnect.");
 				}
 
 				if (eState_HandFree == st2 || eState_Pickup == st2){
@@ -799,7 +799,7 @@ void ACMCallFSM::s8_on_entry()
 	else {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get call route list failed.");
 	}
-		
+
 	int time = GetDelayTime();
 
 	if (time > 0){
@@ -859,6 +859,7 @@ unsigned int ACMCallFSM::s10_on_event(FSMEvent* event)
 	return 0;
 }
 
+
 void ACMCallFSM::s11_on_entry() 
 {
 	m_LastSipError = Error_Succeed;
@@ -867,8 +868,7 @@ void ACMCallFSM::s11_on_entry()
 	m_uConnectTime = y2k_time_now();
 	m_bConnected = false;
 	m_lConnectCostTime = SP::Module::Comm::RVCGetTickCount();
-	
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304Z80101")("begin remote video call");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C1")("start remote video call");
 
 	if (m_nCurSipServer == CurServerNum::Error_Server){
 		m_LastSipError = Error_NetBroken;
@@ -934,12 +934,11 @@ void ACMCallFSM::s11_on_entry()
 	if (m_LastSipError != Error_Succeed) 
 	{
 		PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80201").setResultCode("RTA3421")("send sip failed!");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C2").setResultCode("RTA3421")("send sip failed!");
 	}
 	else
 	{
 		ScheduleTimer(11,SIP_CALL_TIMER);
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304Z80201")("send sip success!");
 	}
 }
 
@@ -954,7 +953,7 @@ unsigned int ACMCallFSM::s11_on_event(FSMEvent* event)
 	{
 		m_bHangup = true;
 		LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_HANGUP, CSimpleStringA::Format("sip connecting, customer active hangup after %ds.", y2k_time_now()- m_nStarttime).GetData());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80301").setResultCode("RTA3431")("sip connect failed for user hangup");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C6")("connect failed for user hangup");
 	}
 	else if (event->iEvt == USER_EVT_SIP_STATE_IDLE) 
 	{
@@ -969,8 +968,7 @@ unsigned int ACMCallFSM::s11_on_event(FSMEvent* event)
 		}
 		(bool)m_nCurSipServer?(m_nCurSipServer= CurServerNum::Error_Server):(m_nCurSipServer= CurServerNum::BACK_SERVER);
 		m_nSipErrorNum++;
-		//StopChannel();
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80301").setResultCode("RTA3432")("sip connect failed for server error.");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C2").setResultCode("RTA3432")("sip connect failed for server error.");
 	} 
 	else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
 	{
@@ -1001,7 +999,7 @@ unsigned int ACMCallFSM::s11_on_event(FSMEvent* event)
 		if (ReConnectionSipphone()) {
 			m_bConSipphone = true;
 		}
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80301").setResultCode("RTA3434")("sip connect failed for entity error");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C2").setResultCode("RTA3434")("sip connect failed for entity error");
 	}
 	else if (event->iEvt == EVT_TIMER)
 	{
@@ -1016,7 +1014,7 @@ unsigned int ACMCallFSM::s11_on_event(FSMEvent* event)
 		}
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sip call timeout,release call");
 		m_nSipErrorNum++;
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80301").setResultCode("RTA3435")("sip connect failed for timeout");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C2").setResultCode("RTA3435")("sip connect failed for timeout");
 	}
 	else if (event->iEvt == USER_EVT_JMP_FAIL)
 	{
@@ -1030,7 +1028,7 @@ unsigned int ACMCallFSM::s11_on_event(FSMEvent* event)
 			LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_FUNC_FAILED,"sipphone connect func failed, error server");
 		}
 		m_nSipErrorNum++;
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80301").setResultCode("RTA3436")("sip connect failed for entity error");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C2").setResultCode("RTA3436")("sip connect failed for entity error");
 	}
 	else if (event->iEvt == USER_EVT_STOPLOACALREMOTEVIDEO) 
 	{
@@ -1043,8 +1041,7 @@ unsigned int ACMCallFSM::s11_on_event(FSMEvent* event)
 
 void ACMCallFSM::s12_on_entry() 
 {
-	//ErrorCodeEnum Error = Error_Succeed;
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304Z80301")("sip connect success!");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C2")("sip channel connect success!");
 	m_LastAssistError = Error_Succeed;
 	if (m_nCurChanServer == CurServerNum::Error_Server)
 	{
@@ -1061,13 +1058,6 @@ void ACMCallFSM::s12_on_entry()
 		else
 		{
 			m_LastAssistError = StartChannel((int)m_nCurChanServer,m_CallingParam);
-//#ifdef RVC_OS_WIN
-//			if (DOUBLERECORD_CALLTYPE == m_CallingParam.nCallType){
-//				if (false == m_bHandFree){
-//					StopSpeakerAudioCapture();
-//				}
-//			}
-//#endif
 		}
 
 		if (m_LastAssistError != Error_Succeed) 
@@ -1080,18 +1070,15 @@ void ACMCallFSM::s12_on_entry()
 	if (m_LastAssistError != Error_Succeed) {
 		PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
 		if (Error_NetBroken == m_LastAssistError) {
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80401").setResultCode("RTA3441")("assistant channel connect failed for net broken");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C3").setResultCode("RTA3441")("assistant channel connect failed for net broken");
 		}
 		else if (Error_Param == m_LastAssistError) {
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80401").setResultCode("RTA3442")("assistant channel connect failed error param");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C3").setResultCode("RTA3442")("assistant channel connect failed error param");
 		}
 		else {
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80401").setResultCode("RTA3443")("assistant channel connect failed!");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C3").setResultCode("RTA3443")("assistant channel connect failed");
 		}
 	}
-	else {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304Z80401")("assistant channel connect success!");
-	}
 }
 
 void ACMCallFSM::s12_on_exit() {}
@@ -1102,7 +1089,7 @@ unsigned int ACMCallFSM::s12_on_event(FSMEvent* event)
 	{
 		m_bHangup = true;
 		LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_HANGUP, CSimpleStringA::Format("chan connecting, customer active hangup after %ds.", y2k_time_now() - m_nStarttime).GetData());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80501").setResultCode("RTA3451")("assistant channel bridge failed for user hangup");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C6")("connect failed for user hangup");
 	}
 	else if (event->iEvt == USER_EVT_SIP_STATE_IDLE) 
 	{
@@ -1117,6 +1104,9 @@ unsigned int ACMCallFSM::s12_on_event(FSMEvent* event)
 		}
 		(bool)m_nCurSipServer?(m_nCurSipServer= CurServerNum::Error_Server):(m_nCurSipServer= CurServerNum::BACK_SERVER);
 		StopChannel();
+		if (!m_bHangup) {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C3").setResultCode("RTA3455")("assistant channel bridge failed for timeout");
+		}
 	} 
 	else if (event->iEvt == USER_EVT_CHAN_STATE_IDLE) 
 	{
@@ -1132,7 +1122,7 @@ unsigned int ACMCallFSM::s12_on_event(FSMEvent* event)
 				LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_CHANSTATE_IDLE,"chan connect server failed, error server");
 			}
 			(bool)m_nCurChanServer?(m_nCurChanServer= CurServerNum::Error_Server):(m_nCurChanServer= CurServerNum::BACK_SERVER);
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80501").setResultCode("RTA3452")("assistant channel bridge failed for server error");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C3").setResultCode("RTA3452")("assistant channel bridge failed for server error");
 		}
 		HangupCall();
 		//StopVideo();
@@ -1141,7 +1131,9 @@ unsigned int ACMCallFSM::s12_on_event(FSMEvent* event)
 	{
 		ChanStateConnectedEvent *e = static_cast<ChanStateConnectedEvent *>(event);
 		StartVideo(e->m_param.GetData());
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304Z80501")("assistant channel bridge success!");
+		long lnowtime = SP::Module::Comm::RVCGetTickCount();
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setCostTime(lnowtime - m_lConnectCostTime).setLogCode("QLR0402304C3")("assistant channel bridge success!");
+		m_lConnectCostTime = lnowtime;
 	}
 	else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
 	{
@@ -1158,7 +1150,7 @@ unsigned int ACMCallFSM::s12_on_event(FSMEvent* event)
 		if (ReConnectionAssistchan()) {
 			m_bConAssist = true;
 		}
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80501").setResultCode("RTA3453")("assistant channel bridge failed for entity restart");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C3").setResultCode("RTA3453")("assistant channel bridge failed for entity restart");
 	}
 	else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
 	{
@@ -1193,7 +1185,7 @@ unsigned int ACMCallFSM::s12_on_event(FSMEvent* event)
 		else{
 			LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_FUNC_FAILED,"chan connect func failed, error server");
 		}
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80501").setResultCode("RTA3454")("assistant channel bridge failed for entity error");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C3").setResultCode("RTA3454")("assistant channel bridge failed for entity error");
 	}
 	
 	return 0;
@@ -1443,9 +1435,6 @@ void ACMCallFSM::s3_on_entry()
 		unsigned int unowtime = y2k_time_now();
 		LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_CALL_CONNECTING_TIME, CSimpleStringA::Format("handfree call connecting time is %us.", unowtime - m_uConnectTime).GetData());
 		m_uConnectTime = unowtime;
-		long lnowtime = SP::Module::Comm::RVCGetTickCount();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RemoteVideoCall::Connecting").setCostTime(lnowtime - m_lConnectCostTime)("RemoteVideoCall::Connecting");
-		m_lConnectCostTime = lnowtime;
 	}
 }
 
@@ -1496,9 +1485,6 @@ void ACMCallFSM::s4_on_entry()
 		unsigned int unowtime = y2k_time_now();
 		LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_CALL_CONNECTING_TIME, CSimpleStringA::Format("pickup call connecting time is %us.", unowtime - m_uConnectTime).GetData());
 		m_uConnectTime = unowtime;
-		long lnowtime = SP::Module::Comm::RVCGetTickCount();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RemoteVideoCall::Connecting").setCostTime(lnowtime - m_lConnectCostTime)("RemoteVideoCall::Connecting");
-		m_lConnectCostTime = lnowtime;
 	}
 }
 
@@ -1567,7 +1553,7 @@ void ACMCallFSM::s51_on_entry()
 	if (m_bConnected) {
 		m_bConnected = false;
 		LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_CALL_CONNECT_TIME, CSimpleStringA::Format("call connected time is %us.", y2k_time_now() - m_uConnectTime).GetData());
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RemoteVideoCall::Connected").setCostTime(SP::Module::Comm::RVCGetTickCount() - m_lConnectCostTime)("RemoteVideoCall::Connected");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setCostTime(SP::Module::Comm::RVCGetTickCount() - m_lConnectCostTime).setLogCode("QLR0402304C4")("disconnect the video connection[s51].");
 	}
 }
 
@@ -1587,7 +1573,7 @@ void ACMCallFSM::s52_on_entry()
 	if (m_bConnected) {
 		m_bConnected = false;
 		LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_CALL_CONNECT_TIME, CSimpleStringA::Format("call connected time is %us.", y2k_time_now() - m_uConnectTime).GetData());
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RemoteVideoCall::Connected").setCostTime(SP::Module::Comm::RVCGetTickCount() - m_lConnectCostTime)("RemoteVideoCall::Connected");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setCostTime(SP::Module::Comm::RVCGetTickCount() - m_lConnectCostTime).setLogCode("QLR0402304C4")("disconnect the video connection[s52].");
 	}
 }
 
@@ -1674,7 +1660,7 @@ void ACMCallFSM::s60_on_entry()
 	if (m_bConnected) {
 		m_bConnected = false;
 		LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_CALL_CONNECT_TIME, CSimpleStringA::Format("call connected time is %us.", y2k_time_now() - m_uConnectTime).GetData());
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RemoteVideoCall::Connected").setCostTime(SP::Module::Comm::RVCGetTickCount() - m_lConnectCostTime)("RemoteVideoCall::Connected");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setCostTime(SP::Module::Comm::RVCGetTickCount() - m_lConnectCostTime).setLogCode("QLR0402304C4")("disconnect the video connection[s60].");
 	}
 }
 

+ 0 - 22
Module/mod_counterconnector/ConnectorFSM.h

@@ -463,28 +463,6 @@ public:
 		return (*m_pPhoneClient)(EntityResource::getLink().upgradeLink())->SetCallingParam(info);
 	}
 
-	//ErrorCodeEnum StopSpeakerAudioCapture()
-	//{
-	//	ErrorCodeEnum rc = Error_NotImpl;
-	//	MediaService_ClientBase* pMSClient = new MediaService_ClientBase(m_pEntity);
-	//	if(pMSClient->Connect() != Error_Succeed)
-	//	{
-	//		pMSClient->SafeDelete();
-	//		pMSClient = NULL;
-	//	}
-	//	else
-	//	{
-	//		rc = (*pMSClient)(EntityResource::getLink().upgradeLink())->StopSpeakerRender();
-	//		if(rc != Error_Succeed){
-	//			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Stop Speaker Render failed return 0x%08x", rc);
-	//		}
-
-	//		pMSClient->GetFunction()->CloseSession();
-	//		pMSClient = NULL;
-	//	}
-	//	return rc;
-	//}
-
 private:
 
 	int TranslateState(int innerState);

+ 0 - 2
Module/mod_counterconnector/mod_counterconnector.cpp

@@ -456,8 +456,6 @@ void CCounterConnectorEntity ::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUI
 		m_fsm.PostEventFIFO(new FSMEvent(USER_EVT_AGENT_WRITABLE));
 
 	case LOG_EVT_MOD_ASSISCHAN_STARTED_SUCCESS:		
-		//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("recv LOG_EVT_MOD_ASSISCHAN_STARTED_SUCCESS");
-		//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("current state name is %s.", m_fsm.GetCurrStateName());
 		Sleep(500);
 		m_fsm.PostEventFIFO(new FSMEvent(USER_EVT_ASSISTCHAN_IDEL));
 		m_fsm.m_bConAssist = false;

+ 1 - 0
Module/mod_localmediaplay/mod_localmediaplay.cpp

@@ -17,6 +17,7 @@
 #define DEFAULT_SLEEP_TIME		1000
 #define DEFAULT_ADVERT_TYPE		'A'
 
+
 bool IS_DEBUG = false;
 int scanTime = 600;
 int removeOldTime = 1800;

+ 1 - 1
Module/mod_mediacontroller/CMakeLists.txt

@@ -18,6 +18,7 @@ set(${MODULE_PREFIX}_SRCS
 	stdafx.cpp
 	capture.cpp
 	mod_mediacontroller.cpp
+	${ThirdPartyHeadRoot}/CJson/cJSON.c
 )
 
 set(MOD_VERSION_STRING "0.0.1-dev1")
@@ -56,7 +57,6 @@ else()
 		${CONAN_INCLUDE_DIRS_SPEEXDSP}
 		${CONAN_INCLUDE_DIRS_APR}/apr-1
 		${CONAN_INCLUDE_DIRS_SPANDSP}
-		
 	)
 endif(NOT WIN32)
 

+ 38 - 12
Module/mod_mediacontroller/capture.cpp

@@ -13,7 +13,6 @@
 #include <unistd.h>
 #endif // RVC_OS_WIN
 
-
 #include <memutil.h>
 #include <md5.h>
 #include "y2k_time.h"
@@ -33,10 +32,6 @@ using namespace MediaController;
 #define RVC_AUDIO_BUFFER_LEN 320
 #endif
 
-#ifndef MAX_PATH
-#define MAX_PATH 260
-#endif
-
 static void __dbg(const char *fmt, va_list arg)
 {
 	int n = vsnprintf(NULL, 0, fmt, arg);
@@ -1549,7 +1544,6 @@ namespace MediaController {
 				char strMessage[MAX_PATH*2] = {0};
 				get_camera_exception_message(strMessage, MAX_PATH*2, cap->config.strVideoEnv, "open environ camera fail, please check device.");
 				LogWarn(Severity_Middle,Error_NotInit,ERROR_MOD_MEDIACONTROLLER_ENVCAM_OPEN,strMessage);
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI("OpenEnvCam").setLogCode("QLR040220801").setResultCode("RTA2803")("上摄像头故障,打开摄像头失败");
 				if (cap->opt_video) 
 				{
 					if (cap->env_video) 
@@ -1563,7 +1557,6 @@ namespace MediaController {
 						char strMessage[MAX_PATH*2] = {0};
 						get_camera_exception_message(strMessage, MAX_PATH*2, cap->config.strVideoOpt, "open operate camera fail, please check device.");
 						LogWarn(Severity_Middle,Error_NotInit,ERROR_MOD_MEDIACONTROLLER_OPTCAM_OPEN, strMessage);
-						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI("OpenOptCam").setLogCode("QLR040220801").setResultCode("RTA2804")("下摄像头故障,打开摄像头失败");
 						return Error_AllCamera;
 					}
 					else
@@ -1596,7 +1589,6 @@ namespace MediaController {
 						char strMessage[MAX_PATH*2] = {0};
 						get_camera_exception_message(strMessage, MAX_PATH*2, cap->config.strVideoOpt, "open operate camera fail, please check device.");
 						LogWarn(Severity_Middle,Error_NotInit,ERROR_MOD_MEDIACONTROLLER_OPTCAM_OPEN,strMessage);
-						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI("OpenOptCam").setLogCode("QLR040220801").setResultCode("RTA2804")("下摄像头故障,打开摄像头失败");
 						return Error_OptCamera;
 					}
 					else
@@ -1627,7 +1619,6 @@ namespace MediaController {
 					char strMessage[MAX_PATH*2] = {0};
 					get_camera_exception_message(strMessage, MAX_PATH*2, cap->config.strVideoOpt, "open operate camera fail,please check device.");
 					LogWarn(Severity_Middle,Error_NotInit,ERROR_MOD_MEDIACONTROLLER_OPTCAM_OPEN,strMessage);
-					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI("OpenOptCam").setLogCode("QLR040220801").setResultCode("RTA2804")("下摄像头故障,打开摄像头失败");
 					return Error_AllCamera;
 				}
 				else
@@ -1894,6 +1885,10 @@ namespace MediaController {
 	{
 		int icamnum = 0;
 		CSimpleStringA strCamInfoJson("");
+		CSimpleStringA strCamListInfoJson("");
+		cJSON* array = cJSON_CreateArray();
+		cJSON* root = cJSON_CreateObject();
+
 #ifdef RVC_OS_WIN
 		HRESULT hr = CoInitialize(NULL);
 		int rc;
@@ -1934,12 +1929,23 @@ namespace MediaController {
 				char t[256] = {0};
 				WCHAR tmp1[256] ={0};
 				char t1[256] = {0};
+				WCHAR tmp2[256] = { 0 };
+				char t2[256] = { 0 };
 				videocap_get_device_name(i, tmp, ARRAYSIZE(tmp));
 				WideCharToMultiByte(CP_ACP, 0, tmp, -1, t, sizeof(t), 0, NULL);
 				videocap_get_device_path(i, tmp1, ARRAYSIZE(tmp1));
 				WideCharToMultiByte(CP_ACP, 0, tmp1, -1, t1, sizeof(t1), 0, NULL);
+				videocap_get_device_instanceid(i, tmp2, ARRAYSIZE(tmp2));
+				WideCharToMultiByte(CP_ACP, 0, tmp2, -1, t2, sizeof(t2), 0, NULL);
+
+				cJSON* pobject = cJSON_CreateObject();
+				cJSON_AddItemToObject(pobject, "DevicePath", cJSON_CreateString(t1));
+				cJSON_AddItemToObject(pobject, "DeviceInstanceId", cJSON_CreateString(t2));
+				cJSON_AddItemToObject(pobject, "FriendlyName", cJSON_CreateString(t));
+				cJSON_AddItemToArray(array, pobject);
+
 				{
-					unsigned char x[MD5_DIGESTSIZE];
+					unsigned char x[MD5_DIGESTSIZE] = {0};
 					md5_ctx_t ctx;
 					md5_init(&ctx);
 					md5(x, t1, strlen(t1));
@@ -1948,6 +1954,7 @@ namespace MediaController {
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%d = %s;%s", i, t, t1);
 				strCamInfoJson += CSimpleStringA::Format("\"%d\":\"%s;%s\",", i, t, t1);
 			}
+
 		}
 
 		{
@@ -1981,22 +1988,41 @@ namespace MediaController {
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%d = %s", inumber, strcamera);
 					strCamInfoJson += CSimpleStringA::Format("\"%d\":\"%s\",", inumber, strcamera);
 					inumber++;
+
+					rvc_camera_info_t pcamerainfo;
+					memset(&pcamerainfo, 0, sizeof(rvc_camera_info_t));
+					if (0 == rvc_videocap_get_camera_infos(i, &pcamerainfo)) {
+						cJSON* pobject = cJSON_CreateObject();
+						cJSON_AddItemToObject(pobject, "driver", cJSON_CreateString(pcamerainfo.strdriver));
+						cJSON_AddItemToObject(pobject, "card", cJSON_CreateString(pcamerainfo.strcard));
+						cJSON_AddItemToObject(pobject, "bus_info", cJSON_CreateString(pcamerainfo.strbus_info));
+						cJSON_AddItemToArray(array, pobject);
+					}
 				}
 			}
 		}
-
 #endif // RVC_OS_WIN
 
 		if (icamnum > 0) {
 			LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_CAMERA_COUNT, CSimpleStringA::Format("camera number is %d.", icamnum).GetData());
-
 			if (strCamInfoJson.GetLength() > 0) {
 				strCamInfoJson[strCamInfoJson.GetLength() - 1] = '\0';
 			}
 			LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_GETCAMERA_INFOS, CSimpleStringA::Format("[{%s}]", strCamInfoJson.GetData()).GetData());
+		
+			cJSON_AddItemToObject(root, "CameraDevInfo", array);
+			char* pjsonstr = cJSON_Print(root);
+			strCamListInfoJson = pjsonstr;
+			cJSON_free(pjsonstr);
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V1").setAPI("RvcMedia_GetCameraDevInfo")(CSimpleStringA::Format("%s", strCamListInfoJson.GetData()).GetData());
+		}
+		else {
+			cJSON_Delete(array);
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V1").setResultCode("RTA280A")("获取摄像头列表失败,找不到摄像头");
 		}
 
 		*ivideonum = icamnum;
+		cJSON_Delete(root);
 
 		return Error_Succeed;
 	}

+ 5 - 0
Module/mod_mediacontroller/capture.h

@@ -5,6 +5,7 @@
 #include "libaudioqueue.h"
 #include "libvideoqueue.h"
 #include "rvc_media_common.h"
+#include "cJSON.h"
 
 #ifdef RVC_OS_WIN
 #include <portaudio.h>
@@ -49,6 +50,10 @@ extern "C"{
 #define RVC_CAM_INTERVAL_TIME 3000
 #endif // !RVC_CAM_INTERVAL_TIME
 
+#ifndef MAX_PATH
+#define MAX_PATH 260
+#endif
+
 namespace MediaController {
 	typedef struct capture_t capture_t;
 	typedef struct rvc_sales_audio_capture_s rvc_sales_audio_capture_t;

+ 42 - 28
Module/mod_mediacontroller/mod_mediacontroller.cpp

@@ -539,6 +539,7 @@ void CMediaControllerEntity::OnTimeout(DWORD dwTimerID)
 					if (m_capture) {
 						GetFunction()->KillTimer(1);
 						capture_stop(m_capture);
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V5")("关闭摄像头");
 						capture_destroy(m_capture);
 						m_capture = NULL;
 					}
@@ -620,7 +621,7 @@ void CMediaControllerEntity::OnTimeCameraStatusCheck()
 		}
 		
 		LogWarn(Severity_Middle, Error_Hardware, ERROR_MOD_MEDIACONTROLLER_ENVCAMERA_BUG, strInfo);
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI("CaptureEnvCam").setLogCode(MediaService_LogCode_StartCamera).setResultCode("RTA2805")("上摄像头故障,采集不到图像");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402208V4").setResultCode("RTA2805")("上摄像头故障,采集不到图像");
 
 		if (eStand1SPlusType == m_eDeviceType){
 			m_nCameraErrorCode = Error_AllCamera;
@@ -709,7 +710,7 @@ void CMediaControllerEntity::OnTimeCameraStatusCheck()
 		}
 		
 		LogWarn(Severity_Middle, Error_Hardware, ERROR_MOD_MEDIACONTROLLER_OPECAMERA_BUG, strInfo);
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI("CaptureOptCam").setLogCode(MediaService_LogCode_StartCamera).setResultCode("RTA2806")("下摄像头故障,采集不到图像");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402208V4").setResultCode("RTA2806")("下摄像头故障,采集不到图像");
 		if (m_nCameraErrorCode == Error_Succeed)
 		{
 			m_nCameraErrorCode = Error_OptCamera;
@@ -906,16 +907,11 @@ ErrorCodeEnum CMediaControllerEntity::StartAllCameras()
 	ErrorCodeEnum Error = Error_Succeed;
 	if (false == m_bStartCamera){
 		Error = StartCamera();
-		if (Error_Succeed == Error){
-			SetCameraSysVar(CAMERA_NO_ERROR);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_NO_ERROR");
-			m_bStartCamera = true;
-		}
+		SetCameraStateInfo(Error);
 
-		if (Error_EnvCamera == Error || Error_OptCamera == Error) {
-			m_bStartCamera = true;
+		if (m_bStartCamera) {
+			OnCameraStarted();
 		}
-		OnCameraStarted();
 	}
 	else{
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("camera already start.");
@@ -930,6 +926,7 @@ ErrorCodeEnum CMediaControllerEntity::StopAllCameras()
 	if (m_capture){
 		GetFunction()->KillTimer(1);
 		capture_stop(m_capture);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V5")("关闭摄像头");
 		capture_destroy(m_capture);
 		m_capture = NULL;
 	}
@@ -1178,31 +1175,38 @@ ErrorCodeEnum CMediaControllerEntity::LoadConfig(capture_config_t *conf)
 			}
 			else {
 				LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_MEDIACONTROLLER_VIDEO_AUTO_MATHED_FAILED, strInfo.GetData());
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI("CameraNameCheck").setLogCode(MediaService_LogCode_GetVideoDeviceName).setResultCode("RTA2807")("摄像头名称不符合硬件要求,请联系厂商处理");
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V2").setResultCode("RTA2807")("摄像头名称不符合硬件要求,请联系厂商处理");
 			}
 #endif // RVC_OS_WIN
 
 			Error = CheckConfigCameraName(conf, m_eDeviceType);
-			if (Error == Error_EnvCamera || Error == Error_AllCamera){
+			if (Error == Error_EnvCamera){
 				char strMessage[MAX_PATH*2] = {0};
-				get_camera_exception_message(strMessage, MAX_PATH*2, conf->strVideoEnv ,"env camera start error,please check config file or device.");
+				get_camera_exception_message(strMessage, MAX_PATH*2, conf->strVideoEnv ,"env camera config error,please check config file or device.");
 				LogWarn(Severity_Middle,Error_DevMedia,ERROR_MOD_MEDIACONTROLLER_ENVCAM_INITFAIL,strMessage);
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI("EnvCameraCheck").setLogCode(MediaService_LogCode_StartCamera).setResultCode("RTA2801")("上摄像头配置错误,请检查摄像头配置");
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V2").setResultCode("RTA2801")("上摄像头配置错误,请检查摄像头配置");
 			} else if (Error == Error_OptCamera){
 				char strMessage[MAX_PATH*2] = {0};
-				get_camera_exception_message(strMessage, MAX_PATH*2, conf->strVideoOpt, "operation camera start error,please check config file or device.");
+				get_camera_exception_message(strMessage, MAX_PATH*2, conf->strVideoOpt, "operation camera config error,please check config file or device.");
 				LogWarn(Severity_Middle,Error_DevMedia,ERROR_MOD_MEDIACONTROLLER_OPTCAM_INITFAIL, strMessage);
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI("OptCameraCheck").setLogCode(MediaService_LogCode_StartCamera).setResultCode("RTA2802")("下摄像头配置错误,请检查摄像头配置");
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V2").setResultCode("RTA2802")("下摄像头配置错误,请检查摄像头配置");
+			}
+			else if (Error == Error_AllCamera) {
+				LogWarn(Severity_Middle, Error_DevMedia, ERROR_MOD_MEDIACONTROLLER_CONFIG_ALLERROR, "all config cameras error");
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V2").setResultCode("RTA280B")("上下摄像头配置都错误,请检查摄像头配置");
+			}
+			else {
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V2")("摄像头配置正确");
 			}
 		}
 		else {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("load config failed!");
 		}
 	} 
-	else 
-	{
+	else {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("open config failed!");
 	}
+
 	return Error;
 }
 
@@ -1587,42 +1591,52 @@ ErrorCodeEnum CMediaControllerEntity::StartCamera()
 }
 
 
-void CMediaControllerEntity::StartCameraAndSetSysVar()
+void CMediaControllerEntity::SetCameraStateInfo(ErrorCodeEnum errorcode)
 {
-	CheckAutoVideoConfig(&conf);
-	ErrorCodeEnum Error = StartCamera();
-	if (Error == Error_Succeed){
+	if (Error_Succeed == errorcode) {
 		SetCameraSysVar(CAMERA_NO_ERROR);
 		m_bStartCamera = true;
 		m_nCameraErrorCode = Error_Succeed;
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V3")("摄像头打开成功");
 	}
-	else{
-		if (Error == Error_EnvCamera){
+	else {
+		if (Error_EnvCamera == errorcode) {
 			SetCameraSysVar(CAMERA_ENV_ERROR);
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_ENV_ERROR");
 			m_bStartCamera = true;
 			m_nCameraErrorCode = Error_EnvCamera;
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V3").setResultCode("RTA2803")("上摄像头故障,打开失败");
 		}
-		else if (Error == Error_OptCamera){
+		else if (Error_OptCamera == errorcode) {
 			SetCameraSysVar(CAMERA_OPT_ERROR);
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_OPT_ERROR");
 			m_bStartCamera = true;
 			m_nCameraErrorCode = Error_OptCamera;
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V3").setResultCode("RTA2804")("下摄像头故障,打开失败");
 		}
-		else if (Error == Error_AllCamera){
+		else if (Error_AllCamera == errorcode) {
 			SetCameraSysVar(CAMERA_BOTH_ERROR);
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_BOTH_ERROR");
 			m_nCameraErrorCode = Error_AllCamera;
 			m_bStartCamera = false;
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V3").setResultCode("RTA2808")("上下摄像头都故障");
 		}
-		else{
+		else {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to Other Error");
-			m_nCameraErrorCode = Error;
+			m_nCameraErrorCode = errorcode;
 			m_bStartCamera = false;
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V3").setResultCode("RTA2809")("打开摄像头时出现其它异常");
 		}
 	}
 }
 
+void CMediaControllerEntity::StartCameraAndSetSysVar()
+{
+	CheckAutoVideoConfig(&conf);
+	ErrorCodeEnum Error = StartCamera();
+	SetCameraStateInfo(Error);
+}
+
 ErrorCodeEnum CMediaControllerEntity::ReStartCamera(int nCamera)
 {
 	if (m_capture != NULL)

+ 1 - 0
Module/mod_mediacontroller/mod_mediacontroller.h

@@ -123,6 +123,7 @@ public:
 	void OnTimeCameraStatusCheck();
 	ErrorCodeEnum ConnectAssistChannel();
 	void LogTransactionRecordCtrEvt(int iEvtType);
+	void SetCameraStateInfo(ErrorCodeEnum errorcode);
 
 public:
 	DeviceTypeEnum m_eDeviceType;

+ 1 - 0
Module/mod_sipphone/CMakeLists.txt

@@ -39,6 +39,7 @@ set(${MODULE_PREFIX}_SRCS
     mod_sipphone.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE_PLAFORM_SUBDIR}/video_session.cpp
     ${${SIPPHONE_PLATFORM}_SRCS}
+	${ThirdPartyHeadRoot}/CJson/cJSON.c
 )
 
 set(MOD_VERSION_STRING "0.0.1-dev1")

+ 3 - 7
Module/mod_sipphone/Event.h

@@ -161,7 +161,6 @@
 #define EVENT_MOD_CONNECT_HANDFREE_TO_PICKUP						0x10303046	//免提->提机
 #define EVENT_MOD_CONNECT_PICKUP_TO_HANDFREE						0x10303047	//提机->免提
 
-
 #define EVENT_MOD_CONNECT_SLV_HANDFREECALL							0x10303050	//界面拨号,免提呼叫发送给SIPPHONE
 #define EVENT_MOD_CONNECT_SLV_PICKUPCALL							0x10303051  //界面拨号,话筒呼叫发送给SIPPHONE
 
@@ -171,23 +170,20 @@
 #define EVENT_MOD_CONNECT_STOP_RECORD_BROADCAST						0x10303060	//结束双录语音播报
 #define EVENT_MOD_CONNECT_BEGAIN_RECORD_CALL						0x10303061	//开始双录呼叫
 
-
 #define LOG_EVT_ENTER_ACM_FLOW										0x30500001	//进入坐席控制流程(initiactivetransfer发送)
 #define LOG_EVT_EXIT_ACM_FLOW										0x30500002  //进入坐席控制流程(initiactivetransfer发送)
 
-
 #define LOG_EVT_RELEASELIVEDETECTION								0x30400003  //通知sipphone释放主动活体
-//add by chh 20170104
+
 #define LOG_EVT_UI_HIDEONLINEVIDEO									0x30B00010	//隐藏视频连线窗口
 #define LOG_EVT_UI_SHOWONLINEVIDEO									0x30B00011	//显示视频连线窗口
-//add by chh 20190408
+
 #define LOG_EVT_UI_HIDELOCALVIDEO									0x30B00012	//隐藏本地视频窗口
 #define LOG_EVT_UI_SHOWLOCALVIDEO									0x30B00013	//显示本地视频窗口
-//add by chh 20190424
+
 #define LOG_EVT_UI_HIDEPERSONAREA									0x30B00014	//隐藏人形框
 #define LOG_EVT_UI_SHOWPERSONAREA									0x30B00015	//显示隐藏人形框
 
-	
 #define LOG_EVT_UI_STARTRECORD										0x30B00001	//开始录像
 #define LOG_EVT_UI_STOPRECORD										0x30B00002	//停止录像
 #define LOG_EVT_UI_RETURNMENU										0x30B00006	//退出到主菜单

+ 102 - 170
Module/mod_sipphone/audio_session.cpp

@@ -7,8 +7,9 @@
 #include "audioframework.h"
 #include "libaudioqueue.h"
 #include "rvc_media_common.h"
-#include <string.h>
+#include <string>
 #include "iaudionsinterface.h"
+#include "cJSON.h"
 
 #ifdef RVC_OS_WIN
 #include <portaudio.h>
@@ -78,36 +79,16 @@ struct audio_session_t
 	rtp_session_t *rtpsess;
 	Clibaudioqueue*remoteaudioqueue;
 	bool baudiorecved;
-	//bool brtpinsertqueue;
 	int iaudio_seriesnumber;
 #ifdef RVC_OS_LINUX
 	//audio noise suppression
 	IAudioNs* audionsobj;
 	IAudioNs* audioplaynsobj;
-	//FILE* pFile;
 #endif
 };
 
 #ifdef RVC_OS_WIN
-//static bool phonemedia_rtp_record(audio_session_t* pseesion)
-//{
-//	bool bret = false;
-//	if (NULL == pseesion){
-//		return bret;
-//	}
-//
-//	if (true == pseesion->brtpinsertqueue){
-//		if (DOUBLERECORD_CALLTYPE == pseesion->phonemedia_conf.eCalltype){
-//			if (eStand2sType == pseesion->phonemedia_conf.eDeviceType){
-//				if (DEV_PICKUP == pseesion->phonemedia_conf.dev_type){
-//					bret = true;
-//				}
-//			}
-//		}
-//	}
-//
-//	return bret;
-//}
+
 #else
 static int tx_audio_callback(void* audiodata, void* userdata)
 {
@@ -191,38 +172,6 @@ static int rvc_audio_playing_data(void* pdata, size_t ulen, void* user_data)
 }
 
 
-
-//static int rx_audio_callback(char *frame,void*userdata)
-//{
-//	audio_session_t*session = (audio_session_t*)userdata;
-//	int used = 0;
-//
-//	if (DOUBLERECORD_CALLTYPE != session->phonemedia_conf.eCalltype)
-//	{
-//		if (frame) 
-//		{
-//			audio_frame frm;
-//			frm.bitspersample = 16;
-//			frm.format = 1;
-//			frm.data = frame;
-//			frm.framesize = 160;   //注意此参数可能不准确,网络传输的包大小可能是不定长的,取音频数据时慎用此参数
-//			//写入实际的单个包大小
-//			//frm.framesize = strlen(frame);  //不能使用此方法,网络传输的包大小可能是不定长的
-//			frm.nchannels = 1;
-//			frm.samplespersec = 8000;
-//		#ifdef RVC_OS_LINUX
-//			frm.iseriesnumber = g_nAudioRecvNum;
-//		#endif
-//			if (!session->remoteaudioqueue->InsertAudio(&frm)) 
-//			{
-//				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InsertAudio failed! frameCount:%d", frm.framesize);
-//				used = -1;
-//			}
-//		}
-//	}
-//	return used;
-//}
-
 static void send_hook_callback(const char *buf, int size, void *arg)
 {
 	g_nAudioSendNum++;
@@ -237,65 +186,6 @@ static void recv_hook_callback(const char *buf, int size, void *arg)
 		LogWarn(Severity_Low, Error_Debug, EVENT_MOD_SIP_AUDIO_STREAM_RECEIVED, CSimpleStringA::Format("received first audio packet, and packet size is %d.", size).GetData());
 		psession->baudiorecved = true;
 	}
-	
-//#ifdef RVC_OS_WIN
-//	if (0 == psession->phonemedia_conf.dev_type && DOUBLERECORD_CALLTYPE == psession->phonemedia_conf.eCalltype){
-//		if (false == psession->brtpinsertqueue){
-//			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("rtp stream insert to audio queue flag is set to true.");
-//		}
-//		psession->brtpinsertqueue = true;
-//	}
-//	g_nAudioRecvNum++;
-//
-//	if (true == phonemedia_rtp_record(psession)){
-//		char strbuffer[RVC_MAX_BUFFER_LEN]={0};
-//		int outsize = RVC_MAX_BUFFER_LEN;
-//		switch(hdr->pt)
-//		{
-//		case RTP_PT_PCMA:
-//			audiocodec_pcma_decode(buf+sizeof(rtp_hdr), size-sizeof(rtp_hdr), strbuffer, &outsize);
-//			break;
-//		case RTP_PT_PCMU:
-//			audiocodec_pcmu_decode(buf+sizeof(rtp_hdr), size-sizeof(rtp_hdr), strbuffer, &outsize);
-//			break;
-//		case RTP_PT_G729:
-//			audiocodec_g729a_decode(buf+sizeof(rtp_hdr), size-sizeof(rtp_hdr), strbuffer, &outsize);
-//			break;
-//		default:
-//			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("audiocodec_decode not support audio pt(%d).", hdr->pt);
-//			break;
-//		}
-//
-//		if (psession && psession->remoteaudioqueue){
-//			int iCount = (outsize+iLastLeft)/RVC_AUDIO_FRAME_LEN;
-//			memcpy(straudiodata+iLastLeft, strbuffer, iCount*RVC_AUDIO_FRAME_LEN-iLastLeft);
-//			for(int i = 0; i < iCount; i++)
-//			{
-//				audio_frame frm;
-//				char straudio[RVC_AUDIO_FRAME_LEN]={0};
-//				memcpy(straudio, straudiodata+i*RVC_AUDIO_FRAME_LEN, RVC_AUDIO_FRAME_LEN);
-//				frm.bitspersample = 16;
-//				frm.format = 1;
-//				frm.data = straudio;
-//				frm.framesize = RVC_AUDIO_FRAME_LEN;   //注意此参数可能不准确,网络传输的包大小可能是不定长的,取音频数据时慎用此参数
-//				frm.nchannels = 1;
-//				frm.samplespersec = 8000;
-//				if (!psession->remoteaudioqueue->InsertAudio(&frm)) 
-//				{
-//					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InsertAudio failed! frameCount:%d", frm.framesize);
-//				}
-//			}
-//			memset(straudiodata, 0, RVC_MAX_BUFFER_LEN);									//清空缓存
-//			iLastLeft = (outsize + iLastLeft) % RVC_AUDIO_FRAME_LEN;						//上次剩余不足RVC_AUDIO_FRAME_LEN的buffer
-//			if ((0 != iLastLeft) && (iCount*RVC_AUDIO_FRAME_LEN < outsize)){
-//				memcpy(straudiodata, strbuffer+iCount*RVC_AUDIO_FRAME_LEN, iLastLeft);		//暂存上一次的未入队列的音频数据
-//			}
-//		}
-//		else{
-//			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("pseesion->remoteaudioqueue is null.");
-//		}
-//	}
-//#endif
 }
 
 
@@ -447,29 +337,28 @@ static int phonemedia_start(audio_session_t *session)
 	status = apr_pool_create(&media->pool, NULL);
 	if (status != APR_SUCCESS) {
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_APR_POOL_CREATE_FAILED, "create media pool failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA310C")("创建音频引擎内存分配失败");
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA310C")("创建音频引擎内存分配失败");
 		return Error_Resource;
 	}
 
 	status = audioengine_create(media->pool, &media->engine);
 	if (status != APR_SUCCESS) {
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_ENGINE_CREATE_FAILED, "create audio engine failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA310D")("创建音频引擎失败");
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA310D")("创建音频引擎失败");
 		goto on_error;
 	}
 
 	status = audioengine_start(media->engine);
 	if (status != APR_SUCCESS) {
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_ENGINE_START_FAILED, "audio engine start failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA310E")("启动音频引擎失败");
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA310E")("启动音频引擎失败");
 		goto on_error;
 	}
 
 	rc = rtp_session_create2(conf->local_rtp_ip, conf->local_rtp_port, 2, &media->rtpsess);
 	if (rc != 0) {
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_RTP_SESSION_CREATE_FAILED, CSimpleStringA::Format("audio rtp session create2 failed and local port is %d, rc=%d", conf->local_rtp_port, rc).GetData());
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA310F")("创建音频流通道失败");
-		//LogWarn(Severity_Low, Error_InvalidState, EVENT_MOD_SIP_AUDIO_RTP_CREATE, CSimpleStringA::Format("audio rtp session create2 failed and local port is %d, rc=%d", conf->local_rtp_port, rc).GetData());
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA310F")("创建音频流通道失败");
 		goto on_error;
 	}
 
@@ -477,21 +366,21 @@ static int phonemedia_start(audio_session_t *session)
 	rc = rtp_session_reset2(media->rtpsess, conf->dir, conf->remote_rtp_ip, conf->remote_rtp_port, conf->remote_rtp_port + 1);
 	if (rc != 0) {
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_RTP_SESSION_RESET_FAILED, "audio rtp session reset failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA3110")("重置音频流通道失败");
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3110")("重置音频流通道失败");
 		goto on_error;
 	}
 	
 	status = audiobridge_create(media->pool, media->engine, &media->bridge);
 	if (status != APR_SUCCESS){
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_BRIDGE_CREATE_FAILED, "audio bridge create failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA3111")("音频通道桥接失败");
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3111")("音频通道桥接失败");
 		goto on_error;
 	}
 
 	status = apr_pool_create(&media->micspk_pool, media->pool);
 	if (status != APR_SUCCESS){
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_APR_POOL_CREATE_FAILED, "create media micspk_pool failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA3112")("创建音频设备管理内存分配失败");
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3112")("创建音频设备管理内存分配失败");
 		goto on_error;
 	}
 
@@ -503,13 +392,13 @@ static int phonemedia_start(audio_session_t *session)
 		opt_micspk |= AMS2_OPT_AEC;
 #ifdef RVC_OS_WIN
 	//create Spk 
-status = audiomicspk2_create(media->micspk_pool, media->engine, opt_micspk, AUDIO_CLOCK, in_dev, out_dev, conf->dev_type, &audio_device_event, &media->micspkstream);
+	status = audiomicspk2_create(media->micspk_pool, media->engine, opt_micspk, AUDIO_CLOCK, in_dev, out_dev, conf->dev_type, &audio_device_event, &media->micspkstream);
 #else
 	status = audiomicspkpulse_create(media->micspk_pool, media->engine, opt_micspk, AUDIO_CLOCK, in_dev, out_dev, conf->dev_type, &audio_device_event, &media->micspkstream);
 #endif
 	if (status != APR_SUCCESS){
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_MICSPK_CREATE_FAILED, "create audio audio micspk create failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA3113")("创建音频设备管理失败");
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3113")("创建音频设备管理失败");
 		goto on_error;
 	}
 	//音频回调
@@ -533,7 +422,7 @@ status = audiomicspk2_create(media->micspk_pool, media->engine, opt_micspk, AUDI
 		status = audiodsp_create(media->micspk_pool, media->engine, read_opt, write_opt, AUDIO_CLOCK, &media->dspstream);
 		if (status != APR_SUCCESS){
 			LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_DSP_CREATE_FAILED, "create audio dsp failed!");
-			DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA3114")("创建音频信号处理器失败");
+			DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3114")("创建音频信号处理器失败");
 			goto on_error;
 		}
 	}
@@ -550,7 +439,7 @@ status = audiomicspk2_create(media->micspk_pool, media->engine, opt_micspk, AUDI
 		conf->local_ptime*2*AUDIO_CLOCK/1000, &media->resizestream);
 	if (status != APR_SUCCESS){
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_RESIZE_CREATE_FAILED, "create audio resize failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA3115")("创建音频重采样失败");
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3115")("创建音频重采样失败");
 		goto on_error;
 	}
 
@@ -558,14 +447,14 @@ status = audiomicspk2_create(media->micspk_pool, media->engine, opt_micspk, AUDI
 		AUDIO_CODEC_OPT_ENCODE_WRITE, &media->codecstream);
 	if (status != APR_SUCCESS){
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_CODEC_CREATE_FAILED, "create audio codec failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA3116")("创建音频编解码器失败");
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3116")("创建音频编解码器失败");
 		goto on_error;
 	}
 
 	status = audiortp_create(media->pool, media->engine, media->rtpsess, &media->rtpstream);
 	if (status != APR_SUCCESS){
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_RTP_CREATE_FAILED, "create audio rtp failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA3117")("创建音频rtp失败");
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3117")("创建音频rtp失败");
 		goto on_error;
 	}
 
@@ -588,12 +477,9 @@ status = audiomicspk2_create(media->micspk_pool, media->engine, opt_micspk, AUDI
 		audiortp_set_param(media->rtpstream, AUDIO_RTP_FLAG_SEND_PTIME, &param);
 		param = conf->remote_ptime;
 		audiortp_set_param(media->rtpstream, AUDIO_RTP_FLAG_RECV_PTIME, &param);
-		//media->rtpstream->m_on_send_hook = &m_on_recv_hook;
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("recv hook addr %d,send hook addr %d", &m_on_recv_hook,&m_on_send_hook);
 		audiortp_set_param(media->rtpstream, AUDIO_RTP_FLAG_HOOK_ARG, media);
 		audiortp_set_param(media->rtpstream, AUDIO_RTP_FLAG_RECV_HOOK, (const void*)&recv_hook_callback);
 		audiortp_set_param(media->rtpstream, AUDIO_RTP_FLAG_SEND_HOOK, (const void*)&send_hook_callback);
-		//audiortp_set_param(media->rtpstream, AUDIO_RTP_FLAG_HOOK_ARG, media->rtpstream);
 		audiortp_init(media->rtpstream);
 	}
 
@@ -643,7 +529,7 @@ status = audiomicspk2_create(media->micspk_pool, media->engine, opt_micspk, AUDI
 	status = audiocontext_create(media->pool, media->engine, &media->context);
 	if (status != APR_SUCCESS){
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_CONTEXT_CREATE_FAILED, "create audio context failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA3118")("创建音频流水线管理器失败");
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3118")("创建音频流水线管理器失败");
 		goto on_error;
 	}
 
@@ -781,8 +667,7 @@ static int phonemedia_chang_dev(audio_session_t *session, e_dev_type t)
 		audiomicspkpulse_create(media->micspk_pool, media->engine, opt_micspk, AUDIO_CLOCK, in_dev, out_dev, t, &audio_device_event, &media->micspkstream);
 		media->micspkstream->on_tx_audio = &tx_audio_callback;
 		media->micspkstream->on_audio_ns = &rvc_audio_ns;
-		media->micspkstream->on_audio_play_ns = &rvc_audio_play_ns;
-		
+		media->micspkstream->on_audio_play_ns = &rvc_audio_play_ns;	
 #endif
 		media->micspkstream->on_audio_playing = &rvc_audio_playing_data;
 		media->micspkstream->user_data = media;
@@ -830,8 +715,10 @@ static int phonemedia_chang_dev(audio_session_t *session, e_dev_type t)
 
 		audiortp_reset_jitter(media->rtpstream);
 		audiocontext_add_driver(media->context, &media->bridge->base);
+	
 		return 0;
-	} else {
+	} 
+	else {
 		return Error_NotInit;
 	}
 	
@@ -855,23 +742,6 @@ static void __audionslog(void* user_data, const char* fmt, va_list arg)
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s", strlog);
 	}
 }
-
-
-int audio_get_pcmrecord_filename(char* pbuffer, size_t ulen)
-{
-	int iret = -1;
-	char strfile[MAX_PATH] = { 0 };
-	struct tm* t;
-	time_t tt;
-	time(&tt);
-	t = localtime(&tt);
-	snprintf(strfile, MAX_PATH, "%4d%02d%02d%02d%02d%02d", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
-	if (NULL != pbuffer){
-		iret = snprintf(pbuffer, MAX_PATH, "%s/%s_%s.pcm", "/opt/rvc/Temp/","agent_audio", strfile);
-	}
-
-	return iret;
-}
 #endif
 
 int audio_session_create(const audio_session_conf_t *conf, audio_session_t **p_session)
@@ -879,7 +749,6 @@ int audio_session_create(const audio_session_conf_t *conf, audio_session_t **p_s
 	audio_session_t *session = ZALLOC_T(audio_session_t);
 	session->remoteaudioqueue = new Clibaudioqueue(REC_COMMON_REMOTEAUDIO_SHM_QUEUE);
 	session->baudiorecved = false;
-	//session->brtpinsertqueue = false;
 
 	session->iaudio_seriesnumber = RVC_MIN_AUDIO_SERIESNUMBER;
 
@@ -895,17 +764,14 @@ int audio_session_create(const audio_session_conf_t *conf, audio_session_t **p_s
 	if (NULL != session->audioplaynsobj) {
 		session->audioplaynsobj->SetNsParams(8000, 10, 2);
 	}
-	//char strfile[MAX_PATH] = { 0 };
-	//if (-1 != audio_get_pcmrecord_filename(strfile, MAX_PATH)) {
-	//	session->pFile = fopen(strfile, "wb+");
-	//}
 #endif
 	
 	if (session) {
 		memcpy(&session->conf, conf, sizeof(audio_session_conf_t));
 		*p_session = session;
 		return 0;
-	} else {
+	} 
+	else {
 		return Error_Resource;
 	}
 }
@@ -913,8 +779,11 @@ int audio_session_create(const audio_session_conf_t *conf, audio_session_t **p_s
 int audio_session_start_phonemedia(audio_session_t *session, const audio_session_phonemedia_conf_t *conf)
 {
 	int rc;
-	if (!session)
+	if (!session) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3119")("音频通道参数未初始化");
 		return Error_NotInit;
+	}
+		
 	if (session->pool) { // already started
 		phonemedia_stop(session);
 	}
@@ -949,13 +818,9 @@ void audio_session_destroy(audio_session_t *session)
 		session->audioplaynsobj = NULL;
 	}
 
-	////if (NULL != session->pFile) {
-	////	fclose(session->pFile);
-	////	session->pFile = NULL;
-	////}
 #endif
 	assert(session->pool == NULL);
-	free(session);
+	FREE(session);
 }
 
 
@@ -1008,6 +873,8 @@ int audio_lib_init()
 			CSimpleStringA strJsonOutData = CSimpleStringA::Format("audio out devices [{%s}]", strJsonOut.GetData());
 			LogWarn(Severity_Low, Error_Debug, LOG_EVT_SIPPHONE_GET_AUDIO_OUT_INFOS, strJsonOutData.GetData());
 		}
+
+
 #endif
 		audio_log_set_func(&__audio_log_func);
 	}
@@ -1022,22 +889,29 @@ void audio_lib_deinit()
 
 
 #ifdef RVC_OS_WIN
-
 int audio_get_dev_count(int *in_cnt, int *out_cnt)
 {
 	int icnt = 0, ocnt = 0;
 	int cnt = Pa_GetDeviceCount();
 	for (int i = 0; i < cnt; ++i) {
 		const PaDeviceInfo *info = Pa_GetDeviceInfo(i);
-		if (info->maxInputChannels)
-			icnt ++;
-		if (info->maxOutputChannels)
-			ocnt ++;
+		if (info->maxInputChannels) {
+			icnt++;
+		}
+			
+		if (info->maxOutputChannels) {
+			ocnt++;
+		}
 	}
-	if (in_cnt)
+
+	if (in_cnt) {
 		*in_cnt = icnt;
-	if (out_cnt)
+	}
+		
+	if (out_cnt) {
 		*out_cnt = ocnt;
+	}
+		
 	return 0;
 }
 
@@ -1069,6 +943,64 @@ CSimpleStringA audio_get_dev_name(bool in_direction, int idx)
 	return CSimpleStringA();
 }
 
+CSimpleStringA audio_get_dev_infos(bool in_direction)
+{
+	int cnt = Pa_GetDeviceCount();
+	
+	CSimpleStringA strAudioJson("");
+	cJSON* array = cJSON_CreateArray();
+	cJSON* root = cJSON_CreateObject();
+
+	char* strkey = NULL;
+	if (in_direction) {
+		strkey = "MicrophoneInfo";
+	}
+	else {
+		strkey = "SpeakerInfo";
+	}
+
+	for (int i = 0; i < cnt; ++i) {
+		const PaDeviceInfo* pinfo = Pa_GetDeviceInfo(i);
+		if (in_direction) {
+			if (pinfo->maxInputChannels > 0) {
+				cJSON* pobject = cJSON_CreateObject();
+				cJSON_AddItemToObject(pobject, "name", cJSON_CreateString(pinfo->name));
+				cJSON_AddItemToObject(pobject, "samprate", cJSON_CreateString(CSimpleStringA::Format("%d", (int)pinfo->defaultSampleRate).GetData()));
+				cJSON_AddItemToObject(pobject, "channels", cJSON_CreateString(CSimpleStringA::Format("%d", pinfo->maxInputChannels).GetData()));
+				cJSON_AddItemToObject(pobject, "low_latency", cJSON_CreateString(CSimpleStringA::Format("%.2f", pinfo->defaultLowInputLatency).GetData()));
+				cJSON_AddItemToObject(pobject, "high_latency", cJSON_CreateString(CSimpleStringA::Format("%.2f", pinfo->defaultHighInputLatency).GetData()));
+				cJSON_AddItemToArray(array, pobject);
+			}
+			else {
+				continue;
+			}
+		}
+		else {
+			if (pinfo->maxOutputChannels > 0) {
+				cJSON* pobject = cJSON_CreateObject();
+				cJSON_AddItemToObject(pobject, "name", cJSON_CreateString(pinfo->name));
+				cJSON_AddItemToObject(pobject, "samprate", cJSON_CreateString(CSimpleStringA::Format("%d", (int)pinfo->defaultSampleRate).GetData()));
+				cJSON_AddItemToObject(pobject, "channels", cJSON_CreateString(CSimpleStringA::Format("%d", pinfo->maxOutputChannels).GetData()));
+				cJSON_AddItemToObject(pobject, "low_latency", cJSON_CreateString(CSimpleStringA::Format("%.2f", pinfo->defaultLowOutputLatency).GetData()));
+				cJSON_AddItemToObject(pobject, "high_latency", cJSON_CreateString(CSimpleStringA::Format("%.2f", pinfo->defaultHighOutputLatency).GetData()));
+				cJSON_AddItemToArray(array, pobject);
+			}
+			else {
+				continue;
+			}
+		}
+	}
+	cJSON_AddItemToObject(root, strkey, array);
+
+	char* pjsonstr = cJSON_Print(root);
+	strAudioJson = pjsonstr;
+
+	cJSON_free(pjsonstr);
+	cJSON_Delete(root);
+
+	return strAudioJson;
+}
+
 int capture_get_audio_device_id(bool in_direction, const char *dev_name)
 {
 	if (NULL == dev_name || 0 == strlen(dev_name)) {

+ 1 - 0
Module/mod_sipphone/audio_session.h

@@ -71,5 +71,6 @@ void audio_lib_deinit();
 
 int audio_get_dev_count(int *in_cnt, int *out_cnt);
 CSimpleStringA audio_get_dev_name(bool in_direction, int idx);
+CSimpleStringA audio_get_dev_infos(bool in_direction);
 int capture_get_audio_device_id(bool in_direction, const char *dev_name);
 #endif // MEDIACONTROLLER_AUDIO_H

+ 22 - 5
Module/mod_sipphone/endpoint.cpp

@@ -243,8 +243,12 @@ static void endpoint_media_update_video(endpoint_call_t *call, media_desc_t *vid
 			rc = audio_session_create(&conf, &call->audio);
 			if (rc != 0) {
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create audio session failed! rc = %d", rc);
+				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A4").setResultCode("RTA3109")("视频连线创建音频通道失败");
 				return;
 			}
+			else {
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A4")("视频连线创建音频通道成功");
+			}
 		}
 
 		if (call->video) {
@@ -357,8 +361,12 @@ static void endpoint_media_update_video(endpoint_call_t *call, media_desc_t *vid
 			rc = audio_session_create(&conf, &call->audio);
 			if (rc != 0) {
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create audio session failed! rc = %d", rc);
+				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A4").setResultCode("RTA3109")("视频连线创建音频通道失败");
 				return;
 			}
+			else {
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A4")("视频连线创建音频通道成功");
+			}
 		}
 
 		if (call->video) {
@@ -420,7 +428,9 @@ static void endpoint_media_update_audio(endpoint_call_t *call, media_desc_t *aud
 	if (audio_desc->media_dir == DIR_NONE) {
 		if (call->audio) {
 			audio_session_stop(call->audio);
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A6")("停止音频通道成功");
 			audio_session_destroy(call->audio);
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A7")("释放音频通道成功");
 			call->audio = NULL;
 		}
 		else{
@@ -439,11 +449,14 @@ static void endpoint_media_update_audio(endpoint_call_t *call, media_desc_t *aud
 			}
 		#endif	
 		}
-	} else {
+	} 
+	else {
 		int rc;
 		if (call->audio) {
 			audio_session_stop(call->audio);
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A6")("停止音频通道成功");
 			audio_session_destroy(call->audio);
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A7")("释放音频通道成功");
 			call->audio = NULL;
 		}
 		if (!call->audio) {
@@ -466,9 +479,12 @@ static void endpoint_media_update_audio(endpoint_call_t *call, media_desc_t *aud
 			rc = audio_session_create(&conf, &call->audio);
 			if (rc != 0) {
 				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("create audio session failed! rc = %d", rc);
-				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA3109")("视频连线创建音频通道失败");
+				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A4").setResultCode("RTA3109")("视频连线创建音频通道失败");
 				return;
 			}
+			else {
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A4")("视频连线创建音频通道成功");
+			}
 		}
 		audio_session_phonemedia_conf_t phone_conf = {0};
 		phone_conf.dir = audio_desc->media_dir;
@@ -490,14 +506,15 @@ static void endpoint_media_update_audio(endpoint_call_t *call, media_desc_t *aud
 		}
 		
 		rc = audio_session_start_phonemedia(call->audio, &phone_conf);
-		if (rc != 0) 
-		{
+		if (rc != 0) {
 			LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_INITFAIL, CSimpleStringA::Format("start audio session failed! rc = %d.", rc).GetData());
-			DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA310A")("视频连线启动音频通道失败");
 			audio_session_destroy(call->audio);
 			call->audio = NULL;
 			return;
 		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5")("视频连线启动音频通道成功");
+		}
 	}
 }
 

+ 63 - 11
Module/mod_sipphone/mod_sipphone.cpp

@@ -853,19 +853,21 @@ ErrorCodeEnum CSIPEntity::__OnStart(ErrorCodeEnum preOperationError)
 {
 	ErrorCodeEnum Error = Error_Succeed;
 
+	m_eDeviceType = RvcGetDeviceType();
+
 	audiomgr_callback_t t_callback = { 0 };
 	t_callback.debug = &__audiomgrlog;
 	m_pAudioMgr = CreateAudioMgrObj(&t_callback);
 	if (m_pAudioMgr && 0 == m_pAudioMgr->audio_mgr_initialize()) {
 		m_bAudioMgrInited = true;
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A1")("audio manager initialize success");
 	}
 	else {
 		LogWarn(Severity_Middle, Error_Debug, LOG_EVT_SIPPHONE_AUDIOMGR_INITIAL_FAILED, "audio manager initialize failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setResultCode("RTA310B")("音频服务初始化失败");
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A1").setResultCode("RTA310B")("音频服务初始化失败");
 	}
 	SetSoundCardSysVar(SOUNDCARD_INIT_STATE);
 
-	m_eDeviceType = RvcGetDeviceType();
 	m_stVideoParam.bActiveInspect = 0;
 	m_stVideoParam.bShowActiveImg = 0;
 	m_stVideoParam.nWindowState = 0;
@@ -893,13 +895,13 @@ ErrorCodeEnum CSIPEntity::__OnStart(ErrorCodeEnum preOperationError)
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("audio config is invalid.");
 		SetSoundCardSysVar(SOUNDCARD_CONFIG_EMPTY);
 		GetFunction()->SetSysVar("AuthErrMsg", "音频配置缺失,请使用硬件配置修改");
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA3101")("音频配置缺失,请使用硬件配置修改");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A3").setResultCode("RTA3101")("音频配置缺失,请使用硬件配置修改");
 		return Error_Param;
 	}
 	
 	uint32_t uCheckRet = CheckAudioDevice();
 	if (RVC_AUDIO_NO_ERROR == uCheckRet) {
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("no audio device config error.");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A3")("load audio device config success.");
 		SetSoundCardSysVar(SOUNDCARD_NO_ERROR);
 	}
 	else {
@@ -907,7 +909,7 @@ ErrorCodeEnum CSIPEntity::__OnStart(ErrorCodeEnum preOperationError)
 		if (IsBothSoundCardError(uCheckRet)) {		//两组声卡都故障
 			SetSoundCardSysVar(SOUNDCARD_BOTH_ERROR);
 			GetFunction()->SetSysVar("AuthErrMsg", "音频设备故障,请联系厂商排查");
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA3102")("音频设备故障,请联系厂商排查");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A3").setResultCode("RTA3102")("音频设备故障,请联系厂商排查");
 			return Error_Param;
 		}
 
@@ -915,12 +917,12 @@ ErrorCodeEnum CSIPEntity::__OnStart(ErrorCodeEnum preOperationError)
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("can't find handfree audio device.");
 			SetSoundCardSysVar(SOUNDCARD_HANDFREE_ERROR);
 			HandleHandfreeAudioDeviceErrorEvent();
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA3103")("识别不到免提声卡");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A3").setResultCode("RTA3103")("识别不到免提声卡");
 		}
 
 		if ((uCheckRet == (RVC_AUDIO_PICKUPIN_ERROR | RVC_AUDIO_PICKUPOUT_ERROR)) || (uCheckRet == RVC_AUDIO_PICKUPIN_ERROR) || (uCheckRet == RVC_AUDIO_PICKUPOUT_ERROR)) {
 			SetSoundCardSysVar(SOUNDCARD_PICKUP_ERROR);
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA3104")("话筒声卡故障声卡");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A3").setResultCode("RTA3104")("话筒声卡故障声卡");
 		}
 	}
 
@@ -1284,6 +1286,12 @@ ErrorCodeEnum CSIPEntity::RvcGetAudioDeviceInfo()
 {
 #ifdef RVC_OS_WIN
 	ErrorCodeEnum Error = Error_Succeed;
+	CSimpleStringA strAudioInInfos = audio_get_dev_infos(true);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A2").setAPI("RvcMedia_GetAudioInDevInfo")(strAudioInInfos.GetData());
+	
+	CSimpleStringA strAudioOutInfos = audio_get_dev_infos(false);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A2").setAPI("RvcMedia_GetAudioOutDevInfo")(strAudioOutInfos.GetData());
+
 	if (NULL != m_pAudioMgr || !m_bAudioMgrInited) {
 		int icountmic = m_pAudioMgr->audio_get_device_count(true);
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("core audio input device(%d):", icountmic);
@@ -1329,6 +1337,8 @@ ErrorCodeEnum CSIPEntity::RvcGetAudioDeviceInfo()
 		CSimpleStringA strJsonInData = CSimpleStringA::Format("audio in devices [{%s}]", strJsonIn.GetData());
 		LogWarn(Severity_Low, Error_Debug, LOG_EVT_SIPPHONE_GET_AUDIO_IN_INFOS, strJsonInData.GetData());
 
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A2").setAPI("RvcMedia_GetAudioInDevInfo")(GetAudioDeviceJsonInfos(true).GetData());
+
 		CSimpleStringA strJsonOut("");
 		int icountspeaker = m_pAudioMgr->audio_get_device_count(false);
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("audio output devices(%d):", icountspeaker);
@@ -1344,6 +1354,8 @@ ErrorCodeEnum CSIPEntity::RvcGetAudioDeviceInfo()
 		CSimpleStringA strJsonOutData = CSimpleStringA::Format("audio out devices [{%s}]", strJsonOut.GetData());
 		LogWarn(Severity_Low, Error_Debug, LOG_EVT_SIPPHONE_GET_AUDIO_OUT_INFOS, strJsonOutData.GetData());
 
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A2").setAPI("RvcMedia_GetAudioOutDevInfo")(GetAudioDeviceJsonInfos(false).GetData());
+		
 		Error = Error_Succeed;
 	}
 	return Error;
@@ -2091,10 +2103,10 @@ ErrorCodeEnum CSIPEntity::LoadConfig(endpoint_conf_t *conf)
 		table.AddEntryInt("video", "mtu", conf->mtu, 0);
 		Error = table.Load(spRootConfig);
 		if (Error == Error_Succeed) {
-			_snprintf(conf->audio_handfree_in_dev, MAX_PATH, "%s", strHandFreeIn.GetData());
-			_snprintf(conf->audio_handfree_out_dev, MAX_PATH, "%s", strHandFreeOut.GetData());
-			_snprintf(conf->audio_pickup_in_dev, MAX_PATH, "%s", strPickupIn.GetData());
-			_snprintf(conf->audio_pickup_out_dev, MAX_PATH, "%s", strPickupOut.GetData());
+			rvc_snprintf(conf->audio_handfree_in_dev, MAX_PATH, "%s", strHandFreeIn.GetData());
+			rvc_snprintf(conf->audio_handfree_out_dev, MAX_PATH, "%s", strHandFreeOut.GetData());
+			rvc_snprintf(conf->audio_pickup_in_dev, MAX_PATH, "%s", strPickupIn.GetData());
+			rvc_snprintf(conf->audio_pickup_out_dev, MAX_PATH, "%s", strPickupOut.GetData());
 
 			LogWarn(Severity_Low, Error_Debug, EVENT_MOD_SIP_AUDIO_VOLUME_INFO, generateVolumeJson(m_kept_volume_in[DEV_HANDFREE], m_kept_volume_out[DEV_HANDFREE], m_kept_volume_in[DEV_PICKUP], m_kept_volume_out[DEV_PICKUP]).GetData());
 			LogWarn(Severity_Low, Error_Debug, EVENT_MOD_SIP_AUDIO_DSP_INFO, generateAudioDspFlags(conf->audio_dsp).GetData());
@@ -2361,6 +2373,46 @@ void CSIPEntity::ShowBothVideo()
 	}
 }
 
+
+CSimpleStringA CSIPEntity::GetAudioDeviceJsonInfos(bool bmicro)
+{
+	CSimpleStringA strAudioDevJson("");
+	cJSON* array = cJSON_CreateArray();
+	cJSON* root = cJSON_CreateObject();
+	if (NULL != m_pAudioMgr) {
+		char* strkey = NULL;
+		if (bmicro) {
+			strkey = "MicrophoneInfo";
+		}
+		else {
+			strkey = "SpeakerInfo";
+		}
+
+		int iaudiocount = m_pAudioMgr->audio_get_device_count(bmicro);		
+		for (int i = 0; i < iaudiocount; i++) {
+			rvc_audio_device_t* audio_dev = m_pAudioMgr->audio_get_device_infos(bmicro, i);
+
+			cJSON* pobject = cJSON_CreateObject();
+			cJSON_AddItemToObject(pobject, "name", cJSON_CreateString(audio_dev->name));
+			cJSON_AddItemToObject(pobject, "description", cJSON_CreateString(audio_dev->description));
+			cJSON_AddItemToObject(pobject, "samprate", cJSON_CreateString(CSimpleStringA::Format("%d", audio_dev->samprate).GetData()));
+			cJSON_AddItemToObject(pobject, "channels", cJSON_CreateString(CSimpleStringA::Format("%d", audio_dev->channels).GetData()));
+			cJSON_AddItemToObject(pobject, "low_latency", cJSON_CreateString(CSimpleStringA::Format("%.2f", audio_dev->low_latency).GetData()));
+			cJSON_AddItemToObject(pobject, "high_latency", cJSON_CreateString(CSimpleStringA::Format("%.2f", audio_dev->high_latency).GetData()));
+			cJSON_AddItemToArray(array, pobject);
+		}
+		cJSON_AddItemToObject(root, strkey, array);
+	}
+	
+	char* pjsonstr = cJSON_Print(root);
+	strAudioDevJson = pjsonstr;
+
+	cJSON_free(pjsonstr);
+	cJSON_Delete(root);
+
+	return strAudioDevJson;
+}
+
 #endif
 
 //

+ 9 - 1
Module/mod_sipphone/mod_sipphone.h

@@ -10,7 +10,6 @@ using namespace SIPPhone;
 
 #if defined(RVC_OS_WIN)
 #include "volumekeeper.h"
-#include "iaudiomgrinterface.h"
 #else
 #include "video_render.h"
 #include "Event.h"
@@ -64,6 +63,14 @@ using namespace AssistantChannel;
 #endif
 #endif
 
+#ifndef rvc_snprintf
+#ifdef RVC_OS_WIN
+#define rvc_snprintf _snprintf
+#else
+#define rvc_snprintf snprintf
+#endif // RVC_OS_WIN
+#endif // rvc_snprintf
+
 typedef enum
 {
 	RVC_AUDIO_NO_ERROR = 0x0,				
@@ -331,6 +338,7 @@ private:
 	void ShowLocalVideo();
 	void HideBothVideo();
 	void ShowBothVideo();
+	CSimpleStringA GetAudioDeviceJsonInfos(bool bmicro);
 #endif //RVC_OS_WIN
 
 	void HandleHandfreeAudioDeviceErrorEvent();

+ 7 - 4
Module/mod_vtmloader/VtmLoaderFSM.cpp

@@ -187,16 +187,19 @@ DWORD checkUrlActive(LPVOID param)
 	{
 		if (entityInfo->m_uploadLogInfo_waitSec <= 0)
 			break;
-		Sleep(entityInfo->m_uploadLogInfo_waitSec * 1000);
 		unsigned long t_upload_TerminalSys_Suc, t_upload_TerminalUser_Suc, t_upload_BussinessSys_Suc, t_upload_BussinessUser_Suc, t_upload_beidou_Suc;
 		unsigned long t_upload_TerminalSys_Err, t_upload_TerminalUser_Err, t_upload_BussinessSys_Err, t_upload_BussinessUser_Err, t_upload_beidou_Err;
+		unsigned long t_discard_full, t_discard_RTI1002, curLogNum;
 		entityInfo->GetEntityBase()->GetFunction()->GetPrivilegeFunction()->GetSendLogInfo(&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);
+			&t_upload_TerminalSys_Err, &t_upload_TerminalUser_Err, &t_upload_BussinessSys_Err, &t_upload_BussinessUser_Err, &t_upload_beidou_Err,
+			&t_discard_full, &t_discard_RTI1002, &curLogNum);
 		LogWarn(SeverityLevelEnum::Severity_Low, Error_Trace, WARN_SendEndpoint_LOG_INFO,
-			CSimpleString::Format("checkUrlActive::GetSendLogInfo, TS_Suc:%d, TU_Suc:%d, BS_Suc:%d, BU_Suc:%d, beidou_Suc:%d, TS_Err:%d, TU_Err:%d, BS_Err:%d, BU_Err:%d, beidou_Err:%d"
+			CSimpleString::Format("checkUrlActive::GetSendLogInfo, TS_Suc:%d, TU_Suc:%d, BS_Suc:%d, BU_Suc:%d, beidou_Suc:%d, TS_Err:%d, TU_Err:%d, BS_Err:%d, BU_Err:%d, beidou_Err:%d, discard_forFull:%d, discard_forRTI1002:%d, curNum:%d"
 				, 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());
+				t_upload_TerminalSys_Err, t_upload_TerminalUser_Err, t_upload_BussinessSys_Err, t_upload_BussinessUser_Err, t_upload_beidou_Err
+			, t_discard_full, t_discard_RTI1002, curLogNum).GetData());
+		Sleep(entityInfo->m_uploadLogInfo_waitSec * 1000);
 	}
 	return 0;
 }

+ 21 - 1
Other/libaudiomgr/iaudiomgrinterface.h

@@ -15,6 +15,10 @@
 #include <stddef.h>
 #include <stdarg.h>
 
+#ifndef MAX_PATH
+#define MAX_PATH 260
+#endif
+
 typedef struct audiocap_param_s
 {
 	/** callbacks */
@@ -27,9 +31,21 @@ typedef struct audiocap_param_s
 	/* called from inner thread, should not block, can be null */
 	void (*on_audio_callback)(const void* input, unsigned long audiolen,void* userdata);
 	void* user_data;
-
 }audiocap_param_t;
 
+#pragma pack(1)
+typedef struct rvc_audio_device_s
+{
+	int id;							/*audo device id*/
+	int channels;					/*max channels*/
+	int samprate;					/*default samplerate*/
+	double low_latency;				/*default low latency*/
+	double high_latency;			/*default high latency*/
+	char name[MAX_PATH];			/*device name*/
+	char description[MAX_PATH];		/*device description*/
+} rvc_audio_device_t;
+#pragma pack()
+
 typedef struct audiomgr_callback_s{
 	void (*debug)(void* user_data, const char* fmt, va_list arg);
 	void (*on_audio_mgr_failed)();
@@ -51,12 +67,16 @@ public:
 #endif
 	virtual int audio_get_device_id(const char* pstrname, bool binput) = 0;
 
+	virtual rvc_audio_device_t* audio_get_device_infos(bool binput, int index) = 0;
+	
 	virtual int audio_get_device_volume(int* ivolume, const char* pstrname, bool binput) = 0;
 	virtual int audio_set_device_volume(int ivolume, const char* pstrname, bool binput) = 0;
 
 	virtual int set_audio_capture_params(audiocap_param_t* param) = 0;
+
 	virtual int start_audio_capture() = 0;
 	virtual int stop_audio_capture() = 0;
+	
 	virtual int audio_mgr_destroy() = 0;
 };
 

+ 15 - 2
Other/libaudiomgr/linux/libaudiomgr_linux.cpp

@@ -137,7 +137,7 @@ static void pa_sourcelist_cb(pa_context* c, const pa_source_info* l, int eol, vo
 		}
 		/*fill device data*/
 		audio_ctx->list_input_devices[audio_ctx->num_input_dev - 1].id = l->index; /*saves dev id*/
-		strncpy(audio_ctx->list_input_devices[audio_ctx->num_input_dev - 1].name, l->name, MAX_PATH_EX-1);
+		strncpy(audio_ctx->list_input_devices[audio_ctx->num_input_dev - 1].name, l->name, MAX_PATH-1);
 		strncpy(audio_ctx->list_input_devices[audio_ctx->num_input_dev - 1].description, l->description, MAX_PATH-1);
 		audio_ctx->list_input_devices[audio_ctx->num_input_dev - 1].channels = channels;
 		audio_ctx->list_input_devices[audio_ctx->num_input_dev - 1].samprate = l->sample_spec.rate;
@@ -291,7 +291,7 @@ static void pa_sinklist_cb(pa_context* c, const pa_sink_info* l, int eol, void*
 	}
 	/*fill device data*/
 	audio_ctx->list_output_devices[audio_ctx->num_output_dev - 1].id = l->index; /*saves dev id*/
-	strncpy(audio_ctx->list_output_devices[audio_ctx->num_output_dev - 1].name, l->name, MAX_PATH_EX-1);
+	strncpy(audio_ctx->list_output_devices[audio_ctx->num_output_dev - 1].name, l->name, MAX_PATH-1);
 	strncpy(audio_ctx->list_output_devices[audio_ctx->num_output_dev - 1].description, l->description, MAX_PATH-1);
 	audio_ctx->list_output_devices[audio_ctx->num_output_dev - 1].channels = l->channel_map.channels;
 	audio_ctx->list_output_devices[audio_ctx->num_output_dev - 1].samprate = l->sample_spec.rate;
@@ -653,6 +653,19 @@ int AudioMgrImpl::audio_get_device_id(const char* pstrname, bool binput)
 	return iret;
 }
 
+rvc_audio_device_t* AudioMgrImpl::audio_get_device_infos(bool binput, int index)
+{
+	rvc_audio_device_t* audio_device = NULL;
+	if (binput) {
+		audio_device = audio_get_input_device(index);
+	}
+	else {
+		audio_device = audio_get_output_device(index);
+	}
+
+	return audio_device;
+}
+
 int AudioMgrImpl::audio_get_device_volume(int* ivolume, const char* pstrname, bool binput)
 {
 	audiopulse_get_device_volume(ivolume, pstrname, binput);

+ 1 - 19
Other/libaudiomgr/linux/libaudiomgr_linux.h

@@ -11,14 +11,6 @@
 
 #include "audiodevicepulse.h"
 
-#ifndef MAX_PATH_EX
-#define MAX_PATH_EX 512
-#endif
-
-#ifndef MAX_PATH
-#define MAX_PATH 260
-#endif
-
 #ifndef NSEC_PER_SEC
 #define NSEC_PER_SEC 1000000000LL
 #endif
@@ -61,17 +53,6 @@
 /*internally is always float*/
 typedef int16_t sample_t;
 
-typedef struct rvc_audio_device_s
-{
-	int id;							/*audo device id*/
-	int channels;					/*max channels*/
-	int samprate;					/*default samplerate*/
-	double low_latency;				/*default low latency*/
-	double high_latency;			/*default high latency*/
-	char name[MAX_PATH_EX];         /*device name*/
-	char description[MAX_PATH];		/*device description*/
-} rvc_audio_device_t;
-
 typedef struct rvc_audio_context_s
 {
 	int num_input_dev;            /*number of audio input devices in list*/
@@ -126,6 +107,7 @@ public:
 	int audio_get_device_count(bool binput);
 	int audio_get_device_name(char* pstrbuf, size_t ulen, bool binput, int index);
 	int audio_get_device_id(const char* pstrname, bool binput);
+	rvc_audio_device_t* audio_get_device_infos(bool binput, int index);
 
 	int audio_get_device_volume(int* ivolume, const char* pstrname, bool binput);
 	int audiopulse_get_device_volume(int* ivolume, const char* pstrname, bool binput);

+ 4 - 0
Other/libaudiomgr/win/libaudiomgr_win.cpp

@@ -174,6 +174,10 @@ int AudioMgrImpl::audio_get_device_id(const char* pstrname, bool binput)
 	return iret;
 }
 
+rvc_audio_device_t* AudioMgrImpl::audio_get_device_infos(bool binput, int index)
+{
+	return NULL;
+}
 
 int AudioMgrImpl::audio_get_device_volume(int* ivolume, const char* pstrname, bool binput)
 {

+ 1 - 8
Other/libaudiomgr/win/libaudiomgr_win.h

@@ -15,14 +15,6 @@
 #include <functiondiscoverykeys.h>
 #include <EndpointVolume.h>
 
-#ifndef MAX_PATH_EX
-#define MAX_PATH_EX 512
-#endif
-
-#ifndef MAX_PATH
-#define MAX_PATH 260
-#endif
-
 
 class AudioMgrImpl : public IAudioMgr
 {
@@ -35,6 +27,7 @@ public:
 	int audio_get_device_count(bool binput);
 	int audio_get_device_name(char* pstrbuf, size_t ulen, bool binput,  unsigned int uindex);
 	int audio_get_device_id(const char* pstrname, bool binput);
+	rvc_audio_device_t* audio_get_device_infos(bool binput, int index);
 
 	int audio_get_device_volume(int* ivolume, const char* pstrname, bool binput);
 	int audio_set_device_volume(int ivolume, const char* pstrname, bool binput);

+ 5 - 2
Other/libfilecryption/fileanalysis.cpp

@@ -240,8 +240,9 @@ int get_file_json_infos_from_rvc_header(char** pstrjson, uint32_t* ujsonlen, cha
 		memcpy(*pstrjson, pret, ulen);
 		*ujsonlen = ulen;
 		iret = 0;
-		free(pret);
+		cJSON_free(pret);
 	}
+	cJSON_Delete(root);
 	return iret;
 }
 
@@ -285,8 +286,10 @@ int get_file_json_infos_from_file(char** pstrjson, uint32_t* ujsonlen, const cha
 		memcpy(*pstrjson, pret, ulen);
 		*ujsonlen = ulen;
 		iret = 0;
-		free(pret);
+		cJSON_free(pret);
 	}
+	cJSON_Delete(root);
+
 	return iret;
 }
 

+ 6 - 5
Other/liblog4rvcother/log4upload.cpp

@@ -1,5 +1,6 @@
 #include "log4upload.h"
 #include "log4rvcother.h"
+#include "SpDefine.h"
 #include <algorithm>
 #include <string>
 #include <cctype>
@@ -193,8 +194,8 @@ bool upload_helper::initialize(const cmb::log_init_config& cfg)
         pinst_log_producer_config_set_send_thread_count(config, 1);
         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");
+        pinst_log_producer_config_set_skyeye_cmptId(config, (char*)SpDefine::cmptId);
+        pinst_log_producer_config_set_skyeye_cmptname(config, (char*)SpDefine::CmptName);
         pinst_log_producer_config_set_skyeye_version(config, (char*)"1.0");
         pinst_log_producer_config_set_persistent(config, 1);
 
@@ -215,11 +216,11 @@ bool upload_helper::initialize(const cmb::log_init_config& cfg)
 #endif
 
         //新加统一日志配置
-        pinst_log_producer_config_set_united_appname(config, (char*)"LR04");
+        pinst_log_producer_config_set_united_appname(config, (char*)SpDefine::cmptId);
         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");
+        pinst_log_producer_config_set_united_deployUnitId(config, (char*)SpDefine::deployUnitId);
+        pinst_log_producer_config_set_united_serviceUnitId(config, (char*)SpDefine::serviceUnitId);
 
         _client = pinst_create_log_producer_client(config, NULL, NULL);
         res = (_client != nullptr);

+ 15 - 1
Other/unix/libmediadeviceinfo/imediadeviceinfo.h

@@ -13,6 +13,13 @@
 #define LIBMEDIADEVICEINFO_API
 #endif // RVC_OS_WIN
 
+#pragma pack(1)
+typedef struct rvc_camera_info_s {
+	char	strdriver[16];
+	char	strcard[32];
+	char	strbus_info[32];
+}rvc_camera_info_t;
+#pragma pack()
 
 /**
  * get video camera devices count, return device count numbers
@@ -50,4 +57,11 @@ extern "C" LIBMEDIADEVICEINFO_API int rvc_videocap_get_device_fullpathname(int d
  * get video device id
  * return -1 if error
  */
-extern "C" LIBMEDIADEVICEINFO_API int rvc_videocap_get_video_device_id(const char* dev_name);
+extern "C" LIBMEDIADEVICEINFO_API int rvc_videocap_get_video_device_id(const char* dev_name);
+
+
+/**
+ * get video camera infos
+ * return -1 if error
+ */
+extern "C" LIBMEDIADEVICEINFO_API int rvc_videocap_get_camera_infos(int device_id, rvc_camera_info_t* tinfo);

+ 64 - 2
Other/unix/libmediadeviceinfo/linux/videodevice_info_linux.cpp

@@ -176,7 +176,7 @@ int  rvc_videocap_get_device_info(int device_id, char* namebuf, int namelen, cha
 		tFmtDesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
 		while ((ioctl(fd, VIDIOC_ENUM_FMT, &tFmtDesc)) == 0) {
-			if (V4L2_PIX_FMT_YUYV == tFmtDesc.pixelformat || V4L2_PIX_FMT_RGB565 == tFmtDesc.pixelformat)
+			if (V4L2_PIX_FMT_YUYV == tFmtDesc.pixelformat || V4L2_PIX_FMT_MJPEG == tFmtDesc.pixelformat)
 			{
 				iPixelFormat = tFmtDesc.pixelformat;
 				break;
@@ -249,7 +249,7 @@ int  rvc_videocap_get_device_fullpathname(int device_id, char* fullnamebuf, int
 		tFmtDesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
 		while ((ioctl(fd, VIDIOC_ENUM_FMT, &tFmtDesc)) == 0) {
-			if (V4L2_PIX_FMT_YUYV == tFmtDesc.pixelformat || V4L2_PIX_FMT_RGB565 == tFmtDesc.pixelformat){
+			if (V4L2_PIX_FMT_YUYV == tFmtDesc.pixelformat || V4L2_PIX_FMT_MJPEG == tFmtDesc.pixelformat){
 				iPixelFormat = tFmtDesc.pixelformat;
 				break;
 			}
@@ -295,5 +295,67 @@ int  rvc_videocap_get_video_device_id(const char* dev_name)
 			}
 		}
 	}
+	return iret;
+}
+
+
+int rvc_videocap_get_camera_infos(int device_id, rvc_camera_info_t* tinfo)
+{
+	int iret = -1;
+	if (NULL == tinfo) {
+		return iret;
+	}
+
+	char device[MAX_PATH] = { 0 };
+	int fd = -1;
+
+	snprintf(device, MAX_PATH, "/dev/video%d", device_id);
+	if (-1 != (fd = open(device, O_RDONLY))) {
+		// query device capabilities
+		struct v4l2_capability cap = { 0 };
+		if (ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0) {
+			close(fd);
+			return iret;
+		}
+
+		if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
+			close(fd);
+			return iret;
+		}
+
+		if (cap.capabilities & V4L2_CAP_STREAMING) {
+
+		}
+
+		if (cap.capabilities & V4L2_CAP_READWRITE) {
+
+		}
+
+		/* 查询支持的格式 */
+		struct v4l2_fmtdesc tFmtDesc = { 0 };
+		int iPixelFormat = 0;
+
+		tFmtDesc.index = 0;
+		tFmtDesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+
+		while ((ioctl(fd, VIDIOC_ENUM_FMT, &tFmtDesc)) == 0) {
+			if (V4L2_PIX_FMT_YUYV == tFmtDesc.pixelformat || V4L2_PIX_FMT_MJPEG == tFmtDesc.pixelformat) {
+				iPixelFormat = tFmtDesc.pixelformat;
+				break;
+			}
+			tFmtDesc.index++;
+		}
+
+		if (0 != iPixelFormat) {
+			if (NULL != cap.bus_info && NULL != cap.card) {
+				memcpy(tinfo->strdriver, cap.driver, 16);
+				memcpy(tinfo->strcard, cap.card, 32);
+				memcpy(tinfo->strbus_info, cap.bus_info, 32);
+				iret = 0;
+			}
+		}
+		close(fd);
+	}
+
 	return iret;
 }

+ 2 - 2
Other/win/libmediadeviceinfo/linux/videodevice_info_linux.cpp

@@ -170,7 +170,7 @@ int  rvc_videocap_get_device_info(int device_id, char* namebuf, int namelen, cha
 		tFmtDesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
 		while ((ioctl(fd, VIDIOC_ENUM_FMT, &tFmtDesc)) == 0) {
-			if (V4L2_PIX_FMT_YUYV == tFmtDesc.pixelformat || V4L2_PIX_FMT_RGB565 == tFmtDesc.pixelformat)
+			if (V4L2_PIX_FMT_YUYV == tFmtDesc.pixelformat || V4L2_PIX_FMT_MJPEG == tFmtDesc.pixelformat)
 			{
 				iPixelFormat = tFmtDesc.pixelformat;
 				break;
@@ -244,7 +244,7 @@ int  rvc_videocap_get_device_fullpathname(int device_id, char* fullnamebuf, int
 		tFmtDesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
 		while ((ioctl(fd, VIDIOC_ENUM_FMT, &tFmtDesc)) == 0) {
-			if (V4L2_PIX_FMT_YUYV == tFmtDesc.pixelformat || V4L2_PIX_FMT_RGB565 == tFmtDesc.pixelformat)
+			if (V4L2_PIX_FMT_YUYV == tFmtDesc.pixelformat || V4L2_PIX_FMT_MJPEG == tFmtDesc.pixelformat)
 			{
 				iPixelFormat = tFmtDesc.pixelformat;
 				break;

+ 44 - 0
Other/win/libvideoframework/videocap.cpp

@@ -2054,7 +2054,51 @@ int videocap_get_device_path(int device_id, WCHAR *buf, int len)
 	return -1;
 }
 
+static HRESULT get_device_instanceid_cb(int index, IMoniker* pMoniker, void* pUserData1, void* pUserData2)
+{
+	if (pMoniker) {
+		int* p_id = (int*)pUserData1;
+		struct _buf* buf = (struct _buf*)pUserData2;
+		HRESULT hr;
+		if (index == *p_id) {
+			IPropertyBag* pPropBag;
+			VARIANT path;
+			hr = pMoniker->BindToStorage(NULL, NULL,
+				IID_IPropertyBag, (void**)&pPropBag);
+			if (FAILED(hr)) {
+				buf->len = -1; /* failed */
+				return hr;
+			}
+			VariantInit(&path);
+			path.vt = VT_BSTR;
+			hr = pPropBag->Read(L"InstanceId", &path, NULL);
+			if (FAILED(hr)) {
+				pPropBag->Release();
+				VariantClear(&path);
+				buf->len = -1;
+				return hr;
+			}
+			buf->len = SysStringByteLen(path.bstrVal) + 2;
+			if (buf)
+				memcpy(buf->buf, path.bstrVal, buf->len);
+			pPropBag->Release();
+			VariantClear(&path);
+			return S_OK;
+		}
+	}
+	return S_FALSE;
+}
 
+int videocap_get_device_instanceid(int device_id, WCHAR* buf, int len)
+{
+	struct _buf x = { buf, len };
+	int dev_id = device_id;
+	HRESULT hr = WalkFilterCategory(CLSID_VideoInputDeviceCategory,
+		&get_device_instanceid_cb, &dev_id, &x);
+	if (hr == S_OK)
+		return x.len;
+	return -1;
+}
 
 static int is_support(int min, int max, int granularity, int x)
 {

+ 6 - 0
Other/win/libvideoframework/videocap.h

@@ -177,6 +177,12 @@ int videocap_get_device_name(int device_id, WCHAR *buf, int len);
  */
 int videocap_get_device_path(int device_id, WCHAR *buf, int len);
 
+/**
+ * get video device instanceid string, buf length should not be larger than 255,
+ * return -1 on error, if buf == null, len is ignored, return value is the required buffer size
+ */
+int videocap_get_device_instanceid(int device_id, WCHAR* buf, int len);
+
 /**
  * return 0 success, other value failed
  */