MythTV  master
mythmediamonitor.h
Go to the documentation of this file.
1 #ifndef MYTH_MEDIA_MONITOR_H
2 #define MYTH_MEDIA_MONITOR_H
3 
4 #include <QStringList>
5 #include <QPointer>
6 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
7 #include <QMutex>
8 #else
9 #include <QRecursiveMutex>
10 #endif
11 #include <QWaitCondition>
12 #include <QList>
13 #include <QDateTime>
14 
15 #include "libmyth/mythexp.h"
16 #include "libmythbase/mthread.h"
17 #include "libmythbase/mythmedia.h"
18 
20 
21 // Adding member initializers caused compilation to fail with an error
22 // that it cannot convert a brace-enclosed initializer list to MHData.
23 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-member-init)
24 struct MHData
25 {
26  void (*callback)(MythMediaDevice *mediadevice);
28  QString destination;
29  QString description;
30 };
31 
32 class MediaMonitor;
33 class MonitorThread : public MThread
34 {
35  public:
36  MonitorThread(MediaMonitor* pMon, unsigned long interval) :
37  MThread("Monitor"), m_monitor(pMon), m_interval(interval),
38  m_lastCheckTime(QDateTime::currentDateTimeUtc()) {}
39  ~MonitorThread() override { wait(); m_monitor = nullptr; }
40  void setMonitor(MediaMonitor* pMon) { m_monitor = pMon; }
41  void run(void) override; // MThread
42 
43  protected:
44  QPointer<MediaMonitor> m_monitor;
45  unsigned long m_interval;
46  QDateTime m_lastCheckTime;
47 };
48 
49 class MPUBLIC MediaMonitor : public QObject
50 {
51  Q_OBJECT
52  friend class MonitorThread;
53  friend class MonitorThreadDarwin;
54 
55  public:
56  virtual void deleteLater(void);
57  bool IsActive(void) const { return m_active; }
58 
59  virtual void StartMonitoring(void);
60  void StopMonitoring(void);
61  void ChooseAndEjectMedia(void);
62  void EjectMedia(const QString &path);
63 
64  static MediaMonitor *GetMediaMonitor(void);
65  static QString GetMountPath(const QString& devPath);
66  static void SetCDSpeed(const char *device, int speed);
67 
68  bool ValidateAndLock(MythMediaDevice *pMedia);
69  void Unlock(MythMediaDevice *pMedia);
70 
71  // To safely dereference the pointers returned by this function
72  // first validate the pointer with ValidateAndLock(), if true is returned
73  // it is safe to dereference the pointer. When finished call Unlock()
74  QList<MythMediaDevice*> GetRemovable(bool showMounted = false,
75  bool showUsable = false);
76  QList<MythMediaDevice*> GetMedias(unsigned mediatypes);
77  MythMediaDevice* GetMedia(const QString &path);
78 
79  void RegisterMediaHandler(const QString &destination,
80  const QString &description,
81  void (*callback) (MythMediaDevice*),
82  int mediaType,
83  const QString &extensions);
84  void JumpToMediaHandler(MythMediaDevice* pMedia);
85 
86  // Plugins should use these if they need to access optical disks:
87  static QString defaultCDdevice();
88  static QString defaultVCDdevice();
89  static QString defaultDVDdevice();
90  static QString defaultCDWriter();
91  static QString defaultDVDWriter();
92 
93  static void ejectOpticalDisc(void);
94 
95  virtual QStringList GetCDROMBlockDevices(void) = 0;
96 
97  public slots:
98  void mediaStatusChanged(MythMediaStatus oldStatus, MythMediaDevice* pMedia) const;
99 
100  protected:
101  MediaMonitor(QObject *par, unsigned long interval, bool allowEject);
102  ~MediaMonitor() override = default;
103 
104  static void AttemptEject(MythMediaDevice *device);
105  void CheckDevices(void);
106  virtual void CheckDeviceNotifications(void) {};
107  virtual bool AddDevice(MythMediaDevice* pDevice) = 0;
108  bool RemoveDevice(const QString &dev);
109  bool shouldIgnore(const MythMediaDevice *device);
110  bool eventFilter(QObject *obj, QEvent *event) override; // QObject
111 
112  QString listDevices(void);
113 
114  static QString defaultDevice(const QString &setting,
115  const QString &label,
116  const char *hardCodedDefault);
117  MythMediaDevice *selectDrivePopup(const QString &label,
118  bool showMounted = false,
119  bool showUsable = false);
120 
121  protected:
122 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
123  QMutex m_devicesLock {QMutex::Recursive};
124 #else
125  QRecursiveMutex m_devicesLock;
126 #endif
127  QList<MythMediaDevice*> m_devices;
128  QList<MythMediaDevice*> m_removedDevices;
129  QMap<MythMediaDevice*, int> m_useCount;
130 
131  // List of devices/mountpoints that the user doesn't want to monitor:
132  QStringList m_ignoreList;
133 
134  bool volatile m_active {false};
135  QWaitCondition m_wait;
139 
140  QMap<QString, MHData> m_handlerMap;
141 
143 };
144 
145 static inline void
146 REG_MEDIA_HANDLER (const QString& destination,
147  const QString& description,
148  void (*callback)(MythMediaDevice*),
149  int mediaType,
150  const QString& extensions)
151 {
152  MediaMonitor::GetMediaMonitor()->RegisterMediaHandler(destination, description,
153  callback, mediaType, extensions);
154 }
155 
156 
157 #endif // MYTH_MEDIA_MONITOR_H
MediaMonitor::m_devices
QList< MythMediaDevice * > m_devices
Definition: mythmediamonitor.h:127
MonitorThread::MonitorThread
MonitorThread(MediaMonitor *pMon, unsigned long interval)
Definition: mythmediamonitor.h:36
MPUBLIC
#define MPUBLIC
Definition: mythexp.h:10
MediaMonitor::m_wait
QWaitCondition m_wait
Definition: mythmediamonitor.h:135
MHData::callback
void(* callback)(MythMediaDevice *mediadevice)
Definition: mythmediamonitor.h:26
MediaMonitor::m_removedDevices
QList< MythMediaDevice * > m_removedDevices
Definition: mythmediamonitor.h:128
MediaMonitor::m_allowEject
bool m_allowEject
Definition: mythmediamonitor.h:138
MonitorThread
Definition: mythmediamonitor.h:33
MediaMonitor::GetMediaMonitor
static MediaMonitor * GetMediaMonitor(void)
Definition: mythmediamonitor.cpp:75
MonitorThread::run
void run(void) override
Runs the Qt event loop unless we have a QRunnable, in which case we run the runnable run instead.
Definition: mythmediamonitor.cpp:42
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
mythexp.h
MHData::destination
QString destination
Definition: mythmediamonitor.h:28
MonitorThread::~MonitorThread
~MonitorThread() override
Definition: mythmediamonitor.h:39
MHData::MythMediaType
int MythMediaType
Definition: mythmediamonitor.h:27
MediaMonitor::m_monitorPollingInterval
unsigned long m_monitorPollingInterval
Definition: mythmediamonitor.h:137
MediaMonitor::s_monitor
static MediaMonitor * s_monitor
Definition: mythmediamonitor.h:142
MonitorThread::m_lastCheckTime
QDateTime m_lastCheckTime
Definition: mythmediamonitor.h:46
MediaMonitor::RegisterMediaHandler
void RegisterMediaHandler(const QString &destination, const QString &description, void(*callback)(MythMediaDevice *), int mediaType, const QString &extensions)
Register a handler for media related events.
Definition: mythmediamonitor.cpp:642
mythmedia.h
MediaMonitor::CheckDeviceNotifications
virtual void CheckDeviceNotifications(void)
Definition: mythmediamonitor.h:106
MonitorThread::m_monitor
QPointer< MediaMonitor > m_monitor
Definition: mythmediamonitor.h:44
MediaMonitor::m_ignoreList
QStringList m_ignoreList
Definition: mythmediamonitor.h:132
MediaMonitor
Definition: mythmediamonitor.h:49
MediaMonitor::m_handlerMap
QMap< QString, MHData > m_handlerMap
Registered Media Handlers.
Definition: mythmediamonitor.h:140
MediaMonitor::m_useCount
QMap< MythMediaDevice *, int > m_useCount
Definition: mythmediamonitor.h:129
MonitorThreadDarwin
Definition: mediamonitor-darwin.h:7
MediaMonitor::IsActive
bool IsActive(void) const
Definition: mythmediamonitor.h:57
MonitorThread::setMonitor
void setMonitor(MediaMonitor *pMon)
Definition: mythmediamonitor.h:40
MonitorThread::m_interval
unsigned long m_interval
Definition: mythmediamonitor.h:45
MHData
Stores details of media handlers.
Definition: mythmediamonitor.h:24
MThread
This is a wrapper around QThread that does several additional things.
Definition: mthread.h:48
mthread.h
MThread::m_thread
MThreadInternal * m_thread
Definition: mthread.h:135
MythMediaDevice
Definition: mythmedia.h:48
REG_MEDIA_HANDLER
static void REG_MEDIA_HANDLER(const QString &destination, const QString &description, void(*callback)(MythMediaDevice *), int mediaType, const QString &extensions)
Definition: mythmediamonitor.h:146
MythMediaStatus
MythMediaStatus
Definition: mythmedia.h:12
MediaMonitor::m_devicesLock
QRecursiveMutex m_devicesLock
Definition: mythmediamonitor.h:125
MHData::description
QString description
Definition: mythmediamonitor.h:29