Browse Source

#IQRV #comment 合并v0.1.8版本

gifur 3 years ago
parent
commit
b70a7e0556

+ 1 - 1
CMakeLists.txt

@@ -86,7 +86,7 @@ else()
 endif($ENV{PIPELINE_BUILD_ID})
 
 #Set the project version
-set(RAW_VERSION_STRING "0.1.7-dev1")
+set(RAW_VERSION_STRING "0.1.8-dev1")
 string(STRIP ${RAW_VERSION_STRING} RAW_VERSION_STRING)
 
 set(VERSION_REGEX "^.?([0-9]+)\\.([0-9]+)\\.([0-9]+)-?(.*)")

+ 11 - 0
ChangeLog.in

@@ -2,6 +2,17 @@
 
 *Last Built Day: @BUILD_DATE_STRING@*
 
+## V0.1.8
+
+* 网络探测终端功能上线 (陈纪林)
+* 健康实体添加对连线实体重启事件的订阅(陈礼鹏)
+* SIP连线收发包告警(陈礼鹏)
+* 去除长城硬件厂商适配器相关内容(廖桂发)
+* 移除OSD程序文件以屏蔽桌面唤起的通知中心(廖桂发)
+* 添加非接读卡异常的告警
+* 解决座席端发送内容到终端乱码问题(廖桂发)
+* UOS浏览器启动添加额外参数,以去除各项Bubble提示(廖桂发)
+
 ## V0.1.7
 
 * 全部更换为使用UOS自带浏览器打开业务页和广告页(廖桂发)

+ 27 - 0
Module/mod_DeviceControl/mod_DeviceControl.cpp

@@ -12,6 +12,7 @@
 #include "array.h"
 #include "fileutil.h"
 #include <vector>
+#include <sys/utsname.h>
 
 #include "RestfulFunc.h"
 #include "DeviceAdaptChecker.h"
@@ -82,11 +83,33 @@ void CDeviceControlEntity::QueryHardwareInfo(SpReqAnsContext<DeviceControlServic
 {
     CSystemStaticInfo info;
     GetFunction()->GetSystemStaticInfo(info);
+    CSimpleStringA deviceFct("");
 
     NetworkAddressesList macAddrs;
     NetworkAddressesList ipAddrs;
     SP::Module::Net::GetINETMacAddresses(macAddrs, ipAddrs);
 
+
+    //根据设备类型获取厂商信息
+    if (info.strMachineType == "RVC.PAD")
+    {
+        Dbg("This is PAD device.");
+        //国产化目前没有pad设备,后续按需修改
+
+    }
+    else
+    {
+        CSmartPointer<IConfigInfo> spConfig;
+        GetFunction()->OpenConfig(Config_Root, spConfig);
+        spConfig->ReadConfigValue("Device.PinPad", "Vendor", deviceFct);
+    }
+
+    //获取操作系统版本信息
+    utsname sysInfo;
+    uname(&sysInfo);
+    CSimpleStringA sysVer("UOS ");
+    sysVer.Append(sysInfo.release);
+
     if (ctx != NULL) {
         ctx->Ans.ip = ipAddrs;
         ctx->Ans.mac = macAddrs;
@@ -95,6 +118,10 @@ void CDeviceControlEntity::QueryHardwareInfo(SpReqAnsContext<DeviceControlServic
         ctx->Ans.terminalNo = info.strTerminalID;
         ctx->Ans.termLimit = __ReadCenterConfigStr("TermLimitSwitch", "IEBrowser").second;
         ctx->Ans.termVersion = info.InstallVersion.ToString();
+
+        ctx->Ans.reserved3 = sysVer;
+        ctx->Ans.reserved4 = deviceFct;
+
         ctx->Answer(Error_Succeed);
     }
 }

+ 8 - 3
Module/mod_ResourceWatcher/CMakeLists.txt

@@ -12,6 +12,7 @@ set(${MODULE_PREFIX}_SRCS
     ResourceWatcher_def_g.h
     ResourceWatcher_msg_g.h
     ResourceWatcher_server_g.h
+    ${OTHER_LIB_BASE_DIR}/libRestfulFunc/RestfulFunc.h
 
     EventLog.cpp
     EventLogW.cpp
@@ -29,6 +30,7 @@ set(${MODULE_PREFIX}_SRCS
     ResourceWatcher_def_g.h
     ResourceWatcher_msg_g.h
     ResourceWatcher_server_g.h
+    ${OTHER_LIB_BASE_DIR}/libRestfulFunc/RestfulFunc.h
 
     mod_ResourceWatcher.cpp
     ResourceWatcherFSM.cpp
@@ -36,23 +38,26 @@ set(${MODULE_PREFIX}_SRCS
 
 endif(MSVC)
 
-set(MOD_VERSION_STRING "1.0.0-dev1")
+set(MOD_VERSION_STRING "1.0.1-dev1")
 add_module_libraries(${MODULE_PREFIX} ${MODULE_NAME} ${MOD_VERSION_STRING})
 
 if(MSVC)
     set(${MODULE_PREFIX}_LIBS ${${MODULE_PREFIX}_LIBS} ws2_32 mbnapi_uuid pdh)
 else()
     target_link_directories(${MODULE_NAME} PRIVATE ${CONAN_LIB_DIRS_SOGOULIB})
-    set(${MODULE_PREFIX}_LIBS ${MODULE_BASE_LIBS} libpublicFun ${CONAN_LIBS_SOGOULIB})
+    set(${MODULE_PREFIX}_LIBS ${MODULE_BASE_LIBS} libpublicFun RestfulFunc ${CONAN_LIBS_SOGOULIB})
 endif(MSVC)
 
-target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS})  
+target_link_libraries(${MODULE_NAME} PRIVATE 
+    ${${MODULE_PREFIX}_LIBS} 
+)  
 
 target_include_directories(${MODULE_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
     ${MODULE_BASE_DIR}/mod_cardswiper
     ${DevHeadPath}
     ${OTHER_LIB_BASE_DIR}/libpublicFun
     ${CONAN_INCLUDE_DIRS_SOGOULIB}
+    ${OTHER_LIB_BASE_DIR}/libRestfulFunc
 )
 
 deploy_module(${MODULE_PREFIX} ${MODULE_NAME})

+ 119 - 61
Module/mod_ResourceWatcher/ResourceWatcher.xml

@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="gb2312" ?>
+锘�<?xml version="1.0" encoding="utf-8" ?>
 <entity name="ResourceWatcher">
 	<class name="ResourceWatcherService" overlap="true" exclusive="false">			
 		<twoway name="Fetch" overlap="true">
@@ -38,66 +38,66 @@
 		
 			<twoway  name="OperateFile" overlap="true">
 			<req>
-				<!--当前操作的磁盘或目录或文件的的完整路径
-						磁盘如:C:
-						目录如:C:\RUN\version
-						文件如:C:\Run\version\active.txt
-						注:为空将会返回当前操作终端系统存有的磁盘/卷信息
+				<!--褰撳墠鎿嶄綔鐨勭�鐩樻垨鐩�綍鎴栨枃浠剁殑鐨勫畬鏁磋矾寰�
+						纾佺洏濡傦細C:
+						鐩�綍濡傦細C:\RUN\version
+						鏂囦欢濡傦細C:\Run\version\active.txt
+						娉�細涓虹┖灏嗕細杩斿洖褰撳墠鎿嶄綔缁堢�绯荤粺瀛樻湁鐨勭�鐩�/鍗蜂俊鎭�
 				 -->
 				<param name="current" type="string"/>
-				<!--操作方式:
-						0:展开信息,如果 current 是卷或目录的,返回当前卷或目录首层的文件列表信息;该操作对文件无作为;
-						1:打开/执行,使用默认程序执行该文件,打开方式取决于文件类型和终端设备,通常为可执行程序或脚本文件;此时 attachment1 保存输入参数的长度,attachment2输入参数的内容,该操作对卷和目录无作为;
-						2:文件删除操作(直接删除),如果current 指向的是目录,则删除整个目录(忽略该目录下是否有文件),该操作对卷无作为;做二次确认?
-						3:清空磁盘或目录下的所有文件和子目录,保留当前空的文件夹,或者清空文件的内容
-						4:新增目录或文件,所在磁盘存在的情况下忽略目标目录或文件的上层目录是否存在,attribute字段指定文件类型,如果是文件,content字段保存文件内容的字节流(可选)
-						5:追加文件内容,前提是目标文件存在,content字段保存追加的文件字节流(必需),该操作对卷和目录无作为;
-						6:重命名,前提是目标目录或文件存在,修改目标目录或文件的名称,content字节保存新文件名(文件名需符合系统命名规范),该操作对卷无作为;
+				<!--鎿嶄綔鏂瑰紡锛�
+						0锛氬睍寮€淇℃伅锛屽�鏋� current 鏄�嵎鎴栫洰褰曠殑锛岃繑鍥炲綋鍓嶅嵎鎴栫洰褰曢�灞傜殑鏂囦欢鍒楄〃淇℃伅锛涜�鎿嶄綔瀵规枃浠舵棤浣滀负锛�
+						1锛氭墦寮€/鎵ц�锛屼娇鐢ㄩ粯璁ょ▼搴忔墽琛岃�鏂囦欢锛屾墦寮€鏂瑰紡鍙栧喅浜庢枃浠剁被鍨嬪拰缁堢�璁惧�锛岄€氬父涓哄彲鎵ц�绋嬪簭鎴栬剼鏈�枃浠讹紱姝ゆ椂 attachment1 淇濆瓨杈撳叆鍙傛暟鐨勯暱搴︼紝attachment2杈撳叆鍙傛暟鐨勫唴瀹癸紝璇ユ搷浣滃�鍗峰拰鐩�綍鏃犱綔涓猴紱
+						2锛氭枃浠跺垹闄ゆ搷浣滐紙鐩存帴鍒犻櫎锛夛紝濡傛灉current 鎸囧悜鐨勬槸鐩�綍锛屽垯鍒犻櫎鏁翠釜鐩�綍锛堝拷鐣ヨ�鐩�綍涓嬫槸鍚︽湁鏂囦欢锛夛紝璇ユ搷浣滃�鍗锋棤浣滀负锛涘仛浜屾�纭��锛�
+						3锛氭竻绌虹�鐩樻垨鐩�綍涓嬬殑鎵€鏈夋枃浠跺拰瀛愮洰褰曪紝淇濈暀褰撳墠绌虹殑鏂囦欢澶癸紝鎴栬€呮竻绌烘枃浠剁殑鍐呭�
+						4锛氭柊澧炵洰褰曟垨鏂囦欢锛屾墍鍦ㄧ�鐩樺瓨鍦ㄧ殑鎯呭喌涓嬪拷鐣ョ洰鏍囩洰褰曟垨鏂囦欢鐨勪笂灞傜洰褰曟槸鍚﹀瓨鍦�紝attribute瀛楁�鎸囧畾鏂囦欢绫诲瀷锛屽�鏋滄槸鏂囦欢锛宑ontent瀛楁�淇濆瓨鏂囦欢鍐呭�鐨勫瓧鑺傛祦锛堝彲閫夛級
+						5锛氳拷鍔犳枃浠跺唴瀹癸紝鍓嶆彁鏄�洰鏍囨枃浠跺瓨鍦�紝content瀛楁�淇濆瓨杩藉姞鐨勬枃浠跺瓧鑺傛祦锛堝繀闇€锛夛紝璇ユ搷浣滃�鍗峰拰鐩�綍鏃犱綔涓猴紱
+						6锛氶噸鍛藉悕锛屽墠鎻愭槸鐩�爣鐩�綍鎴栨枃浠跺瓨鍦�紝淇�敼鐩�爣鐩�綍鎴栨枃浠剁殑鍚嶇О锛宑ontent瀛楄妭淇濆瓨鏂版枃浠跺悕锛堟枃浠跺悕闇€绗﹀悎绯荤粺鍛藉悕瑙勮寖锛夛紝璇ユ搷浣滃�鍗锋棤浣滀负锛�
 				 -->
 				<param name="mode" type="int" />
-				<!-- 相关属性: 
-						当 mode = 0 时:1  表示要求文件列表中需得到子目录的占用空间大小(可能耗时较长);
-						当 mode = 4 时:16 表示新建的文件类型为目录,0 表示新建的文件类型为文件,类型由名称决定;
-						当 mode = 6 时:1  表示如要修改的是文件,则用新文件名整体覆盖旧文件名(包括后缀名),0表示保留后缀名情况下进行重命名
+				<!-- 鐩稿叧灞炴€э細 
+						褰� mode = 0 鏃讹細1  琛ㄧず瑕佹眰鏂囦欢鍒楄〃涓�渶寰楀埌瀛愮洰褰曠殑鍗犵敤绌洪棿澶у皬锛堝彲鑳借€楁椂杈冮暱锛夛紱
+						褰� mode = 4 鏃讹細16 琛ㄧず鏂板缓鐨勬枃浠剁被鍨嬩负鐩�綍锛�0 琛ㄧず鏂板缓鐨勬枃浠剁被鍨嬩负鏂囦欢锛岀被鍨嬬敱鍚嶇О鍐冲畾锛�
+						褰� mode = 6 鏃讹細1  琛ㄧず濡傝�淇�敼鐨勬槸鏂囦欢锛屽垯鐢ㄦ柊鏂囦欢鍚嶆暣浣撹�鐩栨棫鏂囦欢鍚嶏紙鍖呮嫭鍚庣紑鍚嶏級锛�0琛ㄧず淇濈暀鍚庣紑鍚嶆儏鍐典笅杩涜�閲嶅懡鍚�
 				-->
 				<param name="attribute" type="int" />
-				<!-- 新建文件的内容和已存文件追加,或重命名操作的新文件名称 -->
+				<!-- 鏂板缓鏂囦欢鐨勫唴瀹瑰拰宸插瓨鏂囦欢杩藉姞锛屾垨閲嶅懡鍚嶆搷浣滅殑鏂版枃浠跺悕绉� -->
 				<param name="content" type="string" />
-				<!-- 过滤属性:
-				   当 mode = 0 时:0x00000002 不返回隐藏文件;0x00000004 不返回系统文件;0x00004000 不返回加密文件;
+				<!-- 杩囨护灞炴€э細
+				   褰� mode = 0 鏃讹細0x00000002 涓嶈繑鍥為殣钘忔枃浠讹紱0x00000004 涓嶈繑鍥炵郴缁熸枃浠讹紱0x00004000 涓嶈繑鍥炲姞瀵嗘枃浠讹紱
 				-->
 				<param name="filter1" type="int" />
 				<param name="filter2" type="string" />
-				<!-- 附加信息:保留 -->
+				<!-- 闄勫姞淇℃伅锛氫繚鐣� -->
 				<param name="attachment1" type="int" />
 				<param name="attachment2" type="string" />
 				<param name="reserved1" type="array_int"/>
      		<param name="reserved2" type="array_string"/>
 			</req>
 			<res>
-				<!--对应操作的结果:
-						-1: 操作无效
-						-2:  操作失败 attachment2 字段存储错误信息
-						>0:  操作成功
+				<!--瀵瑰簲鎿嶄綔鐨勭粨鏋滐細
+						-1锛� 鎿嶄綔鏃犳晥
+						-2:  鎿嶄綔澶辫触 attachment2 瀛楁�瀛樺偍閿欒�淇℃伅
+						>0:  鎿嶄綔鎴愬姛
 						
 				 -->
 				<param name="result" type="int" />
 			
-				<!-- 当前卷/目录/文件的完整路径 
-					当 mode = 0 时,header 与 传递过来的 current 是一致的;
-					当 mode = 6 时,header 为 重命名后的目录或文件的完整路径
+				<!-- 褰撳墠鍗�/鐩�綍/鏂囦欢鐨勫畬鏁磋矾寰� 
+					褰� mode = 0 鏃讹紝header 涓� 浼犻€掕繃鏉ョ殑 current 鏄�竴鑷寸殑锛�
+					褰� mode = 6 鏃讹紝header 涓� 閲嶅懡鍚嶅悗鐨勭洰褰曟垨鏂囦欢鐨勫畬鏁磋矾寰�
 				-->
 				<param name="header" type="string" />
-				<!-- 附加信息:保留 -->
+				<!-- 闄勫姞淇℃伅锛氫繚鐣� -->
 				<param name="attachment1" type="int" />
 				<param name="attachment2" type="string" />
-				<!--以下为当前目录和旗下子目录和文件列表的信息:
-					  当 mode = 2 不存储相关文件列表内容
-				    当 mode = 2 存储与删除目录/文件 同级目录的文件列表,以便查实是否成功删除;
-				    当 mode = 3 返回当前已清空的磁盘或目录下的文件列表,或文件所在目录的文件列表,以便根据内容或文件大小查实是否成功清除;
-				    当 mode = 4 返回当前新增目录或文件所在目录的文件列表,以便查实是否成功新建;
-				    当 mode = 5 返回当前追加文件内容的文件所在目录的文件列表,以便根据文件大小查实是否成功追加文件内容;
-				    当 mode = 6 返回当前重命名目录或文件所在目录的文件列表,以便查实是否成功重命名;
+				<!--浠ヤ笅涓哄綋鍓嶇洰褰曞拰鏃椾笅瀛愮洰褰曞拰鏂囦欢鍒楄〃鐨勪俊鎭�細
+					  褰� mode = 2 涓嶅瓨鍌ㄧ浉鍏虫枃浠跺垪琛ㄥ唴瀹�
+				    褰� mode = 2 瀛樺偍涓庡垹闄ょ洰褰�/鏂囦欢 鍚岀骇鐩�綍鐨勬枃浠跺垪琛�紝浠ヤ究鏌ュ疄鏄�惁鎴愬姛鍒犻櫎锛�
+				    褰� mode = 3 杩斿洖褰撳墠宸叉竻绌虹殑纾佺洏鎴栫洰褰曚笅鐨勬枃浠跺垪琛�紝鎴栨枃浠舵墍鍦ㄧ洰褰曠殑鏂囦欢鍒楄〃锛屼互渚挎牴鎹�唴瀹规垨鏂囦欢澶у皬鏌ュ疄鏄�惁鎴愬姛娓呴櫎锛�
+				    褰� mode = 4 杩斿洖褰撳墠鏂板�鐩�綍鎴栨枃浠舵墍鍦ㄧ洰褰曠殑鏂囦欢鍒楄〃锛屼互渚挎煡瀹炴槸鍚︽垚鍔熸柊寤猴紱
+				    褰� mode = 5 杩斿洖褰撳墠杩藉姞鏂囦欢鍐呭�鐨勬枃浠舵墍鍦ㄧ洰褰曠殑鏂囦欢鍒楄〃锛屼互渚挎牴鎹�枃浠跺ぇ灏忔煡瀹炴槸鍚︽垚鍔熻拷鍔犳枃浠跺唴瀹癸紱
+				    褰� mode = 6 杩斿洖褰撳墠閲嶅懡鍚嶇洰褰曟垨鏂囦欢鎵€鍦ㄧ洰褰曠殑鏂囦欢鍒楄〃锛屼互渚挎煡瀹炴槸鍚︽垚鍔熼噸鍛藉悕锛�
 				 -->
 				<param name="fileSize" type="uint64" />
 				<param name="ftCreate" type="uint64" />
@@ -105,26 +105,26 @@
 				<param name="ftAccess" type="uint64" />
 				<param name="fileAttribute" type="uint" />
 				<param name="forbidAttribute" type="uint" />
-				<!-- 保留字段 -->
+				<!-- 淇濈暀瀛楁� -->
 				<param name="reversed1" type="int" />
 				<param name="reversed2" type="string" />
-				 <!-- 首层子目录和子文件的数目 -->
+				 <!-- 棣栧眰瀛愮洰褰曞拰瀛愭枃浠剁殑鏁扮洰 -->
 				<param name="count" type="int" />
-				<!-- 目录或文件的名称 -->
+				<!-- 鐩�綍鎴栨枃浠剁殑鍚嶇О -->
 				<param name="fileNames" type="array_string" />
-				<!-- 目录或文件的字节大小,目录非必需,默认为0 -->
+				<!-- 鐩�綍鎴栨枃浠剁殑瀛楄妭澶у皬锛岀洰褰曢潪蹇呴渶锛岄粯璁や负0 -->
 				<param name="fileSizes" type="array_uint64" />
-				<!-- 目录或文件的创建时间,默认为0-->
+				<!-- 鐩�綍鎴栨枃浠剁殑鍒涘缓鏃堕棿锛岄粯璁や负0-->
 				<param name="ftCreates" type="array_uint64" />
-				<!-- 目录或文件的修改时间,默认为0 -->
+				<!-- 鐩�綍鎴栨枃浠剁殑淇�敼鏃堕棿锛岄粯璁や负0 -->
 				<param name="ftModifieds" type="array_uint64" />
-				<!-- 目录或文件的访问时间,默认为0 -->
+				<!-- 鐩�綍鎴栨枃浠剁殑璁块棶鏃堕棿锛岄粯璁や负0 -->
 				<param name="ftAccesses" type="array_uint64" />
-				<!-- 目录或文件的属性,按照系统的约定赋值 -->
+				<!-- 鐩�綍鎴栨枃浠剁殑灞炴€э紝鎸夌収绯荤粺鐨勭害瀹氳祴鍊� -->
 				<param name="fileAttributes" type="array_uint" />
-				<!-- 存储目录或文件的操作权限 -->
+				<!-- 瀛樺偍鐩�綍鎴栨枃浠剁殑鎿嶄綔鏉冮檺 -->
 				<param name="forbidAttributes" type="array_uint" />
-				<!-- 保留字段 -->
+				<!-- 淇濈暀瀛楁� -->
 				<param name="reserved1" type="array_int"/>
      		<param name="reserved2" type="array_string"/>
 				
@@ -134,29 +134,29 @@
 		
 		<twoway  name="ExtractEventLog" overlap="true">
 			<req>
-				<!-- 0x0000:不筛选,0x0001:应用程序,0x0002:安全,0x0004:Setup,0x0008:系统,0x0100:自定义,0x00FF:全部类型(不包括自定义)-->
+				<!-- 0x0000:涓嶇瓫閫夛紝0x0001:搴旂敤绋嬪簭锛�0x0002:瀹夊叏锛�0x0004:Setup锛�0x0008:绯荤粺锛�0x0100:鑷�畾涔夛紝0x00FF:鍏ㄩ儴绫诲瀷锛堜笉鍖呮嫭鑷�畾涔夛級-->
 				<param name="evtName" type="ushort" />
-				<!-- 0x0000:不筛选,0x0001:错误,0x0002:警告,0x0004:信息,0x0008:审计成功,0x0010:审计失败,0x00FF:全部类型 -->
+				<!-- 0x0000:涓嶇瓫閫夛紝0x0001:閿欒�锛�0x0002:璀﹀憡锛�0x0004:淇℃伅锛�0x0008锛氬�璁℃垚鍔燂紝0x0010:瀹¤�澶辫触锛�0x00FF:鍏ㄩ儴绫诲瀷 -->
 				<param name="evtLevel" type="ushort" />
-				<!-- 0x0000:任何时间,0x0001: 近1小时,0x0002:近12小时,0x0003:近1天,0x0004:近7天,0x0005:近30天,0x000F:自定义-->
+				<!-- 0x0000:浠讳綍鏃堕棿锛�0x0001: 杩�1灏忔椂锛�0x0002:杩�12灏忔椂锛�0x0003:杩�1澶╋紝0x0004:杩�7澶╋紝0x0005:杩�30澶╋紝0x000F:鑷�畾涔�-->
 				<param name="duration" type="ushort" />
-				<!-- 当 duration == 0x000F 时有效,如下两项有效,startTime存储筛选的开始时间,endTime存储筛选的结束时间,具体到秒,需满足endTime >= startTime -->
+				<!-- 褰� duration == 0x000F 鏃舵湁鏁堬紝濡備笅涓ら」鏈夋晥锛宻tartTime瀛樺偍绛涢€夌殑寮€濮嬫椂闂达紝endTime瀛樺偍绛涢€夌殑缁撴潫鏃堕棿锛屽叿浣撳埌绉掞紝闇€婊¤冻endTime >= startTime -->
 				<param name="startTime" type="uint64" />
 				<param name="endTime" type="uint64" />
-				<!-- 当 evtName == 0x0100 时有效,保留先 -->
+				<!-- 褰� evtName == 0x0100 鏃舵湁鏁堬紝淇濈暀鍏� -->
 				<param name="cusEvtFileName" type="string" />
-				<!-- 存储事件日志来源,一般应用程序名称,比较常用的应该是“Application Error”,不指定请置为NULL或“”-->
+				<!-- 瀛樺偍浜嬩欢鏃ュ織鏉ユ簮锛屼竴鑸�簲鐢ㄧ▼搴忓悕绉帮紝姣旇緝甯哥敤鐨勫簲璇ユ槸鈥淎pplication Error鈥濓紝涓嶆寚瀹氳�缃�负NULL鎴栤€溾€�-->
 				<param name="evtSrcEventName" type="string" />
-				<!-- 保留字段 -->
+				<!-- 淇濈暀瀛楁� -->
 				<param name="reversed1" type="int" />
 				<param name="reversed2" type="string" />
 			</req>
 			<res>
-				<!-- 提取的事件日志条数 0 表示失败或无符合筛选要求的事件日志-->
+				<!-- 鎻愬彇鐨勪簨浠舵棩蹇楁潯鏁� 0 琛ㄧず澶辫触鎴栨棤绗﹀悎绛涢€夎�姹傜殑浜嬩欢鏃ュ織-->
 				<param name="entries" type="uint" />
-				<!-- 当 entries == 0 时有效,存储具体原因:如“参数错误”、“筛选后结果为零”等 -->
+				<!-- 褰� entries == 0 鏃舵湁鏁堬紝瀛樺偍鍏蜂綋鍘熷洜锛氬�鈥滃弬鏁伴敊璇�€濄€佲€滅瓫閫夊悗缁撴灉涓洪浂鈥濈瓑 -->
 				<param name="information" type="string" />
-				<!-- 储存事件日志的文件名称,entiries 为 0 时无效 -->
+				<!-- 鍌ㄥ瓨浜嬩欢鏃ュ織鐨勬枃浠跺悕绉帮紝entiries 涓� 0 鏃舵棤鏁� -->
 				<param name="evtLogFileName" type="string" />
 			</res>
 		</twoway>
@@ -188,11 +188,11 @@
     </twoway>
     <twoway  name="GetThirdPartyInstallState" overlap="true">
       <req>
-        <!---1: 搜狗输入法-->
+        <!---1: 鎼滅嫍杈撳叆娉�-->
         <param name="mode" type="int" />
       </req>
       <res>
-        <!--1:已安装-->
+        <!--1:宸插畨瑁�-->
         <param name="status" type="int" />
         <param name="version" type="string"/>
         <param name="path" type="string"/>
@@ -204,7 +204,7 @@
     </twoway>
     <twoway  name="InstallThirdPartyProgram" overlap="true">
       <req>
-        <!---1: 搜狗输入法-->
+        <!---1: 鎼滅嫍杈撳叆娉�-->
         <param name="type" type="int" />
       </req>
       <res>
@@ -215,8 +215,66 @@
         <param name="reserverd2" type="string"/>
       </res>
     </twoway>
+		
+		<!--缃戠粶杩炴帴绫诲瀷妫€娴�-->
+		<twoway name="CheckNetType" overlap="true">
+			<req>
+			</req>
+			<res>
+				<!--0锛氭湭鐭ワ紝1锛氱綉缁滄棤杩炴帴锛�2锛氭湁绾匡紝3锛氭棤绾匡紝4锛氱Щ鍔ㄧ綉缁� ...-->
+				<param name="netType" type="int"/>
+				<param name="strParam" type="string"/>
+				<param name="intParam" type="int"/>
+			</res>
+		</twoway>
+
+		<!--涓氬姟绔欑偣淇℃伅鏌ヨ�-->
+		<twoway name="GetBizLinks" overlap="true">
+			<req>
+				<!--澶囩敤杩囨护鍙傛暟锛岀洰鍓嶅彧鏀�寔浼犲叆0锛岃〃绀轰笉杩囨护锛岃繑鍥炴墍鏈変笟鍔$珯鐐广€傚悗缁��鏈夊叾浠栬繃婊ら渶姹傚彲閫氳繃姝ゅ弬鏁拌繘琛岄€夋嫨-->
+				<param name="filter" type="int"/>
+			</req>
+			<res>
+				<param name="bizLinks" type="array_string"/>
+				<param name="bizNames" type="array_string"/>
+				<param name="params1" type="array_string"/>
+			</res>
+		</twoway>
+
+		<!--涓氬姟绔欑偣妫€娴�-->
+		<twoway name="BizLinkDetect" overlap="true">
+			<req>
+				<!--鎵╁睍浣跨敤锛岄�鐣欓€氳繃鍙傛暟璁剧疆妫€娴嬫柟寮忥細0.ping銆� 1.http... 锛岀洰鍓嶄紶0鍗冲彲-->
+				<param name="protocol" type="int"/>
+				<param name="bizLink" type="string"/>
+				<!--鍚庣画鎵╁睍浣跨敤-->
+				<param name="attachment1" type="string"/>
+				<!--鍚庣画鎵╁睍浣跨敤-->
+				<param name="attachment2" type="string"/>
+			</req>
+			<res>
+				<param name="bizLinkStatus" type="bool"/>
+				<!--鍦╞izLinkStatus涓� true鐨勬儏鍐典笅锛岃�鍊兼柟鏈夋晥锛岃繑鍥濸ING鍚庣殑寤惰繜鏃堕棿锛屽崟浣嶄负姣�� -->
+				<param name="bizLinkDelayMS" type="uint"/>
+				<!--鍚庣画鎵╁睍浣跨敤-->
+				<param name="strParam" type="string"/>
+				<!--鍚庣画鎵╁睍浣跨敤-->
+				<param name="intParam" type="int"/>
+			</res>
+		</twoway>
 	</class>
+	
 	<message name="QueryCardSwiper">
 			<param name="status" type = "int" />	
-	</message>	
+	</message>
+
+	聽<!--鎺㈡祴涓荤珯鐐�-->
+	<message name="MainLinkDetect">
+		<!--0锛氫笉閫氾紝1锛氱綉缁滆繛閫氾紝鍏朵粬鍊肩敤浜庡悗缁��鐢�-->
+		<param name="mainLinkStatus" type="int"/>
+		<!--棰勭暀鍙傛暟-->
+		<param name="reversed1" type="int"/>
+		<!--棰勭暀鍙傛暟-->
+		<param name="reversed2" type="string"/>
+	</message>
 </entity>

+ 244 - 1
Module/mod_ResourceWatcher/ResourceWatcherFSM.cpp

@@ -25,11 +25,16 @@
 #include "CommEntityUtil.hpp"
 #include "SpUtility.h"
 
+//#include "NetworkProbe.h"
+#include "RestfulFunc.h"
 
 //硬件信息搜集参数  
 const int MAX_HARDWARE_CHECK_TIME = 5000;
 const int TIMER_HARDWARE_CHECK = 2;
 
+const int MAX_MAINLINK_CHECK_TIME = 5000;
+const int TIMER_MAINLINK_CHECK = 3;
+
 const int DEFAULT_DAY_OF_BACKWARD = 90;
 const int MAX_DAY_OF_BACKWARD = 365;
 const char* DEFAULT_DELETE_FILE_SUFFIX = "*";
@@ -508,7 +513,12 @@ ErrorCodeEnum ResourceWatcherFSM::OnInit()
         void* pTmpData = NULL;
         ITimerListener* pListener = new TimerOutHelper<ResourceWatcherFSM>(this, &ResourceWatcherFSM::HardwareInfoTimer, pTmpData);
         GetEntityBase()->GetFunction()->SetTimer(TIMER_HARDWARE_CHECK, pListener, MAX_HARDWARE_CHECK_TIME);
-        Dbg("Set Timer!");
+        Dbg("Set Hardware Timer!");
+
+        /*void* pTmpData2 = NULL;
+        ITimerListener* pListener2 = new TimerOutHelper<ResourceWatcherFSM>(this, &ResourceWatcherFSM::MainLinkDetectTimer, pTmpData2);
+        GetEntityBase()->GetFunction()->SetTimer(TIMER_MAINLINK_CHECK, pListener2, MAX_MAINLINK_CHECK_TIME);
+        Dbg("Set MainLinkDetect Timer!");*/
     }
 
     return Error_Succeed;
@@ -1039,6 +1049,7 @@ ErrorCodeEnum ResourceWatcherFSM::GetCpuType(
 #endif //RVC_OS_WIN
 }
 
+
 BOOL ResourceWatcherFSM::RemoveDuplicateCenterSettingFiles()
 {
     LOG_FUNCTION();
@@ -4103,10 +4114,242 @@ void ResourceWatcherFSM::HardwareInfoTimer(void* pData)
     GetSystemMemoryStatus();
     GetSystemDiskStatus();
     GetOperationDiskStatus();
+    GetMainLinkStatus();
 
     GetEntityBase()->GetFunction()->ResetTimer(TIMER_HARDWARE_CHECK, MAX_HARDWARE_CHECK_TIME * 2);
 }
 
+
+void ResourceWatcherFSM::LinkDetect(int detectType, const char* url, bool &status, uint &delay)
+{
+
+    timeval begin, end;
+    uint tInterval = 0;
+    bool flag = false;
+
+    string tUrl = url;
+    string host = "http://";
+
+    if (tUrl.find("http") == string::npos)
+    {
+        tUrl = host + tUrl;
+    }
+    char tmpUrl[1024] = { 0 };
+    strcpy(tmpUrl, tUrl.c_str());
+
+    Dbg("Check url:[%s].", url);
+
+    gettimeofday(&begin, NULL);
+    //bool flag = http_probe(tmpUrl, 5000, 0);
+    string msg;
+    int curFlag = HttpProbe(tmpUrl, msg, 5);
+    gettimeofday(&end, NULL);
+    tInterval = (end.tv_sec - begin.tv_sec) * 1000 + (end.tv_usec - begin.tv_usec) / 1000;
+
+    if (curFlag > 0 && curFlag < 400)
+    {
+        Dbg("HTTP SUCCESS!, http code = %d, error msg = %s.", curFlag, msg.c_str());
+        status = true;
+    }
+    else
+    {
+        Dbg("HTTP FAILED!, http code = %d, error msg = %s.", curFlag, msg.c_str());
+        status = false;
+    }
+
+    delay = tInterval;
+}
+
+ErrorCodeEnum ResourceWatcherFSM::BizLinkDetect(
+    SpReqAnsContext<ResourceWatcherService_BizLinkDetect_Req, ResourceWatcherService_BizLinkDetect_Ans>::Pointer ctx)
+{
+    LOG_FUNCTION();
+    ErrorCodeEnum ec = Error_Succeed;
+
+    int detectType = ctx->Req.protocol;
+    CSimpleStringA url = ctx->Req.bizLink;
+    bool linkStatus = false;
+    uint delay = 0;
+
+    LinkDetect(detectType, url.GetData(), linkStatus, delay);
+
+    ctx->Ans.bizLinkStatus = linkStatus;
+    ctx->Ans.bizLinkDelayMS = delay;
+    ctx->Ans.intParam = 0;
+
+    if (ctx != NULL) {
+        ctx->Answer(ec);
+    }
+    return ec;
+
+}
+
+ErrorCodeEnum ResourceWatcherFSM::CheckNetType(
+    SpReqAnsContext<ResourceWatcherService_CheckNetType_Req, ResourceWatcherService_CheckNetType_Ans>::Pointer ctx)
+{
+    LOG_FUNCTION();
+    ErrorCodeEnum ec = Error_Succeed;
+    int netType = 0; //默认未知
+
+    CSimpleStringA tmpVendor(""), tmpDevSN(""), tmpDLLVersion("");
+    GetEntityBase()->GetFunction()->GetSysVar("FWBVendor", tmpVendor);
+    GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpDevSN);
+    GetEntityBase()->GetFunction()->GetSysVar("FWBVersion", tmpDLLVersion);
+
+
+    if (tmpDLLVersion.GetLength() < 2)
+        tmpDLLVersion = "8.1";
+    if (tmpDevSN.GetLength() > 12 && tmpDevSN.IndexOf("FWB") > 2)
+    {
+        Dbg("This is fwb device.");
+    }
+    else
+    {
+        int i = 0;
+        int sockfd;
+        struct ifconf ifconf;
+        struct ifreq* ifreq;
+        char buf[1024];
+
+        //初始化ifconf
+        ifconf.ifc_len = 1024;
+        ifconf.ifc_buf = buf;
+
+        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+        {
+            perror("socket error");
+            exit(1);
+        }
+
+        //获取所有接口信息
+        ioctl(sockfd, SIOCGIFCONF, &ifconf);
+
+        //逐个获取Ip地址
+        int size = ifconf.ifc_len / sizeof(struct ifreq);
+        ifreq = (struct ifreq*)buf;
+        string netName(ifreq->ifr_name);
+        
+        if(size == 1 &&  netName == "lo") //只有逻辑地址 -- 网线被拔出
+        {
+            netType = 1;
+        }
+        else
+        {
+            for (i = size; i > 0; i--)
+            {
+                string netName(ifreq->ifr_name); //有其他网卡 -- 有线
+                if (netName != "lo")
+                {
+                    netType = 2;
+                }
+                ifreq++;
+            }
+        }
+
+        ctx->Ans.netType = netType;
+    }
+
+    if (ctx != NULL) {
+        ctx->Answer(ec);
+    }
+    return ec;
+}
+
+ErrorCodeEnum ResourceWatcherFSM::GetBizLinks(
+    SpReqAnsContext<ResourceWatcherService_GetBizLinks_Req, ResourceWatcherService_GetBizLinks_Ans>::Pointer ctx)
+{
+    LOG_FUNCTION();
+    ErrorCodeEnum ec = Error_Succeed;
+
+    int filter = ctx->Req.filter;  //后续过滤使用
+    CAutoArray<CSimpleStringA> bizLinks;
+    CAutoArray<CSimpleStringA> bizNames;
+    int bizNum = 4;
+
+    bizNames.Init(bizNum);
+    bizLinks.Init(bizNum);
+    int pos = 0;
+
+    CSmartPointer<IConfigInfo> spCtSettingConfig;
+    GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig);
+    CSimpleStringA mLink(""),adLink(""), mgrUrl(""), mgrUrlNoBar("");
+    spCtSettingConfig->ReadConfigValue("Chromium", "UserMgrUrlFulture", mLink);
+    if (mLink.GetLength() != 0)
+    {
+        bizNames[pos] = "主站点";
+        bizLinks[pos] = mLink;
+        pos++;
+    }
+    
+    spCtSettingConfig->ReadConfigValue("Chromium", "UserMgrAd", adLink);
+    if (adLink.GetLength() != 0)
+    {
+        bizNames[pos] = "广告站点";
+        bizLinks[pos] = adLink;
+        pos++;
+    }
+
+    spCtSettingConfig->ReadConfigValue("Chromium", "UserMgrUrl", mgrUrl);
+    if (mgrUrl.GetLength() != 0)
+    {
+        bizNames[pos] = "业务站点1";
+        bizLinks[pos] = mgrUrl;
+        pos++;
+    }
+
+    spCtSettingConfig->ReadConfigValue("Chromium", "UserMgrUrlNoSidebar", mgrUrlNoBar);
+    if (mgrUrlNoBar.GetLength() != 0)
+    {
+        bizNames[pos] = "业务站点2";
+        bizLinks[pos] = mgrUrlNoBar;
+        pos++;
+    }
+
+    
+    ctx->Ans.bizLinks = bizLinks;
+    ctx->Ans.bizNames = bizNames;
+
+    if (ctx != NULL) {
+        ctx->Answer(ec);
+    }
+    return ec;
+
+}
+
+
+void ResourceWatcherFSM::GetMainLinkStatus()
+{
+    ErrorCodeEnum errorCode = Error_Succeed;
+
+    CSmartPointer<IConfigInfo> spCtSettingConfig;
+    GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig);
+    ErrorCodeEnum erroCode = Error_Unexpect;
+    CSimpleStringA mLink("");
+    erroCode = spCtSettingConfig->ReadConfigValue("Chromium", "UserMgrUrlFulture", mLink);
+
+    MainLinkDetect mainDetect;
+    //const char* mainLink = "www.google.com";
+    const char* mainLink = mLink.GetData();
+    bool curStatus = false;
+    uint delay = 0;
+    LinkDetect(0, mainLink, curStatus, delay);
+
+    if (!curStatus)
+    {
+        Dbg("Main Link disconnected [%s].", mainLink);
+        mainDetect.mainLinkStatus = curStatus;
+        mainDetect.reversed1 = 0;
+        mainDetect.reversed2 = "";
+        SpSendBroadcast(GetEntityBase()->GetFunction(),
+            SP_MSG_OF(MainLinkDetect), SP_MSG_SIG_OF(MainLinkDetect), mainDetect);
+    }
+    else
+    {
+        Dbg("Main Link is connected [%s].", mainLink);
+    }
+
+}
+
 BOOL ResourceWatcherFSM::ReadCPUInfo(CPUInfo * cpu)
 {
     FILE* fp;

+ 15 - 1
Module/mod_ResourceWatcher/ResourceWatcherFSM.h

@@ -480,7 +480,21 @@ public:
 	string MemoryProcessStatus();
 
 	void HardwareInfoTimer(void* pData);
-
+	
+	void LinkDetect(int detectType, const char* url, bool& status, uint &delay);
+
+	//void MainLinkDetectTimer(void* pData);
+	void GetMainLinkStatus();
+	ErrorCodeEnum BizLinkDetect(
+		SpReqAnsContext<ResourceWatcherService_BizLinkDetect_Req,
+		ResourceWatcherService_BizLinkDetect_Ans>::Pointer ctx);
+	ErrorCodeEnum CheckNetType(
+		SpReqAnsContext<ResourceWatcherService_CheckNetType_Req,
+		ResourceWatcherService_CheckNetType_Ans>::Pointer ctx);
+	ErrorCodeEnum GetBizLinks(
+		SpReqAnsContext<ResourceWatcherService_GetBizLinks_Req,
+		ResourceWatcherService_GetBizLinks_Ans>::Pointer ctx);
+	
 	BOOL ReadCPUInfo(CPUInfo* cpu);
 
 	void GetSystemCPUStatus();

+ 87 - 0
Module/mod_ResourceWatcher/ResourceWatcher_client_g.h

@@ -329,6 +329,93 @@ public:
 		return Error;
 	}
 
+	ErrorCodeEnum CheckNetType(ResourceWatcherService_CheckNetType_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		return pFunc->AsyncRequest(ResourceWatcherService_Method_CheckNetType, ResourceWatcherService_MethodSignature_CheckNetType, Buf, spAsyncWait, dwTimeout);
+	}
+	ErrorCodeEnum CheckNetType(ResourceWatcherService_CheckNetType_Req &Req, ResourceWatcherService_CheckNetType_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = CheckNetType(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum CheckNetType(ResourceWatcherService_CheckNetType_Req &Req, ResourceWatcherService_CheckNetType_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = CheckNetType(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum GetBizLinks(ResourceWatcherService_GetBizLinks_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		return pFunc->AsyncRequest(ResourceWatcherService_Method_GetBizLinks, ResourceWatcherService_MethodSignature_GetBizLinks, Buf, spAsyncWait, dwTimeout);
+	}
+	ErrorCodeEnum GetBizLinks(ResourceWatcherService_GetBizLinks_Req &Req, ResourceWatcherService_GetBizLinks_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetBizLinks(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetBizLinks(ResourceWatcherService_GetBizLinks_Req &Req, ResourceWatcherService_GetBizLinks_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetBizLinks(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum BizLinkDetect(ResourceWatcherService_BizLinkDetect_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		return pFunc->AsyncRequest(ResourceWatcherService_Method_BizLinkDetect, ResourceWatcherService_MethodSignature_BizLinkDetect, Buf, spAsyncWait, dwTimeout);
+	}
+	ErrorCodeEnum BizLinkDetect(ResourceWatcherService_BizLinkDetect_Req &Req, ResourceWatcherService_BizLinkDetect_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = BizLinkDetect(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum BizLinkDetect(ResourceWatcherService_BizLinkDetect_Req &Req, ResourceWatcherService_BizLinkDetect_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = BizLinkDetect(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
 
 	bool SafeDelete()
 	{

+ 80 - 0
Module/mod_ResourceWatcher/ResourceWatcher_def_g.h

@@ -22,6 +22,9 @@ namespace ResourceWatcher {
 #define ResourceWatcherService_Method_GetNetworkInfo 6
 #define ResourceWatcherService_Method_GetThirdPartyInstallState 7
 #define ResourceWatcherService_Method_InstallThirdPartyProgram 8
+#define ResourceWatcherService_Method_CheckNetType 9
+#define ResourceWatcherService_Method_GetBizLinks 10
+#define ResourceWatcherService_Method_BizLinkDetect 11
 
 #define ResourceWatcherService_MethodSignature_Fetch -1944912560
 #define ResourceWatcherService_MethodSignature_GetDevInfo 296205965
@@ -33,6 +36,9 @@ namespace ResourceWatcher {
 #define ResourceWatcherService_MethodSignature_GetNetworkInfo 1741482404
 #define ResourceWatcherService_MethodSignature_GetThirdPartyInstallState -15861483
 #define ResourceWatcherService_MethodSignature_InstallThirdPartyProgram -1049249852
+#define ResourceWatcherService_MethodSignature_CheckNetType 1341887614
+#define ResourceWatcherService_MethodSignature_GetBizLinks 651862197
+#define ResourceWatcherService_MethodSignature_BizLinkDetect 1476437131
 
 struct ResourceWatcherService_Fetch_Req
 {
@@ -315,6 +321,80 @@ struct ResourceWatcherService_InstallThirdPartyProgram_Ans
 
 };
 
+struct ResourceWatcherService_CheckNetType_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct ResourceWatcherService_CheckNetType_Ans
+{
+	int netType;
+	CSimpleStringA strParam;
+	int intParam;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & netType & strParam & intParam;
+	}
+
+};
+
+struct ResourceWatcherService_GetBizLinks_Req
+{
+	int filter;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & filter;
+	}
+
+};
+
+struct ResourceWatcherService_GetBizLinks_Ans
+{
+	CAutoArray<CSimpleStringA> bizLinks;
+	CAutoArray<CSimpleStringA> bizNames;
+	CAutoArray<CSimpleStringA> params1;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & bizLinks & bizNames & params1;
+	}
+
+};
+
+struct ResourceWatcherService_BizLinkDetect_Req
+{
+	int protocol;
+	CSimpleStringA bizLink;
+	CSimpleStringA attachment1;
+	CSimpleStringA attachment2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & protocol & bizLink & attachment1 & attachment2;
+	}
+
+};
+
+struct ResourceWatcherService_BizLinkDetect_Ans
+{
+	bool bizLinkStatus;
+	unsigned int bizLinkDelayMS;
+	CSimpleStringA strParam;
+	int intParam;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & bizLinkStatus & bizLinkDelayMS & strParam & intParam;
+	}
+
+};
+
 
 ///////////////////////////
 

+ 17 - 0
Module/mod_ResourceWatcher/ResourceWatcher_msg_g.h

@@ -10,8 +10,10 @@
 
 namespace ResourceWatcher {
 #define eMsg_QueryCardSwiper 0
+#define eMsg_MainLinkDetect 1
 
 #define eMsgSig_QueryCardSwiper 690144769
+#define eMsgSig_MainLinkDetect 46828988
 
 struct QueryCardSwiper
 {
@@ -26,5 +28,20 @@ struct QueryCardSwiper
 
 ///////////////////////////
 
+struct MainLinkDetect
+{
+	int mainLinkStatus;
+	int reversed1;
+	CSimpleStringA reversed2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & mainLinkStatus & reversed1 & reversed2;
+	}
+
+};
+
+///////////////////////////
+
 } // namespace ResourceWatcher
 #endif // __RESOURCEWATCHER_MSG_G_H

+ 75 - 0
Module/mod_ResourceWatcher/ResourceWatcher_server_g.h

@@ -100,6 +100,27 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case ResourceWatcherService_Method_CheckNetType:
+			if (dwSignature == ResourceWatcherService_MethodSignature_CheckNetType) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case ResourceWatcherService_Method_GetBizLinks:
+			if (dwSignature == ResourceWatcherService_MethodSignature_GetBizLinks) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case ResourceWatcherService_Method_BizLinkDetect:
+			if (dwSignature == ResourceWatcherService_MethodSignature_BizLinkDetect) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -161,6 +182,21 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case ResourceWatcherService_Method_CheckNetType:
+			if (dwSignature != ResourceWatcherService_MethodSignature_CheckNetType) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case ResourceWatcherService_Method_GetBizLinks:
+			if (dwSignature != ResourceWatcherService_MethodSignature_GetBizLinks) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case ResourceWatcherService_Method_BizLinkDetect:
+			if (dwSignature != ResourceWatcherService_MethodSignature_BizLinkDetect) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -218,6 +254,21 @@ public:
 	/// override by user
 	}
 
+	virtual void Handle_CheckNetType(SpReqAnsContext<ResourceWatcherService_CheckNetType_Req, ResourceWatcherService_CheckNetType_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_GetBizLinks(SpReqAnsContext<ResourceWatcherService_GetBizLinks_Req, ResourceWatcherService_GetBizLinks_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_BizLinkDetect(SpReqAnsContext<ResourceWatcherService_BizLinkDetect_Req, ResourceWatcherService_BizLinkDetect_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
 	virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		CAutoBuffer Buf;
@@ -314,6 +365,30 @@ public:
 						Handle_InstallThirdPartyProgram(ctx);
 					}
 					break;
+				case ResourceWatcherService_Method_CheckNetType:
+					{
+						SpReqAnsContext<ResourceWatcherService_CheckNetType_Req,ResourceWatcherService_CheckNetType_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<ResourceWatcherService_CheckNetType_Req,ResourceWatcherService_CheckNetType_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						Handle_CheckNetType(ctx);
+					}
+					break;
+				case ResourceWatcherService_Method_GetBizLinks:
+					{
+						SpReqAnsContext<ResourceWatcherService_GetBizLinks_Req,ResourceWatcherService_GetBizLinks_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<ResourceWatcherService_GetBizLinks_Req,ResourceWatcherService_GetBizLinks_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						Handle_GetBizLinks(ctx);
+					}
+					break;
+				case ResourceWatcherService_Method_BizLinkDetect:
+					{
+						SpReqAnsContext<ResourceWatcherService_BizLinkDetect_Req,ResourceWatcherService_BizLinkDetect_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<ResourceWatcherService_BizLinkDetect_Req,ResourceWatcherService_BizLinkDetect_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						Handle_BizLinkDetect(ctx);
+					}
+					break;
 				default:
 					assert(0);
 					break;

+ 18 - 0
Module/mod_ResourceWatcher/mod_ResourceWatcher.cpp

@@ -146,6 +146,24 @@ void ResourceWatcherServiceSession::Handle_InstallThirdPartyProgram(SpReqAnsCont
     m_pEntity->InstallThirdPartyProgram(ctx);
 }
 
+void ResourceWatcherServiceSession::Handle_BizLinkDetect(SpReqAnsContext<ResourceWatcherService_BizLinkDetect_Req, ResourceWatcherService_BizLinkDetect_Ans>::Pointer ctx)
+{
+    LOG_FUNCTION();
+    m_pEntity->BizLinkDetect(ctx);
+}
+
+void ResourceWatcherServiceSession::Handle_CheckNetType(SpReqAnsContext<ResourceWatcherService_CheckNetType_Req, ResourceWatcherService_CheckNetType_Ans>::Pointer ctx)
+{
+    LOG_FUNCTION();
+    m_pEntity->CheckNetType(ctx);
+}
+
+void ResourceWatcherServiceSession::Handle_GetBizLinks(SpReqAnsContext<ResourceWatcherService_GetBizLinks_Req, ResourceWatcherService_GetBizLinks_Ans>::Pointer ctx)
+{
+    LOG_FUNCTION();
+    m_pEntity->GetBizLinks(ctx);
+}
+
 void ResourceWatcherEntity::UpdateDNS(SpReqAnsContext<ResourceWatcherService_UpdateDNS_Req, ResourceWatcherService_UpdateDNS_Ans>::Pointer ctx)
 {
     ctx->Answer(Error_NotImpl);

+ 23 - 0
Module/mod_ResourceWatcher/mod_ResourceWatcher.h

@@ -44,6 +44,11 @@ public:
 
 	virtual void Handle_InstallThirdPartyProgram(SpReqAnsContext<ResourceWatcherService_InstallThirdPartyProgram_Req, ResourceWatcherService_InstallThirdPartyProgram_Ans>::Pointer ctx);
 
+	virtual void Handle_BizLinkDetect(SpReqAnsContext<ResourceWatcherService_BizLinkDetect_Req, ResourceWatcherService_BizLinkDetect_Ans>::Pointer ctx);
+
+	virtual void Handle_CheckNetType(SpReqAnsContext<ResourceWatcherService_CheckNetType_Req, ResourceWatcherService_CheckNetType_Ans>::Pointer ctx);
+
+	virtual void Handle_GetBizLinks(SpReqAnsContext<ResourceWatcherService_GetBizLinks_Req, ResourceWatcherService_GetBizLinks_Ans>::Pointer ctx);
 private:
 	ResourceWatcherEntity* m_pEntity;
 };
@@ -189,6 +194,24 @@ public:
 		m_fsm.GetCpuType(ctx);
 	}
 
+	void BizLinkDetect(SpReqAnsContext<ResourceWatcherService_BizLinkDetect_Req,
+		ResourceWatcherService_BizLinkDetect_Ans>::Pointer ctx)
+	{
+		m_fsm.BizLinkDetect(ctx);
+	}
+
+	void CheckNetType(SpReqAnsContext<ResourceWatcherService_CheckNetType_Req,
+		ResourceWatcherService_CheckNetType_Ans>::Pointer ctx)
+	{
+		m_fsm.CheckNetType(ctx);
+	}
+
+	void GetBizLinks(SpReqAnsContext<ResourceWatcherService_GetBizLinks_Req,
+		ResourceWatcherService_GetBizLinks_Ans>::Pointer ctx)
+	{
+		m_fsm.GetBizLinks(ctx);
+	}
+
 	void OperateFile(
 		SpReqAnsContext<ResourceWatcherService_OperateFile_Req, 
 		ResourceWatcherService_OperateFile_Ans>::Pointer ctx)

+ 44 - 3
Module/mod_chromium/CModTools.cpp

@@ -434,11 +434,17 @@ namespace Chromium {
 
             //strParams.Append(" --app=\"");
 			strParams.Append(" ");
+
+            std::string additionalParam = getAdditionalUOSBrowserSettings();
+            if (!additionalParam.empty()) {
+                strParams.Append(additionalParam.c_str());
+                strParams.Append(" ");
+            }
+
             strParams.Append(AdUrl.c_str());
             //strParams.Append("\"");
 
             strUOSBrowserPath.Append(strParams);
-            DbgEx("cmdline : %s", strUOSBrowserPath.GetData());
 
             LogWarn(Severity_High, Error_Unexpect, LOG_EVT_CHROMIUM_OPEN_AD_WITH_UOS, strUOSBrowserPath);
             return strUOSBrowserPath.GetData();
@@ -467,7 +473,36 @@ namespace Chromium {
 	}
 
 
-	std::string CModTools::generateCefclientCmd(bool isExtend, std::string mainUrl)
+    std::string CModTools::getAdditionalUOSBrowserSettings(int nType /*= 0*/)
+    {
+		std::string result("");
+		CSimpleStringA section("UOSBrowserCmd");
+		if (nType == 1) {
+			section = "UOSBrowserCmdMain";
+		} else if(nType == 2) {
+			section = "UOSBrowserCmdVice";
+		} else if (nType != 0) {
+			return result;
+		}
+
+       CSmartPointer<IConfigInfo> spConfig;
+       m_pEntity->GetFunction()->OpenConfig(Config_Software, spConfig);
+	   int count(0);
+	   spConfig->ReadConfigValueInt(section, "Count", count);
+	   for (int i = 0; i <= count; ++i) {
+		   CSimpleStringA key = CSimpleStringA::Format("Additional%d", i);
+		   CSimpleStringA value(true);
+		   spConfig->ReadConfigValue(section, key, value);
+		   if (!value.IsNullOrEmpty()) {
+               if (!result.empty()) result += " ";
+			   result += value.GetData();
+		   }
+	   }
+
+	   return result;
+    }
+
+    std::string CModTools::generateCefclientCmd(bool isExtend, std::string mainUrl)
 	{
 		if (m_bUseUOSBrowser && !isExtend) {
 
@@ -489,12 +524,18 @@ namespace Chromium {
             strParams.Append(" --user-data-dir=").Append(usrDataPath);
 
 			strParams.Append(" ");
+
+			std::string additionalParam = getAdditionalUOSBrowserSettings();
+			if (!additionalParam.empty()) {
+				strParams.Append(additionalParam.c_str());
+                strParams.Append(" ");
+			}
+
 			strParams.Append(mainUrl.c_str());
 
 			strUOSBrowserPath.Append(strParams);
 
             LogWarn(Severity_High, Error_Unexpect, LOG_EVT_CHROMIUM_OPEN_MAIN_WITH_UOS, strUOSBrowserPath);
-			DbgEx("cmdline : %s", strUOSBrowserPath.GetData());
 
 			return strUOSBrowserPath.GetData();
 		}

+ 3 - 0
Module/mod_chromium/CModTools.h

@@ -67,6 +67,9 @@ namespace Chromium {
 		std::string generateMainCmd(std::string mainUrl);
 		std::string generateExtendCmd(std::string extendUrl);
 		std::string generateAdCmd(std::string AdUrl);
+
+		/** 0:通用,1主屏,2:副屏 [Gifur@2022125]*/
+		std::string getAdditionalUOSBrowserSettings(int nType = 0);
 		std::pair<bool, std::string> GenerateErrPage(ERR_PAGE_REASON errType,
 			std::tuple < std::string, std::string> norParam, std::tuple<std::string, std::string, std::string, DWORD, DWORD> exParam);
 		std::pair<ErrorCodeEnum, int> openCef(std::string cmdline, bool isGuard = false);

+ 3 - 1
Module/mod_healthmanager/mod_healthmanager.h

@@ -148,6 +148,8 @@ public:
 		GetFunction()->SubscribeLog(m_uuidCenterS, this, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "CenterSetting");
 		GetFunction()->SubscribeLog(m_uuidPublic, this, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "Chromium");
 
+		GetFunction()->SubscribeLog(m_uuidCounterConnector, this, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "CounterConnector");
+
 		GetFunction()->RegistSysVarEvent("UIState", this);
 		//UpgradeManager
 
@@ -253,7 +255,7 @@ private:
 	//the following is useless?just one var is ok? oiltmp
 	CUUID m_uuidUpdate,m_uuidMediaController,m_uuidFaceTracking,m_uuidAccessAuth,m_uuidInitializer,m_uuidSelfChecker
 		, m_uuidRemoteController, m_uuidGUIConsole, m_uuidHeartBeat, m_uuidMaintainWatch, m_uuidIE, m_uuidCenterS;
-	CUUID m_uuidCardSwiper,m_uuidPublic;
+	CUUID m_uuidCardSwiper,m_uuidPublic, m_uuidCounterConnector;
 	int m_devCfgNum,m_connectStatus;
 	int m_restartHour, m_restartMinute, m_lastHour, m_restartTimes, m_maxRestartTimes, m_preDay, m_dayNum, m_maxRunDays;
 	bool m_bInit,m_bWatchDog,m_bWaitRestartPC,m_bUpsWaitLock,m_bScreenLock,m_bToRestart,m_testFlag,m_bSayIdle

+ 11 - 7
Module/mod_sipphone/Event.h

@@ -10,8 +10,8 @@
 #define		ERROR_MOD_SIP_REJECT_VOLUME					0x30188034   //容量拒绝, 级别2
 #define		ERROR_MOD_SIP_SERVER_PAUSE					0x30188035   //服务暂停, 级别2
 #define		ERROR_MOD_SIP_LOSS_CONNECT					0x30188036   //失去连接, 级别2
-#define		ERROR_MOD_SIP_SES_CREATE_FAILED			0x30188037   //创建会话失败
-#define		ERROR_MOD_SIP_SES_SOCKET_INUSED			0x30188038   //会话端口被占用
+#define		ERROR_MOD_SIP_SES_CREATE_FAILED				0x30188037   //创建会话失败
+#define		ERROR_MOD_SIP_SES_SOCKET_INUSED				0x30188038   //会话端口被占用
 
 #define		ERROR_MOD_SIP_INVALID_REQPACKAGE			0x30188041  //无效请求包, 级别3
 #define		ERROR_MOD_SIP_AUTH_UNRECOG					0x30188051  //鉴权不可识别, 级别3
@@ -102,15 +102,19 @@
 #define ERROR_MOD_SIP_AUDIO_RTP_CREATE_FAILED						0x3019060B  //audio rtp create failed,级别2
 #define ERROR_MOD_SIP_AUDIO_CONTEXT_CREATE_FAILED					0x3019060C  //audio context create failed,级别2
 
+#define EVENT_MOD_SIP_ENTITY_STARTED		0x301A0001		//sipphone entity start
+#define EVENT_MOD_SIP_INVITE_SEND			0x301A0002		//sip invite send
+#define EVENT_MOD_SIP_PROCESS_MSG			0x301A0003		//sip process messsage
+
 //event
-#define EVENT_MOD_CONNECT_PICKUP_CALL	0x10303041	// 提机呼叫
+#define EVENT_MOD_CONNECT_PICKUP_CALL			0x10303041	// 提机呼叫
 
 #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
+#define EVENT_MOD_CONNECT_SLV_HANDFREECALL		0x10303050	   //界面拨号,免提呼叫发送给SIPPHONE
+#define EVENT_MOD_CONNECT_SLV_PICKUPCALL		0x10303051     //界面拨号,话筒呼叫发送给SIPPHONE
 
 #define EVENT_MOD_CONNECT_AGENT_HANDFREE_PICKUP			0x10303052	//坐席控制免提转话筒
 #define EVENT_MOD_CONNECT_AGENT_PICKUP_HANDFREE			0x10303053	//坐席控制话筒转免提
@@ -121,8 +125,8 @@
 #define LOG_EVT_SELFCHECK_ASSISTANTCHANNEL_IDLE			0x50500001  //协助通道重启
 
 
-#define LOG_EVT_ENTER_ACM_FLOW	 0x30500001          //进入坐席控制流程(initiactivetransfer发送)
-#define LOG_EVT_EXIT_ACM_FLOW	 0x30500002          //进入坐席控制流程(initiactivetransfer发送)
+#define LOG_EVT_ENTER_ACM_FLOW		0x30500001          //进入坐席控制流程(initiactivetransfer发送)
+#define LOG_EVT_EXIT_ACM_FLOW		0x30500002          //进入坐席控制流程(initiactivetransfer发送)
 
 
 //sysvar

+ 12 - 12
Module/mod_sipphone/audio_session.cpp

@@ -523,19 +523,19 @@ static int phonemedia_start(audio_session_t *session)
 
 	status = apr_pool_create(&media->pool, NULL);
 	if (status != APR_SUCCESS) {
-		LogWarn(Severity_High, Error_Unexpect, ERROR_MOD_SIP_APR_POOL_CREATE_FAILED, "create media pool failed!");
+		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_APR_POOL_CREATE_FAILED, "create media pool failed!");
 		return Error_Resource;
 	}
 
 	status = audioengine_create(media->pool, &media->engine);
 	if (status != APR_SUCCESS) {
-		LogWarn(Severity_High, Error_Unexpect, ERROR_MOD_SIP_AUDIO_ENGINE_CREATE_FAILED, "create audio engine failed!");
+		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_ENGINE_CREATE_FAILED, "create audio engine failed!");
 		goto on_error;
 	}
 
 	status = audioengine_start(media->engine);
 	if (status != APR_SUCCESS) {
-		LogWarn(Severity_High, Error_Unexpect, ERROR_MOD_SIP_AUDIO_ENGINE_START_FAILED, "audio engine  start failed!");
+		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_ENGINE_START_FAILED, "audio engine  start failed!");
 		goto on_error;
 	}
 	Dbg("audioengine_start success!");
@@ -544,7 +544,7 @@ static int phonemedia_start(audio_session_t *session)
 	if (rc != 0) {
 		char strmsg[MAX_PATH] = { 0 };
 		_snprintf(strmsg, MAX_PATH, "audio rtp session create2 failed and local port is %d, rc=%d", conf->local_rtp_port, rc);
-		LogWarn(Severity_High, Error_Unexpect, ERROR_MOD_SIP_AUDIO_RTP_SESSION_CREATE_FAILED, strmsg);
+		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_RTP_SESSION_CREATE_FAILED, strmsg);
 		LogWarn(Severity_Middle, Error_InvalidState, EVENT_MOD_SIP_AUDIO_RTP_CREATE, strmsg);
 		goto on_error;
 	}
@@ -556,21 +556,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_High, Error_Unexpect, ERROR_MOD_SIP_AUDIO_RTP_SESSION_RESET_FAILED, "audio rtp session reset failed!");
+		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_RTP_SESSION_RESET_FAILED, "audio rtp session reset failed!");
 		goto on_error;
 	}
 	Dbg("rtp_session_reset2 success!");
 	
 	status = audiobridge_create(media->pool, media->engine, &media->bridge);
 	if (status != APR_SUCCESS){
-		LogWarn(Severity_High, Error_Unexpect, ERROR_MOD_SIP_AUDIO_BRIDGE_CREATE_FAILED, "audio bridge create failed!");
+		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_BRIDGE_CREATE_FAILED, "audio bridge create failed!");
 		goto on_error;
 	}
 	Dbg("audiobridge_create success!");
 
 	status = apr_pool_create(&media->micspk_pool, media->pool);
 	if (status != APR_SUCCESS){
-		LogWarn(Severity_High, Error_Unexpect, ERROR_MOD_SIP_APR_POOL_CREATE_FAILED, "create media micspk_pool failed!");
+		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_APR_POOL_CREATE_FAILED, "create media micspk_pool failed!");
 		goto on_error;
 	}
 	Dbg("apr_pool_create success!");
@@ -610,7 +610,7 @@ static int phonemedia_start(audio_session_t *session)
 		
 		status = audiodsp_create(media->micspk_pool, media->engine, read_opt, write_opt, AUDIO_CLOCK, &media->dspstream);
 		if (status != APR_SUCCESS){
-			LogWarn(Severity_High, Error_Unexpect, ERROR_MOD_SIP_AUDIO_DSP_CREATE_FAILED, "create audio dsp failed!");
+			LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_DSP_CREATE_FAILED, "create audio dsp failed!");
 			goto on_error;
 		}
 		Dbg("audiodsp_create success!");
@@ -627,20 +627,20 @@ static int phonemedia_start(audio_session_t *session)
 		conf->remote_ptime*2*AUDIO_CLOCK/1000, FRAME_TIME*2*AUDIO_CLOCK/1000, 
 		conf->local_ptime*2*AUDIO_CLOCK/1000, &media->resizestream);
 	if (status != APR_SUCCESS){
-		LogWarn(Severity_High, Error_Unexpect, ERROR_MOD_SIP_AUDIO_RESIZE_CREATE_FAILED, "create audio resize failed!");
+		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_RESIZE_CREATE_FAILED, "create audio resize failed!");
 		goto on_error;
 	}
 
 	status = audiocodec_create(media->pool, media->engine, codec, AUDIO_CLOCK, FRAME_TIME, 
 		AUDIO_CODEC_OPT_ENCODE_WRITE, &media->codecstream);
 	if (status != APR_SUCCESS){
-		LogWarn(Severity_High, Error_Unexpect, ERROR_MOD_SIP_AUDIO_CODEC_CREATE_FAILED, "create audio codec failed!");
+		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_CODEC_CREATE_FAILED, "create audio codec failed!");
 		goto on_error;
 	}
 
 	status = audiortp_create(media->pool, media->engine, media->rtpsess, &media->rtpstream);
 	if (status != APR_SUCCESS){
-		LogWarn(Severity_High, Error_Unexpect, ERROR_MOD_SIP_AUDIO_RTP_CREATE_FAILED, "create audio rtp failed!");
+		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_RTP_CREATE_FAILED, "create audio rtp failed!");
 		goto on_error;
 	}
 	Dbg("audio_session_t session addr is 0x%08x, audiortp_create success,and media->rtpstream addrs is 0x%08x!",session, media->rtpstream);
@@ -719,7 +719,7 @@ static int phonemedia_start(audio_session_t *session)
 
 	status = audiocontext_create(media->pool, media->engine, &media->context);
 	if (status != APR_SUCCESS){
-		LogWarn(Severity_High, Error_Unexpect, ERROR_MOD_SIP_AUDIO_CONTEXT_CREATE_FAILED, "create audio context failed!");
+		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_CONTEXT_CREATE_FAILED, "create audio context failed!");
 		goto on_error;
 	}
 	Dbg("audiocontext_create success!");

+ 137 - 103
Module/mod_sipphone/endpoint.cpp

@@ -919,116 +919,148 @@ static void on_state(CONDITION_PARAMS)
 		SOATAG_LOCAL_SDP_STR_REF(local_sdp_str), 
 		TAG_END());
 
-	LOG_TRACE("state = %d, offer_recv=%d, answer_recv=%d, offer_sent=%d, answer_sent=%d", 
-		state, offer_recv, answer_recv, offer_sent, answer_sent);
+	char strmsg[MAX_PATH] = { 0 };
+	_snprintf(strmsg, MAX_PATH, "state = %d, offer_recv=%d, answer_recv=%d, offer_sent=%d, answer_sent=%d", state, offer_recv, answer_recv, offer_sent, answer_sent);
+	LogWarn(Severity_Middle, Error_Debug, EVENT_MOD_SIP_PROCESS_MSG, strmsg);
 
-	switch (state) 
+	switch (state)
 	{
-	case nua_callstate_calling:
-		LOG_TRACE("nua_callstate_calling, has_local_sdp : %d, has_remote_sdp : %d", !!local_sdp_str, !!remote_sdp_str);
-		if (local_sdp_str) {
-			sdp_parser_t *parser = sdp_parse(call->home, local_sdp_str, strlen(local_sdp_str), -1);
-			assert(call->last_sdp == NULL);
-			call->last_sdp = sdp_session_dup(call->home, sdp_session(parser));
-			sdp_parser_free(parser);
-		}
-		st = CALLING;
-		call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
-		break;
-	case nua_callstate_proceeding:
-		LOG_TRACE("nua_callstate_proceeding, status = %d, has_local_sdp: %d, has_remote_sdp : %d", status, !!local_sdp_str, !!remote_sdp_str);
-		st = PROCEEDING;
-		call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
-		if (remote_sdp_str) {
-			sdp_parser_t *parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
-			remote_sdp = sdp_session(parser);
-			if (call->last_sdp) {
-				negotiate_sdp(call, call->last_sdp, remote_sdp);
-				su_free(call->home, call->last_sdp);
-				call->last_sdp = NULL;
-			}
-			sdp_parser_free(parser);
-		}
-		break;
-	case nua_callstate_completing:
-		st = COMPLETING;
-		LOG_TRACE("nua_callstate_completing, has_local_sdp : %d, has_remote_sdp : %d", !!local_sdp_str, !!remote_sdp_str);
-		call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
-		if (remote_sdp_str) {
-			sdp_parser_t *parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
-			remote_sdp = sdp_session(parser);
-			if (call->last_sdp) {
-				negotiate_sdp(call, call->last_sdp, remote_sdp);
-				su_free(call->home, call->last_sdp);
-				call->last_sdp = NULL;
+		case nua_callstate_calling:
+			{
+				char strcalling[MAX_PATH] = { 0 };
+				_snprintf(strcalling, MAX_PATH, "nua_callstate_calling, has_local_sdp : %d, has_remote_sdp : %d", !!local_sdp_str, !!remote_sdp_str);
+				LogWarn(Severity_Middle, Error_Debug, EVENT_MOD_SIP_PROCESS_MSG, strcalling);
+				if (local_sdp_str) {
+					sdp_parser_t* parser = sdp_parse(call->home, local_sdp_str, strlen(local_sdp_str), -1);
+					assert(call->last_sdp == NULL);
+					call->last_sdp = sdp_session_dup(call->home, sdp_session(parser));
+					sdp_parser_free(parser);
+				}
+				st = CALLING;
+				call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
 			}
-			sdp_parser_free(parser);
-		}
-		break;
-	case nua_callstate_completed:
-		LOG_TRACE("nua_callstate_completed, has_local_sdp : %d, has_remote_sdp : %d", !!local_sdp_str, !!remote_sdp_str);
-		if (remote_sdp_str) {
-			if (!call->last_sdp) {
-				sdp_parser_t *parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
-				call->last_sdp = sdp_session_dup(call->home, sdp_session(parser));
-				sdp_parser_free(parser);
+			break;
+
+		case nua_callstate_proceeding:
+			{
+				char strproceeding[MAX_PATH] = { 0 };
+				_snprintf(strproceeding, MAX_PATH, "nua_callstate_proceeding, status = %d, has_local_sdp: %d, has_remote_sdp : %d", status, !!local_sdp_str, !!remote_sdp_str);
+				LogWarn(Severity_Middle, Error_Debug, EVENT_MOD_SIP_PROCESS_MSG, strproceeding);
+				st = PROCEEDING;
+				call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
+				if (remote_sdp_str) {
+					sdp_parser_t* parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
+					remote_sdp = sdp_session(parser);
+					if (call->last_sdp) {
+						negotiate_sdp(call, call->last_sdp, remote_sdp);
+						su_free(call->home, call->last_sdp);
+						call->last_sdp = NULL;
+					}
+					sdp_parser_free(parser);
+				}
 			}
-		}
-		if (local_sdp_str) {
-			if (call->last_sdp) {
-				sdp_parser_t *parser = sdp_parse(call->home, local_sdp_str, strlen(local_sdp_str), -1);
-				local_sdp = sdp_session(parser);
-				negotiate_sdp(call, local_sdp, call->last_sdp);
-				su_free(call->home, call->last_sdp);
-				call->last_sdp = NULL;
-				sdp_parser_free(parser);
+			break;
+
+		case nua_callstate_completing:
+			{
+				st = COMPLETING;
+				char strcompleting[MAX_PATH] = { 0 };
+				_snprintf(strcompleting, MAX_PATH, "nua_callstate_completing, has_local_sdp : %d, has_remote_sdp : %d", !!local_sdp_str, !!remote_sdp_str);
+				LogWarn(Severity_Middle, Error_Debug, EVENT_MOD_SIP_PROCESS_MSG, strcompleting);
+				call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
+				if (remote_sdp_str) {
+					sdp_parser_t* parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
+					remote_sdp = sdp_session(parser);
+					if (call->last_sdp) {
+						negotiate_sdp(call, call->last_sdp, remote_sdp);
+						su_free(call->home, call->last_sdp);
+						call->last_sdp = NULL;
+					}
+					sdp_parser_free(parser);
+				}
 			}
-		}
-		break;
-	case nua_callstate_ready:
-		call->connected = true;
-		LOG_TRACE("nua_callstate_ready, has_local_sdp : %d, has_remote_sdp : %d.", !!local_sdp_str, !!remote_sdp_str);
-		st = READY;
-		call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
-		if (remote_sdp_str) {
-			sdp_parser_t *parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
-			remote_sdp = sdp_session(parser);
-			if (call->last_sdp) {
-				negotiate_sdp(call, call->last_sdp, remote_sdp);
-				su_free(call->home, call->last_sdp);
-				call->last_sdp = NULL;
+			break;
+
+		case nua_callstate_completed:
+			{
+				char strcompleted[MAX_PATH] = { 0 };
+				_snprintf(strcompleted, MAX_PATH, "nua_callstate_completed, has_local_sdp : %d, has_remote_sdp : %d", !!local_sdp_str, !!remote_sdp_str);
+				LogWarn(Severity_Middle, Error_Debug, EVENT_MOD_SIP_PROCESS_MSG, strcompleted);
+				if (remote_sdp_str) {
+					if (!call->last_sdp) {
+						sdp_parser_t* parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
+						call->last_sdp = sdp_session_dup(call->home, sdp_session(parser));
+						sdp_parser_free(parser);
+					}
+				}
+				if (local_sdp_str) {
+					if (call->last_sdp) {
+						sdp_parser_t* parser = sdp_parse(call->home, local_sdp_str, strlen(local_sdp_str), -1);
+						local_sdp = sdp_session(parser);
+						negotiate_sdp(call, local_sdp, call->last_sdp);
+						su_free(call->home, call->last_sdp);
+						call->last_sdp = NULL;
+						sdp_parser_free(parser);
+					}
+				}
 			}
-			sdp_parser_free(parser);
-		}
+			break;
+
+		case nua_callstate_ready:
+			{
+				call->connected = true;
+				char strready[MAX_PATH] = { 0 };
+				_snprintf(strready, MAX_PATH, "nua_callstate_ready, has_local_sdp : %d, has_remote_sdp : %d.", !!local_sdp_str, !!remote_sdp_str);
+				LogWarn(Severity_Middle, Error_Debug, EVENT_MOD_SIP_PROCESS_MSG, strready);
+				st = READY;
+				call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
+				if (remote_sdp_str) {
+					sdp_parser_t* parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
+					remote_sdp = sdp_session(parser);
+					if (call->last_sdp) {
+						negotiate_sdp(call, call->last_sdp, remote_sdp);
+						su_free(call->home, call->last_sdp);
+						call->last_sdp = NULL;
+					}
+					sdp_parser_free(parser);
+				}
 #if 0
-		if (remote_sdp_str) {
-			sdp_parser_t *parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
-			remote_sdp = sdp_session(parser);
-			negotiate_sdp(call, call->last_sdp, remote_sdp);
-			sdp_parser_free(parser);
-		} else if (local_sdp_str) {
-			sdp_parser_t *parser = sdp_parse(call->home, local_sdp_str, strlen(local_sdp_str), -1);
-			local_sdp = sdp_session(parser);
-			negotiate_sdp(call, local_sdp, call->last_sdp);
-			sdp_parser_free(parser);
-		}
+				if (remote_sdp_str) {
+					sdp_parser_t* parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
+					remote_sdp = sdp_session(parser);
+					negotiate_sdp(call, call->last_sdp, remote_sdp);
+					sdp_parser_free(parser);
+				}
+				else if (local_sdp_str) {
+					sdp_parser_t* parser = sdp_parse(call->home, local_sdp_str, strlen(local_sdp_str), -1);
+					local_sdp = sdp_session(parser);
+					negotiate_sdp(call, local_sdp, call->last_sdp);
+					sdp_parser_free(parser);
+				}
 #endif
-		break;
-	case nua_callstate_terminated:
-		st = TERMINATED;
-		LOG_TRACE("call terminated! in sofia thread!");
-		{
-			media_desc_t audio_desc = {0};
-			audio_desc.media_dir = DIR_NONE;
-			endpoint_media_update_audio(call, &audio_desc, call->ep->curr_audio_dev_type);
-		}
-		call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
-		nua_handle_bind(nh, NULL);
-		nua_handle_destroy(nh);
-		call->nh = NULL;
-		break;
-	}
+			}
+			break;
 
+		case nua_callstate_terminated:
+			{
+				st = TERMINATED;
+				char strterminated[MAX_PATH] = { 0 };
+				_snprintf(strterminated, MAX_PATH, "call terminated! in sofia thread!");
+				LogWarn(Severity_Middle, Error_Debug, EVENT_MOD_SIP_PROCESS_MSG, strterminated);
+				{
+					media_desc_t audio_desc = { 0 };
+					audio_desc.media_dir = DIR_NONE;
+					endpoint_media_update_audio(call, &audio_desc, call->ep->curr_audio_dev_type);
+				}
+				call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
+				nua_handle_bind(nh, NULL);
+				nua_handle_destroy(nh);
+				call->nh = NULL;
+			}
+			break;
+		default:
+			break;
+	}
 }
 
 void Terminatedcall(endpoint_call_t *call)
@@ -1327,7 +1359,7 @@ endpoint_t *endpoint_create(CEntityBase *pEntity, const endpoint_conf_t *conf,in
 	
 	endpt = __endpoint_create(pEntity, conf,nDev);
 	if (endpt) {
-		Dbg("new create endpoint addr is 0x%x.", endpt);
+		Dbg("new create endpoint addr is 0x%08x.", endpt);
 		int rc = __endpoint_start(endpt);
 		if (rc != 0) {
 			__endpoint_destroy(endpt);
@@ -1442,7 +1474,7 @@ int endpoint_call_start(endpoint_call_t *call)
 	
 	call_make_offer(call, sdp, -1);
 
-	Dbg("sdp is %s", sdp);
+	//Dbg("sdp is %s", sdp);
 
 	nua_invite(call->nh, 
 		//NUTAG_URL(call->remote_uri), 
@@ -1451,6 +1483,8 @@ int endpoint_call_start(endpoint_call_t *call)
 		//SOATAG_AUDIO_AUX("telephone-event"), 
 		TAG_END());
 
+	LogWarn(Severity_Middle, Error_Debug, EVENT_MOD_SIP_INVITE_SEND, sdp);
+
 	return 0;
 }
 

+ 1 - 0
Module/mod_sipphone/mod_sipphone.cpp

@@ -516,6 +516,7 @@ void CSIPEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITr
 { 
 	ErrorCodeEnum Error = __OnStart(Error_Succeed);
 	pTransactionContext->SendAnswer(Error);
+	LogWarn(Severity_Middle, Error_Debug, EVENT_MOD_SIP_ENTITY_STARTED, "sipphone entity started.");
 }
 
 void CSIPEntity::OnStarted() 

+ 1 - 0
Other/libRestfulFunc/CMakeLists.txt

@@ -11,6 +11,7 @@ set(${MODULE_PREFIX}_SRCS
 
 add_library(${MODULE_NAME} SHARED ${${MODULE_PREFIX}_SRCS})
 
+
 # 依赖libscreencodec、acmstrdec、acmstrenc
 target_include_directories(${MODULE_NAME} PRIVATE
 	${RVC_COMMON_INCLUDE_DIR}

+ 4 - 4
Other/libRestfulFunc/RestfulFunc.h

@@ -24,10 +24,10 @@
 #include <map>
 
 /*
-* > 0 : 网站返回的错误码,比如 200,404 等
-* -1:未归类,具体错误信息见 out_msg 返回的内容
-* -2:超
-* -3:地址不符合规范
+* > 0 : 锟斤拷站锟斤拷锟截的达拷锟斤拷锟诫,锟斤拷锟斤拷 200锟斤拷404 锟斤拷
+* -1锟斤拷未锟斤拷锟洁,锟斤拷锟斤拷锟斤拷锟斤拷锟较�拷锟� out_msg 锟斤拷锟截碉拷锟斤拷锟斤拷
+* -2锟斤拷锟斤拷
+* -3锟斤拷锟斤拷址锟斤拷锟斤拷锟较规范
 */
 RESTFULFUNC_API int HttpProbe(const std::string& url, std::string& out_msg, uint32_t wait_max_secs = (uint32_t)-1);
 

+ 16 - 0
addin/cfg/Chromium.ini

@@ -0,0 +1,16 @@
+[UOSBrowserCmd]
+Count=8
+;跳过 Chromium 首次运行检查
+Additional0=--no-first-run
+;禁用弹出拦截
+Additional1=--disable-popup-blocking
+Additional2=--disable-notifications
+;禁用桌面通知,在 Windows 中桌面通知默认是启用的
+Additional3=--disable-desktop-notifications
+Additional4=--allow-running-insecure-content
+Additional5=--disable-infobars
+Additional6=--disable-suggestions-service
+Additional7=--disable-save-password-bubble
+Additional8=--disable-component-update
+;让浏览器直接以隐身模式启动
+Additional9999=--incognito