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