- fixed dvb scan
[enigma2.git] / lib / dvb / scan.h
1 #ifndef __lib_dvb_scan_h
2 #define __lib_dvb_scan_h
3
4 #include <lib/dvb_si/nit.h>
5 #include <lib/dvb_si/sdt.h>
6 #include <lib/dvb_si/bat.h>
7 #include <lib/dvb/db.h>
8
9 class eDVBScan: public Object, public iObject
10 {
11 DECLARE_REF;
12 private:
13                 /* chid helper functions: */
14                 
15                 /* heuristically determine if onid/tsid is valid */
16         int isValidONIDTSID(eOriginalNetworkID onid, eTransportStreamID tsid);
17                 /* build dvb namespace */
18         eDVBNamespace buildNamespace(eOriginalNetworkID onid, eTransportStreamID tsid, unsigned long hash);
19         
20                 /* scan resources */    
21         ePtr<iDVBChannel> m_channel;
22         ePtr<iDVBDemux> m_demux;
23         
24                 /* infrastructure */
25         void stateChange(iDVBChannel *);
26         ePtr<eConnection> m_stateChanged_connection;
27
28                 /* state handling */    
29         RESULT nextChannel();
30         
31         RESULT startFilter();   
32         enum { readySDT=1, readyNIT=2, readyBAT=4, readyAll=7,
33                validSDT=8, validNIT=16, validBAT=32};
34
35                 /* scan state variables */
36         int m_channel_state;
37         int m_ready;
38         
39         std::map<eDVBChannelID, ePtr<iDVBFrontendParameters> > m_new_channels;
40         std::map<eServiceReferenceDVB, ePtr<eDVBService> > m_new_services;
41         
42         std::list<ePtr<iDVBFrontendParameters> > m_ch_toScan, m_ch_scanned, m_ch_unavailable;
43         ePtr<iDVBFrontendParameters> m_ch_current;
44         
45         ePtr<eTable<ServiceDescriptionTable> > m_SDT;
46         ePtr<eTable<NetworkInformationTable> > m_NIT;
47         ePtr<eTable<BouquetAssociationTable> > m_BAT;
48         
49         void SDTready(int err);
50         void NITready(int err);
51         void BATready(int err);
52         
53         void addChannel(const eDVBChannelID &chid, iDVBFrontendParameters *feparm);
54         int  sameChannel(iDVBFrontendParameters *ch1, iDVBFrontendParameters *ch2) const;
55         
56         void channelDone();
57         
58         Signal1<void,int> m_event;
59         RESULT processSDT(eDVBNamespace dvbnamespace, const ServiceDescriptionTable &sdt);
60 public:
61         eDVBScan(iDVBChannel *channel);
62         ~eDVBScan();
63         
64         void start(const std::list<ePtr<iDVBFrontendParameters> > &known_transponders);
65
66         enum { evtUpdate, evtFinish };
67   RESULT connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &connection);
68         void insertInto(eDVBDB *db);
69 };
70
71 #endif