• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  * Description: Cast Session implement realization.
15  * Author: lijianzhao
16  * Create: 2022-01-25
17  */
18 
19 #include "cast_session_impl.h"
20 
21 #include <array>
22 
23 #include "cast_engine_errors.h"
24 #include "cast_engine_log.h"
25 #include "cast_device_data_manager.h"
26 #include "cast_stream_manager_client.h"
27 #include "cast_stream_manager_server.h"
28 #include "connection_manager.h"
29 #include "dm_device_info.h"
30 #include "ipc_skeleton.h"
31 #include "json/json.h"
32 #include "mirror_player_impl.h"
33 #include "permission.h"
34 #include "cast_engine_dfx.h"
35 
36 namespace OHOS {
37 namespace CastEngine {
38 namespace CastEngineService {
39 DEFINE_CAST_ENGINE_LABEL("Cast-SessionImpl");
40 
41 using CastSessionRtsp::ActionType;
42 using CastSessionRtsp::DeviceTypeParamInfo;
43 using CastSessionRtsp::VtpType;
44 
45 namespace {
ProcessConnectWriteWrap(const std::string & funcName,ProtocolType protocolType,int sceneType,const std::string & puid)46 void ProcessConnectWriteWrap(const std::string& funcName,
47     ProtocolType protocolType, int sceneType, const std::string& puid)
48 {
49     if (protocolType == ProtocolType::COOPERATION) {
50         HiSysEventWriteWrap(funcName, {
51             {"BIZ_SCENE", static_cast<int32_t>(BIZSceneType::DEVICE_DISCOVERY)},
52             {"BIZ_STATE", static_cast<int32_t>(BIZStateType::BIZ_STATE_END)},
53             {"BIZ_STAGE", static_cast<int32_t>(BIZSceneStage::DEVICE_DISCOVERY)},
54             {"STAGE_RES", static_cast<int32_t>(StageResType::STAGE_RES_SUCCESS)},
55             {"ERROR_CODE", CAST_RADAR_SUCCESS}}, {
56             {"TO_CALL_PKG", DEVICE_MANAGER_NAME},
57             {"LOCAL_SESS_NAME", ""},
58             {"PEER_SESS_NAME", ""},
59             {"PEER_UDID", puid}});
60 
61         HiSysEventWriteWrap(funcName, {
62             {"BIZ_SCENE", static_cast<int32_t>(BIZSceneType::COOPERATION)},
63             {"BIZ_STATE", static_cast<int32_t>(BIZStateType::BIZ_STATE_BEGIN)},
64             {"BIZ_STAGE", static_cast<int32_t>(BIZSceneStage::COOPERATION_ESTABLISH_RTSP_CHANNEL)},
65             {"STAGE_RES", static_cast<int32_t>(StageResType::STAGE_RES_IDLE)},
66             {"ERROR_CODE", CAST_RADAR_SUCCESS}}, {
67             {"TO_CALL_PKG", DSOFTBUS_NAME},
68             {"LOCAL_SESS_NAME", ""},
69             {"PEER_SESS_NAME", ""},
70             {"PEER_UDID", puid}});
71     } else {
72         HiSysEventWriteWrap(funcName, {
73             {"BIZ_SCENE", sceneType},
74             {"BIZ_STAGE", static_cast<int32_t>(BIZSceneStage::ESTABLISH_RTSP_CHANNEL)},
75             {"STAGE_RES", static_cast<int32_t>(StageResType::STAGE_RES_IDLE)},
76             {"ERROR_CODE", CAST_RADAR_SUCCESS}}, {
77             {"TO_CALL_PKG", DSOFTBUS_NAME},
78             {"LOCAL_SESS_NAME", ""},
79             {"PEER_SESS_NAME", ""},
80             {"PEER_UDID", ""}});
81     }
82 }
83 }
84 
85 const std::array<std::string, static_cast<size_t>(MessageId::MSG_ID_MAX)>
86     CastSessionImpl::MESSAGE_ID_STRING = {
87         "MSG_CONNECT",
88         "MSG_SETUP",
89         "MSG_SETUP_SUCCESS",
90         "MSG_SETUP_FAILED",
91         "MSG_SETUP_DONE",
92         "MSG_PLAY",
93         "MSG_PAUSE",
94         "MSG_PLAY_REQ",
95         "MSG_PAUSE_REQ",
96         "MSG_DISCONNECT",
97         "MSG_CONNECT_TIMEOUT",
98         "MSG_PROCESS_TRIGGER_REQ",
99         "MSG_UPDATE_VIDEO_SIZE",
100         "MSG_STREAM_RECV_ACTION_EVENT_FROM_PEERS",
101         "MSG_STREAM_SEND_ACTION_EVENT_TO_PEERS",
102         "MSG_PEER_RENDER_READY",
103         "MSG_ERROR",
104         "MSG_SET_CAST_MODE",
105         "MSG_READY_TO_PLAYING",
106         "MSG_MIRROR_SEND_ACTION_EVENT_TO_PEERS",
107     };
108 std::atomic<int> CastSessionImpl::idCount_ = rand();
109 
CastSessionImpl(const CastSessionProperty & property,const CastLocalDevice & localDevice)110 CastSessionImpl::CastSessionImpl(const CastSessionProperty &property, const CastLocalDevice &localDevice)
111     : localDevice_(localDevice), property_(property)
112 {
113     CLOGD("In");
114 }
115 
~CastSessionImpl()116 CastSessionImpl::~CastSessionImpl()
117 {
118     CLOGD("~CastSessionImpl in");
119     StopSafty(false);
120     ThreadJoin();
121     CLOGD("~CastSessionImpl out");
122 }
123 
SetServiceCallbackForRelease(const std::function<void (int)> & callback)124 void CastSessionImpl::SetServiceCallbackForRelease(const std::function<void(int)> &callback)
125 {
126     std::lock_guard<std::mutex> lock(serviceCallbackMutex_);
127     serviceCallback_ = callback;
128 }
129 
RegisterListener(sptr<ICastSessionListenerImpl> listener)130 int32_t CastSessionImpl::RegisterListener(sptr<ICastSessionListenerImpl> listener)
131 {
132     CLOGD("Start to register session listener");
133     if (!Permission::CheckPidPermission()) {
134         return ERR_NO_PERMISSION;
135     }
136     std::unique_lock<std::mutex> lock(mutex_);
137     listeners_[IPCSkeleton::GetCallingPid()] = listener;
138     cond_.notify_all();
139     return CAST_ENGINE_SUCCESS;
140 }
141 
UnregisterListener()142 int32_t CastSessionImpl::UnregisterListener()
143 {
144     CLOGD("In");
145     std::unique_lock<std::mutex> lock(mutex_);
146     listeners_.erase(IPCSkeleton::GetCallingPid());
147     return CAST_ENGINE_SUCCESS;
148 }
149 
AddDevice(const CastRemoteDevice & remoteDevice)150 int32_t CastSessionImpl::AddDevice(const CastRemoteDevice &remoteDevice)
151 {
152     CLOGI("sessionId_ %{public}d", sessionId_);
153     auto remote = CastDeviceDataManager::GetInstance().GetDeviceByDeviceId(remoteDevice.deviceId);
154     if (remote == std::nullopt) {
155         return CAST_ENGINE_ERROR;
156     }
157     remote->sessionId = sessionId_;
158     remote->subDeviceType = remoteDevice.subDeviceType;
159     if (!AddDevice(*remote) || !ConnectionManager::GetInstance().ConnectDevice(*remote)) {
160         CLOGE("AddDevice or ConnectDevice fail");
161         return CAST_ENGINE_ERROR;
162     }
163     CLOGI("AddDevice out.");
164     return CAST_ENGINE_SUCCESS;
165 }
166 
AddDevice(const CastInnerRemoteDevice & remoteDevice)167 bool CastSessionImpl::AddDevice(const CastInnerRemoteDevice &remoteDevice)
168 {
169     if (!Permission::CheckPidPermission()) {
170         return false;
171     }
172 
173     CLOGI("In: session state: %{public}s", SESSION_STATE_STRING[static_cast<int>(sessionState_)].c_str());
174     {
175         std::unique_lock<std::mutex> lock(mutex_);
176         if (listeners_.empty()) {
177             int timeout = 5; // unit: s
178             sptr<CastSessionImpl> self(this);
179             bool result =
180                 cond_.wait_for(lock, std::chrono::seconds(timeout), [self] { return !self->listeners_.empty(); });
181             if (!result) {
182                 CLOGE("Wait the listener timeout");
183                 return false;
184             }
185         }
186     }
187 
188     WaitSinkSetProperty();
189     if (property_.protocolType == ProtocolType::HICAR || property_.protocolType == ProtocolType::SUPER_LAUNCHER) {
190         OtherAddDevice(remoteDevice);
191     } else if (property_.protocolType == ProtocolType::COOPERATION ||
192         property_.protocolType == ProtocolType::COOPERATION_LEGACY) {
193         CLOGI("cooperation scene protocolType:%x", static_cast<uint32_t>(property_.protocolType));
194         auto dmDevice = ConnectionManager::GetInstance().GetDmDeviceInfo(remoteDevice.deviceId);
195         if (remoteDevice.deviceId.compare(dmDevice.deviceId) != 0) {
196             CLOGE("Failed to get DmDeviceInfo");
197             return false;
198         }
199         std::string networkId;
200         if (!ConnectionManager::GetInstance().IsDeviceTrusted(remoteDevice.deviceId, networkId)) {
201             CLOGI("Is not a trusted device");
202             return false;
203         }
204         if (!CastDeviceDataManager::GetInstance().AddDevice(remoteDevice, dmDevice)) {
205             return false;
206         }
207     } else if (!CastDeviceDataManager::GetInstance().UpdateDevice(remoteDevice)) {
208         return false;
209     }
210 
211     if (!AddRemoteDevice(CastRemoteDeviceInfo { remoteDevice, DeviceState::DISCONNECTED })) {
212         return false;
213     }
214 
215     if (property_.protocolType == ProtocolType::COOPERATION ||
216         property_.protocolType == ProtocolType::COOPERATION_LEGACY ||
217         property_.protocolType == ProtocolType::HICAR || property_.protocolType == ProtocolType::SUPER_LAUNCHER) {
218         SendCastMessage(Message(MessageId::MSG_CONNECT, remoteDevice.deviceId));
219     }
220     return true;
221 }
222 
OtherAddDevice(const CastInnerRemoteDevice & remoteDevice)223 void CastSessionImpl::OtherAddDevice(const CastInnerRemoteDevice &remoteDevice)
224 {
225     CLOGI("hicar scene protocolType:%{public}x", static_cast<uint32_t>(property_.protocolType));
226     DmDeviceInfo dmDeviceInfo {};
227     if (strcpy_s(dmDeviceInfo.deviceId, sizeof(dmDeviceInfo.deviceId), remoteDevice.deviceId.c_str()) != EOK) {
228         CLOGE("strcpy_s fail, errno: %{public}d", errno);
229         return;
230     }
231     if (strcpy_s(dmDeviceInfo.deviceName, sizeof(dmDeviceInfo.deviceName), remoteDevice.deviceName.c_str()) != EOK) {
232         CLOGE("strcpy_s fail, errno: %{public}d", errno);
233         return;
234     }
235     if (!CastDeviceDataManager::GetInstance().AddDevice(remoteDevice, dmDeviceInfo)) {
236         CLOGW("Add device fail");
237     }
238 }
239 
WaitSinkSetProperty()240 void CastSessionImpl::WaitSinkSetProperty()
241 {
242     std::unique_lock<std::mutex> lock(mutex_);
243     if (property_.protocolType == ProtocolType::CAST_PLUS_STREAM || property_.endType != EndType::CAST_SINK) {
244         return;
245     }
246 
247     int timeout = 1; // unit: s
248     sptr<CastSessionImpl> self(this);
249     bool result = setProperty_.wait_for(lock, std::chrono::seconds(timeout),
250         [self] { return self->property_.videoProperty.fps != 0; });
251     if (!result) {
252         CLOGW("Wait the SetSessionProperty timeout");
253     }
254 }
255 
RemoveDevice(const std::string & deviceId)256 int32_t CastSessionImpl::RemoveDevice(const std::string &deviceId)
257 {
258     CLOGI("In: session state: %{public}s", SESSION_STATE_STRING[static_cast<int>(sessionState_)].c_str());
259     if (!Permission::CheckPidPermission()) {
260         return ERR_NO_PERMISSION;
261     }
262 
263     auto anonymousID = GetAnonymousDeviceID(deviceId);
264     auto sceneType = GetBIZSceneType(static_cast<int>(property_.protocolType));
265     HiSysEventWriteWrap(__func__, {
266             {"BIZ_SCENE", sceneType},
267             {"BIZ_STATE", static_cast<int32_t>(BIZStateType::BIZ_STATE_BEGIN)},
268             {"BIZ_STAGE", static_cast<int32_t>(BIZSceneStage::START_DISCONNECT)},
269             {"STAGE_RES", static_cast<int32_t>(StageResType::STAGE_RES_SUCCESS)},
270             {"ERROR_CODE", CAST_RADAR_SUCCESS}}, {
271             {"TO_CALL_PKG", DEVICE_MANAGER_NAME},
272             {"LOCAL_SESS_NAME", ""},
273             {"PEER_SESS_NAME", ""},
274             {"PEER_UDID", anonymousID}});
275 
276     SendCastMessage(Message(MessageId::MSG_DISCONNECT, deviceId));
277     return CAST_ENGINE_SUCCESS;
278 }
279 
ReleaseSessionResources(pid_t pid)280 bool CastSessionImpl::ReleaseSessionResources(pid_t pid)
281 {
282     {
283         std::lock_guard<std::mutex> lock(mutex_);
284         listeners_.erase(pid);
285         if (!listeners_.empty()) {
286             return false;
287         }
288         for (auto &deviceInfo : remoteDeviceList_) {
289             RemoveDevice(deviceInfo.remoteDevice.deviceId);
290         }
291     }
292     Stop();
293     return true;
294 }
295 
CreateMirrorPlayer(sptr<IMirrorPlayerImpl> & mirrorPlayer)296 int32_t CastSessionImpl::CreateMirrorPlayer(sptr<IMirrorPlayerImpl> &mirrorPlayer)
297 {
298     if (!Permission::CheckPidPermission()) {
299         return ERR_NO_PERMISSION;
300     }
301     auto player = MirrorPlayerGetter();
302     if (player == nullptr) {
303         auto tmp = new (std::nothrow) MirrorPlayerImpl(this);
304         if (tmp == nullptr) {
305             CLOGE("CastMirrorPlayerImpl is null");
306             return CAST_ENGINE_ERROR;
307         }
308 
309         std::unique_lock<std::mutex> lock(mirrorMutex_);
310         player = tmp;
311         mirrorPlayer_ = player;
312     }
313     mirrorPlayer = player;
314     return CAST_ENGINE_SUCCESS;
315 }
316 
DestroyMirrorPlayer()317 bool CastSessionImpl::DestroyMirrorPlayer()
318 {
319     std::unique_lock<std::mutex> lock(mirrorMutex_);
320     mirrorPlayer_ = nullptr;
321     return true;
322 }
323 
CreateStreamPlayer(sptr<IStreamPlayerIpc> & streamPlayer)324 int32_t CastSessionImpl::CreateStreamPlayer(sptr<IStreamPlayerIpc> &streamPlayer)
325 {
326     if (!Permission::CheckPidPermission()) {
327         return ERR_NO_PERMISSION;
328     }
329     auto streamManager = CreateStreamPlayerManager();
330     if (!streamManager) {
331         CLOGE("streamManager is null");
332         return CAST_ENGINE_ERROR;
333     }
334     streamPlayer = streamManager->CreateStreamPlayer([this]() { DestroyStreamPlayer(); });
335     return CAST_ENGINE_SUCCESS;
336 }
337 
CreateStreamPlayerManager()338 std::shared_ptr<ICastStreamManager> CastSessionImpl::CreateStreamPlayerManager()
339 {
340     std::unique_lock<std::mutex> lock(streamMutex_);
341     bool isDoubleFrame = CastDeviceDataManager::GetInstance().IsDoubleFrameDevice(GetCurrentRemoteDeviceId());
342     CLOGI("CreateStreamPlayerManager isDoubleFrame:%{public}d", static_cast<int>(isDoubleFrame));
343     isDoubleFrame = false;
344     if (!streamManager_) {
345         if (property_.endType == EndType::CAST_SOURCE) {
346             streamManager_ = std::make_shared<CastStreamManagerClient>(std::make_shared<CastStreamListenerImpl>(this),
347                 isDoubleFrame);
348         } else {
349             streamManager_ = std::make_shared<CastStreamManagerServer>(std::make_shared<CastStreamListenerImpl>(this));
350         }
351     }
352     return streamManager_;
353 }
354 
DestroyStreamPlayer()355 bool CastSessionImpl::DestroyStreamPlayer()
356 {
357     std::unique_lock<std::mutex> lock(streamMutex_);
358     streamManager_ = nullptr;
359     return true;
360 }
361 
Release()362 int32_t CastSessionImpl::Release()
363 {
364     if (!Permission::CheckPidPermission()) {
365         return ERR_NO_PERMISSION;
366     }
367     {
368         std::lock_guard<std::mutex> lock(mutex_);
369         for (auto &deviceInfo : remoteDeviceList_) {
370             RemoveDevice(deviceInfo.remoteDevice.deviceId);
371         }
372     }
373     std::lock_guard<std::mutex> lock(serviceCallbackMutex_);
374     if (!serviceCallback_) {
375         CLOGE("serviceCallback is null");
376         return CAST_ENGINE_ERROR;
377     }
378     serviceCallback_(sessionId_);
379     return CAST_ENGINE_SUCCESS;
380 }
381 
StartAuth(const AuthInfo & authInfo)382 int32_t CastSessionImpl::StartAuth(const AuthInfo &authInfo)
383 {
384     if (!Permission::CheckPidPermission()) {
385         return ERR_NO_PERMISSION;
386     }
387     static_cast<void>(authInfo);
388     return CAST_ENGINE_ERROR;
389 }
390 
GetSessionId(std::string & sessionId)391 int32_t CastSessionImpl::GetSessionId(std::string &sessionId)
392 {
393     if (!Permission::CheckPidPermission()) {
394         return ERR_NO_PERMISSION;
395     }
396     std::lock_guard<std::mutex> lock(mutex_);
397     if (!remoteDeviceList_.empty() &&
398         remoteDeviceList_.front().remoteDevice.channelType == ChannelType::LEGACY_CHANNEL) {
399         CLOGD("tcp get rtsp port");
400         sessionId = std::to_string(rtspPort_);
401         return CAST_ENGINE_SUCCESS;
402     }
403     sessionId = std::to_string(sessionId_);
404     return CAST_ENGINE_SUCCESS;
405 }
406 
Play(const std::string & deviceId)407 int32_t CastSessionImpl::Play(const std::string &deviceId)
408 {
409     if (!Permission::CheckPidPermission()) {
410         return ERR_NO_PERMISSION;
411     }
412     CLOGI("Session state: %{public}s", SESSION_STATE_STRING[static_cast<int>(sessionState_)].c_str());
413     SendCastMessage(Message(MessageId::MSG_PLAY, deviceId));
414     return CAST_ENGINE_SUCCESS;
415 }
416 
Pause(const std::string & deviceId)417 int32_t CastSessionImpl::Pause(const std::string &deviceId)
418 {
419     if (!Permission::CheckPidPermission()) {
420         return ERR_NO_PERMISSION;
421     }
422     CLOGI("Session state: %{public}s", SESSION_STATE_STRING[static_cast<int>(sessionState_)].c_str());
423     SendCastMessage(Message(MessageId::MSG_PAUSE, deviceId));
424     return CAST_ENGINE_SUCCESS;
425 }
426 
GetDeviceState(const std::string & deviceId,DeviceState & deviceState)427 int32_t CastSessionImpl::GetDeviceState(const std::string &deviceId, DeviceState &deviceState)
428 {
429     if (!Permission::CheckPidPermission()) {
430         return ERR_NO_PERMISSION;
431     }
432     auto deviceInfo = FindRemoteDevice(deviceId);
433     DeviceState state = DeviceState::DISCONNECTED;
434     if (deviceInfo != nullptr) {
435         state = deviceInfo->deviceState;
436     }
437     CLOGI("device state: %{public}s", DEVICE_STATE_STRING[static_cast<int>(state)].c_str());
438     deviceState = state;
439     return CAST_ENGINE_SUCCESS;
440 }
441 
SetSessionProperty(const CastSessionProperty & property)442 int32_t CastSessionImpl::SetSessionProperty(const CastSessionProperty &property)
443 {
444     if (!Permission::CheckPidPermission()) {
445         return ERR_NO_PERMISSION;
446     }
447     std::unique_lock<std::mutex> lock(mutex_);
448     if (property_.protocolType != property.protocolType || property_.endType != property.endType) {
449         CLOGE("Wrong protocol type:%d or end type:%d", property.protocolType, property.endType);
450         return CAST_ENGINE_ERROR;
451     }
452     property_ = property;
453     setProperty_.notify_all();
454     CLOGD("video: width-%{public}u, height-%{public}u, fps-%{public}u; audio: sample_rate-%{public}u, "
455         "channels-%{public}u windowWidth-%{public}u, windowHeight-%{public}u",
456         property.videoProperty.videoWidth, property.videoProperty.videoHeight, property.videoProperty.fps,
457         property.audioProperty.sampleRate, property.audioProperty.channelConfig,
458         property.windowProperty.width, property.windowProperty.height);
459     return CAST_ENGINE_SUCCESS;
460 }
461 
SetSurface(sptr<IBufferProducer> producer)462 int32_t CastSessionImpl::SetSurface(sptr<IBufferProducer> producer)
463 {
464     if (!Permission::CheckPidPermission()) {
465         return ERR_NO_PERMISSION;
466     }
467     CLOGD("SetSurface in");
468     return CAST_ENGINE_SUCCESS;
469 }
470 
DeliverInputEvent(const OHRemoteControlEvent & event)471 int32_t CastSessionImpl::DeliverInputEvent(const OHRemoteControlEvent &event)
472 {
473     if (!Permission::CheckPidPermission()) {
474         return ERR_NO_PERMISSION;
475     }
476     CLOGD("DeliverInputEvent in.");
477     if (sessionState_ != SessionState::PLAYING) {
478         CLOGE("DeliverInputEvent failed, not playing.");
479         return ERR_SESSION_STATE_NOT_MATCH;
480     }
481     return CAST_ENGINE_SUCCESS;
482 }
483 
InjectEvent(const OHRemoteControlEvent & event)484 int32_t CastSessionImpl::InjectEvent(const OHRemoteControlEvent &event)
485 {
486     if (!Permission::CheckPidPermission()) {
487         return ERR_NO_PERMISSION;
488     }
489     CLOGD("InjectEvent in.");
490     if (sessionState_ != SessionState::PLAYING) {
491         CLOGE("InjectEvent failed, not playing.");
492         return ERR_SESSION_STATE_NOT_MATCH;
493     }
494     return CAST_ENGINE_SUCCESS;
495 }
496 
GetDisplayId(std::string & displayId)497 int32_t CastSessionImpl::GetDisplayId(std::string &displayId)
498 {
499     if (!Permission::CheckPidPermission()) {
500         return ERR_NO_PERMISSION;
501     }
502     CLOGD("GetDisplayId in");
503     return CAST_ENGINE_SUCCESS;
504 }
505 
ResizeVirtualScreen(uint32_t width,uint32_t height)506 int32_t CastSessionImpl::ResizeVirtualScreen(uint32_t width, uint32_t height)
507 {
508     if (!Permission::CheckPidPermission()) {
509         return ERR_NO_PERMISSION;
510     }
511     return CAST_ENGINE_SUCCESS;
512 }
513 
SetLocalDevice(const CastLocalDevice & localDevice)514 void CastSessionImpl::SetLocalDevice(const CastLocalDevice &localDevice)
515 {
516     localDevice_ = localDevice;
517 }
518 
TransferTo(std::shared_ptr<BaseState> state)519 bool CastSessionImpl::TransferTo(std::shared_ptr<BaseState> state)
520 {
521     if (IsAllowTransferState(state->GetStateId())) {
522         CLOGD("Transfer to %{public}s", SESSION_STATE_STRING[static_cast<int>(state->GetStateId())].c_str());
523         TransferState(state);
524         return true;
525     }
526     return false;
527 }
528 
GetSessionProtocolType(ProtocolType & protocolType)529 int32_t CastSessionImpl::GetSessionProtocolType(ProtocolType &protocolType)
530 {
531     CLOGI("GetSessionProtocolType in");
532     std::unique_lock<std::mutex> lock(mutex_);
533     protocolType = property_.protocolType;
534     return CAST_ENGINE_SUCCESS;
535 }
536 
SetSessionProtocolType(ProtocolType protocolType)537 void CastSessionImpl::SetSessionProtocolType(ProtocolType protocolType)
538 {
539     CLOGI("SetSessionProtocolType in %d old %d", protocolType, property_.protocolType);
540     std::unique_lock<std::mutex> lock(mutex_);
541     property_.protocolType = protocolType;
542     if (protocolType == ProtocolType::CAST_PLUS_STREAM) {
543         setProperty_.notify_all();
544     }
545 }
546 
Init()547 bool CastSessionImpl::Init()
548 {
549     CLOGI("Session state: %{public}s", SESSION_STATE_STRING[static_cast<int>(sessionState_)].c_str());
550 
551     srand(static_cast<unsigned int >(time(nullptr)));
552     sessionId_ = rand() % (MAX_SESSION_ID + 1);
553     channelManagerListener_ = std::make_shared<ChannelManagerListenerImpl>(this);
554     channelManager_ = std::make_shared<ChannelManager>(sessionId_, channelManagerListener_);
555 
556     rtspListener_ = std::make_shared<RtspListenerImpl>(this);
557     rtspControl_ = IRtspController::GetInstance(rtspListener_, property_.protocolType, property_.endType);
558 
559     connectManagerListener_ = std::make_shared<ConnectManagerListenerImpl>(this);
560     ConnectionManager::GetInstance().SetSessionListener(connectManagerListener_);
561 
562     defaultState_ = std::make_shared<DefaultState>(SessionState::DEFAULT, this, nullptr);
563     disconnectedState_ = std::make_shared<DisconnectedState>(SessionState::DISCONNECTED, this, defaultState_);
564     authingState_ = std::make_shared<AuthingState>(SessionState::AUTHING, this, defaultState_);
565     connectingState_ = std::make_shared<ConnectingState>(SessionState::CONNECTING, this, defaultState_);
566     connectedState_ = std::make_shared<ConnectedState>(SessionState::CONNECTED, this, defaultState_);
567     disconnectingState_ = std::make_shared<DisconnectingState>(SessionState::DISCONNECTING, this, defaultState_);
568     pausedState_ = std::make_shared<PausedState>(SessionState::PAUSED, this, connectedState_);
569     playingState_ = std::make_shared<PlayingState>(SessionState::PLAYING, this, connectedState_);
570     streamState_ = std::make_shared<StreamState>(SessionState::STREAM, this, connectedState_);
571     TransferTo(disconnectedState_);
572 
573     return true;
574 }
575 
Stop()576 void CastSessionImpl::Stop()
577 {
578     CLOGD("Start to stop session");
579     // remove msg connect timeout to prevent waiting too long for the thread to stop
580     RemoveMessage(Message(static_cast<int>(MessageId::MSG_CONNECT_TIMEOUT)));
581     StopSafty(true);
582     ThreadJoin();
583     CLOGD("End to stop session");
584 }
585 
InitRtspParamInfo(std::shared_ptr<CastRemoteDeviceInfo> remoteDeviceInfo)586 void CastSessionImpl::InitRtspParamInfo(std::shared_ptr<CastRemoteDeviceInfo> remoteDeviceInfo)
587 {
588     rtspParamInfo_.SetVideoProperty(property_.videoProperty);
589     rtspParamInfo_.SetVersion(CAST_VERSION);
590     rtspParamInfo_.SetSupportVtpOpt((remoteDeviceInfo->remoteDevice.channelType != ChannelType::SOFT_BUS) ?
591         VtpType::VTP_SUPPORT_VIDEO :
592         VtpType::VTP_NOT_SUPPORT_VIDEO);
593     if (property_.protocolType == ProtocolType::CAST_PLUS_MIRROR ||
594         property_.protocolType == ProtocolType::CAST_PLUS_STREAM ||
595         property_.protocolType == ProtocolType::CAST_COOPERATION) {
596         rtspParamInfo_.SetAudioProperty(property_.audioProperty);
597     }
598 
599     if (property_.protocolType == ProtocolType::CAST_PLUS_STREAM) {
600         rtspParamInfo_.SetProjectionMode(CastSessionRtsp::ProjectionMode::STREAM);
601     }
602     auto streamManager = CreateStreamPlayerManager();
603     if (streamManager) {
604         rtspParamInfo_.SetPlayerControllerCapability(streamManager->GetStreamPlayerCapability());
605     }
606 
607     const auto &remote = remoteDeviceInfo->remoteDevice;
608     DeviceTypeParamInfo param = {
609         .localDeviceType = localDevice_.deviceType,
610         .localDeviceSubtype = localDevice_.subDeviceType,
611         .remoteDeviceType = remote.deviceType,
612         .remoteDeviceSubtype = remote.subDeviceType,
613     };
614     rtspParamInfo_.SetDeviceTypeParamInfo(param);
615     rtspParamInfo_.SetFeatureSet(std::set<int> { ParamInfo::FEATURE_STOP_VTP, ParamInfo::FEATURE_FINE_STYLUS,
616         ParamInfo::FEATURE_SOURCE_MOUSE, ParamInfo::FEATURE_SOURCE_MOUSE_HISTORY,
617         ParamInfo::FEATURE_SEND_EVENT_CHANGE });
618 }
619 
GetCurrentRemoteDeviceId()620 std::string CastSessionImpl::GetCurrentRemoteDeviceId()
621 {
622     std::lock_guard<std::mutex> lock(mutex_);
623     if (remoteDeviceList_.empty()) {
624         CLOGE("failed, list is empty.");
625         return "";
626     }
627     return remoteDeviceList_.front().remoteDevice.deviceId;
628 }
629 
ProcessConnect(const Message & msg)630 int CastSessionImpl::ProcessConnect(const Message &msg)
631 {
632     UpdateRemoteDeviceInfoFromCastDeviceDataManager(msg.strArg_);
633     auto remoteDeviceInfo = FindRemoteDevice(msg.strArg_);
634     if (remoteDeviceInfo == nullptr) {
635         CLOGE("remote device is null");
636         return -1;
637     }
638     InitRtspParamInfo(remoteDeviceInfo);
639     if (!rtspControl_->Start(rtspParamInfo_, remoteDeviceInfo->remoteDevice.sessionKey,
640         remoteDeviceInfo->remoteDevice.sessionKeyLength)) {
641         CLOGE("Rtsp start failed, session state: %{public}s",
642             SESSION_STATE_STRING[static_cast<int>(sessionState_)].c_str());
643         rtspControl_->Action(ActionType::TEARDOWN);
644         return -1;
645     }
646 
647     auto &remote = remoteDeviceInfo->remoteDevice;
648     CLOGD("DeviceName = %s, deviceId = %s, sessionId = %{public}d.", remote.deviceName.c_str(), remote.deviceId.c_str(),
649         remoteDeviceInfo->remoteDevice.sessionId);
650 
651     auto request = BuildChannelRequest(remote.deviceId, false, ModuleType::RTSP);
652     if (request == nullptr) {
653         CLOGE("Rtsp start failed, session state: %{public}s",
654             SESSION_STATE_STRING[static_cast<int>(sessionState_)].c_str());
655         return -1;
656     }
657 
658     auto sceneType = GetBIZSceneType(static_cast<int>(property_.protocolType));
659     ProcessConnectWriteWrap(__func__,
660         property_.protocolType, sceneType, GetAnonymousDeviceID(remote.deviceId));
661 
662     int deviceSessionId = channelManager_->CreateChannel(*request, rtspControl_->GetChannelListener());
663     UpdateRemoteDeviceSessionId(remote.deviceId, deviceSessionId);
664     ConnectionManager::GetInstance().SetRTSPPort(deviceSessionId);
665     remote.rtspPort = deviceSessionId;
666     rtspPort_ = deviceSessionId;
667     CLOGD("Out: deviceName = %s, deviceId = %s, sessionId = %{public}d.", remote.deviceName.c_str(),
668         remote.deviceId.c_str(), remoteDeviceInfo->remoteDevice.sessionId);
669     return deviceSessionId;
670 }
671 
SendConsultData(const std::string & deviceId,int port)672 void CastSessionImpl::SendConsultData(const std::string &deviceId, int port)
673 {
674     CLOGI("SendConsultInfo port");
675     ConnectionManager::GetInstance().SendConsultInfo(deviceId, port);
676 }
677 
SetupRemoteControl(const CastInnerRemoteDevice & remote)678 int CastSessionImpl::SetupRemoteControl(const CastInnerRemoteDevice &remote)
679 {
680     CLOGD("SetupRemoteControl.");
681     CLOGD("SetupRemoteControl out");
682     return INVALID_PORT;
683 }
684 
IsVtpUsed(ChannelType type)685 bool CastSessionImpl::IsVtpUsed(ChannelType type)
686 {
687     return (type != ChannelType::SOFT_BUS) && (rtspParamInfo_.GetSupportVtpOpt() != VtpType::VTP_NOT_SUPPORT_VIDEO);
688 }
689 
IsChannelClient(ChannelType type)690 bool CastSessionImpl::IsChannelClient(ChannelType type)
691 {
692     if (property_.endType == EndType::CAST_SOURCE) {
693         return IsVtpUsed(type);
694     }
695 
696     return !IsVtpUsed(type);
697 }
698 
IsChannelNeeded(ChannelType type)699 bool CastSessionImpl::IsChannelNeeded(ChannelType type)
700 {
701     return (property_.endType != EndType::CAST_SINK) || !IsVtpUsed(type);
702 }
703 
GetMediaPort(ChannelType type,int port)704 std::pair<int, int> CastSessionImpl::GetMediaPort(ChannelType type, int port)
705 {
706     if (type != ChannelType::SOFT_BUS) {
707         if (IsChannelClient(type)) {
708             int videoPort = rand() % (MAX_PORT - MIN_PORT + 1) + MIN_PORT;
709             return std::pair<int, int> { videoPort, videoPort + 1 };
710         }
711         return std::pair<int, int> { port, UNNEEDED_PORT };
712     }
713 
714     if (!IsChannelClient(type)) {
715         return (property_.protocolType == ProtocolType::CAST_PLUS_MIRROR ||
716             property_.protocolType == ProtocolType::CAST_PLUS_STREAM ||
717             property_.protocolType == ProtocolType::CAST_COOPERATION) ?
718             std::pair<int, int> { INVALID_PORT, INVALID_PORT } :
719             std::pair<int, int> { INVALID_PORT, UNNEEDED_PORT };
720     }
721 
722     if (property_.protocolType == ProtocolType::CAST_PLUS_MIRROR ||
723         property_.protocolType == ProtocolType::CAST_PLUS_STREAM ||
724         property_.protocolType == ProtocolType::CAST_COOPERATION) {
725         if (!IsVtpUsed(type)) {
726             // audio port is same as video base on tcp protocol, softbus don't care about the port.
727             return { port, port };
728         }
729 
730         int videoPort = static_cast<int>((static_cast<unsigned int>(port) >> SOCKET_PORT_BITS) & SOCKET_PORT_MASK);
731         int audioPort = static_cast<int>(static_cast<unsigned int>(port) & SOCKET_PORT_MASK);
732         return { videoPort, audioPort };
733     }
734     return { port, UNNEEDED_PORT };
735 }
736 
SetupMedia(const CastInnerRemoteDevice & remote,ChannelType type,int ports)737 std::optional<int> CastSessionImpl::SetupMedia(const CastInnerRemoteDevice &remote, ChannelType type, int ports)
738 {
739     return std::nullopt;
740 }
741 
ProcessSetUp(const Message & msg)742 bool CastSessionImpl::ProcessSetUp(const Message &msg)
743 {
744     CLOGD("Media ports: %d, rc ports: %d id %s", msg.arg1_, msg.arg2_, msg.strArg_.c_str());
745 
746     auto deviceInfo = FindRemoteDevice(msg.strArg_);
747     if (deviceInfo == nullptr) {
748         CLOGE("Remote device is null");
749         rtspControl_->Action(ActionType::TEARDOWN);
750         return false;
751     }
752 
753     const auto &remote = deviceInfo->remoteDevice;
754     auto channelType = remote.channelType;
755     CLOGD("DeviceName = %s, deviceId = %s, sessionId = %{public}d, channelType = %{public}d.",
756         remote.deviceName.c_str(), remote.deviceId.c_str(), remote.sessionId, channelType);
757     int remoteControlPort = SetupRemoteControl(remote);
758     if (remoteControlPort == INVALID_PORT) {
759         rtspControl_->Action(ActionType::TEARDOWN);
760         return false;
761     }
762 
763     int mediaPort = msg.arg1_;
764     auto port = SetupMedia(remote, channelType, mediaPort);
765     if (port == std::nullopt) {
766         rtspControl_->Action(ActionType::TEARDOWN);
767         return false;
768     }
769 
770     if (property_.endType == EndType::CAST_SOURCE) {
771         rtspControl_->SetupPort(*port, remoteControlPort, INVALID_PORT);
772     }
773 
774     return true;
775 }
776 
ProcessSetUpSuccess(const Message & msg)777 bool CastSessionImpl::ProcessSetUpSuccess(const Message &msg)
778 {
779     int moduleId = msg.arg1_;
780     CLOGD("Module Id:%{public}d, media state:%{public}hhu, remote control state:%{public}hhu, session state:"
781         "%{public}s",
782         moduleId, mediaState_, remoteCtlState_, SESSION_STATE_STRING[static_cast<int>(sessionState_)].c_str());
783 
784     if (moduleId == MODULE_ID_MEDIA && mediaState_ == ModuleState::STARTING) {
785         mediaState_ = ModuleState::START_SUCCESS;
786     }
787 
788     if (moduleId == MODULE_ID_RC && remoteCtlState_ == ModuleState::STARTING) {
789         remoteCtlState_ = ModuleState::START_SUCCESS;
790     }
791 
792     return (mediaState_ == ModuleState::START_SUCCESS) &&
793         (remoteCtlState_ == ModuleState::IDLE || remoteCtlState_ == ModuleState::START_SUCCESS);
794 }
795 
ProcessPause(const Message & msg)796 bool CastSessionImpl::ProcessPause(const Message &msg)
797 {
798     CLOGD("In");
799     rtspControl_->Action(ActionType::PAUSE);
800     return true;
801 }
802 
ProcessPauseReq(const Message & msg)803 bool CastSessionImpl::ProcessPauseReq(const Message &msg)
804 {
805     CLOGD("In");
806     return true;
807 }
808 
MirrorRcvVideoFrame()809 void CastSessionImpl::MirrorRcvVideoFrame()
810 {
811 }
812 
ProcessPlay(const Message & msg)813 bool CastSessionImpl::ProcessPlay(const Message &msg)
814 {
815     CLOGD("In");
816     return (rtspControl_->Action(ActionType::PLAY));
817 }
818 
ProcessPlayReq(const Message & msg)819 bool CastSessionImpl::ProcessPlayReq(const Message &msg)
820 {
821     CLOGD("ProcessPlayReq vtp port:%d", msg.arg1_);
822     if (property_.endType == EndType::CAST_SINK) {
823         return true;
824     } else {
825         return true;
826     }
827 }
828 
ProcessDisconnect(const Message & msg)829 bool CastSessionImpl::ProcessDisconnect(const Message &msg)
830 {
831     auto sceneType = GetBIZSceneType(static_cast<int>(property_.protocolType));
832     HiSysEventWriteWrap(__func__, { {"BIZ_SCENE", sceneType},
833         {"BIZ_STATE", static_cast<int32_t>(BIZStateType::BIZ_STATE_END)},
834         {"BIZ_STAGE", static_cast<int32_t>(BIZSceneStage::DISCONNECT_END)},
835         {"STAGE_RES", static_cast<int32_t>(StageResType::STAGE_RES_SUCCESS)},
836         {"ERROR_CODE", CAST_RADAR_SUCCESS}}, {
837         {"TO_CALL_PKG", DSOFTBUS_NAME}, {"LOCAL_SESS_NAME", ""}, {"PEER_SESS_NAME", ""},
838         {"PEER_UDID", ""}});
839 
840     CLOGD("In");
841     rtspControl_->Action(ActionType::TEARDOWN);
842     channelManager_->DestroyAllChannels();
843     return true;
844 }
845 
ProcessError(const Message & msg)846 bool CastSessionImpl::ProcessError(const Message &msg)
847 {
848     CLOGD("In");
849     bool result = ProcessDisconnect(msg);
850     std::lock_guard<std::mutex> lock(mutex_);
851     auto &devices = remoteDeviceList_;
852     for (auto it = devices.begin(); it != devices.end();) {
853         ChangeDeviceStateLocked(DeviceState::DISCONNECTED, it->remoteDevice.deviceId);
854         ConnectionManager::GetInstance().DisconnectDevice(it->remoteDevice.deviceId);
855         devices.erase(it++);
856     }
857 
858     return result;
859 }
860 
ProcessUpdateVideoSize(const Message & msg)861 bool CastSessionImpl::ProcessUpdateVideoSize(const Message &msg)
862 {
863     return true;
864 }
865 
UpdateScreenInfo(uint64_t screenId,uint16_t width,uint16_t height)866 void CastSessionImpl::UpdateScreenInfo(uint64_t screenId, uint16_t width, uint16_t height)
867 {
868 }
869 
UpdateDefaultDisplayRotationInfo(int rotation,uint16_t width,uint16_t height)870 void CastSessionImpl::UpdateDefaultDisplayRotationInfo(int rotation, uint16_t width, uint16_t height)
871 {
872 }
873 
ProcessStateEvent(MessageId msgId,const Message & msg)874 bool CastSessionImpl::ProcessStateEvent(MessageId msgId, const Message &msg)
875 {
876     if (stateProcessor_[msgId] == nullptr) {
877         CLOGE("%{public}s' processor is null", MESSAGE_ID_STRING[msgId].c_str());
878         return false;
879     }
880 
881     return (this->*stateProcessor_[msgId])(msg);
882 }
883 
CheckJsonMemberType(Json::Value rootValue)884 bool CheckJsonMemberType(Json::Value rootValue)
885 {
886     if (!rootValue.isMember(KEY_BUNDLE_NAME) || !rootValue[KEY_BUNDLE_NAME].isString()) {
887         CLOGE("parse bundle name failed");
888         return false;
889     }
890     if (!rootValue.isMember(KEY_PID) || !rootValue[KEY_PID].isInt()) {
891         CLOGE("parse pid failed");
892         return false;
893     }
894     if (!rootValue.isMember(KEY_APP_MIN_COMPATIBLE_VERSION) ||
895         !rootValue[KEY_APP_MIN_COMPATIBLE_VERSION].isInt()) {
896         CLOGE("parse app min compatible version failed");
897         return false;
898     }
899     if (!rootValue.isMember(KEY_APP_TARGET_VERSION) || !rootValue[KEY_APP_TARGET_VERSION].isInt()) {
900         CLOGE("parse app target version failed");
901         return false;
902     }
903     return true;
904 }
905 
ProcessSetCastMode(const Message & msg)906 bool CastSessionImpl::ProcessSetCastMode(const Message &msg)
907 {
908     CastMode mode = static_cast<CastMode>(msg.arg1_);
909     switch (mode) {
910         default:
911             break;
912     }
913 
914     return true;
915 }
916 
BuildChannelRequest(const std::string & remoteDeviceId,bool isSupportVtp,ModuleType moduleType)917 std::shared_ptr<ChannelRequest> CastSessionImpl::BuildChannelRequest(const std::string &remoteDeviceId,
918     bool isSupportVtp, ModuleType moduleType)
919 {
920     auto deviceInfo = FindRemoteDevice(remoteDeviceId);
921     if (deviceInfo == nullptr) {
922         CLOGE("Remote device is null");
923         return nullptr;
924     }
925     const auto &remote = deviceInfo->remoteDevice;
926     bool isReceiver = !(property_.endType == EndType::CAST_SOURCE &&
927         (moduleType == ModuleType::VIDEO || moduleType == ModuleType::AUDIO));
928 
929     return std::make_shared<ChannelRequest>(moduleType, isReceiver, localDevice_, remote, property_);
930 }
931 
FindRemoteDevice(const std::string & deviceId)932 std::shared_ptr<CastRemoteDeviceInfo> CastSessionImpl::FindRemoteDevice(const std::string &deviceId)
933 {
934     std::lock_guard<std::mutex> lock(mutex_);
935     return FindRemoteDeviceLocked(deviceId);
936 }
937 
FindRemoteDeviceLocked(const std::string & deviceId)938 std::shared_ptr<CastRemoteDeviceInfo> CastSessionImpl::FindRemoteDeviceLocked(const std::string &deviceId)
939 {
940     for (auto &deviceInfo : remoteDeviceList_) {
941         if (deviceInfo.remoteDevice.deviceId == deviceId) {
942             return std::make_shared<CastRemoteDeviceInfo>(deviceInfo);
943         }
944     }
945     return nullptr;
946 }
947 
UpdateRemoteDeviceStateLocked(const std::string & deviceId,DeviceState state)948 void CastSessionImpl::UpdateRemoteDeviceStateLocked(const std::string &deviceId, DeviceState state)
949 {
950     for (auto &deviceInfo : remoteDeviceList_) {
951         if (deviceInfo.remoteDevice.deviceId == deviceId) {
952             deviceInfo.deviceState = state;
953             return;
954         }
955     }
956 }
957 
UpdateRemoteDeviceSessionId(const std::string & deviceId,int sessionId)958 void CastSessionImpl::UpdateRemoteDeviceSessionId(const std::string &deviceId, int sessionId)
959 {
960     std::lock_guard<std::mutex> lock(mutex_);
961     for (auto &deviceInfo : remoteDeviceList_) {
962         if (deviceInfo.remoteDevice.deviceId == deviceId) {
963             deviceInfo.remoteDevice.sessionId = sessionId;
964             return;
965         }
966     }
967 }
968 
UpdateRemoteDeviceInfoFromCastDeviceDataManager(const std::string & deviceId)969 void CastSessionImpl::UpdateRemoteDeviceInfoFromCastDeviceDataManager(const std::string &deviceId)
970 {
971     std::lock_guard<std::mutex> lock(mutex_);
972     auto remote = CastDeviceDataManager::GetInstance().GetDeviceByDeviceId(deviceId);
973     if (remote == std::nullopt) {
974         CLOGE("Get remote device is empty");
975         return;
976     }
977     for (auto &deviceInfo : remoteDeviceList_) {
978         if (deviceInfo.remoteDevice.deviceId == deviceId) {
979             deviceInfo.remoteDevice.channelType = remote->channelType;
980             deviceInfo.remoteDevice.localIp = remote->localIp;
981             deviceInfo.remoteDevice.remoteIp = remote->remoteIp;
982             if (property_.protocolType != ProtocolType::HICAR) {
983                 deviceInfo.remoteDevice.ipAddress = remote->remoteIp;
984             }
985             if (memcpy_s(deviceInfo.remoteDevice.sessionKey, remote->sessionKeyLength, remote->sessionKey,
986                 remote->sessionKeyLength) != 0) {
987                 CLOGE("SessionKey Copy Error!");
988             }
989             deviceInfo.remoteDevice.sessionKeyLength = remote->sessionKeyLength;
990             return;
991         }
992     }
993 }
994 
RemoveRemoteDevice(const std::string & deviceId)995 void CastSessionImpl::RemoveRemoteDevice(const std::string &deviceId)
996 {
997     std::lock_guard<std::mutex> lock(mutex_);
998     for (auto it = remoteDeviceList_.begin(); it != remoteDeviceList_.end(); it++) {
999         if (it->remoteDevice.deviceId == deviceId) {
1000             CLOGI("Start to remove remote device:%s", deviceId.c_str());
1001             ConnectionManager::GetInstance().DisconnectDevice(deviceId);
1002             remoteDeviceList_.erase(it);
1003             return;
1004         }
1005     }
1006 }
1007 
AddRemoteDevice(const CastRemoteDeviceInfo & remoteDeviceInfo)1008 bool CastSessionImpl::AddRemoteDevice(const CastRemoteDeviceInfo &remoteDeviceInfo)
1009 {
1010     const auto &remote = remoteDeviceInfo.remoteDevice;
1011     if (FindRemoteDevice(remote.deviceId) != nullptr) {
1012         CLOGW("Remote device(%s) has existed", remote.deviceName.c_str());
1013         return false;
1014     }
1015     std::lock_guard<std::mutex> lock(mutex_);
1016     remoteDeviceList_.push_back(remoteDeviceInfo);
1017     return true;
1018 }
1019 
1020 // Reserved for 1->N scenarios
IsAllowTransferState(SessionState desiredState) const1021 bool CastSessionImpl::IsAllowTransferState(SessionState desiredState) const
1022 {
1023     return true;
1024 }
1025 
ChangeDeviceState(DeviceState state,const std::string & deviceId,const EventCode eventCode)1026 void CastSessionImpl::ChangeDeviceState(DeviceState state, const std::string &deviceId, const EventCode eventCode)
1027 {
1028     std::lock_guard<std::mutex> lock(mutex_);
1029     ChangeDeviceStateLocked(state, deviceId, eventCode);
1030 }
1031 
ChangeDeviceStateLocked(DeviceState state,const std::string & deviceId,const EventCode eventCode)1032 void CastSessionImpl::ChangeDeviceStateLocked(DeviceState state, const std::string &deviceId, const EventCode eventCode)
1033 {
1034     auto deviceInfo = FindRemoteDeviceLocked(deviceId);
1035     if (!deviceInfo) {
1036         CLOGE("does not exist this device, deviceId = %s.", deviceId.c_str());
1037         return;
1038     }
1039 
1040     CLOGD("New state:%{public}s, old state:%{public}s, device id:%s, eventCode:%{public}d",
1041         DEVICE_STATE_STRING[static_cast<int>(state)].c_str(),
1042         DEVICE_STATE_STRING[static_cast<int>(deviceInfo->deviceState)].c_str(),
1043         deviceId.c_str(),
1044         static_cast<int>(eventCode));
1045     if (state == deviceInfo->deviceState) {
1046         return;
1047     }
1048 
1049     UpdateRemoteDeviceStateLocked(deviceId, state);
1050 
1051     for (const auto &[pid, listener] : listeners_) {
1052         listener->OnDeviceState(DeviceStateInfo { state, deviceId, eventCode });
1053     }
1054 }
1055 
ReportDeviceStateInfo(DeviceState state,const std::string & deviceId,const EventCode eventCode)1056 void CastSessionImpl::ReportDeviceStateInfo(DeviceState state, const std::string &deviceId, const EventCode eventCode)
1057 {
1058     CLOGI("ReportDeviceStateInfo in.");
1059     auto deviceInfo = FindRemoteDeviceLocked(deviceId);
1060     if (!deviceInfo) {
1061         CLOGE("does not exist this device, deviceId = %s.", deviceId.c_str());
1062         return;
1063     }
1064     for (const auto &[pid, listener] : listeners_) {
1065         listener->OnDeviceState(DeviceStateInfo { state, deviceId, eventCode });
1066     }
1067 }
1068 
OnSessionEvent(const std::string & deviceId,const EventCode eventCode)1069 void CastSessionImpl::OnSessionEvent(const std::string &deviceId, const EventCode eventCode)
1070 {
1071     std::lock_guard<std::mutex> lock(mutex_);
1072     CLOGD("Session event: %{public}d", static_cast<int32_t>(eventCode));
1073     if (static_cast<int32_t>(eventCode) < 0 or eventCode == EventCode::EVT_CANCEL_BY_SOURCE) {
1074         ConnectionManager::GetInstance().UpdateDeviceState(deviceId, RemoteDeviceState::FOUND);
1075         SendCastMessage(Message(MessageId::MSG_DISCONNECT, deviceId, eventCode));
1076     } else {
1077         SendCastMessage(Message(MessageId::MSG_AUTH, deviceId, eventCode));
1078     }
1079 }
1080 
OnEvent(EventId eventId,const std::string & data)1081 void CastSessionImpl::OnEvent(EventId eventId, const std::string &data)
1082 {
1083     std::unique_lock<std::mutex> lock(mutex_);
1084     if (listeners_.empty()) {
1085         CLOGE("OnEvent failed because listeners_ is empty!");
1086         return;
1087     }
1088     for (const auto &[pid, listener] : listeners_) {
1089         listener->OnEvent(eventId, data);
1090     }
1091 }
1092 
ProcessTriggerReq(const Message & msg)1093 bool CastSessionImpl::ProcessTriggerReq(const Message &msg)
1094 {
1095     return false;
1096 }
1097 
ProcessRtspEvent(int moduleId,int event,const std::string & param)1098 void CastSessionImpl::ProcessRtspEvent(int moduleId, int event, const std::string &param)
1099 {
1100     switch (moduleId) {
1101         case MODULE_ID_CAST_STREAM:
1102             SendCastMessage(Message(MessageId::MSG_STREAM_RECV_ACTION_EVENT_FROM_PEERS, event, param));
1103             break;
1104         case MODULE_ID_CAST_SESSION:
1105             if (event == static_cast<int>(CastSessionRemoteEventId::READY_TO_PLAYING)) {
1106                 SendCastMessage(Message(MessageId::MSG_READY_TO_PLAYING));
1107             }
1108             break;
1109         default:
1110             break;
1111     }
1112 }
1113 
IsSupportFeature(const std::set<int> & featureSet,int supportFeature)1114 bool CastSessionImpl::IsSupportFeature(const std::set<int> &featureSet, int supportFeature)
1115 {
1116     return !featureSet.empty() && featureSet.find(supportFeature) != featureSet.end();
1117 }
1118 
IsConnected() const1119 bool CastSessionImpl::IsConnected() const
1120 {
1121     return sessionState_ == SessionState::PLAYING || sessionState_ == SessionState::PAUSED ||
1122         sessionState_ == SessionState::CONNECTED || sessionState_ == SessionState::STREAM;
1123 }
1124 
SendEventChange(int moduleId,int event,const std::string & param)1125 bool CastSessionImpl::SendEventChange(int moduleId, int event, const std::string &param)
1126 {
1127     CLOGI("Module id %{public}d send event %{public}d", moduleId, event);
1128     if (!IsConnected() || !rtspControl_) {
1129         CLOGE("Send event change fail, state is not ready %{public}hhu", sessionState_);
1130         return false;
1131     }
1132 
1133     if (!IsSupportFeature(rtspControl_->GetNegotiatedFeatureSet(), ParamInfo::FEATURE_SEND_EVENT_CHANGE)) {
1134         CLOGE("The feature is not in the feature set.");
1135         return false;
1136     }
1137 
1138     return rtspControl_->SendEventChange(moduleId, event, param);
1139 }
1140 
StreamManagerGetter()1141 std::shared_ptr<ICastStreamManager> CastSessionImpl::StreamManagerGetter()
1142 {
1143     std::lock_guard<std::mutex> lock(streamMutex_);
1144     return streamManager_;
1145 }
1146 
MirrorPlayerGetter()1147 sptr<IMirrorPlayerImpl> CastSessionImpl::MirrorPlayerGetter()
1148 {
1149     std::lock_guard<std::mutex> lock(mirrorMutex_);
1150     return mirrorPlayer_;
1151 }
1152 
IsStreamMode()1153 bool CastSessionImpl::IsStreamMode()
1154 {
1155     std::lock_guard<std::mutex> lock(streamMutex_);
1156     return rtspParamInfo_.GetProjectionMode() == CastSessionRtsp::ProjectionMode::STREAM;
1157 }
1158 
GetPlayerControllerCapability()1159 std::string CastSessionImpl::GetPlayerControllerCapability()
1160 {
1161     std::lock_guard<std::mutex> lock(streamMutex_);
1162     return rtspParamInfo_.GetPlayerControllerCapability();
1163 }
1164 
IsSink()1165 bool CastSessionImpl::IsSink()
1166 {
1167     std::lock_guard<std::mutex> lock(mutex_);
1168     return property_.endType == EndType::CAST_SINK;
1169 }
1170 
CreateStreamChannel()1171 int CastSessionImpl::CreateStreamChannel()
1172 {
1173     CLOGD("in");
1174     auto request = BuildChannelRequest(GetCurrentRemoteDeviceId(), false, ModuleType::STREAM);
1175     if (request == nullptr) {
1176         CLOGE("build channel request failed");
1177         return INVALID_PORT;
1178     }
1179 
1180     const auto streamManager =  StreamManagerGetter();
1181     if (channelManager_ == nullptr || streamManager == nullptr) {
1182         CLOGE("channelManager_ or streamManager is null");
1183         return INVALID_PORT;
1184     }
1185     int port = channelManager_->CreateChannel(*request, streamManager->GetChannelListener());
1186     if (port == INVALID_PORT) {
1187         CLOGE("create stream channel failed");
1188         return INVALID_PORT;
1189     }
1190     if (property_.endType == EndType::CAST_SOURCE) {
1191         SendEventChange(MODULE_ID_CAST_STREAM, ICastStreamManager::MODULE_EVENT_ID_STREAM_CHANNEL,
1192             std::to_string(port));
1193     }
1194     return port;
1195 }
1196 
SendCastRenderReadyOption(int isReady)1197 void CastSessionImpl::SendCastRenderReadyOption(int isReady)
1198 {
1199     std::shared_ptr<IRtspController> rtspControl;
1200     {
1201         std::lock_guard<std::mutex> lock(mutex_);
1202         rtspControl = rtspControl_;
1203         if (!IsConnected() || !rtspControl || property_.endType != EndType::CAST_SINK) {
1204             CLOGE("Send render ready failed");
1205             return;
1206         }
1207     }
1208     rtspControl->SendCastRenderReadyOption(isReady);
1209 }
1210 
NotifyEvent(EventId eventId,std::string & jsonParam)1211 int32_t CastSessionImpl::NotifyEvent(EventId eventId, std::string &jsonParam)
1212 {
1213     if (!Permission::CheckPidPermission()) {
1214         return CAST_ENGINE_ERROR;
1215     }
1216     switch (eventId) {
1217         default:
1218             break;
1219     }
1220     return CAST_ENGINE_SUCCESS;
1221 }
1222 
SetCastMode(CastMode mode,std::string & jsonParam)1223 int32_t CastSessionImpl::SetCastMode(CastMode mode, std::string &jsonParam)
1224 {
1225     CLOGD("in, mode = %d, param = %s", static_cast<int>(mode), jsonParam.c_str());
1226     if (!Permission::CheckPidPermission()) {
1227         return ERR_NO_PERMISSION;
1228     }
1229     if (!SendCastMessage(Message(MessageId::MSG_SET_CAST_MODE, static_cast<int>(mode), jsonParam))) {
1230         return CAST_ENGINE_ERROR;
1231     }
1232     return CAST_ENGINE_SUCCESS;
1233 }
1234 
OnEventInner(sptr<CastSessionImpl> session,EventId eventId,const std::string & jsonParam)1235 void CastSessionImpl::OnEventInner(sptr<CastSessionImpl> session, EventId eventId, const std::string &jsonParam)
1236 {
1237     std::unique_lock<std::mutex> lock(mutex_);
1238     for (const auto &[pid, listener] : session->listeners_) {
1239         listener->OnEvent(eventId, jsonParam);
1240     }
1241 }
1242 
OnRemoteCtrlEvent(int eventType,const uint8_t * data,uint32_t len)1243 void CastSessionImpl::OnRemoteCtrlEvent(int eventType, const uint8_t *data, uint32_t len)
1244 {
1245     std::unique_lock<std::mutex> lock(mutex_);
1246     for (const auto &[pid, listener] : listeners_) {
1247         listener->OnRemoteCtrlEvent(eventType, data, len);
1248     }
1249 }
1250 } // namespace CastEngineService
1251 } // namespace CastEngine
1252 } // namespace OHOS
1253