• 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 "avcontroller_item.h"
17 #include "ipc_skeleton.h"
18 #include "avsession_errors.h"
19 #include "avsession_log.h"
20 #include "avsession_pixel_map_adapter.h"
21 #include "avsession_trace.h"
22 #include "command_send_limit.h"
23 #include "avsession_utils.h"
24 #include "permission_checker.h"
25 #include "avsession_sysevent.h"
26 #include "want_params.h"
27 
28 #if !defined(WINDOWS_PLATFORM) and !defined(MAC_PLATFORM) and !defined(IOS_PLATFORM)
29 #include <malloc.h>
30 #endif
31 
32 namespace OHOS::AVSession {
AVControllerItem(pid_t pid,const sptr<AVSessionItem> & session,int32_t userId)33 AVControllerItem::AVControllerItem(pid_t pid, const sptr<AVSessionItem>& session, int32_t userId)
34     : pid_(pid), session_(session), userId_(userId)
35 {
36     std::lock_guard sessionLockGuard(sessionMutex_);
37     if (session_ != nullptr) {
38         sessionId_ = session_->GetSessionId();
39     }
40 }
41 
~AVControllerItem()42 AVControllerItem::~AVControllerItem()
43 {
44 }
45 
GetUserId() const46 int32_t AVControllerItem::GetUserId() const
47 {
48     return userId_;
49 }
50 
RegisterCallbackInner(const sptr<IRemoteObject> & callback)51 int32_t AVControllerItem::RegisterCallbackInner(const sptr<IRemoteObject>& callback)
52 {
53     std::lock_guard lockGuard(callbackMutex_);
54     SLOGD("do register callback for controller %{public}d", static_cast<int>(pid_));
55     callback_ = iface_cast<AVControllerCallbackProxy>(callback);
56     CHECK_AND_RETURN_RET_LOG(callback_ != nullptr, AVSESSION_ERROR, "RegisterCallbackInner callback_ is nullptr");
57     return AVSESSION_SUCCESS;
58 }
59 
RegisterAVControllerCallback(const std::shared_ptr<AVControllerCallback> & callback)60 int32_t AVControllerItem::RegisterAVControllerCallback(const std::shared_ptr<AVControllerCallback> &callback)
61 {
62     std::lock_guard lockGuard(callbackMutex_);
63     innerCallback_ = callback;
64     CHECK_AND_RETURN_RET_LOG(innerCallback_ != nullptr, AVSESSION_ERROR, "RegisterCallbackInner callback_ is nullptr");
65     return AVSESSION_SUCCESS;
66 }
67 
UnregisterAVControllerCallback()68 int32_t AVControllerItem::UnregisterAVControllerCallback()
69 {
70     std::lock_guard lockGuard(callbackMutex_);
71     SLOGI("UnregisterAVControllerCallback pid:%{public}d", static_cast<int>(pid_));
72     innerCallback_ = nullptr;
73     return AVSESSION_SUCCESS;
74 }
75 
RegisterMigrateAVSessionProxyCallback(const std::function<int32_t (const std::string &,AAFwk::WantParams &)> & callback)76 int32_t AVControllerItem::RegisterMigrateAVSessionProxyCallback(
77     const std::function<int32_t(const std::string&, AAFwk::WantParams&)>& callback)
78 {
79     migrateProxyCallback_ = callback;
80     CHECK_AND_RETURN_RET_LOG(migrateProxyCallback_ != nullptr, AVSESSION_ERROR,
81         "RegisterMigrateAVSessionProxyCallback migrateProxyCallback_ is nullptr");
82     return AVSESSION_SUCCESS;
83 }
84 
GetAVCallMetaData(AVCallMetaData & avCallMetaData)85 int32_t AVControllerItem::GetAVCallMetaData(AVCallMetaData& avCallMetaData)
86 {
87     std::lock_guard lockGuard(sessionMutex_);
88     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
89     avCallMetaData = session_->GetAVCallMetaData();
90     return AVSESSION_SUCCESS;
91 }
92 
GetAVCallState(AVCallState & avCallState)93 int32_t AVControllerItem::GetAVCallState(AVCallState& avCallState)
94 {
95     std::lock_guard lockGuard(sessionMutex_);
96     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
97     avCallState = session_->GetAVCallState();
98     return AVSESSION_SUCCESS;
99 }
100 
101 // LCOV_EXCL_START
GetAVPlaybackState(AVPlaybackState & state)102 int32_t AVControllerItem::GetAVPlaybackState(AVPlaybackState& state)
103 {
104     std::lock_guard lockGuard(sessionMutex_);
105     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
106     state = session_->GetPlaybackState();
107     return AVSESSION_SUCCESS;
108 }
109 // LCOV_EXCL_STOP
110 
SetImgForMetaData(AVMetaData & data)111 int32_t AVControllerItem::SetImgForMetaData(AVMetaData& data)
112 {
113     std::string fileDir = AVSessionUtils::GetCachePathName(userId_);
114     std::string fileName = sessionId_ + AVSessionUtils::GetFileSuffix();
115     std::shared_ptr<AVSessionPixelMap> mediaPixelMap = std::make_shared<AVSessionPixelMap>();
116     data.SetMediaImage(mediaPixelMap);
117     AVSessionUtils::ReadImageFromFile(mediaPixelMap, fileDir, fileName);
118 
119     std::string avQueueFileDir = AVSessionUtils::GetFixedPathName(userId_);
120     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "SetImgForMetaData session not exist");
121     std::string avQueueFileName =
122         session_->GetBundleName() + "_" + data.GetAVQueueId() + AVSessionUtils::GetFileSuffix();
123     std::shared_ptr<AVSessionPixelMap> avQueuePixelMap = data.GetAVQueueImage();
124     AVSessionUtils::ReadImageFromFile(avQueuePixelMap, avQueueFileDir, avQueueFileName);
125     return AVSESSION_SUCCESS;
126 }
127 
GetAVMetaData(AVMetaData & data)128 int32_t AVControllerItem::GetAVMetaData(AVMetaData& data)
129 {
130     std::lock_guard lockGuard(sessionMutex_);
131     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
132     data = session_->GetMetaDataWithoutImg();
133     int32_t ret = SetImgForMetaData(data);
134     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "SetImgForMetaData with ret:%{public}d", ret);
135     if (data.GetMediaImage() != nullptr && !data.GetMediaImageUri().empty()) {
136         SLOGD("isFromSession %{public}d in metaGet", isFromSession_);
137         if (isFromSession_) {
138             data.GetMediaImage()->Clear();
139         } else {
140             return ERR_INVALID_PARAM;
141         }
142     }
143     return AVSESSION_SUCCESS;
144 }
145 
DoMetadataImgClean(AVMetaData & data)146 void AVControllerItem::DoMetadataImgClean(AVMetaData& data)
147 {
148     std::lock_guard metaMaskLockGuard(metaMaskMutex_);
149     SLOGD("still clear media img in DoMetadataImgClean");
150     std::shared_ptr<AVSessionPixelMap> innerQueuePixelMap = data.GetAVQueueImage();
151     AVSessionPixelMapAdapter::CleanAVSessionPixelMap(innerQueuePixelMap);
152     std::shared_ptr<AVSessionPixelMap> innerMediaPixelMap = data.GetMediaImage();
153     AVSessionPixelMapAdapter::CleanAVSessionPixelMap(innerMediaPixelMap);
154 }
155 
156 // LCOV_EXCL_START
GetAVQueueItems(std::vector<AVQueueItem> & items)157 int32_t AVControllerItem::GetAVQueueItems(std::vector<AVQueueItem>& items)
158 {
159     std::lock_guard lockGuard(sessionMutex_);
160     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
161     items = session_->GetQueueItems();
162     return AVSESSION_SUCCESS;
163 }
164 
GetAVQueueTitle(std::string & title)165 int32_t AVControllerItem::GetAVQueueTitle(std::string& title)
166 {
167     std::lock_guard lockGuard(sessionMutex_);
168     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
169     title = session_->GetQueueTitle();
170     return AVSESSION_SUCCESS;
171 }
172 
SkipToQueueItem(int32_t & itemId)173 int32_t AVControllerItem::SkipToQueueItem(int32_t& itemId)
174 {
175     std::lock_guard lockGuard(sessionMutex_);
176     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
177     session_->HandleSkipToQueueItem(itemId);
178     return AVSESSION_SUCCESS;
179 }
180 
GetExtras(AAFwk::WantParams & extras)181 int32_t AVControllerItem::GetExtras(AAFwk::WantParams& extras)
182 {
183     std::lock_guard lockGuard(sessionMutex_);
184     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
185     CHECK_AND_RETURN_RET_LOG(CommandSendLimit::GetInstance().IsCommandSendEnable(OHOS::IPCSkeleton::GetCallingPid()),
186         ERR_COMMAND_SEND_EXCEED_MAX, "command send number exceed max");
187     extras = session_->GetExtras();
188     return AVSESSION_SUCCESS;
189 }
190 
GetExtrasWithEvent(const std::string & extraEvent,AAFwk::WantParams & extras)191 int32_t AVControllerItem::GetExtrasWithEvent(const std::string& extraEvent, AAFwk::WantParams& extras)
192 {
193     if (migrateProxyCallback_ != nullptr) {
194         int32_t ret = migrateProxyCallback_(extraEvent, extras);
195         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "extraEvent not support");
196     } else {
197         SLOGI("migrateProxyCallback_ function is nullptr");
198     }
199 
200     std::lock_guard lockGuard(sessionMutex_);
201     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
202 
203     return AVSESSION_SUCCESS;
204 }
205 
SendAVKeyEvent(const MMI::KeyEvent & keyEvent)206 int32_t AVControllerItem::SendAVKeyEvent(const MMI::KeyEvent& keyEvent)
207 {
208     std::lock_guard lockGuard(sessionMutex_);
209     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
210     session_->HandleMediaKeyEvent(keyEvent);
211     return AVSESSION_SUCCESS;
212 }
213 
GetLaunchAbility(AbilityRuntime::WantAgent::WantAgent & ability)214 int32_t AVControllerItem::GetLaunchAbility(AbilityRuntime::WantAgent::WantAgent& ability)
215 {
216     std::lock_guard lockGuard(sessionMutex_);
217     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
218     ability = session_->GetLaunchAbility();
219     return AVSESSION_SUCCESS;
220 }
221 
GetValidCommands(std::vector<int32_t> & cmds)222 int32_t AVControllerItem::GetValidCommands(std::vector<int32_t>& cmds)
223 {
224     std::lock_guard lockGuard(sessionMutex_);
225     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
226     cmds = session_->GetSupportCommand();
227     return AVSESSION_SUCCESS;
228 }
229 // LCOV_EXCL_STOP
230 
IsSessionActive(bool & isActive)231 int32_t AVControllerItem::IsSessionActive(bool& isActive)
232 {
233     std::lock_guard lockGuard(sessionMutex_);
234     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
235     isActive = session_->IsActive();
236     return AVSESSION_SUCCESS;
237 }
238 
239 // LCOV_EXCL_START
SendControlCommand(const AVControlCommand & cmd)240 int32_t AVControllerItem::SendControlCommand(const AVControlCommand& cmd)
241 {
242     std::lock_guard lockGuard(sessionMutex_);
243     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
244     std::vector<int32_t> cmds = session_->GetSupportCommand();
245     if (std::find(cmds.begin(), cmds.end(), cmd.GetCommand()) == cmds.end()) {
246         SLOGE("The command that needs to be sent is not supported.");
247         return ERR_COMMAND_NOT_SUPPORT;
248     }
249     CHECK_AND_RETURN_RET_LOG(CommandSendLimit::GetInstance().IsCommandSendEnable(OHOS::IPCSkeleton::GetCallingPid()),
250         ERR_COMMAND_SEND_EXCEED_MAX, "command send number exceed max");
251     session_->ExecuteControllerCommand(cmd);
252     return AVSESSION_SUCCESS;
253 }
254 // LCOV_EXCL_STOP
255 
SendCommonCommand(const std::string & commonCommand,const AAFwk::WantParams & commandArgs)256 int32_t AVControllerItem::SendCommonCommand(const std::string& commonCommand, const AAFwk::WantParams& commandArgs)
257 {
258     if (migrateProxyCallback_ != nullptr) {
259         int32_t ret = migrateProxyCallback_(commonCommand, const_cast<AAFwk::WantParams&>(commandArgs));
260         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "extraEvent not support");
261     } else {
262         SLOGI("migrateProxyCallback_ function is nullptr");
263     }
264 
265     std::lock_guard lockGuard(sessionMutex_);
266     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "Session not exist");
267     CHECK_AND_RETURN_RET_LOG(CommandSendLimit::GetInstance().IsCommandSendEnable(OHOS::IPCSkeleton::GetCallingPid()),
268         ERR_COMMAND_SEND_EXCEED_MAX, "common command send number exceed max");
269     session_->ExecueCommonCommand(commonCommand, commandArgs);
270     return AVSESSION_SUCCESS;
271 }
272 
273 // LCOV_EXCL_START
SetAVCallMetaFilter(const AVCallMetaData::AVCallMetaMaskType & filter)274 int32_t AVControllerItem::SetAVCallMetaFilter(const AVCallMetaData::AVCallMetaMaskType& filter)
275 {
276     std::lock_guard lockGuard(avCallMetaMaskMutex_);
277     avCallMetaMask_ = filter;
278     return AVSESSION_SUCCESS;
279 }
280 
SetAVCallStateFilter(const AVCallState::AVCallStateMaskType & filter)281 int32_t AVControllerItem::SetAVCallStateFilter(const AVCallState::AVCallStateMaskType& filter)
282 {
283     std::lock_guard lockGuard(avCallStateMaskMutex_);
284     avCallStateMask_ = filter;
285     return AVSESSION_SUCCESS;
286 }
287 
SetMetaFilter(const AVMetaData::MetaMaskType & filter)288 int32_t AVControllerItem::SetMetaFilter(const AVMetaData::MetaMaskType& filter)
289 {
290     std::lock_guard lockGuard(metaMaskMutex_);
291     metaMask_ = filter;
292     return AVSESSION_SUCCESS;
293 }
294 
SetPlaybackFilter(const AVPlaybackState::PlaybackStateMaskType & filter)295 int32_t AVControllerItem::SetPlaybackFilter(const AVPlaybackState::PlaybackStateMaskType& filter)
296 {
297     std::lock_guard lockGuard(playbackMaskMutex_);
298     playbackMask_ = filter;
299     return AVSESSION_SUCCESS;
300 }
301 // LCOV_EXCL_STOP
302 
Destroy()303 int32_t AVControllerItem::Destroy()
304 {
305     if (sessionId_ == "DEFAULT") {
306         SLOGE("controller create inside can not be destroy from outside");
307         return AVSESSION_SUCCESS;
308     }
309     SLOGI("controller destroyed for pid %{public}d", static_cast<int>(pid_));
310     {
311         std::lock_guard callbackLockGuard(callbackMutex_);
312         callback_ = nullptr;
313         innerCallback_ = nullptr;
314     }
315 
316     {
317         std::lock_guard serviceCallbacklockGuard(serviceCallbackMutex_);
318         if (serviceCallback_) {
319             serviceCallback_(*this);
320         }
321     }
322 
323     {
324         std::lock_guard sessionLockGuard(sessionMutex_);
325         if (session_ != nullptr) {
326             session_->HandleControllerRelease(pid_);
327             session_ = nullptr;
328             sessionId_.clear();
329         }
330     }
331 
332     return AVSESSION_SUCCESS;
333 }
334 
DestroyWithoutReply()335 int32_t AVControllerItem::DestroyWithoutReply()
336 {
337     SLOGI("do controller DestroyWithoutReply for pid %{public}d", static_cast<int>(pid_));
338     {
339         std::lock_guard callbackLockGuard(callbackMutex_);
340         innerCallback_ = nullptr;
341         callback_ = nullptr;
342     }
343     {
344         std::lock_guard sessionLockGuard(sessionMutex_);
345         if (session_ != nullptr) {
346             session_->HandleControllerRelease(pid_);
347             sessionId_.clear();
348             session_ = nullptr;
349         }
350     }
351     return AVSESSION_SUCCESS;
352 }
353 
354 // LCOV_EXCL_START
GetSessionId()355 std::string AVControllerItem::GetSessionId()
356 {
357     std::lock_guard sessionLockGuard(sessionMutex_);
358     return sessionId_;
359 }
360 // LCOV_EXCL_STOP
361 
GetElementOfSession()362 AppExecFwk::ElementName AVControllerItem::GetElementOfSession()
363 {
364     std::lock_guard sessionLockGuard(sessionMutex_);
365     AppExecFwk::ElementName elementOfSession;
366     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, elementOfSession, "session not exist");
367     elementOfSession.SetBundleName(session_->GetBundleName());
368     elementOfSession.SetAbilityName(session_->GetAbilityName());
369     return elementOfSession;
370 }
371 
HandleSessionDestroy()372 void AVControllerItem::HandleSessionDestroy()
373 {
374     {
375         std::lock_guard callbackLockGuard(callbackMutex_);
376         if (callback_ != nullptr) {
377             callback_->OnSessionDestroy();
378         }
379         if (innerCallback_ != nullptr) {
380             innerCallback_->OnSessionDestroy();
381         }
382     }
383     std::lock_guard sessionLockGuard(sessionMutex_);
384     session_ = nullptr;
385     sessionId_.clear();
386 }
387 
388 // LCOV_EXCL_START
HandleAVCallStateChange(const AVCallState & avCallState)389 void AVControllerItem::HandleAVCallStateChange(const AVCallState& avCallState)
390 {
391     std::lock_guard callbackLockGuard(callbackMutex_);
392     AVCallState stateOut;
393     std::lock_guard avCallStateLockGuard(avCallStateMaskMutex_);
394     if (avCallState.CopyToByMask(avCallStateMask_, stateOut)) {
395         SLOGI("update avcall state");
396         AVSESSION_TRACE_SYNC_START("AVControllerItem::OnAVCallStateChange");
397         if (callback_ != nullptr) {
398             callback_->OnAVCallStateChange(stateOut);
399         }
400         if (innerCallback_ != nullptr) {
401             innerCallback_->OnAVCallStateChange(stateOut);
402         }
403     }
404 }
405 
HandleAVCallMetaDataChange(const AVCallMetaData & avCallMetaData)406 void AVControllerItem::HandleAVCallMetaDataChange(const AVCallMetaData& avCallMetaData)
407 {
408     std::lock_guard callbackLockGuard(callbackMutex_);
409     AVCallMetaData metaOut;
410     std::lock_guard avCallMetaDataMaskLockGuard(avCallMetaMaskMutex_);
411     if (avCallMetaData.CopyToByMask(avCallMetaMask_, metaOut)) {
412         if (avCallMetaMask_.test(AVCallMetaData::AVCALL_META_KEY_MEDIA_IMAGE)) {
413             std::shared_ptr<AVSessionPixelMap> innerPixelMap = nullptr;
414             if (metaOut.GetMediaImage() != nullptr) {
415                 std::string fileDir = AVSessionUtils::GetCachePathName(userId_);
416                 std::string fileName = sessionId_ + AVSessionUtils::GetFileSuffix();
417                 innerPixelMap = metaOut.GetMediaImage();
418                 AVSessionUtils::ReadImageFromFile(innerPixelMap, fileDir, fileName);
419             }
420             metaOut.SetMediaImage(innerPixelMap);
421         }
422 
423         if (avCallMetaMask_.test(AVCallMetaData::AVCALL_META_KEY_NAME)) {
424             metaOut.SetName(avCallMetaData.GetName());
425         }
426 
427         if (avCallMetaMask_.test(AVCallMetaData::AVCALL_META_KEY_PHONE_NUMBER)) {
428             metaOut.SetPhoneNumber(avCallMetaData.GetPhoneNumber());
429         }
430         SLOGI("update avcall meta data");
431     }
432 
433     if (callback_ != nullptr) {
434         callback_->OnAVCallMetaDataChange(metaOut);
435     }
436     if (innerCallback_ != nullptr) {
437         innerCallback_->OnAVCallMetaDataChange(metaOut);
438     }
439     AVSESSION_TRACE_SYNC_START("AVControllerItem::OnAVCallMetaDataChange");
440 }
441 
HandlePlaybackStateChange(const AVPlaybackState & state)442 void AVControllerItem::HandlePlaybackStateChange(const AVPlaybackState& state)
443 {
444     std::lock_guard callbackLockGuard(callbackMutex_);
445     AVPlaybackState stateOut;
446     std::lock_guard playbackLockGuard(playbackMaskMutex_);
447     if (state.CopyToByMask(playbackMask_, stateOut)) {
448         AVSESSION_TRACE_SYNC_START("AVControllerItem::OnPlaybackStateChange");
449         if (callback_ != nullptr) {
450             callback_->OnPlaybackStateChange(stateOut);
451         }
452         if (innerCallback_ != nullptr) {
453             innerCallback_->OnPlaybackStateChange(stateOut);
454         }
455     }
456 }
457 
HandleMetaDataChange(const AVMetaData & data)458 void AVControllerItem::HandleMetaDataChange(const AVMetaData& data)
459 {
460     std::lock_guard callbackLockGuard(callbackMutex_);
461     AVMetaData metaOut;
462     std::lock_guard metaMaskLockGuard(metaMaskMutex_);
463     if (data.CopyToByMask(metaMask_, metaOut)) {
464         if ((metaMask_.test(AVMetaData::META_KEY_MEDIA_IMAGE)) && (metaOut.GetMediaImage() != nullptr)) {
465             std::string fileDir = AVSessionUtils::GetCachePathName(userId_);
466             std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaOut.GetMediaImage();
467             AVSessionUtils::ReadImageFromFile(innerPixelMap, fileDir, sessionId_ + AVSessionUtils::GetFileSuffix());
468             metaOut.SetMediaImage(innerPixelMap);
469         }
470         if ((metaMask_.test(AVMetaData::META_KEY_AVQUEUE_IMAGE)) && (metaOut.GetAVQueueImage() != nullptr)) {
471             std::string avQueueFileDir = AVSessionUtils::GetFixedPathName(userId_);
472             CHECK_AND_RETURN_LOG(session_ != nullptr, "Session not exist");
473             std::string avQueueFileName =
474                 session_->GetBundleName() + "_" + metaOut.GetAVQueueId() + AVSessionUtils::GetFileSuffix();
475             std::shared_ptr<AVSessionPixelMap> avQueuePixelMap = metaOut.GetAVQueueImage();
476             AVSessionUtils::ReadImageFromFile(avQueuePixelMap, avQueueFileDir, avQueueFileName);
477             metaOut.SetAVQueueImage(avQueuePixelMap);
478         }
479         if (!metaMask_.test(AVMetaData::META_KEY_ASSET_ID)) {
480             metaOut.SetAssetId(data.GetAssetId());
481         }
482         SLOGI("update metaData pid %{public}d, title %{public}s", static_cast<int>(pid_), metaOut.GetTitle().c_str());
483         AVSESSION_TRACE_SYNC_START("AVControllerItem::OnMetaDataChange");
484         if (metaOut.GetMediaImage() != nullptr && !metaOut.GetMediaImageUri().empty()) {
485             SLOGI("isFromSession %{public}d in metaChange", isFromSession_);
486             if (isFromSession_) {
487                 metaOut.GetMediaImage()->Clear();
488             } else {
489                 metaOut.SetMediaImageUri("");
490             }
491         }
492         if (callback_ != nullptr) {
493             callback_->OnMetaDataChange(metaOut);
494         }
495         if (innerCallback_ != nullptr) {
496             innerCallback_->OnMetaDataChange(metaOut);
497         }
498     }
499     std::shared_ptr<AVSessionPixelMap> innerQueuePixelMap = metaOut.GetAVQueueImage();
500     if (innerQueuePixelMap != nullptr) {
501         innerQueuePixelMap->Clear();
502     }
503     std::shared_ptr<AVSessionPixelMap> innerMediaPixelMap = metaOut.GetMediaImage();
504     if (innerMediaPixelMap != nullptr) {
505         innerMediaPixelMap->Clear();
506     }
507 }
508 
HandleOutputDeviceChange(const int32_t connectionState,const OutputDeviceInfo & outputDeviceInfo)509 void AVControllerItem::HandleOutputDeviceChange(const int32_t connectionState, const OutputDeviceInfo& outputDeviceInfo)
510 {
511     std::lock_guard lockGuard(callbackMutex_);
512     if (callback_ != nullptr) {
513         callback_->OnOutputDeviceChange(connectionState, outputDeviceInfo);
514     }
515 }
516 // LCOV_EXCL_STOP
517 
HandleActiveStateChange(bool isActive)518 void AVControllerItem::HandleActiveStateChange(bool isActive)
519 {
520     std::lock_guard lockGuard(callbackMutex_);
521     if (callback_ != nullptr) {
522         callback_->OnActiveStateChange(isActive);
523     }
524 }
525 
526 // LCOV_EXCL_START
HandleValidCommandChange(const std::vector<int32_t> & cmds)527 void AVControllerItem::HandleValidCommandChange(const std::vector<int32_t>& cmds)
528 {
529     std::lock_guard lockGuard(callbackMutex_);
530     SLOGD("do OnValidCommandChange with pid %{public}d cmd list size %{public}d",
531         static_cast<int>(pid_), static_cast<int>(cmds.size()));
532     if (callback_ != nullptr) {
533         callback_->OnValidCommandChange(cmds);
534     }
535     if (innerCallback_ != nullptr) {
536         innerCallback_->OnValidCommandChange(cmds);
537     }
538 }
539 // LCOV_EXCL_STOP
540 
HandleSetSessionEvent(const std::string & event,const AAFwk::WantParams & args)541 void AVControllerItem::HandleSetSessionEvent(const std::string& event, const AAFwk::WantParams& args)
542 {
543     std::lock_guard lockGuard(callbackMutex_);
544     if (callback_ != nullptr) {
545         callback_->OnSessionEventChange(event, args);
546     }
547 }
548 
549 // LCOV_EXCL_START
HandleQueueItemsChange(const std::vector<AVQueueItem> & items)550 void AVControllerItem::HandleQueueItemsChange(const std::vector<AVQueueItem>& items)
551 {
552     std::lock_guard lockGuard(callbackMutex_);
553     AVSESSION_TRACE_SYNC_START("AVControllerItem::OnQueueItemsChange");
554     if (callback_ != nullptr) {
555         callback_->OnQueueItemsChange(items);
556     }
557 }
558 
HandleQueueTitleChange(const std::string & title)559 void AVControllerItem::HandleQueueTitleChange(const std::string& title)
560 {
561     std::lock_guard lockGuard(callbackMutex_);
562     AVSESSION_TRACE_SYNC_START("AVControllerItem::OnQueueTitleChange");
563     if (callback_ != nullptr) {
564         callback_->OnQueueTitleChange(title);
565     }
566 }
567 
HandleExtrasChange(const AAFwk::WantParams & extras)568 void AVControllerItem::HandleExtrasChange(const AAFwk::WantParams& extras)
569 {
570     std::lock_guard lockGuard(callbackMutex_);
571     AVSESSION_TRACE_SYNC_START("AVControllerItem::OnSetExtras");
572     if (callback_ != nullptr) {
573         callback_->OnExtrasChange(extras);
574     }
575 }
576 // LCOV_EXCL_STOP
577 
GetPid() const578 pid_t AVControllerItem::GetPid() const
579 {
580     return pid_;
581 }
582 
HasSession(const std::string & sessionId)583 bool AVControllerItem::HasSession(const std::string& sessionId)
584 {
585     std::lock_guard sessionLockGuard(sessionMutex_);
586     return sessionId_ == sessionId;
587 }
588 
SetServiceCallbackForRelease(const std::function<void (AVControllerItem &)> & callback)589 void AVControllerItem::SetServiceCallbackForRelease(const std::function<void(AVControllerItem&)>& callback)
590 {
591     std::lock_guard lockGuard(serviceCallbackMutex_);
592     serviceCallback_ = callback;
593 }
594 } // namespace OHOS::AVSession
595