MythTV  master
statusbox.cpp
Go to the documentation of this file.
1 // Qt
2 #include <QHostAddress>
3 #include <QNetworkInterface>
4 
5 // MythTV
9 #include "libmythbase/mythdate.h"
10 #include "libmythbase/mythdb.h"
13 #include "libmythbase/mythversion.h"
14 #include "libmythbase/remoteutil.h"
15 #include "libmythbase/stringutil.h"
16 #include "libmythtv/cardutil.h"
18 #include "libmythtv/jobqueue.h"
20 #include "libmythtv/tv.h"
22 #include "libmythui/mythdisplay.h"
25 #include "libmythui/mythuihelper.h"
27 #include "libmythui/mythuitext.h"
29 
30 // MythFrontend
31 #include "statusbox.h"
32 
33 struct LogLine {
34  QString m_line;
35  QString m_detail;
36  QString m_help;
37  QString m_helpdetail;
38  QString m_data;
39  QString m_state;
40 };
41 
42 void StatusBoxItem::Start(std::chrono::seconds Interval)
43 {
44  connect(this, &QTimer::timeout, [=]() { emit UpdateRequired(this); });
45  start(Interval);
46 }
47 
58  : MythScreenType(parent, "StatusBox")
59 {
60  m_minLevel = gCoreContext->GetNumSetting("LogDefaultView",5);
61 
62  QStringList strlist;
63  strlist << "QUERY_IS_ACTIVE_BACKEND";
64  strlist << gCoreContext->GetHostName();
65 
67 
68  m_isBackendActive = (strlist[0] == "TRUE");
69  m_popupStack = GetMythMainWindow()->GetStack("popup stack");
70 }
71 
73 {
74  if (m_logList)
75  gCoreContext->SaveSetting("StatusBoxItemCurrent",
77 }
78 
80 {
81  if (!LoadWindowFromXML("status-ui.xml", "status", this))
82  return false;
83 
84  m_categoryList = dynamic_cast<MythUIButtonList *>(GetChild("category"));
85  m_logList = dynamic_cast<MythUIButtonList *>(GetChild("log"));
86 
87  m_iconState = dynamic_cast<MythUIStateType *>(GetChild("icon"));
88  m_helpText = dynamic_cast<MythUIText *>(GetChild("helptext"));
89  m_justHelpText = dynamic_cast<MythUIText *>(GetChild("justhelptext"));
90 
92  {
93  LOG(VB_GENERAL, LOG_ERR, "StatusBox, theme is missing "
94  "required elements");
95  return false;
96  }
97 
101  this, &StatusBox::setHelpText);
103  this, &StatusBox::clicked);
104 
105  BuildFocusList();
106  return true;
107 }
108 
110 {
111  auto *item = new MythUIButtonListItem(m_categoryList, tr("Listings Status"),
113  item->DisplayState("listings", "icon");
114 
115  item = new MythUIButtonListItem(m_categoryList, tr("Schedule Status"),
117  item->DisplayState("schedule", "icon");
118 
119  item = new MythUIButtonListItem(m_categoryList, tr("Input Status"),
121  item->DisplayState("tuner", "icon");
122 
123  item = new MythUIButtonListItem(m_categoryList, tr("Job Queue"),
125  item->DisplayState("jobqueue", "icon");
126 
127  item = new MythUIButtonListItem(m_categoryList, tr("Video decoders"),
129  item->DisplayState("decoders", "icon");
130 
131  item = new MythUIButtonListItem(m_categoryList, tr("Display"),
133  item->DisplayState("display", "icon");
134 
135  item = new MythUIButtonListItem(m_categoryList, tr("Rendering"),
137  item->DisplayState("render", "icon");
138 
139  item = new MythUIButtonListItem(m_categoryList, tr("Machine Status"),
141  item->DisplayState("machine", "icon");
142 
143  item = new MythUIButtonListItem(m_categoryList, tr("AutoExpire List"),
144  qOverload<>(&StatusBox::doAutoExpireList));
145  item->DisplayState("autoexpire", "icon");
146 
147  int itemCurrent = gCoreContext->GetNumSetting("StatusBoxItemCurrent", 0);
148  m_categoryList->SetItemCurrent(itemCurrent);
149 }
150 
151 StatusBoxItem *StatusBox::AddLogLine(const QString & line,
152  const QString & help,
153  const QString & detail,
154  const QString & helpdetail,
155  const QString & state,
156  const QString & data)
157 {
158  LogLine logline;
159  logline.m_line = line;
160 
161  if (detail.isEmpty())
162  logline.m_detail = line;
163  else
164  logline.m_detail = detail;
165 
166  if (help.isEmpty())
167  logline.m_help = logline.m_detail;
168  else
169  logline.m_help = help;
170 
171  if (helpdetail.isEmpty())
172  logline.m_helpdetail = logline.m_detail;
173  else
174  logline.m_helpdetail = helpdetail;
175 
176  logline.m_state = state;
177  logline.m_data = data;
178 
179  auto *item = new StatusBoxItem(m_logList, line, QVariant::fromValue(logline));
180  if (logline.m_state.isEmpty())
181  logline.m_state = "normal";
182 
183  item->SetFontState(logline.m_state);
184  item->DisplayState(logline.m_state, "status");
185  item->SetText(logline.m_detail, "detail");
186  return item;
187 }
188 
189 bool StatusBox::keyPressEvent(QKeyEvent *event)
190 {
191  if (GetFocusWidget()->keyPressEvent(event))
192  return true;
193 
194  QStringList actions;
195  bool handled = GetMythMainWindow()->TranslateKeyPress("Status", event, actions);
196 
197 #if 0
198  for (int i = 0; i < actions.size() && !handled; ++i)
199  {
200  QString action = actions[i];
201  handled = true;
202 
203  if (action == "MENU")
204  {
205  }
206  else
207  handled = false;
208  }
209 #endif
210 
211  if (!handled && MythScreenType::keyPressEvent(event))
212  handled = true;
213 
214  return handled;
215 }
216 
218 {
219  if (!item || GetFocusWidget() != m_logList)
220  return;
221 
222  auto logline = item->GetData().value<LogLine>();
223  if (m_helpText)
224  m_helpText->SetText(logline.m_helpdetail);
225  if (m_justHelpText)
226  m_justHelpText->SetText(logline.m_help);
227 }
228 
230 {
231  if (!item)
232  return;
233 
234  disconnect(this, &StatusBox::updateLog,nullptr,nullptr);
235 
236  if (item->GetData().value<MythUICallbackMF>())
237  {
238  connect(this, &StatusBox::updateLog,
239  item->GetData().value<MythUICallbackMF>());
240  emit updateLog();
241  }
242  else if (item->GetData().value<MythUICallbackMFc>())
243  {
244  connect(this, &StatusBox::updateLog,
245  item->GetData().value<MythUICallbackMFc>());
246  emit updateLog();
247  }
248 }
249 
251 {
252  if (!item)
253  return;
254 
255  auto logline = item->GetData().value<LogLine>();
256 
258  QString currentItem;
259  if (currentButton)
260  currentItem = currentButton->GetText();
261 
262  // FIXME: Comparisons against strings here is not great, changing names
263  // breaks everything and it's inefficient
264  if (currentItem == tr("Job Queue"))
265  {
266  int jobStatus = JobQueue::GetJobStatus(logline.m_data.toInt());
267 
268  if (jobStatus == JOB_QUEUED)
269  {
270  QString message = tr("Delete Job?");
271 
272  auto *confirmPopup =
273  new MythConfirmationDialog(m_popupStack, message);
274 
275  confirmPopup->SetReturnEvent(this, "JobDelete");
276  confirmPopup->SetData(logline.m_data);
277 
278  if (confirmPopup->Create())
279  m_popupStack->AddScreen(confirmPopup, false);
280  }
281  else if ((jobStatus == JOB_PENDING) ||
282  (jobStatus == JOB_STARTING) ||
283  (jobStatus == JOB_RUNNING) ||
284  (jobStatus == JOB_PAUSED))
285  {
286  QString label = tr("Job Queue Actions:");
287 
288  auto *menuPopup = new MythDialogBox(label, m_popupStack,
289  "statusboxpopup");
290 
291  if (menuPopup->Create())
292  m_popupStack->AddScreen(menuPopup, false);
293 
294  menuPopup->SetReturnEvent(this, "JobModify");
295 
296  QVariant data = QVariant::fromValue(logline.m_data);
297 
298  if (jobStatus == JOB_PAUSED)
299  menuPopup->AddButtonV(tr("Resume"), data);
300  else
301  menuPopup->AddButtonV(tr("Pause"), data);
302  menuPopup->AddButtonV(tr("Stop"), data);
303  menuPopup->AddButtonV(tr("No Change"), data);
304  }
305  else if (jobStatus & JOB_DONE)
306  {
307  QString message = tr("Requeue Job?");
308 
309  auto *confirmPopup =
310  new MythConfirmationDialog(m_popupStack, message);
311 
312  confirmPopup->SetReturnEvent(this, "JobRequeue");
313  confirmPopup->SetData(logline.m_data);
314 
315  if (confirmPopup->Create())
316  m_popupStack->AddScreen(confirmPopup, false);
317  }
318  }
319  else if (currentItem == tr("AutoExpire List"))
320  {
322 
323  if (rec)
324  {
325  QString label = tr("AutoExpire Actions:");
326 
327  auto *menuPopup = new MythDialogBox(label, m_popupStack,
328  "statusboxpopup");
329 
330  if (menuPopup->Create())
331  m_popupStack->AddScreen(menuPopup, false);
332 
333  menuPopup->SetReturnEvent(this, "AutoExpireManage");
334 
335  menuPopup->AddButtonV(tr("Delete Now"), QVariant::fromValue(rec));
336  if ((rec)->GetRecordingGroup() == "LiveTV")
337  {
338  menuPopup->AddButtonV(tr("Move to Default group"),
339  QVariant::fromValue(rec));
340  }
341  else if ((rec)->GetRecordingGroup() == "Deleted")
342  menuPopup->AddButtonV(tr("Undelete"), QVariant::fromValue(rec));
343  else
344  menuPopup->AddButtonV(tr("Disable AutoExpire"),
345  QVariant::fromValue(rec));
346  menuPopup->AddButtonV(tr("No Change"), QVariant::fromValue(rec));
347 
348  }
349  }
350 }
351 
352 void StatusBox::customEvent(QEvent *event)
353 {
354  if (event->type() == DialogCompletionEvent::kEventType)
355  {
356  auto *dce = (DialogCompletionEvent*)(event);
357 
358  QString resultid = dce->GetId();
359  int buttonnum = dce->GetResult();
360 
361  if (resultid == "JobDelete")
362  {
363  if (buttonnum == 1)
364  {
365  int jobID = dce->GetData().toInt();
367 
369  }
370  }
371  else if (resultid == "JobRequeue")
372  {
373  if (buttonnum == 1)
374  {
375  int jobID = dce->GetData().toInt();
376  JobQueue::ChangeJobStatus(jobID, JOB_QUEUED);
378  }
379  }
380  else if (resultid == "JobModify")
381  {
382  int jobID = dce->GetData().toInt();
383  if (buttonnum == 0)
384  {
385  if (JobQueue::GetJobStatus(jobID) == JOB_PAUSED)
387  else
389  }
390  else if (buttonnum == 1)
391  {
393  }
394 
396  }
397  else if (resultid == "AutoExpireManage")
398  {
399  auto* rec = dce->GetData().value<ProgramInfo*>();
400 
401  // button 2 is "No Change"
402  if (!rec || buttonnum == 2)
403  return;
404 
405  // button 1 is "Delete Now"
406  if ((buttonnum == 0) && rec->QueryIsDeleteCandidate())
407  {
408  if (!RemoteDeleteRecording(rec->GetRecordingID(),
409  false, false))
410  {
411  LOG(VB_GENERAL, LOG_ERR, QString("Failed to delete recording: %1").arg(rec->GetTitle()));
412  return;
413  }
414  }
415  // button 1 is "Move To Default Group" or "UnDelete" or "Disable AutoExpire"
416  else if (buttonnum == 1)
417  {
418  if ((rec)->GetRecordingGroup() == "Deleted")
419  {
420  RemoteUndeleteRecording(rec->GetRecordingID());
421  }
422  else
423  {
424  rec->SaveAutoExpire(kDisableAutoExpire);
425 
426  if ((rec)->GetRecordingGroup() == "LiveTV")
427  {
428  RecordingInfo ri(*rec);
430  *rec = ri;
431  }
432  }
433  }
434 
435  // remove the changed recording from the expire list
436  delete m_expList[m_logList->GetCurrentPos()];
437  m_expList.erase(m_expList.begin() + m_logList->GetCurrentPos());
438 
439  int pos = m_logList->GetCurrentPos();
440  int topPos = m_logList->GetTopItemPos();
441  doAutoExpireList(false);
442  m_logList->SetItemCurrent(pos, topPos);
443  }
444 
445  }
446 }
447 
449 {
450  if (m_iconState)
451  m_iconState->DisplayState("listings");
452  m_logList->Reset();
453 
454  QString helpmsg(tr("Listings Status shows the latest "
455  "status information from "
456  "mythfilldatabase"));
457  if (m_helpText)
458  m_helpText->SetText(helpmsg);
459  if (m_justHelpText)
460  m_justHelpText->SetText(helpmsg);
461 
462  QDateTime mfdLastRunStart;
463  QDateTime mfdLastRunEnd;
464  QDateTime mfdNextRunStart;
465  QString mfdLastRunStatus;
466  QDateTime qdtNow;
467  QDateTime GuideDataThrough;
468 
469  qdtNow = MythDate::current();
470 
471  MSqlQuery query(MSqlQuery::InitCon());
472  query.prepare("SELECT max(endtime) FROM program WHERE manualid=0;");
473 
474  if (query.exec() && query.next())
475  GuideDataThrough = MythDate::fromString(query.value(0).toString());
476 
477  QString tmp = gCoreContext->GetSetting("mythfilldatabaseLastRunStart");
478  mfdLastRunStart = MythDate::fromString(tmp);
479  tmp = gCoreContext->GetSetting("mythfilldatabaseLastRunEnd");
480  mfdLastRunEnd = MythDate::fromString(tmp);
481  tmp = gCoreContext->GetSetting("MythFillSuggestedRunTime");
482  mfdNextRunStart = MythDate::fromString(tmp);
483 
484  mfdLastRunStatus = gCoreContext->GetSetting("mythfilldatabaseLastRunStatus");
485 
486  AddLogLine(tr("Mythfrontend version: %1 (%2)")
488  helpmsg);
489  AddLogLine(tr("Database schema version: %1").arg(gCoreContext->GetSetting("DBSchemaVer")));
490  AddLogLine(tr("Last mythfilldatabase guide update:"), helpmsg);
491  tmp = tr("Started: %1").arg(
493  mfdLastRunStart, MythDate::kDateTimeFull | MythDate::kSimplify));
494  AddLogLine(tmp, helpmsg);
495 
496  if (mfdLastRunEnd >= mfdLastRunStart)
497  {
498  tmp = tr("Finished: %1")
499  .arg(MythDate::toString(
500  mfdLastRunEnd,
502  AddLogLine(tmp, helpmsg);
503  }
504 
505  AddLogLine(tr("Result: %1").arg(mfdLastRunStatus), helpmsg);
506 
507 
508  if (mfdNextRunStart >= mfdLastRunStart)
509  {
510  tmp = tr("Suggested Next: %1")
511  .arg(MythDate::toString(
512  mfdNextRunStart,
514  AddLogLine(tmp, helpmsg);
515  }
516 
517  int DaysOfData = qdtNow.daysTo(GuideDataThrough);
518 
519  if (GuideDataThrough.isNull())
520  {
521  AddLogLine(tr("There's no guide data available!"), helpmsg,
522  "", "warning");
523  AddLogLine(tr("Have you run mythfilldatabase?"), helpmsg,
524  "", "warning");
525  }
526  else
527  {
528  AddLogLine(
529  tr("There is guide data until %1")
530  .arg(MythDate::toString(
531  GuideDataThrough,
533 
534  AddLogLine(QString("(%1).").arg(tr("%n day(s)", "", DaysOfData)),
535  helpmsg);
536  }
537 
538  if (DaysOfData <= 3)
539  AddLogLine(tr("WARNING: is mythfilldatabase running?"), helpmsg,
540  "", "", "warning");
541 }
542 
544 {
545  if (m_iconState)
546  m_iconState->DisplayState("schedule");
547  m_logList->Reset();
548 
549  QString helpmsg(tr("Schedule Status shows current statistics "
550  "from the scheduler."));
551  if (m_helpText)
552  m_helpText->SetText(helpmsg);
553  if (m_justHelpText)
554  m_justHelpText->SetText(helpmsg);
555 
556  MSqlQuery query(MSqlQuery::InitCon());
557 
558  query.prepare("SELECT COUNT(*) FROM record WHERE type = :TEMPLATE");
559  query.bindValue(":TEMPLATE", kTemplateRecord);
560  if (query.exec() && query.next())
561  {
562  QString rules = tr("%n template rule(s) (is) defined", "",
563  query.value(0).toInt());
564  AddLogLine(rules, helpmsg);
565  }
566  else
567  {
568  MythDB::DBError("StatusBox::doScheduleStatus()", query);
569  return;
570  }
571 
572  query.prepare("SELECT COUNT(*) FROM record "
573  "WHERE type <> :TEMPLATE AND search = :NOSEARCH");
574  query.bindValue(":TEMPLATE", kTemplateRecord);
575  query.bindValue(":NOSEARCH", kNoSearch);
576  if (query.exec() && query.next())
577  {
578  QString rules = tr("%n standard rule(s) (is) defined", "",
579  query.value(0).toInt());
580  AddLogLine(rules, helpmsg);
581  }
582  else
583  {
584  MythDB::DBError("StatusBox::doScheduleStatus()", query);
585  return;
586  }
587 
588  query.prepare("SELECT COUNT(*) FROM record WHERE search > :NOSEARCH");
589  query.bindValue(":NOSEARCH", kNoSearch);
590  if (query.exec() && query.next())
591  {
592  QString rules = tr("%n search rule(s) are defined", "",
593  query.value(0).toInt());
594  AddLogLine(rules, helpmsg);
595  }
596  else
597  {
598  MythDB::DBError("StatusBox::doScheduleStatus()", query);
599  return;
600  }
601 
602  QMap<RecStatus::Type, int> statusMatch;
603  QMap<RecStatus::Type, QString> statusText;
604  QMap<int, int> sourceMatch;
605  QMap<int, QString> sourceText;
606  QMap<int, int> cardMatch;
607  QMap<int, QString> cardText;
608  QMap<int, int> cardParent;
609  QMap<int, bool> cardSchedGroup;
610  QString tmpstr;
611  int maxSource = 0;
612  int maxCard = 0;
613  int lowerpriority = 0;
614  int hdflag = 0;
615 
616  query.prepare("SELECT MAX(sourceid) FROM videosource");
617  if (query.exec())
618  {
619  if (query.next())
620  maxSource = query.value(0).toInt();
621  }
622 
623  query.prepare("SELECT sourceid,name FROM videosource");
624  if (query.exec())
625  {
626  while (query.next())
627  sourceText[query.value(0).toInt()] = query.value(1).toString();
628  }
629 
630  query.prepare("SELECT MAX(cardid) FROM capturecard");
631  if (query.exec())
632  {
633  if (query.next())
634  maxCard = query.value(0).toInt();
635  }
636 
637  query.prepare("SELECT cardid, inputname, displayname, parentid, "
638  " schedgroup "
639  "FROM capturecard");
640  if (query.exec())
641  {
642  while (query.next())
643  {
644  int inputid = query.value(0).toInt();
645  cardText[inputid] = query.value(2).toString();
646  if (cardText[inputid].isEmpty())
647  cardText[inputid] = QString::number(query.value(1).toInt());
648  cardParent[inputid] = query.value(3).toInt();
649  cardSchedGroup[inputid] = query.value(4).toBool();
650  }
651  }
652 
653  ProgramList schedList;
654  LoadFromScheduler(schedList);
655 
656  tmpstr = tr("%n matching showing(s)", "", schedList.size());
657  AddLogLine(tmpstr, helpmsg);
658 
659  for (auto *s : schedList)
660  {
661  const RecStatus::Type recstatus = s->GetRecordingStatus();
662 
663  if (statusMatch[recstatus] < 1)
664  {
665  statusText[recstatus] = RecStatus::toString(
666  recstatus, s->GetRecordingRuleType());
667  }
668 
669  ++statusMatch[recstatus];
670 
671  if (recstatus == RecStatus::WillRecord ||
672  recstatus == RecStatus::Pending ||
673  recstatus == RecStatus::Recording ||
674  recstatus == RecStatus::Tuning ||
675  recstatus == RecStatus::Failing)
676  {
677  ++sourceMatch[s->GetSourceID()];
678  int inputid = s->GetInputID();
679  // When schedgroup is used, always attribute recordings to
680  // the parent inputs.
681  if (cardParent[inputid] && cardSchedGroup[cardParent[inputid]])
682  inputid = cardParent[inputid];
683  ++cardMatch[inputid];
684  if (s->GetRecordingPriority2() < 0)
685  ++lowerpriority;
686  if (s->GetVideoProperties() & VID_HDTV)
687  ++hdflag;
688  }
689  }
690 
691 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
692 #define ADD_STATUS_LOG_LINE(rtype, fstate) \
693  do { \
694  if (statusMatch[rtype] > 0) \
695  { \
696  tmpstr = QString("%1 %2").arg(statusMatch[rtype]) \
697  .arg(statusText[rtype]); \
698  AddLogLine(tmpstr, helpmsg, tmpstr, tmpstr, fstate);\
699  } \
700  } while (false)
711 
712  QString willrec = statusText[RecStatus::WillRecord];
713 
714  if (lowerpriority > 0)
715  {
716  tmpstr = QString("%1 %2 %3").arg(QString::number(lowerpriority),
717  willrec, tr("with lower priority"));
718  AddLogLine(tmpstr, helpmsg, tmpstr, tmpstr, "warning");
719  }
720  if (hdflag > 0)
721  {
722  tmpstr = QString("%1 %2 %3").arg(QString::number(hdflag),
723  willrec, tr("marked as HDTV"));
724  AddLogLine(tmpstr, helpmsg);
725  }
726  for (int i = 1; i <= maxSource; ++i)
727  {
728  if (sourceMatch[i] > 0)
729  {
730  tmpstr = QString("%1 %2 %3 %4 \"%5\"")
731  .arg(QString::number(sourceMatch[i]), willrec,
732  tr("from source"), QString::number(i), sourceText[i]);
733  AddLogLine(tmpstr, helpmsg);
734  }
735  }
736  for (int i = 1; i <= maxCard; ++i)
737  {
738  if (cardMatch[i] > 0)
739  {
740  tmpstr = QString("%1 %2 %3 %4 \"%5\"")
741  .arg(QString::number(cardMatch[i]), willrec,
742  tr("on input"), QString::number(i), cardText[i]);
743  AddLogLine(tmpstr, helpmsg);
744  }
745  }
746 }
747 
749 {
750  struct info
751  {
752  int m_inputid {0};
753  bool m_schedgroup {false};
754  QString m_displayname;
755  int m_errored {0};
756  int m_unavailable {0};
757  int m_sleeping {0};
758  int m_recording {0};
759  int m_livetv {0};
760  int m_available {0};
761  QStringList m_recordings;
762  };
763  QMap<int, struct info> info;
764  QList<int> inputids;
765 
766  if (m_iconState)
767  m_iconState->DisplayState("tuner");
768  m_logList->Reset();
769 
770  QString helpmsg(tr("Input Status shows the current information "
771  "about the state of backend inputs"));
772  if (m_helpText)
773  m_helpText->SetText(helpmsg);
774  if (m_justHelpText)
775  m_justHelpText->SetText(helpmsg);
776 
777  MSqlQuery query(MSqlQuery::InitCon());
778  query.prepare(
779  "SELECT cardid, parentid, schedgroup, displayname "
780  "FROM capturecard ORDER BY cardid");
781 
782  if (!query.exec() || !query.isActive())
783  {
784  MythDB::DBError("StatusBox::doTunerStatus()", query);
785  return;
786  }
787 
788  while (query.next())
789  {
790  int inputid = query.value(0).toInt();
791  int parentid = query.value(1).toInt();
792 
793  // If this is a schedgroup child, attribute all status to the
794  // parent.
795  int infoid = inputid;
796  if (parentid && info[parentid].m_schedgroup)
797  infoid = parentid;
798  else
799  {
800  info[infoid].m_inputid = inputid;
801  info[infoid].m_schedgroup = query.value(2).toBool();
802  info[infoid].m_displayname = query.value(3).toString();
803  inputids.append(inputid);
804  }
805 
806  QString cmd = QString("QUERY_REMOTEENCODER %1").arg(inputid);
807  QStringList strlist( cmd );
808  strlist << "GET_STATE";
809 
811  int state = strlist[0].toInt();
812 
813  if (state == kState_Error)
814  {
815  strlist.clear();
816  strlist << QString("QUERY_REMOTEENCODER %1").arg(inputid);
817  strlist << "GET_SLEEPSTATUS";
818 
820  int sleepState = strlist[0].toInt();
821 
822  if (sleepState == -1)
823  info[infoid].m_errored += 1;
824  else if (sleepState == sStatus_Undefined)
825  info[infoid].m_unavailable += 1;
826  else
827  info[infoid].m_sleeping += 1;
828  }
829  else if (state == kState_RecordingOnly ||
830  state == kState_WatchingRecording)
831  info[infoid].m_recording += 1;
832  else if (state == kState_WatchingLiveTV)
833  info[infoid].m_livetv += 1;
834  else
835  info[infoid].m_available += 1;
836 
837  if (state == kState_RecordingOnly ||
838  state == kState_WatchingRecording ||
839  state == kState_WatchingLiveTV)
840  {
841  strlist = QStringList( QString("QUERY_RECORDER %1").arg(inputid));
842  strlist << "GET_RECORDING";
844  ProgramInfo pginfo(strlist);
845  if (pginfo.GetChanID())
846  {
847  QString titlesub = pginfo.GetTitle();
848  if (!pginfo.GetSubtitle().isEmpty())
849  titlesub += QString(" - ") + pginfo.GetSubtitle();
850  info[infoid].m_recordings += titlesub;
851  }
852  }
853  }
854 
855  for (int inputid : qAsConst(inputids))
856  {
857  QStringList statuslist;
858  if (info[inputid].m_errored)
859  statuslist << tr("%1 errored").arg(info[inputid].m_errored);
860  if (info[inputid].m_unavailable)
861  statuslist << tr("%1 unavailable").arg(info[inputid].m_unavailable);
862  if (info[inputid].m_sleeping)
863  statuslist << tr("%1 sleeping").arg(info[inputid].m_sleeping);
864  if (info[inputid].m_recording)
865  statuslist << tr("%1 recording").arg(info[inputid].m_recording);
866  if (info[inputid].m_livetv)
867  statuslist << tr("%1 live television").arg(info[inputid].m_livetv);
868  if (info[inputid].m_available)
869  statuslist << tr("%1 available").arg(info[inputid].m_available);
870 
871  QString fontstate;
872  if (info[inputid].m_errored)
873  fontstate = "error";
874  else if (info[inputid].m_unavailable || info[inputid].m_sleeping)
875  fontstate = "warning";
876 
877  QString shortstatus = tr("Input %1 %2: %3")
878  .arg(QString::number(inputid), info[inputid].m_displayname,
879  statuslist.join(tr(", ")));
880  QString longstatus = shortstatus + "\n" +
881  info[inputid].m_recordings.join("\n");
882 
883  AddLogLine(shortstatus, helpmsg, longstatus, longstatus, fontstate);
884  }
885 }
886 
888 {
889  if (m_iconState)
890  m_iconState->DisplayState("log");
891  m_logList->Reset();
892 
893  QString helpmsg(tr("Log Entries shows any unread log entries "
894  "from the system if you have logging enabled"));
895  if (m_helpText)
896  m_helpText->SetText(helpmsg);
897  if (m_justHelpText)
898  m_justHelpText->SetText(helpmsg);
899 
900  MSqlQuery query(MSqlQuery::InitCon());
901  query.prepare("SELECT logid, module, priority, logdate, host, "
902  "message, details "
903  "FROM mythlog WHERE acknowledged = 0 "
904  "AND priority <= :PRIORITY ORDER BY logdate DESC;");
905  query.bindValue(":PRIORITY", m_minLevel);
906 
907  if (query.exec())
908  {
909  QString line;
910  QString detail;
911  while (query.next())
912  {
913  line = QString("%1").arg(query.value(5).toString());
914 
915  detail = tr("On %1 from %2.%3\n%4\n")
916  .arg(MythDate::toString(
917  MythDate::as_utc(query.value(3).toDateTime()),
919  query.value(4).toString(),
920  query.value(1).toString(),
921  query.value(5).toString());
922 
923  QString tmp = query.value(6).toString();
924  if (!tmp.isEmpty())
925  detail.append(tmp);
926  else
927  detail.append(tr("No further details"));
928 
929  AddLogLine(line, helpmsg, detail, detail,
930  "", query.value(0).toString());
931  }
932 
933  if (query.size() == 0)
934  {
935  AddLogLine(tr("No items found at priority level %1 or lower.")
936  .arg(m_minLevel), helpmsg);
937  AddLogLine(tr("Use 1-8 to change priority level."), helpmsg);
938  }
939  }
940 }
941 
943 {
944  if (m_iconState)
945  m_iconState->DisplayState("jobqueue");
946  m_logList->Reset();
947 
948  QString helpmsg(tr("Job Queue shows any jobs currently in "
949  "MythTV's Job Queue such as a commercial "
950  "detection job."));
951  if (m_helpText)
952  m_helpText->SetText(helpmsg);
953  if (m_justHelpText)
954  m_justHelpText->SetText(helpmsg);
955 
956  QMap<int, JobQueueEntry> jobs;
957  QMap<int, JobQueueEntry>::Iterator it;
958 
962 
963  if (!jobs.empty())
964  {
965  QString detail;
966  QString line;
967 
968  for (it = jobs.begin(); it != jobs.end(); ++it)
969  {
970  ProgramInfo pginfo((*it).chanid, (*it).recstartts);
971 
972  if (!pginfo.GetChanID())
973  continue;
974 
975  detail = QString("%1\n%2 %3 @ %4\n%5 %6 %7 %8")
976  .arg(pginfo.GetTitle(),
977  pginfo.GetChannelName(),
978  pginfo.GetChanNum(),
980  pginfo.GetRecordingStartTime(),
982  tr("Job:"),
983  JobQueue::JobText((*it).type),
984  tr("Status: "),
985  JobQueue::StatusText((*it).status));
986 
987  if ((*it).status != JOB_QUEUED)
988  detail += " (" + (*it).hostname + ')';
989 
990  if ((*it).schedruntime > MythDate::current())
991  {
992  detail += '\n' + tr("Scheduled Run Time:") + ' ' +
994  (*it).schedruntime,
996  }
997  else
998  {
999  detail += '\n' + (*it).comment;
1000  }
1001 
1002  line = QString("%1 @ %2")
1003  .arg(pginfo.GetTitle(),
1005  pginfo.GetRecordingStartTime(),
1007 
1008  QString font;
1009  if ((*it).status == JOB_ERRORED)
1010  font = "error";
1011  else if ((*it).status == JOB_ABORTED)
1012  font = "warning";
1013 
1014  AddLogLine(line, helpmsg, detail, detail, font,
1015  QString("%1").arg((*it).id));
1016  }
1017  }
1018  else
1019  AddLogLine(tr("Job Queue is currently empty."), helpmsg);
1020 
1021 }
1022 
1023 // Some helper routines for doMachineStatus() that format the output strings
1024 
1025 static QString usage_str_kb(long long total,
1026  long long used,
1027  long long free)
1028 {
1029  QString ret = QObject::tr("Unknown");
1030  if (total > 0.0 && free > 0.0)
1031  {
1032  double percent = (100.0*free)/total;
1033  ret = StatusBox::tr("%1 total, %2 used, %3 (or %4%) free.")
1034  .arg(StringUtil::formatKBytes(total),
1037  .arg(percent, 0, 'f', (percent >= 10.0) ? 0 : 2);
1038  }
1039  return ret;
1040 }
1041 
1042 static QString usage_str_mb(float total, float used, float free)
1043 {
1044  return usage_str_kb((long long)(total*1024), (long long)(used*1024),
1045  (long long)(free*1024));
1046 }
1047 
1048 static void disk_usage_with_rec_time_kb(QStringList& out, long long total,
1049  long long used, long long free,
1050  const recprof2bps_t& prof2bps)
1051 {
1052  const QString tail = StatusBox::tr(", using your %1 rate of %2 kb/s");
1053 
1054  out<<usage_str_kb(total, used, free);
1055  if (free<0)
1056  return;
1057 
1058  // NOLINTNEXTLINE(modernize-loop-convert)
1059  for (auto it = prof2bps.begin(); it != prof2bps.end(); ++it)
1060  {
1061  const QString pro =
1062  tail.arg(it.key()).arg((int)((float)(*it) / 1024.0F));
1063 
1064  long long bytesPerMin = ((*it) >> 1) * 15LL;
1065  uint minLeft = ((free<<5)/bytesPerMin)<<5;
1066  minLeft = (minLeft/15)*15;
1067  uint hoursLeft = minLeft/60;
1068  QString hourstring = StatusBox::tr("%n hour(s)", "", hoursLeft);
1069  QString minstring = StatusBox::tr("%n minute(s)", "", minLeft%60);
1070  QString remainstring = StatusBox::tr("%1 remaining", "time");
1071  if (minLeft%60 == 0)
1072  out<<remainstring.arg(hourstring) + pro;
1073  else if (minLeft > 60)
1074  {
1075  out<<StatusBox::tr("%1 and %2 remaining", "time")
1076  .arg(hourstring, minstring) + pro;
1077  }
1078  else
1079  {
1080  out<<remainstring.arg(minstring) + pro;
1081  }
1082  }
1083 }
1084 
1085 static QString uptimeStr(std::chrono::seconds uptime)
1086 {
1087  QString str = " " + StatusBox::tr("Uptime") + ": ";
1088 
1089  if (uptime == 0s)
1090  return str + StatusBox::tr("unknown", "unknown uptime");
1091 
1092  auto days = duration_cast<std::chrono::days>(uptime);
1093  auto secs = uptime % 24h;
1094 
1095  QString astext;
1096  if (days.count() > 0)
1097  {
1098  astext = QString("%1, %2")
1099  .arg(StatusBox::tr("%n day(s)", "", days.count()),
1100  MythDate::formatTime(secs, "H:mm"));
1101  } else {
1102  astext = MythDate::formatTime(secs, "H:mm:ss");
1103  }
1104  return str + astext;
1105 }
1106 
1110 void StatusBox::getActualRecordedBPS(const QString& hostnames)
1111 {
1112  m_recordingProfilesBps.clear();
1113 
1114  QString querystr;
1115  MSqlQuery query(MSqlQuery::InitCon());
1116 
1117  querystr =
1118  "SELECT sum(filesize) * 8 / "
1119  "sum(((unix_timestamp(endtime) - unix_timestamp(starttime)))) "
1120  "AS avg_bitrate "
1121  "FROM recorded WHERE hostname in (%1) "
1122  "AND (unix_timestamp(endtime) - unix_timestamp(starttime)) > 300;";
1123 
1124  query.prepare(querystr.arg(hostnames));
1125 
1126  if (query.exec() && query.next() &&
1127  query.value(0).toDouble() > 0)
1128  {
1129  QString rateStr = tr("average", "average rate");
1130 
1131  // Don't user a tr() directly here as the Qt tools will
1132  // not be able to extract the string for translation.
1133  m_recordingProfilesBps[rateStr] =
1134  (int)(query.value(0).toDouble());
1135  }
1136 
1137  querystr =
1138  "SELECT max(filesize * 8 / "
1139  "(unix_timestamp(endtime) - unix_timestamp(starttime))) "
1140  "AS max_bitrate "
1141  "FROM recorded WHERE hostname in (%1) "
1142  "AND (unix_timestamp(endtime) - unix_timestamp(starttime)) > 300;";
1143 
1144  query.prepare(querystr.arg(hostnames));
1145 
1146  if (query.exec() && query.next() &&
1147  query.value(0).toDouble() > 0)
1148  {
1149  QString rateStr = tr("maximum", "maximum rate");
1150 
1151  // Don't user a tr() directly here as the Qt tools will
1152  // not be able to extract the string for translation.
1153  m_recordingProfilesBps[rateStr] =
1154  (int)(query.value(0).toDouble());
1155  }
1156 }
1157 
1167 {
1168  if (m_iconState)
1169  m_iconState->DisplayState("machine");
1170  m_logList->Reset();
1171  QString machineStr = tr("Machine Status shows some operating system "
1172  "statistics of this machine and the MythTV "
1173  "server.");
1174 
1175  if (m_helpText)
1176  m_helpText->SetText(machineStr);
1177  if (m_justHelpText)
1178  m_justHelpText->SetText(machineStr);
1179 
1180  QString line;
1181  if (m_isBackendActive)
1182  line = tr("System:");
1183  else
1184  line = tr("This machine:");
1185  AddLogLine(line, machineStr);
1186 
1187  // Time
1188  StatusBoxItem *timebox = AddLogLine("");
1189  auto UpdateTime = [](StatusBoxItem* Item)
1190  {
1191  Item->SetText(" " + tr("System time") + ": " + QDateTime::currentDateTime().toString());
1192  };
1193  UpdateTime(timebox);
1194  connect(timebox, &StatusBoxItem::UpdateRequired, UpdateTime);
1195  timebox->Start();
1196 
1197  // Hostname & IP
1198  AddLogLine(" " + tr("Hostname") + ": " + gCoreContext->GetHostName());
1199  AddLogLine(" " + tr("OS") + QString(": %1 (%2)").arg(QSysInfo::prettyProductName(),
1200  QSysInfo::currentCpuArchitecture()));
1201  AddLogLine(" " + tr("Qt version") + QString(": %1").arg(qVersion()));
1202 
1203  QList allInterfaces = QNetworkInterface::allInterfaces();
1204  for (const QNetworkInterface & iface : qAsConst(allInterfaces))
1205  {
1206  QNetworkInterface::InterfaceFlags f = iface.flags();
1207  if (!(f & QNetworkInterface::IsUp))
1208  continue;
1209  if (!(f & QNetworkInterface::IsRunning))
1210  continue;
1211  if ((f & QNetworkInterface::IsLoopBack) != 0U)
1212  continue;
1213 
1214  QNetworkInterface::InterfaceType type = iface.type();
1215  QString name = type == QNetworkInterface::Wifi ? tr("WiFi") : tr("Ethernet");
1216  AddLogLine(" " + name + QString(" (%1): ").arg(iface.humanReadableName()));
1217  AddLogLine(" " + tr("MAC Address") + ": " + iface.hardwareAddress());
1218  QList addresses = iface.addressEntries();
1219  for (const QNetworkAddressEntry & addr : qAsConst(addresses))
1220  {
1221  if (addr.ip().protocol() == QAbstractSocket::IPv4Protocol ||
1222  addr.ip().protocol() == QAbstractSocket::IPv6Protocol)
1223  {
1224  AddLogLine(" " + tr("IP Address") + ": " + addr.ip().toString());
1225  }
1226  }
1227  }
1228  AddLogLine(line, machineStr);
1229 
1230  // uptime
1231  std::chrono::seconds uptime = 0s;
1232  if (getUptime(uptime))
1233  {
1234  auto UpdateUptime = [](StatusBoxItem* Item)
1235  {
1236  std::chrono::seconds time = 0s;
1237  if (getUptime(time))
1238  Item->SetText(uptimeStr(time));
1239  };
1240  StatusBoxItem *uptimeitem = AddLogLine(uptimeStr(uptime));
1241  connect(uptimeitem, &StatusBoxItem::UpdateRequired, UpdateUptime);
1242  uptimeitem->Start(1min);
1243  }
1244 
1245  // weighted average loads
1246 #if !defined(_WIN32) && !defined(Q_OS_ANDROID)
1247  auto UpdateLoad = [](StatusBoxItem* Item)
1248  {
1249  loadArray loads = getLoadAvgs();
1250  Item->SetText(QString(" %1: %2 %3 %4").arg(tr("Load")).arg(loads[0], 1, 'f', 2)
1251  .arg(loads[1], 1, 'f', 2).arg(loads[2], 1, 'f', 2));
1252  };
1253  StatusBoxItem* loaditem = AddLogLine("");
1254  UpdateLoad(loaditem);
1255  connect(loaditem, &StatusBoxItem::UpdateRequired, UpdateLoad);
1256  loaditem->Start();
1257 #endif
1258 
1259  // memory usage
1260  int totalM = 0; // Physical memory
1261  int freeM = 0;
1262  int totalS = 0; // Virtual memory (swap)
1263  int freeS = 0;
1264  if (getMemStats(totalM, freeM, totalS, freeS))
1265  {
1266  auto UpdateMem = [](StatusBoxItem* Item)
1267  {
1268  int totm = 0;
1269  int freem = 0;
1270  int tots = 0;
1271  int frees = 0;
1272  if (getMemStats(totm, freem, tots, frees))
1273  Item->SetText(QString(" " + tr("RAM") + ": " + usage_str_mb(totm, totm - freem, freem)));
1274  };
1275 
1276  auto UpdateSwap = [](StatusBoxItem* Item)
1277  {
1278  int totm = 0;
1279  int freem = 0;
1280  int tots = 0;
1281  int frees = 0;
1282  if (getMemStats(totm, freem, tots, frees))
1283  Item->SetText(QString(" " + tr("Swap") + ": " + usage_str_mb(tots, tots - frees, frees)));
1284  };
1285  StatusBoxItem* mem = AddLogLine("", machineStr);
1286  StatusBoxItem* swap = AddLogLine("", machineStr);
1287  UpdateMem(mem);
1288  UpdateSwap(swap);
1289  connect(mem, &StatusBoxItem::UpdateRequired, UpdateMem);
1290  connect(swap, &StatusBoxItem::UpdateRequired, UpdateSwap);
1291  mem->Start(3s);
1292  swap->Start(3s);
1293  }
1294 
1295  if (!m_isBackendActive)
1296  {
1297  line = tr("MythTV server") + ':';
1298  AddLogLine(line, machineStr);
1299 
1300  // Hostname & IP
1301  line = " " + tr("Hostname") + ": " + gCoreContext->GetSetting("MasterServerName");
1302  line.append(", " + tr("IP") + ": " + gCoreContext->GetSetting("MasterServerIP"));
1303  AddLogLine(line, machineStr);
1304 
1305  // uptime
1306  if (RemoteGetUptime(uptime))
1307  {
1308  auto UpdateRemoteUptime = [](StatusBoxItem* Item)
1309  {
1310  std::chrono::seconds time = 0s;
1311  RemoteGetUptime(time);
1312  Item->SetText(uptimeStr(time));
1313  };
1314  StatusBoxItem *remoteuptime = AddLogLine(uptimeStr(uptime));
1315  connect(remoteuptime, &StatusBoxItem::UpdateRequired, UpdateRemoteUptime);
1316  remoteuptime->Start(1min);
1317  }
1318 
1319  // weighted average loads
1320  system_load_array floads;
1321  if (RemoteGetLoad(floads))
1322  {
1323  auto UpdateRemoteLoad = [](StatusBoxItem* Item)
1324  {
1325  system_load_array loads = { 0.0, 0.0, 0.0 };
1326  RemoteGetLoad(loads);
1327  Item->SetText(QString(" %1: %2 %3 %4").arg(tr("Load")).arg(loads[0], 1, 'f', 2)
1328  .arg(loads[1], 1, 'f', 2).arg(loads[2], 1, 'f', 2));
1329  };
1330  StatusBoxItem* remoteloaditem = AddLogLine("");
1331  UpdateRemoteLoad(remoteloaditem);
1332  connect(remoteloaditem, &StatusBoxItem::UpdateRequired, UpdateRemoteLoad);
1333  remoteloaditem->Start();
1334  }
1335 
1336  // memory usage
1337  if (RemoteGetMemStats(totalM, freeM, totalS, freeS))
1338  {
1339  auto UpdateRemoteMem = [](StatusBoxItem* Item)
1340  {
1341  int totm = 0;
1342  int freem = 0;
1343  int tots = 0;
1344  int frees = 0;
1345  if (RemoteGetMemStats(totm, freem, tots, frees))
1346  Item->SetText(QString(" " + tr("RAM") + ": " + usage_str_mb(totm, totm - freem, freem)));
1347  };
1348 
1349  auto UpdateRemoteSwap = [](StatusBoxItem* Item)
1350  {
1351  int totm = 0;
1352  int freem = 0;
1353  int tots = 0;
1354  int frees = 0;
1355  if (RemoteGetMemStats(totm, freem, tots, frees))
1356  Item->SetText(QString(" " + tr("Swap") + ": " + usage_str_mb(tots, tots - frees, frees)));
1357  };
1358  StatusBoxItem* rmem = AddLogLine("", machineStr);
1359  StatusBoxItem* rswap = AddLogLine("", machineStr);
1360  UpdateRemoteMem(rmem);
1361  UpdateRemoteSwap(rswap);
1362  connect(rmem, &StatusBoxItem::UpdateRequired, UpdateRemoteMem);
1363  connect(rswap, &StatusBoxItem::UpdateRequired, UpdateRemoteSwap);
1364  rmem->Start(10s);
1365  rswap->Start(11s);
1366  }
1367  }
1368 
1369  // get free disk space
1370  QString hostnames;
1371 
1372  QList<FileSystemInfo> fsInfos = FileSystemInfo::RemoteGetInfo();
1373  for (int i = 0; i < fsInfos.size(); ++i)
1374  {
1375  // For a single-directory installation just display the totals
1376  if ((fsInfos.size() == 2) && (i == 0) &&
1377  (fsInfos[i].getPath() != "TotalDiskSpace") &&
1378  (fsInfos[i+1].getPath() == "TotalDiskSpace"))
1379  i++;
1380 
1381  hostnames = QString("\"%1\"").arg(fsInfos[i].getHostname());
1382  hostnames.replace(' ', "");
1383  hostnames.replace(',', "\",\"");
1384 
1385  getActualRecordedBPS(hostnames);
1386 
1387  QStringList list;
1389  fsInfos[i].getTotalSpace(), fsInfos[i].getUsedSpace(),
1390  fsInfos[i].getTotalSpace() - fsInfos[i].getUsedSpace(),
1392 
1393  if (fsInfos[i].getPath() == "TotalDiskSpace")
1394  {
1395  line = tr("Total Disk Space:");
1396  AddLogLine(line, machineStr);
1397  }
1398  else
1399  {
1400  line = tr("MythTV Drive #%1:").arg(fsInfos[i].getFSysID());
1401  AddLogLine(line, machineStr);
1402 
1403  QStringList tokens = fsInfos[i].getPath().split(',');
1404 
1405  if (tokens.size() > 1)
1406  {
1407  AddLogLine(QString(" ") + tr("Directories:"), machineStr);
1408 
1409  int curToken = 0;
1410  while (curToken < tokens.size())
1411  AddLogLine(QString(" ") +
1412  tokens[curToken++], machineStr);
1413  }
1414  else
1415  {
1416  AddLogLine(QString(" " ) + tr("Directory:") + ' ' +
1417  fsInfos[i].getPath(), machineStr);
1418  }
1419  }
1420 
1421  for (auto & diskinfo : list)
1422  {
1423  line = QString(" ") + diskinfo;
1424  AddLogLine(line, machineStr);
1425  }
1426  }
1427 
1428 }
1429 
1431 {
1432  if (m_iconState)
1433  m_iconState->DisplayState("decoders");
1434  m_logList->Reset();
1435  QString displayhelp = tr("Available hardware decoders for video playback.");
1436  if (m_helpText)
1437  m_helpText->SetText(displayhelp);
1438  if (m_justHelpText)
1439  m_justHelpText->SetText(displayhelp);
1440 
1441  QStringList decoders = MythCodecContext::GetDecoderDescription();
1442  if (decoders.isEmpty())
1443  {
1444  AddLogLine(tr("None"));
1445  }
1446  else
1447  {
1448  for (const QString & decoder : qAsConst(decoders))
1449  AddLogLine(decoder);
1450  }
1451 }
1452 
1454 {
1455  if (m_iconState)
1456  m_iconState->DisplayState("display");
1457  m_logList->Reset();
1458  auto displayhelp = tr("Display information.");
1459  if (m_helpText)
1460  m_helpText->SetText(displayhelp);
1461  if (m_justHelpText)
1462  m_justHelpText->SetText(displayhelp);
1463 
1464  auto desc = GetMythMainWindow()->GetDisplay()->GetDescription();
1465  for (const auto & line : qAsConst(desc))
1466  AddLogLine(line);
1467 }
1468 
1470 {
1471  if (m_iconState)
1472  m_iconState->DisplayState("render");
1473  m_logList->Reset();
1474  auto displayhelp = tr("Render information.");
1475  if (m_helpText)
1476  m_helpText->SetText(displayhelp);
1477  if (m_justHelpText)
1478  m_justHelpText->SetText(displayhelp);
1479 
1480  auto * render = GetMythMainWindow()->GetRenderDevice();
1481  if (render && render->Type() == kRenderOpenGL)
1482  {
1483  auto * opengl = dynamic_cast<MythRenderOpenGL*>(render);
1484 
1485  if (opengl)
1486  {
1487  auto UpdateFPS = [](StatusBoxItem* Item)
1488  {
1489  uint64_t swapcount = 0;
1490  auto * rend = GetMythMainWindow()->GetRenderDevice();
1491  if (auto * gl = dynamic_cast<MythRenderOpenGL*>(rend); gl != nullptr)
1492  swapcount = gl->GetSwapCount();
1493  Item->SetText(tr("Current fps\t: %1").arg(swapcount));
1494  };
1495 
1496  auto * fps = AddLogLine("");
1497  // Reset the frame counter
1498  (void)opengl->GetSwapCount();
1499  UpdateFPS(fps);
1500  connect(fps, &StatusBoxItem::UpdateRequired, UpdateFPS);
1501  fps->Start();
1502  }
1503 
1504  if (opengl && (opengl->GetExtraFeatures() & kGLNVMemory))
1505  {
1506  auto GetGPUMem = []()
1507  {
1508  auto * rend = GetMythMainWindow()->GetRenderDevice();
1509  if (auto * gl = dynamic_cast<MythRenderOpenGL*>(rend); gl != nullptr)
1510  return gl->GetGPUMemory();
1511  return std::tuple<int,int,int> { 0, 0, 0 };
1512  };
1513  auto UpdateUsed = [&GetGPUMem](StatusBoxItem* Item)
1514  {
1515  auto mem = GetGPUMem();
1516  int total = std::get<0>(mem);
1517  if (total > 0)
1518  {
1519  int avail = std::get<2>(mem);
1520  Item->SetText(tr("GPU memory used : %1MB").arg(total - avail));
1521  }
1522  };
1523 
1524  auto UpdateFree = [&GetGPUMem](StatusBoxItem* Item)
1525  {
1526  auto mem = GetGPUMem();
1527  int total = std::get<0>(mem);
1528  if (total > 0)
1529  {
1530  int avail = std::get<2>(mem);
1531  int percent = static_cast<int>((avail / static_cast<float>(total) * 100.0F));
1532  Item->SetText(tr("GPU memory free : %1MB (or %2%)").arg(avail).arg(percent));
1533  }
1534  };
1535 
1536  auto current = GetGPUMem();
1537  // Total and dedicated will not change
1538  AddLogLine(tr("GPU memory total : %1MB").arg(std::get<0>(current)));
1539  AddLogLine(tr("GPU memory dedicated: %1MB").arg(std::get<1>(current)));
1540  auto * used = AddLogLine("");
1541  auto * freemem = AddLogLine("");
1542  UpdateUsed(used);
1543  UpdateFree(freemem);
1544  connect(used, &StatusBoxItem::UpdateRequired, UpdateUsed);
1545  connect(freemem, &StatusBoxItem::UpdateRequired, UpdateFree);
1546  used->Start();
1547  freemem->Start();
1548  }
1549 
1550  auto desc = render->GetDescription();
1551  for (const auto & line : qAsConst(desc))
1552  AddLogLine(line);
1553  }
1554 }
1555 
1559 void StatusBox::doAutoExpireList(bool updateExpList)
1560 {
1561  if (m_iconState)
1562  m_iconState->DisplayState("autoexpire");
1563  m_logList->Reset();
1564 
1565  QString helpmsg(tr("The AutoExpire List shows all recordings "
1566  "which may be expired and the order of "
1567  "their expiration. Recordings at the top "
1568  "of the list will be expired first."));
1569  if (m_helpText)
1570  m_helpText->SetText(helpmsg);
1571  if (m_justHelpText)
1572  m_justHelpText->SetText(helpmsg);
1573 
1574  QString contentLine;
1575  QString detailInfo;
1576  QString staticInfo;
1577  long long totalSize(0);
1578  long long liveTVSize(0);
1579  int liveTVCount(0);
1580  long long deletedGroupSize(0);
1581  int deletedGroupCount(0);
1582 
1583  std::vector<ProgramInfo *>::iterator it;
1584 
1585  if (updateExpList)
1586  {
1587  for (it = m_expList.begin(); it != m_expList.end(); ++it)
1588  delete *it;
1589  m_expList.clear();
1590 
1592  }
1593 
1594  for (it = m_expList.begin(); it != m_expList.end(); ++it)
1595  {
1596  ProgramInfo *pginfo = *it;
1597 
1598  totalSize += pginfo->GetFilesize();
1599  if (pginfo->GetRecordingGroup() == "LiveTV")
1600  {
1601  liveTVSize += pginfo->GetFilesize();
1602  liveTVCount++;
1603  }
1604  else if (pginfo->GetRecordingGroup() == "Deleted")
1605  {
1606  deletedGroupSize += pginfo->GetFilesize();
1607  deletedGroupCount++;
1608  }
1609  }
1610 
1611  staticInfo = tr("%n recording(s) consuming %1 (is) allowed to expire\n", "",
1612  m_expList.size()).arg(StringUtil::formatKBytes(totalSize / 1024));
1613 
1614  if (liveTVCount)
1615  staticInfo += tr("%n (is) LiveTV and consume(s) %1\n", "", liveTVCount)
1616  .arg(StringUtil::formatKBytes(liveTVSize / 1024));
1617 
1618  if (deletedGroupCount)
1619  {
1620  staticInfo += tr("%n (is) Deleted and consume(s) %1\n", "",
1621  deletedGroupCount)
1622  .arg(StringUtil::formatKBytes(deletedGroupSize / 1024));
1623  }
1624 
1625  for (it = m_expList.begin(); it != m_expList.end(); ++it)
1626  {
1627  ProgramInfo *pginfo = *it;
1628  QDateTime starttime = pginfo->GetRecordingStartTime();
1629  QDateTime endtime = pginfo->GetRecordingEndTime();
1630  contentLine =
1632  starttime, MythDate::kDateFull | MythDate::kSimplify) + " - ";
1633 
1634  contentLine +=
1635  "(" + ProgramInfo::i18n(pginfo->GetRecordingGroup()) + ") ";
1636 
1637  contentLine += pginfo->GetTitle() +
1638  " (" + StringUtil::formatKBytes(pginfo->GetFilesize() / 1024) + ")";
1639 
1640  detailInfo =
1643  " - " +
1646 
1647  detailInfo += " (" + StringUtil::formatKBytes(pginfo->GetFilesize() / 1024) + ")";
1648 
1649  detailInfo += " (" + ProgramInfo::i18n(pginfo->GetRecordingGroup()) + ")";
1650 
1651  detailInfo += "\n" + pginfo->toString(ProgramInfo::kTitleSubtitle, " - ");
1652 
1653  AddLogLine(contentLine, staticInfo, detailInfo,
1654  staticInfo + detailInfo);
1655  }
1656 }
1657 
1659 
1660 /* vim: set expandtab tabstop=4 shiftwidth=4: */
filesysteminfo.h
MSqlQuery::isActive
bool isActive(void) const
Definition: mythdbcon.h:216
MSqlQuery::next
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
Definition: mythdbcon.cpp:811
RecStatus::Type
Type
Definition: recordingstatus.h:15
MSqlQuery
QSqlQuery wrapper that fetches a DB connection from the connection pool.
Definition: mythdbcon.h:128
RecStatus::LaterShowing
@ LaterShowing
Definition: recordingstatus.h:39
MythUIButtonList::GetTopItemPos
int GetTopItemPos(void) const
Definition: mythuibuttonlist.h:240
RecordingInfo::kDefaultRecGroup
@ kDefaultRecGroup
Definition: recordinginfo.h:191
MythDate::toString
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
Definition: mythdate.cpp:84
tv.h
MSqlQuery::size
int size(void) const
Definition: mythdbcon.h:215
MythUIButtonList::GetItemCurrent
MythUIButtonListItem * GetItemCurrent() const
Definition: mythuibuttonlist.cpp:1587
hardwareprofile.smolt.timeout
float timeout
Definition: smolt.py:103
ProgramInfo::GetFilesize
virtual uint64_t GetFilesize(void) const
Definition: programinfo.cpp:6345
kGLNVMemory
@ kGLNVMemory
Definition: mythrenderopengl.h:52
mythuitext.h
LoadFromScheduler
bool LoadFromScheduler(AutoDeleteDeque< TYPE * > &destination, bool &hasConflicts, const QString &altTable="", int recordid=-1)
Definition: programinfo.h:912
mythdb.h
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:1370
StatusBox::Init
void Init(void) override
Used after calling Load() to assign data to widgets and other UI initilisation which is prohibited in...
Definition: statusbox.cpp:109
MythDate::as_utc
QDateTime as_utc(const QDateTime &old_dt)
Returns copy of QDateTime with TimeSpec set to UTC.
Definition: mythdate.cpp:27
StatusBox::doAutoExpireList
void doAutoExpireList()
Show list of recordings which may AutoExpire.
Definition: statusbox.h:66
RecStatus::Tuning
@ Tuning
Definition: recordingstatus.h:21
RecordingInfo
Holds information on a TV Program one might wish to record.
Definition: recordinginfo.h:35
StatusBox::getActualRecordedBPS
void getActualRecordedBPS(const QString &hostnames)
Fills in m_recordingProfilesBps w/ average bitrate from recorded table.
Definition: statusbox.cpp:1110
MythUIType::GetChild
MythUIType * GetChild(const QString &name) const
Get a named child of this UIType.
Definition: mythuitype.cpp:133
MythUIButtonList::RemoveItem
void RemoveItem(MythUIButtonListItem *item)
Definition: mythuibuttonlist.cpp:1485
ProgramInfo::GetChannelName
QString GetChannelName(void) const
This is the channel name in the local market, i.e.
Definition: programinfo.h:386
StatusBox::AddLogLine
StatusBoxItem * AddLogLine(const QString &line, const QString &help="", const QString &detail="", const QString &helpdetail="", const QString &state="", const QString &data="")
Definition: statusbox.cpp:151
LogLine::m_data
QString m_data
Definition: statusbox.cpp:38
ProgramInfo::GetChanNum
QString GetChanNum(void) const
This is the channel "number", in the form 1, 1_2, 1-2, 1#1, etc.
Definition: programinfo.h:376
MythUIButtonList::itemSelected
void itemSelected(MythUIButtonListItem *item)
getLoadAvgs
loadArray getLoadAvgs(void)
Returns the system load averages.
Definition: mythmiscutil.cpp:175
getMemStats
bool getMemStats([[maybe_unused]] int &totalMB, [[maybe_unused]] int &freeMB, [[maybe_unused]] int &totalVM, [[maybe_unused]] int &freeVM)
Definition: mythmiscutil.cpp:109
GetMythSourceVersion
const char * GetMythSourceVersion()
Definition: mythversion.cpp:5
ProgramInfo::kTitleSubtitle
@ kTitleSubtitle
Definition: programinfo.h:509
mythdialogbox.h
MSqlQuery::value
QVariant value(int i) const
Definition: mythdbcon.h:205
MythScreenStack
Definition: mythscreenstack.h:16
MythDate::formatTime
QString formatTime(std::chrono::milliseconds msecs, QString fmt)
Format a milliseconds time value.
Definition: mythdate.cpp:233
MSqlQuery::exec
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
Definition: mythdbcon.cpp:617
JOB_LIST_NOT_DONE
@ JOB_LIST_NOT_DONE
Definition: jobqueue.h:71
kRenderOpenGL
@ kRenderOpenGL
Definition: mythrender_base.h:19
RemoteUndeleteRecording
bool RemoteUndeleteRecording(uint recordingID)
Definition: remoteutil.cpp:142
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
MythScreenType
Screen in which all other widgets are contained and rendered.
Definition: mythscreentype.h:45
mythuistatetype.h
StatusBox::doDisplayStatus
void doDisplayStatus()
Definition: statusbox.cpp:1453
statusbox.h
StatusBox::Create
bool Create(void) override
Definition: statusbox.cpp:79
JobQueue::StopJob
static bool StopJob(int jobID)
Definition: jobqueue.cpp:741
StatusBox::~StatusBox
~StatusBox(void) override
Definition: statusbox.cpp:72
MythMainWindow::GetRenderDevice
MythRender * GetRenderDevice()
Definition: mythmainwindow.cpp:292
ProgramInfo::GetRecordingEndTime
QDateTime GetRecordingEndTime(void) const
Approximate time the recording should have ended, did end, or is intended to end.
Definition: programinfo.h:412
LogLine::m_state
QString m_state
Definition: statusbox.cpp:39
ProgramInfo::GetRecordingGroup
QString GetRecordingGroup(void) const
Definition: programinfo.h:419
remoteutil.h
mythuibuttonlist.h
MythDate::kDateTimeShort
@ kDateTimeShort
Default local time.
Definition: mythdate.h:24
LogLine::m_detail
QString m_detail
Definition: statusbox.cpp:35
jobID
int jobID
Definition: mythcommflag.cpp:80
MythDate::current
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
Definition: mythdate.cpp:14
kState_Error
@ kState_Error
Error State, if we ever try to enter this state errored is set.
Definition: tv.h:54
ProgramInfo::GetRecordingStartTime
QDateTime GetRecordingStartTime(void) const
Approximate time the recording started.
Definition: programinfo.h:404
StatusBox::keyPressEvent
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
Definition: statusbox.cpp:189
tmp
static guint32 * tmp
Definition: goom_core.cpp:26
RemoteGetLoad
bool RemoteGetLoad(system_load_array &load)
Definition: remoteutil.cpp:42
MythScreenType::GetFocusWidget
MythUIType * GetFocusWidget(void) const
Definition: mythscreentype.cpp:113
Q_DECLARE_METATYPE
Q_DECLARE_METATYPE(StandardSetting *)
StatusBox::setHelpText
void setHelpText(MythUIButtonListItem *item)
Definition: statusbox.cpp:217
StatusBox::m_categoryList
MythUIButtonList * m_categoryList
Definition: statusbox.h:83
RecStatus::toString
static QString toString(RecStatus::Type recstatus, uint id)
Converts "recstatus" into a short (unreadable) string.
Definition: recordingstatus.cpp:40
system_load_array
std::array< double, 3 > system_load_array
Definition: remoteutil.h:19
kState_WatchingRecording
@ kState_WatchingRecording
Watching Recording is the state for when we are watching an in progress recording,...
Definition: tv.h:80
JobQueue::JobText
static QString JobText(int jobType)
Definition: jobqueue.cpp:1111
JobQueue::PauseJob
static bool PauseJob(int jobID)
Definition: jobqueue.cpp:714
MythMainWindow::GetDisplay
MythDisplay * GetDisplay()
Definition: mythmainwindow.cpp:253
RecStatus::WillRecord
@ WillRecord
Definition: recordingstatus.h:30
usage_str_mb
static QString usage_str_mb(float total, float used, float free)
Definition: statusbox.cpp:1042
MythUIButtonListItem
Definition: mythuibuttonlist.h:41
StatusBox::m_justHelpText
MythUIText * m_justHelpText
Definition: statusbox.h:82
kDisableAutoExpire
@ kDisableAutoExpire
Definition: programtypes.h:194
mythrenderopengl.h
MythUICallbackMF
void(QObject::*)(void) MythUICallbackMF
Definition: mythuitype.h:44
JobQueue::GetJobsInQueue
static int GetJobsInQueue(QMap< int, JobQueueEntry > &jobs, int findJobs=JOB_LIST_NOT_DONE)
Definition: jobqueue.cpp:1275
mythdate.h
mythrender_base.h
RecStatus::TooManyRecordings
@ TooManyRecordings
Definition: recordingstatus.h:36
mythdisplay.h
StatusBox::clicked
void clicked(MythUIButtonListItem *item)
Definition: statusbox.cpp:250
StatusBox::m_recordingProfilesBps
recprof2bps_t m_recordingProfilesBps
Definition: statusbox.h:87
mythlogging.h
FileSystemInfo::RemoteGetInfo
static QList< FileSystemInfo > RemoteGetInfo(MythSocket *sock=nullptr)
Definition: filesysteminfo.cpp:137
StatusBox::doListingsStatus
void doListingsStatus()
Definition: statusbox.cpp:448
MythUIButtonList::itemClicked
void itemClicked(MythUIButtonListItem *item)
StatusBox::updateLogList
void updateLogList(MythUIButtonListItem *item)
Definition: statusbox.cpp:229
MythMainWindow::TranslateKeyPress
bool TranslateKeyPress(const QString &Context, QKeyEvent *Event, QStringList &Actions, bool AllowJumps=true)
Get a list of actions for a keypress in the given context.
Definition: mythmainwindow.cpp:1111
MythUIButtonList::GetCurrentPos
int GetCurrentPos() const
Definition: mythuibuttonlist.h:238
kTemplateRecord
@ kTemplateRecord
Definition: recordingtypes.h:33
MythDialogBox
Basic menu dialog, message and a list of options.
Definition: mythdialogbox.h:166
StatusBox::doJobQueueStatus
void doJobQueueStatus()
Definition: statusbox.cpp:942
ProgramInfo::GetTitle
QString GetTitle(void) const
Definition: programinfo.h:361
MSqlQuery::InitCon
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
Definition: mythdbcon.cpp:549
StatusBoxItem::Start
void Start(std::chrono::seconds Interval=1s)
Definition: statusbox.cpp:42
JobQueue::GetJobStatus
static enum JobStatus GetJobStatus(int jobID)
Definition: jobqueue.cpp:1521
MythDB::DBError
static void DBError(const QString &where, const MSqlQuery &query)
Definition: mythdb.cpp:226
MythScreenType::BuildFocusList
void BuildFocusList(void)
Definition: mythscreentype.cpp:206
RecStatus::Failing
@ Failing
Definition: recordingstatus.h:17
StatusBox::StatusBox
StatusBox(MythScreenStack *parent)
Definition: statusbox.cpp:57
StatusBox::doTunerStatus
void doTunerStatus()
Definition: statusbox.cpp:748
stringutil.h
disk_usage_with_rec_time_kb
static void disk_usage_with_rec_time_kb(QStringList &out, long long total, long long used, long long free, const recprof2bps_t &prof2bps)
Definition: statusbox.cpp:1048
RecStatus::Conflict
@ Conflict
Definition: recordingstatus.h:38
ProgramInfo::toString
QString toString(Verbosity v=kLongDescription, const QString &sep=":", const QString &grp="\"") const
Definition: programinfo.cpp:1934
loadArray
std::array< double, 3 > loadArray
Definition: mythmiscutil.h:22
jobqueue.h
kNoSearch
@ kNoSearch
Definition: recordingtypes.h:80
RemoteGetAllExpiringRecordings
void RemoteGetAllExpiringRecordings(std::vector< ProgramInfo * > &expiringlist)
Definition: remoteutil.cpp:171
MythUIButtonListItem::GetData
QVariant GetData()
Definition: mythuibuttonlist.cpp:3665
uint
unsigned int uint
Definition: compat.h:81
StatusBox::doDecoderStatus
void doDecoderStatus()
Definition: statusbox.cpp:1430
gCoreContext
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
Definition: mythcorecontext.cpp:55
StatusBox::m_logList
MythUIButtonList * m_logList
Definition: statusbox.h:84
getUptime
bool getUptime(std::chrono::seconds &uptime)
Definition: mythmiscutil.cpp:66
StatusBox::updateLog
void updateLog()
ProgramInfo::i18n
static QString i18n(const QString &msg)
Translations for play,recording, & storage groups +.
Definition: programinfo.cpp:5375
MythCoreContext::GetNumSetting
int GetNumSetting(const QString &key, int defaultval=0)
Definition: mythcorecontext.cpp:911
RemoteGetMemStats
bool RemoteGetMemStats(int &totalMB, int &freeMB, int &totalVM, int &freeVM)
Definition: remoteutil.cpp:77
StringUtil::formatKBytes
MBASE_PUBLIC QString formatKBytes(int64_t sizeKB, int prec=1)
Definition: stringutil.cpp:357
GetMythSourcePath
const char * GetMythSourcePath()
Definition: mythversion.cpp:10
MythDate::fromString
QDateTime fromString(const QString &dtstr)
Converts kFilename && kISODate formats to QDateTime.
Definition: mythdate.cpp:34
JobQueue::DeleteJob
static bool DeleteJob(int jobID)
Definition: jobqueue.cpp:871
RecStatus::Pending
@ Pending
Definition: recordingstatus.h:16
ADD_STATUS_LOG_LINE
#define ADD_STATUS_LOG_LINE(rtype, fstate)
MythDate::kSimplify
@ kSimplify
Do Today/Yesterday/Tomorrow transform.
Definition: mythdate.h:26
MythUIButtonListItem::GetText
QString GetText(const QString &name="") const
Definition: mythuibuttonlist.cpp:3315
AutoDeleteDeque< ProgramInfo * >
MythCodecContext::GetDecoderDescription
static QStringList GetDecoderDescription(void)
Definition: mythcodeccontext.cpp:118
sStatus_Undefined
@ sStatus_Undefined
A slave's sleep status is undefined when it has never connected to the master backend or is not able ...
Definition: tv.h:117
mythuihelper.h
MythRenderOpenGL
Definition: mythrenderopengl.h:100
recordinginfo.h
std::chrono::days
duration< CHRONO_TYPE, ratio< 86400 > > days
Definition: mythchrono.h:25
ProgramInfo::GetChanID
uint GetChanID(void) const
This is the unique key used in the database to locate tuning information.
Definition: programinfo.h:372
RemoteGetUptime
bool RemoteGetUptime(std::chrono::seconds &uptime)
Definition: remoteutil.cpp:57
ProgramInfo
Holds information on recordings and videos.
Definition: programinfo.h:67
MythUIText
All purpose text widget, displays a text string.
Definition: mythuitext.h:28
MythScreenType::keyPressEvent
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
Definition: mythscreentype.cpp:404
mythmiscutil.h
RecStatus::Recording
@ Recording
Definition: recordingstatus.h:29
StatusBox::m_popupStack
MythScreenStack * m_popupStack
Definition: statusbox.h:91
StatusBox::doRenderStatus
void doRenderStatus()
Definition: statusbox.cpp:1469
MythConfirmationDialog
Dialog asking for user confirmation. Ok and optional Cancel button.
Definition: mythdialogbox.h:272
mythcorecontext.h
XMLParseBase::LoadWindowFromXML
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
Definition: xmlparsebase.cpp:695
cardutil.h
StatusBox::m_helpText
MythUIText * m_helpText
Definition: statusbox.h:81
MSqlQuery::bindValue
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
Definition: mythdbcon.cpp:887
DialogCompletionEvent
Event dispatched from MythUI modal dialogs to a listening class containing a result of some form.
Definition: mythdialogbox.h:41
recprof2bps_t
QMap< QString, unsigned int > recprof2bps_t
Definition: statusbox.h:21
StatusBoxItem
Definition: statusbox.h:23
RecStatus::NotListed
@ NotListed
Definition: recordingstatus.h:37
MythUIText::SetText
virtual void SetText(const QString &text)
Definition: mythuitext.cpp:132
LogLine::m_line
QString m_line
Definition: statusbox.cpp:34
StatusBox::doLogEntries
void doLogEntries()
Definition: statusbox.cpp:887
DialogCompletionEvent::kEventType
static const Type kEventType
Definition: mythdialogbox.h:57
mythchrono.h
MythUIButtonList::Reset
void Reset() override
Reset the widget to it's original state, should not reset changes made by the theme.
Definition: mythuibuttonlist.cpp:116
GetMythMainWindow
MythMainWindow * GetMythMainWindow(void)
Definition: mythmainwindow.cpp:104
kState_WatchingLiveTV
@ kState_WatchingLiveTV
Watching LiveTV is the state for when we are watching a recording and the user has control over the c...
Definition: tv.h:63
MythUIButtonList::SetItemCurrent
void SetItemCurrent(MythUIButtonListItem *item)
Definition: mythuibuttonlist.cpp:1554
uptimeStr
static QString uptimeStr(std::chrono::seconds uptime)
Definition: statusbox.cpp:1085
build_compdb.action
action
Definition: build_compdb.py:9
JobQueue::ResumeJob
static bool ResumeJob(int jobID)
Definition: jobqueue.cpp:723
build_compdb.help
help
Definition: build_compdb.py:10
MythMainWindow::GetStack
MythScreenStack * GetStack(const QString &Stackname)
Definition: mythmainwindow.cpp:323
MythDate::kDateFull
@ kDateFull
Default local time.
Definition: mythdate.h:19
mythcodeccontext.h
MythCoreContext::GetHostName
QString GetHostName(void)
Definition: mythcorecontext.cpp:837
JOB_LIST_RECENT
@ JOB_LIST_RECENT
Definition: jobqueue.h:73
StatusBox::m_iconState
MythUIStateType * m_iconState
Definition: statusbox.h:85
MythUICallbackMFc
void(QObject::*)(void) const MythUICallbackMFc
Definition: mythuitype.h:45
MythDisplay::GetDescription
QStringList GetDescription()
Definition: mythdisplay.cpp:136
MythDate::kDateTimeFull
@ kDateTimeFull
Default local time.
Definition: mythdate.h:23
usage_str_kb
static QString usage_str_kb(long long total, long long used, long long free)
Definition: statusbox.cpp:1025
StatusBox::doScheduleStatus
void doScheduleStatus()
Definition: statusbox.cpp:543
MythCoreContext::SaveSetting
void SaveSetting(const QString &key, int newValue)
Definition: mythcorecontext.cpp:880
StatusBox::m_expList
std::vector< ProgramInfo * > m_expList
Definition: statusbox.h:89
RecordingInfo::ApplyRecordRecGroupChange
void ApplyRecordRecGroupChange(const QString &newrecgroup)
Sets the recording group, both in this RecordingInfo and in the database.
Definition: recordinginfo.cpp:655
StatusBox::customEvent
void customEvent(QEvent *event) override
Definition: statusbox.cpp:352
MythUIButtonList
List widget, displays list items in a variety of themeable arrangements and can trigger signals when ...
Definition: mythuibuttonlist.h:191
JOB_LIST_ERROR
@ JOB_LIST_ERROR
Definition: jobqueue.h:72
JobQueue::ChangeJobStatus
static bool ChangeJobStatus(int jobID, int newStatus, const QString &comment="")
Definition: jobqueue.cpp:982
StatusBoxItem::UpdateRequired
void UpdateRequired(StatusBoxItem *Item)
RecStatus::LowDiskSpace
@ LowDiskSpace
Definition: recordingstatus.h:24
RemoteDeleteRecording
bool RemoteDeleteRecording(uint recordingID, bool forceMetadataDelete, bool forgetHistory)
Definition: remoteutil.cpp:113
MythScreenStack::AddScreen
virtual void AddScreen(MythScreenType *screen, bool allowFade=true)
Definition: mythscreenstack.cpp:52
LogLine::m_helpdetail
QString m_helpdetail
Definition: statusbox.cpp:37
kState_RecordingOnly
@ kState_RecordingOnly
Recording Only is a TVRec only state for when we are recording a program, but there is no one current...
Definition: tv.h:84
LogLine
Definition: statusbox.cpp:33
StatusBox::m_minLevel
int m_minLevel
Definition: statusbox.h:93
StatusBox::m_isBackendActive
bool m_isBackendActive
Definition: statusbox.h:95
MythUIStateType
This widget is used for grouping other widgets for display when a particular named state is called....
Definition: mythuistatetype.h:22
LogLine::m_help
QString m_help
Definition: statusbox.cpp:36
AutoDeleteDeque::size
size_t size(void) const
Definition: autodeletedeque.h:67
JobQueue::StatusText
static QString StatusText(int status)
Definition: jobqueue.cpp:1134
StatusBox::doMachineStatus
void doMachineStatus()
Show machine status.
Definition: statusbox.cpp:1166
MythUIStateType::DisplayState
bool DisplayState(const QString &name)
Definition: mythuistatetype.cpp:84
MythCoreContext::GetSetting
QString GetSetting(const QString &key, const QString &defaultval="")
Definition: mythcorecontext.cpp:897
MSqlQuery::prepare
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
Definition: mythdbcon.cpp:836
ProgramInfo::GetSubtitle
QString GetSubtitle(void) const
Definition: programinfo.h:363