diff --git a/services/common/include/dinput_sink_manager_callback.h b/services/common/include/dinput_sink_manager_callback.h new file mode 100644 index 0000000000000000000000000000000000000000..0d436cf4c9e1df9981be7b7fddcae57fb9227981 --- /dev/null +++ b/services/common/include/dinput_sink_manager_callback.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef DISTRIBUTED_SINK_MANAGER_CALLBACK_H +#define DISTRIBUTED_SINK_MANAGER_CALLBACK_H + +#include + +namespace OHOS { +namespace DistributedHardware { +namespace DistributedInput { +class DInputSinkManagerCallback { +public: + virtual void ResetSinkMgrResStatus() = 0; +}; +} // namespace DistributedInput +} // namespace DistributedHardware +} // namespace OHOS + +#endif // DISTRIBUTED_SINK_MANAGER_CALLBACK_H diff --git a/services/sink/sinkmanager/BUILD.gn b/services/sink/sinkmanager/BUILD.gn index 7ba1f32659d6b29051313bb109c0438c630532b9..2a8aa04b38deafe18dd8f9359ac8e4b24399216a 100644 --- a/services/sink/sinkmanager/BUILD.gn +++ b/services/sink/sinkmanager/BUILD.gn @@ -36,6 +36,7 @@ ohos_shared_library("libdinput_sink") { "${fwk_interfaces_path}/include", "${fwk_interfaces_path}/include/ipc", "${distributedinput_path}/services/state/include", + "${distributedinput_path}/services/transportbase/include", ] sources = [ @@ -54,6 +55,7 @@ ohos_shared_library("libdinput_sink") { deps = [ "${dfx_utils_path}:libdinput_dfx_utils", "${distributedinput_path}/services/state:libdinput_state", + "${distributedinput_path}/services/transportbase:libdinput_trans_base", "${innerkits_path}:libdinput_sdk", "${services_sink_path}/inputcollector:libdinput_collector", "${services_sink_path}/transport:libdinput_sink_trans", diff --git a/services/sink/sinkmanager/include/distributed_input_sink_manager.h b/services/sink/sinkmanager/include/distributed_input_sink_manager.h index e1ca3d5d58c105157f660556e28b631f7953eea1..f51a6d71cbd1cb8fec7561baa7c16eee5881bad7 100644 --- a/services/sink/sinkmanager/include/distributed_input_sink_manager.h +++ b/services/sink/sinkmanager/include/distributed_input_sink_manager.h @@ -34,6 +34,7 @@ #include "system_ability_status_change_stub.h" #include "constants_dinput.h" +#include "dinput_sink_manager_callback.h" #include "dinput_sink_trans_callback.h" #include "distributed_input_sink_stub.h" #include "distributed_input_sink_event_handler.h" @@ -53,6 +54,15 @@ public: DistributedInputSinkManager(int32_t saId, bool runOnCreate); ~DistributedInputSinkManager() override; + class DInputSinkMgrListener : public DInputSinkManagerCallback { + public: + explicit DInputSinkMgrListener(DistributedInputSinkManager *manager); + virtual ~DInputSinkMgrListener(); + void ResetSinkMgrResStatus() override; + private: + DistributedInputSinkManager *sinkManagerObj_; + }; + class DInputSinkListener : public DInputSinkTransCallback { public: explicit DInputSinkListener(DistributedInputSinkManager *manager); @@ -150,6 +160,8 @@ public: void QueryLocalWhiteList(nlohmann::json &jsonStr); + void ClearResourcesStatus(); + private: void CleanExceptionalInfo(const SrcScreenInfo &srcScreenInfo); void CallBackScreenInfoChange(); @@ -158,6 +170,7 @@ private: ServiceSinkRunningState serviceRunningState_ = ServiceSinkRunningState::STATE_NOT_START; DInputServerType isStartTrans_ = DInputServerType::NULL_SERVER_TYPE; std::shared_ptr statuslistener_; + std::shared_ptr sinkMgrListener_; std::set> getSinkScreenInfosCallbacks_; std::shared_ptr runner_; diff --git a/services/sink/sinkmanager/src/distributed_input_sink_manager.cpp b/services/sink/sinkmanager/src/distributed_input_sink_manager.cpp index afb209f83f2237b5c4aa2087e05a47d410dfcebb..d8d51db50dc6df357b55aa8d1c7240bf959f520d 100644 --- a/services/sink/sinkmanager/src/distributed_input_sink_manager.cpp +++ b/services/sink/sinkmanager/src/distributed_input_sink_manager.cpp @@ -32,6 +32,7 @@ #include "distributed_input_collector.h" #include "distributed_input_sink_switch.h" #include "distributed_input_sink_transport.h" +#include "distributed_input_transport_base.h" #include "dinput_context.h" #include "dinput_errcode.h" @@ -59,6 +60,28 @@ DistributedInputSinkManager::~DistributedInputSinkManager() projectWindowListener_ = nullptr; } +DistributedInputSinkManager::DInputSinkMgrListener::DInputSinkMgrListener(DistributedInputSinkManager *manager) +{ + sinkManagerObj_ = manager; + DHLOGI("DInputSinkMgrListener init."); +} + +DistributedInputSinkManager::DInputSinkMgrListener::~DInputSinkMgrListener() +{ + sinkManagerObj_ = nullptr; + DHLOGI("DInputSinkMgrListener destory."); +} + +void DistributedInputSinkManager::DInputSinkMgrListener::ResetSinkMgrResStatus() +{ + DHLOGI("DInputSinkMgrListener ResetSinkMgrResStatus."); + if (sinkManagerObj_ == nullptr) { + DHLOGE("ResetSinkMgrResStatus sinkManagerObj is null."); + return; + } + sinkManagerObj_->ClearResourcesStatus(); +} + DistributedInputSinkManager::DInputSinkListener::DInputSinkListener(DistributedInputSinkManager *manager) { sinkManagerObj_ = manager; @@ -95,6 +118,13 @@ void DistributedInputSinkManager::QueryLocalWhiteList(nlohmann::json &jsonStr) jsonStr[DINPUT_SOFTBUS_KEY_WHITE_LIST] = object; } +void DistributedInputSinkManager::ClearResourcesStatus() +{ + std::lock_guard lock(mutex_); + sharingDhIdsMap_.clear(); + sharingDhIds_.clear(); +} + void DistributedInputSinkManager::DInputSinkListener::OnPrepareRemoteInput( const int32_t &sessionId, const std::string &deviceId) { @@ -612,6 +642,9 @@ int32_t DistributedInputSinkManager::Init() statuslistener_ = std::make_shared(this); DistributedInputSinkTransport::GetInstance().RegistSinkRespCallback(statuslistener_); + sinkMgrListener_ = std::make_shared(this); + DistributedInputTransportBase::GetInstance().RegisterSinkManagerCallback(sinkMgrListener_); + serviceRunningState_ = ServiceSinkRunningState::STATE_RUNNING; std::shared_ptr dhFwkKit = DInputContext::GetInstance().GetDHFwkKit(); diff --git a/services/transportbase/include/distributed_input_transport_base.h b/services/transportbase/include/distributed_input_transport_base.h index cfba4e7a90b623e3a8443d44f05144a9534fb208..ea7568d62b8e81968b338ee259708c36951b0fff 100644 --- a/services/transportbase/include/distributed_input_transport_base.h +++ b/services/transportbase/include/distributed_input_transport_base.h @@ -30,6 +30,7 @@ #include "nlohmann/json.hpp" #include "securec.h" +#include "dinput_sink_manager_callback.h" #include "dinput_source_manager_callback.h" #include "dinput_transbase_source_callback.h" #include "dinput_transbase_sink_callback.h" @@ -51,6 +52,7 @@ public: void RegisterSrcHandleSessionCallback(std::shared_ptr callback); void RegisterSinkHandleSessionCallback(std::shared_ptr callback); void RegisterSourceManagerCallback(std::shared_ptr callback); + void RegisterSinkManagerCallback(std::shared_ptr callback); void RegisterSessionStateCb(sptr callback); void UnregisterSessionStateCb(); int32_t OnSessionOpened(int32_t sessionId, int32_t result); @@ -85,6 +87,7 @@ private: std::shared_ptr srcCallback_; std::shared_ptr sinkCallback_; std::shared_ptr srcMgrCallback_; + std::shared_ptr sinkMgrCallback_; sptr SessionStateCallback_; }; diff --git a/services/transportbase/src/distributed_input_transport_base.cpp b/services/transportbase/src/distributed_input_transport_base.cpp index 49cf6073139ffdf01a629f97a878f111e3486606..581e81564c4e083ca604cfee9f84f4c9ebd708df 100644 --- a/services/transportbase/src/distributed_input_transport_base.cpp +++ b/services/transportbase/src/distributed_input_transport_base.cpp @@ -286,6 +286,13 @@ void DistributedInputTransportBase::RegisterSourceManagerCallback( srcMgrCallback_ = callback; } +void DistributedInputTransportBase::RegisterSinkManagerCallback( + std::shared_ptr callback) +{ + DHLOGI("RegisterSourceManagerCallback"); + sinkMgrCallback_ = callback; +} + void DistributedInputTransportBase::RegisterSessionStateCb(sptr callback) { DHLOGI("RegisterSessionStateCb"); @@ -411,6 +418,12 @@ void DistributedInputTransportBase::OnSessionClosed(int32_t sessionId) return; } srcMgrCallback_->ResetSrcMgrResStatus(); + + if (sinkMgrCallback_ == nullptr) { + DHLOGE("sinkMgrCallback is nullptr."); + return; + } + sinkMgrCallback_->ResetSinkMgrResStatus(); } }