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