better solution to add possibility to delete eSocketNotifiers,
[vuplus_dvbapp] / lib / dvb / scan.h
1 #ifndef __lib_dvb_scan_h
2 #define __lib_dvb_scan_h
3
4 #include <dvbsi++/service_description_section.h>
5 #include <dvbsi++/network_information_section.h>
6 #include <dvbsi++/bouquet_association_section.h>
7 #include <dvbsi++/program_association_section.h>
8 #include <dvbsi++/program_map_section.h>
9
10 #include <lib/dvb/idemux.h>
11 #include <lib/dvb/esection.h>
12 #include <lib/dvb/db.h>
13
14 struct service
15 {
16         service(unsigned short pmtPid)
17                 :pmtPid(pmtPid), serviceType(0xFF), scrambled(false)
18         {
19         }
20         unsigned short pmtPid;
21         unsigned char serviceType;
22         bool scrambled;
23 };
24
25 class eDVBScan: public Object, public iObject
26 {
27         DECLARE_REF(eDVBScan);
28                 /* chid helper functions: */
29                 
30                 /* heuristically determine if onid/tsid is valid */
31         int isValidONIDTSID(int orbital_position, eOriginalNetworkID onid, eTransportStreamID tsid);
32                 /* build dvb namespace */
33         eDVBNamespace buildNamespace(eOriginalNetworkID onid, eTransportStreamID tsid, unsigned long hash);
34         
35                 /* scan resources */    
36         eUsePtr<iDVBChannel> m_channel;
37         ePtr<iDVBDemux> m_demux;
38         
39                 /* infrastructure */
40         void stateChange(iDVBChannel *);
41         ePtr<eConnection> m_stateChanged_connection;
42
43                 /* state handling */    
44         RESULT nextChannel();
45         
46         RESULT startFilter();   
47         enum { readyPAT=1, readySDT=2, readyNIT=4, readyBAT=8,
48                validPAT=16, validSDT=32, validNIT=64, validBAT=128};
49
50                 /* scan state variables */
51         int m_channel_state;
52         int m_ready, m_ready_all;
53         
54         std::map<eDVBChannelID, ePtr<iDVBFrontendParameters> > m_new_channels;
55         std::map<eServiceReferenceDVB, ePtr<eDVBService> > m_new_services;
56         std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator m_last_service;
57
58         std::map<unsigned short, service> m_pmts_to_read;
59         std::map<unsigned short, service>::iterator m_pmt_in_progress;
60         bool m_pmt_running;
61         bool m_abort_current_pmt;
62
63         std::list<ePtr<iDVBFrontendParameters> > m_ch_toScan, m_ch_scanned, m_ch_unavailable;
64         ePtr<iDVBFrontendParameters> m_ch_current;
65         eDVBChannelID m_chid_current;
66         eTransportStreamID m_pat_tsid;
67
68         ePtr<eTable<ServiceDescriptionSection> > m_SDT;
69         ePtr<eTable<NetworkInformationSection> > m_NIT;
70         ePtr<eTable<BouquetAssociationSection> > m_BAT;
71         ePtr<eTable<ProgramAssociationSection> > m_PAT;
72         ePtr<eTable<ProgramMapSection> > m_PMT;
73
74         void SDTready(int err);
75         void NITready(int err);
76         void BATready(int err);
77         void PATready(int err);
78         void PMTready(int err);
79
80         void addKnownGoodChannel(const eDVBChannelID &chid, iDVBFrontendParameters *feparm);
81         void addChannelToScan(const eDVBChannelID &chid, iDVBFrontendParameters *feparm);
82
83         int sameChannel(iDVBFrontendParameters *ch1, iDVBFrontendParameters *ch2, bool exact=false) const;
84
85         void channelDone();
86         
87         Signal1<void,int> m_event;
88         RESULT processSDT(eDVBNamespace dvbnamespace, const ServiceDescriptionSection &sdt);
89         
90         int m_flags;
91         bool m_usePAT;
92         bool m_scan_debug;
93 public:
94         eDVBScan(iDVBChannel *channel, bool usePAT=true, bool debug=true );
95         ~eDVBScan();
96
97         enum {
98                 scanNetworkSearch = 1, scanSearchBAT = 2,
99                 scanRemoveServices = 4, scanDontRemoveFeeds = 8,
100                 scanDontRemoveUnscanned = 16,
101                 clearToScanOnFirstNIT = 32, scanOnlyFree = 64 };
102
103         void start(const eSmartPtrList<iDVBFrontendParameters> &known_transponders, int flags);
104
105         enum { evtUpdate, evtNewService, evtFinish, evtFail };
106         RESULT connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &connection);
107         void insertInto(iDVBChannelList *db, bool dontRemoveNewFlags=false);
108         
109         void getStats(int &transponders_done, int &transponders_total, int &services);
110         void getLastServiceName(std::string &name);
111         RESULT getFrontend(ePtr<iDVBFrontend> &);
112         RESULT getCurrentTransponder(ePtr<iDVBFrontendParameters> &);
113 };
114
115 #endif