• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "audio_device_manager.h"
17 #include "avsession_service.h"
18 #include "migrate_avsession_manager.h"
19 
20 namespace OHOS::AVSession {
SuperLauncher(std::string deviceId,std::string serviceName,std::string extraInfo,const std::string & state)21 void AVSessionService::SuperLauncher(std::string deviceId, std::string serviceName,
22     std::string extraInfo, const std::string& state)
23 {
24     SLOGI("SuperLauncher serviceName: %{public}s, state: %{public}s", serviceName.c_str(), state.c_str());
25 
26     if (serviceName == "SuperLauncher-Dual") {
27         if (state == "IDLE") {
28             ReleaseSuperLauncher(serviceName);
29         } else if (state == "CONNECTING") {
30             ConnectSuperLauncher(deviceId, serviceName);
31         } else if (state == "CONNECT_SUCC") {
32             SucceedSuperLauncher(deviceId, extraInfo);
33         }
34     }
35 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
36     if ((serviceName == "HuaweiCast" || serviceName == "HuaweiCast-Dual") &&
37         (state == "IDLE" || state == "CONNECT_SUCC")) {
38         castServiceNameStatePair_ = std::make_pair(serviceName, state);
39         isSupportMirrorToStream_ = false;
40         castDeviceId_ = "0";
41         castDeviceName_ = " ";
42         castDeviceType_ = 0;
43         std::string info;
44         std::string::size_type beginPos = 0;
45         std::string::size_type endPos = extraInfo.find(seperator);
46         while (endPos != std::string::npos) {
47             info = extraInfo.substr(beginPos, endPos - beginPos);
48             beginPos = endPos + seperator.size();
49             endPos = extraInfo.find(seperator, beginPos);
50             SplitExtraInfo(info);
51         }
52         if (beginPos != extraInfo.length()) {
53             info = extraInfo.substr(beginPos);
54             SplitExtraInfo(info);
55         }
56         NotifyMirrorToStreamCast();
57         int32_t sessionSize = static_cast<int32_t>(GetUsersManager().GetContainerFromAll().GetAllSessions().size());
58         if ((sessionSize == 0 || (sessionSize == 1 && CheckAncoAudio())) && !is2in1_ && state == "IDLE") {
59             SLOGI("call disable cast for cast idle");
60             checkEnableCast(false);
61         }
62     }
63 #endif
64 }
65 
ReleaseSuperLauncher(std::string serviceName)66 void AVSessionService::ReleaseSuperLauncher(std::string serviceName)
67 {
68     AudioDeviceManager::GetInstance().UnInitAudioStateCallback();
69     MigrateAVSessionManager::GetInstance().ReleaseLocalSessionStub(serviceName);
70     if (migrateAVSession_ != nullptr) {
71         RemoveInnerSessionListener(migrateAVSession_.get());
72         RemoveHistoricalRecordListener(migrateAVSession_.get());
73     }
74 }
75 
ConnectSuperLauncher(std::string deviceId,std::string serviceName)76 void AVSessionService::ConnectSuperLauncher(std::string deviceId, std::string serviceName)
77 {
78     if (migrateAVSession_ == nullptr) {
79         migrateAVSession_ = std::make_shared<MigrateAVSessionServer>();
80     }
81     migrateAVSession_->Init(this);
82     MigrateAVSessionManager::GetInstance().CreateLocalSessionStub(serviceName, migrateAVSession_);
83     AddInnerSessionListener(migrateAVSession_.get());
84     AddHistoricalRecordListener(migrateAVSession_.get());
85     AudioDeviceManager::GetInstance().InitAudioStateCallback(migrateAVSession_, deviceId);
86 }
87 
SucceedSuperLauncher(std::string deviceId,std::string extraInfo)88 void AVSessionService::SucceedSuperLauncher(std::string deviceId, std::string extraInfo)
89 {
90     if (migrateAVSession_ == nullptr) {
91         migrateAVSession_ = std::make_shared<MigrateAVSessionServer>();
92     }
93     migrateAVSession_->ResetSupportCrossMediaPlay(extraInfo);
94     migrateAVSession_->SendRemoteHistorySessionList(deviceId);
95 }
96 
NotifyMigrateStop(const std::string & deviceId)97 void AVSessionService::NotifyMigrateStop(const std::string &deviceId)
98 {
99     if (migrateAVSession_ == nullptr) {
100         SLOGI("NotifyMigrateStop without migrate, create new");
101         migrateAVSession_ = std::make_shared<MigrateAVSessionServer>();
102     }
103     std::lock_guard lockGuard(sessionServiceLock_);
104     migrateAVSession_->StopObserveControllerChanged(deviceId);
105 }
106 
107 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
SplitExtraInfo(std::string info)108 void AVSessionService::SplitExtraInfo(std::string info)
109 {
110     if (info.find("SUPPORT_MIRROR_TO_STREAM") != std::string::npos && info.find("true") != std::string::npos) {
111         isSupportMirrorToStream_ = true;
112     }
113     if (info.find("deviceId") != std::string::npos && info.find(":") != std::string::npos) {
114         std::string::size_type idBeginPos = info.find(":");
115         castDeviceId_ = info.substr(idBeginPos + beginAddPos,
116             info.length() -idBeginPos - endDecPos); // "deviceId" : "xxxx"
117     }
118     if (info.find("deviceName") != std::string::npos && info.find(":") != std::string::npos) {
119         std::string::size_type nameBeginPos = info.find(":");
120         castDeviceName_ = info.substr(nameBeginPos + beginAddPos,
121             info.length() - nameBeginPos - endDecPos); // "deviceName" : "xxxx"
122     }
123     if (info.find("deviceType") != std::string::npos && info.find(":") != std::string::npos) {
124         std::string::size_type typeBeginPos = info.find(":");
125         std::string tmpType = info.substr(typeBeginPos + typeAddPos, info.length()); // "deviceType" : xxx
126         castDeviceType_ = atoi(tmpType.c_str());
127     }
128 }
129 #endif
130 
AddInnerSessionListener(SessionListener * listener)131 void AVSessionService::AddInnerSessionListener(SessionListener *listener)
132 {
133     std::lock_guard lockGuard(sessionListenersLock_);
134     innerSessionListeners_.push_back(listener);
135 }
136 
RemoveInnerSessionListener(SessionListener * listener)137 void AVSessionService::RemoveInnerSessionListener(SessionListener *listener)
138 {
139     std::lock_guard lockGuard(sessionListenersLock_);
140     for (auto it = innerSessionListeners_.begin(); it != innerSessionListeners_.end();) {
141         if (*it == listener) {
142             SLOGI("RemoveInnerSessionListener");
143             it = innerSessionListeners_.erase(it);
144         } else {
145             it++;
146         }
147     }
148 }
149 
AddHistoricalRecordListener(HistoricalRecordListener * listener)150 void AVSessionService::AddHistoricalRecordListener(HistoricalRecordListener *listener)
151 {
152     std::lock_guard lockGuard(historicalRecordListenersLock_);
153     historicalRecordListeners_.push_back(listener);
154 }
155 
RemoveHistoricalRecordListener(HistoricalRecordListener * listener)156 void AVSessionService::RemoveHistoricalRecordListener(HistoricalRecordListener *listener)
157 {
158     std::lock_guard lockGuard(historicalRecordListenersLock_);
159     for (auto it = historicalRecordListeners_.begin(); it != historicalRecordListeners_.end();) {
160         if (*it == listener) {
161             SLOGI("RemoveHistoricalRecordListener");
162             it = historicalRecordListeners_.erase(it);
163         } else {
164             it++;
165         }
166     }
167 }
168 
NotifyHistoricalRecordChange(const std::string & bundleName,int32_t userId)169 void AVSessionService::NotifyHistoricalRecordChange(const std::string& bundleName, int32_t userId)
170 {
171     std::lock_guard lockGuard(historicalRecordListenersLock_);
172     for (const auto& listener : historicalRecordListeners_) {
173         if (listener != nullptr) {
174             listener->OnHistoricalRecordChange();
175         }
176     }
177 }
178 
179 // LCOV_EXCL_START
HandleAppStateChange(int uid,int state)180 void AVSessionService::HandleAppStateChange(int uid, int state)
181 {
182 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
183     SLOGD("uid = %{public}d, state = %{public}d", uid, state);
184     if (topSession_ != nullptr && topSession_->GetUid() == uid) {
185         if (state == appState) {
186             return;
187         }
188         if (state == static_cast<int>(AppExecFwk::ApplicationState::APP_STATE_FOREGROUND)) {
189             SLOGI("enter notifyMirrorToStreamCast by background to foreground state change, and counts = 2");
190             MirrorToStreamCast(topSession_);
191         }
192         appState = state;
193     }
194 #endif //CASTPLUS_CAST_ENGINE_ENABLE
195 }
196 // LCOV_EXCL_STOP
197 
198 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
GetAVCastControllerInner(const std::string & sessionId,sptr<IRemoteObject> & object)199 int32_t AVSessionService::GetAVCastControllerInner(const std::string& sessionId, sptr<IRemoteObject>& object)
200 {
201     SLOGI("Start get cast controller with pid %{public}d", static_cast<int>(GetCallingPid()));
202     auto session = GetContainer().GetSessionById(sessionId);
203     CHECK_AND_RETURN_RET_LOG(session != nullptr, AVSESSION_ERROR, "StopCast: session is not exist");
204     auto result = session->GetAVCastControllerInner();
205     CHECK_AND_RETURN_RET_LOG(result != nullptr, AVSESSION_ERROR, "GetAVCastControllerInner failed");
206     object = result;
207     return AVSESSION_SUCCESS;
208 }
209 
checkEnableCast(bool enable)210 int32_t AVSessionService::checkEnableCast(bool enable)
211 {
212     std::lock_guard lockGuard(checkEnableCastLock_);
213     SLOGI("checkEnableCast enable:%{public}d, isInCast:%{public}d", enable, isInCast_);
214     if (enable == true && isInCast_ == false) {
215         isInCast_ = AVRouter::GetInstance().Init(this) == AVSESSION_SUCCESS ? true : false;
216     } else if (enable == false && isInCast_ == true) {
217         CHECK_AND_RETURN_RET_LOG(!((GetContainer().GetAllSessions().size() > 1 ||
218             (GetContainer().GetAllSessions().size() == 1 && !CheckAncoAudio())) && !is2in1_),
219             AVSESSION_SUCCESS, "can not release cast with session alive");
220         CHECK_AND_RETURN_RET_LOG(castServiceNameStatePair_.second != deviceStateConnection,
221             AVSESSION_SUCCESS, "can not release cast with casting");
222         isInCast_ = AVRouter::GetInstance().Release();
223     } else {
224         SLOGD("AVRouter Init in nothing change");
225     }
226     return AVSESSION_SUCCESS;
227 }
228 
setInCast(bool isInCast)229 void AVSessionService::setInCast(bool isInCast)
230 {
231     SLOGI("setInCast, isInCast:%{public}d", isInCast);
232     isInCast_ = isInCast;
233 }
234 
235 // LCOV_EXCL_START
ReleaseCastSession()236 void AVSessionService::ReleaseCastSession()
237 {
238     std::lock_guard lockGuard(sessionServiceLock_);
239     SLOGI("Start release cast session");
240     for (const auto& session : GetContainer().GetAllSessions()) {
241         if (session != nullptr && session->GetDescriptor().sessionTag_ == "RemoteCast") {
242             std::string sessionId = session->GetDescriptor().sessionId_;
243             SLOGI("Already has a cast session %{public}s", AVSessionUtils::GetAnonySessionId(sessionId).c_str());
244             session->UnRegisterDeviceStateCallback();
245             session->StopCastSession();
246             session->ReleaseAVCastControllerInner();
247             HandleSessionRelease(sessionId);
248         }
249     }
250 }
251 // LCOV_EXCL_STOP
252 
253 // LCOV_EXCL_START
CreateSessionByCast(const int64_t castHandle)254 void AVSessionService::CreateSessionByCast(const int64_t castHandle)
255 {
256     SLOGI("AVSessionService CreateSessionByCast in");
257     AVSessionRadarInfo info("AVSessionService::CreateSessionByCast");
258     AVSessionRadar::GetInstance().StartConnect(info);
259     AppExecFwk::ElementName elementName;
260     elementName.SetBundleName("castBundleName");
261     elementName.SetAbilityName("castAbilityName");
262     sptr<AVSessionItem> sinkSession;
263     auto res = CreateSessionInner("RemoteCast", AVSession::SESSION_TYPE_AUDIO, false, elementName, sinkSession);
264     CHECK_AND_RETURN_LOG(res == AVSESSION_SUCCESS, "CreateSession at sink failed");
265     SLOGI("Create Cast sink sessionId %{public}s",
266         AVSessionUtils::GetAnonySessionId(sinkSession->GetSessionId()).c_str());
267     sinkSession->SetCastHandle(castHandle);
268     sinkSession->RegisterDeviceStateCallback();
269 
270     {
271         std::lock_guard frontLockGuard(sessionFrontLock_);
272         std::shared_ptr<std::list<sptr<AVSessionItem>>> sessionListForFront =
273             GetUsersManager().GetCurSessionListForFront(0);
274         CHECK_AND_RETURN_LOG(sessionListForFront != nullptr, "sessionListForFront ptr nullptr!");
275         auto it = std::find(sessionListForFront->begin(), sessionListForFront->end(), sinkSession);
276         if (it == sessionListForFront->end()) {
277             SLOGI(" front session add cast session");
278             sessionListForFront->push_front(sinkSession);
279         }
280     }
281 
282     HISYSEVENT_BEHAVIOR("SESSION_CAST",
283         "BUNDLE_NAME", "castBundleName",
284         "ABILITY_NAME", "castAbilityName",
285         "SESSION_PID", sinkSession->GetDescriptor().pid_,
286         "SESSION_UID", sinkSession->GetDescriptor().uid_,
287         "SESSION_ID", sinkSession->GetDescriptor().sessionId_,
288         "SESSION_TAG", sinkSession->GetDescriptor().sessionTag_,
289         "SESSION_TYPE", sinkSession->GetDescriptor().sessionType_,
290         "DETAILED_MSG", "session create from cast+ callback");
291 }
292 // LCOV_EXCL_STOP
293 
294 // LCOV_EXCL_START
NotifyDeviceAvailable(const OutputDeviceInfo & castOutputDeviceInfo)295 void AVSessionService::NotifyDeviceAvailable(const OutputDeviceInfo& castOutputDeviceInfo)
296 {
297     AVSessionRadarInfo info("AVSessionService::NotifyDeviceAvailable");
298     AVSessionRadar::GetInstance().CastDeviceAvailable(castOutputDeviceInfo, info);
299 
300     for (DeviceInfo deviceInfo : castOutputDeviceInfo.deviceInfos_) {
301         for (const auto& session : GetContainer().GetAllSessions()) {
302             session->UpdateCastDeviceMap(deviceInfo);
303         }
304     }
305     std::lock_guard lockGuard(sessionListenersLock_);
306     for (const auto& listener : innerSessionListeners_) {
307         listener->OnDeviceAvailable(castOutputDeviceInfo);
308     }
309     std::map<pid_t, sptr<ISessionListener>> listenerMap = GetUsersManager().GetSessionListener();
310     for (const auto& [pid, listener] : listenerMap) {
311         AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceAvailable");
312         listener->OnDeviceAvailable(castOutputDeviceInfo);
313     }
314     std::map<pid_t, sptr<ISessionListener>> listenerMapForAll = GetUsersManager().GetSessionListenerForAllUsers();
315     for (const auto& [pid, listener] : listenerMapForAll) {
316         AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceAvailable");
317         listener->OnDeviceAvailable(castOutputDeviceInfo);
318     }
319 }
320 // LCOV_EXCL_STOP
321 
NotifyDeviceLogEvent(const DeviceLogEventCode eventId,const int64_t param)322 void AVSessionService::NotifyDeviceLogEvent(const DeviceLogEventCode eventId, const int64_t param)
323 {
324     std::lock_guard lockGuard(sessionListenersLock_);
325     std::map<pid_t, sptr<ISessionListener>> listenerMap = GetUsersManager().GetSessionListener();
326     for (const auto& [pid, listener] : listenerMap) {
327         AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceLogEvent");
328         listener->OnDeviceLogEvent(eventId, param);
329     }
330     std::map<pid_t, sptr<ISessionListener>> listenerMapForAll = GetUsersManager().GetSessionListenerForAllUsers();
331     for (const auto& [pid, listener] : listenerMapForAll) {
332         AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceLogEvent");
333         listener->OnDeviceLogEvent(eventId, param);
334     }
335 }
336 
337 // LCOV_EXCL_START
NotifyDeviceOffline(const std::string & deviceId)338 void AVSessionService::NotifyDeviceOffline(const std::string& deviceId)
339 {
340     std::lock_guard lockGuard(sessionListenersLock_);
341     for (const auto& listener : innerSessionListeners_) {
342         listener->OnDeviceOffline(deviceId);
343     }
344     std::map<pid_t, sptr<ISessionListener>> listenerMap = GetUsersManager().GetSessionListener();
345     for (const auto& [pid, listener] : listenerMap) {
346         SLOGI("notify device offline with pid %{public}d", static_cast<int>(pid));
347         AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceOffline");
348         listener->OnDeviceOffline(deviceId);
349     }
350     std::map<pid_t, sptr<ISessionListener>> listenerMapForAll = GetUsersManager().GetSessionListenerForAllUsers();
351     for (const auto& [pid, listener] : listenerMapForAll) {
352         SLOGI("notify device offline with pid %{public}d across users", static_cast<int>(pid));
353         AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceOffline");
354         listener->OnDeviceOffline(deviceId);
355     }
356 }
357 // LCOV_EXCL_STOP
358 
NotifyDeviceStateChange(const DeviceState & deviceState)359 void AVSessionService::NotifyDeviceStateChange(const DeviceState& deviceState)
360 {
361     std::lock_guard lockGuard(sessionListenersLock_);
362     std::map<pid_t, sptr<ISessionListener>> listenerMap = GetUsersManager().GetSessionListener();
363     for (const auto& [pid, listener] : listenerMap) {
364         SLOGI("notify device state change with pid %{public}d", static_cast<int>(pid));
365         AVSESSION_TRACE_SYNC_START("AVSessionService::OnDeviceStateChange");
366         if (listener != nullptr) {
367             listener->OnDeviceStateChange(deviceState);
368         }
369     }
370 }
371 
StartCast(const SessionToken & sessionToken,const OutputDeviceInfo & outputDeviceInfo)372 int32_t AVSessionService::StartCast(const SessionToken& sessionToken, const OutputDeviceInfo& outputDeviceInfo)
373 {
374     SLOGI("SessionId is %{public}s", AVSessionUtils::GetAnonySessionId(sessionToken.sessionId).c_str());
375     sptr<AVSessionItem> session = GetContainer().GetSessionById(sessionToken.sessionId);
376     CHECK_AND_RETURN_RET_LOG(session != nullptr, ERR_SESSION_NOT_EXIST, "session %{public}s not exist",
377         AVSessionUtils::GetAnonySessionId(sessionToken.sessionId).c_str());
378     ReportStartCastBegin("AVSessionService::StartCast", outputDeviceInfo, session->GetDescriptor().uid_);
379     int32_t ret = session->StartCast(outputDeviceInfo);
380     ReportStartCastEnd("AVSessionService::StartCast", outputDeviceInfo, session->GetDescriptor().uid_, ret);
381     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "StartCast failed");
382     SLOGD("StartCast set isSourceInCast");
383 
384     SLOGI("no set continuous task in service");
385     HISYSEVENT_BEHAVIOR("SESSION_CAST",
386         "BUNDLE_NAME", session->GetDescriptor().elementName_.GetBundleName(),
387         "MODULE_NAME", session->GetDescriptor().elementName_.GetModuleName(),
388         "ABILITY_NAME", session->GetDescriptor().elementName_.GetAbilityName(),
389         "SESSION_PID", session->GetDescriptor().pid_, "SESSION_UID", session->GetDescriptor().uid_,
390         "SESSION_ID", session->GetDescriptor().sessionId_, "SESSION_TAG", session->GetDescriptor().sessionTag_,
391         "SESSION_TYPE", session->GetDescriptor().sessionType_, "DETAILED_MSG", "start cast session");
392     return AVSESSION_SUCCESS;
393 }
394 
StopCast(const SessionToken & sessionToken)395 int32_t AVSessionService::StopCast(const SessionToken& sessionToken)
396 {
397     sptr<AVSessionItem> session = GetUsersManager().GetContainerFromAll().GetSessionById(sessionToken.sessionId);
398     CHECK_AND_RETURN_RET_LOG(session != nullptr, AVSESSION_SUCCESS, "StopCast: session is not exist");
399     CHECK_AND_RETURN_RET_LOG(session->StopCast() == AVSESSION_SUCCESS, AVSESSION_ERROR, "StopCast failed");
400     if (session->GetDescriptor().sessionTag_ == "RemoteCast") {
401         SLOGI("Stop cast at sink, start destroy sink avsession task");
402         HandleSessionRelease(sessionToken.sessionId);
403         return AVSESSION_SUCCESS;
404     }
405 
406     SLOGI("no set continuous task in service");
407     return AVSESSION_SUCCESS;
408 }
409 
NotifyMirrorToStreamCast()410 void AVSessionService::NotifyMirrorToStreamCast()
411 {
412     for (auto& session : GetContainer().GetAllSessions()) {
413         if (session && topSession_ && (session.GetRefPtr() == topSession_.GetRefPtr())) {
414             MirrorToStreamCast(session);
415         }
416     }
417     if (castServiceNameStatePair_.second == deviceStateDisconnection) {
418         DeviceInfo localDeviceInfo;
419         AVRouter::GetInstance().SetServiceAllConnectState(-1, localDeviceInfo);
420     }
421 }
422 
IsMirrorToStreamCastAllowed(sptr<AVSessionItem> & session)423 bool AVSessionService::IsMirrorToStreamCastAllowed(sptr<AVSessionItem>& session)
424 {
425     CHECK_AND_RETURN_RET_LOG(session != nullptr, false, "session is nullptr");
426 
427     bool deviceCond = isSupportMirrorToStream_ &&
428                       session->GetDescriptor().sessionType_ == AVSession::SESSION_TYPE_VIDEO &&
429                       !AppManagerAdapter::GetInstance().IsAppBackground(session->GetUid(), session->GetPid());
430 
431     bool connectCond = !is2in1_ && (castServiceNameStatePair_.second == deviceStateConnection);
432 
433     return deviceCond && connectCond;
434 }
435 
MirrorToStreamCast(sptr<AVSessionItem> & session)436 __attribute__((no_sanitize("cfi"))) int32_t AVSessionService::MirrorToStreamCast(sptr<AVSessionItem>& session)
437 {
438     SLOGI("enter MirrorToStreamCast");
439     if (!IsMirrorToStreamCastAllowed(session)) {
440         return AVSESSION_SUCCESS;
441     }
442     checkEnableCast(true);
443     DeviceInfo deviceInfo;
444     deviceInfo.deviceId_ = castDeviceId_;
445     deviceInfo.deviceName_ = castDeviceName_;
446     deviceInfo.deviceType_ = castDeviceType_;
447     deviceInfo.castCategory_ = AVCastCategory::CATEGORY_REMOTE;
448     deviceInfo.supportedProtocols_ = ProtocolType::TYPE_CAST_PLUS_STREAM;
449     deviceInfo.providerId_ = 1;
450     return session->RegisterListenerStreamToCast(castServiceNameStatePair_, deviceInfo);
451 }
452 
SetIsSupportMirrorToStream(bool isSupportMirrorToStream)453 void AVSessionService::SetIsSupportMirrorToStream(bool isSupportMirrorToStream)
454 {
455     isSupportMirrorToStream_ = isSupportMirrorToStream;
456 }
457 
ReportStartCastBegin(std::string func,const OutputDeviceInfo & outputDeviceInfo,int32_t uid)458 void AVSessionService::ReportStartCastBegin(std::string func, const OutputDeviceInfo& outputDeviceInfo, int32_t uid)
459 {
460     AVSessionRadarInfo info(func);
461     info.bundleName_ = BundleStatusAdapter::GetInstance().GetBundleNameFromUid(uid);
462     AVSessionRadar::GetInstance().StartCastBegin(outputDeviceInfo, info);
463 }
464 
ReportStartCastEnd(std::string func,const OutputDeviceInfo & outputDeviceInfo,int32_t uid,int ret)465 void AVSessionService::ReportStartCastEnd(std::string func, const OutputDeviceInfo& outputDeviceInfo,
466     int32_t uid, int ret)
467 {
468     AVSessionRadarInfo info(func);
469     info.bundleName_ = BundleStatusAdapter::GetInstance().GetBundleNameFromUid(uid);
470     if (ret == AVSESSION_SUCCESS) {
471         AVSessionRadar::GetInstance().StartCastEnd(outputDeviceInfo, info);
472     } else {
473         info.errorCode_ = AVSessionRadar::GetRadarErrorCode(ret);
474         AVSessionRadar::GetInstance().FailToStartCast(outputDeviceInfo, info);
475     }
476 }
477 #endif
478 
AVSessionSystemAbilityLoadCallback(AVSessionService * ptr)479 AVSessionSystemAbilityLoadCallback::AVSessionSystemAbilityLoadCallback(AVSessionService *ptr)
480 {
481     SLOGI("AVSessionSystemAbilityLoadCallback construct");
482     servicePtr_ = ptr;
483 }
484 
~AVSessionSystemAbilityLoadCallback()485 AVSessionSystemAbilityLoadCallback::~AVSessionSystemAbilityLoadCallback()
486 {
487     SLOGI("AVSessionSystemAbilityLoadCallback destruct");
488 }
489 
OnLoadSACompleteForRemote(const std::string & deviceId,int32_t systemAbilityId,const sptr<IRemoteObject> & remoteObject)490 void AVSessionSystemAbilityLoadCallback::OnLoadSACompleteForRemote(const std::string& deviceId,
491     int32_t systemAbilityId, const sptr<IRemoteObject>& remoteObject)
492 {
493     SLOGI("OnLoadSACompleteForRemote systemAbilityId:%{public}d, loaded with object:%{public}d",
494         systemAbilityId, static_cast<int>(remoteObject != nullptr));
495 }
496 
AVSessionDeviceStateCallback(AVSessionService * ptr)497 AVSessionDeviceStateCallback::AVSessionDeviceStateCallback(AVSessionService *ptr)
498 {
499     SLOGI("AVSessionDeviceStateCallback construct");
500     servicePtr_ = ptr;
501 }
~AVSessionDeviceStateCallback()502 AVSessionDeviceStateCallback::~AVSessionDeviceStateCallback()
503 {
504     SLOGI("AVSessionDeviceStateCallback destruct");
505 }
506 
OnDeviceOnline(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)507 void AVSessionDeviceStateCallback::OnDeviceOnline(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
508 {
509     SLOGI("AVSessionDeviceStateCallback OnDeviceOnline %{public}d", static_cast<int>(deviceInfo.deviceTypeId));
510 }
511 
OnDeviceReady(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)512 void AVSessionDeviceStateCallback::OnDeviceReady(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
513 {
514     SLOGI("AVSessionDeviceStateCallback OnDeviceReady %{public}d", static_cast<int>(deviceInfo.deviceTypeId));
515     CHECK_AND_RETURN_LOG(servicePtr_ != nullptr, "OnDeviceReady get servicePtr_ nullptr");
516     if (servicePtr_->ProcessTargetMigrate(true, deviceInfo)) {
517         SLOGI("OnDeviceReady ProcessTargetMigrate pass");
518     }
519 }
520 
OnDeviceOffline(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)521 void AVSessionDeviceStateCallback::OnDeviceOffline(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
522 {
523     SLOGI("AVSessionDeviceStateCallback OnDeviceOffline %{public}d", static_cast<int>(deviceInfo.deviceTypeId));
524     CHECK_AND_RETURN_LOG(servicePtr_ != nullptr, "OnDeviceOffline get servicePtr_ nullptr");
525     if (servicePtr_->ProcessTargetMigrate(false, deviceInfo)) {
526         SLOGI("OnDeviceOffline ProcessTargetMigrate pass");
527     }
528 }
529 
OnDeviceChanged(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)530 void AVSessionDeviceStateCallback::OnDeviceChanged(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
531 {
532     SLOGD("AVSessionDeviceStateCallback OnDeviceChanged %{public}d", static_cast<int>(deviceInfo.deviceTypeId));
533 }
534 
GetLocalDeviceType()535 int32_t AVSessionService::GetLocalDeviceType()
536 {
537     int32_t deviceType = -1;
538     int32_t ret = DistributedHardware::DeviceManager::GetInstance().GetLocalDeviceType(serviceName, deviceType);
539     CHECK_AND_RETURN_RET_LOG(ret == 0, AVSESSION_ERROR, "get local device type failed with ret:%{public}d", ret);
540     return deviceType;
541 }
542 
DoTargetDevListenWithDM()543 void AVSessionService::DoTargetDevListenWithDM()
544 {
545     localDeviceType_ = GetLocalDeviceType();
546     is2in1_ = (localDeviceType_ == DistributedHardware::DmDeviceType::DEVICE_TYPE_2IN1);
547     targetDeviceType_ = (localDeviceType_ == DistributedHardware::DmDeviceType::DEVICE_TYPE_WATCH) ?
548         DistributedHardware::DmDeviceType::DEVICE_TYPE_PHONE : DistributedHardware::DmDeviceType::DEVICE_TYPE_WATCH;
549     SLOGI("get localDeviceType:%{public}d", localDeviceType_);
550 
551     std::vector<DistributedHardware::DmDeviceInfo> deviceList;
552     int32_t ret = GetTrustedDevicesInfo(deviceList);
553     CHECK_AND_PRINT_LOG(ret == AVSESSION_SUCCESS, "get trusted devcie list fail with ret:%{public}d", ret);
554     for (DistributedHardware::DmDeviceInfo& deviceInfo : deviceList) {
555         if (ProcessTargetMigrate(true, deviceInfo)) {
556             SLOGI("GetTrustedDevicesInfo find target");
557         }
558     }
559 
560     deviceStateCallback_ = std::make_shared<AVSessionDeviceStateCallback>(this);
561     ret = DistributedHardware::DeviceManager::GetInstance().
562         RegisterDevStateCallback(serviceName, "extra", deviceStateCallback_);
563     SLOGE("RegisterDevStateCallback with ret:%{public}d", ret);
564 }
565 
ProcessTargetMigrate(bool isOnline,const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)566 bool AVSessionService::ProcessTargetMigrate(bool isOnline, const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
567 {
568     if (deviceInfo.deviceTypeId != targetDeviceType_ || !CheckWhetherTargetDevIsNext(deviceInfo)) {
569         SLOGE("ProcessTargetMigrate wtih deviceType:%{public}d or version not fit", deviceInfo.deviceTypeId);
570         return false;
571     }
572     if (!isOnline) {
573         isMigrateTargetFound_ = false;
574         DoDisconnectProcessWithMigrate(deviceInfo);
575         deviceIdForMigrate_ = "";
576     } else {
577         isMigrateTargetFound_ = true;
578         deviceIdForMigrate_ = std::string(deviceInfo.deviceId);
579         DoConnectProcessWithMigrate(deviceInfo);
580         if (localDeviceType_ == DistributedHardware::DmDeviceType::DEVICE_TYPE_PHONE) {
581             DoRemoteAVSessionLoad(deviceIdForMigrate_);
582         }
583     }
584     return true;
585 }
586 
DoRemoteAVSessionLoad(std::string remoteDeviceId)587 void AVSessionService::DoRemoteAVSessionLoad(std::string remoteDeviceId)
588 {
589     SLOGI("DoRemoteAVSessionLoad async with deviceId:%{public}s.",
590         AVSessionUtils::GetAnonySessionId(remoteDeviceId).c_str());
591     std::thread([this, remoteDeviceId]() {
592         auto mgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
593         if (mgr == nullptr) {
594             SLOGE("DoRemoteAVSessionLoad get SystemAbilityManager fail");
595             return;
596         }
597         sptr<IRemoteObject> remoteObject = nullptr;
598         uint8_t outOfTime = doRemoteLoadRetryTime;
599         while (remoteObject == nullptr && outOfTime > 0) {
600             outOfTime--;
601             std::this_thread::sleep_for(std::chrono::milliseconds(CLICK_TIMEOUT));
602             remoteObject = mgr->CheckSystemAbility(AVSESSION_SERVICE_ID, remoteDeviceId);
603             if (remoteObject != nullptr) {
604                 SLOGI("DoRemoteAVSessionLoad done with remoteObject get");
605                 return;
606             } else {
607                 SLOGI("DoRemoteAVSessionLoad get null, retryLeftTime:%{public}u", outOfTime);
608             }
609         }
610     }).detach();
611 }
612 
DoConnectProcessWithMigrate(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)613 void AVSessionService::DoConnectProcessWithMigrate(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
614 {
615     if (localDeviceType_ == DistributedHardware::DmDeviceType::DEVICE_TYPE_PHONE) {
616         DoConnectProcessWithMigrateServer(deviceInfo);
617     } else {
618         DoConnectProcessWithMigrateProxy(deviceInfo);
619     }
620 }
621 
DoConnectProcessWithMigrateServer(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)622 void AVSessionService::DoConnectProcessWithMigrateServer(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
623 {
624     std::string networkId = std::string(deviceInfo.networkId);
625     SLOGI("DoConnectProcessWithMigrateServer with deviceType:%{public}d|deviceId:%{public}s.",
626         deviceInfo.deviceTypeId,
627         AVSessionUtils::GetAnonySessionId(networkId).c_str());
628     if (migrateAVSessionServerMap_.find(networkId) == migrateAVSessionServerMap_.end()) {
629         CHECK_AND_RETURN_LOG(DoHisMigrateServerTransform(networkId) == ERR_SESSION_NOT_EXIST,
630             "hisMigrate transform done");
631         std::shared_ptr<MigrateAVSessionServer> migrateAVSessionServer =
632             std::make_shared<MigrateAVSessionServer>(MIGRATE_MODE_NEXT, networkId);
633         migrateAVSessionServer->Init(this);
634         migrateAVSessionServer->LocalFrontSessionArrive(localFrontSessionId_);
635         MigrateAVSessionManager::GetInstance().CreateLocalSessionStub(
636             MigrateAVSessionManager::migrateSceneNext,
637             migrateAVSessionServer);
638         migrateAVSessionServerMap_.insert({networkId, migrateAVSessionServer});
639         SLOGI("new MigrateServer success:%{public}d", static_cast<int>(migrateAVSessionServerMap_.size()));
640     } else {
641         SLOGE("server already alive:%{public}d", static_cast<int>(migrateAVSessionServerMap_.size()));
642     }
643 }
644 
DoConnectProcessWithMigrateProxy(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)645 void AVSessionService::DoConnectProcessWithMigrateProxy(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
646 {
647     std::string networkId = std::string(deviceInfo.networkId);
648     SLOGI("DoConnectProcessWithMigrateProxy with deviceType:%{public}d|deviceId:%{public}s.",
649         deviceInfo.deviceTypeId,
650         AVSessionUtils::GetAnonySessionId(networkId).c_str());
651     if (migrateAVSessionProxyMap_.find(networkId) == migrateAVSessionProxyMap_.end()) {
652         std::string localDevId;
653         GetLocalNetworkId(localDevId);
654         std::shared_ptr<MigrateAVSessionProxy> migrateAVSessionProxy =
655             std::make_shared<MigrateAVSessionProxy>(this, MigrateAVSessionManager::MSG_HEAD_MODE_FOR_NEXT, localDevId);
656         MigrateAVSessionManager::GetInstance().CreateRemoteSessionProxy(networkId,
657             MigrateAVSessionManager::migrateSceneNext, migrateAVSessionProxy);
658         migrateAVSessionProxyMap_.insert({networkId, std::static_pointer_cast<SoftbusSession>(migrateAVSessionProxy)});
659         SLOGI("new proxy success:%{public}d", static_cast<int>(migrateAVSessionProxyMap_.size()));
660     } else {
661         SLOGE("proxy already alive:%{public}d", static_cast<int>(migrateAVSessionProxyMap_.size()));
662     }
663 }
664 
DoDisconnectProcessWithMigrate(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)665 void AVSessionService::DoDisconnectProcessWithMigrate(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
666 {
667     if (localDeviceType_ == DistributedHardware::DmDeviceType::DEVICE_TYPE_PHONE) {
668         DoDisconnectProcessWithMigrateServer(deviceInfo);
669     } else {
670         DoDisconnectProcessWithMigrateProxy(deviceInfo);
671     }
672 }
673 
DoDisconnectProcessWithMigrateServer(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)674 void AVSessionService::DoDisconnectProcessWithMigrateServer(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
675 {
676     std::string networkId = std::string(deviceInfo.networkId);
677     SLOGI("DoDisconnectMigrateServer networkId:%{public}s|%{public}d",
678         AVSessionUtils::GetAnonySessionId(networkId).c_str(), static_cast<int>(migrateAVSessionServerMap_.size()));
679     if (migrateAVSessionServerMap_.find(networkId) != migrateAVSessionServerMap_.end()) {
680         std::shared_ptr<MigrateAVSessionServer> migrateAVSessionServer =
681             migrateAVSessionServerMap_[networkId];
682         if (migrateAVSessionServer != nullptr) {
683             MigrateAVSessionManager::GetInstance().ReleaseLocalSessionStub(MigrateAVSessionManager::migrateSceneNext);
684             migrateAVSessionServer->DoPostTasksClear();
685         } else {
686             SLOGE("get server nullptr");
687         }
688         migrateAVSessionServerMap_.erase(networkId);
689     } else {
690         SLOGE("DoDisconnectProcessWithMigrateServer find networkId not exist");
691     }
692 }
693 
DoDisconnectProcessWithMigrateProxy(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)694 void AVSessionService::DoDisconnectProcessWithMigrateProxy(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
695 {
696     std::string networkId = std::string(deviceInfo.networkId);
697     SLOGI("DoDisconnectProcessWithMigrateProxy networkId:%{public}s|%{public}d",
698         AVSessionUtils::GetAnonySessionId(networkId).c_str(), static_cast<int>(migrateAVSessionProxyMap_.size()));
699     MigrateAVSessionManager::GetInstance().ReleaseRemoteSessionProxy(networkId,
700         MigrateAVSessionManager::migrateSceneNext);
701     if (migrateAVSessionProxyMap_.find(networkId) != migrateAVSessionProxyMap_.end()) {
702         migrateAVSessionProxyMap_.erase(networkId);
703         PublishEvent(remoteMediaNone);
704     } else {
705         SLOGE("DoDisconnectProcessWithMigrateProxy find networkId not exist");
706     }
707 }
708 
DoHisMigrateServerTransform(std::string networkId)709 int32_t AVSessionService::DoHisMigrateServerTransform(std::string networkId)
710 {
711     SLOGI("DoHisMigrateServerTransform size:%{public}d", static_cast<int>(migrateAVSessionServerMap_.size()));
712     auto it = migrateAVSessionServerMap_.begin();
713     if (it != migrateAVSessionServerMap_.end()) {
714         std::shared_ptr<MigrateAVSessionServer> migrateAVSessionServer = it->second;
715         CHECK_AND_RETURN_RET_LOG(migrateAVSessionServer != nullptr, AVSESSION_ERROR, "get server nullptr");
716         migrateAVSessionServer->DoPostTasksClear();
717         migrateAVSessionServer->RefreshDeviceId(networkId);
718         it = migrateAVSessionServerMap_.erase(it);
719         migrateAVSessionServerMap_.insert({networkId, migrateAVSessionServer});
720         SLOGI("DoHisMigrateServerTransform for:%{public}s", AVSessionUtils::GetAnonySessionId(networkId).c_str());
721         return AVSESSION_SUCCESS;
722     }
723 
724     return ERR_SESSION_NOT_EXIST;
725 }
726 
UpdateLocalFrontSession(std::shared_ptr<std::list<sptr<AVSessionItem>>> sessionListForFront)727 void AVSessionService::UpdateLocalFrontSession(std::shared_ptr<std::list<sptr<AVSessionItem>>> sessionListForFront)
728 {
729     CHECK_AND_RETURN_LOG(sessionListForFront != nullptr, "UpdateLocalFrontSession get sessionListForFront nullptr");
730     std::string preloadSessionId;
731     if (sessionListForFront->size() <= 0) {
732         SLOGI("UpdateLocalFrontSession with empty list");
733         preloadSessionId = "";
734         NotifyLocalFrontSessionChangeForMigrate(preloadSessionId);
735         return;
736     }
737     if (topSession_ != nullptr && !topSession_->IsCasting()) {
738         preloadSessionId = topSession_->GetSessionId();
739         NotifyLocalFrontSessionChangeForMigrate(preloadSessionId);
740         return;
741     }
742     for (const auto& session : *sessionListForFront) {
743         if (session == nullptr || session->IsCasting()) {
744             continue;
745         }
746         preloadSessionId = session->GetSessionId();
747         break;
748     }
749     NotifyLocalFrontSessionChangeForMigrate(preloadSessionId);
750 }
751 
NotifyLocalFrontSessionChangeForMigrate(std::string localFrontSessionIdUpdate)752 void AVSessionService::NotifyLocalFrontSessionChangeForMigrate(std::string localFrontSessionIdUpdate)
753 {
754     SLOGI("notify migrate with sessionId:%{public}s|%{public}s|%{public}d",
755         AVSessionUtils::GetAnonySessionId(localFrontSessionIdUpdate).c_str(),
756         AVSessionUtils::GetAnonySessionId(localFrontSessionId_).c_str(),
757         static_cast<int>(migrateAVSessionServerMap_.size()));
758     if (migrateAVSessionServerMap_.size() <= 0) {
759         SLOGE("NotifyLocalFrontSessionChangeForMigrate with no migrate");
760         localFrontSessionId_ = localFrontSessionIdUpdate;
761         return;
762     }
763     for (auto it = migrateAVSessionServerMap_.begin(); it != migrateAVSessionServerMap_.end(); it++) {
764         std::shared_ptr<MigrateAVSessionServer> migrateAVSessionServer = it->second;
765         if (migrateAVSessionServer == nullptr) {
766             SLOGE("notify session change but get migrateserver null, continue");
767             continue;
768         }
769         if (localFrontSessionId_.empty() && localFrontSessionIdUpdate.length() > 0) {
770             DoRemoteAVSessionLoad(deviceIdForMigrate_);
771             migrateAVSessionServer->LocalFrontSessionArrive(localFrontSessionIdUpdate);
772         } else if (!localFrontSessionId_.empty() && localFrontSessionIdUpdate.length() > 0
773             && localFrontSessionId_ != localFrontSessionIdUpdate) {
774             migrateAVSessionServer->LocalFrontSessionChange(localFrontSessionIdUpdate);
775         } else if (!localFrontSessionId_.empty() && localFrontSessionIdUpdate.empty()) {
776             DoRemoteAVSessionLoad(deviceIdForMigrate_);
777             migrateAVSessionServer->LocalFrontSessionLeave(localFrontSessionId_);
778         }
779     }
780     localFrontSessionId_ = localFrontSessionIdUpdate;
781 }
782 
CheckWhetherTargetDevIsNext(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)783 bool AVSessionService::CheckWhetherTargetDevIsNext(const OHOS::DistributedHardware::DmDeviceInfo& deviceInfo)
784 {
785     cJSON* jsonData = cJSON_Parse(deviceInfo.extraData.c_str());
786     CHECK_AND_RETURN_RET_LOG(jsonData != nullptr, false, "get jsonData nullptr");
787     if (cJSON_IsInvalid(jsonData) || cJSON_IsNull(jsonData)) {
788         SLOGE("get jsonData invalid");
789         cJSON_Delete(jsonData);
790         return false;
791     }
792     if (cJSON_HasObjectItem(jsonData, "OS_TYPE")) {
793         cJSON* osTypeItem = cJSON_GetObjectItem(jsonData, "OS_TYPE");
794         if (osTypeItem == nullptr || cJSON_IsInvalid(osTypeItem) || !cJSON_IsNumber(osTypeItem)) {
795             SLOGE("get osTypeItem invalid");
796             cJSON_Delete(jsonData);
797             return false;
798         }
799         if (osTypeItem->valueint > 0 || osTypeItem->valuedouble > 0) {
800             cJSON_Delete(jsonData);
801             return true;
802         }
803     }
804 
805     cJSON_Delete(jsonData);
806     return false;
807 }
808 
GetDistributedSessionControllersInner(const DistributedSessionType & sessionType,std::vector<sptr<IRemoteObject>> & sessionControllers)809 int32_t AVSessionService::GetDistributedSessionControllersInner(const DistributedSessionType& sessionType,
810     std::vector<sptr<IRemoteObject>>& sessionControllers)
811 {
812     if (sessionType != DistributedSessionType::TYPE_SESSION_REMOTE || migrateAVSessionProxyMap_.empty()) {
813         SLOGE("GetDistributedSessionControllersInner with err type:%{public}d|proxyEmpty:%{public}d",
814             static_cast<int>(sessionType), static_cast<int>(migrateAVSessionProxyMap_.empty()));
815         return ERR_REMOTE_CONNECTION_NOT_EXIST;
816     }
817     for (const auto& pair : migrateAVSessionProxyMap_) {
818         std::shared_ptr<MigrateAVSessionProxy> migrateAVSessionProxy =
819             std::static_pointer_cast<MigrateAVSessionProxy>(pair.second);
820         CHECK_AND_CONTINUE(migrateAVSessionProxy != nullptr);
821         migrateAVSessionProxy->GetDistributedSessionControllerList(sessionControllers);
822     }
823     SLOGI("GetDistributedController size:%{public}d", static_cast<int>(sessionControllers.size()));
824     return AVSESSION_SUCCESS;
825 }
826 
NotifyRemoteBundleChange(const std::string bundleName)827 void AVSessionService::NotifyRemoteBundleChange(const std::string bundleName)
828 {
829     if (migrateAVSessionProxyMap_.empty()) {
830         SLOGE("not in migrate proxy scene, return");
831         return;
832     }
833     PublishEvent(bundleName.empty() ? remoteMediaNone : remoteMediaAlive);
834 }
835 }