bool CPVRDatabase::DeleteChannelsFromGroup(const CPVRChannelGroup &group) { /* invalid group id */ if (group.GroupID() <= 0) { CLog::Log(LOGERROR, "PVR - %s - invalid group id: %d", __FUNCTION__, group.GroupID()); return false; } Filter filter; filter.AppendWhere(PrepareSQL("idGroup = %u", group.GroupID())); return DeleteValues("map_channelgroups_channels", filter); }
bool CPVRChannelGroups::DeleteGroup(const CPVRChannelGroup &group) { // don't delete internal groups if (group.IsInternalGroup()) { CLog::Log(LOGERROR, "PVR - %s - cannot delete internal group '%s'", __FUNCTION__, group.GroupName().c_str()); return false; } // delete the group in this container CSingleLock lock(m_critSection); for (std::vector<CPVRChannelGroupPtr>::iterator it = m_groups.begin(); it != m_groups.end(); it++) { if ((*it)->GroupID() == group.GroupID()) { // update the selected group in the gui if it's deleted CPVRChannelGroupPtr selectedGroup = GetSelectedGroup(); if (selectedGroup && *selectedGroup == group) g_PVRManager.SetPlayingGroup(GetGroupAll()); m_groups.erase(it); break; } } // delete the group from the database CPVRDatabase *database = GetPVRDatabase(); return database ? database->Delete(group) : false; }
bool CPVRDatabase::DeleteChannelsFromGroup(const CPVRChannelGroup &group, const vector<int> &channelsToDelete) { bool bDelete(true); unsigned int iDeletedChannels(0); while (iDeletedChannels < channelsToDelete.size()) { CStdString strChannelsToDelete; CStdString strWhereClause; for (unsigned int iChannelPtr = 0; iChannelPtr + iDeletedChannels < channelsToDelete.size() && iChannelPtr < 50; iChannelPtr++) strChannelsToDelete.AppendFormat(", %d", channelsToDelete.at(iDeletedChannels + iChannelPtr)); if (!strChannelsToDelete.IsEmpty()) { strChannelsToDelete = strChannelsToDelete.Right(strChannelsToDelete.length() - 2); strWhereClause = FormatSQL("idGroup = %u AND idChannel IN (%s)", group.GroupID(), strChannelsToDelete.c_str()); bDelete = DeleteValues("map_channelgroups_channels", strWhereClause) && bDelete; } iDeletedChannels += 50; } return bDelete; }
bool CPVRDatabase::UpdateLastWatched(const CPVRChannelGroup &group) { CSingleLock lock(m_critSection); const std::string strQuery = PrepareSQL("UPDATE channelgroups SET iLastWatched = %u WHERE idGroup = %d", static_cast<unsigned int>(group.LastWatched()), group.GroupID()); return ExecuteQuery(strQuery); }
CPVRChannelGroupPtr CPVRChannelGroups::GetNextGroup(const CPVRChannelGroup &group) const { bool bReturnNext(false); { CSingleLock lock(m_critSection); for (std::vector<CPVRChannelGroupPtr>::const_iterator it = m_groups.begin(); it != m_groups.end(); ++it) { // return this entry if (bReturnNext && !(*it)->IsHidden()) return *it; // return the next entry if ((*it)->GroupID() == group.GroupID()) bReturnNext = true; } // no match return first visible group for (std::vector<CPVRChannelGroupPtr>::const_iterator it = m_groups.begin(); it != m_groups.end(); ++it) { if (!(*it)->IsHidden()) return *it; } } // no match return GetFirstGroup(); }
bool CPVRDatabase::RemoveChannelsFromGroup(const CPVRChannelGroup &group) { Filter filter; filter.AppendWhere(PrepareSQL("idGroup = %u", group.GroupID())); return DeleteValues("map_channelgroups_channels", filter); }
bool CPVRDatabase::RemoveStaleChannelsFromGroup(const CPVRChannelGroup &group) { bool bDelete(true); if (!group.IsInternalGroup()) { /* First remove channels that don't exist in the main channels table */ CStdString strWhereClause = FormatSQL("idChannel IN (SELECT map_channelgroups_channels.idChannel FROM map_channelgroups_channels LEFT JOIN channels on map_channelgroups_channels.idChannel = channels.idChannel WHERE channels.idChannel IS NULL)"); bDelete = DeleteValues("map_channelgroups_channels", strWhereClause); } if (group.size() > 0) { vector<int> currentMembers; if (GetCurrentGroupMembers(group, currentMembers)) { vector<int> channelsToDelete; for (unsigned int iChannelPtr = 0; iChannelPtr < currentMembers.size(); iChannelPtr++) { if (!group.IsGroupMember(currentMembers.at(iChannelPtr))) channelsToDelete.push_back(currentMembers.at(iChannelPtr)); } bDelete = DeleteChannelsFromGroup(group, channelsToDelete) && bDelete; } } else { CStdString strWhereClause = FormatSQL("idGroup = %u", group.GroupID()); bDelete = DeleteValues("map_channelgroups_channels", strWhereClause) && bDelete; } return bDelete; }
bool CPVRDatabase::UpdateLastWatched(const CPVRChannelGroup &group) { std::string strQuery = PrepareSQL("UPDATE channelgroups SET iLastWatched = %d WHERE idGroup = %d", group.LastWatched(), group.GroupID()); return ExecuteQuery(strQuery); }
bool CPVRChannelGroups::DeleteGroup(const CPVRChannelGroup &group) { // don't delete internal groups if (group.IsInternalGroup()) { CLog::Log(LOGERROR, "CPVRChannelGroups - %s - cannot delete internal group '%s'", __FUNCTION__, group.GroupName().c_str()); return false; } bool bFound(false); CPVRChannelGroupPtr playingGroup; // delete the group in this container { CSingleLock lock(m_critSection); for (std::vector<CPVRChannelGroupPtr>::iterator it = m_groups.begin(); !bFound && it != m_groups.end();) { if (*(*it) == group || (group.GroupID() > 0 && (*it)->GroupID() == group.GroupID())) { // update the selected group in the gui if it's deleted CPVRChannelGroupPtr selectedGroup = GetSelectedGroup(); if (selectedGroup && *selectedGroup == group) playingGroup = GetGroupAll(); it = m_groups.erase(it); bFound = true; } else { ++it; } } } if (playingGroup) g_PVRManager.SetPlayingGroup(playingGroup); if (group.GroupID() > 0) { // delete the group from the database const CPVRDatabasePtr database(g_PVRManager.GetTVDatabase()); return database ? database->Delete(group) : false; } return bFound; }
bool CPVRDatabase::Persist(CPVRChannelGroup &group) { bool bReturn(false); if (group.GroupName().empty()) { CLog::LogF(LOGERROR, "Empty group name"); return bReturn; } std::string strQuery; bReturn = true; CSingleLock lock(m_critSection); { /* insert a new entry when this is a new group, or replace the existing one otherwise */ if (group.GroupID() <= 0) strQuery = PrepareSQL("INSERT INTO channelgroups (bIsRadio, iGroupType, sName, iLastWatched, bIsHidden, iPosition) VALUES (%i, %i, '%s', %u, %i, %i)", (group.IsRadio() ? 1 :0), group.GroupType(), group.GroupName().c_str(), static_cast<unsigned int>(group.LastWatched()), group.IsHidden(), group.GetPosition()); else strQuery = PrepareSQL("REPLACE INTO channelgroups (idGroup, bIsRadio, iGroupType, sName, iLastWatched, bIsHidden, iPosition) VALUES (%i, %i, %i, '%s', %u, %i, %i)", group.GroupID(), (group.IsRadio() ? 1 :0), group.GroupType(), group.GroupName().c_str(), static_cast<unsigned int>(group.LastWatched()), group.IsHidden(), group.GetPosition()); bReturn = ExecuteQuery(strQuery); /* set the group id if it was <= 0 */ if (bReturn && group.GroupID() <= 0) { CSingleLock lock(group.m_critSection); group.m_iGroupId = (int) m_pDS->lastinsertid(); } } /* only persist the channel data for the internal groups */ if (group.IsInternalGroup()) bReturn &= PersistChannels(group); /* persist the group member entries */ if (bReturn) bReturn = PersistGroupMembers(group); return bReturn; }
int CPVRDatabase::GetGroupMembers(CPVRChannelGroup &group) { int iReturn = -1; /* invalid group id */ if (group.GroupID() < 0) { CLog::Log(LOGERROR, "PVRDB - %s - invalid group id: %d", __FUNCTION__, group.GroupID()); return -1; } CStdString strQuery = FormatSQL("SELECT idChannel, iChannelNumber FROM map_channelgroups_channels WHERE idGroup = %u ORDER BY iChannelNumber", group.GroupID()); if (ResultQuery(strQuery)) { iReturn = 0; try { while (!m_pDS->eof()) { int iChannelId = m_pDS->fv("idChannel").get_asInt(); int iChannelNumber = m_pDS->fv("iChannelNumber").get_asInt(); CPVRChannel *channel = (CPVRChannel *) g_PVRChannelGroups->GetByChannelIDFromAll(iChannelId); if (channel && group.AddToGroup(*channel, iChannelNumber)) ++iReturn; m_pDS->next(); } m_pDS->close(); } catch(...) { CLog::Log(LOGERROR, "PVRDB - %s - failed to get channels", __FUNCTION__); } } return iReturn; }
bool CPVRDatabase::RemoveStaleChannelsFromGroup(const CPVRChannelGroup &group) { bool bDelete(true); /* invalid group id */ if (group.GroupID() <= 0) { CLog::Log(LOGERROR, "PVR - %s - invalid group id: %d", __FUNCTION__, group.GroupID()); return false; } if (!group.IsInternalGroup()) { /* First remove channels that don't exist in the main channels table */ CStdString strQuery = FormatSQL("DELETE m FROM map_channelgroups_channels m LEFT JOIN channels c ON (c.idChannel = m.idChannel) WHERE c.idChannel IS NULL"); bDelete = ExecuteQuery(strQuery); } if (group.m_members.size() > 0) { vector<int> currentMembers; if (GetCurrentGroupMembers(group, currentMembers)) { vector<int> channelsToDelete; for (unsigned int iChannelPtr = 0; iChannelPtr < currentMembers.size(); iChannelPtr++) { if (!group.IsGroupMember(currentMembers.at(iChannelPtr))) channelsToDelete.push_back(currentMembers.at(iChannelPtr)); } bDelete = DeleteChannelsFromGroup(group, channelsToDelete) && bDelete; } } else { CStdString strWhereClause = FormatSQL("idGroup = %u", group.GroupID()); bDelete = DeleteValues("map_channelgroups_channels", strWhereClause) && bDelete; } return bDelete; }
bool CPVRChannelGroups::Update(const CPVRChannelGroup &group, bool bSaveInDb) { if (group.GroupName().empty() && group.GroupID() <= 0) return true; CPVRChannelGroupPtr updateGroup; { CSingleLock lock(m_critSection); // try to find the group by id if (group.GroupID() > 0) updateGroup = GetById(group.GroupID()); // try to find the group by name if we didn't find it yet if (!updateGroup) updateGroup = GetByName(group.GroupName()); if (!updateGroup) { // create a new group if none was found updateGroup = CPVRChannelGroupPtr(new CPVRChannelGroup(m_bRadio, group.GroupID(), group.GroupName())); updateGroup->SetGroupType(group.GroupType()); updateGroup->SetLastWatched(group.LastWatched()); m_groups.push_back(updateGroup); } else { // update existing group updateGroup->SetGroupID(group.GroupID()); updateGroup->SetGroupName(group.GroupName()); updateGroup->SetGroupType(group.GroupType()); } } // persist changes if (bSaveInDb && updateGroup) return updateGroup->Persist(); return true; }
bool CPVRChannelGroups::Update(const CPVRChannelGroup &group) { int iIndex = GetIndexForGroupID(group.GroupID()); if (iIndex < 0) { CLog::Log(LOGDEBUG, "PVRChannelGroups - %s - new %s channel group '%s'", __FUNCTION__, m_bRadio ? "radio" : "TV", group.GroupName().c_str()); push_back(new CPVRChannelGroup(m_bRadio, group.GroupID(), group.GroupName(), group.SortOrder())); } else { CLog::Log(LOGDEBUG, "PVRChannelGroups - %s - updating %s channel group '%s'", __FUNCTION__, m_bRadio ? "radio" : "TV", group.GroupName().c_str()); at(iIndex)->SetGroupName(group.GroupName()); at(iIndex)->SetSortOrder(group.SortOrder()); } return true; }
bool CPVRDatabase::Persist(CPVRChannelGroup &group) { bool bReturn(false); if (group.GroupName().IsEmpty()) { CLog::Log(LOGERROR, "%s - empty group name", __FUNCTION__); return bReturn; } CStdString strQuery; bReturn = true; { CSingleLock lock(group.m_critSection); /* insert a new entry when this is a new group, or replace the existing one otherwise */ if (group.GroupID() <= 0) strQuery = FormatSQL("INSERT INTO channelgroups (bIsRadio, iGroupType, sName) VALUES (%i, %i, '%s')", (group.IsRadio() ? 1 :0), group.GroupType(), group.GroupName().c_str()); else strQuery = FormatSQL("REPLACE INTO channelgroups (idGroup, bIsRadio, iGroupType, sName) VALUES (%i, %i, %i, '%s')", group.GroupID(), (group.IsRadio() ? 1 :0), group.GroupType(), group.GroupName().c_str()); bReturn = ExecuteQuery(strQuery); /* set the group id if it was <= 0 */ if (bReturn && group.GroupID() <= 0) group.m_iGroupId = (int) m_pDS->lastinsertid(); } /* only persist the channel data for the internal groups */ if (group.IsInternalGroup()) bReturn &= PersistChannels(group); /* persist the group member entries */ if (bReturn) bReturn = PersistGroupMembers(group); return bReturn; }
bool CPVRChannelGroups::DeleteGroup(const CPVRChannelGroup &group) { bool bReturn = false; if (group.IsInternalGroup()) { CLog::Log(LOG_ERROR, "CPVRChannelGroups - %s - cannot delete internal group '%s'", __FUNCTION__, group.GroupName().c_str()); return bReturn; } CPVRDatabase *database = CPVRManager::Get()->GetTVDatabase(); if (!database || !database->Open()) { CLog::Log(LOG_ERROR, "CPVRChannelGroups - %s - unable to open the database", __FUNCTION__); return bReturn; } /* remove all channels from the group */ database->RemoveChannelsFromGroup(group.GroupID()); /* delete the group from the database */ bReturn = database->DeleteChannelGroup(group.GroupID(), m_bRadio); database->Close(); /* delete the group in this container */ for (unsigned int iGroupPtr = 0; iGroupPtr < size(); iGroupPtr++) { if (at(iGroupPtr)->GroupID() == group.GroupID()) { delete at(iGroupPtr); erase(begin() + iGroupPtr); break; } } return bReturn; }
bool CPVRDatabase::Delete(const CPVRChannelGroup &group) { /* invalid group id */ if (group.GroupID() <= 0) { CLog::LogF(LOGERROR, "Invalid channel group id: %d", group.GroupID()); return false; } CSingleLock lock(m_critSection); bool bIgnoreChannel = false; std::vector<int> currentMembers; if (GetCurrentGroupMembers(group, currentMembers)) { for (int iChannelId : currentMembers) { int iClientId = GetClientIdByChannelId(iChannelId); if (iClientId != PVR_INVALID_CLIENT_ID && group.IsMissingChannelGroupMembersFromClient(iClientId)) { bIgnoreChannel = true; break; } } } if (!bIgnoreChannel) { Filter filter; filter.AppendWhere(PrepareSQL("idGroup = %u", group.GroupID())); filter.AppendWhere(PrepareSQL("bIsRadio = %u", group.IsRadio())); return RemoveChannelsFromGroup(group) && DeleteValues("channelgroups", filter); } return true; }
bool CPVRDatabase::GetCurrentGroupMembers(const CPVRChannelGroup &group, std::vector<int> &members) { bool bReturn(false); /* invalid group id */ if (group.GroupID() <= 0) { CLog::LogF(LOGERROR, "Invalid channel group id: %d", group.GroupID()); return false; } CSingleLock lock(m_critSection); const std::string strCurrentMembersQuery = PrepareSQL("SELECT idChannel FROM map_channelgroups_channels WHERE idGroup = %u", group.GroupID()); if (ResultQuery(strCurrentMembersQuery)) { try { while (!m_pDS->eof()) { members.emplace_back(m_pDS->fv("idChannel").get_asInt()); m_pDS->next(); } m_pDS->close(); bReturn = true; } catch (...) { CLog::LogF(LOGERROR, "Couldn't load channels from PVR database"); } } else { CLog::LogF(LOGERROR, "PVR database query failed"); } return bReturn; }
bool CPVRDatabase::DeleteChannelsFromGroup(const CPVRChannelGroup &group, const std::vector<int> &channelsToDelete) { bool bDelete(true); unsigned int iDeletedChannels(0); /* invalid group id */ if (group.GroupID() <= 0) { CLog::LogF(LOGERROR, "Invalid channel group id: %d", group.GroupID()); return false; } CSingleLock lock(m_critSection); while (iDeletedChannels < channelsToDelete.size()) { std::string strChannelsToDelete; for (unsigned int iChannelPtr = 0; iChannelPtr + iDeletedChannels < channelsToDelete.size() && iChannelPtr < 50; iChannelPtr++) strChannelsToDelete += StringUtils::Format(", %d", channelsToDelete.at(iDeletedChannels + iChannelPtr)); if (!strChannelsToDelete.empty()) { strChannelsToDelete.erase(0, 2); Filter filter; filter.AppendWhere(PrepareSQL("idGroup = %u", group.GroupID())); filter.AppendWhere(PrepareSQL("idChannel IN (%s)", strChannelsToDelete.c_str())); bDelete = DeleteValues("map_channelgroups_channels", filter) && bDelete; } iDeletedChannels += 50; } return bDelete; }
CPVRChannelGroupPtr CPVRChannelGroups::GetNextGroup(const CPVRChannelGroup &group) const { bool bReturnNext(false); { CSingleLock lock(m_critSection); for (std::vector<CPVRChannelGroupPtr>::const_iterator it = m_groups.begin(); it != m_groups.end(); it++) { // return this entry if (bReturnNext) return *it; // return the next entry if ((*it)->GroupID() == group.GroupID()) bReturnNext = true; } } // no match return GetGroupAll(); }
bool CPVRChannelGroups::DeleteGroup(const CPVRChannelGroup &group) { bool bReturn = false; CSingleLock lock(m_critSection); if (group.IsInternalGroup()) { CLog::Log(LOGERROR, "CPVRChannelGroups - %s - cannot delete internal group '%s'", __FUNCTION__, group.GroupName().c_str()); return bReturn; } CPVRDatabase *database = GetPVRDatabase(); if (!database) return bReturn; /* remove all channels from the group */ database->RemoveChannelsFromGroup(group); /* delete the group from the database */ bReturn = database->Delete(group); /* delete the group in this container */ for (unsigned int iGroupPtr = 0; iGroupPtr < size(); iGroupPtr++) { if (at(iGroupPtr)->GroupID() == group.GroupID()) { CPVRChannelGroup *selectedGroup = GetSelectedGroup(); if (selectedGroup && *selectedGroup == group) g_PVRManager.SetPlayingGroup(GetGroupAll()); delete at(iGroupPtr); erase(begin() + iGroupPtr); break; } } return bReturn; }
int CPVRDatabase::Get(CPVRChannelGroup &results, bool bCompressDB) { int iReturn(0); bool bIgnoreEpgDB = CServiceBroker::GetSettings()->GetBool(CSettings::SETTING_EPG_IGNOREDBFORCLIENT); std::string strQuery = PrepareSQL("SELECT channels.idChannel, channels.iUniqueId, channels.bIsRadio, channels.bIsHidden, channels.bIsUserSetIcon, channels.bIsUserSetName, " "channels.sIconPath, channels.sChannelName, channels.bIsVirtual, channels.bEPGEnabled, channels.sEPGScraper, channels.iLastWatched, channels.iClientId, channels.bIsLocked, " "map_channelgroups_channels.iChannelNumber, map_channelgroups_channels.iSubChannelNumber, channels.idEpg " "FROM map_channelgroups_channels " "LEFT JOIN channels ON channels.idChannel = map_channelgroups_channels.idChannel " "WHERE map_channelgroups_channels.idGroup = %u", results.GroupID()); CSingleLock lock(m_critSection); if (ResultQuery(strQuery)) { try { while (!m_pDS->eof()) { CPVRChannelPtr channel = CPVRChannelPtr(new CPVRChannel()); channel->m_iChannelId = m_pDS->fv("idChannel").get_asInt(); channel->m_iUniqueId = m_pDS->fv("iUniqueId").get_asInt(); channel->m_bIsRadio = m_pDS->fv("bIsRadio").get_asBool(); channel->m_bIsHidden = m_pDS->fv("bIsHidden").get_asBool(); channel->m_bIsUserSetIcon = m_pDS->fv("bIsUserSetIcon").get_asBool(); channel->m_bIsUserSetName = m_pDS->fv("bIsUserSetName").get_asBool(); channel->m_bIsLocked = m_pDS->fv("bIsLocked").get_asBool(); channel->m_strIconPath = m_pDS->fv("sIconPath").get_asString(); channel->m_strChannelName = m_pDS->fv("sChannelName").get_asString(); channel->m_bEPGEnabled = m_pDS->fv("bEPGEnabled").get_asBool(); channel->m_strEPGScraper = m_pDS->fv("sEPGScraper").get_asString(); channel->m_iLastWatched = static_cast<time_t>(m_pDS->fv("iLastWatched").get_asInt()); channel->m_iClientId = m_pDS->fv("iClientId").get_asInt(); channel->m_iEpgId = bIgnoreEpgDB ? -1 : m_pDS->fv("idEpg").get_asInt(); channel->UpdateEncryptionName(); PVRChannelGroupMember newMember(channel, CPVRChannelNumber(static_cast<unsigned int>(m_pDS->fv("iChannelNumber").get_asInt()), static_cast<unsigned int>(m_pDS->fv("iSubChannelNumber").get_asInt())), 0); results.m_sortedMembers.emplace_back(newMember); results.m_members.insert(std::make_pair(channel->StorageId(), newMember)); m_pDS->next(); ++iReturn; } m_pDS->close(); } catch (...) { CLog::LogF(LOGERROR, "Couldn't load channels from PVR database"); } } else { CLog::LogF(LOGERROR, "PVR database query failed"); } m_pDS->close(); if (iReturn > 0 && bCompressDB) Compress(true); return iReturn; }
bool CPVRDatabase::RemoveStaleChannelsFromGroup(const CPVRChannelGroup &group) { bool bDelete(true); /* invalid group id */ if (group.GroupID() <= 0) { CLog::LogF(LOGERROR, "Invalid channel group id: %d", group.GroupID()); return false; } CSingleLock lock(m_critSection); if (!group.IsInternalGroup()) { /* First remove channels that don't exist in the main channels table */ // XXX work around for frodo: fix this up so it uses one query for all db types // mysql doesn't support subqueries when deleting and sqlite doesn't support joins when deleting if (StringUtils::EqualsNoCase(g_advancedSettings.m_databaseTV.type, "mysql")) { const std::string strQuery = PrepareSQL("DELETE m FROM map_channelgroups_channels m LEFT JOIN channels c ON (c.idChannel = m.idChannel) WHERE c.idChannel IS NULL"); bDelete = ExecuteQuery(strQuery); } else { Filter filter; filter.AppendWhere("idChannel IN (SELECT m.idChannel FROM map_channelgroups_channels m LEFT JOIN channels on m.idChannel = channels.idChannel WHERE channels.idChannel IS NULL)"); bDelete = DeleteValues("map_channelgroups_channels", filter); } } if (group.HasChannels()) { std::vector<int> currentMembers; if (GetCurrentGroupMembers(group, currentMembers)) { std::vector<int> channelsToDelete; for (int iChannelId : currentMembers) { if (!group.IsGroupMember(iChannelId)) { int iClientId = GetClientIdByChannelId(iChannelId); if (iClientId == PVR_INVALID_CLIENT_ID || !group.IsMissingChannelsFromClient(iClientId)) { channelsToDelete.emplace_back(iChannelId); } } } if (!channelsToDelete.empty()) bDelete = DeleteChannelsFromGroup(group, channelsToDelete) && bDelete; } } else { Filter filter; filter.AppendWhere(PrepareSQL("idGroup = %u", group.GroupID())); bDelete = DeleteValues("map_channelgroups_channels", filter) && bDelete; } return bDelete; }
bool CPVRDatabase::GetCurrentGroupMembers(const CPVRChannelGroup &group, vector<int> &members) { bool bReturn(false); CStdString strCurrentMembersQuery = FormatSQL("SELECT idChannel FROM map_channelgroups_channels WHERE idGroup = %u", group.GroupID()); if (ResultQuery(strCurrentMembersQuery)) { try { while (!m_pDS->eof()) { members.push_back(m_pDS->fv("idChannel").get_asInt()); m_pDS->next(); } m_pDS->close(); bReturn = true; } catch (...) { CLog::Log(LOGERROR, "PVRDB - %s - couldn't load channels from the database", __FUNCTION__); } } return bReturn; }
bool CPVRDatabase::RemoveChannelsFromGroup(const CPVRChannelGroup &group) { CStdString strWhereClause = FormatSQL("idGroup = %u", group.GroupID()); return DeleteValues("map_channelgroups_channels", strWhereClause); }
int CPVRDatabase::Get(CPVRChannelGroup &group, const CPVRChannelGroup &allGroup) { int iReturn = -1; /* invalid group id */ if (group.GroupID() < 0) { CLog::LogF(LOGERROR, "Invalid channel group id: %d", group.GroupID()); return -1; } CSingleLock lock(m_critSection); const std::string strQuery = PrepareSQL("SELECT idChannel, iChannelNumber, iSubChannelNumber FROM map_channelgroups_channels " "WHERE idGroup = %u ORDER BY iChannelNumber", group.GroupID()); if (ResultQuery(strQuery)) { iReturn = 0; // create a map to speedup data lookup std::map<int, CPVRChannelPtr> allChannels; for (const auto& groupMember : allGroup.GetMembers()) { allChannels.insert(std::make_pair(groupMember.channel->ChannelID(), groupMember.channel)); } try { while (!m_pDS->eof()) { int iChannelId = m_pDS->fv("idChannel").get_asInt(); const auto& channel = allChannels.find(iChannelId); if (channel != allChannels.end()) { PVRChannelGroupMember newMember(channel->second, CPVRChannelNumber(static_cast<unsigned int>(m_pDS->fv("iChannelNumber").get_asInt()), static_cast<unsigned int>(m_pDS->fv("iSubChannelNumber").get_asInt())), 0); group.m_sortedMembers.emplace_back(newMember); group.m_members.insert(std::make_pair(channel->second->StorageId(), newMember)); ++iReturn; } else { // remove the channel from the table if it doesn't exist on client (anymore) int iClientId = GetClientIdByChannelId(iChannelId); if (iClientId == PVR_INVALID_CLIENT_ID || !allGroup.IsMissingChannelsFromClient(iClientId)) { Filter filter; filter.AppendWhere(PrepareSQL("idGroup = %u", group.GroupID())); filter.AppendWhere(PrepareSQL("idChannel = %u", iChannelId)); DeleteValues("map_channelgroups_channels", filter); } } m_pDS->next(); } m_pDS->close(); } catch(...) { CLog::LogF(LOGERROR, "Failed to get channels"); } } if (iReturn > 0) group.SortByChannelNumber(); return iReturn; }
bool CGUIWindowFullScreen::OnMessage(CGUIMessage& message) { switch (message.GetMessage()) { case GUI_MSG_WINDOW_INIT: { // check whether we've come back here from a window during which time we've actually // stopped playing videos if (message.GetParam1() == WINDOW_INVALID && !g_application.IsPlayingVideo()) { // why are we here if nothing is playing??? g_windowManager.PreviousWindow(); return true; } g_infoManager.SetShowInfo(false); g_infoManager.SetShowCodec(false); m_bShowCurrentTime = false; m_bGroupSelectShow = false; g_infoManager.SetDisplayAfterSeek(0); // Make sure display after seek is off. // switch resolution g_graphicsContext.SetFullScreenVideo(true); #ifdef HAS_VIDEO_PLAYBACK // make sure renderer is uptospeed g_renderManager.Update(false); #endif // now call the base class to load our windows CGUIWindow::OnMessage(message); m_bShowViewModeInfo = false; if (CUtil::IsUsingTTFSubtitles()) { CSingleLock lock (m_fontLock); CStdString fontPath = "special://xbmc/media/Fonts/"; fontPath += g_guiSettings.GetString("subtitles.font"); // We scale based on PAL4x3 - this at least ensures all sizing is constant across resolutions. CGUIFont *subFont = g_fontManager.LoadTTF("__subtitle__", fontPath, color[g_guiSettings.GetInt("subtitles.color")], 0, g_guiSettings.GetInt("subtitles.height"), g_guiSettings.GetInt("subtitles.style"), false, 1.0f, 1.0f, RES_PAL_4x3, true); CGUIFont *borderFont = g_fontManager.LoadTTF("__subtitleborder__", fontPath, 0xFF000000, 0, g_guiSettings.GetInt("subtitles.height"), g_guiSettings.GetInt("subtitles.style"), true, 1.0f, 1.0f, RES_PAL_4x3, true); if (!subFont || !borderFont) CLog::Log(LOGERROR, "CGUIWindowFullScreen::OnMessage(WINDOW_INIT) - Unable to load subtitle font"); else m_subsLayout = new CGUITextLayout(subFont, true, 0, borderFont); } else m_subsLayout = NULL; return true; } case GUI_MSG_WINDOW_DEINIT: { CGUIWindow::OnMessage(message); CGUIDialog *pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_OSD_TELETEXT); if (pDialog) pDialog->Close(true); CGUIDialogSlider *slider = (CGUIDialogSlider *)g_windowManager.GetWindow(WINDOW_DIALOG_SLIDER); if (slider) slider->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_VIDEO_OSD); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_FULLSCREEN_INFO); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_OSD_CHANNELS); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_OSD_GUIDE); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_OSD_DIRECTOR); if (pDialog) pDialog->Close(true); pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_OSD_CUTTER); if (pDialog) pDialog->Close(true); FreeResources(true); CSingleLock lock (g_graphicsContext); g_graphicsContext.SetFullScreenVideo(false); lock.Leave(); #ifdef HAS_VIDEO_PLAYBACK // make sure renderer is uptospeed g_renderManager.Update(false); #endif CSingleLock lockFont(m_fontLock); if (m_subsLayout) { g_fontManager.Unload("__subtitle__"); g_fontManager.Unload("__subtitleborder__"); delete m_subsLayout; m_subsLayout = NULL; } return true; } case GUI_MSG_CLICKED: { unsigned int iControl = message.GetSenderId(); if (iControl == CONTROL_GROUP_CHOOSER) { // Get the currently selected label of the Select button CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), iControl); OnMessage(msg); CStdString strLabel = msg.GetLabel(); if (msg.GetParam1() != 0) { const CPVRChannelGroups *groups = CPVRManager::GetChannelGroups()->Get(CPVRManager::GetClients()->IsPlayingRadio()); CPVRChannelGroup *selectedGroup = (CPVRChannelGroup *) groups->GetByName(strLabel); // Switch to the first channel of the new group if the new group ID is // different from the current one. if (selectedGroup && *selectedGroup != *CPVRManager::Get()->GetPlayingGroup(selectedGroup->IsRadio())) { CPVRManager::Get()->SetPlayingGroup(selectedGroup); OnAction(CAction(ACTION_CHANNEL_SWITCH, (float) groups->GetFirstChannelForGroupID(selectedGroup->GroupID()))); } // hide the control and reset focus m_bGroupSelectShow = false; SET_CONTROL_HIDDEN(CONTROL_GROUP_CHOOSER); // SET_CONTROL_FOCUS(0, 0); } return true; } break; } case GUI_MSG_SETFOCUS: case GUI_MSG_LOSTFOCUS: if (message.GetSenderId() != WINDOW_FULLSCREEN_VIDEO) return true; break; } return CGUIWindow::OnMessage(message); }