180922886Sopenharmony_ci/* 280922886Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 380922886Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 480922886Sopenharmony_ci * you may not use this file except in compliance with the License. 580922886Sopenharmony_ci * You may obtain a copy of the License at 680922886Sopenharmony_ci * 780922886Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 880922886Sopenharmony_ci * 980922886Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1080922886Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1180922886Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1280922886Sopenharmony_ci * See the License for the specific language governing permissions and 1380922886Sopenharmony_ci * limitations under the License. 1480922886Sopenharmony_ci */ 1580922886Sopenharmony_ci 1680922886Sopenharmony_ci#include "session_stack.h" 1780922886Sopenharmony_ci#include "avsession_errors.h" 1880922886Sopenharmony_ci#include "avsession_sysevent.h" 1980922886Sopenharmony_ci 2080922886Sopenharmony_cinamespace OHOS::AVSession { 2180922886Sopenharmony_ciint32_t SessionStack::AddSession(pid_t pid, const std::string& abilityName, sptr<AVSessionItem>& item) 2280922886Sopenharmony_ci{ 2380922886Sopenharmony_ci std::lock_guard sessionStackLockGuard(sessionStackLock_); 2480922886Sopenharmony_ci if (sessions_.size() >= SessionContainer::SESSION_NUM_MAX) { 2580922886Sopenharmony_ci return ERR_SESSION_EXCEED_MAX; 2680922886Sopenharmony_ci } 2780922886Sopenharmony_ci sessions_.insert(std::make_pair(std::make_pair(pid, abilityName), item)); 2880922886Sopenharmony_ci stack_.push_front(item); 2980922886Sopenharmony_ci HISYSEVENT_ADD_OPERATION_COUNT(Operation::OPT_CREATE_SESSION); 3080922886Sopenharmony_ci return AVSESSION_SUCCESS; 3180922886Sopenharmony_ci} 3280922886Sopenharmony_ci 3380922886Sopenharmony_civoid SessionStack::UpdateSessionSort(sptr<AVSessionItem>& item) 3480922886Sopenharmony_ci{ 3580922886Sopenharmony_ci std::lock_guard sessionStackLockGuard(sessionStackLock_); 3680922886Sopenharmony_ci auto it = sessions_.find(std::make_pair(item->GetPid(), item->GetAbilityName())); 3780922886Sopenharmony_ci if (it == sessions_.end()) { 3880922886Sopenharmony_ci return; 3980922886Sopenharmony_ci } 4080922886Sopenharmony_ci stack_.remove(it->second); 4180922886Sopenharmony_ci sessions_.erase(it); 4280922886Sopenharmony_ci // change order by reinsert 4380922886Sopenharmony_ci sessions_.insert(std::make_pair(std::make_pair(item->GetPid(), item->GetAbilityName()), item)); 4480922886Sopenharmony_ci stack_.push_front(item); 4580922886Sopenharmony_ci} 4680922886Sopenharmony_ci 4780922886Sopenharmony_cistd::vector<sptr<AVSessionItem>> SessionStack::RemoveSession(pid_t pid) 4880922886Sopenharmony_ci{ 4980922886Sopenharmony_ci std::vector<sptr<AVSessionItem>> result; 5080922886Sopenharmony_ci std::lock_guard sessionStackLockGuard(sessionStackLock_); 5180922886Sopenharmony_ci for (auto it = sessions_.begin(); it != sessions_.end();) { 5280922886Sopenharmony_ci if (it->first.first == pid) { 5380922886Sopenharmony_ci std::string sessionId = it->second->GetSessionId(); 5480922886Sopenharmony_ci result.push_back(it->second); 5580922886Sopenharmony_ci stack_.remove(it->second); 5680922886Sopenharmony_ci it = sessions_.erase(it); 5780922886Sopenharmony_ci HISYSEVENT_ADD_OPERATION_COUNT(Operation::OPT_DELETE_SESSION); 5880922886Sopenharmony_ci } else { 5980922886Sopenharmony_ci it++; 6080922886Sopenharmony_ci } 6180922886Sopenharmony_ci } 6280922886Sopenharmony_ci return result; 6380922886Sopenharmony_ci} 6480922886Sopenharmony_ci 6580922886Sopenharmony_cisptr<AVSessionItem> SessionStack::RemoveSession(const std::string& sessionId) 6680922886Sopenharmony_ci{ 6780922886Sopenharmony_ci sptr<AVSessionItem> result; 6880922886Sopenharmony_ci std::lock_guard sessionStackLockGuard(sessionStackLock_); 6980922886Sopenharmony_ci for (auto it = sessions_.begin(); it != sessions_.end();) { 7080922886Sopenharmony_ci if (it->second->GetSessionId() == sessionId) { 7180922886Sopenharmony_ci result = it->second; 7280922886Sopenharmony_ci stack_.remove(it->second); 7380922886Sopenharmony_ci it = sessions_.erase(it); 7480922886Sopenharmony_ci HISYSEVENT_ADD_OPERATION_COUNT(Operation::OPT_DELETE_SESSION); 7580922886Sopenharmony_ci } else { 7680922886Sopenharmony_ci it++; 7780922886Sopenharmony_ci } 7880922886Sopenharmony_ci } 7980922886Sopenharmony_ci return result; 8080922886Sopenharmony_ci} 8180922886Sopenharmony_ci 8280922886Sopenharmony_cisptr<AVSessionItem> SessionStack::RemoveSession(pid_t pid, const std::string& abilityName) 8380922886Sopenharmony_ci{ 8480922886Sopenharmony_ci std::lock_guard sessionStackLockGuard(sessionStackLock_); 8580922886Sopenharmony_ci auto it = sessions_.find(std::make_pair(pid, abilityName)); 8680922886Sopenharmony_ci if (it == sessions_.end()) { 8780922886Sopenharmony_ci return nullptr; 8880922886Sopenharmony_ci } 8980922886Sopenharmony_ci HISYSEVENT_ADD_OPERATION_COUNT(Operation::OPT_DELETE_SESSION); 9080922886Sopenharmony_ci auto result = it->second; 9180922886Sopenharmony_ci sessions_.erase(it); 9280922886Sopenharmony_ci stack_.remove(result); 9380922886Sopenharmony_ci return result; 9480922886Sopenharmony_ci} 9580922886Sopenharmony_ci 9680922886Sopenharmony_cisptr<AVSessionItem> SessionStack::GetSession(pid_t pid, const std::string& abilityName) 9780922886Sopenharmony_ci{ 9880922886Sopenharmony_ci std::lock_guard sessionStackLockGuard(sessionStackLock_); 9980922886Sopenharmony_ci auto it = sessions_.find(std::make_pair(pid, abilityName)); 10080922886Sopenharmony_ci if (it == sessions_.end()) { 10180922886Sopenharmony_ci return nullptr; 10280922886Sopenharmony_ci } 10380922886Sopenharmony_ci return it->second; 10480922886Sopenharmony_ci} 10580922886Sopenharmony_ci 10680922886Sopenharmony_cistd::vector<sptr<AVSessionItem>> SessionStack::GetSessionsByPid(pid_t pid) 10780922886Sopenharmony_ci{ 10880922886Sopenharmony_ci std::vector<sptr<AVSessionItem>> result; 10980922886Sopenharmony_ci std::lock_guard sessionStackLockGuard(sessionStackLock_); 11080922886Sopenharmony_ci for (auto it = sessions_.begin(); it != sessions_.end(); it++) { 11180922886Sopenharmony_ci if (it->first.first == pid) { 11280922886Sopenharmony_ci result.push_back(it->second); 11380922886Sopenharmony_ci } 11480922886Sopenharmony_ci } 11580922886Sopenharmony_ci return result; 11680922886Sopenharmony_ci} 11780922886Sopenharmony_ci 11880922886Sopenharmony_cibool SessionStack::PidHasSession(pid_t pid) 11980922886Sopenharmony_ci{ 12080922886Sopenharmony_ci std::lock_guard sessionStackLockGuard(sessionStackLock_); 12180922886Sopenharmony_ci std::map<std::pair<pid_t, std::string>, sptr<AVSessionItem>>::iterator iter = sessions_.begin(); 12280922886Sopenharmony_ci while (iter != sessions_.end()) { 12380922886Sopenharmony_ci if (iter->first.first == pid) { 12480922886Sopenharmony_ci return true; 12580922886Sopenharmony_ci } 12680922886Sopenharmony_ci ++iter; 12780922886Sopenharmony_ci } 12880922886Sopenharmony_ci return false; 12980922886Sopenharmony_ci} 13080922886Sopenharmony_ci 13180922886Sopenharmony_cibool SessionStack::UidHasSession(int32_t uid) 13280922886Sopenharmony_ci{ 13380922886Sopenharmony_ci std::lock_guard sessionStackLockGuard(sessionStackLock_); 13480922886Sopenharmony_ci for (const auto& session : stack_) { 13580922886Sopenharmony_ci if (session->GetUid() == uid) { 13680922886Sopenharmony_ci return true; 13780922886Sopenharmony_ci } 13880922886Sopenharmony_ci } 13980922886Sopenharmony_ci return false; 14080922886Sopenharmony_ci} 14180922886Sopenharmony_ci 14280922886Sopenharmony_cisptr<AVSessionItem> SessionStack::GetSessionById(const std::string& sessionId) 14380922886Sopenharmony_ci{ 14480922886Sopenharmony_ci std::lock_guard sessionStackLockGuard(sessionStackLock_); 14580922886Sopenharmony_ci for (const auto& session : stack_) { 14680922886Sopenharmony_ci if (session->GetSessionId() == sessionId) { 14780922886Sopenharmony_ci return session; 14880922886Sopenharmony_ci } 14980922886Sopenharmony_ci } 15080922886Sopenharmony_ci return nullptr; 15180922886Sopenharmony_ci} 15280922886Sopenharmony_ci 15380922886Sopenharmony_cistd::vector<sptr<AVSessionItem>> SessionStack::GetAllSessions() 15480922886Sopenharmony_ci{ 15580922886Sopenharmony_ci std::vector<sptr<AVSessionItem>> result; 15680922886Sopenharmony_ci std::lock_guard sessionStackLockGuard(sessionStackLock_); 15780922886Sopenharmony_ci for (const auto& session : stack_) { 15880922886Sopenharmony_ci result.push_back(session); 15980922886Sopenharmony_ci } 16080922886Sopenharmony_ci return result; 16180922886Sopenharmony_ci} 16280922886Sopenharmony_ci 16380922886Sopenharmony_cibool SessionStack::IsEmpty() 16480922886Sopenharmony_ci{ 16580922886Sopenharmony_ci return stack_.empty(); 16680922886Sopenharmony_ci} 16780922886Sopenharmony_ci 16880922886Sopenharmony_ciint32_t SessionStack::getAllSessionNum() 16980922886Sopenharmony_ci{ 17080922886Sopenharmony_ci return static_cast<int32_t>(stack_.size()); 17180922886Sopenharmony_ci} 17280922886Sopenharmony_ci} // namespace OHOS::AVSession 173