MythTV  master
playbackboxhelper.cpp
Go to the documentation of this file.
1 // C++
2 #include <algorithm>
3 
4 // Qt
5 #include <QCoreApplication>
6 #include <QDateTime>
7 #include <QDir>
8 #include <QFileInfo>
9 #include <QHash>
10 #include <QMap>
11 #include <QStringList>
12 
13 // MythTV
16 #include "libmythbase/mythdirs.h"
17 #include "libmythbase/mythevent.h"
19 #include "libmythbase/mythrandom.h"
21 #include "libmythbase/remoteutil.h"
25 #include "libmythtv/tvremoteutil.h"
26 
27 // MythFrontend
28 #include "playbackboxhelper.h"
29 
30 #define LOC QString("PlaybackBoxHelper: ")
31 #define LOC_WARN QString("PlaybackBoxHelper Warning: ")
32 #define LOC_ERR QString("PlaybackBoxHelper Error: ")
33 
34 class PBHEventHandler : public QObject
35 {
36  public:
38  m_pbh(pbh)
39  {
41  }
42  ~PBHEventHandler() override
43  {
45  killTimer(m_freeSpaceTimerId);
47  killTimer(m_checkAvailabilityTimerId);
48  }
49 
50  bool event(QEvent* /*e*/) override; // QObject
51  void UpdateFreeSpaceEvent(void);
52  AvailableStatusType CheckAvailability(const QStringList &slist);
54  int m_freeSpaceTimerId { 0 };
56  static constexpr std::chrono::milliseconds kUpdateFreeSpaceInterval { 15s };
57  QMap<QString, QStringList> m_fileListCache;
58  QHash<uint, QStringList> m_checkAvailability;
59 };
60 
62 {
63  QTime tm = QTime::currentTime();
64 
65  QStringList::const_iterator it2 = slist.begin();
66  ProgramInfo evinfo(it2, slist.end());
67  bool first {true};
68  CheckAvailabilityType firstType {};
69  QSet<CheckAvailabilityType> cats;
70  for (; it2 != slist.end(); ++it2)
71  {
72  auto type = (CheckAvailabilityType)(*it2).toUInt();
73  if (first)
74  {
75  firstType = type;
76  first = false;
77  }
78  cats.insert(type);
79  }
80 
81  {
82  QMutexLocker locker(&m_pbh.m_lock);
83  QHash<uint, QStringList>::iterator cit =
84  m_checkAvailability.find(evinfo.GetRecordingID());
85  if (cit != m_checkAvailability.end())
86  m_checkAvailability.erase(cit);
88  {
89  killTimer(m_checkAvailabilityTimerId);
91  }
92  }
93 
94  if (cats.empty())
95  return asFileNotFound;
96 
97  AvailableStatusType availableStatus = asAvailable;
98  if (!evinfo.HasPathname() && !evinfo.GetChanID())
99  availableStatus = asFileNotFound;
100  else
101  {
102  // Note IsFileReadable() implicitly calls GetPlaybackURL
103  // when necessary, we rely on this.
104  if (!evinfo.IsFileReadable())
105  {
106  LOG(VB_GENERAL, LOG_ERR, LOC +
107  QString("CHECK_AVAILABILITY '%1' file not found")
108  .arg(evinfo.GetPathname()));
109  availableStatus = asFileNotFound;
110  }
111  else if (!evinfo.GetFilesize())
112  {
113  // This query should be unnecessary if the ProgramInfo Updater is working
114 // evinfo.SetFilesize(evinfo.QueryFilesize());
115 // if (!evinfo.GetFilesize())
116 // {
117  availableStatus =
120 // }
121  }
122  }
123 
124  QStringList list;
125  list.push_back(QString::number(evinfo.GetRecordingID()));
126  list.push_back(evinfo.GetPathname());
127  auto *e0 = new MythEvent("SET_PLAYBACK_URL", list);
128  QCoreApplication::postEvent(m_pbh.m_listener, e0);
129 
130  list.clear();
131  list.push_back(QString::number(evinfo.GetRecordingID()));
132  list.push_back(QString::number((int)firstType));
133  list.push_back(QString::number((int)availableStatus));
134  list.push_back(QString::number(evinfo.GetFilesize()));
135  list.push_back(QString::number(tm.hour()));
136  list.push_back(QString::number(tm.minute()));
137  list.push_back(QString::number(tm.second()));
138  list.push_back(QString::number(tm.msec()));
139 
140  for (auto type : std::as_const(cats))
141  {
142  if (type == kCheckForCache && cats.size() > 1)
143  continue;
144  list[1] = QString::number((int)type);
145  auto *e = new MythEvent("AVAILABILITY", list);
146  QCoreApplication::postEvent(m_pbh.m_listener, e);
147  }
148 
149  return availableStatus;
150 }
151 
152 bool PBHEventHandler::event(QEvent *e)
153 {
154  if (e->type() == QEvent::Timer)
155  {
156  auto *te = (QTimerEvent*)e;
157  const int timer_id = te->timerId();
158  if (timer_id == m_freeSpaceTimerId)
160  if (timer_id == m_checkAvailabilityTimerId)
161  {
162  QStringList slist;
163  {
164  QMutexLocker locker(&m_pbh.m_lock);
165  QHash<uint, QStringList>::iterator it =
166  m_checkAvailability.begin();
167  if (it != m_checkAvailability.end())
168  slist = *it;
169  }
170 
171  if (slist.size() >= 1 + NUMPROGRAMLINES)
172  CheckAvailability(slist);
173  }
174  return true;
175  }
176  if (e->type() == MythEvent::kMythEventMessage)
177  {
178  auto *me = dynamic_cast<MythEvent*>(e);
179  if (me == nullptr)
180  return QObject::event(e);
181 
182  if (me->Message() == "UPDATE_FREE_SPACE")
183  {
185  return true;
186  }
187  if (me->Message() == "STOP_RECORDING")
188  {
189  ProgramInfo pginfo(me->ExtraDataList());
190  if (pginfo.GetChanID())
191  RemoteStopRecording(&pginfo);
192  return true;
193  }
194  if (me->Message() == "DELETE_RECORDINGS")
195  {
196  QStringList successes;
197  QStringList failures;
198  QStringList list = me->ExtraDataList();
199  while (list.size() >= 3)
200  {
201  uint recordingID = list[0].toUInt();
202  bool forceDelete = list[1].toUInt() != 0U;
203  bool forgetHistory = list[2].toUInt() != 0U;
204 
205  bool ok = RemoteDeleteRecording( recordingID, forceDelete,
206  forgetHistory);
207 
208  QStringList &res = (ok) ? successes : failures;
209  for (uint i = 0; i < 3; i++)
210  {
211  res.push_back(list.front());
212  list.pop_front();
213  }
214  }
215  if (!successes.empty())
216  {
217  auto *oe = new MythEvent("DELETE_SUCCESSES", successes);
218  QCoreApplication::postEvent(m_pbh.m_listener, oe);
219  }
220  if (!failures.empty())
221  {
222  auto *oe = new MythEvent("DELETE_FAILURES", failures);
223  QCoreApplication::postEvent(m_pbh.m_listener, oe);
224  }
225 
226  return true;
227  }
228  if (me->Message() == "UNDELETE_RECORDINGS")
229  {
230  QStringList successes;
231  QStringList failures;
232  QStringList list = me->ExtraDataList();
233  while (!list.empty())
234  {
235  uint recordingID = list[0].toUInt();
236 
237  bool ok = RemoteUndeleteRecording(recordingID);
238 
239  QStringList &res = (ok) ? successes : failures;
240 
241  res.push_back(QString::number(recordingID));
242  list.pop_front();
243  }
244  if (!successes.empty())
245  {
246  auto *oe = new MythEvent("UNDELETE_SUCCESSES", successes);
247  QCoreApplication::postEvent(m_pbh.m_listener, oe);
248  }
249  if (!failures.empty())
250  {
251  auto *oe = new MythEvent("UNDELETE_FAILURES", failures);
252  QCoreApplication::postEvent(m_pbh.m_listener, oe);
253  }
254 
255  return true;
256  }
257  if (me->Message() == "GET_PREVIEW")
258  {
259  const QString& token = me->ExtraData(0);
260  bool check_avail = (bool) me->ExtraData(1).toInt();
261  QStringList list = me->ExtraDataList();
262  QStringList::const_iterator it = list.cbegin()+2;
263  ProgramInfo evinfo(it, list.cend());
264  if (!evinfo.HasPathname())
265  return true;
266 
267  list.clear();
268  evinfo.ToStringList(list);
269  list += QString::number(kCheckForCache);
270  if (check_avail && (asAvailable != CheckAvailability(list)))
271  return true;
272  if (asAvailable != evinfo.GetAvailableStatus())
273  return true;
274 
275  // Now we can actually request the preview...
277 
278  return true;
279  }
280  if (me->Message() == "CHECK_AVAILABILITY")
281  {
282  if (me->ExtraData(0) != QString::number(kCheckForCache))
283  {
285  killTimer(m_checkAvailabilityTimerId);
286  m_checkAvailabilityTimerId = startTimer(0ms);
287  }
288  else if (!m_checkAvailabilityTimerId)
289  {
290  m_checkAvailabilityTimerId = startTimer(50ms);
291  }
292  }
293  else if (me->Message() == "LOCATE_ARTWORK")
294  {
295  const QString& inetref = me->ExtraData(0);
296  uint season = me->ExtraData(1).toUInt();
297  const auto type = (VideoArtworkType)me->ExtraData(2).toInt();
298 #if 0 /* const ref for an unused variable doesn't make much sense either */
299  uint recordingID = me->ExtraData(3).toUInt();
300  const QString &group = me->ExtraData(4);
301 #endif
302  const QString cacheKey = QString("%1:%2:%3")
303  .arg((int)type).arg(inetref).arg(season);
304 
305  ArtworkMap map = GetArtwork(inetref, season);
306 
307  ArtworkInfo info = map.value(type);
308 
309  QString foundFile;
310 
311  if (!info.url.isEmpty())
312  {
313  foundFile = info.url;
314  QMutexLocker locker(&m_pbh.m_lock);
315  m_pbh.m_artworkCache[cacheKey] = foundFile;
316  }
317 
318  if (!foundFile.isEmpty())
319  {
320  QStringList list = me->ExtraDataList();
321  list.push_back(foundFile);
322  auto *oe = new MythEvent("FOUND_ARTWORK", list);
323  QCoreApplication::postEvent(m_pbh.m_listener, oe);
324  }
325 
326  return true;
327  }
328  }
329 
330  return QObject::event(e);
331 }
332 
334 {
335  if (m_freeSpaceTimerId)
336  killTimer(m_freeSpaceTimerId);
339 }
340 
342 
344  MThread("PlaybackBoxHelper"),
345  m_listener(listener), m_eventHandler(new PBHEventHandler(*this))
346 {
347  start();
348  m_eventHandler->moveToThread(qthread());
349  // Prime the pump so the disk free display starts updating
351 }
352 
354 {
355  // delete the event handler
356  m_eventHandler->deleteLater();
357  m_eventHandler = nullptr;
358 
359  MThread::exit();
360  wait();
361 }
362 
364 {
365  QCoreApplication::postEvent(
366  m_eventHandler, new MythEvent("UPDATE_FREE_SPACE"));
367 }
368 
370 {
371  QStringList list;
372  pginfo.ToStringList(list);
373  auto *e = new MythEvent("STOP_RECORDING", list);
374  QCoreApplication::postEvent(m_eventHandler, e);
375 }
376 
377 void PlaybackBoxHelper::DeleteRecording( uint recordingID, bool forceDelete,
378  bool forgetHistory)
379 {
380  QStringList list;
381  list.push_back(QString::number(recordingID));
382  list.push_back((forceDelete) ? "1" : "0");
383  list.push_back((forgetHistory) ? "1" : "0");
384  DeleteRecordings(list);
385 }
386 
387 void PlaybackBoxHelper::DeleteRecordings(const QStringList &list)
388 {
389  auto *e = new MythEvent("DELETE_RECORDINGS", list);
390  QCoreApplication::postEvent(m_eventHandler, e);
391 }
392 
394 {
395  QStringList list;
396  list.push_back(QString::number(recordingID));
397  auto *e = new MythEvent("UNDELETE_RECORDINGS", list);
398  QCoreApplication::postEvent(m_eventHandler, e);
399 }
400 
402 {
403  QList<FileSystemInfo> fsInfos = FileSystemInfo::RemoteGetInfo();
404 
405  QMutexLocker locker(&m_lock);
406  for (const auto& fsInfo : std::as_const(fsInfos))
407  {
408  if (fsInfo.getPath() == "TotalDiskSpace")
409  {
410  m_freeSpaceTotalMB = (uint64_t) (fsInfo.getTotalSpace() >> 10);
411  m_freeSpaceUsedMB = (uint64_t) (fsInfo.getUsedSpace() >> 10);
412  }
413  }
414  auto *e = new MythEvent("UPDATE_USAGE_UI");
415  QCoreApplication::postEvent(m_listener, e);
416 }
417 
419 {
420  QMutexLocker locker(&m_lock);
421  return m_freeSpaceTotalMB;
422 }
423 
425 {
426  QMutexLocker locker(&m_lock);
427  return m_freeSpaceUsedMB;
428 }
429 
431  const ProgramInfo &pginfo, CheckAvailabilityType cat)
432 {
433  QString catstr = QString::number((int)cat);
434  QMutexLocker locker(&m_lock);
435  QHash<uint, QStringList>::iterator it =
437  if (it == m_eventHandler->m_checkAvailability.end())
438  {
439  QStringList list;
440  pginfo.ToStringList(list);
441  list += catstr;
443  }
444  else
445  {
446  (*it).push_back(catstr);
447  }
448  auto *e = new MythEvent("CHECK_AVAILABILITY", QStringList(catstr));
449  QCoreApplication::postEvent(m_eventHandler, e);
450 }
451 
453  const QString &inetref, uint season,
454  const VideoArtworkType type,
455  const ProgramInfo *pginfo,
456  const QString &groupname)
457 {
458  QString cacheKey = QString("%1:%2:%3")
459  .arg((int)type).arg(inetref).arg(season);
460 
461  QMutexLocker locker(&m_lock);
462 
463  InfoMap::const_iterator it =
464  m_artworkCache.constFind(cacheKey);
465 
466  if (it != m_artworkCache.constEnd())
467  return *it;
468 
469  QStringList list(inetref);
470  list.push_back(QString::number(season));
471  list.push_back(QString::number(type));
472  list.push_back((pginfo)?QString::number(pginfo->GetRecordingID()):"");
473  list.push_back(groupname);
474  auto *e = new MythEvent("LOCATE_ARTWORK", list);
475  QCoreApplication::postEvent(m_eventHandler, e);
476 
477  return {};
478 }
479 
481  const ProgramInfo &pginfo, bool check_availability)
482 {
483  if (!check_availability && pginfo.GetAvailableStatus() != asAvailable)
484  return {};
485 
486  if (pginfo.GetAvailableStatus() == asPendingDelete)
487  return {};
488 
489  QString token = QString("%1:%2")
490  .arg(pginfo.MakeUniqueKey()).arg(MythRandom());
491 
492  QStringList extra(token);
493  extra.push_back(check_availability?"1":"0");
494  pginfo.ToStringList(extra);
495  auto *e = new MythEvent("GET_PREVIEW", extra);
496  QCoreApplication::postEvent(m_eventHandler, e);
497 
498  return token;
499 }
PlaybackBoxHelper::DeleteRecording
void DeleteRecording(uint recordingID, bool forceDelete, bool forgetHistory)
Definition: playbackboxhelper.cpp:377
filesysteminfo.h
PlaybackBoxHelper::m_freeSpaceUsedMB
uint64_t m_freeSpaceUsedMB
Definition: playbackboxhelper.h:64
mythevent.h
bool
bool
Definition: pxsup2dast.c:30
PBHEventHandler::UpdateFreeSpaceEvent
void UpdateFreeSpaceEvent(void)
Definition: playbackboxhelper.cpp:333
ProgramInfo::MakeUniqueKey
QString MakeUniqueKey(void) const
Creates a unique string that can be used to identify an existing recording.
Definition: programinfo.h:340
MThread::start
void start(QThread::Priority p=QThread::InheritPriority)
Tell MThread to start running the thread in the near future.
Definition: mthread.cpp:283
ProgramInfo::GetFilesize
virtual uint64_t GetFilesize(void) const
Definition: programinfo.cpp:6479
PBHEventHandler::~PBHEventHandler
~PBHEventHandler() override
Definition: playbackboxhelper.cpp:42
MythEvent::kMythEventMessage
static const Type kMythEventMessage
Definition: mythevent.h:79
metadataimagehelper.h
PlaybackBoxHelper::m_eventHandler
PBHEventHandler * m_eventHandler
Definition: playbackboxhelper.h:59
mythrandom.h
PlaybackBoxHelper::GetFreeSpaceTotalMB
uint64_t GetFreeSpaceTotalMB(void) const
Definition: playbackboxhelper.cpp:418
PBHEventHandler::kUpdateFreeSpaceInterval
static constexpr std::chrono::milliseconds kUpdateFreeSpaceInterval
Definition: playbackboxhelper.cpp:56
MThread::wait
bool wait(std::chrono::milliseconds time=std::chrono::milliseconds::max())
Wait for the MThread to exit, with a maximum timeout.
Definition: mthread.cpp:300
ProgramInfo::GetRecordingID
uint GetRecordingID(void) const
Definition: programinfo.h:450
hardwareprofile.devicelist.cat
def cat(file_name)
Definition: devicelist.py:95
asZeroByte
@ asZeroByte
Definition: programtypes.h:180
MythEvent
This class is used as a container for messages.
Definition: mythevent.h:16
PlaybackBoxHelper
Definition: playbackboxhelper.h:29
GetArtwork
ArtworkMap GetArtwork(const QString &inetref, uint season, bool strict)
Definition: metadataimagehelper.cpp:23
PlaybackBoxHelper::m_freeSpaceTotalMB
uint64_t m_freeSpaceTotalMB
Definition: playbackboxhelper.h:63
RemoteUndeleteRecording
bool RemoteUndeleteRecording(uint recordingID)
Definition: remoteutil.cpp:142
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
NUMPROGRAMLINES
static constexpr int8_t NUMPROGRAMLINES
Definition: programinfo.h:28
mythdirs.h
playbackboxhelper.h
PBHEventHandler::m_fileListCache
QMap< QString, QStringList > m_fileListCache
Definition: playbackboxhelper.cpp:57
remoteutil.h
PlaybackBoxHelper::UndeleteRecording
void UndeleteRecording(uint recordingID)
Definition: playbackboxhelper.cpp:393
StorageGroup::ClearGroupToUseCache
static void ClearGroupToUseCache(void)
Definition: storagegroup.cpp:855
VideoArtworkType
VideoArtworkType
Definition: metadataimagehelper.h:10
ProgramInfo::GetPathname
QString GetPathname(void) const
Definition: programinfo.h:344
asNotYetAvailable
@ asNotYetAvailable
Definition: programtypes.h:177
CheckAvailabilityType
CheckAvailabilityType
Definition: playbackboxhelper.h:22
programinfo.h
mythlogging.h
ProgramInfo::GetRecordingStatus
RecStatus::Type GetRecordingStatus(void) const
Definition: programinfo.h:451
FileSystemInfo::RemoteGetInfo
static QList< FileSystemInfo > RemoteGetInfo(MythSocket *sock=nullptr)
Definition: filesysteminfo.cpp:137
RemoteStopRecording
bool RemoteStopRecording(uint inputid)
Definition: tvremoteutil.cpp:98
ArtworkInfo
Definition: metadataimagehelper.h:21
PlaybackBoxHelper::GetPreviewImage
QString GetPreviewImage(const ProgramInfo &pginfo, bool check_availability=true)
Definition: playbackboxhelper.cpp:480
LOC
#define LOC
Definition: playbackboxhelper.cpp:30
PlaybackBoxHelper::m_lock
QMutex m_lock
Definition: playbackboxhelper.h:60
PlaybackBoxHelper::DeleteRecordings
void DeleteRecordings(const QStringList &list)
Definition: playbackboxhelper.cpp:387
asPendingDelete
@ asPendingDelete
Definition: programtypes.h:178
MThread::qthread
QThread * qthread(void)
Returns the thread, this will always return the same pointer no matter how often you restart the thre...
Definition: mthread.cpp:233
PBHEventHandler::m_checkAvailabilityTimerId
int m_checkAvailabilityTimerId
Definition: playbackboxhelper.cpp:55
storagegroup.h
PlaybackBoxHelper::PlaybackBoxHelper
PlaybackBoxHelper(QObject *listener)
Definition: playbackboxhelper.cpp:343
PlaybackBoxHelper::~PlaybackBoxHelper
~PlaybackBoxHelper(void) override
Definition: playbackboxhelper.cpp:353
tvremoteutil.h
PlaybackBoxHelper::m_artworkCache
InfoMap m_artworkCache
Definition: playbackboxhelper.h:67
PBHEventHandler::m_pbh
PlaybackBoxHelper & m_pbh
Definition: playbackboxhelper.cpp:53
ProgramInfo::GetChanID
uint GetChanID(void) const
This is the unique key used in the database to locate tuning information.
Definition: programinfo.h:373
ProgramInfo
Holds information on recordings and videos.
Definition: programinfo.h:67
PBHEventHandler::PBHEventHandler
PBHEventHandler(PlaybackBoxHelper &pbh)
Definition: playbackboxhelper.cpp:37
RecStatus::Recording
@ Recording
Definition: recordingstatus.h:30
asAvailable
@ asAvailable
Definition: programtypes.h:176
ProgramInfo::ToStringList
void ToStringList(QStringList &list) const
Serializes ProgramInfo into a QStringList which can be passed over a socket.
Definition: programinfo.cpp:1276
mythcorecontext.h
ProgramInfo::IsFileReadable
bool IsFileReadable(void)
Attempts to ascertain if the main file for this ProgramInfo is readable.
Definition: programinfo.cpp:5060
PreviewGeneratorQueue::GetPreviewImage
static void GetPreviewImage(const ProgramInfo &pginfo, const QString &token)
Submit a request for the generation of a preview image.
Definition: previewgeneratorqueue.h:89
PBHEventHandler
Definition: playbackboxhelper.cpp:34
PBHEventHandler::event
bool event(QEvent *) override
Definition: playbackboxhelper.cpp:152
MThread
This is a wrapper around QThread that does several additional things.
Definition: mthread.h:48
MThread::exit
void exit(int retcode=0)
Use this to exit from the thread if you are using a Qt event loop.
Definition: mthread.cpp:278
previewgeneratorqueue.h
PlaybackBoxHelper::UpdateFreeSpace
void UpdateFreeSpace(void)
Definition: playbackboxhelper.cpp:401
AvailableStatusType
AvailableStatusType
Definition: programtypes.h:175
ArtworkMap
QMultiMap< VideoArtworkType, ArtworkInfo > ArtworkMap
Definition: metadataimagehelper.h:31
PlaybackBoxHelper::StopRecording
void StopRecording(const ProgramInfo &pginfo)
Definition: playbackboxhelper.cpp:369
azlyrics.info
dictionary info
Definition: azlyrics.py:7
PlaybackBoxHelper::LocateArtwork
QString LocateArtwork(const QString &inetref, uint season, VideoArtworkType type, const ProgramInfo *pginfo, const QString &groupname=nullptr)
Definition: playbackboxhelper.cpp:452
PBHEventHandler::m_checkAvailability
QHash< uint, QStringList > m_checkAvailability
Definition: playbackboxhelper.cpp:58
PlaybackBoxHelper::GetFreeSpaceUsedMB
uint64_t GetFreeSpaceUsedMB(void) const
Definition: playbackboxhelper.cpp:424
asFileNotFound
@ asFileNotFound
Definition: programtypes.h:179
PBHEventHandler::CheckAvailability
AvailableStatusType CheckAvailability(const QStringList &slist)
Definition: playbackboxhelper.cpp:61
ProgramInfo::GetAvailableStatus
AvailableStatusType GetAvailableStatus(void) const
Definition: programinfo.h:847
RemoteDeleteRecording
bool RemoteDeleteRecording(uint recordingID, bool forceMetadataDelete, bool forgetHistory)
Definition: remoteutil.cpp:113
PlaybackBoxHelper::m_listener
QObject * m_listener
Definition: playbackboxhelper.h:58
MythRandomStd::MythRandom
uint32_t MythRandom()
generate 32 random bits
Definition: mythrandom.h:20
PlaybackBoxHelper::CheckAvailability
void CheckAvailability(const ProgramInfo &pginfo, CheckAvailabilityType cat=kCheckForCache)
Definition: playbackboxhelper.cpp:430
PlaybackBoxHelper::ForceFreeSpaceUpdate
void ForceFreeSpaceUpdate(void)
Definition: playbackboxhelper.cpp:363
ProgramInfo::HasPathname
bool HasPathname(void) const
Definition: programinfo.h:359
uint
unsigned int uint
Definition: freesurround.h:24
kCheckForCache
@ kCheckForCache
Definition: playbackboxhelper.h:23
PBHEventHandler::m_freeSpaceTimerId
int m_freeSpaceTimerId
Definition: playbackboxhelper.cpp:54