MythTV  master
channeldata.cpp
Go to the documentation of this file.
1 // C++ headers
2 #include <iostream>
3 #include <cstdlib>
4 
5 // Qt headers
6 #include <QRegExp>
7 #include <QDir>
8 #include <QFile>
9 
10 // libmythbase headers
11 #include "mythdownloadmanager.h"
12 
13 // libmyth headers
14 #include "mythlogging.h"
15 #include "mythdb.h"
16 #include "mythmiscutil.h"
17 
18 // libmythtv headers
19 #include "channelutil.h"
20 #include "frequencytables.h"
21 #include "cardutil.h"
22 #include "sourceutil.h"
23 
24 // filldata headers
25 #include "channeldata.h"
26 #include "fillutil.h"
27 
28 static void get_atsc_stuff(const QString& channum, int sourceid, int freqid,
29  int &major, int &minor, long long &freq)
30 {
31  major = freqid;
32  minor = 0;
33 
34  int chansep = channum.indexOf(QRegExp("\\D"));
35  if (chansep < 0)
36  return;
37 
38  major = channum.left(chansep).toInt();
39  minor = channum.right(channum.length() - (chansep + 1)).toInt();
40 
41  freq = get_center_frequency("atsc", "vsb8", "us", freqid);
42 
43  // Check if this is connected to an HDTV card.
45  query.prepare(
46  "SELECT cardtype "
47  "FROM capturecard "
48  "WHERE sourceid = :SOURCEID");
49  query.bindValue(":SOURCEID", sourceid);
50 
51  if (query.exec() && query.isActive() && query.next() &&
52  query.value(0).toString() == "HDTV")
53  {
54  freq -= 1750000; // convert to visual carrier freq.
55  }
56 }
57 
58 bool ChannelData::insert_chan(uint sourceid) const
59 {
60  bool insert_channels = m_channelUpdates;
61  if (!insert_channels)
62  {
63  bool isEncoder = false;
64  bool isUnscanable = false;
65  bool isCableCard = SourceUtil::IsCableCardPresent(sourceid);
66  if (m_cardType.isEmpty())
67  {
68  isEncoder = SourceUtil::IsEncoder(sourceid);
69  isUnscanable = SourceUtil::IsUnscanable(sourceid);
70  }
71  else
72  {
73  isEncoder = CardUtil::IsEncoder(m_cardType);
74  isUnscanable = CardUtil::IsUnscanable(m_cardType);
75  }
76  insert_channels = (isCableCard || isEncoder || isUnscanable);
77  }
78 
79  return insert_channels;
80 }
81 
82 
84  ChannelInfoList::iterator chaninfo, unsigned int chanid) const
85 {
86  (*chaninfo).m_name = getResponse(QObject::tr("Choose a channel name (any string, "
87  "long version) "),(*chaninfo).m_name);
88  (*chaninfo).m_callSign = getResponse(QObject::tr("Choose a channel callsign (any string, "
89  "short version) "),(*chaninfo).m_callSign);
90 
91  if (m_channelPreset)
92  {
93  (*chaninfo).m_chanNum = getResponse(QObject::tr("Choose a channel preset (0..999) "),
94  (*chaninfo).m_chanNum);
95  (*chaninfo).m_freqId = getResponse(QObject::tr("Choose a frequency id "),
96  (*chaninfo).m_freqId);
97  }
98  else
99  {
100  (*chaninfo).m_chanNum = getResponse(QObject::tr("Choose a channel number "),
101  (*chaninfo).m_chanNum);
102  (*chaninfo).m_freqId = (*chaninfo).m_chanNum;
103  }
104 
105  (*chaninfo).m_fineTune = getResponse(QObject::tr("Choose a channel fine tune offset "),
106  QString::number((*chaninfo).m_fineTune)).toInt();
107 
108  (*chaninfo).m_tvFormat = getResponse(QObject::tr("Choose a TV format "
109  "(PAL/SECAM/NTSC/ATSC/Default) "),
110  (*chaninfo).m_tvFormat);
111 
112  (*chaninfo).m_icon = getResponse(QObject::tr("Choose a channel icon image "
113  "(relative path to icon storage group) "),
114  (*chaninfo).m_icon);
115 
116  return(chanid);
117 }
118 
119 QString ChannelData::normalizeChannelKey(const QString &chanName)
120 {
121  QString result = chanName;
122 
123  // Lowercase
124  result = result.toLower();
125  // Strip all whitespace
126  result = result.replace(" ", "");
127 
128  return result;
129 }
130 
132 {
133  ChannelList retList;
134 
135  uint avail = 0;
139  sourceId);
140 
141  for (auto & channel : channelList)
142  {
143  QString chanName = channel.m_name;
144  QString key = normalizeChannelKey(chanName);
145  retList.insert(key, channel);
146  }
147 
148  return retList;
149 }
150 
152  ChannelList existingChannels)
153 {
154  ChannelList::iterator it;
155  for (it = existingChannels.begin(); it != existingChannels.end(); ++it)
156  {
157  if ((*it).m_xmltvId == chanInfo.m_xmltvId)
158  return (*it);
159  }
160 
161  QString searchKey = normalizeChannelKey(chanInfo.m_name);
162  ChannelInfo existChan = existingChannels.value(searchKey);
163 
164  if (existChan.m_chanId < 1)
165  {
166  // Check if it is ATSC
167  int chansep = chanInfo.m_chanNum.indexOf(QRegExp("\\D"));
168  if (chansep > 0)
169  {
170  // Populate xmltvid for scanned ATSC channels
171  uint major = chanInfo.m_chanNum.left(chansep).toInt();
172  uint minor = chanInfo.m_chanNum.right
173  (chanInfo.m_chanNum.length() - (chansep + 1)).toInt();
174 
175  for (it = existingChannels.begin();
176  it != existingChannels.end(); ++it)
177  {
178  if ((*it).m_atscMajorChan == major &&
179  (*it).m_atscMinorChan == minor)
180  return (*it);
181  }
182  }
183  }
184 
185  return existChan;
186 }
187 
188 void ChannelData::handleChannels(int id, ChannelInfoList *chanlist) const
189 {
190  if (m_guideDataOnly)
191  {
192  LOG(VB_GENERAL, LOG_NOTICE, "Skipping Channel Updates");
193  return;
194  }
195 
196  ChannelList existingChannels = channelList(id);
197  QString fileprefix = SetupIconCacheDirectory();
198 
199  QDir::setCurrent(fileprefix);
200 
201  fileprefix += "/";
202 
203  bool insertChan = insert_chan(id); // unscannable source
204 
205  auto i = chanlist->begin();
206  for (; i != chanlist->end(); ++i)
207  {
208  if ((*i).m_xmltvId.isEmpty())
209  continue;
210 
211  QString localfile;
212 
213  if (!(*i).m_icon.isEmpty())
214  {
215  QDir remotefile = QDir((*i).m_icon);
216  QString filename = remotefile.dirName();
217 
218  localfile = fileprefix + filename;
219  QFile actualfile(localfile);
220  if (!actualfile.exists() &&
221  !GetMythDownloadManager()->download((*i).m_icon, localfile))
222  {
223  LOG(VB_GENERAL, LOG_ERR,
224  QString("Failed to fetch icon from '%1'")
225  .arg((*i).m_icon));
226  }
227 
228  localfile = filename;
229  }
230 
232 
233  if (!(*i).m_oldXmltvId.isEmpty())
234  {
235  query.prepare(
236  "SELECT xmltvid "
237  "FROM channel "
238  "WHERE xmltvid = :XMLTVID");
239  query.bindValue(":XMLTVID", (*i).m_oldXmltvId);
240 
241  if (!query.exec())
242  {
243  MythDB::DBError("xmltvid conversion 1", query);
244  }
245  else if (query.next())
246  {
247  LOG(VB_GENERAL, LOG_INFO,
248  QString("Converting old xmltvid (%1) to new (%2)")
249  .arg((*i).m_oldXmltvId).arg((*i).m_xmltvId));
250 
251  query.prepare("UPDATE channel "
252  "SET xmltvid = :NEWXMLTVID"
253  "WHERE xmltvid = :OLDXMLTVID");
254  query.bindValue(":NEWXMLTVID", (*i).m_xmltvId);
255  query.bindValue(":OLDXMLTVID", (*i).m_oldXmltvId);
256 
257  if (!query.exec())
258  {
259  MythDB::DBError("xmltvid conversion 2", query);
260  }
261  }
262  }
263 
264  ChannelInfo dbChan = FindMatchingChannel(*i, existingChannels);
265  if (dbChan.m_chanId > 0) // Channel exists, updating
266  {
267  LOG(VB_XMLTV, LOG_NOTICE,
268  QString("Match found for xmltvid %1 to channel %2 (%3)")
269  .arg((*i).m_xmltvId).arg(dbChan.m_name).arg(dbChan.m_chanId));
270  if (m_interactive)
271  {
272 
273  cout << "### " << endl;
274  cout << "### Existing channel found" << endl;
275  cout << "### " << endl;
276  cout << "### xmltvid = "
277  << (*i).m_xmltvId.toLocal8Bit().constData() << endl;
278  cout << "### chanid = "
279  << dbChan.m_chanId << endl;
280  cout << "### name = "
281  << dbChan.m_name.toLocal8Bit().constData() << endl;
282  cout << "### callsign = "
283  << dbChan.m_callSign.toLocal8Bit().constData() << endl;
284  cout << "### channum = "
285  << dbChan.m_chanNum.toLocal8Bit().constData() << endl;
286  if (m_channelPreset)
287  {
288  cout << "### freqid = "
289  << dbChan.m_freqId.toLocal8Bit().constData() << endl;
290  }
291  cout << "### finetune = "
292  << dbChan.m_fineTune << endl;
293  cout << "### tvformat = "
294  << dbChan.m_tvFormat.toLocal8Bit().constData() << endl;
295  cout << "### icon = "
296  << dbChan.m_icon.toLocal8Bit().constData() << endl;
297  cout << "### " << endl;
298 
299  // The only thing the xmltv data supplies here is the icon
300  (*i).m_name = dbChan.m_name;
301  (*i).m_callSign = dbChan.m_callSign;
302  (*i).m_chanNum = dbChan.m_chanNum;
303  (*i).m_fineTune = dbChan.m_fineTune;
304  (*i).m_freqId = dbChan.m_freqId;
305  (*i).m_tvFormat = dbChan.m_tvFormat;
306 
308 
309  if ((*i).m_callSign.isEmpty())
310  (*i).m_callSign = dbChan.m_name;
311 
312  if (dbChan.m_name != (*i).m_name ||
313  dbChan.m_callSign != (*i).m_callSign ||
314  dbChan.m_chanNum != (*i).m_chanNum ||
315  dbChan.m_fineTune != (*i).m_fineTune ||
316  dbChan.m_freqId != (*i).m_freqId ||
317  dbChan.m_icon != localfile ||
318  dbChan.m_tvFormat != (*i).m_tvFormat)
319  {
320  MSqlQuery subquery(MSqlQuery::InitCon());
321  subquery.prepare("UPDATE channel SET chanid = :CHANID, "
322  "name = :NAME, callsign = :CALLSIGN, "
323  "channum = :CHANNUM, finetune = :FINE, "
324  "icon = :ICON, freqid = :FREQID, "
325  "tvformat = :TVFORMAT "
326  " WHERE xmltvid = :XMLTVID "
327  "AND sourceid = :SOURCEID;");
328  subquery.bindValue(":CHANID", dbChan.m_chanId);
329  subquery.bindValue(":NAME", (*i).m_name);
330  subquery.bindValue(":CALLSIGN", (*i).m_callSign);
331  subquery.bindValue(":CHANNUM", (*i).m_chanNum);
332  subquery.bindValue(":FINE", (*i).m_fineTune);
333  subquery.bindValue(":ICON", localfile);
334  subquery.bindValue(":FREQID", (*i).m_freqId);
335  subquery.bindValue(":TVFORMAT", (*i).m_tvFormat);
336  subquery.bindValue(":XMLTVID", (*i).m_xmltvId);
337  subquery.bindValue(":SOURCEID", id);
338 
339  if (!subquery.exec())
340  {
341  MythDB::DBError("update failed", subquery);
342  }
343  else
344  {
345  cout << "### " << endl;
346  cout << "### Change performed" << endl;
347  cout << "### " << endl;
348  }
349  }
350  else
351  {
352  cout << "### " << endl;
353  cout << "### Nothing changed" << endl;
354  cout << "### " << endl;
355  }
356  }
357  else if ((dbChan.m_icon != localfile) ||
358  (dbChan.m_xmltvId != (*i).m_xmltvId))
359  {
360  LOG(VB_XMLTV, LOG_NOTICE, QString("Updating channel %1 (%2)")
361  .arg(dbChan.m_name).arg(dbChan.m_chanId));
362 
363  if (localfile.isEmpty())
364  localfile = dbChan.m_icon;
365 
366  if (dbChan.m_xmltvId != (*i).m_xmltvId)
367  {
368  MSqlQuery subquery(MSqlQuery::InitCon());
369 
370  subquery.prepare("UPDATE channel SET icon = :ICON "
371  ", xmltvid:= :XMLTVID WHERE "
372  "chanid = :CHANID;");
373  subquery.bindValue(":ICON", localfile);
374  subquery.bindValue(":XMLTVID", (*i).m_xmltvId);
375  subquery.bindValue(":CHANID", dbChan.m_chanId);
376 
377  if (!subquery.exec())
378  MythDB::DBError("Channel icon change", subquery);
379  }
380  else
381  {
382  MSqlQuery subquery(MSqlQuery::InitCon());
383  subquery.prepare("UPDATE channel SET icon = :ICON WHERE "
384  "chanid = :CHANID;");
385  subquery.bindValue(":ICON", localfile);
386  subquery.bindValue(":CHANID", dbChan.m_chanId);
387 
388  if (!subquery.exec())
389  MythDB::DBError("Channel icon change", subquery);
390  }
391 
392  }
393  }
394  else if (insertChan) // Only insert channels for non-scannable sources
395  {
396  int major = 0;
397  int minor = 0;
398  long long freq = 0;
399  get_atsc_stuff((*i).m_chanNum, id, (*i).m_freqId.toInt(), major, minor, freq);
400 
401  if (m_interactive && ((minor == 0) || (freq > 0)))
402  {
403  cout << "### " << endl;
404  cout << "### New channel found" << endl;
405  cout << "### " << endl;
406  cout << "### name = "
407  << (*i).m_name.toLocal8Bit().constData() << endl;
408  cout << "### callsign = "
409  << (*i).m_callSign.toLocal8Bit().constData() << endl;
410  cout << "### channum = "
411  << (*i).m_chanNum.toLocal8Bit().constData() << endl;
412  if (m_channelPreset)
413  {
414  cout << "### freqid = "
415  << (*i).m_freqId.toLocal8Bit().constData() << endl;
416  }
417  cout << "### finetune = "
418  << (*i).m_fineTune << endl;
419  cout << "### tvformat = "
420  << (*i).m_tvFormat.toLocal8Bit().constData() << endl;
421  cout << "### icon = "
422  << localfile.toLocal8Bit().constData() << endl;
423  cout << "### " << endl;
424 
425  uint chanid = promptForChannelUpdates(i,0);
426 
427  if ((*i).m_callSign.isEmpty())
428  (*i).m_callSign = QString::number(chanid);
429 
430  int mplexid = 0;
431  if ((chanid > 0) && (minor > 0))
432  mplexid = ChannelUtil::CreateMultiplex(id, "atsc",
433  freq, "8vsb");
434 
435  if (((mplexid > 0) || ((minor == 0) && (chanid > 0))) &&
437  mplexid, id, chanid,
438  (*i).m_callSign, (*i).m_name, (*i).m_chanNum,
439  0 /*service id*/, major, minor,
440  false /*use on air guide*/, kChannelVisible,
441  (*i).m_freqId, localfile, (*i).m_tvFormat,
442  (*i).m_xmltvId))
443  {
444  cout << "### " << endl;
445  cout << "### Channel inserted" << endl;
446  cout << "### " << endl;
447  }
448  else
449  {
450  cout << "### " << endl;
451  cout << "### Channel skipped" << endl;
452  cout << "### " << endl;
453  }
454  }
455  else if ((minor == 0) || (freq > 0))
456  {
457  // We only do this if we are not asked to skip it with the
458  // --update-guide-only (formerly --update) flag.
459  int mplexid = 0;
460  int chanid = 0;
461  if (minor > 0)
462  {
464  id, "atsc", freq, "8vsb");
465  }
466 
467  if ((mplexid > 0) || (minor == 0))
468  chanid = ChannelUtil::CreateChanID(id, (*i).m_chanNum);
469 
470  if ((*i).m_callSign.isEmpty())
471  {
472  QStringList words = (*i).m_name.simplified().toUpper()
473  .split(" ");
474  QString callsign = "";
475  QString w1 = !words.empty() ? words[0] : QString();
476  QString w2 = words.size() > 1 ? words[1] : QString();
477  if (w1.isEmpty())
478  callsign = QString::number(chanid);
479  else if (w2.isEmpty())
480  callsign = words[0].left(5);
481  else
482  {
483  callsign = w1.left(w2.length() == 1 ? 4:3);
484  callsign += w2.left(5 - callsign.length());
485  }
486  (*i).m_callSign = callsign;
487  }
488 
489  if (chanid > 0)
490  {
491  QString cstr = (*i).m_chanNum;
492  if(m_channelPreset && cstr.isEmpty())
493  cstr = QString::number(chanid % 1000);
494 
495  bool retval = ChannelUtil::CreateChannel(
496  mplexid, id,
497  chanid,
498  (*i).m_callSign,
499  (*i).m_name, cstr,
500  0 /*service id*/,
501  major, minor,
502  false /*use on air guide*/,
504  (*i).m_freqId,
505  localfile,
506  (*i).m_tvFormat,
507  (*i).m_xmltvId
508  );
509  if (!retval)
510  cout << "Channel " << chanid << " creation failed"
511  << endl;
512  }
513  }
514  }
515  }
516 }
ChannelInfo
Definition: channelinfo.h:33
MSqlQuery::isActive
bool isActive(void) const
Definition: mythdbcon.h:204
MSqlQuery::next
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
Definition: mythdbcon.cpp:783
MSqlQuery
QSqlQuery wrapper that fetches a DB connection from the connection pool.
Definition: mythdbcon.h:125
channel
QDomElement channel
Definition: mythplugins/mytharchive/mytharchivehelper/main.cpp:498
ChannelData::normalizeChannelKey
static QString normalizeChannelKey(const QString &chanName)
Definition: channeldata.cpp:119
mythdb.h
SourceUtil::IsCableCardPresent
static bool IsCableCardPresent(uint sourceid)
Definition: sourceutil.cpp:353
ChannelInfo::m_chanId
uint m_chanId
Definition: channelinfo.h:87
ChannelUtil::LoadChannels
static ChannelInfoList LoadChannels(uint startIndex, uint count, uint &totalAvailable, bool ignoreHidden=true, OrderBy orderBy=kChanOrderByChanNum, GroupBy groupBy=kChanGroupByChanid, uint sourceID=0, uint channelGroupID=0, bool liveTVOnly=false, const QString &callsign="", const QString &channum="", bool ignoreUntunable=true)
Load channels from database into a list of ChannelInfo objects.
Definition: channelutil.cpp:2407
ChannelData::handleChannels
void handleChannels(int id, ChannelInfoList *chanlist) const
Definition: channeldata.cpp:188
ChannelData::m_cardType
QString m_cardType
Definition: channeldata.h:33
ChannelInfo::m_freqId
QString m_freqId
Definition: channelinfo.h:89
ChannelInfo::m_fineTune
int m_fineTune
Definition: channelinfo.h:97
ChannelUtil::kChanGroupByChanid
@ kChanGroupByChanid
Definition: channelutil.h:206
MSqlQuery::value
QVariant value(int i) const
Definition: mythdbcon.h:198
arg
arg(title).arg(filename).arg(doDelete))
MSqlQuery::exec
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
Definition: mythdbcon.cpp:603
ChannelInfo::m_name
QString m_name
Definition: channelinfo.h:94
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:23
ChannelData::promptForChannelUpdates
unsigned int promptForChannelUpdates(ChannelInfoList::iterator chaninfo, unsigned int chanid) const
Definition: channeldata.cpp:83
ChannelUtil::CreateChannel
static bool CreateChannel(uint db_mplexid, uint db_sourceid, uint new_channel_id, const QString &callsign, const QString &service_name, const QString &chan_num, uint service_id, uint atsc_major_channel, uint atsc_minor_channel, bool use_on_air_guide, ChannelVisibleType visible, const QString &freqid, const QString &icon=QString(), QString format="Default", const QString &xmltvid=QString(), const QString &default_authority=QString(), uint service_type=0)
Definition: channelutil.cpp:1482
ChannelInfo::m_icon
QString m_icon
Definition: channelinfo.h:95
ChannelData::m_channelPreset
bool m_channelPreset
Definition: channeldata.h:30
ChannelData::channelList
static ChannelList channelList(int sourceId)
Definition: channeldata.cpp:131
sourceutil.h
ChannelData::m_guideDataOnly
bool m_guideDataOnly
Definition: channeldata.h:29
ChannelData::m_interactive
bool m_interactive
Definition: channeldata.h:28
minor
#define minor(X)
Definition: compat.h:138
mythlogging.h
CardUtil::IsEncoder
static bool IsEncoder(const QString &rawtype)
Definition: cardutil.h:127
ChannelData::m_channelUpdates
bool m_channelUpdates
Definition: channeldata.h:31
MSqlQuery::InitCon
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
Definition: mythdbcon.cpp:535
SetupIconCacheDirectory
QString SetupIconCacheDirectory(void)
Definition: fillutil.cpp:35
MythDB::DBError
static void DBError(const QString &where, const MSqlQuery &query)
Definition: mythdb.cpp:179
ChannelInfo::m_chanNum
QString m_chanNum
Definition: channelinfo.h:88
getResponse
QString getResponse(const QString &query, const QString &def)
In an interactive shell, prompt the user to input a string.
Definition: mythmiscutil.cpp:455
filename
QString filename
Definition: mythplugins/mytharchive/mytharchivehelper/main.cpp:634
ChannelUtil::CreateChanID
static int CreateChanID(uint sourceid, const QString &chan_num)
Creates a unique channel ID for database use.
Definition: channelutil.cpp:1446
SourceUtil::IsUnscanable
static bool IsUnscanable(uint sourceid)
Definition: sourceutil.cpp:343
ChannelInfoList
vector< ChannelInfo > ChannelInfoList
Definition: channelinfo.h:133
uint
unsigned int uint
Definition: compat.h:140
get_atsc_stuff
static void get_atsc_stuff(const QString &channum, int sourceid, int freqid, int &major, int &minor, long long &freq)
Definition: channeldata.cpp:28
MSqlQuery::ChannelCon
static MSqlQueryInfo ChannelCon()
Returns dedicated connection. (Required for using temporary SQL tables.)
Definition: mythdbcon.cpp:584
channelutil.h
mythmiscutil.h
frequencytables.h
kChannelVisible
@ kChannelVisible
Definition: channelinfo.h:25
cardutil.h
ChannelUtil::CreateMultiplex
static uint CreateMultiplex(int sourceid, const QString &sistandard, uint64_t frequency, const QString &modulation, int transport_id=-1, int network_id=-1)
Definition: channelutil.cpp:371
freq
uint32_t freq[4]
Definition: element.cpp:44
MSqlQuery::bindValue
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
Definition: mythdbcon.cpp:864
channeldata.h
ChannelInfo::m_tvFormat
QString m_tvFormat
Definition: channelinfo.h:107
ChannelData::FindMatchingChannel
static ChannelInfo FindMatchingChannel(const ChannelInfo &chanInfo, ChannelList existingChannels)
Definition: channeldata.cpp:151
get_center_frequency
long long get_center_frequency(const QString &format, const QString &modulation, const QString &country, int freqid)
Definition: frequencytables.cpp:262
SourceUtil::IsEncoder
static bool IsEncoder(uint sourceid, bool strict=false)
Definition: sourceutil.cpp:307
ChannelInfo::m_xmltvId
QString m_xmltvId
Definition: channelinfo.h:99
ChannelList
QList< ChannelListItem > ChannelList
Definition: channelscan_sm.h:67
ChannelData::insert_chan
bool insert_chan(uint sourceid) const
Definition: channeldata.cpp:58
mythdownloadmanager.h
CardUtil::IsUnscanable
static bool IsUnscanable(const QString &rawtype)
Definition: cardutil.h:150
query
MSqlQuery query(MSqlQuery::InitCon())
fillutil.h
ChannelInfo::m_callSign
QString m_callSign
Definition: channelinfo.h:93
ChannelUtil::kChanOrderByChanNum
@ kChanOrderByChanNum
Definition: channelutil.h:198
GetMythDownloadManager
MythDownloadManager * GetMythDownloadManager(void)
Gets the pointer to the MythDownloadManager singleton.
Definition: mythdownloadmanager.cpp:161
MSqlQuery::prepare
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
Definition: mythdbcon.cpp:808