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 }