1 /*
2 * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development 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 "wfd_sink_scene.h"
17 #include <unistd.h>
18 #include "common/common_macro.h"
19 #include "common/reflect_registration.h"
20 #include "common/sharing_log.h"
21 #include "configuration/include/config.h"
22 #include "const_def.h"
23 #include "extend/magic_enum/magic_enum.hpp"
24 #include "iservice_registry.h"
25 #include "network/socket/socket_utils.h"
26 #include "system_ability_definition.h"
27 #include "utils/utils.h"
28 #include "wfd_session_def.h"
29 #include "wfd_trust_list_manager.h"
30
31 using namespace OHOS::DistributedHardware;
32 namespace OHOS {
33 namespace Sharing {
34 constexpr int P2P_LISTEN_INTERVAL = 500;
35 constexpr int P2P_LISTEN_PERIOD = 500;
36 constexpr int DM_MAX_NAME_LENGTH = 32;
37 const std::string DEFAULT_P2P_IPADDR = "192.168.49.1";
38
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)39 void WfdSinkScene::WfdSystemAbilityListener::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
40 {
41 if (systemAbilityId == WIFI_DEVICE_ABILITY_ID) {
42 SHARING_LOGI("%{public}s, id is %{public}d.", __FUNCTION__, systemAbilityId);
43 auto scene = scene_.lock();
44 if (scene == nullptr) {
45 SHARING_LOGE("WfdSinkScene is null");
46 return;
47 }
48 scene->OnWifiAbilityResume();
49 }
50 }
51
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)52 void WfdSinkScene::WfdSystemAbilityListener::OnRemoveSystemAbility(int32_t systemAbilityId,
53 const std::string& deviceId)
54 {
55 if (systemAbilityId == WIFI_DEVICE_ABILITY_ID) {
56 SHARING_LOGI("%{public}s, id is %{public}d.", __FUNCTION__, systemAbilityId);
57 auto scene = scene_.lock();
58 if (scene == nullptr) {
59 SHARING_LOGE("WfdSinkScene is null");
60 return;
61 }
62 scene->OnWifiAbilityDied();
63 }
64 }
65
OnP2pStateChanged(int32_t state)66 void WfdSinkScene::WfdP2pCallback::OnP2pStateChanged(int32_t state)
67 {
68 SHARING_LOGI("state: %{public}d.", state);
69 auto parent = parent_.lock();
70 if (parent) {
71 switch (state) {
72 case (int32_t)Wifi::P2pState::P2P_STATE_NONE:
73 break;
74 case (int32_t)Wifi::P2pState::P2P_STATE_IDLE:
75 break;
76 case (int32_t)Wifi::P2pState::P2P_STATE_STARTING:
77 break;
78 case (int32_t)Wifi::P2pState::P2P_STATE_STARTED:
79 if (parent->isSinkRunning_) {
80 parent->WfdP2pStart();
81 }
82 break;
83 case (int32_t)Wifi::P2pState::P2P_STATE_CLOSING:
84 break;
85 case (int32_t)Wifi::P2pState::P2P_STATE_CLOSED:
86 if (parent->isSinkRunning_) {
87 parent->isSinkRunning_ = false;
88 parent->WfdP2pStop();
89 parent->OnInnerError("", SharingErrorCode::ERR_NETWORK_ERROR, "NETWORK ERROR, P2P MODULE STOPPED");
90 }
91 break;
92 default:
93 SHARING_LOGI("none process case.");
94 break;
95 }
96 }
97 }
98
OnP2pPersistentGroupsChanged(void)99 void WfdSinkScene::WfdP2pCallback::OnP2pPersistentGroupsChanged(void)
100 {
101 SHARING_LOGD("trace.");
102 }
103
OnP2pThisDeviceChanged(const Wifi::WifiP2pDevice & device)104 void WfdSinkScene::WfdP2pCallback::OnP2pThisDeviceChanged(const Wifi::WifiP2pDevice &device)
105 {
106 SHARING_LOGD("trace.");
107 }
108
OnP2pPeersChanged(const std::vector<Wifi::WifiP2pDevice> & device)109 void WfdSinkScene::WfdP2pCallback::OnP2pPeersChanged(const std::vector<Wifi::WifiP2pDevice> &device)
110 {
111 SHARING_LOGD("trace.");
112 auto parent = parent_.lock();
113 if (parent) {
114 SHARING_LOGI("device size: %{public}zu.", device.size());
115 for (auto itDev : device) {
116 auto status = itDev.GetP2pDeviceStatus();
117 SHARING_LOGI("device mac: %{public}s, status: %{public}d.",
118 GetAnonyString(itDev.GetDeviceAddress()).c_str(), status);
119 switch (status) {
120 case Wifi::P2pDeviceStatus::PDS_AVAILABLE: {
121 ConnectionInfo connectionInfo;
122 connectionInfo.mac = itDev.GetDeviceAddress();
123 connectionInfo.deviceName = itDev.GetDeviceName();
124 connectionInfo.primaryDeviceType = itDev.GetPrimaryDeviceType();
125 connectionInfo.secondaryDeviceType = itDev.GetSecondaryDeviceType();
126 connectionInfo.ctrlPort = itDev.GetWfdInfo().GetCtrlPort();
127 connectionInfo.state = ConnectionState::DISCONNECTED;
128
129 parent->OnP2pPeerDisconnected(connectionInfo);
130 break;
131 }
132 case Wifi::P2pDeviceStatus::PDS_CONNECTED: {
133 parent->currentConnectDev_.mac = itDev.GetDeviceAddress();
134 parent->currentConnectDev_.deviceName = itDev.GetDeviceName();
135 parent->currentConnectDev_.primaryDeviceType = itDev.GetPrimaryDeviceType();
136 parent->currentConnectDev_.secondaryDeviceType = itDev.GetSecondaryDeviceType();
137 parent->currentConnectDev_.ctrlPort = itDev.GetWfdInfo().GetCtrlPort();
138 parent->currentConnectDev_.ip = "";
139 parent->currentConnectDev_.state = ConnectionState::CONNECTED;
140 break;
141 }
142 default:
143 SHARING_LOGI("none process case.");
144 break;
145 }
146 }
147 }
148 }
149
OnP2pPrivatePeersChanged(const std::string & priWfdInfo)150 void WfdSinkScene::WfdP2pCallback::OnP2pPrivatePeersChanged(const std::string &priWfdInfo)
151 {
152 SHARING_LOGD("trace.");
153 }
154
OnP2pServicesChanged(const std::vector<Wifi::WifiP2pServiceInfo> & srvInfo)155 void WfdSinkScene::WfdP2pCallback::OnP2pServicesChanged(const std::vector<Wifi::WifiP2pServiceInfo> &srvInfo)
156 {
157 SHARING_LOGD("trace.");
158 }
159
OnP2pConnectionChanged(const Wifi::WifiP2pLinkedInfo & info)160 void WfdSinkScene::WfdP2pCallback::OnP2pConnectionChanged(const Wifi::WifiP2pLinkedInfo &info)
161 {
162 SHARING_LOGI("trace");
163 auto parent = parent_.lock();
164 RETURN_IF_NULL(parent);
165 if (!parent->isSinkRunning_) {
166 return;
167 }
168
169 Wifi::P2pConnectedState state = info.GetConnectState();
170 if (state == Wifi::P2pConnectedState::P2P_DISCONNECTED) {
171 SHARING_LOGI("OnP2pConnectionChanged disconnected");
172 if (parent->currentConnectDev_.mac != "") {
173 parent->OnP2pPeerDisconnected(parent->currentConnectDev_.mac);
174 }
175 parent->localIp_ = "";
176 parent->WfdP2pStart();
177 return;
178 }
179
180 Wifi::WifiP2pGroupInfo group;
181 if (Wifi::ErrCode::WIFI_OPT_SUCCESS != parent->p2pInstance_->GetCurrentGroup(group)) {
182 SHARING_LOGE("GetCurrentGroup failed");
183 return;
184 }
185 SHARING_LOGI("group frequency %{public}d", group.GetFrequency());
186 if (info.IsGroupOwner()) {
187 SHARING_LOGI("sink is go");
188 parent->localIp_ = info.GetGroupOwnerAddress();
189 return;
190 } else {
191 SHARING_LOGI("sink is gc");
192 std::string remoteIp = info.GetGroupOwnerAddress();
193 if (remoteIp == "" || remoteIp == "0.0.0.0") {
194 remoteIp = DEFAULT_P2P_IPADDR;
195 }
196 parent->currentConnectDev_.ip = remoteIp;
197 std::string interface = group.GetInterface();
198 parent->localIp_ = GetLocalP2pAddress(interface);
199 if (parent->localIp_.empty()) {
200 SHARING_LOGW("get local ip failed");
201 return;
202 }
203 wfdTrustListManager_.AddBoundDevice(group);
204 }
205 parent->p2pInstance_->StopP2pListen();
206 parent->OnP2pPeerConnected(parent->currentConnectDev_);
207 }
208
OnP2pGcJoinGroup(const OHOS::Wifi::GcInfo & info)209 void WfdSinkScene::WfdP2pCallback::OnP2pGcJoinGroup(const OHOS::Wifi::GcInfo &info)
210 {
211 SHARING_LOGI("trace.");
212 auto parent = parent_.lock();
213 if (parent && parent->p2pInstance_) {
214 std::vector<Wifi::WifiP2pDevice> devices;
215 if (Wifi::ErrCode::WIFI_OPT_SUCCESS != parent->p2pInstance_->QueryP2pDevices(devices)) {
216 SHARING_LOGE("QueryP2pDevices failed");
217 return;
218 }
219 SHARING_LOGI("QueryP2pDevices ip:%{private}s addr: %{private}s host: %{private}s.",
220 GetAnonyString(info.ip).c_str(), GetAnonyString(info.mac).c_str(),
221 GetAnonyString(info.host).c_str());
222 if (info.ip == "0.0.0.0" || info.ip == "") {
223 SHARING_LOGE("device: %{private}s leased ip is: 0.0.0.0.", GetAnonyString(info.mac).c_str());
224 parent->OnInnerError(info.mac.c_str(), ERR_P2P_DHCP_INVALID_IP, "ip is: 0.0.0.0.");
225 return;
226 }
227
228 for (auto itDev : devices) {
229 if (itDev.GetDeviceAddress() != info.mac) {
230 continue;
231 }
232 ConnectionInfo connectionInfo;
233 connectionInfo.ip = info.ip;
234 connectionInfo.mac = itDev.GetDeviceAddress();
235 connectionInfo.primaryDeviceType = itDev.GetPrimaryDeviceType();
236 connectionInfo.secondaryDeviceType = itDev.GetSecondaryDeviceType();
237 connectionInfo.ctrlPort = itDev.GetWfdInfo().GetCtrlPort();
238 connectionInfo.state = ConnectionState::CONNECTED;
239 parent->currentConnectDev_ = connectionInfo;
240 SHARING_LOGD("device connected, mac: %{private}s, ip: %{private}s, port: %{private}d",
241 connectionInfo.mac.c_str(), connectionInfo.ip.c_str(), connectionInfo.ctrlPort);
242 parent->p2pInstance_->StopP2pListen();
243 parent->OnP2pPeerConnected(connectionInfo);
244 Wifi::WifiP2pGroupInfo group;
245 parent->p2pInstance_->GetCurrentGroup(group);
246 wfdTrustListManager_.AddBoundDevice(group);
247 return;
248 }
249 }
250 }
251
OnP2pGcLeaveGroup(const OHOS::Wifi::GcInfo & info)252 void WfdSinkScene::WfdP2pCallback::OnP2pGcLeaveGroup(const OHOS::Wifi::GcInfo &info)
253 {
254 SHARING_LOGD("trace.");
255 }
256
OnP2pDiscoveryChanged(bool isChange)257 void WfdSinkScene::WfdP2pCallback::OnP2pDiscoveryChanged(bool isChange)
258 {
259 SHARING_LOGD("isChange: %{public}d.", isChange);
260 }
261
OnP2pActionResult(Wifi::P2pActionCallback action,Wifi::ErrCode code)262 void WfdSinkScene::WfdP2pCallback::OnP2pActionResult(Wifi::P2pActionCallback action, Wifi::ErrCode code)
263 {
264 SHARING_LOGI("action %{public}hhu, code %{public}d", action, code);
265 }
266
OnConfigChanged(Wifi::CfgType type,char * data,int32_t dataLen)267 void WfdSinkScene::WfdP2pCallback::OnConfigChanged(Wifi::CfgType type, char *data, int32_t dataLen)
268 {
269 SHARING_LOGD("trace.");
270 }
271
OnP2pChrErrCodeReport(const int errCode)272 void WfdSinkScene::WfdP2pCallback::OnP2pChrErrCodeReport(const int errCode)
273 {
274 SHARING_LOGD("trace.");
275 }
276
OnWifiStateChanged(int state)277 void WfdSinkScene::WifiCallback::OnWifiStateChanged(int state)
278 {
279 SHARING_LOGI("OnWifiStateChanged state %{public}d", state);
280 if (state == static_cast<int32_t>(Wifi::WifiState::ENABLED)) {
281 auto parent = parent_.lock();
282 if (parent && parent->isSinkRunning_) {
283 parent->WfdP2pStart();
284 }
285 }
286 }
287
OnWifiConnectionChanged(int state,const OHOS::Wifi::WifiLinkedInfo & info)288 void WfdSinkScene::WifiCallback::OnWifiConnectionChanged(int state, const OHOS::Wifi::WifiLinkedInfo &info)
289 {
290 SHARING_LOGI("OnWifiConnectionChanged state %{public}d", state);
291 if (state == static_cast<int32_t>(Wifi::ConnState::CONNECTED)) {
292 auto parent = parent_.lock();
293 if (parent && parent->isSinkRunning_ && parent->currentConnectDev_.mac == "") {
294 parent->WfdP2pStart();
295 }
296 }
297 }
298
OnWifiRssiChanged(int rssi)299 void WfdSinkScene::WifiCallback::OnWifiRssiChanged(int rssi)
300 {
301 SHARING_LOGD("trace.");
302 }
303
OnWifiWpsStateChanged(int state,const std::string & pinCode)304 void WfdSinkScene::WifiCallback::OnWifiWpsStateChanged(int state, const std::string &pinCode)
305 {
306 SHARING_LOGD("trace.");
307 }
308
OnStreamChanged(int direction)309 void WfdSinkScene::WifiCallback::OnStreamChanged(int direction)
310 {
311 SHARING_LOGD("trace.");
312 }
313
OnDeviceConfigChanged(OHOS::Wifi::ConfigChange value)314 void WfdSinkScene::WifiCallback::OnDeviceConfigChanged(OHOS::Wifi::ConfigChange value)
315 {
316 SHARING_LOGD("trace.");
317 }
318
OnChange()319 void WfdSinkScene::DeviceNameObserver::OnChange()
320 {
321 SHARING_LOGI("deviceName observer onChange");
322 auto scene = scene_.lock();
323 if (scene && scene->isSinkRunning_) {
324 scene->InitP2pName();
325 }
326 }
327
WfdSinkScene()328 WfdSinkScene::WfdSinkScene()
329 {
330 SHARING_LOGI("id: %{public}u.", GetId());
331 currentConnectDev_.state = ConnectionState::DISCONNECTED;
332 }
333
~WfdSinkScene()334 WfdSinkScene::~WfdSinkScene()
335 {
336 SHARING_LOGI("id: %{public}u.", GetId());
337 Release();
338 }
339
Initialize()340 void WfdSinkScene::Initialize()
341 {
342 SHARING_LOGD("trace.");
343 SharingValue::Ptr values = nullptr;
344
345 auto ret = Config::GetInstance().GetConfig("sharingWfd", "ctrlport", "defaultWfdCtrlport", values);
346 if (ret == CONFIGURE_ERROR_NONE) {
347 values->GetValue<int32_t>(ctrlPort_);
348 }
349
350 ret = Config::GetInstance().GetConfig("sharingWfd", "abilityLimit", "accessDevMaximum", values);
351 if (ret == CONFIGURE_ERROR_NONE) {
352 values->GetValue<int32_t>(accessDevMaximum_);
353 }
354
355 ret = Config::GetInstance().GetConfig("sharingWfd", "abilityLimit", "surfaceMaximum", values);
356 if (ret == CONFIGURE_ERROR_NONE) {
357 values->GetValue<int32_t>(surfaceMaximum_);
358 }
359
360 ret = Config::GetInstance().GetConfig("sharingWfd", "abilityLimit", "foregroundMaximum", values);
361 if (ret == CONFIGURE_ERROR_NONE) {
362 values->GetValue<int32_t>(foregroundMaximum_);
363 }
364
365 ret = Config::GetInstance().GetConfig("sharingWfd", "mediaFormat", "videoCodec", values);
366 if (ret == CONFIGURE_ERROR_NONE) {
367 int32_t videoCodec;
368 values->GetValue<int32_t>(videoCodec);
369 videoCodecId_ = static_cast<CodecId>(videoCodec);
370 }
371
372 ret = Config::GetInstance().GetConfig("sharingWfd", "mediaFormat", "videoFormat", values);
373 if (ret == CONFIGURE_ERROR_NONE) {
374 int32_t videoFormat;
375 values->GetValue<int32_t>(videoFormat);
376 videoFormatId_ = static_cast<VideoFormat>(videoFormat);
377 }
378
379 ret = Config::GetInstance().GetConfig("sharingWfd", "mediaFormat", "audioCodec", values);
380 if (ret == CONFIGURE_ERROR_NONE) {
381 int32_t audioCodec;
382 values->GetValue<int32_t>(audioCodec);
383 audioCodecId_ = static_cast<CodecId>(audioCodec);
384 }
385
386 ret = Config::GetInstance().GetConfig("sharingWfd", "mediaFormat", "audioFormat", values);
387 if (ret == CONFIGURE_ERROR_NONE) {
388 int32_t audioFormat;
389 values->GetValue<int32_t>(audioFormat);
390 audioFormatId_ = static_cast<AudioFormat>(audioFormat);
391 }
392
393 RegisterP2pListener();
394 RegisterWifiStatusChangeListener();
395 RegisterDevNameObserver();
396 InitP2pName();
397 isInitialized_ = true;
398 RegisterWfdAbilityListener();
399 }
400
OnWifiAbilityResume()401 void WfdSinkScene::OnWifiAbilityResume()
402 {
403 SHARING_LOGI("%{public}s.", __FUNCTION__);
404 if (isInitialized_) {
405 return;
406 }
407 RegisterP2pListener();
408 RegisterWifiStatusChangeListener();
409 InitP2pName();
410 isInitialized_ = true;
411 }
412
OnWifiAbilityDied()413 void WfdSinkScene::OnWifiAbilityDied()
414 {
415 SHARING_LOGI("%{public}s.", __FUNCTION__);
416 if (currentConnectDev_.mac != "") {
417 OnP2pPeerDisconnected(currentConnectDev_.mac);
418 }
419 isInitialized_ = false;
420 }
421
RegisterDevNameObserver()422 void WfdSinkScene::RegisterDevNameObserver()
423 {
424 SHARING_LOGI("RegisterDevNameObserver");
425 if (deviceNameObserver_ != nullptr) {
426 SHARING_LOGI("unregister old name observer");
427 UnRegisterDevNameObserver();
428 }
429
430 deviceNameObserver_ = new (std::nothrow) DeviceNameObserver(shared_from_this());
431 if (deviceNameObserver_ == nullptr) {
432 SHARING_LOGE("new deviceNameObserver error");
433 return;
434 }
435 int32_t ret = DataShareHelper::GetInstance().RegisterObserver(deviceNameObserver_);
436 SHARING_LOGI("register name observer ret=%{public}d", ret);
437 }
438
UnRegisterDevNameObserver()439 void WfdSinkScene::UnRegisterDevNameObserver()
440 {
441 int32_t ret = DataShareHelper::GetInstance().UnregisterObserver(deviceNameObserver_);
442 SHARING_LOGI("unregister name observer ret=%{public}d", ret);
443 deviceNameObserver_ = nullptr;
444 }
445
InitP2pName()446 void WfdSinkScene::InitP2pName()
447 {
448 DmKit::InitDeviceManager();
449 std::string deviceName;
450 if (DeviceManager::GetInstance().GetLocalDisplayDeviceName(DM_PKG_NAME, DM_MAX_NAME_LENGTH, deviceName) != DM_OK) {
451 SHARING_LOGW("getLocalDeviceInfo from dm failed");
452 } else {
453 if (p2pInstance_) {
454 p2pInstance_->SetP2pDeviceName(deviceName + std::string("-miracast"));
455 }
456 }
457 }
458
RegisterP2pListener()459 void WfdSinkScene::RegisterP2pListener()
460 {
461 p2pInstance_ = Wifi::WifiP2p::GetInstance(WIFI_P2P_ABILITY_ID);
462 RETURN_IF_NULL(p2pInstance_);
463 sptr<WfdP2pCallback> wfdP2pCallback(new WfdP2pCallback(shared_from_this()));
464 std::vector<std::string> event = {EVENT_P2P_PEER_DEVICE_CHANGE, EVENT_P2P_CONN_STATE_CHANGE,
465 EVENT_P2P_GC_JOIN_GROUP, EVENT_P2P_GC_LEAVE_GROUP, EVENT_P2P_ACTION_RESULT};
466 p2pInstance_->RegisterCallBack(wfdP2pCallback, event);
467 }
468
RegisterWifiStatusChangeListener()469 void WfdSinkScene::RegisterWifiStatusChangeListener()
470 {
471 auto deviceInstance = Wifi::WifiDevice::GetInstance(WIFI_DEVICE_ABILITY_ID);
472 RETURN_IF_NULL(deviceInstance);
473 auto callback = sptr<Wifi::IWifiDeviceCallBack> (new WifiCallback(shared_from_this()));
474 std::vector<std::string> events = {EVENT_STA_POWER_STATE_CHANGE, EVENT_STA_CONN_STATE_CHANGE};
475 deviceInstance->RegisterCallBack(callback, events);
476 }
477
Release()478 void WfdSinkScene::Release()
479 {
480 SHARING_LOGD("trace.");
481 UnRegisterWfdAbilityListener();
482 UnRegisterDevNameObserver();
483 std::unique_lock<std::mutex> lock(mutex_);
484 auto sharingAdapter = sharingAdapter_.lock();
485 if (sharingAdapter != nullptr) {
486 for (auto &item : devConnectionMap_) {
487 uint32_t contextId = INVALID_ID;
488 uint32_t agentId = INVALID_ID;
489 if (item.second == nullptr) {
490 continue;
491 }
492
493 contextId = item.second->contextId;
494 agentId = item.second->agentId;
495
496 if ((contextId == INVALID_ID) || (agentId == INVALID_ID)) {
497 continue;
498 }
499
500 auto sessionMsg = std::make_shared<WfdSinkSessionEventMsg>();
501 sessionMsg->type = EVENT_SESSION_TEARDOWN;
502 sessionMsg->toMgr = MODULE_CONTEXT;
503 sessionMsg->dstId = contextId;
504 sessionMsg->agentId = agentId;
505
506 SharingEvent event;
507 event.eventMsg = std::move(sessionMsg);
508 sharingAdapter->ForwardEvent(contextId, agentId, event, true);
509
510 P2pRemoveClient(*(item.second));
511
512 sharingAdapter->DestroyAgent(contextId, agentId);
513 }
514 }
515
516 if (p2pInstance_) {
517 p2pInstance_->RemoveGroup();
518 }
519
520 devConnectionMap_.clear();
521 devSurfaceItemMap_.clear();
522 p2pInstance_.reset();
523 }
524
OnDomainMsg(std::shared_ptr<BaseDomainMsg> & msg)525 void WfdSinkScene::OnDomainMsg(std::shared_ptr<BaseDomainMsg> &msg)
526 {
527 SHARING_LOGD("trace.");
528 }
529
OnRequest(std::shared_ptr<BaseMsg> msg,std::shared_ptr<BaseMsg> & reply)530 void WfdSinkScene::OnRequest(std::shared_ptr<BaseMsg> msg, std::shared_ptr<BaseMsg> &reply)
531 {
532 SHARING_LOGD("trace.");
533 RETURN_IF_NULL(msg);
534 SHARING_LOGI("recv msg, msg id: %{public}d.", msg->GetMsgId());
535 switch (msg->GetMsgId()) {
536 case WfdSinkStartReq::MSG_ID: {
537 auto data = std::static_pointer_cast<WfdSinkStartReq>(msg);
538 auto rsp = std::make_shared<WfdCommonRsp>();
539
540 rsp->ret = HandleStart(data, rsp);
541 reply = std::static_pointer_cast<BaseMsg>(rsp);
542 break;
543 }
544 case WfdSinkStopReq::MSG_ID: {
545 auto data = std::static_pointer_cast<WfdSinkStopReq>(msg);
546 auto rsp = std::make_shared<WfdCommonRsp>();
547
548 rsp->ret = HandleStop(data, rsp);
549 reply = std::static_pointer_cast<BaseMsg>(rsp);
550 break;
551 }
552 case WfdAppendSurfaceReq::MSG_ID: {
553 auto data = std::static_pointer_cast<WfdAppendSurfaceReq>(msg);
554 auto rsp = std::make_shared<WfdCommonRsp>();
555
556 rsp->ret = HandleAppendSurface(data, rsp);
557 reply = std::static_pointer_cast<BaseMsg>(rsp);
558 break;
559 }
560 case WfdRemoveSurfaceReq::MSG_ID: {
561 auto data = std::static_pointer_cast<WfdRemoveSurfaceReq>(msg);
562 auto rsp = std::make_shared<WfdCommonRsp>();
563
564 rsp->ret = HandleRemoveSurface(data, rsp);
565 reply = std::static_pointer_cast<BaseMsg>(rsp);
566 break;
567 }
568 case SetMediaFormatReq::MSG_ID: {
569 auto data = std::static_pointer_cast<SetMediaFormatReq>(msg);
570 auto rsp = std::make_shared<WfdCommonRsp>();
571
572 rsp->ret = HandleSetMediaFormat(data, rsp);
573 reply = std::static_pointer_cast<BaseMsg>(rsp);
574 break;
575 }
576 case SetSceneTypeReq::MSG_ID: {
577 auto data = std::static_pointer_cast<SetSceneTypeReq>(msg);
578 auto rsp = std::make_shared<WfdCommonRsp>();
579
580 rsp->ret = HandleSetSceneType(data, rsp);
581 reply = std::static_pointer_cast<BaseMsg>(rsp);
582 break;
583 }
584 case WfdPlayReq::MSG_ID: {
585 auto data = std::static_pointer_cast<WfdPlayReq>(msg);
586 auto rsp = std::make_shared<WfdCommonRsp>();
587
588 rsp->ret = HandlePlay(data, rsp);
589 reply = std::static_pointer_cast<BaseMsg>(rsp);
590 break;
591 }
592 case WfdPauseReq::MSG_ID: {
593 auto data = std::static_pointer_cast<WfdPauseReq>(msg);
594 auto rsp = std::make_shared<WfdCommonRsp>();
595
596 rsp->ret = HandlePause(data, rsp);
597 reply = std::static_pointer_cast<BaseMsg>(rsp);
598 break;
599 }
600 case MuteReq::MSG_ID: {
601 auto data = std::static_pointer_cast<MuteReq>(msg);
602 auto rsp = std::make_shared<WfdCommonRsp>();
603
604 rsp->ret = HandleMute(data, rsp);
605 reply = std::static_pointer_cast<BaseMsg>(rsp);
606 break;
607 }
608 case UnMuteReq::MSG_ID: {
609 auto data = std::static_pointer_cast<UnMuteReq>(msg);
610 auto rsp = std::make_shared<WfdCommonRsp>();
611
612 rsp->ret = HandleUnMute(data, rsp);
613 reply = std::static_pointer_cast<BaseMsg>(rsp);
614 break;
615 }
616 case WfdCloseReq::MSG_ID: {
617 auto data = std::static_pointer_cast<WfdCloseReq>(msg);
618 auto rsp = std::make_shared<WfdCommonRsp>();
619
620 rsp->ret = HandleClose(data, rsp);
621 reply = std::static_pointer_cast<BaseMsg>(rsp);
622 break;
623 }
624 case GetSinkConfigReq::MSG_ID: {
625 auto data = std::static_pointer_cast<GetSinkConfigReq>(msg);
626 auto rsp = std::make_shared<GetSinkConfigRsp>();
627
628 rsp->foregroundMaximum = INVALID_ID;
629 HandleGetConfig(data, rsp);
630 reply = std::static_pointer_cast<BaseMsg>(rsp);
631 break;
632 }
633 case WfdGetBoundDevicesReq::MSG_ID: {
634 auto data = std::static_pointer_cast<WfdGetBoundDevicesReq>(msg);
635 auto rsp = std::make_shared<WfdGetBoundDevicesRsp>();
636
637 HandleGetBoundDevices(data, rsp);
638 reply = std::static_pointer_cast<BaseMsg>(rsp);
639 break;
640 }
641 case WfdDeleteBoundDeviceReq::MSG_ID: {
642 auto data = std::static_pointer_cast<WfdDeleteBoundDeviceReq>(msg);
643 auto rsp = std::make_shared<WfdCommonRsp>();
644
645 HandleDeleteBoundDevice(data, rsp);
646 reply = std::static_pointer_cast<BaseMsg>(rsp);
647 break;
648 }
649 default:
650 SHARING_LOGW("unknown msg request.");
651 break;
652 }
653 }
654
HandleStart(std::shared_ptr<WfdSinkStartReq> & msg,std::shared_ptr<WfdCommonRsp> & reply)655 int32_t WfdSinkScene::HandleStart(std::shared_ptr<WfdSinkStartReq> &msg, std::shared_ptr<WfdCommonRsp> &reply)
656 {
657 SHARING_LOGD("trace.");
658 (void)msg;
659 (void)reply;
660 if (isSinkRunning_) {
661 SHARING_LOGW("p2p sink is running.");
662 return 0;
663 }
664 RETURN_INVALID_IF_NULL(p2pInstance_);
665 int32_t ret = 0;
666 int32_t status = 0;
667 p2pInstance_->GetP2pEnableStatus(status);
668 switch (status) {
669 case (int32_t)Wifi::P2pState::P2P_STATE_NONE:
670 case (int32_t)Wifi::P2pState::P2P_STATE_IDLE:
671 case (int32_t)Wifi::P2pState::P2P_STATE_STARTING:
672 case (int32_t)Wifi::P2pState::P2P_STATE_CLOSING:
673 OnInnerError(0, 0, SharingErrorCode::ERR_STATE_EXCEPTION, "HandleStart current p2p state: CLOSING");
674 ret = -1;
675 break;
676 case (int32_t)Wifi::P2pState::P2P_STATE_STARTED:
677 isSinkRunning_ = true;
678 WfdP2pStart();
679 break;
680 case (int32_t)Wifi::P2pState::P2P_STATE_CLOSED:
681 isSinkRunning_ = true;
682 p2pInstance_->EnableP2p();
683 break;
684 default:
685 SHARING_LOGI("none process case.");
686 break;
687 }
688
689 return ret;
690 }
691
HandleStop(std::shared_ptr<WfdSinkStopReq> & msg,std::shared_ptr<WfdCommonRsp> & reply)692 int32_t WfdSinkScene::HandleStop(std::shared_ptr<WfdSinkStopReq> &msg, std::shared_ptr<WfdCommonRsp> &reply)
693 {
694 SHARING_LOGD("handle stop, now connect device num: %{public}zu.", devConnectionMap_.size());
695 (void)msg;
696 (void)reply;
697 if (!isSinkRunning_) {
698 SHARING_LOGW("p2p sink is not running.");
699 return -1;
700 }
701
702 isSinkRunning_ = false;
703 WfdP2pStop();
704
705 return 0;
706 }
707
HandleAppendSurface(std::shared_ptr<WfdAppendSurfaceReq> & msg,std::shared_ptr<WfdCommonRsp> & reply)708 int32_t WfdSinkScene::HandleAppendSurface(std::shared_ptr<WfdAppendSurfaceReq> &msg,
709 std::shared_ptr<WfdCommonRsp> &reply)
710 {
711 SHARING_LOGD("trace.");
712 (void)reply;
713 RETURN_INVALID_IF_NULL(msg);
714 auto sharingAdapter = sharingAdapter_.lock();
715 RETURN_INVALID_IF_NULL(sharingAdapter);
716
717 {
718 std::unique_lock<std::mutex> lock(mutex_);
719 auto itemDev = devConnectionMap_.find(msg->deviceId);
720 if (itemDev == devConnectionMap_.end() || itemDev->second == nullptr) {
721 lock.unlock();
722 SHARING_LOGE("can not find dev, mac: %{private}s.", GetAnonyString(msg->deviceId).c_str());
723 OnInnerError(0, 0, SharingErrorCode::ERR_BAD_PARAMETER, "HandleAppendSurface can't find the dev");
724 return -1;
725 }
726 int32_t surfaceNum = 0;
727 for (auto itemSurface = devSurfaceItemMap_.begin(); itemSurface != devSurfaceItemMap_.end();) {
728 if (!itemSurface->second->deleting) {
729 surfaceNum++;
730 }
731 itemSurface++;
732 }
733
734 if (surfaceNum >= surfaceMaximum_) {
735 lock.unlock();
736 SHARING_LOGE("surface is too much.");
737 OnInnerError(0, 0, SharingErrorCode::ERR_SERVICE_LIMIT, "HandleAppendSurface surface is too much");
738 return -1;
739 }
740
741 sptr<IBufferProducer> producer = iface_cast<IBufferProducer>(msg->surface);
742 sptr<Surface> surfacePtr = Surface::CreateSurfaceAsProducer(producer);
743 if (surfacePtr == nullptr) {
744 SHARING_LOGE("invalid surface.");
745 return -1;
746 }
747
748 uint64_t surfaceId = surfacePtr->GetUniqueId();
749 SHARING_LOGI("get surfaceId %{public}" PRIx64 ".", surfaceId);
750 if (devSurfaceItemMap_.count(surfaceId)) {
751 SHARING_LOGW("this surface is using, surfaceId: %{public}" PRIx64 ".", surfaceId);
752 lock.unlock();
753 OnInnerError(0, 0, SharingErrorCode::ERR_STATE_EXCEPTION, "HandleAppendSurface this surface is using");
754 return ERR_STATE_EXCEPTION;
755 }
756
757 int32_t foregroundSurfaceNum = 0;
758 for (auto item : devSurfaceItemMap_) {
759 if ((item.second != nullptr) && (item.second->deviceId == msg->deviceId) && (!item.second->deleting)) {
760 OnInnerError(0, 0, SharingErrorCode::ERR_STATE_EXCEPTION, "Only one surface can be set.");
761 return ERR_STATE_EXCEPTION;
762 }
763
764 if (item.second->sceneType == SceneType::FOREGROUND) {
765 foregroundSurfaceNum++;
766 }
767 }
768
769 auto devSurfaceItem = std::make_shared<DevSurfaceItem>();
770 devSurfaceItem->contextId = itemDev->second->contextId;
771 devSurfaceItem->agentId = itemDev->second->agentId;
772 devSurfaceItem->deviceId = itemDev->second->mac;
773 devSurfaceItem->surfacePtr = surfacePtr;
774 devSurfaceItem->sceneType = (foregroundSurfaceNum >= foregroundMaximum_) ? BACKGROUND : FOREGROUND;
775 devSurfaceItemMap_.emplace(surfaceId, devSurfaceItem);
776
777 if (itemDev->second->isRunning) {
778 uint32_t contextId = itemDev->second->contextId;
779 uint32_t agentId = itemDev->second->agentId;
780
781 auto startSessionMsg = std::make_shared<WfdSinkSessionEventMsg>();
782 startSessionMsg->type = EVENT_WFD_REQUEST_IDR;
783 startSessionMsg->toMgr = MODULE_CONTEXT;
784 startSessionMsg->dstId = contextId;
785 startSessionMsg->agentId = agentId;
786
787 SharingEvent event;
788 event.eventMsg = std::move(startSessionMsg);
789 if (sharingAdapter) {
790 sharingAdapter->ForwardEvent(contextId, agentId, event, false);
791 sharingAdapter->AppendSurface(itemDev->second->contextId, itemDev->second->agentId, surfacePtr,
792 devSurfaceItem->sceneType);
793 }
794 itemDev->second->state = ConnectionState::PLAYING;
795 OnConnectionChanged(*itemDev->second);
796 }
797 }
798 return 0;
799 }
800
HandleRemoveSurface(std::shared_ptr<WfdRemoveSurfaceReq> & msg,std::shared_ptr<WfdCommonRsp> & reply)801 int32_t WfdSinkScene::HandleRemoveSurface(std::shared_ptr<WfdRemoveSurfaceReq> &msg,
802 std::shared_ptr<WfdCommonRsp> &reply)
803 {
804 SHARING_LOGD("trace.");
805 (void)reply;
806 RETURN_INVALID_IF_NULL(msg);
807 auto sharingAdapter = sharingAdapter_.lock();
808 RETURN_INVALID_IF_NULL(sharingAdapter);
809 {
810 std::unique_lock<std::mutex> lock(mutex_);
811 auto itemDev = devConnectionMap_.find(msg->deviceId);
812 if (itemDev == devConnectionMap_.end() || itemDev->second == nullptr) {
813 lock.unlock();
814 SHARING_LOGE("can not find dev, mac: %{private}s.", GetAnonyString(msg->deviceId).c_str());
815 OnInnerError(0, 0, SharingErrorCode::ERR_BAD_PARAMETER, "HandleRemoveSurface can't find the dev");
816 return -1;
817 }
818
819 auto item = devSurfaceItemMap_.find(msg->surfaceId);
820 if (item == devSurfaceItemMap_.end()) {
821 lock.unlock();
822 SHARING_LOGE("can not find surfaceid, surfaceid: %{public}" PRId64 ".", msg->surfaceId);
823 OnInnerError(0, 0, SharingErrorCode::ERR_BAD_PARAMETER, "HandleAppendSurface can't find the dev");
824 return -1;
825 }
826
827 SHARING_LOGW("del surface, surfaceid: %{public}" PRId64 ".", msg->surfaceId);
828 sharingAdapter->RemoveSurface(itemDev->second->contextId, itemDev->second->agentId, msg->surfaceId);
829 }
830
831 return 0;
832 }
833
HandleSetMediaFormat(std::shared_ptr<SetMediaFormatReq> & msg,std::shared_ptr<WfdCommonRsp> & reply)834 int32_t WfdSinkScene::HandleSetMediaFormat(std::shared_ptr<SetMediaFormatReq> &msg,
835 std::shared_ptr<WfdCommonRsp> &reply)
836 {
837 SHARING_LOGD("trace.");
838 (void)reply;
839 RETURN_INVALID_IF_NULL(msg);
840 {
841 std::unique_lock<std::mutex> lock(mutex_);
842 auto itemDev = devConnectionMap_.find(msg->deviceId);
843 if (itemDev == devConnectionMap_.end() || itemDev->second == nullptr) {
844 lock.unlock();
845 SHARING_LOGE("can not find dev, mac: %{private}s.", GetAnonyString(msg->deviceId).c_str());
846 OnInnerError(0, 0, SharingErrorCode::ERR_BAD_PARAMETER, "HandleSetMediaFormat can not find dev");
847 return -1;
848 }
849 itemDev->second->videoCodecId = static_cast<CodecId>(msg->videoAttr.codecType);
850 itemDev->second->videoFormatId = static_cast<VideoFormat>(msg->videoAttr.formatId);
851 itemDev->second->audioCodecId = static_cast<CodecId>(msg->audioAttr.codecType);
852 itemDev->second->audioFormatId = static_cast<AudioFormat>(msg->audioAttr.formatId);
853 }
854
855 return 0;
856 }
857
HandleSetSceneType(std::shared_ptr<SetSceneTypeReq> & msg,std::shared_ptr<WfdCommonRsp> & reply)858 int32_t WfdSinkScene::HandleSetSceneType(std::shared_ptr<SetSceneTypeReq> &msg, std::shared_ptr<WfdCommonRsp> &reply)
859 {
860 SHARING_LOGD("trace.");
861 (void)reply;
862 RETURN_INVALID_IF_NULL(msg);
863 auto sharingAdapter = sharingAdapter_.lock();
864 RETURN_INVALID_IF_NULL(sharingAdapter);
865
866 uint32_t contextId = INVALID_ID;
867 uint32_t agentId = INVALID_ID;
868 {
869 std::unique_lock<std::mutex> lock(mutex_);
870 auto itemDev = devConnectionMap_.find(msg->deviceId);
871 if (itemDev == devConnectionMap_.end() || itemDev->second == nullptr) {
872 lock.unlock();
873 SHARING_LOGE("can not find dev, mac: %{private}s.", GetAnonyString(msg->deviceId).c_str());
874 OnInnerError(0, 0, SharingErrorCode::ERR_BAD_PARAMETER, "HandleSetSceneType can not find dev");
875 return -1;
876 }
877
878 auto itemSurface = devSurfaceItemMap_.find(msg->surfaceId);
879 if (itemSurface == devSurfaceItemMap_.end() || itemSurface->second == nullptr
880 || itemSurface->second->deleting) {
881 lock.unlock();
882 SHARING_LOGE("can not find surfaceid, surfaceid: %{public}" PRId64 ".", msg->surfaceId);
883 OnInnerError(0, 0, SharingErrorCode::ERR_BAD_PARAMETER, "HandleSetSceneType can't find the surfaceId");
884 return -1;
885 }
886
887 contextId = itemDev->second->contextId;
888 agentId = itemDev->second->agentId;
889
890 uint32_t foregroundSurfaceNum = 1;
891 if (msg->sceneType == SceneType::FOREGROUND) {
892 for (auto item : devSurfaceItemMap_) {
893 if ((item.first == msg->surfaceId) && (!item.second->deleting)) {
894 continue;
895 }
896
897 if (item.second->sceneType == SceneType::FOREGROUND) {
898 foregroundSurfaceNum++;
899 }
900 }
901
902 if (foregroundSurfaceNum > static_cast<uint32_t>(foregroundMaximum_)) {
903 lock.unlock();
904 SHARING_LOGE("foreground surfaces is too much.");
905 OnInnerError(0, 0, SharingErrorCode::ERR_SERVICE_LIMIT,
906 "HandleSetSceneType foreground surfaces is too much");
907 return -1;
908 } else {
909 itemSurface->second->sceneType = SceneType::FOREGROUND;
910 }
911 } else {
912 itemSurface->second->sceneType = SceneType::BACKGROUND;
913 }
914 }
915
916 if ((contextId == INVALID_ID) || (agentId == INVALID_ID)) {
917 SHARING_LOGW("invalid contextId: %{public}u, agentId: %{public}u.", contextId, agentId);
918 return 0;
919 }
920
921 bool keyFrame = msg->sceneType == SceneType::BACKGROUND ? true : false;
922 auto ret = sharingAdapter->SetKeyPlay(contextId, agentId, msg->surfaceId, keyFrame);
923 if (!keyFrame) {
924 sharingAdapter->SetKeyRedirect(contextId, agentId, msg->surfaceId, true);
925 }
926
927 return ret;
928 }
929
HandlePlay(std::shared_ptr<WfdPlayReq> & msg,std::shared_ptr<WfdCommonRsp> & reply)930 int32_t WfdSinkScene::HandlePlay(std::shared_ptr<WfdPlayReq> &msg, std::shared_ptr<WfdCommonRsp> &reply)
931 {
932 SHARING_LOGD("trace.");
933 (void)reply;
934 RETURN_INVALID_IF_NULL(msg);
935 auto sharingAdapter = sharingAdapter_.lock();
936 RETURN_INVALID_IF_NULL(sharingAdapter);
937
938 {
939 std::unique_lock<std::mutex> lock(mutex_);
940 auto itemDev = devConnectionMap_.find(msg->deviceId);
941 if (itemDev == devConnectionMap_.end() || itemDev->second == nullptr) {
942 lock.unlock();
943 SHARING_LOGE("can not find dev, mac: %{private}s.", GetAnonyString(msg->deviceId).c_str());
944 OnInnerError(0, 0, SharingErrorCode::ERR_BAD_PARAMETER, "HandlePlay can not find dev");
945 return -1;
946 }
947
948 uint32_t contextId = itemDev->second->contextId;
949 uint32_t agentId = itemDev->second->agentId;
950 if (contextId == INVALID_ID || agentId == INVALID_ID) {
951 lock.unlock();
952 SHARING_LOGE("connected, create sink agent failed, devMac: %{private}s.",
953 GetAnonyString(msg->deviceId).c_str());
954 return -1;
955 }
956
957 if (itemDev->second->isRunning == true) {
958 lock.unlock();
959 return sharingAdapter->Resume(contextId, agentId, MEDIA_TYPE_AV);
960 } else {
961 itemDev->second->isRunning = true;
962 }
963
964 lock.unlock();
965
966 auto startSessionMsg = std::make_shared<WfdSinkSessionEventMsg>();
967 startSessionMsg->type = EVENT_SESSION_INIT;
968 startSessionMsg->toMgr = MODULE_CONTEXT;
969 startSessionMsg->dstId = contextId;
970 startSessionMsg->agentId = agentId;
971 startSessionMsg->remoteIp = itemDev->second->ip;
972 startSessionMsg->localIp = localIp_;
973 startSessionMsg->mac = itemDev->second->mac;
974 startSessionMsg->remotePort = itemDev->second->ctrlPort;
975 startSessionMsg->videoFormat = itemDev->second->videoFormatId;
976 startSessionMsg->audioFormat = itemDev->second->audioFormatId;
977 startSessionMsg->localPort = SocketUtils::GetAvailableUdpPortPair();
978 startSessionMsg->wfdParamsInfo = wfdParamsInfo_;
979
980 SharingEvent event;
981 event.eventMsg = std::move(startSessionMsg);
982
983 sharingAdapter->ForwardEvent(contextId, agentId, event, true);
984 sharingAdapter->Start(contextId, agentId);
985
986 for (auto &item : devSurfaceItemMap_) {
987 if ((item.second != nullptr) && (itemDev->first == item.second->deviceId) && (!item.second->deleting)) {
988 if (item.second->surfacePtr != nullptr) {
989 sharingAdapter->AppendSurface(contextId, agentId, item.second->surfacePtr, item.second->sceneType);
990 }
991 }
992 }
993
994 sharingAdapter->Play(contextId, agentId);
995 }
996
997 return 0;
998 }
999
HandlePause(std::shared_ptr<WfdPauseReq> & msg,std::shared_ptr<WfdCommonRsp> & reply)1000 int32_t WfdSinkScene::HandlePause(std::shared_ptr<WfdPauseReq> &msg, std::shared_ptr<WfdCommonRsp> &reply)
1001 {
1002 SHARING_LOGD("trace.");
1003 (void)reply;
1004 RETURN_INVALID_IF_NULL(msg);
1005 auto sharingAdapter = sharingAdapter_.lock();
1006 RETURN_INVALID_IF_NULL(sharingAdapter);
1007
1008 uint32_t contextId = INVALID_ID;
1009 uint32_t agentId = INVALID_ID;
1010 {
1011 std::unique_lock<std::mutex> lock(mutex_);
1012 auto itemDev = devConnectionMap_.find(msg->deviceId);
1013 if (itemDev == devConnectionMap_.end() || itemDev->second == nullptr) {
1014 lock.unlock();
1015 SHARING_LOGE("can not find dev, mac: %{private}s.", GetAnonyString(msg->deviceId).c_str());
1016 OnInnerError(0, 0, SharingErrorCode::ERR_BAD_PARAMETER, "HandlePause can not find dev");
1017 return -1;
1018 }
1019
1020 contextId = itemDev->second->contextId;
1021 agentId = itemDev->second->agentId;
1022 }
1023
1024 if ((contextId == INVALID_ID) || (agentId == INVALID_ID)) {
1025 return -1;
1026 }
1027
1028 return sharingAdapter->Pause(contextId, agentId, MEDIA_TYPE_AV);
1029 }
1030
HandleMute(std::shared_ptr<MuteReq> & msg,std::shared_ptr<WfdCommonRsp> & reply)1031 int32_t WfdSinkScene::HandleMute(std::shared_ptr<MuteReq> &msg, std::shared_ptr<WfdCommonRsp> &reply)
1032 {
1033 SHARING_LOGD("trace.");
1034 (void)reply;
1035 RETURN_INVALID_IF_NULL(msg);
1036 auto sharingAdapter = sharingAdapter_.lock();
1037 RETURN_INVALID_IF_NULL(sharingAdapter);
1038
1039 uint32_t contextId = INVALID_ID;
1040 uint32_t agentId = INVALID_ID;
1041 {
1042 std::unique_lock<std::mutex> lock(mutex_);
1043 auto itemDev = devConnectionMap_.find(msg->deviceId);
1044 if (itemDev == devConnectionMap_.end() || itemDev->second == nullptr) {
1045 lock.unlock();
1046 SHARING_LOGE("can not find dev, mac: %{private}s.", GetAnonyString(msg->deviceId).c_str());
1047 OnInnerError(0, 0, SharingErrorCode::ERR_BAD_PARAMETER, "HandleMute can not find dev");
1048 return -1;
1049 }
1050
1051 contextId = itemDev->second->contextId;
1052 agentId = itemDev->second->agentId;
1053 }
1054
1055 if ((contextId == INVALID_ID) || (agentId == INVALID_ID)) {
1056 return -1;
1057 }
1058
1059 return sharingAdapter->Pause(contextId, agentId, MEDIA_TYPE_AUDIO);
1060 }
1061
HandleUnMute(std::shared_ptr<UnMuteReq> & msg,std::shared_ptr<WfdCommonRsp> & reply)1062 int32_t WfdSinkScene::HandleUnMute(std::shared_ptr<UnMuteReq> &msg, std::shared_ptr<WfdCommonRsp> &reply)
1063 {
1064 SHARING_LOGD("trace.");
1065 (void)reply;
1066 RETURN_INVALID_IF_NULL(msg);
1067 auto sharingAdapter = sharingAdapter_.lock();
1068 RETURN_INVALID_IF_NULL(sharingAdapter);
1069
1070 uint32_t contextId = INVALID_ID;
1071 uint32_t agentId = INVALID_ID;
1072 {
1073 std::unique_lock<std::mutex> lock(mutex_);
1074 auto itemDev = devConnectionMap_.find(msg->deviceId);
1075 if (itemDev == devConnectionMap_.end() || itemDev->second == nullptr) {
1076 lock.unlock();
1077 SHARING_LOGE("can not find dev, mac: %{private}s.", GetAnonyString(msg->deviceId).c_str());
1078 OnInnerError(0, 0, SharingErrorCode::ERR_BAD_PARAMETER, "HandleUnMute can not find dev");
1079 return -1;
1080 }
1081
1082 contextId = itemDev->second->contextId;
1083 agentId = itemDev->second->agentId;
1084 }
1085
1086 if ((contextId == INVALID_ID) || (agentId == INVALID_ID)) {
1087 return -1;
1088 }
1089
1090 return sharingAdapter->Resume(contextId, agentId, MEDIA_TYPE_AUDIO);
1091 }
1092
HandleClose(std::shared_ptr<WfdCloseReq> & msg,std::shared_ptr<WfdCommonRsp> & reply)1093 int32_t WfdSinkScene::HandleClose(std::shared_ptr<WfdCloseReq> &msg, std::shared_ptr<WfdCommonRsp> &reply)
1094 {
1095 SHARING_LOGD("trace.");
1096 (void)reply;
1097 RETURN_INVALID_IF_NULL(msg);
1098 auto sharingAdapter = sharingAdapter_.lock();
1099 RETURN_INVALID_IF_NULL(sharingAdapter);
1100
1101 uint32_t contextId = INVALID_ID;
1102 uint32_t agentId = INVALID_ID;
1103 ConnectionInfo connectionInfo;
1104 {
1105 std::unique_lock<std::mutex> lock(mutex_);
1106 auto itemDev = devConnectionMap_.find(msg->deviceId);
1107 if (itemDev == devConnectionMap_.end() || itemDev->second == nullptr) {
1108 lock.unlock();
1109 SHARING_LOGE("can not find dev, mac: %{private}s.", GetAnonyString(msg->deviceId).c_str());
1110 OnInnerError(0, 0, SharingErrorCode::ERR_BAD_PARAMETER, "HandleClose can not find dev");
1111 return -1;
1112 }
1113
1114 connectionInfo.ip = itemDev->second->ip;
1115 connectionInfo.mac = itemDev->second->mac;
1116 connectionInfo.state = ConnectionState::DISCONNECTED;
1117 connectionInfo.surfaceId = itemDev->second->surfaceId;
1118 connectionInfo.deviceName = itemDev->second->deviceName;
1119 connectionInfo.primaryDeviceType = itemDev->second->primaryDeviceType;
1120 connectionInfo.secondaryDeviceType = itemDev->second->secondaryDeviceType;
1121
1122 contextId = itemDev->second->contextId;
1123 agentId = itemDev->second->agentId;
1124
1125 for (auto itemSurface = devSurfaceItemMap_.begin(); itemSurface != devSurfaceItemMap_.end();) {
1126 if ((itemSurface->second != nullptr) && (msg->deviceId == itemSurface->second->deviceId)) {
1127 itemSurface->second->deleting = true;
1128 }
1129 itemSurface++;
1130 }
1131
1132 P2pRemoveClient(connectionInfo);
1133
1134 devConnectionMap_.erase(msg->deviceId);
1135 }
1136
1137 if ((contextId == INVALID_ID) || (agentId == INVALID_ID)) {
1138 return -1;
1139 }
1140
1141 OnConnectionChanged(connectionInfo);
1142 auto sessionMsg = std::make_shared<WfdSinkSessionEventMsg>();
1143 sessionMsg->type = EVENT_SESSION_TEARDOWN;
1144 sessionMsg->toMgr = MODULE_CONTEXT;
1145 sessionMsg->dstId = contextId;
1146 sessionMsg->agentId = agentId;
1147
1148 SharingEvent event;
1149 event.eventMsg = std::move(sessionMsg);
1150 sharingAdapter->ForwardEvent(contextId, agentId, event, true);
1151
1152 return sharingAdapter->DestroyAgent(contextId, agentId);
1153 }
1154
HandleGetConfig(std::shared_ptr<GetSinkConfigReq> & msg,std::shared_ptr<GetSinkConfigRsp> & reply)1155 int32_t WfdSinkScene::HandleGetConfig(std::shared_ptr<GetSinkConfigReq> &msg, std::shared_ptr<GetSinkConfigRsp> &reply)
1156 {
1157 SHARING_LOGD("trace.");
1158 (void)msg;
1159 RETURN_INVALID_IF_NULL(reply);
1160 reply->accessDevMaximum = static_cast<uint32_t>(accessDevMaximum_);
1161 reply->foregroundMaximum = static_cast<uint32_t>(foregroundMaximum_);
1162 reply->surfaceMaximum = static_cast<uint32_t>(surfaceMaximum_);
1163
1164 return 0;
1165 }
1166
HandleGetBoundDevices(std::shared_ptr<WfdGetBoundDevicesReq> & msg,std::shared_ptr<WfdGetBoundDevicesRsp> & reply)1167 int32_t WfdSinkScene::HandleGetBoundDevices(std::shared_ptr<WfdGetBoundDevicesReq> &msg,
1168 std::shared_ptr<WfdGetBoundDevicesRsp> &reply)
1169 {
1170 SHARING_LOGI("%{public}s.", __FUNCTION__);
1171 (void)msg;
1172 (void)reply;
1173 reply->trustDevices = wfdTrustListManager_.GetAllBoundDevices();
1174 return 0;
1175 }
1176
HandleDeleteBoundDevice(std::shared_ptr<WfdDeleteBoundDeviceReq> & msg,std::shared_ptr<WfdCommonRsp> & reply)1177 int32_t WfdSinkScene::HandleDeleteBoundDevice(std::shared_ptr<WfdDeleteBoundDeviceReq> &msg,
1178 std::shared_ptr<WfdCommonRsp> &reply)
1179 {
1180 SHARING_LOGI("%{public}s.", __FUNCTION__);
1181 (void)reply;
1182 RETURN_INVALID_IF_NULL(msg);
1183 reply->ret = wfdTrustListManager_.DeleteBoundDeviceGroup(msg->deviceAddress);
1184 return 0;
1185 }
1186
RegisterWfdAbilityListener()1187 void WfdSinkScene::RegisterWfdAbilityListener()
1188 {
1189 SHARING_LOGI("%{public}s.", __FUNCTION__);
1190 std::unique_lock<std::mutex> lock(mutex_);
1191 auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1192 if (samgrProxy == nullptr) {
1193 SHARING_LOGE("get system ability manager fail");
1194 return;
1195 }
1196 sysAbilityListener_ = new (std::nothrow) WfdSystemAbilityListener(shared_from_this());
1197 if (sysAbilityListener_ == nullptr) {
1198 SHARING_LOGE("sysAbilityListener create failed.");
1199 return;
1200 }
1201 int32_t ret = samgrProxy->SubscribeSystemAbility(WIFI_DEVICE_ABILITY_ID, sysAbilityListener_);
1202 SHARING_LOGI("result is %{public}d.", ret);
1203 }
1204
UnRegisterWfdAbilityListener()1205 void WfdSinkScene::UnRegisterWfdAbilityListener()
1206 {
1207 SHARING_LOGI("%{public}s.", __FUNCTION__);
1208 std::unique_lock<std::mutex> lock(mutex_);
1209 if (sysAbilityListener_ == nullptr) {
1210 SHARING_LOGE("listener is null");
1211 return;
1212 }
1213 auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1214 if (samgrProxy == nullptr) {
1215 SHARING_LOGE("get system ability manager fail");
1216 return;
1217 }
1218 int32_t ret = samgrProxy->UnSubscribeSystemAbility(WIFI_DEVICE_ABILITY_ID, sysAbilityListener_);
1219 SHARING_LOGI("result is %{public}d.", ret);
1220 sysAbilityListener_ = nullptr;
1221 }
1222
WfdP2pStart()1223 void WfdSinkScene::WfdP2pStart()
1224 {
1225 SHARING_LOGI("trace.");
1226 if (p2pInstance_) {
1227 Wifi::WifiP2pWfdInfo wfdInfo;
1228 wfdInfo.SetWfdEnabled(true);
1229 wfdInfo.SetDeviceInfo(0x11);
1230 wfdInfo.SetCtrlPort(ctrlPort_);
1231 wfdInfo.SetMaxThroughput(0x00c8);
1232
1233 p2pInstance_->SetP2pWfdInfo(wfdInfo);
1234 p2pInstance_->StartP2pListen(P2P_LISTEN_PERIOD, P2P_LISTEN_INTERVAL);
1235 }
1236 }
1237
WfdP2pStop()1238 void WfdSinkScene::WfdP2pStop()
1239 {
1240 SHARING_LOGI("trace.");
1241 std::unique_lock<std::mutex> lock(mutex_);
1242 auto sharingAdapter = sharingAdapter_.lock();
1243 if (sharingAdapter != nullptr) {
1244 for (auto item : devConnectionMap_) {
1245 uint32_t contextId = item.second->contextId;
1246 uint32_t agentId = item.second->agentId;
1247
1248 if ((contextId != INVALID_ID) && (agentId != INVALID_ID)) {
1249 auto sessionMsg = std::make_shared<WfdSinkSessionEventMsg>();
1250 sessionMsg->type = EVENT_SESSION_TEARDOWN;
1251 sessionMsg->toMgr = MODULE_CONTEXT;
1252 sessionMsg->dstId = contextId;
1253 sessionMsg->agentId = agentId;
1254
1255 SharingEvent event;
1256 event.eventMsg = std::move(sessionMsg);
1257 sharingAdapter->ForwardEvent(contextId, agentId, event, true);
1258
1259 P2pRemoveClient(*(item.second));
1260
1261 sharingAdapter->DestroyAgent(contextId, agentId);
1262 }
1263 }
1264 }
1265
1266 if (p2pInstance_) {
1267 p2pInstance_->StopP2pListen();
1268 }
1269
1270 devSurfaceItemMap_.clear();
1271 devConnectionMap_.clear();
1272 }
1273
OnP2pPeerConnected(ConnectionInfo & connectionInfo)1274 void WfdSinkScene::OnP2pPeerConnected(ConnectionInfo &connectionInfo)
1275 {
1276 SHARING_LOGD("trace.");
1277 if (!isSinkRunning_) {
1278 SHARING_LOGW("sink service is not running.");
1279 return;
1280 }
1281
1282 auto sharingAdapter = sharingAdapter_.lock();
1283 RETURN_IF_NULL(sharingAdapter);
1284
1285 if (devConnectionMap_.size() >= (uint32_t)accessDevMaximum_) {
1286 SHARING_LOGE("too more device.");
1287 P2pRemoveClient(connectionInfo);
1288
1289 auto ipcAdapter = ipcAdapter_.lock();
1290 RETURN_IF_NULL(ipcAdapter);
1291
1292 auto msg = std::make_shared<WfdErrorMsg>();
1293 msg->message = "Maximum number of devices reached";
1294 msg->errorCode = ERR_RECEIVING_LIMIT;
1295
1296 auto reply = std::static_pointer_cast<BaseMsg>(std::make_shared<WfdCommonRsp>());
1297 ipcAdapter->SendRequest(msg, reply);
1298
1299 return;
1300 }
1301
1302 {
1303 std::unique_lock<std::mutex> lock(mutex_);
1304 if (devConnectionMap_.count(connectionInfo.mac)) {
1305 SHARING_LOGW("devcie is alerady connected, mac: %{private}s.", GetAnonyString(connectionInfo.mac).c_str());
1306 return;
1307 }
1308
1309 uint32_t contextId = INVALID_ID;
1310 uint32_t agentId = INVALID_ID;
1311
1312 sharingAdapter->CreateAgent(contextId, agentId, AgentType::SINK_AGENT, "WfdSinkSession");
1313 if (contextId == INVALID_ID || agentId == INVALID_ID) {
1314 lock.unlock();
1315 SHARING_LOGE("connected, create sink agent failed, devMac: %{private}s.",
1316 GetAnonyString(connectionInfo.mac).c_str());
1317 return;
1318 } else {
1319 SHARING_LOGI("connected, create sink agent, contextId: %{public}u, "
1320 "agentId: %{public}u, devMac: %{private}s, devIp: %{private}s.",
1321 contextId, agentId, connectionInfo.mac.c_str(), connectionInfo.ip.c_str());
1322 }
1323
1324 connectionInfo.contextId = contextId;
1325 connectionInfo.agentId = agentId;
1326 connectionInfo.videoCodecId = videoCodecId_;
1327 connectionInfo.videoFormatId = videoFormatId_;
1328 connectionInfo.audioCodecId = audioCodecId_;
1329 connectionInfo.audioFormatId = audioFormatId_;
1330
1331 std::shared_ptr<ConnectionInfo> connectionInfoPtr = std::make_shared<ConnectionInfo>(connectionInfo);
1332 devConnectionMap_.emplace(connectionInfo.mac, connectionInfoPtr);
1333 SHARING_LOGI("connected, devMac: %{private}s, devIp: %{private}s.", GetAnonyString(connectionInfo.mac).c_str(),
1334 GetAnonyString(connectionInfo.ip).c_str());
1335 }
1336
1337 OnConnectionChanged(connectionInfo);
1338 }
1339
OnP2pPeerDisconnected(ConnectionInfo & connectionInfo)1340 void WfdSinkScene::OnP2pPeerDisconnected(ConnectionInfo &connectionInfo)
1341 {
1342 SHARING_LOGD("trace.");
1343 auto sharingAdapter = sharingAdapter_.lock();
1344 RETURN_IF_NULL(sharingAdapter);
1345
1346 uint32_t contextId = INVALID_ID;
1347 uint32_t agentId = INVALID_ID;
1348 {
1349 std::unique_lock<std::mutex> lock(mutex_);
1350 auto itemDev = devConnectionMap_.find(connectionInfo.mac);
1351 if (itemDev == devConnectionMap_.end()) {
1352 lock.unlock();
1353 SHARING_LOGW("can not find dev, mac: %{private}s.", GetAnonyString(connectionInfo.mac).c_str());
1354 return;
1355 }
1356
1357 contextId = itemDev->second->contextId;
1358 agentId = itemDev->second->agentId;
1359 connectionInfo.surfaceId = itemDev->second->surfaceId;
1360
1361 for (auto itemSurface = devSurfaceItemMap_.begin(); itemSurface != devSurfaceItemMap_.end();) {
1362 if (connectionInfo.mac == itemSurface->second->deviceId) {
1363 itemSurface->second->deleting = true;
1364 }
1365 itemSurface++;
1366 }
1367
1368 P2pRemoveClient(connectionInfo);
1369
1370 devConnectionMap_.erase(connectionInfo.mac);
1371 SHARING_LOGI("disconnected, contextId: %{public}u, agentId: %{public}u, devMac: %{private}s.", contextId,
1372 agentId, connectionInfo.mac.c_str());
1373 }
1374
1375 OnConnectionChanged(connectionInfo);
1376
1377 if ((contextId == INVALID_ID) || (agentId == INVALID_ID)) {
1378 return;
1379 }
1380
1381 auto sessionMsg = std::make_shared<WfdSinkSessionEventMsg>();
1382 sessionMsg->type = EVENT_SESSION_TEARDOWN;
1383 sessionMsg->toMgr = MODULE_CONTEXT;
1384 sessionMsg->dstId = contextId;
1385 sessionMsg->agentId = agentId;
1386
1387 SharingEvent event;
1388 event.eventMsg = std::move(sessionMsg);
1389
1390 sharingAdapter->ForwardEvent(contextId, agentId, event, true);
1391 sharingAdapter->DestroyAgent(contextId, agentId);
1392 }
1393
OnP2pPeerDisconnected(std::string & mac)1394 void WfdSinkScene::OnP2pPeerDisconnected(std::string &mac)
1395 {
1396 SHARING_LOGD("trace.");
1397 uint32_t contextId = INVALID_ID;
1398 uint32_t agentId = INVALID_ID;
1399 std::shared_ptr<ConnectionInfo> connectionInfo = nullptr;
1400 {
1401 std::unique_lock<std::mutex> lock(mutex_);
1402 auto itemDev = devConnectionMap_.find(mac);
1403 if (itemDev == devConnectionMap_.end()) {
1404 lock.unlock();
1405 SHARING_LOGW("can not find dev, mac: %{private}s.", GetAnonyString(mac).c_str());
1406 return;
1407 }
1408
1409 contextId = itemDev->second->contextId;
1410 agentId = itemDev->second->agentId;
1411 connectionInfo = itemDev->second;
1412
1413 for (auto itemSurface = devSurfaceItemMap_.begin(); itemSurface != devSurfaceItemMap_.end();) {
1414 if (mac == itemSurface->second->deviceId) {
1415 itemSurface->second->deleting = true;
1416 }
1417 itemSurface++;
1418 }
1419
1420 SHARING_LOGI("disconnected, contextId: %{public}u, agentId: %{public}u, devMac: %{private}s.", contextId,
1421 agentId, mac.c_str());
1422 P2pRemoveClient(*connectionInfo);
1423
1424 devConnectionMap_.erase(mac);
1425 }
1426
1427 if ((contextId == INVALID_ID) || (agentId == INVALID_ID)) {
1428 return;
1429 }
1430
1431 auto sharingAdapter = sharingAdapter_.lock();
1432 if (sharingAdapter != nullptr) {
1433 sharingAdapter->DestroyAgent(contextId, agentId);
1434 }
1435
1436 if (connectionInfo != nullptr) {
1437 connectionInfo->state = ConnectionState::DISCONNECTED;
1438 OnConnectionChanged(*connectionInfo);
1439 }
1440 }
1441
ErrorCodeFiltering(int32_t & code)1442 void WfdSinkScene::ErrorCodeFiltering(int32_t &code)
1443 {
1444 SHARING_LOGD("the error code is %{public}d.", code);
1445 switch (ABSTRACT_ERR_BASE(code)) {
1446 case SharingErrorCode::ERR_CONTEXT_AGENT_BASE: // fall-through
1447 case SharingErrorCode::ERR_SESSION_BASE:
1448 code = SharingErrorCode::ERR_GENERAL_ERROR;
1449 SHARING_LOGD("the error change to %{public}d.", code);
1450 break;
1451 case SharingErrorCode::ERR_PROSUMER_BASE: {
1452 switch (code) {
1453 case ERR_PROSUMER_START:
1454 code = SharingErrorCode::ERR_CONNECTION_FAILURE;
1455 break;
1456 case ERR_PROSUMER_TIMEOUT:
1457 code = SharingErrorCode::ERR_CONNECTION_TIMEOUT;
1458 break;
1459 case ERR_PROSUMER_DESTROY:
1460 code = SharingErrorCode::ERR_STATE_EXCEPTION;
1461 break;
1462 default:
1463 code = SharingErrorCode::ERR_GENERAL_ERROR;
1464 break;
1465 }
1466 break;
1467 }
1468 default:
1469 SHARING_LOGI("none process case.");
1470 break;
1471 }
1472 }
1473
OnInnerError(uint32_t contextId,uint32_t agentId,SharingErrorCode errorCode,std::string message)1474 void WfdSinkScene::OnInnerError(uint32_t contextId, uint32_t agentId, SharingErrorCode errorCode, std::string message)
1475 {
1476 SHARING_LOGD("trace.");
1477 auto ipcAdapter = ipcAdapter_.lock();
1478 RETURN_IF_NULL(ipcAdapter);
1479
1480 auto msg = std::make_shared<WfdErrorMsg>();
1481 msg->contextId = contextId;
1482 msg->agentId = agentId;
1483 msg->errorCode = errorCode;
1484
1485 for (auto &item : devConnectionMap_) {
1486 if ((contextId == item.second->contextId) && (agentId == item.second->agentId)) {
1487 msg->mac = item.second->mac;
1488 break;
1489 }
1490 }
1491
1492 if (errorCode == SharingErrorCode::ERR_PROSUMER_TIMEOUT) {
1493 msg->message =
1494 "contextId: " + std::to_string(contextId) + ", agentId: " + std::to_string(agentId) + ", producer timeout";
1495 } else {
1496 msg->message = std::move(message);
1497 }
1498
1499 ErrorCodeFiltering(msg->errorCode);
1500 auto reply = std::static_pointer_cast<BaseMsg>(std::make_shared<WfdCommonRsp>());
1501
1502 SHARING_LOGW("receive errorCode: %{public}d.", errorCode);
1503 ipcAdapter->SendRequest(msg, reply);
1504 }
1505
OnInnerError(std::string deviceId,SharingErrorCode errorCode,std::string message)1506 void WfdSinkScene::OnInnerError(std::string deviceId, SharingErrorCode errorCode, std::string message)
1507 {
1508 SHARING_LOGD("trace.");
1509 auto ipcAdapter = ipcAdapter_.lock();
1510 RETURN_IF_NULL(ipcAdapter);
1511
1512 auto msg = std::make_shared<WfdErrorMsg>();
1513 msg->message = message;
1514 msg->mac = deviceId;
1515 msg->errorCode = errorCode;
1516
1517 auto reply = std::static_pointer_cast<BaseMsg>(std::make_shared<WfdCommonRsp>());
1518
1519 SHARING_LOGW("receive errorCode: %{public}d.", errorCode);
1520 ipcAdapter->SendRequest(msg, reply);
1521 }
1522
OnInnerDestroy(uint32_t contextId,uint32_t agentId,AgentType agentType)1523 void WfdSinkScene::OnInnerDestroy(uint32_t contextId, uint32_t agentId, AgentType agentType)
1524 {
1525 SHARING_LOGI("HandleInnerDestroy, contextId: %{public}u, agentId: %{public}u, agentType: %{public}s.", contextId,
1526 agentId, std::string(magic_enum::enum_name(agentType)).c_str());
1527
1528 std::unique_lock<std::mutex> lock(mutex_);
1529 for (auto itemSurface = devSurfaceItemMap_.begin(); itemSurface != devSurfaceItemMap_.end();) {
1530 if ((itemSurface->second != nullptr) && (contextId == itemSurface->second->contextId) &&
1531 (agentId == itemSurface->second->agentId)) {
1532 devSurfaceItemMap_.erase(itemSurface++);
1533 } else {
1534 itemSurface++;
1535 }
1536 }
1537
1538 for (auto &item : devConnectionMap_) {
1539 if ((item.second != nullptr) && (contextId == item.second->contextId) && (agentId == item.second->agentId)) {
1540 ConnectionInfo connectionInfo;
1541 connectionInfo.ip = item.second->ip;
1542 connectionInfo.mac = item.second->mac;
1543 connectionInfo.deviceName = item.second->deviceName;
1544 connectionInfo.primaryDeviceType = item.second->primaryDeviceType;
1545 connectionInfo.secondaryDeviceType = item.second->secondaryDeviceType;
1546 connectionInfo.ctrlPort = item.second->ctrlPort;
1547 connectionInfo.state = ConnectionState::DISCONNECTED;
1548
1549 SHARING_LOGI(
1550 "disconnected, contextId: %{public}u, agentId: %{public}u, devMac: %{private}s, devIp: %{private}s.",
1551 contextId, agentId, connectionInfo.mac.c_str(), connectionInfo.ip.c_str());
1552 OnConnectionChanged(connectionInfo);
1553
1554 P2pRemoveClient(connectionInfo);
1555
1556 devConnectionMap_.erase(item.second->mac);
1557 break;
1558 }
1559 }
1560 }
1561
OnInnerEvent(SharingEvent & event)1562 void WfdSinkScene::OnInnerEvent(SharingEvent &event)
1563 {
1564 SHARING_LOGD("trace.");
1565 RETURN_IF_NULL(event.eventMsg);
1566
1567 SHARING_LOGI("eventType: %{public}s.", std::string(magic_enum::enum_name(event.eventMsg->type)).c_str());
1568 switch (event.eventMsg->type) {
1569 case EventType::EVENT_WFD_NOTIFY_RTSP_PLAYED: {
1570 auto msg = ConvertEventMsg<WfdSceneEventMsg>(event);
1571 if (msg) {
1572 std::unique_lock<std::mutex> lock(mutex_);
1573 auto itConnection = devConnectionMap_.find(msg->mac);
1574 if (itConnection == devConnectionMap_.end()) {
1575 SHARING_LOGD("can't find dev %{private}s.", msg->mac.c_str());
1576 break;
1577 }
1578
1579 itConnection->second->state = ConnectionState::PLAYING;
1580 OnConnectionChanged(*itConnection->second);
1581 }
1582 break;
1583 }
1584 case EventType::EVENT_WFD_NOTIFY_RTSP_TEARDOWN: {
1585 auto msg = ConvertEventMsg<WfdSceneEventMsg>(event);
1586 if (msg) {
1587 OnP2pPeerDisconnected(msg->mac);
1588 }
1589 break;
1590 }
1591 case EventType::EVENT_INTERACTION_ACCELERATION_DONE: {
1592 auto msg = ConvertEventMsg<InteractionEventMsg>(event);
1593 SHARING_LOGD("On acceleration done, contextId: %{public}d agentId: %{public}d.", msg->contextId,
1594 msg->agentId);
1595 for (auto connectInfoPair : devConnectionMap_) {
1596 if (connectInfoPair.second != nullptr && connectInfoPair.second->contextId == msg->contextId &&
1597 connectInfoPair.second->agentId == msg->agentId) {
1598 SHARING_LOGD("On acceleration done, device found.");
1599 auto connectInfo = connectInfoPair.second;
1600 connectInfo->surfaceId = msg->surfaceId;
1601
1602 OnDecoderAccelerationDone(*connectInfo);
1603 break;
1604 }
1605 SHARING_LOGW("On acceleration done, device not found.");
1606 }
1607 break;
1608 }
1609 case EventType::EVENT_INTERACTION_STATE_REMOVE_SURFACE: {
1610 auto msg = ConvertEventMsg<InteractionEventMsg>(event);
1611 SHARING_LOGD("On state remove surface, agentId: %{public}d.", msg->agentId);
1612 std::unique_lock<std::mutex> lock(mutex_);
1613 devSurfaceItemMap_.erase(msg->surfaceId);
1614 break;
1615 }
1616 case EVENT_INTERACTION_DECODER_DIED: {
1617 auto msg = ConvertEventMsg<InteractionEventMsg>(event);
1618 auto surfaceItem = devSurfaceItemMap_.find(msg->surfaceId);
1619 if (surfaceItem != devSurfaceItemMap_.end() && surfaceItem->second != nullptr) {
1620 auto itConnection = devConnectionMap_.find(surfaceItem->second->deviceId);
1621 OnDecoderDied(*itConnection->second);
1622 }
1623 break;
1624 }
1625 default:
1626 SHARING_LOGI("none process case.");
1627 break;
1628 }
1629 }
1630
OnConnectionChanged(ConnectionInfo & connectionInfo)1631 void WfdSinkScene::OnConnectionChanged(ConnectionInfo &connectionInfo)
1632 {
1633 SHARING_LOGD("trace.");
1634 auto ipcAdapter = ipcAdapter_.lock();
1635 RETURN_IF_NULL(ipcAdapter);
1636
1637 auto msg = std::make_shared<WfdConnectionChangedMsg>();
1638 msg->ip = connectionInfo.ip;
1639 msg->mac = connectionInfo.mac;
1640 msg->state = connectionInfo.state;
1641 msg->surfaceId = connectionInfo.surfaceId;
1642 msg->deviceName = connectionInfo.deviceName;
1643 msg->primaryDeviceType = connectionInfo.primaryDeviceType;
1644 msg->secondaryDeviceType = connectionInfo.secondaryDeviceType;
1645
1646 auto reply = std::static_pointer_cast<BaseMsg>(std::make_shared<WfdCommonRsp>());
1647 ipcAdapter->SendRequest(msg, reply);
1648 }
1649
P2pRemoveClient(ConnectionInfo & connectionInfo)1650 void WfdSinkScene::P2pRemoveClient(ConnectionInfo &connectionInfo)
1651 {
1652 SHARING_LOGI("p2p remove client: %{private}s.", GetAnonyString(connectionInfo.mac).c_str());
1653 currentConnectDev_.mac = "";
1654 if (!p2pInstance_) {
1655 SHARING_LOGE("p2p instance is null");
1656 return;
1657 }
1658
1659 OHOS::Wifi::GcInfo info;
1660 info.mac = connectionInfo.mac;
1661 info.ip = connectionInfo.ip;
1662 info.host = connectionInfo.deviceName;
1663
1664 p2pInstance_->RemoveGroupClient(info);
1665 }
1666
OnDecoderAccelerationDone(ConnectionInfo & connectionInfo)1667 void WfdSinkScene::OnDecoderAccelerationDone(ConnectionInfo &connectionInfo)
1668 {
1669 SHARING_LOGD("trace.");
1670 auto ipcAdapter = ipcAdapter_.lock();
1671 RETURN_IF_NULL(ipcAdapter);
1672
1673 auto msg = std::make_shared<WfdDecoderAccelerationDoneMsg>();
1674 msg->surfaceId = connectionInfo.surfaceId;
1675
1676 auto reply = std::static_pointer_cast<BaseMsg>(std::make_shared<WfdCommonRsp>());
1677 ipcAdapter->SendRequest(msg, reply);
1678 SHARING_LOGD("device ip: %{private}s, mac: %{private}s, state: %{public}s.",
1679 GetAnonyString(connectionInfo.ip).c_str(), GetAnonyString(connectionInfo.mac).c_str(),
1680 std::string(magic_enum::enum_name(connectionInfo.state)).c_str());
1681 }
1682
OnDecoderDied(ConnectionInfo & connectionInfo)1683 void WfdSinkScene::OnDecoderDied(ConnectionInfo &connectionInfo)
1684 {
1685 SHARING_LOGD("trace.");
1686 auto ipcAdapter = ipcAdapter_.lock();
1687 RETURN_IF_NULL(ipcAdapter);
1688
1689 auto msg = std::make_shared<WfdSurfaceFailureMsg>();
1690 msg->surfaceId = connectionInfo.surfaceId;
1691 auto reply = std::static_pointer_cast<BaseMsg>(std::make_shared<WfdCommonRsp>());
1692 ipcAdapter->SendRequest(msg, reply);
1693
1694 SHARING_LOGD("failed at device ip: %{private}s, mac: %{private}s, state: %{public}s.", connectionInfo.ip.c_str(),
1695 connectionInfo.mac.c_str(), std::string(magic_enum::enum_name(connectionInfo.state)).c_str());
1696 }
1697
OnRemoteDied()1698 void WfdSinkScene::OnRemoteDied()
1699 {
1700 SHARING_LOGD("trace.");
1701 auto sharingAdapter = sharingAdapter_.lock();
1702 if (sharingAdapter) {
1703 sharingAdapter->ReleaseScene(GetId());
1704 }
1705 }
1706
1707 REGISTER_CLASS_REFLECTOR(WfdSinkScene);
1708 } // namespace Sharing
1709 } // namespace OHOS
1710