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