1 /*
2 * Copyright (c) 2022 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 "dscreen_manager.h"
17
18 #include <map>
19
20 #include "if_system_ability_manager.h"
21 #include "iservice_registry.h"
22 #include "nlohmann/json.hpp"
23
24 #include "dscreen_constants.h"
25 #include "dscreen_errcode.h"
26 #include "dscreen_fwkkit.h"
27 #include "dscreen_json_util.h"
28 #include "dscreen_log.h"
29 #include "dscreen_util.h"
30 #include "idscreen_sink.h"
31 #include "screen_manager_adapter.h"
32
33 using json = nlohmann::json;
34
35 namespace OHOS {
36 namespace DistributedHardware {
37 IMPLEMENT_SINGLE_INSTANCE(DScreenManager);
38
39 const std::map<DScreenState, std::string> stateMap = {
40 { DISABLED, "disabled" },
41 { ENABLED, "enabled" },
42 { DISABLING, "disabling" },
43 { ENABLING, "enabling" },
44 { CONNECTING, "connecting" },
45 { CONNECTED, "connected" },
46 { DISCONNECTING, "disconnecting" }
47 };
48
DScreenManager()49 DScreenManager::DScreenManager()
50 {
51 DHLOGI("DScreenMgr construct.");
52 }
53
~DScreenManager()54 DScreenManager::~DScreenManager()
55 {
56 DHLOGI("DScreenMgr deConstruct.");
57 }
58
Init()59 int32_t DScreenManager::Init()
60 {
61 DHLOGI("DScreenManager::Init");
62 if (dScreenGroupListener_ == nullptr) {
63 dScreenGroupListener_ = new (std::nothrow) DScreenGroupListener();
64 int32_t ret = ScreenMgrAdapter::GetInstance().RegisterScreenGroupListener(dScreenGroupListener_);
65 if (ret != DH_SUCCESS) {
66 DHLOGE("DScreenManager Init failed, err: %d", ret);
67 delete dScreenGroupListener_;
68 dScreenGroupListener_ = nullptr;
69 return ret;
70 }
71 }
72
73 if (dScreenCallback_ == nullptr) {
74 dScreenCallback_ = std::make_shared<DScreenCallback>();
75 }
76
77 return DH_SUCCESS;
78 }
79
UnInit()80 int32_t DScreenManager::UnInit()
81 {
82 DHLOGI("DScreenManager::UnInit");
83 int32_t ret = ScreenMgrAdapter::GetInstance().UnregisterScreenGroupListener(dScreenGroupListener_);
84 if (ret != DH_SUCCESS) {
85 DHLOGE("DScreenManager UnInit failed, err: %d", ret);
86 }
87
88 dScreenCallback_ = nullptr;
89
90 {
91 std::lock_guard<std::mutex> lock(dScreenMapMtx_);
92 dScreens_.clear();
93 }
94
95 {
96 std::lock_guard<std::mutex> lock(dScreenMapRelationMtx_);
97 mapRelations_.clear();
98 }
99 DHLOGI("DScreenManager::UnInit success");
100 return ret;
101 }
102
OnChange(const std::vector<uint64_t> & screenIds,Rosen::ScreenGroupChangeEvent event)103 void DScreenGroupListener::OnChange(const std::vector<uint64_t> &screenIds, Rosen::ScreenGroupChangeEvent event)
104 {
105 DHLOGI("On Screen change, screenIds size: %d", screenIds.size());
106 for (uint64_t screenId : screenIds) {
107 std::shared_ptr<DScreen> changedScreen = DScreenManager::GetInstance().FindDScreenByScreenId(screenId);
108 if (changedScreen == nullptr) {
109 DHLOGD("screen change not about remote screen, screenId: %ulld", screenId);
110 continue;
111 }
112 DScreenManager::GetInstance().HandleScreenChange(changedScreen, event);
113 }
114 }
115
HandleScreenChange(const std::shared_ptr<DScreen> & changedScreen,Rosen::ScreenGroupChangeEvent event)116 void DScreenManager::HandleScreenChange(const std::shared_ptr<DScreen> &changedScreen,
117 Rosen::ScreenGroupChangeEvent event)
118 {
119 if (changedScreen == nullptr) {
120 DHLOGE("DScreenManager::HandleScreenChange, dScreen is null.");
121 return;
122 }
123
124 uint64_t screenId = changedScreen->GetScreenId();
125 DHLOGI("DScreenManager::HandleScreenChange, screenId: %ulld, changeEvent: %", screenId, event);
126 if (event == Rosen::ScreenGroupChangeEvent::ADD_TO_GROUP) {
127 if (DH_SUCCESS != AddToGroup(changedScreen, screenId)) {
128 DHLOGE("AddToGroup failed.");
129 return;
130 }
131 NotifyRemoteSinkSetUp(changedScreen);
132 PublishMessage(DHTopic::TOPIC_START_DSCREEN, changedScreen);
133 } else if (event == Rosen::ScreenGroupChangeEvent::REMOVE_FROM_GROUP) {
134 if (DH_SUCCESS != RemoveFromGroup(changedScreen, screenId)) {
135 DHLOGE("RemoveFromGroup failed.");
136 }
137 PublishMessage(DHTopic::TOPIC_STOP_DSCREEN, changedScreen);
138 } else if (event == Rosen::ScreenGroupChangeEvent::CHANGE_GROUP) {
139 DHLOGE("CHANGE_GROUP not implement.");
140 } else {
141 DHLOGE("unknown change type.");
142 }
143 }
144
AddToGroup(const std::shared_ptr<DScreen> & changedScreen,uint64_t screenId)145 int32_t DScreenManager::AddToGroup(const std::shared_ptr<DScreen> &changedScreen, uint64_t screenId)
146 {
147 DHLOGI("DScreenManager::ADDToGroup, screenId: %ulld", screenId);
148 if (changedScreen == nullptr) {
149 DHLOGE("DScreenManager::ADDToGroup, dScreen is null.");
150 return ERR_DH_SCREEN_SA_VALUE_NOT_INIT;
151 }
152
153 if (changedScreen->GetState() == CONNECTING) {
154 DHLOGD("screen is connecting, no need handle change");
155 return DH_SUCCESS;
156 }
157 std::shared_ptr<DScreenMapRelation> mapRelation = ScreenMgrAdapter::GetInstance().GetMapRelation(screenId);
158 if (mapRelation == nullptr) {
159 DHLOGE("mapRelation construct failed. screenId: %ulld", screenId);
160 return ERR_DH_SCREEN_SA_VALUE_NOT_INIT;
161 }
162
163 std::shared_ptr<VideoParam> videoParam = changedScreen->GetVideoParam();
164 DisplayRect displayRect = mapRelation->GetDisplayRect();
165 videoParam->SetVideoWidth(displayRect.width);
166 videoParam->SetVideoHeight(displayRect.height);
167 changedScreen->SetState(CONNECTING);
168
169 {
170 std::lock_guard<std::mutex> lock(dScreenMapRelationMtx_);
171 mapRelations_[screenId] = mapRelation;
172 }
173 return DH_SUCCESS;
174 }
175
RemoveFromGroup(const std::shared_ptr<DScreen> & changedScreen,uint64_t screenId)176 int32_t DScreenManager::RemoveFromGroup(const std::shared_ptr<DScreen> &changedScreen, uint64_t screenId)
177 {
178 DHLOGI("DScreenManager::RemoveFromGroup, screenId: %ulld", screenId);
179 if (changedScreen == nullptr) {
180 DHLOGE("DScreenManager::RemoveFromGroup, dScreen is null.");
181 return ERR_DH_SCREEN_SA_VALUE_NOT_INIT;
182 }
183
184 if (changedScreen->GetState() == DISCONNECTING) {
185 DHLOGD("screen is disconnecting, no need handle change");
186 return DH_SUCCESS;
187 }
188
189 {
190 std::lock_guard<std::mutex> lock(dScreenMapRelationMtx_);
191 mapRelations_.erase(screenId);
192 }
193 changedScreen->AddTask(std::make_shared<Task>(TaskType::TASK_DISCONNECT, ""));
194 return DH_SUCCESS;
195 }
196
OnRegResult(const std::shared_ptr<DScreen> & dScreen,const std::string & reqId,const int32_t status,const std::string & data)197 void DScreenCallback::OnRegResult(const std::shared_ptr<DScreen> &dScreen,
198 const std::string &reqId, const int32_t status, const std::string &data)
199 {
200 DHLOGI("DScreenCallback::OnRegResult, devId: %s, dhId: %s, reqId: %s",
201 GetAnonyString(dScreen->GetDevId()).c_str(), GetAnonyString(dScreen->GetDHId()).c_str(), reqId.c_str());
202 DScreenManager::GetInstance().OnRegResult(dScreen, reqId, status, data);
203 }
204
OnUnregResult(const std::shared_ptr<DScreen> & dScreen,const std::string & reqId,const int32_t status,const std::string & data)205 void DScreenCallback::OnUnregResult(const std::shared_ptr<DScreen> &dScreen,
206 const std::string &reqId, const int32_t status, const std::string &data)
207 {
208 DHLOGI("DScreenCallback::OnUnregResult, devId: %s, dhId: %s, reqId: %s",
209 GetAnonyString(dScreen->GetDevId()).c_str(), GetAnonyString(dScreen->GetDHId()).c_str(), reqId.c_str());
210 DScreenManager::GetInstance().OnUnregResult(dScreen, reqId, status, data);
211 }
212
OnRegResult(const std::shared_ptr<DScreen> & dScreen,const std::string & reqId,const int32_t status,const std::string & data)213 void DScreenManager::OnRegResult(const std::shared_ptr<DScreen> &dScreen,
214 const std::string &reqId, const int32_t status, const std::string &data)
215 {
216 DHLOGI("DScreenManager::OnRegResult, devId: %s, dhId: %s, reqId: %s",
217 GetAnonyString(dScreen->GetDevId()).c_str(), GetAnonyString(dScreen->GetDHId()).c_str(), reqId.c_str());
218 if (dScreenSourceCallbackProxy_ == nullptr) {
219 DHLOGE("dScreenSourceCallbackProxy is null");
220 return;
221 }
222 dScreenSourceCallbackProxy_->OnNotifyRegResult(dScreen->GetDevId(), dScreen->GetDHId(), reqId, status, data);
223 }
224
OnUnregResult(const std::shared_ptr<DScreen> & dScreen,const std::string & reqId,const int32_t status,const std::string & data)225 void DScreenManager::OnUnregResult(const std::shared_ptr<DScreen> &dScreen,
226 const std::string &reqId, const int32_t status, const std::string &data)
227 {
228 DHLOGI("DScreenManager::OnUnregResult, devId: %s, dhId: %s, reqId: %s",
229 GetAnonyString(dScreen->GetDevId()).c_str(), GetAnonyString(dScreen->GetDHId()).c_str(), reqId.c_str());
230 if (dScreenSourceCallbackProxy_ == nullptr) {
231 DHLOGE("dScreenSourceCallbackProxy is null");
232 return;
233 }
234 dScreenSourceCallbackProxy_->OnNotifyUnregResult(dScreen->GetDevId(), dScreen->GetDHId(), reqId, status, data);
235 }
236
EnableDistributedScreen(const std::string & devId,const std::string & dhId,const std::string & attrs,const std::string & reqId)237 int32_t DScreenManager::EnableDistributedScreen(const std::string &devId, const std::string &dhId,
238 const std::string &attrs, const std::string &reqId)
239 {
240 DHLOGI("EnableDistributedScreen, devId: %s, dhId:%s",
241 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
242 if (dScreenCallback_ == nullptr) {
243 DHLOGE("dscreen manager not init.");
244 return ERR_DH_SCREEN_SA_ENABLE_FAILED;
245 }
246
247 std::string dScreenIdx = devId + SEPERATOR + dhId;
248 std::lock_guard<std::mutex> lock(dScreenMapMtx_);
249 std::shared_ptr<DScreen> dScreen = dScreens_[dScreenIdx];
250 if (dScreen == nullptr) {
251 dScreen = std::make_shared<DScreen>(devId, dhId, dScreenCallback_);
252 }
253
254 int32_t dScreenState = dScreen->GetState();
255 if (dScreenState == ENABLED || dScreenState == ENABLING) {
256 DHLOGI("dScreen state Already is ENABLED or ENABLING.");
257 return DH_SUCCESS;
258 }
259
260 dScreens_[dScreenIdx] = dScreen;
261 int32_t ret = dScreen->AddTask(std::make_shared<Task>(TaskType::TASK_ENABLE, reqId, attrs));
262 if (ret != DH_SUCCESS) {
263 DHLOGE("EnableDistributedScreen, add task failed. devId: %s, dhId:%s",
264 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
265 }
266
267 return ret;
268 }
269
DisableDistributedScreen(const std::string & devId,const std::string & dhId,const std::string & reqId)270 int32_t DScreenManager::DisableDistributedScreen(const std::string &devId, const std::string &dhId,
271 const std::string &reqId)
272 {
273 DHLOGI("DisableDistributedScreen, devId: %s, dhId:%s",
274 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
275
276 std::string dScreenIdx = devId + SEPERATOR + dhId;
277 std::lock_guard<std::mutex> lock(dScreenMapMtx_);
278 if (dScreens_.count(dScreenIdx) == 0) {
279 DHLOGE("dscreen not found, devId: %s, dhId: %s",
280 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
281 return ERR_DH_SCREEN_SA_DISABLE_FAILED;
282 }
283
284 int32_t dScreenState = dScreens_[dScreenIdx]->GetState();
285 int32_t ret = DH_SUCCESS;
286 switch (dScreenState) {
287 case DISABLED:
288 case DISABLING:
289 DHLOGE("dScreen state is invalid.");
290 ret = ERR_DH_SCREEN_SA_DISABLE_FAILED;
291 break;
292 case ENABLED:
293 case ENABLING:
294 ret = dScreens_[dScreenIdx]->AddTask(std::make_shared<Task>(TaskType::TASK_DISABLE, reqId, ""));
295 break;
296 case CONNECTING:
297 case CONNECTED:
298 case DISCONNECTING:
299 ret = dScreens_[dScreenIdx]->AddTask(std::make_shared<Task>(TaskType::TASK_DISCONNECT, ""));
300 if (ret == DH_SUCCESS) {
301 ret = dScreens_[dScreenIdx]->AddTask(std::make_shared<Task>(TaskType::TASK_DISABLE, reqId, ""));
302 }
303 break;
304 default:
305 ret = ERR_DH_SCREEN_SA_DISABLE_FAILED;
306 break;
307 }
308 return ret;
309 }
310
RegisterDScreenCallback(const sptr<IDScreenSourceCallback> & callback)311 void DScreenManager::RegisterDScreenCallback(const sptr<IDScreenSourceCallback> &callback)
312 {
313 DHLOGI("RegisterDScreenCallback");
314 dScreenSourceCallbackProxy_ = callback;
315 }
316
FindDScreenByScreenId(uint64_t screenId)317 std::shared_ptr<DScreen> DScreenManager::FindDScreenByScreenId(uint64_t screenId)
318 {
319 DHLOGD("FindDScreenByScreenId, screenId: %ulld", screenId);
320 std::lock_guard<std::mutex> lock(dScreenMapMtx_);
321 for (const auto &iter : dScreens_) {
322 std::shared_ptr<DScreen> dScreen = iter.second;
323 if (dScreen == nullptr) {
324 continue;
325 }
326
327 if (dScreen->GetScreenId() == screenId) {
328 return dScreen;
329 }
330 }
331 DHLOGD("DScreen not found, screenId: %ulld", screenId);
332 return nullptr;
333 }
334
GetScreenDumpInfo(std::string & result)335 void DScreenManager::GetScreenDumpInfo(std::string &result)
336 {
337 DHLOGI("GetScreenDumpInfo.");
338 result.clear();
339 result.append("RemoteScreens OnLine:\n[\n");
340 std::lock_guard<std::mutex> lock(dScreenMapMtx_);
341 if (dScreens_.size() == 0) {
342 result.append("]");
343 DHLOGD("no virtualscreen");
344 return;
345 }
346
347 for (const auto &iter : dScreens_) {
348 result.append(" {\n");
349 std::shared_ptr<DScreen> dScreen = iter.second;
350 if (dScreen == nullptr) {
351 continue;
352 }
353 uint64_t screenId = dScreen->GetScreenId();
354 std::string devId = dScreen->GetDevId();
355 std::shared_ptr<VideoParam> videoParam = dScreen->GetVideoParam();
356 if (videoParam == nullptr) {
357 continue;
358 }
359 uint32_t screenHeight = videoParam->GetScreenHeight();
360 uint32_t screenWidth = videoParam->GetScreenWidth();
361 DScreenState state = dScreen->GetState();
362 std::string screenState =
363 stateMap.find(state) == stateMap.end() ? "unknown state" : stateMap.find(state)->second;
364 std::string screenInfo = " \"virtualScreenId\" : \"" + std::to_string(screenId) + "\",\n" +
365 " \"localDevId\" : \"" + GetAnonyString(localDevId_) + "\",\n" +
366 " \"remoteDevId\" : \"" + GetAnonyString(devId) + "\",\n" +
367 " \"screenWidth\" : \"" + std::to_string(screenWidth) + "\",\n" +
368 " \"screenHeight\" : \"" + std::to_string(screenHeight) + "\",\n" +
369 " \"state\" : \"" + screenState + "\"\n";
370 result.append(screenInfo);
371 }
372 result.append(" }\n]");
373 }
374
HandleDScreenNotify(const std::string & devId,int32_t eventCode,const std::string & eventContent)375 void DScreenManager::HandleDScreenNotify(const std::string &devId, int32_t eventCode,
376 const std::string &eventContent)
377 {
378 DHLOGI("HandleDScreenNotify, devId: %s, eventCode: %d", GetAnonyString(devId).c_str(), eventCode);
379 if (eventCode == NOTIFY_SOURCE_SETUP_RESULT) {
380 HandleNotifySetUpResult(devId, eventContent);
381 return;
382 }
383
384 DHLOGE("invalid eventCode, eventCode: %d", eventCode);
385 }
386
NotifyRemoteScreenService(const std::string & devId,int32_t eventCode,const std::string & eventContent)387 int32_t DScreenManager::NotifyRemoteScreenService(const std::string &devId, int32_t eventCode,
388 const std::string &eventContent)
389 {
390 DHLOGI("Notify remote sink screen service, remote devId: %s, eventCode: %d",
391 GetAnonyString(devId).c_str(), eventCode);
392 sptr<IDScreenSink> remoteSinkSA = GetDScreenSinkSA(devId);
393 if (remoteSinkSA == nullptr) {
394 DHLOGE("get remote sink sa failed.");
395 return ERR_DH_SCREEN_SA_GET_REMOTE_SINK_SERVICE_FAIL;
396 }
397 std::string localDevId;
398 int32_t ret = GetLocalDeviceNetworkId(localDevId);
399 if (ret != DH_SUCCESS) {
400 DHLOGE("notify remote screen service failed, cannot get local device id");
401 return ret;
402 }
403 localDevId_ = localDevId;
404 remoteSinkSA->DScreenNotify(localDevId, eventCode, eventContent);
405 return DH_SUCCESS;
406 }
407
GetDScreenSinkSA(const std::string & devId)408 sptr<IDScreenSink> DScreenManager::GetDScreenSinkSA(const std::string &devId)
409 {
410 DHLOGI("GetDScreenSinkSA, devId: %s", GetAnonyString(devId).c_str());
411 sptr<ISystemAbilityManager> samgr =
412 SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
413 if (samgr == nullptr) {
414 DHLOGE("Failed to get system ability mgr.");
415 return nullptr;
416 }
417 auto remoteObject = samgr->GetSystemAbility(DISTRIBUTED_HARDWARE_SCREEN_SINK_SA_ID, devId);
418 if (remoteObject == nullptr) {
419 DHLOGE("remoteObject is null");
420 return nullptr;
421 }
422
423 sptr<IDScreenSink> remoteSinkSA = iface_cast<IDScreenSink>(remoteObject);
424 if (remoteSinkSA == nullptr) {
425 DHLOGE("Failed to get remote dscreen sink sa");
426 return nullptr;
427 }
428 return remoteSinkSA;
429 }
430
PublishMessage(const DHTopic topic,const std::shared_ptr<DScreen> & dScreen)431 void DScreenManager::PublishMessage(const DHTopic topic, const std::shared_ptr<DScreen> &dScreen)
432 {
433 DHLOGD("PublishMessage");
434 if (DScreenFwkKit::GetInstance().GetDHFwkKit() == nullptr) {
435 DHLOGE("GetDHFwkKit fail.");
436 return;
437 }
438
439 json messageJosn;
440 std::string message;
441 if (topic == DHTopic::TOPIC_START_DSCREEN) {
442 messageJosn[SOURCE_WIN_ID] = dScreen->GetScreenId();
443 messageJosn[SINK_DEV_ID] = dScreen->GetDevId();
444 std::shared_ptr<VideoParam> videoParam = dScreen->GetVideoParam();
445 if (videoParam == nullptr) {
446 DHLOGE("videoParam is nullptr");
447 return;
448 }
449 messageJosn[SOURCE_WIN_WIDTH] = videoParam->GetScreenWidth();
450 messageJosn[SOURCE_WIN_HEIGHT] = videoParam->GetScreenHeight();
451 message = messageJosn.dump();
452 } else if (topic == DHTopic::TOPIC_STOP_DSCREEN) {
453 messageJosn[SOURCE_WIN_ID] = dScreen->GetScreenId();
454 messageJosn[SINK_DEV_ID] = dScreen->GetDevId();
455 message = messageJosn.dump();
456 }
457
458 DScreenFwkKit::GetInstance().GetDHFwkKit()->PublishMessage(topic, message);
459 }
460
NotifyRemoteSinkSetUp(const std::shared_ptr<DScreen> & dScreen)461 void DScreenManager::NotifyRemoteSinkSetUp(const std::shared_ptr<DScreen> &dScreen)
462 {
463 DHLOGI("NotifyRemoteSinkSetUp");
464 int32_t eventCode = NOTIFY_SINK_SETUP;
465 std::string devId = dScreen->GetDevId();
466 json eventContentJson;
467 eventContentJson[KEY_SCREEN_ID] = dScreen->GetScreenId();
468 eventContentJson[KEY_DH_ID] = dScreen->GetDHId();
469 if (dScreen->GetVideoParam() == nullptr) {
470 DHLOGE("videoParam is null, back to enabled state screedId: %ulld", dScreen->GetScreenId());
471 dScreen->SetState(ENABLED);
472 return;
473 }
474 eventContentJson[KEY_VIDEO_PARAM] = *(dScreen->GetVideoParam());
475
476 if (mapRelations_.count(dScreen->GetScreenId()) == 0) {
477 DHLOGE("mapRelation not found, back to enabled state screedId: %ulld", dScreen->GetScreenId());
478 dScreen->SetState(ENABLED);
479 return;
480 }
481 eventContentJson[KEY_MAPRELATION] = *(mapRelations_[dScreen->GetScreenId()]);
482
483 std::string eventContent = eventContentJson.dump();
484 DHLOGD("start notify remote screen, eventContent: %s", eventContent.c_str());
485 NotifyRemoteScreenService(devId, eventCode, eventContent);
486 }
487
CheckContent(json & eventContent)488 bool DScreenManager::CheckContent(json &eventContent)
489 {
490 if (!IsString(eventContent, KEY_DH_ID)) {
491 return false;
492 }
493 if (!IsInt32(eventContent, KEY_ERR_CODE)) {
494 return false;
495 }
496 if (!IsString(eventContent, KEY_ERR_CONTENT)) {
497 return false;
498 }
499 return true;
500 }
501
HandleNotifySetUpResult(const std::string & remoteDevId,const std::string & eventContent)502 void DScreenManager::HandleNotifySetUpResult(const std::string &remoteDevId, const std::string &eventContent)
503 {
504 DHLOGI("HandleNotifySetUpResult, remoteDevId:%s", GetAnonyString(remoteDevId).c_str());
505 json eventContentJson = json::parse(eventContent, nullptr, false);
506 if (eventContentJson.is_discarded()) {
507 DHLOGE("HandleNotifySetUpResult, eventContent is invalid");
508 return;
509 }
510
511 if (!CheckContent(eventContentJson)) {
512 DHLOGE("HandleNotifySetUpResult, eventContent is invalid");
513 return;
514 }
515
516 std::string dhId = eventContentJson[KEY_DH_ID].get<std::string>();
517 int32_t errCode = eventContentJson[KEY_ERR_CODE].get<int32_t>();
518 std::string errContent = eventContentJson[KEY_ERR_CONTENT].get<std::string>();
519
520 std::string dScreenIdx = remoteDevId + SEPERATOR + dhId;
521 std::lock_guard<std::mutex> lock(dScreenMapMtx_);
522 if (dScreens_.count(dScreenIdx) == 0) {
523 DHLOGE("dScreen not found, remoteDevId:%s, dhId:%s",
524 GetAnonyString(remoteDevId).c_str(), GetAnonyString(dhId).c_str());
525 return;
526 }
527
528 if (errCode != DH_SUCCESS) {
529 DHLOGE("remote sink set up failed, errCode: %d, reason: %s", errCode, errContent.c_str());
530 dScreens_[dScreenIdx]->SetState(ENABLED);
531 return;
532 }
533
534 dScreens_[dScreenIdx]->AddTask(std::make_shared<Task>(TaskType::TASK_CONNECT, ""));
535 }
536 } // namespace DistributedHardware
537 } // namespace OHOS