分布式输入在DistributedInputSinkManager模块执行StopRemoteInput时,软总线通道异常断开,资源重置

Signed-off-by: wuqi0105 <wuqi100@h-partners.com>
This commit is contained in:
wuqi0105
2023-09-07 11:27:07 +08:00
parent fb9f7fddc4
commit 7009913817
6 changed files with 96 additions and 0 deletions
@@ -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 <string>
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
+2
View File
@@ -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",
@@ -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<DistributedInputSinkManager::DInputSinkListener> statuslistener_;
std::shared_ptr<DistributedInputSinkManager::DInputSinkMgrListener> sinkMgrListener_;
std::set<sptr<IGetSinkScreenInfosCallback>> getSinkScreenInfosCallbacks_;
std::shared_ptr<AppExecFwk::EventRunner> runner_;
@@ -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<std::mutex> 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<DInputSinkListener>(this);
DistributedInputSinkTransport::GetInstance().RegistSinkRespCallback(statuslistener_);
sinkMgrListener_ = std::make_shared<DInputSinkMgrListener>(this);
DistributedInputTransportBase::GetInstance().RegisterSinkManagerCallback(sinkMgrListener_);
serviceRunningState_ = ServiceSinkRunningState::STATE_RUNNING;
std::shared_ptr<DistributedHardwareFwkKit> dhFwkKit = DInputContext::GetInstance().GetDHFwkKit();
@@ -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<DInputTransbaseSourceCallback> callback);
void RegisterSinkHandleSessionCallback(std::shared_ptr<DInputTransbaseSinkCallback> callback);
void RegisterSourceManagerCallback(std::shared_ptr<DInputSourceManagerCallback> callback);
void RegisterSinkManagerCallback(std::shared_ptr<DInputSinkManagerCallback> callback);
void RegisterSessionStateCb(sptr<ISessionStateCallback> callback);
void UnregisterSessionStateCb();
int32_t OnSessionOpened(int32_t sessionId, int32_t result);
@@ -85,6 +87,7 @@ private:
std::shared_ptr<DInputTransbaseSourceCallback> srcCallback_;
std::shared_ptr<DInputTransbaseSinkCallback> sinkCallback_;
std::shared_ptr<DInputSourceManagerCallback> srcMgrCallback_;
std::shared_ptr<DInputSinkManagerCallback> sinkMgrCallback_;
sptr<ISessionStateCallback> SessionStateCallback_;
};
@@ -286,6 +286,13 @@ void DistributedInputTransportBase::RegisterSourceManagerCallback(
srcMgrCallback_ = callback;
}
void DistributedInputTransportBase::RegisterSinkManagerCallback(
std::shared_ptr<DInputSinkManagerCallback> callback)
{
DHLOGI("RegisterSourceManagerCallback");
sinkMgrCallback_ = callback;
}
void DistributedInputTransportBase::RegisterSessionStateCb(sptr<ISessionStateCallback> 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();
}
}