|
MythTV
0.26-pre
|
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: */
1.7.6.1