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