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 "avsession_manager_impl.h"
17 #include "iservice_registry.h"
18 #include "ipc_skeleton.h"
19 #include "system_ability_definition.h"
20 #include "avsession_log.h"
21 #include "avsession_errors.h"
22 #include "session_listener_client.h"
23 #include "avsession_trace.h"
24 #include "avsession_sysevent.h"
25 #include "avsession_utils.h"
26
27 namespace OHOS::AVSession {
AVSessionManagerImpl()28 AVSessionManagerImpl::AVSessionManagerImpl()
29 {
30 SLOGD("constructor");
31 }
32
GetService()33 sptr<AVSessionServiceProxy> AVSessionManagerImpl::GetService()
34 {
35 std::lock_guard<std::mutex> lockGuard(lock_);
36 if (service_) {
37 return service_;
38 }
39
40 auto mgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
41 if (mgr == nullptr) {
42 SLOGE("failed to get sa mgr");
43 return nullptr;
44 }
45 auto object = mgr->GetSystemAbility(AVSESSION_SERVICE_ID);
46 if (object == nullptr) {
47 SLOGE("failed to get service");
48 return nullptr;
49 }
50 service_ = iface_cast<AVSessionServiceProxy>(object);
51 if (service_ != nullptr) {
52 auto recipient = new(std::nothrow) ServiceDeathRecipient([this] { OnServiceDie(); });
53 if (recipient == nullptr) {
54 SLOGE("register ServiceDeathRecipient failed");
55 return nullptr;
56 }
57
58 sptr<IAVSessionService> serviceBase = service_;
59 serviceBase->AsObject()->AddDeathRecipient(recipient);
60
61 SLOGD("get service success");
62 RegisterClientDeathObserver();
63 }
64 return service_;
65 }
66
OnServiceDie()67 void AVSessionManagerImpl::OnServiceDie()
68 {
69 SLOGI("enter");
70 auto callback = deathCallback_;
71 {
72 std::lock_guard<std::mutex> lockGuard(lock_);
73 service_.clear();
74 listener_.clear();
75 clientDeath_.clear();
76 deathCallback_ = nullptr;
77 }
78 if (callback) {
79 callback();
80 }
81 HISYSEVENT_RESET;
82 HISYSEVENT_UNREGISTER;
83 std::string cachePath(AVSessionUtils::GetCachePathName());
84 AVSessionUtils::DeleteCacheFiles(cachePath);
85 }
86
CreateSession(const std::string & tag,int32_t type,const AppExecFwk::ElementName & elementName)87 std::shared_ptr<AVSession> AVSessionManagerImpl::CreateSession(const std::string& tag, int32_t type,
88 const AppExecFwk::ElementName& elementName)
89 {
90 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::CreateSession");
91 if (tag.empty() || elementName.GetBundleName().empty() || elementName.GetAbilityName().empty()) {
92 SLOGE("param is invalid");
93 return nullptr;
94 }
95 if (type != AVSession::SESSION_TYPE_AUDIO && type != AVSession::SESSION_TYPE_VIDEO) {
96 SLOGE("type is invalid");
97 return nullptr;
98 }
99
100 auto service = GetService();
101 return service ? service->CreateSession(tag, type, elementName) : nullptr;
102 }
103
GetAllSessionDescriptors(std::vector<AVSessionDescriptor> & descriptors)104 int32_t AVSessionManagerImpl::GetAllSessionDescriptors(std::vector<AVSessionDescriptor>& descriptors)
105 {
106 auto service = GetService();
107 return service ? service->GetAllSessionDescriptors(descriptors) : ERR_SERVICE_NOT_EXIST;
108 }
109
GetActivatedSessionDescriptors(std::vector<AVSessionDescriptor> & activatedSessions)110 int32_t AVSessionManagerImpl::GetActivatedSessionDescriptors(std::vector<AVSessionDescriptor>& activatedSessions)
111 {
112 std::vector<AVSessionDescriptor> descriptors;
113 int32_t ret = GetAllSessionDescriptors(descriptors);
114 CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "GetAllSessionDescriptors failed");
115
116 for (const auto& descriptor : descriptors) {
117 if (descriptor.isActive_) {
118 activatedSessions.push_back(descriptor);
119 }
120 }
121 return ret;
122 }
123
GetSessionDescriptorsBySessionId(const std::string & sessionId,AVSessionDescriptor & descriptor)124 int32_t AVSessionManagerImpl::GetSessionDescriptorsBySessionId(const std::string& sessionId,
125 AVSessionDescriptor& descriptor)
126 {
127 if (sessionId.empty()) {
128 SLOGE("sessionId is invalid");
129 return ERR_INVALID_PARAM;
130 }
131
132 auto service = GetService();
133 return service ? service->GetSessionDescriptorsBySessionId(sessionId, descriptor) : ERR_SERVICE_NOT_EXIST;
134 }
135
GetHistoricalSessionDescriptors(int32_t maxSize,std::vector<AVSessionDescriptor> & descriptors)136 int32_t AVSessionManagerImpl::GetHistoricalSessionDescriptors(int32_t maxSize,
137 std::vector<AVSessionDescriptor>& descriptors)
138 {
139 auto service = GetService();
140 return service ? service->GetHistoricalSessionDescriptors(maxSize, descriptors) : ERR_SERVICE_NOT_EXIST;
141 }
142
CreateController(const std::string & sessionId,std::shared_ptr<AVSessionController> & controller)143 int32_t AVSessionManagerImpl::CreateController(const std::string& sessionId,
144 std::shared_ptr<AVSessionController>& controller)
145 {
146 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::CreateController");
147 if (sessionId.empty()) {
148 SLOGE("sessionId is invalid");
149 return ERR_INVALID_PARAM;
150 }
151
152 auto service = GetService();
153 return service ? service->CreateController(sessionId, controller) : ERR_SERVICE_NOT_EXIST;
154 }
155
156 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
GetAVCastController(const std::string & sessionId,std::shared_ptr<AVCastController> & castController)157 int32_t AVSessionManagerImpl::GetAVCastController(const std::string& sessionId,
158 std::shared_ptr<AVCastController>& castController)
159 {
160 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::GetAVCastController");
161 if (sessionId.empty()) {
162 SLOGE("sessionId is invalid");
163 return ERR_INVALID_PARAM;
164 }
165
166 auto service = GetService();
167 return service ? service->GetAVCastController(sessionId, castController) : ERR_SERVICE_NOT_EXIST;
168 }
169 #endif
170
RegisterSessionListener(const std::shared_ptr<SessionListener> & listener)171 int32_t AVSessionManagerImpl::RegisterSessionListener(const std::shared_ptr<SessionListener>& listener)
172 {
173 if (listener == nullptr) {
174 SLOGE("listener is nullptr");
175 return ERR_INVALID_PARAM;
176 }
177
178 auto service = GetService();
179 if (service == nullptr) {
180 return ERR_SERVICE_NOT_EXIST;
181 }
182
183 if (listener_ != nullptr) {
184 return ERR_SESSION_LISTENER_EXIST;
185 }
186
187 listener_ = new(std::nothrow) SessionListenerClient(listener);
188 if (listener_ == nullptr) {
189 return ERR_NO_MEMORY;
190 }
191 auto ret = service->RegisterSessionListener(listener_);
192 if (ret != AVSESSION_SUCCESS) {
193 std::lock_guard<std::mutex> lockGuard(lock_);
194 listener_.clear();
195 return ret;
196 }
197 return AVSESSION_SUCCESS;
198 }
199
RegisterServiceDeathCallback(const DeathCallback & callback)200 int32_t AVSessionManagerImpl::RegisterServiceDeathCallback(const DeathCallback& callback)
201 {
202 deathCallback_ = callback;
203 return AVSESSION_SUCCESS;
204 }
205
UnregisterServiceDeathCallback()206 int32_t AVSessionManagerImpl::UnregisterServiceDeathCallback()
207 {
208 deathCallback_ = nullptr;
209 return AVSESSION_SUCCESS;
210 }
211
SendSystemAVKeyEvent(const MMI::KeyEvent & keyEvent)212 int32_t AVSessionManagerImpl::SendSystemAVKeyEvent(const MMI::KeyEvent& keyEvent)
213 {
214 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::SendSystemAVKeyEvent");
215 if (!keyEvent.IsValid()) {
216 SLOGE("keyEvent is invalid");
217 return ERR_COMMAND_NOT_SUPPORT;
218 }
219
220 auto service = GetService();
221 return service ? service->SendSystemAVKeyEvent(keyEvent) : ERR_SERVICE_NOT_EXIST;
222 }
223
SendSystemControlCommand(const AVControlCommand & command)224 int32_t AVSessionManagerImpl::SendSystemControlCommand(const AVControlCommand& command)
225 {
226 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::SendSystemControlCommand");
227 if (!command.IsValid()) {
228 SLOGE("command is invalid");
229 HISYSEVENT_FAULT("CONTROL_COMMAND_FAILED", "ERROR_TYPE", "INVALID_COMMAND", "CMD", command.GetCommand(),
230 "ERROR_CODE", ERR_INVALID_PARAM, "ERROR_INFO", "avsessionmanagerimpl command is invalid");
231 return ERR_COMMAND_NOT_SUPPORT;
232 }
233
234 auto service = GetService();
235 if (service == nullptr) {
236 HISYSEVENT_FAULT("CONTROL_COMMAND_FAILED", "ERROR_TYPE", "GET_SERVICE_ERROR",
237 "ERROR_CODE", ERR_SERVICE_NOT_EXIST, "ERROR_INFO", "mgrimp sendsystemcontrolcommand get service error");
238 return ERR_SERVICE_NOT_EXIST;
239 }
240 return service->SendSystemControlCommand(command);
241 }
242
CastAudio(const SessionToken & token,const std::vector<AudioStandard::AudioDeviceDescriptor> & descriptors)243 int32_t AVSessionManagerImpl::CastAudio(const SessionToken& token,
244 const std::vector<AudioStandard::AudioDeviceDescriptor>& descriptors)
245 {
246 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::CastAudio");
247 CHECK_AND_RETURN_RET_LOG(descriptors.size() > 0, ERR_INVALID_PARAM, "devices size is zero");
248 auto service = GetService();
249 return service ? service->CastAudio(token, descriptors) : ERR_SERVICE_NOT_EXIST;
250 }
251
CastAudioForAll(const std::vector<AudioStandard::AudioDeviceDescriptor> & descriptors)252 int32_t AVSessionManagerImpl::CastAudioForAll(const std::vector<AudioStandard::AudioDeviceDescriptor>& descriptors)
253 {
254 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::CastAudioForAll");
255 CHECK_AND_RETURN_RET_LOG(descriptors.size() > 0, ERR_INVALID_PARAM, "devices size is zero");
256 auto service = GetService();
257 return service ? service->CastAudioForAll(descriptors) : ERR_SERVICE_NOT_EXIST;
258 }
259
260 #ifdef CASTPLUS_CAST_ENGINE_ENABLE
StartCastDiscovery(const int32_t castDeviceCapability)261 int32_t AVSessionManagerImpl::StartCastDiscovery(const int32_t castDeviceCapability)
262 {
263 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::StartCastDiscovery");
264 auto service = GetService();
265 return service ? service->StartCastDiscovery(castDeviceCapability) : ERR_SERVICE_NOT_EXIST;
266 }
267
StopCastDiscovery()268 int32_t AVSessionManagerImpl::StopCastDiscovery()
269 {
270 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::StopCastDiscovery");
271 auto service = GetService();
272 return service ? service->StopCastDiscovery() : ERR_SERVICE_NOT_EXIST;
273 }
274
SetDiscoverable(const bool enable)275 int32_t AVSessionManagerImpl::SetDiscoverable(const bool enable)
276 {
277 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::SetDiscoverable");
278 auto service = GetService();
279 return service ? service->SetDiscoverable(enable) : ERR_SERVICE_NOT_EXIST;
280 }
281
StartCast(const SessionToken & sessionToken,const OutputDeviceInfo & outputDeviceInfo)282 int32_t AVSessionManagerImpl::StartCast(const SessionToken& sessionToken, const OutputDeviceInfo& outputDeviceInfo)
283 {
284 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::StartCast");
285 auto service = GetService();
286 return service ? service->StartCast(sessionToken, outputDeviceInfo) : ERR_SERVICE_NOT_EXIST;
287 }
288
StopCast(const SessionToken & sessionToken)289 int32_t AVSessionManagerImpl::StopCast(const SessionToken& sessionToken)
290 {
291 AVSESSION_TRACE_SYNC_START("AVSessionManagerImpl::StopCast");
292 auto service = GetService();
293 return service ? service->StopCast(sessionToken) : ERR_SERVICE_NOT_EXIST;
294 }
295 #endif
296
RegisterClientDeathObserver()297 void AVSessionManagerImpl::RegisterClientDeathObserver()
298 {
299 clientDeath_ = new(std::nothrow) ClientDeathStub();
300 if (clientDeath_ == nullptr) {
301 SLOGE("malloc failed");
302 HISYSEVENT_FAULT("CONTROL_COMMAND_FAILED", "ERROR_TYPE", "MALLOC_FAILED",
303 "ERROR_INFO", "avsession manager impl register client death observer malloc failed");
304 return;
305 }
306
307 if (service_->RegisterClientDeathObserver(clientDeath_) != AVSESSION_SUCCESS) {
308 SLOGE("register failed");
309 HISYSEVENT_FAULT("CONTROL_COMMAND_FAILED", "ERROR_TYPE", "REGISTER_FAILED",
310 "ERROR_INFO", "avsession manager impl register client death observer register failed");
311 return;
312 }
313 SLOGI("success");
314 }
315
ServiceDeathRecipient(const std::function<void ()> & callback)316 ServiceDeathRecipient::ServiceDeathRecipient(const std::function<void()>& callback)
317 : callback_(callback)
318 {
319 SLOGD("construct");
320 }
321
OnRemoteDied(const wptr<IRemoteObject> & object)322 void ServiceDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& object)
323 {
324 if (callback_) {
325 callback_();
326 }
327 }
328 } // namespace OHOS::AVSession
329