00001 #ifndef MYTH_MEDIA_MONITOR_H
00002 #define MYTH_MEDIA_MONITOR_H
00003
00004 #include <QStringList>
00005 #include <QPointer>
00006 #include <QMutex>
00007 #include <QList>
00008
00009 #include "mthread.h"
00010 #include "mythexp.h"
00011 #include "mythmedia.h"
00012
00014 struct MHData
00015 {
00016 void (*callback)(MythMediaDevice *mediadevice);
00017 int MythMediaType;
00018 QString destination;
00019 QString description;
00020 };
00021
00022 class MediaMonitor;
00023 class MonitorThread : public MThread
00024 {
00025 public:
00026 MonitorThread(MediaMonitor* pMon, unsigned long interval);
00027 ~MonitorThread() { wait(); m_Monitor = NULL; }
00028 void setMonitor(MediaMonitor* pMon) { m_Monitor = pMon; }
00029 virtual void run(void);
00030
00031 protected:
00032 QPointer<MediaMonitor> m_Monitor;
00033 unsigned long m_Interval;
00034 };
00035
00036 class MPUBLIC MediaMonitor : public QObject
00037 {
00038 Q_OBJECT
00039 friend class MonitorThread;
00040 friend class MonitorThreadDarwin;
00041
00042 public:
00043 virtual void deleteLater(void);
00044 bool IsActive(void) const { return m_Active; }
00045
00046 virtual void StartMonitoring(void);
00047 void StopMonitoring(void);
00048 void ChooseAndEjectMedia(void);
00049
00050 static MediaMonitor *GetMediaMonitor(void);
00051 static QString GetMountPath(const QString& devPath);
00052 static void SetCDSpeed(const char *device, int speed);
00053
00054 bool ValidateAndLock(MythMediaDevice *pMedia);
00055 void Unlock(MythMediaDevice *pMedia);
00056
00057
00058
00059
00060 QList<MythMediaDevice*> GetRemovable(bool mounted=false);
00061 QList<MythMediaDevice*> GetMedias(MythMediaType mediatype);
00062 MythMediaDevice* GetMedia(const QString &path);
00063
00064 void MonitorRegisterExtensions(uint mediaType, const QString &extensions);
00065 void RegisterMediaHandler(const QString &destination,
00066 const QString &description,
00067 const QString &key,
00068 void (*callback) (MythMediaDevice*),
00069 int mediaType,
00070 const QString &extensions);
00071 void JumpToMediaHandler(MythMediaDevice* pMedia);
00072
00073
00074 static QString defaultCDdevice();
00075 static QString defaultVCDdevice();
00076 static QString defaultDVDdevice();
00077 static QString defaultCDWriter();
00078 static QString defaultDVDWriter();
00079
00080 static void ejectOpticalDisc(void);
00081
00082 virtual QStringList GetCDROMBlockDevices(void) = 0;
00083
00084 public slots:
00085 void mediaStatusChanged(MythMediaStatus oldStatus, MythMediaDevice* pMedia);
00086
00087 protected:
00088 MediaMonitor(QObject *par, unsigned long interval, bool allowEject);
00089 virtual ~MediaMonitor() {}
00090
00091 void AttemptEject(MythMediaDevice *device);
00092 void CheckDevices(void);
00093 virtual void CheckDeviceNotifications(void) {};
00094 virtual bool AddDevice(MythMediaDevice* pDevice) = 0;
00095 bool RemoveDevice(const QString &dev);
00096 bool shouldIgnore(const MythMediaDevice *device);
00097 bool eventFilter(QObject *obj, QEvent *event);
00098
00099 const QString listDevices(void);
00100
00101 static QString defaultDevice(const QString setting,
00102 const QString label,
00103 const char *hardCodedDefault);
00104 MythMediaDevice *selectDrivePopup(const QString label, bool mounted=false);
00105
00106 protected:
00107 QMutex m_DevicesLock;
00108 QList<MythMediaDevice*> m_Devices;
00109 QList<MythMediaDevice*> m_RemovedDevices;
00110 QMap<MythMediaDevice*, int> m_UseCount;
00111
00112
00113 QStringList m_IgnoreList;
00114
00115 bool m_Active;
00116 bool m_SendEvent;
00117 bool m_StartThread;
00118
00119 MonitorThread *m_Thread;
00120 unsigned long m_MonitorPollingInterval;
00121 bool m_AllowEject;
00122
00123 QMap<QString, MHData> m_handlerMap;
00124
00125 static MediaMonitor *c_monitor;
00126 };
00127
00128 #define REG_MEDIA_HANDLER(a, b, c, d, e, f) \
00129 MediaMonitor::GetMediaMonitor()->RegisterMediaHandler(a, b, c, d, e, f)
00130
00131 #endif // MYTH_MEDIA_MONITOR_H