mirror of
https://github.com/openharmony/distributedhardware_distributed_input.git
synced 2026-07-19 17:43:35 -04:00
分布式输入在DistributedInputSinkManager模块执行StopRemoteInput时,软总线通道异常断开,资源重置
Signed-off-by: wuqi0105 <wuqi100@h-partners.com>
This commit is contained in:
@@ -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
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user