00001 #ifndef MAINSERVER_H_
00002 #define MAINSERVER_H_
00003
00004 #include <qmap.h>
00005 #include <qtimer.h>
00006 #include <qurl.h>
00007 #include <qmutex.h>
00008 #include <qdom.h>
00009 #include <vector>
00010 using namespace std;
00011
00012 #include "tv.h"
00013 #include "server.h"
00014 #include "playbacksock.h"
00015 #include "encoderlink.h"
00016 #include "filetransfer.h"
00017 #include "scheduler.h"
00018 #include "livetvchain.h"
00019 #include "autoexpire.h"
00020 #include "mythsocket.h"
00021
00022 class ProcessRequestThread;
00023
00024 class MainServer : public QObject, public MythSocketCBs
00025 {
00026 Q_OBJECT
00027 public:
00028 MainServer(bool master, int port,
00029 QMap<int, EncoderLink *> *tvList,
00030 Scheduler *sched, AutoExpire *expirer);
00031
00032 ~MainServer();
00033
00034 void customEvent(QCustomEvent *e);
00035
00036 bool isClientConnected();
00037 void ShutSlaveBackendsDown(QString &haltcmd);
00038
00039 void ProcessRequest(MythSocket *sock);
00040 void MarkUnused(ProcessRequestThread *prt);
00041
00042 void readyRead(MythSocket *socket);
00043 void connectionClosed(MythSocket *socket);
00044 void connectionFailed(MythSocket *socket) { (void)socket; }
00045 void connected(MythSocket *socket) { (void)socket; }
00046
00047 void DeletePBS(PlaybackSock *pbs);
00048
00049 protected slots:
00050 void reconnectTimeout(void);
00051 void deferredDeleteSlot(void);
00052 void autoexpireUpdate(void);
00053
00054 private slots:
00055 void newConnection(MythSocket *);
00056
00057 private:
00058 typedef struct deletestruct
00059 {
00060 MainServer *ms;
00061 QString chanid;
00062 QDateTime recstartts;
00063 QDateTime recendts;
00064 QString filename;
00065 QString title;
00066 bool forceMetadataDelete;
00067 } DeleteStruct;
00068
00069 void ProcessRequestWork(MythSocket *sock);
00070 void HandleAnnounce(QStringList &slist, QStringList commands,
00071 MythSocket *socket);
00072 void HandleDone(MythSocket *socket);
00073
00074 void HandleIsActiveBackendQuery(QStringList &slist, PlaybackSock *pbs);
00075 void HandleQueryRecordings(QString type, PlaybackSock *pbs);
00076 void HandleQueryRecording(QStringList &slist, PlaybackSock *pbs);
00077 void HandleStopRecording(QStringList &slist, PlaybackSock *pbs);
00078 void DoHandleStopRecording(ProgramInfo *pginfo, PlaybackSock *pbs);
00079 void HandleDeleteRecording(QStringList &slist, PlaybackSock *pbs,
00080 bool forceMetadataDelete);
00081 void DoHandleDeleteRecording(ProgramInfo *pginfo, PlaybackSock *pbs,
00082 bool forceMetadataDelete, bool expirer=false);
00083 void HandleUndeleteRecording(QStringList &slist, PlaybackSock *pbs);
00084 void DoHandleUndeleteRecording(ProgramInfo *pginfo, PlaybackSock *pbs);
00085 void HandleForgetRecording(QStringList &slist, PlaybackSock *pbs);
00086 void HandleRescheduleRecordings(int recordid, PlaybackSock *pbs);
00087 void HandleQueryFreeSpace(PlaybackSock *pbs, bool allBackends);
00088 void HandleQueryFreeSpaceSummary(PlaybackSock *pbs);
00089 void HandleQueryCheckFile(QStringList &slist, PlaybackSock *pbs);
00090 void HandleQueryGuideDataThrough(PlaybackSock *pbs);
00091 void HandleGetPendingRecordings(PlaybackSock *pbs, QString table = "", int recordid=-1);
00092 void HandleGetScheduledRecordings(PlaybackSock *pbs);
00093 void HandleGetConflictingRecordings(QStringList &slist, PlaybackSock *pbs);
00094 void HandleGetExpiringRecordings(PlaybackSock *pbs);
00095 void HandleGetNextFreeRecorder(QStringList &slist, PlaybackSock *pbs);
00096 void HandleGetFreeRecorder(PlaybackSock *pbs);
00097 void HandleGetFreeRecorderCount(PlaybackSock *pbs);
00098 void HandleGetFreeRecorderList(PlaybackSock *pbs);
00099 void HandleGetConnectedRecorderList(PlaybackSock *pbs);
00100 void HandleRecorderQuery(QStringList &slist, QStringList &commands,
00101 PlaybackSock *pbs);
00102 void HandleSetNextLiveTVDir(QStringList &commands, PlaybackSock *pbs);
00103 void HandleFileTransferQuery(QStringList &slist, QStringList &commands,
00104 PlaybackSock *pbs);
00105 void HandleGetRecorderNum(QStringList &slist, PlaybackSock *pbs);
00106 void HandleGetRecorderFromNum(QStringList &slist, PlaybackSock *pbs);
00107 void HandleMessage(QStringList &slist, PlaybackSock *pbs);
00108 void HandleGenPreviewPixmap(QStringList &slist, PlaybackSock *pbs);
00109 void HandlePixmapLastModified(QStringList &slist, PlaybackSock *pbs);
00110 void HandleIsRecording(QStringList &slist, PlaybackSock *pbs);
00111 void HandleCheckRecordingActive(QStringList &slist, PlaybackSock *pbs);
00112 void HandleFillProgramInfo(QStringList &slist, PlaybackSock *pbs);
00113 void HandleSetChannelInfo(QStringList &slist, PlaybackSock *pbs);
00114 void HandleRemoteEncoder(QStringList &slist, QStringList &commands,
00115 PlaybackSock *pbs);
00116 void HandleLockTuner(PlaybackSock *pbs);
00117 void HandleFreeTuner(int cardid, PlaybackSock *pbs);
00118 void HandleCutMapQuery(const QString &chanid, const QString &starttime,
00119 PlaybackSock *pbs, bool commbreak);
00120 void HandleCommBreakQuery(const QString &chanid, const QString &starttime,
00121 PlaybackSock *pbs);
00122 void HandleCutlistQuery(const QString &chanid, const QString &starttime,
00123 PlaybackSock *pbs);
00124 void HandleBookmarkQuery(const QString &chanid, const QString &starttime,
00125 PlaybackSock *pbs);
00126 void HandleSetBookmark(QStringList &tokens, PlaybackSock *pbs);
00127 void HandleSettingQuery(QStringList &tokens, PlaybackSock *pbs);
00128 void HandleSetSetting(QStringList &tokens, PlaybackSock *pbs);
00129 void HandleVersion(MythSocket *socket, QString version);
00130 void HandleBackendRefresh(MythSocket *socket);
00131 void HandleQueryLoad(PlaybackSock *pbs);
00132 void HandleQueryUptime(PlaybackSock *pbs);
00133 void HandleQueryMemStats(PlaybackSock *pbs);
00134 void HandleBlockShutdown(bool blockShutdown, PlaybackSock *pbs);
00135
00136 void SendResponse(MythSocket *pbs, QStringList &commands);
00137
00138 void getGuideDataThrough(QDateTime &GuideDataThrough);
00139
00140 PlaybackSock *getSlaveByHostname(QString &hostname);
00141 PlaybackSock *getPlaybackBySock(MythSocket *socket);
00142 FileTransfer *getFileTransferByID(int id);
00143 FileTransfer *getFileTransferBySock(MythSocket *socket);
00144
00145 QString LocalFilePath(QUrl &url);
00146
00147 static void *SpawnDeleteThread(void *param);
00148 void DoDeleteThread(const DeleteStruct *ds);
00149 void DoDeleteInDB(const DeleteStruct *ds);
00150
00151 LiveTVChain *GetExistingChain(QString id);
00152 LiveTVChain *GetExistingChain(MythSocket *sock);
00153 LiveTVChain *GetChainWithRecording(ProgramInfo *pginfo);
00154 void AddToChains(LiveTVChain *chain);
00155 void DeleteChain(LiveTVChain *chain);
00156
00157 static int DeleteFile(const QString &filename, bool followLinks);
00158 static int OpenAndUnlink(const QString &filename);
00159 static bool TruncateAndClose(ProgramInfo *pginfo,
00160 int fd, const QString &filename,
00161 off_t fsize);
00162
00163 QPtrList<LiveTVChain> liveTVChains;
00164 QMutex liveTVChainsLock;
00165
00166 QMap<int, EncoderLink *> *encoderList;
00167
00168 MythServer *mythserver;
00169
00170 QMutex sockListLock;
00171 vector<PlaybackSock *> playbackList;
00172 vector<FileTransfer *> fileTransferList;
00173
00174 QTimer *masterServerReconnect;
00175 PlaybackSock *masterServer;
00176
00177 bool ismaster;
00178
00179 QMutex deletelock;
00180 QMutex threadPoolLock;
00181 QWaitCondition threadPoolCond;
00182 vector<ProcessRequestThread *> threadPool;
00183
00184 bool masterBackendOverride;
00185
00186 Scheduler *m_sched;
00187 AutoExpire *m_expirer;
00188
00189 QMutex readReadyLock;
00190
00191 struct DeferredDeleteStruct
00192 {
00193 PlaybackSock *sock;
00194 QDateTime ts;
00195 };
00196
00197 QMutex deferredDeleteLock;
00198 QTimer *deferredDeleteTimer;
00199 QValueList<DeferredDeleteStruct> deferredDeleteList;
00200
00201 QTimer *autoexpireUpdateTimer;
00202
00203 static QMutex truncate_and_close_lock;
00204 };
00205
00206 #endif
00207
00208