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