• 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_trace.h"
21 #include "command_send_limit.h"
22 #include "avsession_utils.h"
23 #include "permission_checker.h"
24 #include "avsession_sysevent.h"
25 #include "want_params.h"
26 
27 #if !defined(WINDOWS_PLATFORM) and !defined(MAC_PLATFORM) and !defined(IOS_PLATFORM)
28 #include <malloc.h>
29 #endif
30 
31 namespace OHOS::AVSession {
AVControllerItem(pid_t pid,const sptr<AVSessionItem> & session)32 AVControllerItem::AVControllerItem(pid_t pid, const sptr<AVSessionItem>& session)
33     : pid_(pid), session_(session)
34 {
35     sessionId_ = session_->GetSessionId();
36     SLOGD("construct sessionId=%{public}s", sessionId_.c_str());
37 }
38 
~AVControllerItem()39 AVControllerItem::~AVControllerItem()
40 {
41     SLOGI("destroy sessionId=%{public}s", sessionId_.c_str());
42 }
43 
RegisterCallbackInner(const sptr<IRemoteObject> & callback)44 int32_t AVControllerItem::RegisterCallbackInner(const sptr<IRemoteObject>& callback)
45 {
46     std::lock_guard lockGuard(callbackMutex_);
47     callback_ = iface_cast<AVControllerCallbackProxy>(callback);
48     CHECK_AND_RETURN_RET_LOG(callback_ != nullptr, AVSESSION_ERROR, "callback_ is nullptr");
49     return AVSESSION_SUCCESS;
50 }
51 
GetAVPlaybackState(AVPlaybackState & state)52 int32_t AVControllerItem::GetAVPlaybackState(AVPlaybackState& state)
53 {
54     std::lock_guard lockGuard(sessionMutex_);
55     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
56     state = session_->GetPlaybackState();
57     return AVSESSION_SUCCESS;
58 }
59 
GetAVMetaData(AVMetaData & data)60 int32_t AVControllerItem::GetAVMetaData(AVMetaData& data)
61 {
62     std::lock_guard lockGuard(sessionMutex_);
63     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
64     data = session_->GetMetaData();
65     return AVSESSION_SUCCESS;
66 }
67 
GetAVQueueItems(std::vector<AVQueueItem> & items)68 int32_t AVControllerItem::GetAVQueueItems(std::vector<AVQueueItem>& items)
69 {
70     std::lock_guard lockGuard(sessionMutex_);
71     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
72     items = session_->GetQueueItems();
73     return AVSESSION_SUCCESS;
74 }
75 
GetAVQueueTitle(std::string & title)76 int32_t AVControllerItem::GetAVQueueTitle(std::string& title)
77 {
78     std::lock_guard lockGuard(sessionMutex_);
79     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
80     title = session_->GetQueueTitle();
81     return AVSESSION_SUCCESS;
82 }
83 
SkipToQueueItem(int32_t & itemId)84 int32_t AVControllerItem::SkipToQueueItem(int32_t& itemId)
85 {
86     std::lock_guard lockGuard(sessionMutex_);
87     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
88     session_->HandleSkipToQueueItem(itemId);
89     return AVSESSION_SUCCESS;
90 }
91 
GetExtras(AAFwk::WantParams & extras)92 int32_t AVControllerItem::GetExtras(AAFwk::WantParams& extras)
93 {
94     std::lock_guard lockGuard(sessionMutex_);
95     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
96     extras = session_->GetExtras();
97     return AVSESSION_SUCCESS;
98 }
99 
SendAVKeyEvent(const MMI::KeyEvent & keyEvent)100 int32_t AVControllerItem::SendAVKeyEvent(const MMI::KeyEvent& keyEvent)
101 {
102     std::lock_guard lockGuard(sessionMutex_);
103     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
104     session_->HandleMediaKeyEvent(keyEvent);
105     return AVSESSION_SUCCESS;
106 }
107 
GetLaunchAbility(AbilityRuntime::WantAgent::WantAgent & ability)108 int32_t AVControllerItem::GetLaunchAbility(AbilityRuntime::WantAgent::WantAgent& ability)
109 {
110     std::lock_guard lockGuard(sessionMutex_);
111     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
112     ability = session_->GetLaunchAbility();
113     return AVSESSION_SUCCESS;
114 }
115 
GetValidCommands(std::vector<int32_t> & cmds)116 int32_t AVControllerItem::GetValidCommands(std::vector<int32_t>& cmds)
117 {
118     std::lock_guard lockGuard(sessionMutex_);
119     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
120     cmds = session_->GetSupportCommand();
121     return AVSESSION_SUCCESS;
122 }
123 
IsSessionActive(bool & isActive)124 int32_t AVControllerItem::IsSessionActive(bool& isActive)
125 {
126     std::lock_guard lockGuard(sessionMutex_);
127     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
128     isActive = session_->IsActive();
129     return AVSESSION_SUCCESS;
130 }
131 
SendControlCommand(const AVControlCommand & cmd)132 int32_t AVControllerItem::SendControlCommand(const AVControlCommand& cmd)
133 {
134     std::lock_guard lockGuard(sessionMutex_);
135     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
136     std::vector<int32_t> cmds = session_->GetSupportCommand();
137     CHECK_AND_RETURN_RET_LOG(std::find(cmds.begin(), cmds.end(), cmd.GetCommand()) != cmds.end(),
138                              ERR_COMMAND_NOT_SUPPORT, "command not support");
139     CHECK_AND_RETURN_RET_LOG(CommandSendLimit::GetInstance().IsCommandSendEnable(OHOS::IPCSkeleton::GetCallingPid()),
140         ERR_COMMAND_SEND_EXCEED_MAX, "command send number exceed max");
141     session_->ExecuteControllerCommand(cmd);
142     return AVSESSION_SUCCESS;
143 }
144 
SendCommonCommand(const std::string & commonCommand,const AAFwk::WantParams & commandArgs)145 int32_t AVControllerItem::SendCommonCommand(const std::string& commonCommand, const AAFwk::WantParams& commandArgs)
146 {
147     std::lock_guard lockGuard(sessionMutex_);
148     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "Session not exist");
149     session_->ExecueCommonCommand(commonCommand, commandArgs);
150     return AVSESSION_SUCCESS;
151 }
152 
SetMetaFilter(const AVMetaData::MetaMaskType & filter)153 int32_t AVControllerItem::SetMetaFilter(const AVMetaData::MetaMaskType& filter)
154 {
155     std::lock_guard lockGuard(metaMaskMutex_);
156     metaMask_ = filter;
157     return AVSESSION_SUCCESS;
158 }
159 
SetPlaybackFilter(const AVPlaybackState::PlaybackStateMaskType & filter)160 int32_t AVControllerItem::SetPlaybackFilter(const AVPlaybackState::PlaybackStateMaskType& filter)
161 {
162     std::lock_guard lockGuard(playbackMaskMutex_);
163     playbackMask_ = filter;
164     return AVSESSION_SUCCESS;
165 }
166 
Destroy()167 int32_t AVControllerItem::Destroy()
168 {
169     {
170         std::lock_guard callbackLockGuard(callbackMutex_);
171         callback_ = nullptr;
172     }
173     {
174         std::lock_guard sessionLockGuard(sessionMutex_);
175         if (session_ != nullptr) {
176             session_->HandleControllerRelease(pid_);
177             session_ = nullptr;
178             sessionId_.clear();
179         }
180     }
181     {
182         std::lock_guard serviceCallbacklockGuard(serviceCallbackMutex_);
183         if (serviceCallback_) {
184             serviceCallback_(*this);
185         }
186     }
187     return AVSESSION_SUCCESS;
188 }
189 
GetSessionId()190 std::string AVControllerItem::GetSessionId()
191 {
192     return sessionId_;
193 }
194 
HandleSessionDestroy()195 void AVControllerItem::HandleSessionDestroy()
196 {
197     {
198         std::lock_guard callbackLockGuard(callbackMutex_);
199         if (callback_ != nullptr) {
200             callback_->OnSessionDestroy();
201         }
202     }
203     std::lock_guard sessionLockGuard(sessionMutex_);
204     session_ = nullptr;
205     sessionId_.clear();
206 }
207 
HandlePlaybackStateChange(const AVPlaybackState & state)208 void AVControllerItem::HandlePlaybackStateChange(const AVPlaybackState& state)
209 {
210     std::lock_guard callbackLockGuard(callbackMutex_);
211     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
212     AVPlaybackState stateOut;
213     std::lock_guard playbackLockGuard(playbackMaskMutex_);
214     if (state.CopyToByMask(playbackMask_, stateOut)) {
215         SLOGI("update playback state");
216         AVSESSION_TRACE_SYNC_START("AVControllerItem::OnPlaybackStateChange");
217         callback_->OnPlaybackStateChange(stateOut);
218     }
219 }
220 
HandleMetaDataChange(const AVMetaData & data)221 void AVControllerItem::HandleMetaDataChange(const AVMetaData& data)
222 {
223     std::lock_guard callbackLockGuard(callbackMutex_);
224     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
225     AVMetaData metaOut;
226     std::lock_guard metaMaskLockGuard(metaMaskMutex_);
227     if (data.CopyToByMask(metaMask_, metaOut)) {
228         if ((metaMask_.test(AVMetaData::META_KEY_MEDIA_IMAGE)) && (metaOut.GetMediaImage() != nullptr)) {
229             std::string fileName = AVSessionUtils::GetCachePathName() + sessionId_ + AVSessionUtils::GetFileSuffix();
230             std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaOut.GetMediaImage();
231             AVSessionUtils::ReadImageFromFile(innerPixelMap, fileName);
232             metaOut.SetMediaImage(innerPixelMap);
233         }
234         SLOGI("update meta data");
235         AVSESSION_TRACE_SYNC_START("AVControllerItem::OnMetaDataChange");
236         callback_->OnMetaDataChange(metaOut);
237     }
238 }
239 
HandleOutputDeviceChange(const int32_t connectionState,const OutputDeviceInfo & outputDeviceInfo)240 void AVControllerItem::HandleOutputDeviceChange(const int32_t connectionState, const OutputDeviceInfo& outputDeviceInfo)
241 {
242     SLOGD("Connection state %{public}d", connectionState);
243     std::lock_guard lockGuard(callbackMutex_);
244     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
245     callback_->OnOutputDeviceChange(connectionState, outputDeviceInfo);
246 }
247 
HandleActiveStateChange(bool isActive)248 void AVControllerItem::HandleActiveStateChange(bool isActive)
249 {
250     std::lock_guard lockGuard(callbackMutex_);
251     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
252     callback_->OnActiveStateChange(isActive);
253 }
254 
HandleValidCommandChange(const std::vector<int32_t> & cmds)255 void AVControllerItem::HandleValidCommandChange(const std::vector<int32_t>& cmds)
256 {
257     std::lock_guard lockGuard(callbackMutex_);
258     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
259     callback_->OnValidCommandChange(cmds);
260 }
261 
HandleSetSessionEvent(const std::string & event,const AAFwk::WantParams & args)262 void AVControllerItem::HandleSetSessionEvent(const std::string& event, const AAFwk::WantParams& args)
263 {
264     std::lock_guard lockGuard(callbackMutex_);
265     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
266     AVSESSION_TRACE_SYNC_START("AVControllerItem::OnSessionEventChange");
267     callback_->OnSessionEventChange(event, args);
268 }
269 
HandleQueueItemsChange(const std::vector<AVQueueItem> & items)270 void AVControllerItem::HandleQueueItemsChange(const std::vector<AVQueueItem>& items)
271 {
272     std::lock_guard lockGuard(callbackMutex_);
273     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
274     AVSESSION_TRACE_SYNC_START("AVControllerItem::OnQueueItemsChange");
275     callback_->OnQueueItemsChange(items);
276 }
277 
HandleQueueTitleChange(const std::string & title)278 void AVControllerItem::HandleQueueTitleChange(const std::string& title)
279 {
280     std::lock_guard lockGuard(callbackMutex_);
281     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
282     AVSESSION_TRACE_SYNC_START("AVControllerItem::OnQueueTitleChange");
283     callback_->OnQueueTitleChange(title);
284 }
285 
HandleExtrasChange(const AAFwk::WantParams & extras)286 void AVControllerItem::HandleExtrasChange(const AAFwk::WantParams& extras)
287 {
288     std::lock_guard lockGuard(callbackMutex_);
289     CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback_ is nullptr");
290     AVSESSION_TRACE_SYNC_START("AVControllerItem::OnSetExtras");
291     callback_->OnExtrasChange(extras);
292 }
293 
GetPid() const294 pid_t AVControllerItem::GetPid() const
295 {
296     return pid_;
297 }
298 
HasSession(const std::string & sessionId)299 bool AVControllerItem::HasSession(const std::string& sessionId)
300 {
301     return sessionId_ == sessionId;
302 }
303 
SetServiceCallbackForRelease(const std::function<void (AVControllerItem &)> & callback)304 void AVControllerItem::SetServiceCallbackForRelease(const std::function<void(AVControllerItem&)>& callback)
305 {
306     std::lock_guard lockGuard(serviceCallbackMutex_);
307     serviceCallback_ = callback;
308 }
309 } // namespace OHOS::AVSession
310