00001 #ifndef AUTOEXPIRE_H_
00002 #define AUTOEXPIRE_H_
00003
00004 #include <stdint.h>
00005
00006 #include <pthread.h>
00007
00008 #include <list>
00009 #include <vector>
00010 #include <set>
00011
00012 #include <qmap.h>
00013 #include <qmutex.h>
00014 #include <qwaitcondition.h>
00015 #include <qobject.h>
00016
00017 using namespace std;
00018 class ProgramInfo;
00019 class EncoderLink;
00020 class FileSystemInfo;
00021
00022 typedef vector<ProgramInfo*> pginfolist_t;
00023 typedef vector<EncoderLink*> enclinklist_t;
00024
00025 enum ExpireMethodType {
00026 emOldestFirst = 1,
00027 emLowestPriorityFirst = 2,
00028 emWeightedTimePriority = 3,
00029 emShortLiveTVPrograms = 10000,
00030 emNormalLiveTVPrograms = 10001,
00031 emOldDeletedPrograms = 10002,
00032 emNormalDeletedPrograms = 10003
00033 };
00034
00035 class AutoExpire : public QObject
00036 {
00037 public:
00038 AutoExpire(QMap<int, EncoderLink *> *encoderList);
00039 AutoExpire(void);
00040 ~AutoExpire();
00041
00042 void CalcParams(void);
00043 void PrintExpireList(QString expHost = "ALL");
00044
00045 size_t GetDesiredSpace(int fsID) const;
00046
00047 void GetAllExpiring(QStringList &strList);
00048 void GetAllExpiring(pginfolist_t &list);
00049
00050 static void Update(int encoder, int fsID, bool immediately);
00051 static void Update(bool immediately) { Update(0, -1, immediately); }
00052
00053 QMap<int, EncoderLink *> *encoderList;
00054
00055 protected:
00056 void RunExpirer(void);
00057 static void *ExpirerThread(void *param);
00058
00059 private:
00060 void Init(void);
00061
00062 void ExpireLiveTV(int type);
00063 void ExpireOldDeleted(void);
00064 void ExpireRecordings(void);
00065 void ExpireEpisodesOverMax(void);
00066
00067 void FillExpireList(pginfolist_t &expireList);
00068 void FillDBOrdered(pginfolist_t &expireList, int expMethod);
00069 void SendDeleteMessages(pginfolist_t &deleteList);
00070 void ClearExpireList(pginfolist_t &expireList, bool deleteProg = true);
00071 void Sleep(int sleepTime);
00072
00073 void UpdateDontExpireSet(void);
00074 bool IsInDontExpireSet(QString chanid, QDateTime starttime);
00075 bool IsInExpireList(pginfolist_t &expireList, QString chanid,
00076 QDateTime starttime);
00077
00078
00079 set<QString> dont_expire_set;
00080 pthread_t expire_thread;
00081 uint desired_freq;
00082 bool expire_thread_running;
00083
00084 QMap<int, uint64_t> desired_space;
00085 QMap<int, int> used_encoders;
00086
00087 QMutex instance_lock;
00088 QWaitCondition instance_cond;
00089
00090
00091 bool update_pending;
00092 pthread_t update_thread;
00093
00094 friend void *SpawnUpdateThread(void *param);
00095 };
00096
00097 #endif
00098
00099