diff --git a/interfaces/ipc/src/distributed_input_sink_proxy.cpp b/interfaces/ipc/src/distributed_input_sink_proxy.cpp index d84e4a1..c1cc3fb 100644 --- a/interfaces/ipc/src/distributed_input_sink_proxy.cpp +++ b/interfaces/ipc/src/distributed_input_sink_proxy.cpp @@ -106,7 +106,8 @@ int32_t DistributedInputSinkProxy::NotifyStartDScreen(const SrcScreenInfo &remot GetAnonyString(remoteCtrlInfo.devId).c_str(), remoteCtrlInfo.sourceWinId, remoteCtrlInfo.sourceWinWidth, remoteCtrlInfo.sourceWinHeight, GetAnonyString(remoteCtrlInfo.sourcePhyId).c_str(), remoteCtrlInfo.sourcePhyFd, remoteCtrlInfo.sourcePhyWidth, remoteCtrlInfo.sourcePhyHeight); - if (!data.WriteString(remoteCtrlInfo.devId) || !data.WriteUint64(remoteCtrlInfo.sourceWinId) || + if (!data.WriteString(remoteCtrlInfo.devId) || !data.WriteInt32(remoteCtrlInfo.sessionId) || + !data.WriteString(remoteCtrlInfo.uuid) || !data.WriteUint64(remoteCtrlInfo.sourceWinId) || !data.WriteUint32(remoteCtrlInfo.sourceWinWidth) || !data.WriteUint32(remoteCtrlInfo.sourceWinHeight) || !data.WriteString(remoteCtrlInfo.sourcePhyId) || !data.WriteUint32(remoteCtrlInfo.sourcePhyFd) || !data.WriteUint32(remoteCtrlInfo.sourcePhyWidth) || !data.WriteUint32(remoteCtrlInfo.sourcePhyHeight)) { diff --git a/interfaces/ipc/src/distributed_input_sink_stub.cpp b/interfaces/ipc/src/distributed_input_sink_stub.cpp index 6a5ac56..33baab3 100644 --- a/interfaces/ipc/src/distributed_input_sink_stub.cpp +++ b/interfaces/ipc/src/distributed_input_sink_stub.cpp @@ -95,6 +95,8 @@ int32_t DistributedInputSinkStub::NotifyStartDScreenInner(MessageParcel &data, M MessageOption &option) { std::string devId = data.ReadString(); + int32_t sessionId = data.ReadInt32(); + std::string uuid = data.ReadString(); uint64_t sourceWinId = data.ReadUint64(); uint32_t sourceWinWidth = data.ReadUint32(); uint32_t sourceWinHeight = data.ReadUint32(); @@ -108,6 +110,8 @@ int32_t DistributedInputSinkStub::NotifyStartDScreenInner(MessageParcel &data, M sourcePhyHeight); SrcScreenInfo srcScreenInfo = { .devId = devId, + .sessionId = sessionId, + .uuid = uuid, .sourceWinId = sourceWinId, .sourceWinWidth = sourceWinWidth, .sourceWinHeight = sourceWinHeight, diff --git a/services/sink/sinkmanager/BUILD.gn b/services/sink/sinkmanager/BUILD.gn index 4663802..2c6b510 100644 --- a/services/sink/sinkmanager/BUILD.gn +++ b/services/sink/sinkmanager/BUILD.gn @@ -44,7 +44,6 @@ ohos_shared_library("libdinput_sink") { ] sources = [ - "${common_path}/include/dinput_sa_process_state.cpp", "${common_path}/include/white_list_util.cpp", "${ipc_path}/src/distributed_input_sink_stub.cpp", "${ipc_path}/src/start_d_input_server_call_back_proxy.cpp", diff --git a/services/sink/sinkmanager/include/distributed_input_sink_manager.h b/services/sink/sinkmanager/include/distributed_input_sink_manager.h index ee595dc..cd65aec 100644 --- a/services/sink/sinkmanager/include/distributed_input_sink_manager.h +++ b/services/sink/sinkmanager/include/distributed_input_sink_manager.h @@ -112,6 +112,9 @@ public: int32_t Dump(int32_t fd, const std::vector& args) override; +private: + void CleanExceptionalInfo(const SrcScreenInfo& srcScreenInfo); + private: ServiceSinkRunningState serviceRunningState_ = ServiceSinkRunningState::STATE_NOT_START; DInputServerType isStartTrans_ = DInputServerType::NULL_SERVER_TYPE; diff --git a/services/sink/sinkmanager/src/distributed_input_sink_manager.cpp b/services/sink/sinkmanager/src/distributed_input_sink_manager.cpp index 1ea613b..db68d78 100644 --- a/services/sink/sinkmanager/src/distributed_input_sink_manager.cpp +++ b/services/sink/sinkmanager/src/distributed_input_sink_manager.cpp @@ -496,6 +496,9 @@ uint32_t DistributedInputSinkManager::ProjectWindowListener::GetScreenHeight() int32_t DistributedInputSinkManager::NotifyStartDScreen(const SrcScreenInfo& srcScreenInfo) { DHLOGI("NotifyStartDScreen start!"); + + CleanExceptionalInfo(srcScreenInfo); + std::string screenInfoKey = DInputContext::GetInstance().GetScreenInfoKey(srcScreenInfo.devId, srcScreenInfo.sourceWinId); SinkScreenInfo sinkScreenInfo = DInputContext::GetInstance().GetSinkScreenInfo(screenInfoKey); @@ -508,6 +511,22 @@ int32_t DistributedInputSinkManager::NotifyStartDScreen(const SrcScreenInfo& src return DInputContext::GetInstance().UpdateSinkScreenInfo(screenInfoKey, sinkScreenInfo); } +void DistributedInputSinkManager::CleanExceptionalInfo(const SrcScreenInfo& srcScreenInfo) +{ + DHLOGI("CleanExceptionalInfo start!"); + std::string uuid = srcScreenInfo.uuid; + int32_t sessionId = srcScreenInfo.sessionId; + auto sinkInfos = DInputContext::GetInstance().GetAllSinkScreenInfo(); + + for (const auto& [id, sinkInfo] : sinkInfos) { + auto srcInfo = sinkInfo.srcScreenInfo; + if ((std::strcmp(srcInfo.uuid.c_str(), uuid.c_str()) == 0) && (srcInfo.sessionId != sessionId)) { + DInputContext::GetInstance().RemoveSinkScreenInfo(id); + DHLOGI("CleanExceptionalInfo screenInfoKey: %s, sessionId: %d", id.c_str(), sessionId); + } + } +} + int32_t DistributedInputSinkManager::NotifyStopDScreen(const std::string& srcScreenInfoKey) { DHLOGI("NotifyStopDScreen start, srcScreenInfoKey: %s", GetAnonyString(srcScreenInfoKey).c_str()); diff --git a/services/sink/sinkmanager/test/sinkmanagerunittest/BUILD.gn b/services/sink/sinkmanager/test/sinkmanagerunittest/BUILD.gn index f40245c..9db2c3f 100755 --- a/services/sink/sinkmanager/test/sinkmanagerunittest/BUILD.gn +++ b/services/sink/sinkmanager/test/sinkmanagerunittest/BUILD.gn @@ -55,7 +55,6 @@ ohos_unittest("distributed_input_sinkmanager_test") { ] sources = [ - "${common_path}/include/dinput_sa_process_state.cpp", "${common_path}/include/input_hub.cpp", "${common_path}/include/white_list_util.cpp", "${ipc_path}/src/distributed_input_sink_stub.cpp", diff --git a/services/source/sourcemanager/BUILD.gn b/services/source/sourcemanager/BUILD.gn index 7c94b85..305b124 100644 --- a/services/source/sourcemanager/BUILD.gn +++ b/services/source/sourcemanager/BUILD.gn @@ -44,7 +44,6 @@ ohos_shared_library("libdinput_source") { ] sources = [ - "${common_path}/include/dinput_sa_process_state.cpp", "${common_path}/include/white_list_util.cpp", "${ipc_path}/src/add_white_list_infos_call_back_proxy.cpp", "${ipc_path}/src/add_white_list_infos_call_back_stub.cpp", diff --git a/services/source/sourcemanager/src/distributed_input_source_manager.cpp b/services/source/sourcemanager/src/distributed_input_source_manager.cpp index a0b42a0..28dc9db 100644 --- a/services/source/sourcemanager/src/distributed_input_source_manager.cpp +++ b/services/source/sourcemanager/src/distributed_input_source_manager.cpp @@ -1290,6 +1290,8 @@ int32_t DistributedInputSourceManager::StartDScreenListener::UpdateSrcScreenInfo std::string srcScreenInfoKey = DInputContext::GetInstance().GetScreenInfoKey(srcDevId, TmpInfo.sourceWinId); SrcScreenInfo srcScreenInfo = DInputContext::GetInstance().GetSrcScreenInfo(srcScreenInfoKey); srcScreenInfo.devId = srcDevId; + srcScreenInfo.sessionId = DistributedInputSourceTransport::GetInstance().GetCurrentSessionId(); + srcScreenInfo.uuid = GetUUIDBySoftBus(srcDevId); srcScreenInfo.sourceWinId = TmpInfo.sourceWinId; srcScreenInfo.sourceWinWidth = TmpInfo.sourceWinWidth; srcScreenInfo.sourceWinHeight = TmpInfo.sourceWinHeight; diff --git a/services/source/sourcemanager/test/sourcemanagerunittest/BUILD.gn b/services/source/sourcemanager/test/sourcemanagerunittest/BUILD.gn index b98a138..6acf51e 100755 --- a/services/source/sourcemanager/test/sourcemanagerunittest/BUILD.gn +++ b/services/source/sourcemanager/test/sourcemanagerunittest/BUILD.gn @@ -56,7 +56,6 @@ ohos_unittest("distributed_input_sourcemanager_test") { ] sources = [ - "${common_path}/include/dinput_sa_process_state.cpp", "${common_path}/include/input_hub.cpp", "${ipc_path}/src/add_white_list_infos_call_back_proxy.cpp", "${ipc_path}/src/add_white_list_infos_call_back_stub.cpp", diff --git a/services/source/transport/include/distributed_input_source_transport.h b/services/source/transport/include/distributed_input_source_transport.h index 34d36c2..bfe0523 100644 --- a/services/source/transport/include/distributed_input_source_transport.h +++ b/services/source/transport/include/distributed_input_source_transport.h @@ -57,6 +57,7 @@ public: int32_t OnSessionOpened(int32_t sessionId, int32_t result); void OnSessionClosed(int32_t sessionId); void OnBytesReceived(int32_t sessionId, const void *data, uint32_t dataLen); + int32_t GetCurrentSessionId(); private: std::string FindDeviceBySession(int32_t sessionId); @@ -87,6 +88,7 @@ private: std::atomic isLatencyThreadRunning_ = false; std::thread latencyThread_; std::string eachLatencyDetails_ = ""; + int32_t sessionId_ = 0; }; } // namespace DistributedInput } // namespace DistributedHardware diff --git a/services/source/transport/src/distributed_input_source_transport.cpp b/services/source/transport/src/distributed_input_source_transport.cpp index 3d4bc17..450c769 100644 --- a/services/source/transport/src/distributed_input_source_transport.cpp +++ b/services/source/transport/src/distributed_input_source_transport.cpp @@ -189,6 +189,7 @@ int32_t DistributedInputSourceTransport::OpenInputSoftbus(const std::string &rem DHLOGI("OpenSession success, remoteDevId:%s, sessionId:%s", GetAnonyString(remoteDevId).c_str(), GetAnonyInt32(sessionId).c_str()); + sessionId_ = sessionId; #ifdef DINPUT_LOW_LATENCY DInputLowLatency::GetInstance().EnableSourceLowLatency(); @@ -679,6 +680,11 @@ void DistributedInputSourceTransport::OnBytesReceived(int32_t sessionId, const v return; } +int32_t DistributedInputSourceTransport::GetCurrentSessionId() +{ + return sessionId_; +} + // send message by sessionId (channel opened) int32_t DistributedInputSourceTransport::SendMsg(int32_t sessionId, std::string &message) { diff --git a/utils/BUILD.gn b/utils/BUILD.gn index 0ef6f3e..dd26f99 100644 --- a/utils/BUILD.gn +++ b/utils/BUILD.gn @@ -28,11 +28,14 @@ ohos_shared_library("libdinput_utils") { "//third_party/json/include", "${fwk_interfaces_path}/include", "${fwk_interfaces_path}/include/ipc", + "${low_latency_path}/include", + "${dfx_utils_path}/include", ] sources = [ "src/dinput_context.cpp", "src/dinput_utils_tool.cpp", + "src/dinput_sa_process_state.cpp", ] defines = [ @@ -42,6 +45,8 @@ ohos_shared_library("libdinput_utils") { ] deps = [ + "${dfx_utils_path}:libdinput_dfx_utils", + "${low_latency_path}:libdinput_low_latency", "${fwk_utils_path}:distributedhardwareutils", "${fwk_interfaces_path}:libdhfwk_sdk", "//third_party/openssl:libcrypto_static", @@ -51,6 +56,7 @@ ohos_shared_library("libdinput_utils") { "dsoftbus:softbus_client", "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", + "hisysevent_native:libhisysevent", ] subsystem_name = "distributedhardware" diff --git a/utils/include/dinput_context.h b/utils/include/dinput_context.h index 452c568..fed1c24 100644 --- a/utils/include/dinput_context.h +++ b/utils/include/dinput_context.h @@ -69,6 +69,8 @@ struct LocalTouchScreenInfo { struct SrcScreenInfo { std::string devId = ""; // source device id + std::string uuid = ""; // source device uuid + int32_t sessionId = 0; // source device session id uint64_t sourceWinId = 0; // source projection window id uint32_t sourceWinWidth = 0; // source projection window width uint32_t sourceWinHeight = 0; // source projection window height diff --git a/common/include/dinput_sa_process_state.h b/utils/include/dinput_sa_process_state.h similarity index 100% rename from common/include/dinput_sa_process_state.h rename to utils/include/dinput_sa_process_state.h diff --git a/utils/include/dinput_utils_tool.h b/utils/include/dinput_utils_tool.h index 292f833..56cee5b 100644 --- a/utils/include/dinput_utils_tool.h +++ b/utils/include/dinput_utils_tool.h @@ -33,6 +33,7 @@ struct DevInfo { DevInfo GetLocalDeviceInfo(); std::string GetLocalNetworkId(); +std::string GetUUIDBySoftBus(const std::string &networkId); uint64_t GetCurrentTime(); std::string SetAnonyId(const std::string &message); /* IsString, IsUint32 and IsUint64 are used to valid json key */ diff --git a/common/include/dinput_sa_process_state.cpp b/utils/src/dinput_sa_process_state.cpp similarity index 94% rename from common/include/dinput_sa_process_state.cpp rename to utils/src/dinput_sa_process_state.cpp index 3683d7f..3c8caef 100644 --- a/common/include/dinput_sa_process_state.cpp +++ b/utils/src/dinput_sa_process_state.cpp @@ -31,8 +31,8 @@ enum DInputSAState : uint32_t { DINPUT_SA_EXIT_STATE_STOP = 1 }; -DInputSAState g_sinkSAState = DINPUT_SA_EXIT_STATE_START; -DInputSAState g_sourceSAState = DINPUT_SA_EXIT_STATE_START; +volatile DInputSAState g_sinkSAState = DINPUT_SA_EXIT_STATE_START; +volatile DInputSAState g_sourceSAState = DINPUT_SA_EXIT_STATE_START; std::mutex g_saProcessState; void SetSinkProcessExit() diff --git a/utils/src/dinput_utils_tool.cpp b/utils/src/dinput_utils_tool.cpp index 5f3ce52..97d00e6 100644 --- a/utils/src/dinput_utils_tool.cpp +++ b/utils/src/dinput_utils_tool.cpp @@ -61,6 +61,17 @@ std::string GetLocalNetworkId() return GetLocalDeviceInfo().networkId; } +std::string GetUUIDBySoftBus(const std::string &networkId) +{ + if (networkId.empty()) { + return ""; + } + char uuid[UUID_BUF_LEN] = {0}; + auto ret = GetNodeKeyInfo(DINPUT_PKG_NAME.c_str(), networkId.c_str(), NodeDeviceInfoKey::NODE_KEY_UUID, + reinterpret_cast(uuid), UUID_BUF_LEN); + return (ret == DH_SUCCESS) ? std::string(uuid) : ""; +} + uint64_t GetCurrentTime() { constexpr int32_t usOneSecond = 1000 * 1000;