1 /*
2  * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "distributed_input_source_manager.h"
17 
18 #include "if_system_ability_manager.h"
19 #include "iservice_registry.h"
20 #include "nlohmann/json.hpp"
21 #include "system_ability_definition.h"
22 #include "string_ex.h"
23 #include <unistd.h>
24 
25 #include "distributed_hardware_fwk_kit.h"
26 #include "ipublisher_listener.h"
27 
28 #include "constants_dinput.h"
29 #include "dinput_errcode.h"
30 #include "dinput_hitrace.h"
31 #include "dinput_log.h"
32 #include "dinput_utils_tool.h"
33 #include "distributed_input_client.h"
34 #include "distributed_input_inject.h"
35 #include "distributed_input_source_proxy.h"
36 #include "distributed_input_source_transport.h"
37 #include "distributed_input_transport_base.h"
38 #include "dinput_softbus_define.h"
39 #include "xcollie/watchdog.h"
40 #include "hisysevent_util.h"
41 #include "hidumper.h"
42 #include "input_check_param.h"
43 #include "white_list_util.h"
44 
45 namespace OHOS {
46 namespace DistributedHardware {
47 namespace DistributedInput {
48 namespace {
49     constexpr int32_t RAND_NUM_MIN = 0;
50     constexpr int32_t RAND_NUM_MAX = 20;
51     constexpr int32_t US_PER_MS = 1000;
52 }
53 REGISTER_SYSTEM_ABILITY_BY_ID(DistributedInputSourceManager, DISTRIBUTED_HARDWARE_INPUT_SOURCE_SA_ID, true);
54 
DistributedInputSourceManager(int32_t saId,bool runOnCreate)55 DistributedInputSourceManager::DistributedInputSourceManager(int32_t saId, bool runOnCreate)
56     : SystemAbility(saId, runOnCreate)
57 {
58     DHLOGI("DistributedInputSourceManager ctor!");
59 }
60 
~DistributedInputSourceManager()61 DistributedInputSourceManager::~DistributedInputSourceManager()
62 {
63     DHLOGI("DistributedInputSourceManager dtor!");
64     startDScreenListener_ = nullptr;
65     stopDScreenListener_ = nullptr;
66 }
67 
DInputSrcMgrListener(DistributedInputSourceManager * manager)68 DistributedInputSourceManager::DInputSrcMgrListener::DInputSrcMgrListener(DistributedInputSourceManager *manager)
69 {
70     sourceManagerObj_ = manager;
71     DHLOGI("DInputSrcMgrListener init.");
72 }
73 
~DInputSrcMgrListener()74 DistributedInputSourceManager::DInputSrcMgrListener::~DInputSrcMgrListener()
75 {
76     sourceManagerObj_ = nullptr;
77     DHLOGI("DInputSrcMgrListener destory.");
78 }
79 
ResetSrcMgrResStatus()80 void DistributedInputSourceManager::DInputSrcMgrListener::ResetSrcMgrResStatus()
81 {
82     DHLOGI("DInputSrcMgrListener ResetSrcMgrResStatus.");
83     if (sourceManagerObj_ == nullptr) {
84         DHLOGE("ResetSrcMgrResStatus sourceManagerObj is null.");
85         return;
86     }
87     sourceManagerObj_->ClearResourcesStatus();
88 }
89 
OnStart()90 void DistributedInputSourceManager::OnStart()
91 {
92     if (serviceRunningState_ == ServiceSourceRunningState::STATE_RUNNING) {
93         DHLOGI("dinput Manager Service has already started.");
94         return;
95     }
96     DHLOGI("dinput Manager Service started.");
97     if (!InitAuto()) {
98         DHLOGI("failed to init service.");
99         return;
100     }
101     serviceRunningState_ = ServiceSourceRunningState::STATE_RUNNING;
102     runner_->Run();
103 
104     /*
105 	 * Publish service maybe failed, so we need call this function at the last,
106      * so it can't affect the TDD test program.
107      */
108     bool ret = Publish(this);
109     if (!ret) {
110         return;
111     }
112     DHLOGI("DistributedInputSourceManager start success.");
113 }
114 
InitAuto()115 bool DistributedInputSourceManager::InitAuto()
116 {
117     runner_ = AppExecFwk::EventRunner::Create(true);
118     if (runner_ == nullptr) {
119         return false;
120     }
121     handler_ = std::make_shared<DistributedInputSourceEventHandler>(runner_);
122 
123     DHLOGI("init success");
124     std::shared_ptr<AppExecFwk::EventRunner> runner = AppExecFwk::EventRunner::Create(true);
125     callBackHandler_ = std::make_shared<DInputSourceManagerEventHandler>(runner, this);
126 
127     if (OHOS::HiviewDFX::Watchdog::GetInstance().AddThread("dinputsourcewatchdog", callBackHandler_,
128         WATCHDOG_INTERVAL_TIME_MS)) {
129         DHLOGE("HiviewDFX::Watchdog::GetInstance().AddThread() Failed.");
130     }
131     return true;
132 }
133 
OnStop()134 void DistributedInputSourceManager::OnStop()
135 {
136     DHLOGI("stop service");
137     runner_.reset();
138     handler_.reset();
139     serviceRunningState_ = ServiceSourceRunningState::STATE_NOT_START;
140 }
141 
Init()142 int32_t DistributedInputSourceManager::Init()
143 {
144     DHLOGI("enter");
145     isStartTrans_ = DInputServerType::NULL_SERVER_TYPE;
146 
147     // transport init session
148     int32_t ret = DistributedInputSourceTransport::GetInstance().Init();
149     if (ret != DH_SUCCESS) {
150         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_INIT_FAIL;
151     }
152 
153     statuslistener_ = std::make_shared<DInputSourceListener>(this);
154     DistributedInputSourceTransport::GetInstance().RegisterSourceRespCallback(statuslistener_);
155     srcMgrListener_ = std::make_shared<DInputSrcMgrListener>(this);
156     DistributedInputTransportBase::GetInstance().RegisterSourceManagerCallback(srcMgrListener_);
157 
158     serviceRunningState_ = ServiceSourceRunningState::STATE_RUNNING;
159     std::shared_ptr<DistributedHardwareFwkKit> dhFwkKit = DInputContext::GetInstance().GetDHFwkKit();
160     if (dhFwkKit == nullptr) {
161         DHLOGE("dhFwkKit obtain fail!");
162         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_INIT_FAIL;
163     }
164     startDScreenListener_ = new(std::nothrow) StartDScreenListener;
165     stopDScreenListener_ = new(std::nothrow) StopDScreenListener;
166     deviceOfflineListener_ = new(std::nothrow) DeviceOfflineListener(this);
167     dhFwkKit->RegisterPublisherListener(DHTopic::TOPIC_START_DSCREEN, startDScreenListener_);
168     dhFwkKit->RegisterPublisherListener(DHTopic::TOPIC_STOP_DSCREEN, stopDScreenListener_);
169     dhFwkKit->RegisterPublisherListener(DHTopic::TOPIC_DEV_OFFLINE, deviceOfflineListener_);
170 
171     return DH_SUCCESS;
172 }
173 
Release()174 int32_t DistributedInputSourceManager::Release()
175 {
176     DHLOGI("Release source manager.");
177     for (auto iter = inputDevice_.begin(); iter != inputDevice_.end(); ++iter) {
178         std::string devId = iter->devId;
179         std::string dhId = iter->dhId;
180         DHLOGI("Release devId: %{public}s, dhId: %{public}s.", GetAnonyString(devId).c_str(),
181             GetAnonyString(dhId).c_str());
182         int32_t ret = DistributedInputInject::GetInstance().UnregisterDistributedHardware(devId, dhId);
183         if (ret != DH_SUCCESS) {
184             DHLOGE("DinputSourceManager Release called, remove node fail.");
185         }
186     }
187     DistributedInputSourceTransport::GetInstance().Release();
188     inputDevice_.clear();
189     DeviceMap_.clear();
190     InputTypesMap_.clear();
191 
192     std::shared_ptr<nlohmann::json> jsonArrayMsg = std::make_shared<nlohmann::json>();
193     nlohmann::json tmpJson;
194     tmpJson[INPUT_SOURCEMANAGER_KEY_RESULT] = static_cast<int32_t>(DInputServerType::NULL_SERVER_TYPE);
195     jsonArrayMsg->push_back(tmpJson);
196     AppExecFwk::InnerEvent::Pointer msgEvent = AppExecFwk::InnerEvent::Get(
197         DINPUT_SOURCE_MANAGER_STARTSERVER_MSG, jsonArrayMsg, 0);
198     if (callBackHandler_ != nullptr) {
199         DHLOGI("Sourcemanager send event success.");
200         callBackHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
201     }
202     serviceRunningState_ = ServiceSourceRunningState::STATE_NOT_START;
203     UnregisterDHFwkPublisher();
204 
205     HisyseventUtil::GetInstance().SysEventWriteBehavior(DINPUT_EXIT, "dinput source sa exit success.");
206     auto systemAbilityMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
207     if (systemAbilityMgr == nullptr) {
208         DHLOGE("Failed to get SystemAbilityManager.");
209         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_RELEASE_FAIL;
210     }
211     int32_t ret = systemAbilityMgr->UnloadSystemAbility(DISTRIBUTED_HARDWARE_INPUT_SOURCE_SA_ID);
212     if (ret != DH_SUCCESS) {
213         DHLOGE("Failed to UnloadSystemAbility service! errcode: %{public}d.", ret);
214         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_RELEASE_FAIL;
215     }
216     DHLOGI("Source unloadSystemAbility successfully.");
217     return DH_SUCCESS;
218 }
219 
UnregisterDHFwkPublisher()220 void DistributedInputSourceManager::UnregisterDHFwkPublisher()
221 {
222     std::shared_ptr<DistributedHardwareFwkKit> dhFwkKit = DInputContext::GetInstance().GetDHFwkKit();
223     if (dhFwkKit != nullptr && startDScreenListener_ != nullptr) {
224         DHLOGI("UnPublish StartDScreenListener");
225         dhFwkKit->UnregisterPublisherListener(DHTopic::TOPIC_START_DSCREEN, startDScreenListener_);
226     }
227     if (dhFwkKit != nullptr && stopDScreenListener_ != nullptr) {
228         DHLOGI("UnPublish StopDScreenListener");
229         dhFwkKit->UnregisterPublisherListener(DHTopic::TOPIC_STOP_DSCREEN, stopDScreenListener_);
230     }
231     if (dhFwkKit != nullptr && deviceOfflineListener_ != nullptr) {
232         DHLOGI("UnPublish DeviceOfflineListener");
233         dhFwkKit->UnregisterPublisherListener(DHTopic::TOPIC_DEV_OFFLINE, deviceOfflineListener_);
234     }
235     if (dhFwkKit != nullptr) {
236         DHLOGD("Disable low Latency!");
237         dhFwkKit->PublishMessage(DHTopic::TOPIC_LOW_LATENCY, DISABLE_LOW_LATENCY.dump());
238     }
239 }
240 
CheckRegisterParam(const std::string & devId,const std::string & dhId,const std::string & parameters,sptr<IRegisterDInputCallback> callback)241 bool DistributedInputSourceManager::CheckRegisterParam(const std::string &devId, const std::string &dhId,
242     const std::string &parameters, sptr<IRegisterDInputCallback> callback)
243 {
244     if (devId.empty() || devId.size() > DEV_ID_LENGTH_MAX) {
245         DHLOGE("CheckParam devId is empty or devId size too long.");
246         return false;
247     }
248     if (dhId.empty() || dhId.size() > DEV_ID_LENGTH_MAX) {
249         DHLOGE("CheckParam dhId is empty or dhId size too long.");
250         return false;
251     }
252     if (parameters.empty()) {
253         DHLOGE("CheckParam parameters is empty.");
254         return false;
255     }
256     if (callback == nullptr) {
257         DHLOGE("CheckParam callback is null.");
258         return false;
259     }
260     return true;
261 }
262 
RegisterDistributedHardware(const std::string & devId,const std::string & dhId,const std::string & parameters,sptr<IRegisterDInputCallback> callback)263 int32_t DistributedInputSourceManager::RegisterDistributedHardware(const std::string &devId, const std::string &dhId,
264     const std::string &parameters, sptr<IRegisterDInputCallback> callback)
265 {
266     HisyseventUtil::GetInstance().SysEventWriteBehavior(DINPUT_REGISTER, devId, dhId, "dinput register call.");
267     if (!CheckRegisterParam(devId, dhId, parameters, callback)) {
268         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_REGISTER_FAIL, devId, dhId,
269             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_REGISTER_FAIL, "Dinputregister failed callback is nullptr.");
270         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_REGISTER_FAIL;
271     }
272     DHLOGI("RegisterDistributedHardware called, deviceId: %{public}s, dhId: %{public}s, parameters: %{public}s",
273         GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str(), SetAnonyId(parameters).c_str());
274     int32_t randNumber = GetRandomInt32(RAND_NUM_MIN, RAND_NUM_MAX);
275     usleep(randNumber * US_PER_MS);
276 
277     std::lock_guard<std::mutex> lock(regDisHardwareMutex_);
278     DInputClientRegistInfo info {devId, dhId, callback};
279     regCallbacks_.push_back(info);
280     InputDeviceId inputDeviceId {devId, dhId, GetNodeDesc(parameters)};
281 
282     // 1.Find out if the dh exists
283     auto it  = std::find(inputDevice_.begin(), inputDevice_.end(), inputDeviceId);
284     if (it != inputDevice_.end()) {
285         callback->OnResult(devId, dhId, DH_SUCCESS);
286         return DH_SUCCESS;
287     }
288 
289     // 2.create input node
290     int32_t ret = DistributedInputInject::GetInstance().RegisterDistributedHardware(devId, dhId, parameters);
291     if (ret != DH_SUCCESS) {
292         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_REGISTER_FAIL, devId, dhId,
293             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_REGISTER_FAIL, "Dinputregister failed in create input node.");
294         DHLOGE("RegisterDistributedHardware called, create node fail.");
295 
296         for (auto iter = regCallbacks_.begin(); iter != regCallbacks_.end(); ++iter) {
297             if (iter->devId == devId && iter->dhId == dhId) {
298                 iter->callback->OnResult(iter->devId, iter->dhId, ERR_DH_INPUT_SERVER_SOURCE_MANAGER_REGISTER_FAIL);
299                 regCallbacks_.erase(iter);
300                 return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_REGISTER_FAIL;
301             }
302         }
303         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_REGISTER_FAIL;
304     }
305 
306     // 3.save device
307     DHLOGI("inputDevice push deviceId: %{public}s, dhId: %{public}s", GetAnonyString(inputDeviceId.devId).c_str(),
308         GetAnonyString(inputDeviceId.dhId).c_str());
309     inputDevice_.push_back(inputDeviceId);
310 
311     // 4.notify source distributedfwk register hardware success
312     callback->OnResult(devId, dhId, DH_SUCCESS);
313 
314     // 5. Notify node mgr to scan vir dev node info
315     DistributedInputInject::GetInstance().NotifyNodeMgrScanVirNode(devId, dhId);
316     return DH_SUCCESS;
317 }
318 
handleStartServerCallback(const std::string & devId)319 void DistributedInputSourceManager::handleStartServerCallback(const std::string &devId)
320 {
321     bool isFindDevice = false;
322     for (auto iter = inputDevice_.begin(); iter != inputDevice_.end(); ++iter) {
323         if (devId == iter->devId) {
324             isFindDevice = true;
325             break;
326         }
327     }
328     if (!isFindDevice) {
329         DeviceMap_[devId] = DINPUT_SOURCE_SWITCH_OFF;
330         // DeviceMap_ all sink device switch is off,call isstart's callback
331         bool isAllDevSwitchOff = true;
332         for (auto it = DeviceMap_.begin(); it != DeviceMap_.end(); ++it) {
333             if (it->second == DINPUT_SOURCE_SWITCH_ON) {
334                 isAllDevSwitchOff = false;
335                 break;
336             }
337         }
338         if (isAllDevSwitchOff) {
339             std::shared_ptr<nlohmann::json> jsonArrayMsg = std::make_shared<nlohmann::json>();
340             nlohmann::json tmpJson;
341             tmpJson[INPUT_SOURCEMANAGER_KEY_RESULT] = static_cast<int32_t>(DInputServerType::NULL_SERVER_TYPE);
342             jsonArrayMsg->push_back(tmpJson);
343             AppExecFwk::InnerEvent::Pointer msgEvent = AppExecFwk::InnerEvent::Get(
344                 DINPUT_SOURCE_MANAGER_STARTSERVER_MSG, jsonArrayMsg, 0);
345 
346             if (callBackHandler_ == nullptr) {
347                 DHLOGE("handleStartServerCallback callBackHandler_ is null.");
348                 return;
349             }
350             callBackHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
351         }
352     }
353 }
354 
UnregCallbackNotify(const std::string & devId,const std::string & dhId)355 int32_t DistributedInputSourceManager::UnregCallbackNotify(const std::string &devId, const std::string &dhId)
356 {
357     for (auto iter = unregCallbacks_.begin(); iter != unregCallbacks_.end(); ++iter) {
358         if (iter->devId == devId && iter->dhId == dhId) {
359             iter->callback->OnResult(iter->devId, iter->dhId, ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNREGISTER_FAIL);
360             unregCallbacks_.erase(iter);
361             return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNREGISTER_FAIL;
362         }
363     }
364     return DH_SUCCESS;
365 }
366 
CheckUnregisterParam(const std::string & devId,const std::string & dhId,sptr<IUnregisterDInputCallback> callback)367 bool DistributedInputSourceManager::CheckUnregisterParam(const std::string &devId, const std::string &dhId,
368     sptr<IUnregisterDInputCallback> callback)
369 {
370     if (devId.empty() || devId.size() > DEV_ID_LENGTH_MAX) {
371         DHLOGE("CheckParam devId is empty or devId size too long.");
372         return false;
373     }
374     if (dhId.empty() || dhId.size() > DEV_ID_LENGTH_MAX) {
375         DHLOGE("CheckParam dhId is empty or dhId size too long.");
376         return false;
377     }
378     if (callback == nullptr) {
379         DHLOGE("CheckParam callback is null.");
380         return false;
381     }
382     return true;
383 }
384 
CheckDeviceIsExists(const std::string & devId,const std::string & dhId,const InputDeviceId & inputDeviceId,std::vector<InputDeviceId>::iterator & it)385 int32_t DistributedInputSourceManager::CheckDeviceIsExists(const std::string &devId, const std::string &dhId,
386     const InputDeviceId &inputDeviceId, std::vector<InputDeviceId>::iterator &it)
387 {
388     for (; it != inputDevice_.end(); ++it) {
389         if (it->devId == inputDeviceId.devId && it->dhId == inputDeviceId.dhId) {
390             break;
391         }
392     }
393 
394     if (it == inputDevice_.end()) {
395         DHLOGE("CheckDevice called, deviceId: %{public}s is not exist.", GetAnonyString(devId).c_str());
396         if (UnregCallbackNotify(devId, dhId) != DH_SUCCESS) {
397             return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNREGISTER_FAIL;
398         }
399         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNREGISTER_FAIL;
400     }
401     return DH_SUCCESS;
402 }
403 
DeleteInputDeviceNodeInfo(const std::string & devId,const std::string & dhId,const std::vector<InputDeviceId>::iterator & it)404 int32_t DistributedInputSourceManager::DeleteInputDeviceNodeInfo(const std::string &devId, const std::string &dhId,
405     const std::vector<InputDeviceId>::iterator &it)
406 {
407     int32_t ret = DistributedInputInject::GetInstance().UnregisterDistributedHardware(devId, dhId);
408     if (ret != DH_SUCCESS) {
409         DHLOGE("RemoveInputNode called, remove node fail.");
410         if (UnregCallbackNotify(devId, dhId) != DH_SUCCESS) {
411             return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNREGISTER_FAIL;
412         }
413         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_REMOVE_INPUT_NODE_FAIL;
414     }
415 
416     inputDevice_.erase(it);
417     std::shared_ptr<nlohmann::json> jsonArrayMsg = std::make_shared<nlohmann::json>();
418     nlohmann::json tmpJson;
419     tmpJson[INPUT_SOURCEMANAGER_KEY_DEVID] = devId;
420     tmpJson[INPUT_SOURCEMANAGER_KEY_HWID] = dhId;
421     tmpJson[INPUT_SOURCEMANAGER_KEY_RESULT] = true;
422     jsonArrayMsg->push_back(tmpJson);
423     AppExecFwk::InnerEvent::Pointer msgEvent = AppExecFwk::InnerEvent::Get(
424         DINPUT_SOURCE_MANAGER_UNRIGISTER_MSG, jsonArrayMsg, 0);
425 
426     if (callBackHandler_ == nullptr) {
427         DHLOGE("UnregisterDistributedHardware callBackHandler_ is null.");
428         if (UnregCallbackNotify(devId, dhId) != DH_SUCCESS) {
429             return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNREGISTER_FAIL;
430         }
431         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_DELETE_DEVICE_FAIL;
432     }
433     callBackHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
434     return DH_SUCCESS;
435 }
436 
UnregisterDistributedHardware(const std::string & devId,const std::string & dhId,sptr<IUnregisterDInputCallback> callback)437 int32_t DistributedInputSourceManager::UnregisterDistributedHardware(const std::string &devId, const std::string &dhId,
438     sptr<IUnregisterDInputCallback> callback)
439 {
440     HisyseventUtil::GetInstance().SysEventWriteBehavior(DINPUT_UNREGISTER, devId, dhId, "dinput unregister call");
441     if (!CheckUnregisterParam(devId, dhId, callback)) {
442         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_UNREGISTER_FAIL, devId, dhId,
443             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNREGISTER_FAIL, "dinput unregister failed in callback is nullptr");
444         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNREGISTER_FAIL;
445     }
446     DHLOGI("Unregister called, deviceId: %{public}s,  dhId: %{public}s", GetAnonyString(devId).c_str(),
447         GetAnonyString(dhId).c_str());
448     std::lock_guard<std::mutex> lock(regDisHardwareMutex_);
449     DInputClientUnregistInfo info {devId, dhId, callback};
450     unregCallbacks_.push_back(info);
451 
452     InputDeviceId inputDeviceId {devId, dhId};
453     auto it = inputDevice_.begin();
454     if (CheckDeviceIsExists(devId, dhId, inputDeviceId, it) != DH_SUCCESS) {
455         DHLOGE("Unregister deviceId: %{public}s is not exist.", GetAnonyString(devId).c_str());
456         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_UNREGISTER_FAIL, devId, dhId,
457             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNREGISTER_FAIL, "dinput unregister failed in deviceId is not exist");
458         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNREGISTER_FAIL;
459     }
460 
461     if (DeleteInputDeviceNodeInfo(devId, dhId, it) != DH_SUCCESS) {
462         DHLOGE("Unregister deviceId: %{public}s, delete device node failed", GetAnonyString(devId).c_str());
463         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_UNREGISTER_FAIL, devId, dhId,
464             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNREGISTER_FAIL, "dinput unregister failed in delete input node");
465         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNREGISTER_FAIL;
466     }
467 
468     HiDumper::GetInstance().DeleteNodeInfo(devId, dhId);
469 
470     // isstart callback
471     handleStartServerCallback(devId);
472     return DH_SUCCESS;
473 }
474 
PrepareRemoteInput(const std::string & deviceId,sptr<IPrepareDInputCallback> callback)475 int32_t DistributedInputSourceManager::PrepareRemoteInput(
476     const std::string &deviceId, sptr<IPrepareDInputCallback> callback)
477 {
478     StartAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_PREPARE_START, DINPUT_PREPARE_TASK);
479     HisyseventUtil::GetInstance().SysEventWriteBehavior(DINPUT_PREPARE, deviceId, "Dinput prepare call.");
480     if (!DInputCheckParam::GetInstance().CheckParam(deviceId, callback)) {
481         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, deviceId,
482             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_PREPARE_FAIL, "Dinput prepare param is failed.");
483         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_PREPARE_START, DINPUT_PREPARE_TASK);
484         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_PREPARE_FAIL;
485     }
486 
487     DHLOGI("Prepare called, deviceId: %{public}s", GetAnonyString(deviceId).c_str());
488     int32_t ret = DistributedInputSourceTransport::GetInstance().OpenInputSoftbus(deviceId, false);
489     if (ret != DH_SUCCESS) {
490         DHLOGE("Open softbus session fail, ret: %{public}d", ret);
491         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, deviceId,
492             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_PREPARE_FAIL, "Dinput prepare failed in open softbus");
493         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_PREPARE_START, DINPUT_PREPARE_TASK);
494         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_PREPARE_FAIL;
495     }
496 
497     DInputClientPrepareInfo info {deviceId, callback};
498     AddPrepareCallbacks(info);
499 
500     ret = DistributedInputSourceTransport::GetInstance().PrepareRemoteInput(deviceId);
501     if (ret != DH_SUCCESS) {
502         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, deviceId,
503             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_PREPARE_FAIL, "Dinput prepare failed in transport prepare");
504         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_PREPARE_START, DINPUT_PREPARE_TASK);
505         DHLOGE("Can not send message by softbus, prepare fail, ret: %{public}d", ret);
506         info.preCallback->OnResult(deviceId, ERR_DH_INPUT_SERVER_SOURCE_MANAGER_PREPARE_FAIL);
507         RemovePrepareCallbacks(info);
508         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_PREPARE_FAIL;
509     }
510     return DH_SUCCESS;
511 }
512 
UnprepareRemoteInput(const std::string & deviceId,sptr<IUnprepareDInputCallback> callback)513 int32_t DistributedInputSourceManager::UnprepareRemoteInput(
514     const std::string &deviceId, sptr<IUnprepareDInputCallback> callback)
515 {
516     StartAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_UNPREPARE_START, DINPUT_UNPREPARE_TASK);
517     HisyseventUtil::GetInstance().SysEventWriteBehavior(DINPUT_UNPREPARE, deviceId, "Dinput unprepare call.");
518     if (!DInputCheckParam::GetInstance().CheckParam(deviceId, callback)) {
519         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, deviceId,
520             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNPREPARE_FAIL, "Dinput unprepare param is failed.");
521         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_UNPREPARE_START, DINPUT_UNPREPARE_TASK);
522         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNPREPARE_FAIL;
523     }
524     DHLOGI("Unprepare called, deviceId: %{public}s", GetAnonyString(deviceId).c_str());
525     DInputClientUnprepareInfo info {deviceId, callback};
526     AddUnPrepareCallbacks(info);
527     int32_t ret = DistributedInputSourceTransport::GetInstance().UnprepareRemoteInput(deviceId);
528     if (ret != DH_SUCCESS) {
529         DHLOGE("Can not send message by softbus, unprepare fail, ret: %{public}d", ret);
530         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, deviceId,
531             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNPREPARE_FAIL, "Dinput unprepare failed in transport unprepare.");
532         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_UNPREPARE_START, DINPUT_UNPREPARE_TASK);
533         info.unpreCallback->OnResult(deviceId, ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNPREPARE_FAIL);
534         RemoveUnPrepareCallbacks(info);
535         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNPREPARE_FAIL;
536     }
537     return DH_SUCCESS;
538 }
539 
StartRemoteInput(const std::string & deviceId,const uint32_t & inputTypes,sptr<IStartDInputCallback> callback)540 int32_t DistributedInputSourceManager::StartRemoteInput(
541     const std::string &deviceId, const uint32_t &inputTypes, sptr<IStartDInputCallback> callback)
542 {
543     StartAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_START_START, DINPUT_START_TASK);
544     HisyseventUtil::GetInstance().SysEventWriteBehavior(DINPUT_START_USE, deviceId, "Dinput start use call.");
545     if (!DInputCheckParam::GetInstance().CheckParam(deviceId, inputTypes, callback)) {
546         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, deviceId,
547             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL, "Dinput start param is failed.");
548         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_START_START, DINPUT_START_TASK);
549         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
550     }
551 
552     DHLOGI("Start called, deviceId: %{public}s, inputTypes: %{public}d", GetAnonyString(deviceId).c_str(), inputTypes);
553     std::lock_guard<std::mutex> startlock(startMutex_);
554     for (auto iter : staCallbacks_) {
555         if (iter.devId == deviceId && iter.inputTypes == inputTypes) {
556             callback->OnResult(deviceId, inputTypes, ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL);
557             HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, deviceId,
558                 ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL, "Dinput start use failed in already started.");
559             FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_START_START, DINPUT_START_TASK);
560             return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
561         }
562     }
563 
564     DInputClientStartInfo info {deviceId, inputTypes, callback};
565     staCallbacks_.push_back(info);
566     DeviceMap_[deviceId] = DINPUT_SOURCE_SWITCH_OFF;
567     int32_t ret = DistributedInputSourceTransport::GetInstance().StartRemoteInput(deviceId, inputTypes);
568     if (ret != DH_SUCCESS) {
569         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, deviceId,
570             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL, "Dinput start use failed in transport start");
571         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_START_START, DINPUT_START_TASK);
572         DHLOGE("Start fail.");
573         for (auto iter = staCallbacks_.begin(); iter != staCallbacks_.end(); ++iter) {
574             if (iter->devId == deviceId && iter->inputTypes == inputTypes) {
575                 iter->callback->OnResult(iter->devId, iter->inputTypes, ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL);
576                 staCallbacks_.erase(iter);
577                 return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
578             }
579         }
580         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
581     }
582     return DH_SUCCESS;
583 }
584 
StopRemoteInput(const std::string & deviceId,const uint32_t & inputTypes,sptr<IStopDInputCallback> callback)585 int32_t DistributedInputSourceManager::StopRemoteInput(
586     const std::string &deviceId, const uint32_t &inputTypes, sptr<IStopDInputCallback> callback)
587 {
588     StartAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
589     HisyseventUtil::GetInstance().SysEventWriteBehavior(DINPUT_STOP_USE, deviceId, "Dinput stop use call");
590     if (!DInputCheckParam::GetInstance().CheckParam(deviceId, inputTypes, callback)) {
591         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, deviceId,
592             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL, "Dinput stop param is failed.");
593         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_START_START, DINPUT_START_TASK);
594         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
595     }
596 
597     DHLOGI("Stop called, deviceId: %{public}s, inputTypes: %{public}d", GetAnonyString(deviceId).c_str(), inputTypes);
598     std::lock_guard<std::mutex> stoplock(stopMutex_);
599     for (auto iter : stpCallbacks_) {
600         if (iter.devId == deviceId && iter.inputTypes == inputTypes) {
601             callback->OnResult(deviceId, inputTypes, ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL);
602             HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, deviceId,
603                 ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL, "Dinput stop use failed in already stoped.");
604             FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
605             return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
606         }
607     }
608 
609     DInputClientStopInfo info {deviceId, inputTypes, callback};
610     stpCallbacks_.push_back(info);
611     int32_t ret = DistributedInputSourceTransport::GetInstance().StopRemoteInput(deviceId, inputTypes);
612     if (ret != DH_SUCCESS) {
613         DHLOGE("Stop fail.");
614         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, deviceId,
615             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL, "Dinput stop use failed in transport stop.");
616         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
617         for (auto iter = stpCallbacks_.begin(); iter != stpCallbacks_.end(); ++iter) {
618             if (iter->devId == deviceId && iter->inputTypes == inputTypes) {
619                 iter->callback->OnResult(iter->devId, iter->inputTypes, ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL);
620                 stpCallbacks_.erase(iter);
621                 return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
622             }
623         }
624         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
625     }
626     return DH_SUCCESS;
627 }
628 
StartRemoteInput(const std::string & srcId,const std::string & sinkId,const uint32_t & inputTypes,sptr<IStartDInputCallback> callback)629 int32_t DistributedInputSourceManager::StartRemoteInput(const std::string &srcId, const std::string &sinkId,
630     const uint32_t &inputTypes, sptr<IStartDInputCallback> callback)
631 {
632     StartAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_START_START, DINPUT_START_TASK);
633     HisyseventUtil::GetInstance().SysEventWriteBehavior(DINPUT_START_USE, sinkId, "Dinput start use call.");
634     if (!DInputCheckParam::GetInstance().CheckParam(srcId, sinkId, inputTypes, callback)) {
635         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
636             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL, "Dinput start param is failed.");
637         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
638         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
639     }
640 
641     DHLOGI("StartRemoteInput called, srcId: %{public}s, sinkId: %{public}s, inputTypes: %{public}d",
642         GetAnonyString(srcId).c_str(), GetAnonyString(sinkId).c_str(), inputTypes);
643     std::string localNetworkId = GetLocalNetworkId();
644     if (localNetworkId.empty()) {
645         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
646             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL, "Dinput start use failed in get local networkId error.");
647         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_START_START, DINPUT_START_TASK);
648         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
649     }
650     if (srcId != localNetworkId) {
651         return RelayStartRemoteInputByType(srcId, sinkId, inputTypes, callback);
652     }
653     std::lock_guard<std::mutex> startlock(startMutex_);
654     DInputClientStartInfo info {sinkId, inputTypes, callback};
655     staCallbacks_.push_back(info);
656     DeviceMap_[sinkId] = DINPUT_SOURCE_SWITCH_OFF; // when sink device start success,set DINPUT_SOURCE_SWITCH_ON
657     int32_t ret = DistributedInputSourceTransport::GetInstance().StartRemoteInput(sinkId, inputTypes);
658     if (ret != DH_SUCCESS) {
659         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
660             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL, "Dinput start use failed in transport start.");
661         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_START_START, DINPUT_START_TASK);
662         DHLOGE("StartRemoteInput called, start fail.");
663         for (auto it = staCallbacks_.begin(); it != staCallbacks_.end(); ++it) {
664             if (it->devId == sinkId && it->inputTypes == inputTypes) {
665                 staCallbacks_.erase(it);
666                 return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
667             }
668         }
669         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
670     }
671     return DH_SUCCESS;
672 }
673 
StopRemoteInput(const std::string & srcId,const std::string & sinkId,const uint32_t & inputTypes,sptr<IStopDInputCallback> callback)674 int32_t DistributedInputSourceManager::StopRemoteInput(const std::string &srcId, const std::string &sinkId,
675     const uint32_t &inputTypes, sptr<IStopDInputCallback> callback)
676 {
677     StartAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
678     HisyseventUtil::GetInstance().SysEventWriteBehavior(DINPUT_STOP_USE, sinkId, "Dinput stop use call.");
679     if (!DInputCheckParam::GetInstance().CheckParam(srcId, sinkId, inputTypes, callback)) {
680         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
681             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL, "Dinput stop param is failed.");
682         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
683         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
684     }
685     DHLOGI("StopRemoteInput called, srcId: %{public}s, sinkId: %{public}s, inputTypes: %{public}d",
686         GetAnonyString(srcId).c_str(), GetAnonyString(sinkId).c_str(), inputTypes);
687     std::string localNetworkId = GetLocalNetworkId();
688     if (localNetworkId.empty()) {
689         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
690             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL, "Dinput stop use failed in get networkId.");
691         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
692         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
693     }
694     if (srcId != localNetworkId) {
695         return RelayStopRemoteInputByType(srcId, sinkId, inputTypes, callback);
696     }
697     std::lock_guard<std::mutex> stoplock(stopMutex_);
698     DInputClientStopInfo info {sinkId, inputTypes, callback};
699     stpCallbacks_.push_back(info);
700     int32_t ret = DistributedInputSourceTransport::GetInstance().StopRemoteInput(sinkId, inputTypes);
701     if (ret != DH_SUCCESS) {
702         DHLOGE("StopRemoteInput called, stop fail.");
703         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
704             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL, "Dinput stop use failed in transport stop.");
705         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
706         for (auto it = stpCallbacks_.begin(); it != stpCallbacks_.end(); ++it) {
707             if (it->devId == sinkId && it->inputTypes == inputTypes) {
708                 stpCallbacks_.erase(it);
709                 return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
710             }
711         }
712         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
713     }
714     return DH_SUCCESS;
715 }
716 
RelayStartRemoteInputByType(const std::string & srcId,const std::string & sinkId,const uint32_t & inputTypes,sptr<IStartDInputCallback> callback)717 int32_t DistributedInputSourceManager::RelayStartRemoteInputByType(const std::string &srcId, const std::string &sinkId,
718     const uint32_t &inputTypes, sptr<IStartDInputCallback> callback)
719 {
720     std::lock_guard<std::mutex> lock(startStopMutex_);
721     DInputClientStartTypeInfo info(srcId, sinkId, inputTypes, callback);
722     relayStaTypeCallbacks_.push_back(info);
723 
724     int32_t ret = DistributedInputSourceTransport::GetInstance().SendRelayStartTypeRequest(srcId, sinkId, inputTypes);
725     if (ret != DH_SUCCESS) {
726         DHLOGE("Can not send message by softbus, start fail.");
727         for (auto iter = relayStaTypeCallbacks_.begin(); iter != relayStaTypeCallbacks_.end(); ++iter) {
728             if (iter->srcId == srcId && iter->sinkId == sinkId && iter->inputTypes == inputTypes) {
729                 relayStaTypeCallbacks_.erase(iter);
730                 return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
731             }
732         }
733         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
734     }
735 
736     return DH_SUCCESS;
737 }
738 
RelayStopRemoteInputByType(const std::string & srcId,const std::string & sinkId,const uint32_t & inputTypes,sptr<IStopDInputCallback> callback)739 int32_t DistributedInputSourceManager::RelayStopRemoteInputByType(
740     const std::string &srcId, const std::string &sinkId, const uint32_t &inputTypes, sptr<IStopDInputCallback> callback)
741 {
742     std::lock_guard<std::mutex> lock(startStopMutex_);
743     DInputClientStopTypeInfo info(srcId, sinkId, inputTypes, callback);
744     relayStpTypeCallbacks_.push_back(info);
745 
746     int32_t ret = DistributedInputSourceTransport::GetInstance().SendRelayStopTypeRequest(srcId, sinkId, inputTypes);
747     if (ret != DH_SUCCESS) {
748         DHLOGE("Can not send message by softbus, start fail.");
749         for (auto iter = relayStpTypeCallbacks_.begin(); iter != relayStpTypeCallbacks_.end(); ++iter) {
750             if (iter->srcId == srcId && iter->sinkId == sinkId && iter->inputTypes == inputTypes) {
751                 relayStpTypeCallbacks_.erase(iter);
752                 return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
753             }
754         }
755         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
756     }
757 
758     return DH_SUCCESS;
759 }
760 
PrepareRemoteInput(const std::string & srcId,const std::string & sinkId,sptr<IPrepareDInputCallback> callback)761 int32_t DistributedInputSourceManager::PrepareRemoteInput(const std::string &srcId, const std::string &sinkId,
762     sptr<IPrepareDInputCallback> callback)
763 {
764     if (!DInputCheckParam::GetInstance().CheckParam(srcId, sinkId, callback)) {
765         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
766             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_PREPARE_FAIL, "Dinput prepare param is failed.");
767         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
768         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_PREPARE_FAIL;
769     }
770     DHLOGI("Dinput prepare, srcId: %{public}s, sinkId: %{public}s", GetAnonyString(srcId).c_str(),
771         GetAnonyString(sinkId).c_str());
772     std::string localNetworkId = GetLocalNetworkId();
773     if (localNetworkId.empty()) {
774         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_PREPARE_FAIL;
775     }
776     if (srcId != localNetworkId) {
777         return RelayPrepareRemoteInput(srcId, sinkId, callback);
778     }
779     // current device is source device
780     int32_t ret = DistributedInputSourceTransport::GetInstance().OpenInputSoftbus(sinkId, false);
781     if (ret != DH_SUCCESS) {
782         DHLOGE("Open softbus session fail ret=%{public}d.", ret);
783         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_PREPARE_FAIL;
784     }
785     DInputClientPrepareInfo info {sinkId, callback};
786     AddPrepareCallbacks(info);
787 
788     ret = DistributedInputSourceTransport::GetInstance().PrepareRemoteInput(sinkId);
789     if (ret != DH_SUCCESS) {
790         DHLOGE("Can not send message by softbus, prepare fail, ret: %{public}d", ret);
791         RemovePrepareCallbacks(info);
792         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_PREPARE_FAIL;
793     }
794     return DH_SUCCESS;
795 }
796 
UnprepareRemoteInput(const std::string & srcId,const std::string & sinkId,sptr<IUnprepareDInputCallback> callback)797 int32_t DistributedInputSourceManager::UnprepareRemoteInput(const std::string &srcId, const std::string &sinkId,
798     sptr<IUnprepareDInputCallback> callback)
799 {
800     if (!DInputCheckParam::GetInstance().CheckParam(srcId, sinkId, callback)) {
801         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
802             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNPREPARE_FAIL, "Dinput unprepare param is failed.");
803         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
804         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNPREPARE_FAIL;
805     }
806     DHLOGI("Dinput unprepare, srcId: %{public}s, sinkId: %{public}s", GetAnonyString(srcId).c_str(),
807         GetAnonyString(sinkId).c_str());
808     std::string localNetworkId = GetLocalNetworkId();
809     if (localNetworkId.empty()) {
810         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNPREPARE_FAIL;
811     }
812     if (srcId != localNetworkId) {
813         return RelayUnprepareRemoteInput(srcId, sinkId, callback);
814     }
815 
816     // current device is source device
817     DInputClientUnprepareInfo info {sinkId, callback};
818     AddUnPrepareCallbacks(info);
819     int32_t ret = DistributedInputSourceTransport::GetInstance().UnprepareRemoteInput(sinkId);
820     if (ret != DH_SUCCESS) {
821         DHLOGE("Can not send message by softbus, unprepare fail, ret: %{public}d", ret);
822         RemoveUnPrepareCallbacks(info);
823         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNPREPARE_FAIL;
824     }
825     return DH_SUCCESS;
826 }
827 
IsStringDataSame(const std::vector<std::string> & oldDhIds,std::vector<std::string> newDhIds)828 bool DistributedInputSourceManager::IsStringDataSame(const std::vector<std::string> &oldDhIds,
829     std::vector<std::string> newDhIds)
830 {
831     if (oldDhIds.size() != newDhIds.size()) {
832         DHLOGI("Size is not same, return false.");
833         return false;
834     }
835     bool isSame = true;
836     for (auto oDhid : oldDhIds) {
837         auto it = find(newDhIds.begin(), newDhIds.end(), oDhid);
838         if (it == newDhIds.end()) {
839             isSame = false;
840             break;
841         }
842     }
843     DHLOGI("IsSame: %{public}d.", isSame);
844     return isSame;
845 }
846 
StartRemoteInput(const std::string & sinkId,const std::vector<std::string> & dhIds,sptr<IStartStopDInputsCallback> callback)847 int32_t DistributedInputSourceManager::StartRemoteInput(const std::string &sinkId,
848     const std::vector<std::string> &dhIds, sptr<IStartStopDInputsCallback> callback)
849 {
850     StartAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_START_START, DINPUT_START_TASK);
851     HisyseventUtil::GetInstance().SysEventWriteBehavior(DINPUT_START_USE, sinkId, "dinput start use call");
852     if (!DInputCheckParam::GetInstance().CheckParam(sinkId, dhIds, callback)) {
853         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
854             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL, "Dinput start param is failed.");
855         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
856         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
857     }
858     DHLOGI("Dinput start, sinkId: %{public}s, vector.string.size: %{public}zu", GetAnonyString(sinkId).c_str(),
859         dhIds.size());
860     std::string localNetworkId = GetLocalNetworkId();
861     if (localNetworkId.empty()) {
862         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
863             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL, "dinput start use failed in get networkId");
864         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_START_START, DINPUT_START_TASK);
865         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
866     }
867 
868     // current device is source device
869     DInputClientStartDhidInfo info {localNetworkId, sinkId, dhIds, callback};
870     staStringCallbacks_.push_back(info);
871     DeviceMap_[sinkId] = DINPUT_SOURCE_SWITCH_OFF; // when sink device start success,set DINPUT_SOURCE_SWITCH_ON
872     int32_t ret = DistributedInputSourceTransport::GetInstance().StartRemoteInput(sinkId, dhIds);
873     if (ret != DH_SUCCESS) {
874         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
875             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL, "dinput start use failed in transport start");
876         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_START_START, DINPUT_START_TASK);
877         DHLOGE("StartRemoteInput start fail.");
878         for (auto iter = staStringCallbacks_.begin(); iter != staStringCallbacks_.end(); ++iter) {
879             if (iter->sinkId == sinkId && IsStringDataSame(iter->dhIds, dhIds)) {
880                 staStringCallbacks_.erase(iter);
881                 return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
882             }
883         }
884         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
885     }
886     return DH_SUCCESS;
887 }
888 
StopRemoteInput(const std::string & sinkId,const std::vector<std::string> & dhIds,sptr<IStartStopDInputsCallback> callback)889 int32_t DistributedInputSourceManager::StopRemoteInput(const std::string &sinkId, const std::vector<std::string> &dhIds,
890     sptr<IStartStopDInputsCallback> callback)
891 {
892     StartAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
893     HisyseventUtil::GetInstance().SysEventWriteBehavior(DINPUT_STOP_USE, sinkId, "dinput stop use call");
894     if (!DInputCheckParam::GetInstance().CheckParam(sinkId, dhIds, callback)) {
895         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
896             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL, "Dinput stop param is failed.");
897         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
898         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
899     }
900     DHLOGI("Dinput stop, sinkId: %{public}s, vector.string.size: %{public}zu", GetAnonyString(sinkId).c_str(),
901         dhIds.size());
902     std::string localNetworkId = GetLocalNetworkId();
903     if (localNetworkId.empty()) {
904         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
905             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL, "dinput stop use failed in get networkId");
906         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
907         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
908     }
909 
910     DInputClientStopDhidInfo info {localNetworkId, sinkId, dhIds, callback};
911     stpStringCallbacks_.push_back(info);
912     int32_t ret = DistributedInputSourceTransport::GetInstance().StopRemoteInput(sinkId, dhIds);
913     if (ret != DH_SUCCESS) {
914         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
915             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL, "dinput stop use failed in transport stop");
916         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
917         DHLOGE("StopRemoteInput stop fail.");
918         for (auto iter = stpStringCallbacks_.begin(); iter != stpStringCallbacks_.end(); ++iter) {
919             if (iter->sinkId == sinkId && IsStringDataSame(iter->dhIds, dhIds)) {
920                 stpStringCallbacks_.erase(iter);
921                 return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
922             }
923         }
924         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
925     }
926     return DH_SUCCESS;
927 }
928 
StartRemoteInput(const std::string & srcId,const std::string & sinkId,const std::vector<std::string> & dhIds,sptr<IStartStopDInputsCallback> callback)929 int32_t DistributedInputSourceManager::StartRemoteInput(const std::string &srcId, const std::string &sinkId,
930     const std::vector<std::string> &dhIds, sptr<IStartStopDInputsCallback> callback)
931 {
932     StartAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_START_START, DINPUT_START_TASK);
933     HisyseventUtil::GetInstance().SysEventWriteBehavior(DINPUT_START_USE, sinkId, "Dinput start use call.");
934     if (!DInputCheckParam::GetInstance().CheckParam(srcId, sinkId, dhIds, callback)) {
935         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
936             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL, "Dinput start param is failed.");
937         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
938         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
939     }
940     DHLOGI("Dinput start, srcId: %{public}s, sinkId: %{public}s", GetAnonyString(srcId).c_str(),
941         GetAnonyString(sinkId).c_str());
942     std::string localNetworkId = GetLocalNetworkId();
943     if (localNetworkId.empty()) {
944         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
945             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL, "Dinput start use failed in get networkId.");
946         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_START_START, DINPUT_START_TASK);
947         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
948     }
949     if (srcId != localNetworkId) {
950         return RelayStartRemoteInputByDhid(srcId, sinkId, dhIds, callback);
951     }
952 
953     DInputClientStartDhidInfo info {srcId, sinkId, dhIds, callback};
954     staStringCallbacks_.push_back(info);
955     DeviceMap_[sinkId] = DINPUT_SOURCE_SWITCH_OFF;
956     int32_t ret = DistributedInputSourceTransport::GetInstance().StartRemoteInput(sinkId, dhIds);
957     if (ret != DH_SUCCESS) {
958         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
959             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL, "Dinput start use failed in transport start.");
960         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_START_START, DINPUT_START_TASK);
961         DHLOGE("StartRemoteInput start fail.");
962         for (auto iter = staStringCallbacks_.begin(); iter != staStringCallbacks_.end(); ++iter) {
963             if (iter->srcId == srcId && iter->sinkId == sinkId && IsStringDataSame(iter->dhIds, dhIds)) {
964                 staStringCallbacks_.erase(iter);
965                 return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
966             }
967         }
968         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
969     }
970     return DH_SUCCESS;
971 }
972 
StopRemoteInput(const std::string & srcId,const std::string & sinkId,const std::vector<std::string> & dhIds,sptr<IStartStopDInputsCallback> callback)973 int32_t DistributedInputSourceManager::StopRemoteInput(const std::string &srcId, const std::string &sinkId,
974     const std::vector<std::string> &dhIds, sptr<IStartStopDInputsCallback> callback)
975 {
976     StartAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
977     HisyseventUtil::GetInstance().SysEventWriteBehavior(DINPUT_STOP_USE, sinkId, "Dinput stop use call.");
978     if (!DInputCheckParam::GetInstance().CheckParam(srcId, sinkId, dhIds, callback)) {
979         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
980             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL, "Dinput stop param is failed.");
981         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
982         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
983     }
984     DHLOGI("Dinput stop, srcId: %{public}s, sinkId: %{public}s, vector.string.size: %{public}zu",
985         GetAnonyString(srcId).c_str(), GetAnonyString(sinkId).c_str(), dhIds.size());
986     std::string localNetworkId = GetLocalNetworkId();
987     if (localNetworkId.empty()) {
988         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
989             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL, "Dinput stop use failed in get networkId.");
990         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
991         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
992     }
993     if (srcId != localNetworkId) {
994         return RelayStopRemoteInputByDhid(srcId, sinkId, dhIds, callback);
995     }
996 
997     DInputClientStopDhidInfo info {srcId, sinkId, dhIds, callback};
998     stpStringCallbacks_.push_back(info);
999     int32_t ret = DistributedInputSourceTransport::GetInstance().StopRemoteInput(sinkId, dhIds);
1000     if (ret != DH_SUCCESS) {
1001         HisyseventUtil::GetInstance().SysEventWriteFault(DINPUT_OPT_FAIL, sinkId,
1002             ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL, "Dinput stop use failed in transport stop.");
1003         FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
1004         DHLOGE("StopRemoteInput stop fail.");
1005         for (auto iter = stpStringCallbacks_.begin(); iter != stpStringCallbacks_.end(); ++iter) {
1006             if (iter->srcId == srcId && iter->sinkId == sinkId && IsStringDataSame(iter->dhIds, dhIds)) {
1007                 stpStringCallbacks_.erase(iter);
1008                 return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
1009             }
1010         }
1011         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
1012     }
1013     return DH_SUCCESS;
1014 }
1015 
RegisterAddWhiteListCallback(sptr<IAddWhiteListInfosCallback> callback)1016 int32_t DistributedInputSourceManager::RegisterAddWhiteListCallback(sptr<IAddWhiteListInfosCallback> callback)
1017 {
1018     DHLOGI("RegisterAddWhiteListCallback called.");
1019     if (callback == nullptr) {
1020         DHLOGE("RegisterAddWhiteListCallback callback is null.");
1021         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_REG_CALLBACK_ERR;
1022     }
1023     std::lock_guard<std::mutex> lock(whiteListMutex_);
1024     addWhiteListCallbacks_.insert(callback);
1025     return DH_SUCCESS;
1026 }
1027 
RegisterDelWhiteListCallback(sptr<IDelWhiteListInfosCallback> callback)1028 int32_t DistributedInputSourceManager::RegisterDelWhiteListCallback(sptr<IDelWhiteListInfosCallback> callback)
1029 {
1030     DHLOGI("RegisterDelWhiteListCallback called.");
1031     if (callback == nullptr) {
1032         DHLOGE("RegisterDelWhiteListCallback callback is null.");
1033         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_REG_CALLBACK_ERR;
1034     }
1035     std::lock_guard<std::mutex> lock(whiteListMutex_);
1036     delWhiteListCallbacks_.insert(callback);
1037     return DH_SUCCESS;
1038 }
1039 
RegisterSimulationEventListener(sptr<ISimulationEventListener> listener)1040 int32_t DistributedInputSourceManager::RegisterSimulationEventListener(sptr<ISimulationEventListener> listener)
1041 {
1042     DHLOGI("RegisterSimulationEventListener called.");
1043     if (listener == nullptr) {
1044         DHLOGE("RegisterSimulationEventListener callback is null.");
1045         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_SIMULATION_EVENT_CALLBACK_ERR;
1046     }
1047     std::lock_guard<std::mutex> lock(simEventMutex_);
1048     this->simulationEventCallbacks_.insert(listener);
1049     return DH_SUCCESS;
1050 }
1051 
UnregisterSimulationEventListener(sptr<ISimulationEventListener> listener)1052 int32_t DistributedInputSourceManager::UnregisterSimulationEventListener(sptr<ISimulationEventListener> listener)
1053 {
1054     DHLOGI("UnregisterSimulationEventListener called.");
1055     if (listener == nullptr) {
1056         DHLOGE("UnregisterSimulationEventListener callback is null.");
1057         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_SIMULATION_EVENT_CALLBACK_ERR;
1058     }
1059     std::lock_guard<std::mutex> lock(simEventMutex_);
1060     this->simulationEventCallbacks_.erase(listener);
1061     return DH_SUCCESS;
1062 }
1063 
RegisterSessionStateCb(sptr<ISessionStateCallback> callback)1064 int32_t DistributedInputSourceManager::RegisterSessionStateCb(sptr<ISessionStateCallback> callback)
1065 {
1066     if (callback == nullptr) {
1067         DHLOGE("RegisterSessionStateCb callback is null.");
1068         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_SESSION_STATE_CB_IS_NULL;
1069     }
1070     DistributedInputTransportBase::GetInstance().RegisterSessionStateCb(callback);
1071     DistributedInputInject::GetInstance().RegisterInjectEventCb(callback);
1072     return DH_SUCCESS;
1073 }
UnregisterSessionStateCb()1074 int32_t DistributedInputSourceManager::UnregisterSessionStateCb()
1075 {
1076     DistributedInputTransportBase::GetInstance().UnregisterSessionStateCb();
1077     DistributedInputInject::GetInstance().UnregisterInjectEventCb();
1078     return DH_SUCCESS;
1079 }
1080 
RelayPrepareRemoteInput(const std::string & srcId,const std::string & sinkId,sptr<IPrepareDInputCallback> callback)1081 int32_t DistributedInputSourceManager::RelayPrepareRemoteInput(const std::string &srcId, const std::string &sinkId,
1082     sptr<IPrepareDInputCallback> callback)
1083 {
1084     int32_t ret = DistributedInputSourceTransport::GetInstance().OpenInputSoftbus(srcId, true);
1085     if (ret != DH_SUCCESS) {
1086         DHLOGE("Open softbus session fail.");
1087         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_PREPARE_FAIL;
1088     }
1089     DInputClientRelayPrepareInfo info(srcId, sinkId, callback);
1090     AddRelayPrepareCallbacks(info);
1091 
1092     ret = DistributedInputSourceTransport::GetInstance().SendRelayPrepareRequest(srcId, sinkId);
1093     if (ret != DH_SUCCESS) {
1094         DHLOGE("Can not send message by softbus, prepare fail, ret: %{public}d", ret);
1095         RemoveRelayPrepareCallbacks(info);
1096         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_PREPARE_FAIL;
1097     }
1098     return DH_SUCCESS;
1099 }
1100 
RelayUnprepareRemoteInput(const std::string & srcId,const std::string & sinkId,sptr<IUnprepareDInputCallback> callback)1101 int32_t DistributedInputSourceManager::RelayUnprepareRemoteInput(const std::string &srcId, const std::string &sinkId,
1102     sptr<IUnprepareDInputCallback> callback)
1103 {
1104     DInputClientRelayUnprepareInfo info(srcId, sinkId, callback);
1105     AddRelayUnPrepareCallbacks(info);
1106 
1107     int32_t ret = DistributedInputSourceTransport::GetInstance().SendRelayUnprepareRequest(srcId, sinkId);
1108     if (ret != DH_SUCCESS) {
1109         DHLOGE("Can not send message by softbus, prepare fail, ret: %{public}d", ret);
1110         RemoveRelayUnPrepareCallbacks(info);
1111         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_UNPREPARE_FAIL;
1112     }
1113     return DH_SUCCESS;
1114 }
1115 
RelayStartRemoteInputByDhid(const std::string & srcId,const std::string & sinkId,const std::vector<std::string> & dhIds,sptr<IStartStopDInputsCallback> callback)1116 int32_t DistributedInputSourceManager::RelayStartRemoteInputByDhid(const std::string &srcId, const std::string &sinkId,
1117     const std::vector<std::string> &dhIds, sptr<IStartStopDInputsCallback> callback)
1118 {
1119     std::lock_guard<std::mutex> lock(startStopMutex_);
1120     DInputClientStartDhidInfo info{srcId, sinkId, dhIds, callback};
1121     relayStaDhidCallbacks_.push_back(info);
1122 
1123     int32_t ret = DistributedInputSourceTransport::GetInstance().SendRelayStartDhidRequest(srcId, sinkId, dhIds);
1124     if (ret != DH_SUCCESS) {
1125         DHLOGE("Can not send message by softbus, start fail.");
1126         for (auto iter = relayStaDhidCallbacks_.begin(); iter != relayStaDhidCallbacks_.end(); ++iter) {
1127             if (iter->srcId == srcId && iter->sinkId == sinkId && IsStringDataSame(iter->dhIds, dhIds)) {
1128                 relayStaDhidCallbacks_.erase(iter);
1129                 return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
1130             }
1131         }
1132         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_START_FAIL;
1133     }
1134     return DH_SUCCESS;
1135 }
1136 
RelayStopRemoteInputByDhid(const std::string & srcId,const std::string & sinkId,const std::vector<std::string> & dhIds,sptr<IStartStopDInputsCallback> callback)1137 int32_t DistributedInputSourceManager::RelayStopRemoteInputByDhid(const std::string &srcId, const std::string &sinkId,
1138     const std::vector<std::string> &dhIds, sptr<IStartStopDInputsCallback> callback)
1139 {
1140     std::lock_guard<std::mutex> lock(startStopMutex_);
1141     DInputClientStopDhidInfo info{srcId, sinkId, dhIds, callback};
1142     relayStpDhidCallbacks_.push_back(info);
1143 
1144     int32_t ret = DistributedInputSourceTransport::GetInstance().SendRelayStopDhidRequest(srcId, sinkId, dhIds);
1145     if (ret != DH_SUCCESS) {
1146         DHLOGE("Can not send message by softbus, stop fail.");
1147         for (auto iter = relayStpDhidCallbacks_.begin(); iter != relayStpDhidCallbacks_.end(); ++iter) {
1148             if (iter->srcId == srcId && iter->sinkId == sinkId && IsStringDataSame(iter->dhIds, dhIds)) {
1149                 relayStpDhidCallbacks_.erase(iter);
1150                 return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
1151             }
1152         }
1153         return ERR_DH_INPUT_SERVER_SOURCE_MANAGER_STOP_FAIL;
1154     }
1155     return DH_SUCCESS;
1156 }
1157 
RunRegisterCallback(const std::string & devId,const std::string & dhId,const int32_t & status)1158 void DistributedInputSourceManager::RunRegisterCallback(
1159     const std::string &devId, const std::string &dhId, const int32_t &status)
1160 {
1161     std::lock_guard<std::mutex> lock(regDisHardwareMutex_);
1162     for (auto iter = regCallbacks_.begin(); iter != regCallbacks_.end(); ++iter) {
1163         if (iter->devId == devId && iter->dhId == dhId) {
1164             DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_RIGISTER_MSG");
1165             iter->callback->OnResult(devId, dhId, status);
1166             regCallbacks_.erase(iter);
1167             return;
1168         }
1169     }
1170     DHLOGE("ProcessEvent registerCallback is null.");
1171 }
1172 
RunUnregisterCallback(const std::string & devId,const std::string & dhId,const int32_t & status)1173 void DistributedInputSourceManager::RunUnregisterCallback(
1174     const std::string &devId, const std::string &dhId, const int32_t &status)
1175 {
1176     std::lock_guard<std::mutex> lock(regDisHardwareMutex_);
1177     for (auto iter = unregCallbacks_.begin(); iter != unregCallbacks_.end(); ++iter) {
1178         if (iter->devId == devId && iter->dhId == dhId) {
1179             DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_UNRIGISTER_MSG");
1180             iter->callback->OnResult(devId, dhId, status);
1181             unregCallbacks_.erase(iter);
1182             return;
1183         }
1184     }
1185     DHLOGE("ProcessEvent unregisterCallback is null.");
1186 }
1187 
RunPrepareCallback(const std::string & devId,const int32_t & status,const std::string & object)1188 void DistributedInputSourceManager::RunPrepareCallback(
1189     const std::string &devId, const int32_t &status, const std::string &object)
1190 {
1191     FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_PREPARE_START, DINPUT_PREPARE_TASK);
1192     std::lock_guard<std::mutex> lock(prepareMutex_);
1193     for (auto iter = preCallbacks_.begin(); iter != preCallbacks_.end(); ++iter) {
1194         if (iter->devId == devId) {
1195             DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_PREPARE_MSG");
1196             iter->preCallback->OnResult(devId, status);
1197             preCallbacks_.erase(iter);
1198             RunWhiteListCallback(devId, object);
1199             return;
1200         }
1201     }
1202     DHLOGE("ProcessEvent parepareCallback is null.");
1203 }
1204 
RunWhiteListCallback(const std::string & devId,const std::string & object)1205 void DistributedInputSourceManager::RunWhiteListCallback(const std::string &devId, const std::string &object)
1206 {
1207     std::lock_guard<std::mutex> lock(whiteListMutex_);
1208     if (addWhiteListCallbacks_.size() == 0) {
1209         DHLOGE("addWhiteListCallbacks_ is empty.");
1210         return;
1211     }
1212     for (const auto &it : addWhiteListCallbacks_) {
1213         it->OnResult(devId, object);
1214     }
1215 }
1216 
RunRelayPrepareCallback(const std::string & srcId,const std::string & sinkId,const int32_t status)1217 void DistributedInputSourceManager::RunRelayPrepareCallback(const std::string &srcId, const std::string &sinkId,
1218     const int32_t status)
1219 {
1220     FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_PREPARE_START, DINPUT_PREPARE_TASK);
1221     std::lock_guard<std::mutex> lock(prepareMutex_);
1222     bool isCbRun = false;
1223     sptr<IPrepareDInputCallback> cb = nullptr;
1224     for (auto iter = relayPreCallbacks_.begin(); iter != relayPreCallbacks_.end(); ++iter) {
1225         if (iter->srcId == srcId && iter->sinkId == sinkId) {
1226             DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_PREPARE_RESULT_MMI");
1227             cb = iter->preCallback;
1228             relayPreCallbacks_.erase(iter);
1229             isCbRun = true;
1230             break;
1231         }
1232     }
1233     if (isCbRun && cb != nullptr) {
1234         cb->OnResult(sinkId, status);
1235     } else {
1236         DHLOGE("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_PREPARE_RESULT_MMI relayPreCallbacks_ is null.");
1237     }
1238 }
1239 
RunRelayUnprepareCallback(const std::string & srcId,const std::string & sinkId,const int32_t status)1240 void DistributedInputSourceManager::RunRelayUnprepareCallback(const std::string &srcId, const std::string &sinkId,
1241     const int32_t status)
1242 {
1243     FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_UNPREPARE_START, DINPUT_UNPREPARE_TASK);
1244     std::lock_guard<std::mutex> lock(prepareMutex_);
1245     bool isCbRun = false;
1246     sptr<IUnprepareDInputCallback> cb = nullptr;
1247     for (auto iter = relayUnpreCallbacks_.begin(); iter != relayUnpreCallbacks_.end(); ++iter) {
1248         if (iter->srcId == srcId && iter->sinkId == sinkId) {
1249             DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_UNPREPARE_RESULT_MMI");
1250             cb = iter->unpreCallback;
1251             relayUnpreCallbacks_.erase(iter);
1252             isCbRun = true;
1253             break;
1254         }
1255     }
1256     if (isCbRun && cb != nullptr) {
1257         cb->OnResult(sinkId, status);
1258     } else {
1259         DHLOGE("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_UNPREPARE_RESULT_MMI relayUnpreCallbacks_ is null.");
1260     }
1261 }
1262 
RunUnprepareCallback(const std::string & devId,const int32_t & status)1263 void DistributedInputSourceManager::RunUnprepareCallback(const std::string &devId, const int32_t &status)
1264 {
1265     FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_UNPREPARE_START, DINPUT_UNPREPARE_TASK);
1266     std::lock_guard<std::mutex> prepareLock(prepareMutex_);
1267     for (auto iter = unpreCallbacks_.begin(); iter != unpreCallbacks_.end(); ++iter) {
1268         if (iter->devId == devId) {
1269             DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_UNPREPARE_MSG");
1270             iter->unpreCallback->OnResult(devId, status);
1271             unpreCallbacks_.erase(iter);
1272             std::lock_guard<std::mutex> whiteListLock(whiteListMutex_);
1273             if (delWhiteListCallbacks_.size() == 0) {
1274                 DHLOGE("ProcessEvent DINPUT_SOURCE_MANAGER_UNPREPARE_MSG delWhiteListCallback is null.");
1275                 return;
1276             }
1277             for (const auto &it : delWhiteListCallbacks_) {
1278                 it->OnResult(devId);
1279             }
1280             return;
1281         }
1282     }
1283     DHLOGE("ProcessEvent unparepareCallback is null.");
1284 }
1285 
RunStartCallback(const std::string & devId,const uint32_t & inputTypes,const int32_t & status)1286 void DistributedInputSourceManager::RunStartCallback(
1287     const std::string &devId, const uint32_t &inputTypes, const int32_t &status)
1288 {
1289     FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_START_START, DINPUT_START_TASK);
1290     std::lock_guard<std::mutex> startlock(startMutex_);
1291     for (auto iter = staCallbacks_.begin(); iter != staCallbacks_.end(); ++iter) {
1292         if (iter->devId == devId && iter->inputTypes == inputTypes) {
1293             DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_START_MSG");
1294             iter->callback->OnResult(devId, inputTypes, status);
1295             staCallbacks_.erase(iter);
1296             break;
1297         }
1298     }
1299 }
1300 
RunStopCallback(const std::string & devId,const uint32_t & inputTypes,const int32_t & status)1301 void DistributedInputSourceManager::RunStopCallback(
1302     const std::string &devId, const uint32_t &inputTypes, const int32_t &status)
1303 {
1304     FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
1305     std::lock_guard<std::mutex> stoplock(stopMutex_);
1306     for (auto iter = stpCallbacks_.begin(); iter != stpCallbacks_.end(); ++iter) {
1307         if (iter->devId == devId && iter->inputTypes == inputTypes) {
1308             DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_STOP_MSG");
1309             iter->callback->OnResult(devId, inputTypes, status);
1310             stpCallbacks_.erase(iter);
1311             break;
1312         }
1313     }
1314 }
1315 
RunStartDhidCallback(const std::string & sinkId,const std::string & dhIds,const int32_t & status)1316 void DistributedInputSourceManager::RunStartDhidCallback(const std::string &sinkId, const std::string &dhIds,
1317     const int32_t &status)
1318 {
1319     std::vector<std::string> dhidsVec;
1320     SplitStringToVector(dhIds, INPUT_STRING_SPLIT_POINT, dhidsVec);
1321     DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_START_DHID_MSG dhIds:%{public}s, vec-size:%{public}zu",
1322         GetAnonyString(dhIds).c_str(), dhidsVec.size());
1323     std::string localNetWorkId = GetLocalNetworkId();
1324     if (localNetWorkId.empty()) {
1325         return;
1326     }
1327 
1328     for (auto iter = staStringCallbacks_.begin(); iter != staStringCallbacks_.end(); ++iter) {
1329         if (iter->sinkId != sinkId || !IsStringDataSame(iter->dhIds, dhidsVec)) {
1330             continue;
1331         }
1332         iter->callback->OnResultDhids(sinkId, status);
1333         staStringCallbacks_.erase(iter);
1334         break;
1335     }
1336 }
1337 
RunStopDhidCallback(const std::string & sinkId,const std::string & dhIds,const int32_t & status)1338 void DistributedInputSourceManager::RunStopDhidCallback(const std::string &sinkId, const std::string &dhIds,
1339     const int32_t &status)
1340 {
1341     std::vector<std::string> dhidsVec;
1342     SplitStringToVector(dhIds, INPUT_STRING_SPLIT_POINT, dhidsVec);
1343     std::string localNetworkId = GetLocalNetworkId();
1344     if (localNetworkId.empty()) {
1345         return;
1346     }
1347 
1348     for (auto iter = stpStringCallbacks_.begin();
1349         iter != stpStringCallbacks_.end(); ++iter) {
1350         if (iter->sinkId != sinkId || !IsStringDataSame(iter->dhIds, dhidsVec)) {
1351             continue;
1352         }
1353         iter->callback->OnResultDhids(sinkId, status);
1354         stpStringCallbacks_.erase(iter);
1355         break;
1356     }
1357 }
1358 
RunRelayStartDhidCallback(const std::string & srcId,const std::string & sinkId,const int32_t status,const std::string & dhids)1359 void DistributedInputSourceManager::RunRelayStartDhidCallback(const std::string &srcId, const std::string &sinkId,
1360     const int32_t status, const std::string &dhids)
1361 {
1362     std::vector<std::string> dhidsVec;
1363     SplitStringToVector(dhids, INPUT_STRING_SPLIT_POINT, dhidsVec);
1364     DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_STARTDHID_RESULT_MMI dhIds:%{public}s, vec-size:%{public}zu",
1365         dhids.c_str(), dhidsVec.size());
1366     std::lock_guard<std::mutex> lock(startStopMutex_);
1367     bool isCbRun = false;
1368     sptr<IStartStopDInputsCallback> cb = nullptr;
1369     for (auto iter = relayStaDhidCallbacks_.begin(); iter != relayStaDhidCallbacks_.end(); ++iter) {
1370         if (iter->srcId != srcId || iter->sinkId != sinkId || !IsStringDataSame(iter->dhIds, dhidsVec)) {
1371             continue;
1372         }
1373         DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_STARTDHID_RESULT_MMI call OnResultDhids");
1374         cb = iter->callback;
1375         relayStaDhidCallbacks_.erase(iter);
1376         isCbRun = true;
1377         break;
1378     }
1379     if (isCbRun && cb != nullptr) {
1380         cb->OnResultDhids(sinkId, status);
1381     } else {
1382         DHLOGE("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_STARTDHID_RESULT_MMI relayStaDhidCallbacks_ is null.");
1383     }
1384 }
1385 
RunRelayStopDhidCallback(const std::string & srcId,const std::string & sinkId,const int32_t status,const std::string & dhids)1386 void DistributedInputSourceManager::RunRelayStopDhidCallback(const std::string &srcId, const std::string &sinkId,
1387     const int32_t status, const std::string &dhids)
1388 {
1389     std::vector<std::string> dhidsVec;
1390     SplitStringToVector(dhids, INPUT_STRING_SPLIT_POINT, dhidsVec);
1391     std::lock_guard<std::mutex> lock(startStopMutex_);
1392     bool isCbRun = false;
1393     sptr<IStartStopDInputsCallback> cb = nullptr;
1394     for (auto iter = relayStpDhidCallbacks_.begin(); iter != relayStpDhidCallbacks_.end(); ++iter) {
1395         if (iter->srcId != srcId || iter->sinkId != sinkId || !IsStringDataSame(iter->dhIds, dhidsVec)) {
1396             continue;
1397         }
1398         DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_STOPDHID_RESULT_MMI call OnResultDhids");
1399         cb = iter->callback;
1400         relayStpDhidCallbacks_.erase(iter);
1401         isCbRun = true;
1402         break;
1403     }
1404     if (isCbRun && cb != nullptr) {
1405         cb->OnResultDhids(sinkId, status);
1406     } else {
1407         DHLOGE("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_STOPDHID_RESULT_MMI relayStpDhidCallbacks_ is null.");
1408     }
1409 }
1410 
RunRelayStartTypeCallback(const std::string & srcId,const std::string & sinkId,const int32_t status,uint32_t inputTypes)1411 void DistributedInputSourceManager::RunRelayStartTypeCallback(const std::string &srcId, const std::string &sinkId,
1412     const int32_t status, uint32_t inputTypes)
1413 {
1414     std::lock_guard<std::mutex> lock(startStopMutex_);
1415     bool isCbRun = false;
1416     FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_START_START, DINPUT_START_TASK);
1417     for (std::vector<DInputClientStartTypeInfo>::iterator iter =
1418         relayStaTypeCallbacks_.begin(); iter != relayStaTypeCallbacks_.end(); ++iter) {
1419         if (iter->srcId == srcId && iter->sinkId == sinkId && iter->inputTypes == inputTypes) {
1420             DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_STARTTYPE_RESULT_MMI");
1421             iter->callback->OnResult(sinkId, inputTypes, status);
1422             relayStaTypeCallbacks_.erase(iter);
1423             isCbRun = true;
1424             break;
1425         }
1426     }
1427 
1428     if (!isCbRun) {
1429         DHLOGE("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_STARTTYPE_RESULT_MMI relayStaTypeCallbacks_ is null.");
1430     }
1431 }
1432 
RunRelayStopTypeCallback(const std::string & srcId,const std::string & sinkId,const int32_t status,uint32_t inputTypes)1433 void DistributedInputSourceManager::RunRelayStopTypeCallback(const std::string &srcId, const std::string &sinkId,
1434     const int32_t status, uint32_t inputTypes)
1435 {
1436     std::lock_guard<std::mutex> lock(startStopMutex_);
1437     bool isCbRun = false;
1438     FinishAsyncTrace(DINPUT_HITRACE_LABEL, DINPUT_STOP_START, DINPUT_STOP_TASK);
1439     for (std::vector<DInputClientStopTypeInfo>::iterator iter =
1440         relayStpTypeCallbacks_.begin(); iter != relayStpTypeCallbacks_.end(); ++iter) {
1441         if (iter->srcId == srcId && iter->sinkId == sinkId && iter->inputTypes == inputTypes) {
1442             DHLOGI("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_STOPTYPE_RESULT_MMI");
1443             iter->callback->OnResult(sinkId, inputTypes, status);
1444             relayStpTypeCallbacks_.erase(iter);
1445             isCbRun = true;
1446             break;
1447         }
1448     }
1449 
1450     if (!isCbRun) {
1451         DHLOGE("ProcessEvent DINPUT_SOURCE_MANAGER_RELAY_STOPTYPE_RESULT_MMI relayStpTypeCallbacks_ is null.");
1452     }
1453 }
RunKeyStateCallback(const std::string & sinkId,const std::string & dhId,const uint32_t type,const uint32_t code,const uint32_t value)1454 void DistributedInputSourceManager::RunKeyStateCallback(const std::string &sinkId, const std::string &dhId,
1455     const uint32_t type, const uint32_t code, const uint32_t value)
1456 {
1457     // 1.notify multiinput
1458     std::lock_guard<std::mutex> lock(simEventMutex_);
1459     for (const auto &cb : simulationEventCallbacks_) {
1460         cb->OnSimulationEvent(type, code, value);
1461     }
1462 
1463     DHLOGI("ProcessEvent notify multimodal OnSimulationEvent success.");
1464     // 2.if return success, write to virtulnode
1465     RawEvent mEventBuffer;
1466     mEventBuffer.type = type;
1467     mEventBuffer.code = code;
1468     mEventBuffer.value = value;
1469     mEventBuffer.descriptor = dhId;
1470     std::vector<RawEvent> eventBuffers = {mEventBuffer};
1471     DistributedInputInject::GetInstance().RegisterDistributedEvent(sinkId, eventBuffers);
1472     return;
1473 }
1474 
GetStartTransFlag()1475 DInputServerType DistributedInputSourceManager::GetStartTransFlag()
1476 {
1477     return isStartTrans_;
1478 }
1479 
SetStartTransFlag(const DInputServerType flag)1480 void DistributedInputSourceManager::SetStartTransFlag(const DInputServerType flag)
1481 {
1482     DHLOGI("Set Source isStartTrans_ %{public}d", static_cast<int32_t>(flag));
1483     isStartTrans_ = flag;
1484 }
1485 
GetInputDeviceId()1486 std::vector<DistributedInputSourceManager::InputDeviceId> DistributedInputSourceManager::GetInputDeviceId()
1487 {
1488     return inputDevice_;
1489 }
1490 
RemoveInputDeviceId(const std::string deviceId,const std::string dhId)1491 void DistributedInputSourceManager::RemoveInputDeviceId(const std::string deviceId, const std::string dhId)
1492 {
1493     InputDeviceId inputDeviceId {deviceId, dhId};
1494 
1495     auto it  = std::find(inputDevice_.begin(), inputDevice_.end(), inputDeviceId);
1496     if (it == inputDevice_.end()) {
1497         return;
1498     }
1499 
1500     // delete device
1501     DHLOGI("inputDevice erase deviceId: %{public}s, dhId: %{public}s", GetAnonyString(it->devId).c_str(),
1502         GetAnonyString(it->dhId).c_str());
1503     inputDevice_.erase(it);
1504 }
1505 
GetDeviceMapAllDevSwitchOff()1506 bool DistributedInputSourceManager::GetDeviceMapAllDevSwitchOff()
1507 {
1508     bool isAllDevSwitchOff = true;
1509     for (auto it = DeviceMap_.begin(); it != DeviceMap_.end(); ++it) {
1510         if (it->second == DINPUT_SOURCE_SWITCH_ON) {
1511             isAllDevSwitchOff = false;
1512             break;
1513         }
1514     }
1515     return isAllDevSwitchOff;
1516 }
1517 
SetDeviceMapValue(const std::string deviceId,int32_t value)1518 void DistributedInputSourceManager::SetDeviceMapValue(const std::string deviceId, int32_t value)
1519 {
1520     DeviceMap_[deviceId] = value;
1521 }
1522 
GetInputTypesMap(const std::string deviceId)1523 uint32_t DistributedInputSourceManager::GetInputTypesMap(const std::string deviceId)
1524 {
1525     auto key = InputTypesMap_.find(deviceId);
1526     if (key != InputTypesMap_.end()) {
1527         return InputTypesMap_[deviceId];
1528     }
1529     return static_cast<uint32_t>(DInputDeviceType::NONE);
1530 }
1531 
GetAllInputTypesMap()1532 uint32_t DistributedInputSourceManager::GetAllInputTypesMap()
1533 {
1534     uint32_t rInputTypes = static_cast<uint32_t>(DInputDeviceType::NONE);
1535     for (auto iter = InputTypesMap_.begin(); iter != InputTypesMap_.end(); ++iter) {
1536         rInputTypes |= iter->second;
1537     }
1538     return rInputTypes;
1539 }
1540 
ClearResourcesStatus()1541 void DistributedInputSourceManager::ClearResourcesStatus()
1542 {
1543     std::lock_guard<std::mutex> lock(prepareMutex_);
1544     preCallbacks_.clear();
1545     unpreCallbacks_.clear();
1546     relayPreCallbacks_.clear();
1547     relayUnpreCallbacks_.clear();
1548 }
1549 
SetInputTypesMap(const std::string deviceId,uint32_t value)1550 void DistributedInputSourceManager::SetInputTypesMap(const std::string deviceId, uint32_t value)
1551 {
1552     if (value == static_cast<uint32_t>(DInputDeviceType::NONE)) {
1553         auto key = InputTypesMap_.find(deviceId);
1554         if (key != InputTypesMap_.end()) {
1555             InputTypesMap_.erase(key);
1556             return;
1557         }
1558     }
1559     InputTypesMap_[deviceId] = value;
1560 }
1561 
OnMessage(const DHTopic topic,const std::string & message)1562 void DistributedInputSourceManager::StartDScreenListener::OnMessage(const DHTopic topic, const std::string &message)
1563 {
1564     DHLOGI("StartDScreenListener OnMessage!");
1565     if (topic != DHTopic::TOPIC_START_DSCREEN) {
1566         DHLOGE("this topic is wrong, %{public}d", static_cast<uint32_t>(topic));
1567         return;
1568     }
1569     if (message.size() > SCREEN_MSG_MAX) {
1570         DHLOGE("StartDScreenListener message size too long.");
1571         return;
1572     }
1573     std::string sinkDevId = "";
1574     SrcScreenInfo srcScreenInfo = {};
1575     int32_t parseRes = ParseMessage(message, sinkDevId, srcScreenInfo);
1576     if (parseRes != DH_SUCCESS) {
1577         DHLOGE("Parse message failed!");
1578         return;
1579     }
1580 
1581     std::string srcDevId = GetLocalNetworkId();
1582     std::string virtualTouchScreenDHId = DistributedInputInject::GetInstance().GenerateVirtualTouchScreenDHId(
1583         srcScreenInfo.sourceWinId, srcScreenInfo.sourceWinWidth, srcScreenInfo.sourceWinHeight);
1584     int32_t createNodeRes = DistributedInputInject::GetInstance().CreateVirtualTouchScreenNode(srcDevId,
1585         virtualTouchScreenDHId, srcScreenInfo.sourceWinId, srcScreenInfo.sourceWinWidth,
1586         srcScreenInfo.sourceWinHeight);
1587     if (createNodeRes != DH_SUCCESS) {
1588         DHLOGE("Create virtual touch screen Node failed!");
1589         return;
1590     }
1591 
1592     int32_t cacheRes = UpdateSrcScreenInfoCache(srcScreenInfo);
1593     if (cacheRes != DH_SUCCESS) {
1594         DHLOGE("Update SrcScreenInfo cache failed!");
1595         return;
1596     }
1597 
1598     int32_t rpcRes = DistributedInputClient::GetInstance().NotifyStartDScreen(sinkDevId, srcDevId,
1599         srcScreenInfo.sourceWinId);
1600     if (rpcRes != DH_SUCCESS) {
1601         DHLOGE("Rpc invoke failed!");
1602         return;
1603     }
1604 
1605     sptr<IRemoteObject> dScreenSrcSA =
1606         DInputContext::GetInstance().GetRemoteObject(DISTRIBUTED_HARDWARE_SCREEN_SOURCE_SA_ID);
1607     sptr<DScreenSourceSvrRecipient> dScreenSrcDeathRecipient(new(std::nothrow) DScreenSourceSvrRecipient(srcDevId,
1608         sinkDevId, srcScreenInfo.sourceWinId));
1609     dScreenSrcSA->AddDeathRecipient(dScreenSrcDeathRecipient);
1610     DInputContext::GetInstance().AddRemoteObject(DISTRIBUTED_HARDWARE_SCREEN_SOURCE_SA_ID, dScreenSrcSA);
1611 }
1612 
ParseMessage(const std::string & message,std::string & sinkDevId,SrcScreenInfo & srcScreenInfo)1613 int32_t DistributedInputSourceManager::StartDScreenListener::ParseMessage(const std::string &message,
1614     std::string &sinkDevId, SrcScreenInfo &srcScreenInfo)
1615 {
1616     nlohmann::json jsonObj = nlohmann::json::parse(message, nullptr, false);
1617     if (jsonObj.is_discarded()) {
1618         DHLOGE("jsonObj parse failed!");
1619         return ERR_DH_INPUT_JSON_PARSE_FAIL;
1620     }
1621     if (!IsString(jsonObj, SINK_DEVICE_ID)) {
1622         DHLOGE("devId key is invalid");
1623         return ERR_DH_INPUT_JSON_PARSE_FAIL;
1624     }
1625     sinkDevId = jsonObj[SINK_DEVICE_ID].get<std::string>();
1626     if (!IsUInt64(jsonObj, SOURCE_WINDOW_ID)) {
1627         DHLOGE("sourceWinId key is invalid");
1628         return ERR_DH_INPUT_JSON_PARSE_FAIL;
1629     }
1630     srcScreenInfo.sourceWinId = jsonObj[SOURCE_WINDOW_ID].get<uint64_t>();
1631     if (!IsUInt32(jsonObj, SOURCE_WINDOW_WIDTH)) {
1632         DHLOGE("sourceWinWidth key is invalid");
1633         return ERR_DH_INPUT_JSON_PARSE_FAIL;
1634     }
1635     srcScreenInfo.sourceWinWidth = jsonObj[SOURCE_WINDOW_WIDTH].get<std::uint32_t>();
1636     if (!IsUInt32(jsonObj, SOURCE_WINDOW_HEIGHT)) {
1637         DHLOGE("sourceWinHeight key is invalid");
1638         return ERR_DH_INPUT_JSON_PARSE_FAIL;
1639     }
1640     srcScreenInfo.sourceWinHeight = jsonObj[SOURCE_WINDOW_HEIGHT].get<std::uint32_t>();
1641     return DH_SUCCESS;
1642 }
1643 
UpdateSrcScreenInfoCache(const SrcScreenInfo & tmpInfo)1644 int32_t DistributedInputSourceManager::StartDScreenListener::UpdateSrcScreenInfoCache(const SrcScreenInfo &tmpInfo)
1645 {
1646     std::string srcDevId = GetLocalNetworkId();
1647     std::string srcScreenInfoKey = DInputContext::GetInstance().GetScreenInfoKey(srcDevId, tmpInfo.sourceWinId);
1648     SrcScreenInfo srcScreenInfo = DInputContext::GetInstance().GetSrcScreenInfo(srcScreenInfoKey);
1649     srcScreenInfo.devId = srcDevId;
1650     srcScreenInfo.sessionId = DistributedInputSourceTransport::GetInstance().GetCurrentSessionId();
1651     srcScreenInfo.uuid = GetUUIDBySoftBus(srcDevId);
1652     srcScreenInfo.sourceWinId = tmpInfo.sourceWinId;
1653     srcScreenInfo.sourceWinWidth = tmpInfo.sourceWinWidth;
1654     srcScreenInfo.sourceWinHeight = tmpInfo.sourceWinHeight;
1655     srcScreenInfo.sourcePhyId = DistributedInputInject::GetInstance().GenerateVirtualTouchScreenDHId(
1656         srcScreenInfo.sourceWinId, srcScreenInfo.sourceWinWidth, srcScreenInfo.sourceWinHeight);
1657     int32_t virtualScreenFd = DistributedInputInject::GetInstance().GetVirtualTouchScreenFd();
1658     if (virtualScreenFd < 0) {
1659         DHLOGE("virtualScreenFd is invalid");
1660         return ERR_DH_INPUT_SERVER_SOURCE_VIRTUAL_SCREEN_NODE_IS_INVALID;
1661     }
1662     srcScreenInfo.sourcePhyFd = static_cast<uint32_t>(virtualScreenFd);
1663     srcScreenInfo.sourcePhyWidth = tmpInfo.sourceWinWidth;
1664     srcScreenInfo.sourcePhyHeight = tmpInfo.sourceWinHeight;
1665     DHLOGI("StartDScreenListener UpdateSrcScreenInfo the data: devId: %{public}s, sourceWinId: %{public}" PRIu64 ", "
1666         "sourceWinWidth: %{public}d, sourceWinHeight: %{public}d, sourcePhyId: %{public}s, sourcePhyFd: %{public}d, "
1667         "sourcePhyWidth: %{public}d, sourcePhyHeight: %{public}d",
1668         GetAnonyString(srcScreenInfo.devId).c_str(), srcScreenInfo.sourceWinId, srcScreenInfo.sourceWinWidth,
1669         srcScreenInfo.sourceWinHeight, GetAnonyString(srcScreenInfo.sourcePhyId).c_str(), srcScreenInfo.sourcePhyFd,
1670         srcScreenInfo.sourcePhyWidth, srcScreenInfo.sourcePhyHeight);
1671     return DInputContext::GetInstance().UpdateSrcScreenInfo(srcScreenInfoKey, srcScreenInfo);
1672 }
1673 
OnMessage(const DHTopic topic,const std::string & message)1674 void DistributedInputSourceManager::StopDScreenListener::OnMessage(const DHTopic topic, const std::string &message)
1675 {
1676     DHLOGI("StopDScreenListener OnMessage!");
1677     if (topic != DHTopic::TOPIC_STOP_DSCREEN) {
1678         DHLOGE("this topic is wrong, %{public}u", static_cast<uint32_t>(topic));
1679         return;
1680     }
1681     std::string sinkDevId = "";
1682     uint64_t sourceWinId = 0;
1683     int32_t parseRes = ParseMessage(message, sinkDevId, sourceWinId);
1684     if (parseRes != DH_SUCCESS) {
1685         DHLOGE("Message parse failed!");
1686         return;
1687     }
1688 
1689     std::string sourceDevId = GetLocalNetworkId();
1690     std::string screenInfoKey = DInputContext::GetInstance().GetScreenInfoKey(sourceDevId, sourceWinId);
1691     DHLOGI("screenInfoKey: %{public}s", GetAnonyString(screenInfoKey).c_str());
1692     SrcScreenInfo srcScreenInfo = DInputContext::GetInstance().GetSrcScreenInfo(screenInfoKey);
1693 
1694     int32_t removeNodeRes = DistributedInputInject::GetInstance().RemoveVirtualTouchScreenNode(
1695         sourceDevId, srcScreenInfo.sourcePhyId);
1696     if (removeNodeRes != DH_SUCCESS) {
1697         DHLOGE("Remove virtual touch screen node failed!");
1698         return;
1699     }
1700 
1701     int32_t removeCacheRes = DInputContext::GetInstance().RemoveSrcScreenInfo(screenInfoKey);
1702     if (removeCacheRes != DH_SUCCESS) {
1703         DHLOGE("Remove src cache failed!");
1704         return;
1705     }
1706 
1707     int32_t rpcRes = DistributedInputClient::GetInstance().NotifyStopDScreen(sinkDevId, screenInfoKey);
1708     if (rpcRes != DH_SUCCESS) {
1709         DHLOGE("Rpc invoke failed!");
1710         return;
1711     }
1712 }
1713 
ParseMessage(const std::string & message,std::string & sinkDevId,uint64_t & sourceWinId)1714 int32_t DistributedInputSourceManager::StopDScreenListener::ParseMessage(const std::string &message,
1715     std::string &sinkDevId, uint64_t &sourceWinId)
1716 {
1717     nlohmann::json jsonObj = nlohmann::json::parse(message, nullptr, false);
1718     if (jsonObj.is_discarded()) {
1719         DHLOGE("jsonObj parse failed!");
1720         return ERR_DH_INPUT_JSON_PARSE_FAIL;
1721     }
1722     if (!IsString(jsonObj, SINK_DEVICE_ID)) {
1723         DHLOGE("sourceWinId key is invalid");
1724         return ERR_DH_INPUT_JSON_PARSE_FAIL;
1725     }
1726     sinkDevId = jsonObj[SINK_DEVICE_ID].get<std::string>();
1727     if (!IsUInt64(jsonObj, SOURCE_WINDOW_ID)) {
1728         DHLOGE("sourceWinId key is invalid");
1729         return ERR_DH_INPUT_JSON_PARSE_FAIL;
1730     }
1731     sourceWinId = jsonObj[SOURCE_WINDOW_ID].get<uint64_t>();
1732     return DH_SUCCESS;
1733 }
1734 
DeviceOfflineListener(DistributedInputSourceManager * srcManagerContext)1735 DistributedInputSourceManager::DeviceOfflineListener::DeviceOfflineListener(
1736     DistributedInputSourceManager* srcManagerContext)
1737 {
1738     DHLOGI("DeviceOfflineListener ctor!");
1739     sourceManagerContext_ = srcManagerContext;
1740 }
1741 
OnMessage(const DHTopic topic,const std::string & message)1742 void DistributedInputSourceManager::DeviceOfflineListener::OnMessage(const DHTopic topic, const std::string &message)
1743 {
1744     DHLOGI("DeviceOfflineListener OnMessage!");
1745     if (topic != DHTopic::TOPIC_DEV_OFFLINE) {
1746         DHLOGE("this topic is wrong, %{public}u", static_cast<uint32_t>(topic));
1747         return;
1748     }
1749     if (message.empty()) {
1750         DHLOGE("this message is empty");
1751         return;
1752     }
1753 }
1754 
DScreenSourceSvrRecipient(const std::string & srcDevId,const std::string & sinkDevId,const uint64_t srcWinId)1755 DistributedInputSourceManager::DScreenSourceSvrRecipient::DScreenSourceSvrRecipient(const std::string &srcDevId,
1756     const std::string &sinkDevId, const uint64_t srcWinId)
1757 {
1758     DHLOGI("DScreenStatusListener ctor!");
1759     this->srcDevId_ = srcDevId;
1760     this->sinkDevId_ = sinkDevId;
1761     this->srcWinId_ = srcWinId;
1762 }
1763 
OnRemoteDied(const wptr<IRemoteObject> & remote)1764 void DistributedInputSourceManager::DScreenSourceSvrRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
1765 {
1766     DHLOGI("DScreenStatusListener OnRemoveSystemAbility");
1767     sptr<IRemoteObject> remoteObject = remote.promote();
1768     if (!remoteObject) {
1769         DHLOGE("OnRemoteDied remote promoted failed");
1770         return;
1771     }
1772     std::string screenInfoKey = DInputContext::GetInstance().GetScreenInfoKey(srcDevId_, srcWinId_);
1773     SrcScreenInfo srcScreenInfo = DInputContext::GetInstance().GetSrcScreenInfo(screenInfoKey);
1774     std::string sourceDevId = GetLocalNetworkId();
1775     int32_t removeNodeRes = DistributedInputInject::GetInstance().RemoveVirtualTouchScreenNode(
1776         sourceDevId, srcScreenInfo.sourcePhyId);
1777     if (removeNodeRes != DH_SUCCESS) {
1778         DHLOGE("Remove virtual touch screen node failed!");
1779         return;
1780     }
1781 
1782     int32_t removeCacheRes = DInputContext::GetInstance().RemoveSrcScreenInfo(screenInfoKey);
1783     if (removeCacheRes != DH_SUCCESS) {
1784         DHLOGE("Remove src cache failed!");
1785         return;
1786     }
1787 
1788     int32_t rpcRes = DistributedInputClient::GetInstance().NotifyStopDScreen(sinkDevId_, screenInfoKey);
1789     if (rpcRes != DH_SUCCESS) {
1790         DHLOGE("Rpc invoke failed!");
1791         return;
1792     }
1793     DInputContext::GetInstance().RemoveRemoteObject(DISTRIBUTED_HARDWARE_SCREEN_SOURCE_SA_ID);
1794 }
1795 
Dump(int32_t fd,const std::vector<std::u16string> & args)1796 int32_t DistributedInputSourceManager::Dump(int32_t fd, const std::vector<std::u16string> &args)
1797 {
1798     DHLOGI("DistributedInputSourceManager Dump.");
1799     std::vector<std::string> argsStr(args.size());
1800     std::transform(args.begin(), args.end(), argsStr.begin(), [](const auto &item) {return Str16ToStr8(item);});
1801     std::string result("");
1802     if (!HiDumper::GetInstance().HiDump(argsStr, result)) {
1803         DHLOGI("Hidump error.");
1804         return ERR_DH_INPUT_HIDUMP_DUMP_PROCESS_FAIL;
1805     }
1806 
1807     int ret = dprintf(fd, "%{public}s\n", result.c_str());
1808     if (ret < 0) {
1809         DHLOGE("dprintf error.");
1810         return ERR_DH_INPUT_HIDUMP_DPRINTF_FAIL;
1811     }
1812     return DH_SUCCESS;
1813 }
1814 
AddPrepareCallbacks(const DInputClientPrepareInfo & info)1815 void DistributedInputSourceManager::AddPrepareCallbacks(const DInputClientPrepareInfo &info)
1816 {
1817     std::lock_guard<std::mutex> lock(prepareMutex_);
1818     preCallbacks_.insert(info);
1819 }
1820 
RemovePrepareCallbacks(const DInputClientPrepareInfo & info)1821 void DistributedInputSourceManager::RemovePrepareCallbacks(const DInputClientPrepareInfo &info)
1822 {
1823     std::lock_guard<std::mutex> lock(prepareMutex_);
1824     preCallbacks_.erase(info);
1825 }
1826 
AddUnPrepareCallbacks(const DInputClientUnprepareInfo & info)1827 void DistributedInputSourceManager::AddUnPrepareCallbacks(const DInputClientUnprepareInfo &info)
1828 {
1829     std::lock_guard<std::mutex> lock(prepareMutex_);
1830     unpreCallbacks_.insert(info);
1831 }
1832 
RemoveUnPrepareCallbacks(const DInputClientUnprepareInfo & info)1833 void DistributedInputSourceManager::RemoveUnPrepareCallbacks(const DInputClientUnprepareInfo &info)
1834 {
1835     std::lock_guard<std::mutex> lock(prepareMutex_);
1836     unpreCallbacks_.erase(info);
1837 }
1838 
AddRelayPrepareCallbacks(const DInputClientRelayPrepareInfo & info)1839 void DistributedInputSourceManager::AddRelayPrepareCallbacks(const DInputClientRelayPrepareInfo &info)
1840 {
1841     std::lock_guard<std::mutex> lock(prepareMutex_);
1842     relayPreCallbacks_.insert(info);
1843 }
1844 
RemoveRelayPrepareCallbacks(const DInputClientRelayPrepareInfo & info)1845 void DistributedInputSourceManager::RemoveRelayPrepareCallbacks(const DInputClientRelayPrepareInfo &info)
1846 {
1847     std::lock_guard<std::mutex> lock(prepareMutex_);
1848     relayPreCallbacks_.erase(info);
1849 }
1850 
AddRelayUnPrepareCallbacks(const DInputClientRelayUnprepareInfo & info)1851 void DistributedInputSourceManager::AddRelayUnPrepareCallbacks(const DInputClientRelayUnprepareInfo &info)
1852 {
1853     std::lock_guard<std::mutex> lock(prepareMutex_);
1854     relayUnpreCallbacks_.insert(info);
1855 }
1856 
RemoveRelayUnPrepareCallbacks(const DInputClientRelayUnprepareInfo & info)1857 void DistributedInputSourceManager::RemoveRelayUnPrepareCallbacks(const DInputClientRelayUnprepareInfo &info)
1858 {
1859     std::lock_guard<std::mutex> lock(prepareMutex_);
1860     relayUnpreCallbacks_.erase(info);
1861 }
1862 } // namespace DistributedInput
1863 } // namespace DistributedHardware
1864 } // namespace OHOS
1865