• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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