00001 #ifndef AUTOEXPIRE_H_
00002 #define AUTOEXPIRE_H_
00003
00004 #include <stdint.h>
00005
00006 #include <vector>
00007 using namespace std;
00008
00009 #include <QWaitCondition>
00010 #include <QDateTime>
00011 #include <QPointer>
00012 #include <QObject>
00013 #include <QString>
00014 #include <QMutex>
00015 #include <QSet>
00016 #include <QMap>
00017
00018 #include "mthread.h"
00019
00020 class ProgramInfo;
00021 class EncoderLink;
00022 class FileSystemInfo;
00023 class MainServer;
00024
00025 typedef vector<ProgramInfo*> pginfolist_t;
00026 typedef vector<EncoderLink*> enclinklist_t;
00027
00028 enum ExpireMethodType {
00029 emOldestFirst = 1,
00030 emLowestPriorityFirst = 2,
00031 emWeightedTimePriority = 3,
00032 emShortLiveTVPrograms = 10000,
00033 emNormalLiveTVPrograms = 10001,
00034 emOldDeletedPrograms = 10002,
00035 emNormalDeletedPrograms = 10003,
00036 emQuickDeletedPrograms = 10004
00037 };
00038
00039 class AutoExpire;
00040
00041 class ExpireThread : public MThread
00042 {
00043 public:
00044 ExpireThread(AutoExpire *p) : MThread("Expire"), m_parent(p) {}
00045 virtual ~ExpireThread() { wait(); }
00046 virtual void run(void);
00047 private:
00048 QPointer<AutoExpire> m_parent;
00049 };
00050
00051 class UpdateThread : public QObject, public MThread
00052 {
00053 Q_OBJECT
00054 public:
00055 UpdateThread(AutoExpire *p) : MThread("Update"), m_parent(p) {}
00056 virtual ~UpdateThread() { wait(); }
00057 virtual void run(void);
00058 private:
00059 QPointer<AutoExpire> m_parent;
00060 };
00061
00062 class AutoExpire : public QObject
00063 {
00064 Q_OBJECT
00065
00066 friend class ExpireThread;
00067 friend class UpdateThread;
00068 public:
00069 AutoExpire(QMap<int, EncoderLink *> *encoderList);
00070 AutoExpire(void);
00071 ~AutoExpire();
00072
00073 void CalcParams(void);
00074 void PrintExpireList(QString expHost = "ALL");
00075
00076 uint64_t GetDesiredSpace(int fsID) const;
00077
00078 void GetAllExpiring(QStringList &strList);
00079 void GetAllExpiring(pginfolist_t &list);
00080 void ClearExpireList(pginfolist_t &expireList, bool deleteProg = true);
00081
00082 static void Update(int encoder, int fsID, bool immediately);
00083 static void Update(bool immediately) { Update(0, -1, immediately); }
00084
00085 void SetMainServer(MainServer *ms)
00086 {
00087 QMutexLocker locker(&instance_lock);
00088 main_server = ms;
00089 }
00090
00091 QMap<int, EncoderLink *> *encoderList;
00092
00093 protected:
00094 void RunExpirer(void);
00095 void RunUpdate(void);
00096
00097 private:
00098 void ExpireLiveTV(int type);
00099 void ExpireOldDeleted(void);
00100 void ExpireQuickDeleted(void);
00101 void ExpireRecordings(void);
00102 void ExpireEpisodesOverMax(void);
00103
00104 void FillExpireList(pginfolist_t &expireList);
00105 void FillDBOrdered(pginfolist_t &expireList, int expMethod);
00106 void SendDeleteMessages(pginfolist_t &deleteList);
00107 void Sleep(int sleepTime );
00108
00109 void UpdateDontExpireSet(void);
00110 bool IsInDontExpireSet(uint chanid, const QDateTime &recstartts) const;
00111 static bool IsInExpireList(const pginfolist_t &expireList,
00112 uint chanid, const QDateTime &recstartts);
00113
00114
00115 QSet<QString> dont_expire_set;
00116 QSet<QString> deleted_set;
00117 ExpireThread *expire_thread;
00118 uint desired_freq;
00119 bool expire_thread_run;
00120
00121 QMap<int, int64_t> desired_space;
00122 QMap<int, int> used_encoders;
00123
00124 mutable QMutex instance_lock;
00125 QWaitCondition instance_cond;
00126
00127 MainServer *main_server;
00128
00129
00130 bool update_pending;
00131 UpdateThread *update_thread;
00132 };
00133
00134 #endif
00135
00136