00001
00002
00003 #ifndef SISCAN_H
00004 #define SISCAN_H
00005
00006
00007 #include <qobject.h>
00008 #include <qstring.h>
00009 #include <qmap.h>
00010 #include <qmutex.h>
00011 #include <qvaluelist.h>
00012 #include <qdatetime.h>
00013
00014
00015 #include "frequencytables.h"
00016 #include "streamlisteners.h"
00017 #include "dvbconfparser.h"
00018
00019 class MSqlQuery;
00020
00021 class ChannelBase;
00022 class DTVChannel;
00023 class Channel;
00024 class DVBChannel;
00025 class HDHRChannel;
00026
00027 class SignalMonitor;
00028 class DTVSignalMonitor;
00029 class DVBSignalMonitor;
00030
00031 typedef enum
00032 {
00033 IDLE,
00034 TRANSPORT_LIST,
00035 } SCANMODE;
00036
00037 typedef vector<const ProgramMapTable*> pmt_vec_t;
00038 typedef QMap<uint, pmt_vec_t> pmt_map_t;
00039
00040 class SIScan : public QObject,
00041 public MPEGStreamListener,
00042 public ATSCMainStreamListener,
00043 public DVBMainStreamListener
00044 {
00045 Q_OBJECT
00046 public:
00047 SIScan(const QString &_cardtype, ChannelBase* _channel, int _sourceID,
00048 uint signal_timeout, uint channel_timeout,
00049 const QString &_inputname);
00050 ~SIScan();
00051
00052 void StartScanner(void);
00053 void StopScanner(void);
00054
00055 bool ScanTransports(
00056 int src, const QString std, const QString mod, const QString country);
00057 bool ScanTransportsStartingOn(
00058 int sourceid, const QMap<QString,QString> &valueMap);
00059 bool ScanTransport(int mplexid);
00060 bool ScanForChannels(
00061 uint sourceid, const QString &std, const QString &cardtype,
00062 const DTVChannelList&);
00063
00064 bool ScanServicesSourceID(int SourceID);
00065
00066 void SetAnalog(bool is_analog);
00067 void SetSourceID(int _SourceID) { sourceID = _SourceID; }
00068 void SetFTAOnly(bool _fFTAOnly) { ignoreEncryptedServices = _fFTAOnly; }
00069 void SetTVOnly(bool _tvOnly)
00070 { ignoreAudioOnlyServices = ignoreDataServices = _tvOnly; }
00071 void SetForceUpdate(bool _force) { forceUpdate = _force; }
00072 void SetRenameChannels(bool _r) { renameChannels = _r; }
00073 void SetChannelFormat(const QString _fmt) { channelFormat = _fmt; }
00074 void SetSignalTimeout(uint val) { signalTimeout = val; }
00075 void SetChannelTimeout(uint val) { channelTimeout = val; }
00076
00077 uint GetSignalTimeout(void) const { return signalTimeout; }
00078 uint GetChannelTimeout(void) const { return channelTimeout; }
00079
00080 SignalMonitor *GetSignalMonitor(void) { return signalMonitor; }
00081 DTVSignalMonitor *GetDTVSignalMonitor(void);
00082 DVBSignalMonitor *GetDVBSignalMonitor(void);
00083
00084
00085 void HandlePAT(const ProgramAssociationTable*);
00086 void HandleCAT(const ConditionalAccessTable*) { }
00087 void HandlePMT(uint, const ProgramMapTable*) { }
00088 void HandleEncryptionStatus(uint , bool ) { }
00089
00090
00091 void HandleSTT(const SystemTimeTable*) {}
00092 void HandleMGT(const MasterGuideTable*);
00093 void HandleVCT(uint tsid, const VirtualChannelTable*);
00094
00095
00096 void HandleNIT(const NetworkInformationTable*);
00097 void HandleSDT(uint tsid, const ServiceDescriptionTable*);
00098 void HandleTDT(const TimeDateTable*) {}
00099
00100 public slots:
00101 void deleteLater(void);
00102
00103 private slots:
00104 void HandleAllGood(void);
00105
00106 signals:
00107
00108 void PctServiceScanComplete(int pct);
00109 void PctTransportScanComplete(int pct);
00110 void ServiceScanUpdateStatusText(const QString& status);
00111 void ServiceScanUpdateText(const QString& status);
00112 void TransportScanUpdateText(const QString& status);
00113 void ServiceScanComplete(void);
00114 void TransportScanComplete(void);
00115
00116 private:
00117
00118 DTVChannel *GetDTVChannel(void);
00119 Channel *GetChannel(void);
00120 DVBChannel *GetDVBChannel(void);
00121
00123 void RunScanner(void);
00125 static void *SpawnScanner(void *param);
00126
00127 bool HasTimedOut(void);
00128 void HandleActiveScan(void);
00129 bool Tune(const transport_scan_items_it_t transport);
00130 uint InsertMultiplex(const transport_scan_items_it_t transport);
00131 void ScanTransport(const transport_scan_items_it_t transport);
00132
00134 inline void UpdateScanPercentCompleted(void);
00135
00136 bool CheckImportedList(const DTVChannelInfoList&,
00137 uint mpeg_program_num,
00138 QString &service_name,
00139 QString &callsign,
00140 QString &common_status_info);
00141
00142 void IgnoreDataOnlyMsg( const QString &name, int aux_num);
00143 void IgnoreEmptyChanMsg(const QString &name, int aux_num);
00144 void IgnoreAudioOnlyMsg(const QString &name, int aux_num);
00145 void IgnoreEncryptedMsg(const QString &name, int aux_num);
00146
00147 void HandleMPEGDBInsertion(const ScanStreamData *sd, bool wait);
00148 void UpdatePATinDB(int mplexid, const QString &friendlyName, int freqid,
00149 const ProgramAssociationTable*, const pmt_map_t&,
00150 const DTVChannelInfoList&, const QString &si_standard,
00151 bool force_update);
00152
00153 void UpdatePMTinDB(int sourceid,
00154 int mplexid, const QString &friendlyName, int freqid,
00155 int pmt_indx, const ProgramMapTable*,
00156 const DTVChannelInfoList&,
00157 bool force_update);
00158
00159 void HandleATSCDBInsertion(const ScanStreamData *sd, bool wait);
00160 void UpdateVCTinDB(int mplexid, const QString &friendlyName, int freqid,
00161 const VirtualChannelTable*,
00162 const DTVChannelInfoList&,
00163 bool force_update);
00164
00165 void HandleDVBDBInsertion(const ScanStreamData *sd, bool wait);
00166 void UpdateSDTinDB(int mplexid,
00167 const ServiceDescriptionTable*,
00168 const DTVChannelInfoList&,
00169 bool force_update);
00170
00171 bool HandlePostInsertion(void);
00172
00173 uint64_t FindBestMplexFreq(const uint64_t tuning_freq,
00174 const transport_scan_items_it_t transport,
00175 const uint sourceid, const uint transportid,
00176 const uint networkid);
00177
00178
00179 static QString loc(const SIScan*);
00180
00181 private:
00182
00183 ChannelBase *channel;
00184 SignalMonitor *signalMonitor;
00185 int sourceID;
00186 SCANMODE scanMode;
00187 uint signalTimeout;
00188 uint channelTimeout;
00189 QString inputname;
00190
00191
00192 bool ignoreAudioOnlyServices;
00193 bool ignoreDataServices;
00194 bool ignoreEncryptedServices;
00195 bool forceUpdate;
00196 bool renameChannels;
00197 QString channelFormat;
00198
00199
00200 bool threadExit;
00201 bool waitingForTables;
00202 QTime timer;
00203
00204
00205 int transportsScanned;
00206 transport_scan_items_t scanTransports;
00207 transport_scan_items_it_t current;
00208 transport_scan_items_it_t nextIt;
00209 QMap<uint, uint> dvbChanNums;
00210
00212 pthread_t scanner_thread;
00213 bool scanner_thread_running;
00214 };
00215
00216 inline void SIScan::UpdateScanPercentCompleted(void)
00217 {
00218 int tmp = (transportsScanned * 100) / scanTransports.size();
00219 emit PctServiceScanComplete(tmp);
00220 }
00221
00222 #endif // SISCAN_H