MythTV  0.26-pre
iptvchannel.cpp
Go to the documentation of this file.
00001 
00007 #include "iptvchannel.h"
00008 
00009 // MythTV headers
00010 #include "mythdb.h"
00011 #include "mythlogging.h"
00012 #include "iptvchannelfetcher.h"
00013 #include "iptvfeederwrapper.h"
00014 
00015 #define LOC QString("IPTVChan(%1): ").arg(GetCardID())
00016 
00017 IPTVChannel::IPTVChannel(TVRec         *parent,
00018                          const QString &videodev)
00019     : DTVChannel(parent),
00020       m_videodev(videodev),
00021       m_feeder(new IPTVFeederWrapper()),
00022       m_lock(QMutex::Recursive)
00023 {
00024     m_videodev.detach();
00025     LOG(VB_CHANNEL, LOG_INFO, LOC + "ctor");
00026 }
00027 
00028 IPTVChannel::~IPTVChannel()
00029 {
00030     LOG(VB_CHANNEL, LOG_INFO, LOC + "dtor -- begin");
00031     if (m_feeder)
00032     {
00033         delete m_feeder;
00034         m_feeder = NULL;
00035     }
00036     LOG(VB_CHANNEL, LOG_INFO, LOC + "dtor -- end");
00037 }
00038 
00039 bool IPTVChannel::Open(void)
00040 {
00041     LOG(VB_CHANNEL, LOG_INFO, LOC + "Open() -- begin");
00042     QMutexLocker locker(&m_lock);
00043     LOG(VB_CHANNEL, LOG_INFO, LOC + "Open() -- locked");
00044 
00045     if (!InitializeInputs())
00046     {
00047         LOG(VB_GENERAL, LOG_ERR, LOC + "InitializeInputs() failed");
00048         return false;
00049     }
00050 
00051     if (m_freeboxchannels.empty())
00052     {
00053         QString content = IPTVChannelFetcher::DownloadPlaylist(
00054             m_videodev, true);
00055         m_freeboxchannels = IPTVChannelFetcher::ParsePlaylist(content);
00056         LOG(VB_GENERAL, LOG_NOTICE, LOC + QString("Loaded %1 channels from %2")
00057             .arg(m_freeboxchannels.size()) .arg(m_videodev));
00058     }
00059 
00060     LOG(VB_CHANNEL, LOG_INFO, LOC + "Open() -- end");
00061     return !m_freeboxchannels.empty();
00062 }
00063 
00064 void IPTVChannel::Close(void)
00065 {
00066     LOG(VB_CHANNEL, LOG_INFO, LOC + "Close() -- begin");
00067     QMutexLocker locker(&m_lock);
00068     LOG(VB_CHANNEL, LOG_INFO, LOC + "Close() -- locked");
00069     //m_freeboxchannels.clear();
00070     LOG(VB_CHANNEL, LOG_INFO, LOC + "Close() -- end");
00071 }
00072 
00073 bool IPTVChannel::IsOpen(void) const
00074 {
00075     LOG(VB_CHANNEL, LOG_INFO, LOC + "IsOpen() -- begin");
00076     QMutexLocker locker(&m_lock);
00077     LOG(VB_CHANNEL, LOG_INFO, LOC + "IsOpen() -- locked");
00078     LOG(VB_CHANNEL, LOG_INFO, LOC + "IsOpen() -- end");
00079     return !m_freeboxchannels.empty();
00080 }
00081 
00082 bool IPTVChannel::SetChannelByString(const QString &channum)
00083 {
00084     LOG(VB_CHANNEL, LOG_INFO, LOC + QString("SetChannelByString(%1) -- begin")
00085         .arg(channum));
00086     QMutexLocker locker(&m_lock);
00087     LOG(VB_CHANNEL, LOG_INFO, LOC + "SetChannelByString() -- locked");
00088 
00089     InputMap::const_iterator it = m_inputs.find(m_currentInputID);
00090     if (it == m_inputs.end())
00091         return false;
00092 
00093     uint mplexid_restriction;
00094     if (!IsInputAvailable(m_currentInputID, mplexid_restriction))
00095         return false;
00096 
00097     // Verify that channel exists
00098     if (!GetChanInfo(channum).isValid())
00099     {
00100         LOG(VB_GENERAL, LOG_ERR, LOC +
00101                 QString("SetChannelByString(%1)").arg(channum) +
00102                 " Invalid channel");
00103         return false;
00104     }
00105 
00106     // Set the current channum to the new channel's channum
00107     QString tmp = channum; tmp.detach();
00108     m_curchannelname = tmp;
00109 
00110     // Set the dtv channel info for any additional multiplex tuning
00111     SetDTVInfo(/*atsc_major*/ 0, /*atsc_minor*/ 0,
00112                /*netid*/ 0,
00113                /*tsid*/ 0, /*mpeg_prog_num*/ 1);
00114 
00115     HandleScript(channum /* HACK treat channum as freqid */);
00116 
00117     LOG(VB_CHANNEL, LOG_INFO, LOC + QString("SetChannelByString(%1) = %2 -- end")
00118         .arg(channum).arg(m_curchannelname));
00119     return true;
00120 }
00121 
00122 IPTVChannelInfo IPTVChannel::GetChanInfo(
00123     const QString &channum, uint sourceid) const
00124 {
00125     LOG(VB_CHANNEL, LOG_INFO, LOC + "GetChanInfo() -- begin");
00126     QMutexLocker locker(&m_lock);
00127     LOG(VB_CHANNEL, LOG_INFO, LOC + "GetChanInfo() -- locked");
00128 
00129     IPTVChannelInfo dummy;
00130     QString msg = LOC + QString("GetChanInfo(%1) failed").arg(channum);
00131 
00132     if (channum.isEmpty())
00133     {
00134         LOG(VB_GENERAL, LOG_ERR, msg);
00135         return dummy;
00136     }
00137 
00138     if (!sourceid)
00139     {
00140         InputMap::const_iterator it = m_inputs.find(m_currentInputID);
00141         if (it == m_inputs.end())
00142         {
00143             LOG(VB_GENERAL, LOG_ERR, msg);
00144             return dummy;
00145         }
00146         sourceid = (*it)->sourceid;
00147     }
00148 
00149     MSqlQuery query(MSqlQuery::InitCon());
00150     query.prepare(
00151         "SELECT name "
00152         "FROM channel "
00153         "WHERE channum  = :CHANNUM AND "
00154         "      sourceid = :SOURCEID");
00155 
00156     query.bindValue(":CHANNUM",  channum);
00157     query.bindValue(":SOURCEID", sourceid);
00158 
00159     if (!query.exec() || !query.isActive())
00160     {
00161         MythDB::DBError("fetching chaninfo", query);
00162         LOG(VB_GENERAL, LOG_ERR, msg);
00163         return dummy;
00164     }
00165 
00166     while (query.next())
00167     {
00168         fbox_chan_map_t::const_iterator it;
00169         it = m_freeboxchannels.find(channum);
00170         if (it != m_freeboxchannels.end())
00171         {
00172             LOG(VB_CHANNEL, LOG_DEBUG, LOC +
00173                 QString("Found: %1").arg((*it).toString()));
00174             return *it;
00175         }
00176 
00177         // Try to map name to a channel in the map
00178         const QString name = query.value(0).toString();
00179         for (it = m_freeboxchannels.begin();
00180              it != m_freeboxchannels.end(); ++it)
00181         {
00182             if ((*it).m_name == name)
00183             {
00184                 LOG(VB_CHANNEL, LOG_DEBUG, LOC +
00185                     QString("Found: %1").arg((*it).toString()));
00186                 return *it;
00187             }
00188         }
00189         LOG(VB_CHANNEL, LOG_DEBUG, LOC + QString("Not Found"));
00190     }
00191 
00192     LOG(VB_GENERAL, LOG_ERR, msg);
00193     return dummy;
00194 }
00195 
00196 /* vim: set expandtab tabstop=4 shiftwidth=4: */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends