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 ¶meters, 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 ¶meters, 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