• 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 "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