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