MythTV  master
remoteutil.cpp
Go to the documentation of this file.
1 #include <unistd.h>
2 
3 #include <QFileInfo>
4 #include <QFile>
5 #include <QDir>
6 #include <QList>
7 
8 #include "compat.h"
9 #include "remoteutil.h"
10 #include "programinfo.h"
11 #include "mythcorecontext.h"
12 #include "storagegroup.h"
13 #include "mythevent.h"
14 #include "mythsocket.h"
15 
16 vector<ProgramInfo *> *RemoteGetRecordedList(int sort)
17 {
18  QString str = "QUERY_RECORDINGS ";
19  if (sort < 0)
20  str += "Descending";
21  else if (sort > 0)
22  str += "Ascending";
23  else
24  str += "Unsorted";
25 
26  QStringList strlist(str);
27 
28  auto *info = new vector<ProgramInfo *>;
29 
30  if (!RemoteGetRecordingList(*info, strlist))
31  {
32  delete info;
33  return nullptr;
34  }
35 
36  return info;
37 }
38 
40 {
41  QStringList strlist(QString("QUERY_LOAD"));
42 
43  if (gCoreContext->SendReceiveStringList(strlist) && strlist.size() >= 3)
44  {
45  load[0] = strlist[0].toDouble();
46  load[1] = strlist[1].toDouble();
47  load[2] = strlist[2].toDouble();
48  return true;
49  }
50 
51  return false;
52 }
53 
54 bool RemoteGetUptime(time_t &uptime)
55 {
56  QStringList strlist(QString("QUERY_UPTIME"));
57 
58  if (!gCoreContext->SendReceiveStringList(strlist) || strlist.isEmpty())
59  return false;
60 
61  if (strlist[0].isEmpty() || !strlist[0].at(0).isNumber())
62  return false;
63 
64  if (sizeof(time_t) == sizeof(int))
65  uptime = strlist[0].toUInt();
66  else if (sizeof(time_t) == sizeof(long))
67  uptime = strlist[0].toULong();
68  else if (sizeof(time_t) == sizeof(long long))
69  uptime = strlist[0].toULongLong();
70 
71  return true;
72 }
73 
74 bool RemoteGetMemStats(int &totalMB, int &freeMB, int &totalVM, int &freeVM)
75 {
76  QStringList strlist(QString("QUERY_MEMSTATS"));
77 
78  if (gCoreContext->SendReceiveStringList(strlist) && strlist.size() >= 4)
79  {
80  totalMB = strlist[0].toInt();
81  freeMB = strlist[1].toInt();
82  totalVM = strlist[2].toInt();
83  freeVM = strlist[3].toInt();
84  return true;
85  }
86 
87  return false;
88 }
89 
90 bool RemoteCheckFile(ProgramInfo *pginfo, bool checkSlaves)
91 {
92  QStringList strlist("QUERY_CHECKFILE");
93  strlist << QString::number((int)checkSlaves);
94  pginfo->ToStringList(strlist);
95 
96  if (!gCoreContext->SendReceiveStringList(strlist) ||
97  (strlist.size() < 2) || !strlist[0].toInt())
98  return false;
99 
100  // Only modify the pathname if the recording file is available locally on
101  // this host
102  QString localpath = strlist[1];
103  QFile checkFile(localpath);
104  if (checkFile.exists())
105  pginfo->SetPathname(localpath);
106 
107  return true;
108 }
109 
110 bool RemoteDeleteRecording(uint recordingID, bool forceMetadataDelete,
111  bool forgetHistory)
112 {
113  // FIXME: Remove when DELETE_RECORDING has been updated to use recording id
114  ProgramInfo recInfo(recordingID);
115  bool result = true;
116  QString cmd =
117  QString("DELETE_RECORDING %1 %2 %3 %4")
118  .arg(QString::number(recInfo.GetChanID()))
119  .arg(recInfo.GetRecordingStartTime().toString(Qt::ISODate))
120  .arg(forceMetadataDelete ? "FORCE" : "NO_FORCE")
121  .arg(forgetHistory ? "FORGET" : "NO_FORGET");
122  QStringList strlist(cmd);
123 
124  if ((!gCoreContext->SendReceiveStringList(strlist) || strlist.isEmpty()) ||
125  (strlist[0].toInt() == -2))
126  result = false;
127 
128  if (!result)
129  {
130  LOG(VB_GENERAL, LOG_ALERT,
131  QString("Failed to delete recording %1:%2")
132  .arg(recInfo.GetChanID())
133  .arg(recInfo.GetRecordingStartTime().toString(Qt::ISODate)));
134  }
135 
136  return result;
137 }
138 
139 bool RemoteUndeleteRecording(uint recordingID)
140 {
141  // FIXME: Remove when UNDELETE_RECORDING has been updated to use recording id
142  ProgramInfo recInfo(recordingID);
143  bool result = false;
144 
145 #if 0
146  if (!gCoreContext->GetNumSetting("AutoExpireInsteadOfDelete", 0))
147  return result;
148 #endif
149 
150  QStringList strlist(QString("UNDELETE_RECORDING"));
151  strlist.push_back(QString::number(recInfo.GetChanID()));
152  strlist.push_back(recInfo.GetRecordingStartTime().toString(Qt::ISODate));
153 
155 
156  if (!strlist.isEmpty() && strlist[0].toInt() == 0)
157  result = true;
158 
159  return result;
160 }
161 
162 void RemoteGetAllScheduledRecordings(vector<ProgramInfo *> &scheduledlist)
163 {
164  QStringList strList(QString("QUERY_GETALLSCHEDULED"));
165  RemoteGetRecordingList(scheduledlist, strList);
166 }
167 
168 void RemoteGetAllExpiringRecordings(vector<ProgramInfo *> &expiringlist)
169 {
170  QStringList strList(QString("QUERY_GETEXPIRING"));
171  RemoteGetRecordingList(expiringlist, strList);
172 }
173 
175  vector<ProgramInfo *> &reclist, QStringList &strList)
176 {
177  if (!gCoreContext->SendReceiveStringList(strList) || strList.isEmpty())
178  return 0;
179 
180  int numrecordings = strList[0].toInt();
181  if (numrecordings <= 0)
182  return 0;
183 
184  if (numrecordings * NUMPROGRAMLINES + 1 > strList.size())
185  {
186  LOG(VB_GENERAL, LOG_ERR,
187  "RemoteGetRecordingList() list size appears to be incorrect.");
188  return 0;
189  }
190 
191  uint reclist_initial_size = (uint) reclist.size();
192  QStringList::const_iterator it = strList.cbegin() + 1;
193  for (int i = 0; i < numrecordings; i++)
194  {
195  auto *pginfo = new ProgramInfo(it, strList.cend());
196  reclist.push_back(pginfo);
197  }
198 
199  return ((uint) reclist.size()) - reclist_initial_size;
200 }
201 
202 vector<ProgramInfo *> *RemoteGetConflictList(const ProgramInfo *pginfo)
203 {
204  QString cmd = QString("QUERY_GETCONFLICTING");
205  QStringList strlist( cmd );
206  pginfo->ToStringList(strlist);
207 
208  auto *retlist = new vector<ProgramInfo *>;
209 
210  RemoteGetRecordingList(*retlist, strlist);
211  return retlist;
212 }
213 
215 {
216  QStringList strlist( "QUERY_PIXMAP_LASTMODIFIED" );
217  pginfo->ToStringList(strlist);
218 
219  if (!gCoreContext->SendReceiveStringList(strlist))
220  return QDateTime();
221 
222  if (!strlist.isEmpty() && !strlist[0].isEmpty() && (strlist[0] != "BAD"))
223  {
224  qint64 timet = strlist[0].toLongLong();
225  return MythDate::fromSecsSinceEpoch(timet);
226  }
227 
228  return QDateTime();
229 }
230 
234  const ProgramInfo &pginfo, const QString &cachefile)
235 {
236  QString loc("RemoteGetPreviewIfModified: ");
237  QDateTime cacheLastModified;
238  QFileInfo cachefileinfo(cachefile);
239  if (cachefileinfo.exists())
240  cacheLastModified = cachefileinfo.lastModified();
241 
242  QStringList strlist("QUERY_PIXMAP_GET_IF_MODIFIED");
243  strlist << ((cacheLastModified.isValid()) ? // unix secs, UTC
244  QString::number(cacheLastModified.toSecsSinceEpoch()) :
245  QString("-1"));
246  strlist << QString::number(200 * 1024); // max size of preview file
247  pginfo.ToStringList(strlist);
248 
249  if (!gCoreContext->SendReceiveStringList(strlist) ||
250  strlist.isEmpty() || strlist[0] == "ERROR")
251  {
252  LOG(VB_GENERAL, LOG_ERR, loc + "Remote error" +
253  ((strlist.size() >= 2) ? (":\n\t\t\t" + strlist[1]) : ""));
254 
255  return QDateTime();
256  }
257 
258  if (strlist[0] == "WARNING")
259  {
260  LOG(VB_NETWORK, LOG_WARNING, loc + "Remote warning" +
261  ((strlist.size() >= 2) ? (":\n\t\t\t" + strlist[1]) : ""));
262 
263  return QDateTime();
264  }
265 
266  QDateTime retdatetime;
267  qlonglong timet = strlist[0].toLongLong();
268  if (timet >= 0)
269  {
270  retdatetime = MythDate::fromSecsSinceEpoch(timet);
271  }
272 
273  if (strlist.size() < 4)
274  {
275  return retdatetime;
276  }
277 
278  size_t length = strlist[1].toULongLong();
279  quint16 checksum16 = strlist[2].toUInt();
280  QByteArray data = QByteArray::fromBase64(strlist[3].toLatin1());
281  if ((size_t) data.size() < length)
282  { // (note data.size() may be up to 3 bytes longer after decoding
283  LOG(VB_GENERAL, LOG_ERR, loc +
284  QString("Preview size check failed %1 < %2")
285  .arg(data.size()).arg(length));
286  return QDateTime();
287  }
288  data.resize(length);
289 
290  if (checksum16 != qChecksum(data.constData(), data.size()))
291  {
292  LOG(VB_GENERAL, LOG_ERR, loc + "Preview checksum failed");
293  return QDateTime();
294  }
295 
296  QString pdir(cachefile.section("/", 0, -2));
297  QDir cfd(pdir);
298  if (!cfd.exists() && !cfd.mkdir(pdir))
299  {
300  LOG(VB_GENERAL, LOG_ERR, loc +
301  QString("Unable to create remote cache directory '%1'")
302  .arg(pdir));
303 
304  return QDateTime();
305  }
306 
307  QFile file(cachefile);
308  if (!file.open(QIODevice::WriteOnly|QIODevice::Truncate))
309  {
310  LOG(VB_GENERAL, LOG_ERR, loc +
311  QString("Unable to open cached preview file for writing '%1'")
312  .arg(cachefile));
313 
314  return QDateTime();
315  }
316 
317  off_t offset = 0;
318  size_t remaining = length;
319  uint failure_cnt = 0;
320  while ((remaining > 0) && (failure_cnt < 5))
321  {
322  ssize_t written = file.write(data.data() + offset, remaining);
323  if (written < 0)
324  {
325  failure_cnt++;
326  usleep(50000);
327  continue;
328  }
329 
330  failure_cnt = 0;
331  offset += written;
332  remaining -= written;
333  }
334 
335  if (remaining)
336  {
337  LOG(VB_GENERAL, LOG_ERR, loc +
338  QString("Failed to write cached preview file '%1'")
339  .arg(cachefile));
340 
341  file.resize(0); // in case unlink fails..
342  file.remove(); // closes fd
343  return QDateTime();
344  }
345 
346  file.close();
347 
348  return retdatetime;
349 }
350 
351 bool RemoteFillProgramInfo(ProgramInfo &pginfo, const QString &playbackhost)
352 {
353  QStringList strlist( "FILL_PROGRAM_INFO" );
354  strlist << playbackhost;
355  pginfo.ToStringList(strlist);
356 
357  if (gCoreContext->SendReceiveStringList(strlist))
358  {
359  ProgramInfo tmp(strlist);
360  if (tmp.HasPathname() || tmp.GetChanID())
361  {
362  pginfo = tmp;
363  return true;
364  }
365  }
366 
367  return false;
368 }
369 
370 QStringList RemoteRecordings(void)
371 {
372  QStringList strlist("QUERY_ISRECORDING");
373 
374  if (!gCoreContext->SendReceiveStringList(strlist, false, false))
375  {
376  QStringList empty;
377  empty << "0" << "0";
378  return empty;
379  }
380 
381  return strlist;
382 }
383 
385 {
386  int mask = 0;
387 
388  QString cmd = "QUERY_ISRECORDING";
389 
390  QStringList strlist( cmd );
391 
392  if (!gCoreContext->SendReceiveStringList(strlist) || strlist.isEmpty())
393  return mask;
394 
395  int recCount = strlist[0].toInt();
396 
397  for (int i = 0, j = 0; j < recCount; i++)
398  {
399  cmd = QString("QUERY_RECORDER %1").arg(i + 1);
400 
401  strlist = QStringList( cmd );
402  strlist << "IS_RECORDING";
403 
404  if (gCoreContext->SendReceiveStringList(strlist) && !strlist.isEmpty())
405  {
406  if (strlist[0].toInt())
407  {
408  mask |= 1<<i;
409  j++; // count active recorder
410  }
411  }
412  else
413  {
414  break;
415  }
416  }
417 
418  return mask;
419 }
420 
421 bool RemoteGetFileList(const QString& host, const QString& path, QStringList* list,
422  QString sgroup, bool fileNamesOnly)
423 {
424 
425  // Make sure the list is empty when we get started
426  list->clear();
427 
428  if (sgroup.isEmpty())
429  sgroup = "Videos";
430 
431  *list << "QUERY_SG_GETFILELIST";
432  *list << host;
433  *list << StorageGroup::GetGroupToUse(host, sgroup);
434  *list << path;
435  *list << QString::number(static_cast<int>(fileNamesOnly));
436 
437  bool ok = false;
438 
440  {
441  // since the master backend cannot connect back around to
442  // itself, and the libraries do not have access to the list
443  // of connected slave backends to query an existing connection
444  // start up a new temporary connection directly to the slave
445  // backend to query the file list
446  QString ann = QString("ANN Playback %1 0")
447  .arg(gCoreContext->GetHostName());
448  QString addr = gCoreContext->GetBackendServerIP(host);
449  int port = gCoreContext->GetBackendServerPort(host);
450  bool mismatch = false;
451 
453  addr, port, ann, &mismatch);
454  if (sock)
455  {
456  ok = sock->SendReceiveStringList(*list);
457  sock->DecrRef();
458  }
459  else
460  list->clear();
461  }
462  else
463  ok = gCoreContext->SendReceiveStringList(*list);
464 
465 // Should the SLAVE UNREACH test be here ?
466  return ok;
467 }
468 
475 {
476  QStringList strlist( QString("CHECK_RECORDING") );
477  pginfo->ToStringList(strlist);
478 
479  if (gCoreContext->SendReceiveStringList(strlist) && !strlist.isEmpty())
480  return strlist[0].toInt();
481 
482  return 0;
483 }
484 
494  const ProgramInfo *pginfo, int overrecsecs, int underrecsecs)
495 {
496  QDateTime curtime = MythDate::current();
497 
498  int retval = 0;
499 
500  if (pginfo)
501  {
502  if (curtime >= pginfo->GetScheduledStartTime().addSecs(-underrecsecs) &&
503  curtime < pginfo->GetScheduledEndTime().addSecs(overrecsecs))
504  {
505  if (curtime >= pginfo->GetScheduledStartTime() &&
506  curtime < pginfo->GetScheduledEndTime())
507  retval = 1;
508  else if (curtime < pginfo->GetScheduledStartTime() &&
509  RemoteCheckForRecording(pginfo) > 0)
510  retval = 2;
511  else if (curtime > pginfo->GetScheduledEndTime() &&
512  RemoteCheckForRecording(pginfo) > 0)
513  retval = 3;
514  }
515  }
516 
517  return retval;
518 }
519 
523 vector<ProgramInfo *> *RemoteGetCurrentlyRecordingList(void)
524 {
525  QString str = "QUERY_RECORDINGS ";
526  str += "Recording";
527  QStringList strlist( str );
528 
529  auto *reclist = new vector<ProgramInfo *>;
530  auto *info = new vector<ProgramInfo *>;
531  if (!RemoteGetRecordingList(*info, strlist))
532  {
533  delete info;
534  return reclist;
535  }
536 
537  // make sure whatever RemoteGetRecordingList() returned
538  // only has RecStatus::Recording shows
539  for (auto & p : *info)
540  {
541  if (p->GetRecordingStatus() == RecStatus::Recording ||
542  p->GetRecordingStatus() == RecStatus::Tuning ||
543  p->GetRecordingStatus() == RecStatus::Failing ||
544  (p->GetRecordingStatus() == RecStatus::Recorded &&
545  p->GetRecordingGroup() == "LiveTV"))
546  {
547  reclist->push_back(new ProgramInfo(*p));
548  }
549  }
550 
551  while (!info->empty())
552  {
553  delete info->back();
554  info->pop_back();
555  }
556  delete info;
557 
558  return reclist;
559 }
560 
564 bool RemoteGetActiveBackends(QStringList *list)
565 {
566  list->clear();
567  *list << "QUERY_ACTIVE_BACKENDS";
568 
569  if (!gCoreContext->SendReceiveStringList(*list))
570  return false;
571 
572  list->removeFirst();
573  return true;
574 }
575 
576 /* vim: set expandtab tabstop=4 shiftwidth=4: */
mythevent.h
RemoteGetAllScheduledRecordings
void RemoteGetAllScheduledRecordings(vector< ProgramInfo * > &scheduledlist)
Definition: remoteutil.cpp:162
ReferenceCounter::DecrRef
virtual int DecrRef(void)
Decrements reference count and deletes on 0.
Definition: referencecounter.cpp:125
MythSocket::SendReceiveStringList
bool SendReceiveStringList(QStringList &list, uint min_reply_length=0, uint timeoutMS=kLongTimeout)
Definition: mythsocket.cpp:342
MythCoreContext::SendReceiveStringList
bool SendReceiveStringList(QStringList &strlist, bool quickTimeout=false, bool block=true)
Send a message to the backend and wait for a response.
Definition: mythcorecontext.cpp:1376
RemoteGetConflictList
vector< ProgramInfo * > * RemoteGetConflictList(const ProgramInfo *pginfo)
Definition: remoteutil.cpp:202
RecStatus::Tuning
@ Tuning
Definition: recStatus.h:22
arg
arg(title).arg(filename).arg(doDelete))
RemoteGetRecordingList
uint RemoteGetRecordingList(vector< ProgramInfo * > &reclist, QStringList &strList)
Definition: remoteutil.cpp:174
RemoteGetPreviewLastModified
QDateTime RemoteGetPreviewLastModified(const ProgramInfo *pginfo)
Definition: remoteutil.cpp:214
RemoteGetRecordingMask
int RemoteGetRecordingMask(void)
Definition: remoteutil.cpp:384
RemoteUndeleteRecording
bool RemoteUndeleteRecording(uint recordingID)
Definition: remoteutil.cpp:139
RecStatus::Recorded
@ Recorded
Definition: recStatus.h:29
ProgramInfo::GetScheduledEndTime
QDateTime GetScheduledEndTime(void) const
The scheduled end time of the program.
Definition: programinfo.h:395
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:23
RemoteCheckFile
bool RemoteCheckFile(ProgramInfo *pginfo, bool checkSlaves)
Definition: remoteutil.cpp:90
build_compdb.file
file
Definition: build_compdb.py:55
remoteutil.h
MythDate::current
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
Definition: mythdate.cpp:10
ProgramInfo::GetRecordingStartTime
QDateTime GetRecordingStartTime(void) const
Approximate time the recording started.
Definition: programinfo.h:402
RemoteGetUptime
bool RemoteGetUptime(time_t &uptime)
Definition: remoteutil.cpp:54
tmp
static guint32 * tmp
Definition: goom_core.cpp:31
RemoteGetLoad
bool RemoteGetLoad(system_load_array &load)
Definition: remoteutil.cpp:39
system_load_array
std::array< double, 3 > system_load_array
Definition: remoteutil.h:17
MythSocket
Class for communcating between myth backends and frontends.
Definition: mythsocket.h:27
MythDate::fromSecsSinceEpoch
MBASE_PUBLIC QDateTime fromSecsSinceEpoch(uint seconds)
This function takes the number of seconds since the start of the epoch and returns a QDateTime with t...
Definition: mythdate.cpp:68
MythCoreContext::IsMasterBackend
bool IsMasterBackend(void)
is this the actual MBE process
Definition: mythcorecontext.cpp:712
ProgramInfo::SetPathname
void SetPathname(const QString &pn)
Definition: programinfo.cpp:2328
programinfo.h
ProgramInfo::GetScheduledStartTime
QDateTime GetScheduledStartTime(void) const
The scheduled start time of program.
Definition: programinfo.h:388
RemoteRecordings
QStringList RemoteRecordings(void)
Definition: remoteutil.cpp:370
MythCoreContext::GetBackendServerPort
int GetBackendServerPort(void)
Returns the locally defined backend control port.
Definition: mythcorecontext.cpp:1081
hardwareprofile.config.p
p
Definition: config.py:33
RemoteGetRecordingStatus
int RemoteGetRecordingStatus(const ProgramInfo *pginfo, int overrecsecs, int underrecsecs)
Get status of an individual programme (with pre-post roll?).
Definition: remoteutil.cpp:493
RemoteGetRecordedList
vector< ProgramInfo * > * RemoteGetRecordedList(int sort)
Definition: remoteutil.cpp:16
compat.h
MythCoreContext::GetBackendServerIP
QString GetBackendServerIP(void)
Returns the IP address of the locally defined backend IP.
Definition: mythcorecontext.cpp:1021
RecStatus::Failing
@ Failing
Definition: recStatus.h:18
RemoteCheckForRecording
int RemoteCheckForRecording(const ProgramInfo *pginfo)
Get recorder for a programme.
Definition: remoteutil.cpp:474
storagegroup.h
StorageGroup::GetGroupToUse
static QString GetGroupToUse(const QString &host, const QString &sgroup)
Definition: storagegroup.cpp:867
RemoteGetCurrentlyRecordingList
vector< ProgramInfo * > * RemoteGetCurrentlyRecordingList(void)
return list of currently recording shows
Definition: remoteutil.cpp:523
uint
unsigned int uint
Definition: compat.h:140
gCoreContext
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
Definition: mythcorecontext.cpp:56
MythCoreContext::GetNumSetting
int GetNumSetting(const QString &key, int defaultval=0)
Definition: mythcorecontext.cpp:929
RemoteGetMemStats
bool RemoteGetMemStats(int &totalMB, int &freeMB, int &totalVM, int &freeVM)
Definition: remoteutil.cpp:74
off_t
#define off_t
Definition: mythiowrapper.cpp:238
ProgramInfo::GetChanID
uint GetChanID(void) const
This is the unique key used in the database to locate tuning information.
Definition: programinfo.h:370
RemoteGetAllExpiringRecordings
void RemoteGetAllExpiringRecordings(vector< ProgramInfo * > &expiringlist)
Definition: remoteutil.cpp:168
ProgramInfo
Holds information on recordings and videos.
Definition: programinfo.h:68
RecStatus::Recording
@ Recording
Definition: recStatus.h:30
MythCoreContext::ConnectCommandSocket
MythSocket * ConnectCommandSocket(const QString &hostname, int port, const QString &announcement, bool *proto_mismatch=nullptr, int maxConnTry=-1, int setup_timeout=-1)
Definition: mythcorecontext.cpp:444
ProgramInfo::ToStringList
void ToStringList(QStringList &list) const
Serializes ProgramInfo into a QStringList which can be passed over a socket.
Definition: programinfo.cpp:1270
mythcorecontext.h
RemoteFillProgramInfo
bool RemoteFillProgramInfo(ProgramInfo &pginfo, const QString &playbackhost)
Definition: remoteutil.cpp:351
MythDate::ISODate
@ ISODate
Default UTC.
Definition: mythdate.h:14
MythCoreContext::GetHostName
QString GetHostName(void)
Definition: mythcorecontext.cpp:855
NUMPROGRAMLINES
#define NUMPROGRAMLINES
Definition: programinfo.h:28
RemoteGetPreviewIfModified
QDateTime RemoteGetPreviewIfModified(const ProgramInfo &pginfo, const QString &cachefile)
Download preview & get timestamp if newer than cachefile's last modified time, otherwise just get the...
Definition: remoteutil.cpp:233
RemoteDeleteRecording
bool RemoteDeleteRecording(uint recordingID, bool forceMetadataDelete, bool forgetHistory)
Definition: remoteutil.cpp:110
mythsocket.h
RemoteGetActiveBackends
bool RemoteGetActiveBackends(QStringList *list)
return list of backends currently connected to the master
Definition: remoteutil.cpp:564
RemoteGetFileList
bool RemoteGetFileList(const QString &host, const QString &path, QStringList *list, QString sgroup, bool fileNamesOnly)
Definition: remoteutil.cpp:421