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