diff options
Diffstat (limited to 'xbmc/pvr/channels/PVRChannelGroupsContainer.cpp')
-rw-r--r-- | xbmc/pvr/channels/PVRChannelGroupsContainer.cpp | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/xbmc/pvr/channels/PVRChannelGroupsContainer.cpp b/xbmc/pvr/channels/PVRChannelGroupsContainer.cpp new file mode 100644 index 0000000..5f65cdd --- /dev/null +++ b/xbmc/pvr/channels/PVRChannelGroupsContainer.cpp @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2012-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "PVRChannelGroupsContainer.h" + +#include "pvr/channels/PVRChannel.h" +#include "pvr/channels/PVRChannelGroupMember.h" +#include "pvr/channels/PVRChannelGroups.h" +#include "pvr/epg/EpgInfoTag.h" +#include "utils/log.h" + +#include <memory> +#include <mutex> + +using namespace PVR; + +CPVRChannelGroupsContainer::CPVRChannelGroupsContainer() : + m_groupsRadio(new CPVRChannelGroups(true)), + m_groupsTV(new CPVRChannelGroups(false)) +{ +} + +CPVRChannelGroupsContainer::~CPVRChannelGroupsContainer() +{ + Unload(); + delete m_groupsRadio; + delete m_groupsTV; +} + +bool CPVRChannelGroupsContainer::Update(const std::vector<std::shared_ptr<CPVRClient>>& clients) +{ + return LoadFromDatabase(clients) && UpdateFromClients(clients); +} + +bool CPVRChannelGroupsContainer::LoadFromDatabase( + const std::vector<std::shared_ptr<CPVRClient>>& clients) +{ + return m_groupsTV->LoadFromDatabase(clients) && m_groupsRadio->LoadFromDatabase(clients); +} + +bool CPVRChannelGroupsContainer::UpdateFromClients( + const std::vector<std::shared_ptr<CPVRClient>>& clients, bool bChannelsOnly /* = false */) +{ + std::unique_lock<CCriticalSection> lock(m_critSection); + if (m_bIsUpdating) + return false; + m_bIsUpdating = true; + lock.unlock(); + + CLog::LogFC(LOGDEBUG, LOGPVR, "Updating {}", bChannelsOnly ? "channels" : "channel groups"); + bool bReturn = m_groupsTV->UpdateFromClients(clients, bChannelsOnly) && + m_groupsRadio->UpdateFromClients(clients, bChannelsOnly); + + lock.lock(); + m_bIsUpdating = false; + lock.unlock(); + + return bReturn; +} + +void CPVRChannelGroupsContainer::Unload() +{ + m_groupsRadio->Unload(); + m_groupsTV->Unload(); +} + +CPVRChannelGroups* CPVRChannelGroupsContainer::Get(bool bRadio) const +{ + return bRadio ? m_groupsRadio : m_groupsTV; +} + +std::shared_ptr<CPVRChannelGroup> CPVRChannelGroupsContainer::GetGroupAll(bool bRadio) const +{ + return Get(bRadio)->GetGroupAll(); +} + +std::shared_ptr<CPVRChannelGroup> CPVRChannelGroupsContainer::GetByIdFromAll(int iGroupId) const +{ + std::shared_ptr<CPVRChannelGroup> group = m_groupsTV->GetById(iGroupId); + if (!group) + group = m_groupsRadio->GetById(iGroupId); + + return group; +} + +std::shared_ptr<CPVRChannel> CPVRChannelGroupsContainer::GetChannelById(int iChannelId) const +{ + std::shared_ptr<CPVRChannel> channel = m_groupsTV->GetGroupAll()->GetByChannelID(iChannelId); + if (!channel) + channel = m_groupsRadio->GetGroupAll()->GetByChannelID(iChannelId); + + return channel; +} + +std::shared_ptr<CPVRChannel> CPVRChannelGroupsContainer::GetChannelForEpgTag(const std::shared_ptr<CPVREpgInfoTag>& epgTag) const +{ + if (!epgTag) + return {}; + + return Get(epgTag->IsRadio())->GetGroupAll()->GetByUniqueID(epgTag->UniqueChannelID(), epgTag->ClientID()); +} + +std::shared_ptr<CPVRChannelGroupMember> CPVRChannelGroupsContainer::GetChannelGroupMemberByPath( + const std::string& strPath) const +{ + const CPVRChannelsPath path(strPath); + if (path.IsValid()) + return Get(path.IsRadio())->GetChannelGroupMemberByPath(path); + + return {}; +} + +std::shared_ptr<CPVRChannel> CPVRChannelGroupsContainer::GetByPath(const std::string& strPath) const +{ + const std::shared_ptr<CPVRChannelGroupMember> groupMember = GetChannelGroupMemberByPath(strPath); + if (groupMember) + return groupMember->Channel(); + + return {}; +} + +std::shared_ptr<CPVRChannel> CPVRChannelGroupsContainer::GetByUniqueID(int iUniqueChannelId, int iClientID) const +{ + std::shared_ptr<CPVRChannel> channel; + std::shared_ptr<CPVRChannelGroup> channelgroup = GetGroupAllTV(); + if (channelgroup) + channel = channelgroup->GetByUniqueID(iUniqueChannelId, iClientID); + + if (!channelgroup || !channel) + channelgroup = GetGroupAllRadio(); + if (channelgroup) + channel = channelgroup->GetByUniqueID(iUniqueChannelId, iClientID); + + return channel; +} + +std::shared_ptr<CPVRChannelGroupMember> CPVRChannelGroupsContainer:: + GetLastPlayedChannelGroupMember() const +{ + std::shared_ptr<CPVRChannelGroupMember> channelTV = + m_groupsTV->GetGroupAll()->GetLastPlayedChannelGroupMember(); + std::shared_ptr<CPVRChannelGroupMember> channelRadio = + m_groupsRadio->GetGroupAll()->GetLastPlayedChannelGroupMember(); + + if (!channelTV || (channelRadio && + channelRadio->Channel()->LastWatched() > channelTV->Channel()->LastWatched())) + return channelRadio; + + return channelTV; +} + +bool CPVRChannelGroupsContainer::CreateChannelEpgs() +{ + bool bReturn = m_groupsTV->CreateChannelEpgs(); + bReturn &= m_groupsRadio->CreateChannelEpgs(); + return bReturn; +} + +int CPVRChannelGroupsContainer::CleanupCachedImages() +{ + return m_groupsTV->CleanupCachedImages() + m_groupsRadio->CleanupCachedImages(); +} |