• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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