MythTV  0.26-pre
channelgroup.cpp
Go to the documentation of this file.
00001 // c++
00002 #include <algorithm>
00003 
00004 // mythtv
00005 #include "mythlogging.h"
00006 #include "mythdb.h"
00007 #include "channelgroup.h"
00008 
00009 #define LOC QString("Channel Group: ")
00010 
00011 ChannelGroupItem& ChannelGroupItem::operator=(const ChannelGroupItem &other)
00012 {
00013     grpid     = other.grpid;
00014     name      = (other.name);
00015 
00016     return *this;
00017 }
00018 
00019 inline bool lt_group(const ChannelGroupItem &a, const ChannelGroupItem &b)
00020 {
00021     return QString::localeAwareCompare(a.name, b.name) < 0;
00022 }
00023 
00024 bool ChannelGroup::ToggleChannel(uint chanid, int changrpid, int delete_chan)
00025 {
00026     // Check if it already exists for that chanid...
00027     MSqlQuery query(MSqlQuery::InitCon());
00028     query.prepare(
00029         "SELECT channelgroup.id "
00030         "FROM channelgroup "
00031         "WHERE channelgroup.chanid = :CHANID AND "
00032         "channelgroup.grpid = :GRPID "
00033         "LIMIT 1");
00034     query.bindValue(":CHANID", chanid);
00035     query.bindValue(":GRPID", changrpid);
00036 
00037     if (!query.exec())
00038     {
00039         MythDB::DBError("ChannelGroup::ToggleChannel", query);
00040         return false;
00041     }
00042     else if (query.next() && delete_chan)
00043     {
00044         // We have a record...Remove it to toggle...
00045         QString id = query.value(0).toString();
00046         query.prepare("DELETE FROM channelgroup WHERE id = :CHANID");
00047         query.bindValue(":CHANID", id);
00048         if (!query.exec())
00049             MythDB::DBError("ChannelGroup::ToggleChannel -- delete", query);
00050         LOG(VB_GENERAL, LOG_INFO, LOC +
00051             QString("Removing channel with id=%1.").arg(id));
00052     }
00053     else if (query.size() == 0)
00054     {
00055         // We have no record...Add one to toggle...
00056         query.prepare("INSERT INTO channelgroup (chanid,grpid) "
00057                       "VALUES (:CHANID, :GRPID)");
00058         query.bindValue(":CHANID", chanid);
00059         query.bindValue(":GRPID", changrpid);
00060         if (!query.exec())
00061             MythDB::DBError("ChannelGroup::ToggleChannel -- insert", query);
00062         LOG(VB_GENERAL, LOG_INFO, LOC +
00063             QString("Adding channel %1 to group %2.")
00064                  .arg(chanid).arg(changrpid));
00065     }
00066 
00067     return true;
00068 }
00069 
00070 bool ChannelGroup::AddChannel(uint chanid, int changrpid)
00071 {
00072     // Check if it already exists for that chanid...
00073     MSqlQuery query(MSqlQuery::InitCon());
00074     query.prepare(
00075         "SELECT channelgroup.id "
00076         "FROM channelgroup "
00077         "WHERE channelgroup.chanid = :CHANID AND "
00078         "channelgroup.grpid = :GRPID "
00079         "LIMIT 1");
00080     query.bindValue(":CHANID", chanid);
00081     query.bindValue(":GRPID", changrpid);
00082 
00083     if (!query.exec())
00084     {
00085         MythDB::DBError("ChannelGroup::AddChannel", query);
00086         return false;
00087     }
00088     else if (query.size() == 0)
00089     {
00090         // We have no record...Add one to toggle...
00091         query.prepare("INSERT INTO channelgroup (chanid,grpid) "
00092                       "VALUES (:CHANID, :GRPID)");
00093         query.bindValue(":CHANID", chanid);
00094         query.bindValue(":GRPID", changrpid);
00095         if (!query.exec())
00096             MythDB::DBError("ChannelGroup::AddChannel -- insert", query);
00097         LOG(VB_GENERAL, LOG_INFO, LOC +
00098             QString("Adding channel %1 to group %2.")
00099                  .arg(chanid).arg(changrpid));
00100     }
00101 
00102     return true;
00103 }
00104 
00105 bool ChannelGroup::DeleteChannel(uint chanid, int changrpid)
00106 {
00107     // Check if it already exists for that chanid...
00108     MSqlQuery query(MSqlQuery::InitCon());
00109     query.prepare(
00110         "SELECT channelgroup.id "
00111         "FROM channelgroup "
00112         "WHERE channelgroup.chanid = :CHANID AND "
00113         "channelgroup.grpid = :GRPID "
00114         "LIMIT 1");
00115     query.bindValue(":CHANID", chanid);
00116     query.bindValue(":GRPID", changrpid);
00117 
00118     if (!query.exec())
00119     {
00120         MythDB::DBError("ChannelGroup::DeleteChannel", query);
00121         return false;
00122     }
00123     else if (query.next())
00124     {
00125         // We have a record...Remove it to toggle...
00126         QString id = query.value(0).toString();
00127         query.prepare("DELETE FROM channelgroup WHERE id = :CHANID");
00128         query.bindValue(":CHANID", id);
00129         if (!query.exec())
00130             MythDB::DBError("ChannelGroup::DeleteChannel -- delete", query);
00131         LOG(VB_GENERAL, LOG_INFO, LOC +
00132             QString("Removing channel with id=%1.").arg(id));
00133     }
00134 
00135     return true;
00136 }
00137 
00138 ChannelGroupList ChannelGroup::GetChannelGroups(bool includeEmpty)
00139 {
00140     ChannelGroupList list;
00141 
00142     MSqlQuery query(MSqlQuery::InitCon());
00143 
00144     QString qstr;
00145 
00146     if (includeEmpty)
00147         qstr = "SELECT grpid, name FROM channelgroupnames ORDER BY name";
00148     else
00149         qstr = "SELECT DISTINCT t1.grpid, name FROM channelgroupnames t1,channelgroup t2 "
00150                "WHERE t1.grpid = t2.grpid ORDER BY name";
00151 
00152     query.prepare(qstr);
00153 
00154     if (!query.exec())
00155         MythDB::DBError("ChannelGroup::GetChannelGroups", query);
00156     else
00157     {
00158         while (query.next())
00159         {
00160            ChannelGroupItem group(query.value(0).toUInt(),
00161                               query.value(1).toString());
00162            list.push_back(group);
00163         }
00164     }
00165 
00166     return list;
00167 }
00168 
00169 // Cycle through the available groups, then all channels
00170 // Will cycle through to end then return -1
00171 // To signify all channels.
00172 int ChannelGroup::GetNextChannelGroup(const ChannelGroupList &sorted, int grpid)
00173 {
00174     // If no groups return -1 for all channels
00175     if (sorted.empty())
00176       return -1;
00177 
00178     // If grpid is all channels (-1), then return the first grpid
00179     if (grpid == -1)
00180       return sorted[0].grpid;
00181 
00182     ChannelGroupList::const_iterator it = find(sorted.begin(), sorted.end(), grpid);
00183 
00184     // If grpid is not in the list, return -1 for all channels
00185     if (it == sorted.end())
00186         return -1;
00187 
00188     ++it;
00189 
00190     // If we reached the end, the next option is all channels (-1)
00191     if (it == sorted.end())
00192        return -1;
00193 
00194     return it->grpid;
00195 }
00196 
00197 QString ChannelGroup::GetChannelGroupName(int grpid)
00198 {
00199     // All Channels
00200     if (grpid == -1)
00201         return QObject::tr("All Channels");
00202 
00203     MSqlQuery query(MSqlQuery::InitCon());
00204     query.prepare("SELECT name FROM channelgroupnames WHERE grpid = :GROUPID");
00205     query.bindValue(":GROUPID", grpid);
00206 
00207     if (!query.exec())
00208         MythDB::DBError("ChannelGroup::GetChannelGroups", query);
00209     else if (query.next())
00210         return query.value(0).toString();
00211 
00212     return "";
00213 }
00214 
00215 int ChannelGroup::GetChannelGroupId(QString changroupname)
00216 {
00217     // All Channels
00218     if (changroupname == "All Channels")
00219       return -1;
00220 
00221     MSqlQuery query(MSqlQuery::InitCon());
00222 
00223     query.prepare("SELECT grpid FROM channelgroupnames "
00224                   "WHERE name = :GROUPNAME");
00225     query.bindValue(":GROUPNAME", changroupname);
00226 
00227     if (!query.exec())
00228         MythDB::DBError("ChannelGroup::GetChannelGroups", query);
00229     else if (query.next())
00230         return query.value(0).toUInt();
00231 
00232     return 0;
00233 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends