ServiceScan : modify to prevent error
[vuplus_dvbapp] / lib / components / scan.cpp
1 #include <lib/dvb/dvb.h>
2 #include <lib/dvb/db.h>
3 #include <lib/components/scan.h>
4 #include <lib/base/eerror.h>
5 #include <lib/dvb/scan.h>
6
7 DEFINE_REF(eComponentScan);
8
9 void eComponentScan::scanEvent(int evt)
10 {
11 //      eDebug("scan event %d!", evt);
12         
13         switch(evt)
14         {
15                 case eDVBScan::evtFinish:
16                 {
17                         m_done = 1;
18                         ePtr<iDVBChannelList> db;
19                         ePtr<eDVBResourceManager> res;
20                         
21                         int err;
22                         if ((err = eDVBResourceManager::getInstance(res)) != 0)
23                         {
24                                 eDebug("no resource manager");
25                                 m_failed = 2;
26                         } else if ((err = res->getChannelList(db)) != 0)
27                         {
28                                 m_failed = 3;
29                                 eDebug("no channel list");
30                         } else
31                         {
32                                 m_scan->insertInto(db);
33                                 db->flush();
34                                 eDebug("scan done!");
35                         }
36                         break;
37                 }
38                 case eDVBScan::evtNewService:
39                         newService();
40                         return;
41                 case eDVBScan::evtFail:
42                         eDebug("scan failed.");
43                         m_failed = 1;
44                         m_done = 1;
45                         break;
46                 case eDVBScan::evtUpdate:
47                         break;
48         }
49         statusChanged();
50 }
51
52 eComponentScan::eComponentScan(): m_done(-1), m_failed(0)
53 {
54 }
55
56 eComponentScan::~eComponentScan()
57 {
58 }
59
60 void eComponentScan::clear()
61 {
62         m_initial.clear();
63 }
64
65 void eComponentScan::clearAll()
66 {
67         m_scan_event_connection = 0;
68         m_scan = 0;
69
70         m_initial.clear();
71         m_done = -1;
72         m_failed = 0;
73 }
74
75
76 void eComponentScan::addInitial(const eDVBFrontendParametersSatellite &p)
77 {
78         ePtr<eDVBFrontendParameters> parm = new eDVBFrontendParameters();
79         parm->setDVBS(p);
80         m_initial.push_back(parm);
81 }
82
83 void eComponentScan::addInitial(const eDVBFrontendParametersCable &p)
84 {
85         ePtr<eDVBFrontendParameters> parm = new eDVBFrontendParameters();
86         parm->setDVBC(p);
87         m_initial.push_back(parm);
88 }
89
90 void eComponentScan::addInitial(const eDVBFrontendParametersTerrestrial &p)
91 {
92         ePtr<eDVBFrontendParameters> parm = new eDVBFrontendParameters();
93         parm->setDVBT(p);
94         m_initial.push_back(parm);
95 }
96
97
98 int eComponentScan::start(int feid, int flags)
99 {
100         if (m_initial.empty())
101                 return -2;
102
103         if (m_done != -1)
104                 return -1;
105         
106         m_done = 0;
107         ePtr<eDVBResourceManager> mgr;
108         
109         eDVBResourceManager::getInstance(mgr);
110
111         eUsePtr<iDVBChannel> channel;
112
113         if (mgr->allocateRawChannel(channel, feid))
114         {
115                 eDebug("scan: allocating raw channel (on frontend %d) failed!", feid);
116                 return -1;
117         }
118
119         std::list<ePtr<iDVBFrontendParameters> > list;
120         m_scan = new eDVBScan(channel);
121         m_scan->connectEvent(slot(*this, &eComponentScan::scanEvent), m_scan_event_connection);
122
123         if (!(flags & scanRemoveServices))
124         {
125                 ePtr<iDVBChannelList> db;
126                 ePtr<eDVBResourceManager> res;
127                 int err;
128                 if ((err = eDVBResourceManager::getInstance(res)) != 0)
129                         eDebug("no resource manager");
130                 else if ((err = res->getChannelList(db)) != 0)
131                         eDebug("no channel list");
132                 else
133                 {
134                         if (m_initial.size() > 1)
135                         {
136                                 ePtr<iDVBFrontendParameters> tp = m_initial.first();
137                                 int type;
138                                 if (tp && !tp->getSystem(type))
139                                 {
140                                         switch(type)
141                                         {
142                                                 case iDVBFrontend::feSatellite:
143                                                 {
144                                                         eDVBFrontendParametersSatellite parm;
145                                                         tp->getDVBS(parm);
146                                                         db->removeFlags(eDVBService::dxNewFound, -1, -1, -1, parm.orbital_position);
147                                                         break;
148                                                 }
149                                                 case iDVBFrontend::feCable:
150                                                         db->removeFlags(eDVBService::dxNewFound, 0xFFFF0000, -1, -1, -1);
151                                                         break;
152                                                 case iDVBFrontend::feTerrestrial:
153                                                         db->removeFlags(eDVBService::dxNewFound, 0xEEEE0000, -1, -1, -1);
154                                                         break;
155                                         }
156                                 }
157                         }
158                 }
159         }
160         m_scan->start(m_initial, flags);
161
162         return 0;
163 }
164
165 int eComponentScan::getProgress()
166 {
167         if (!m_scan)
168                 return 0;
169         int done, total, services;
170         m_scan->getStats(done, total, services);
171         if (!total)
172                 return 0;
173         return done * 100 / total;
174 }
175
176 int eComponentScan::getNumServices()
177 {
178         if (!m_scan)
179                 return 0;
180         int done, total, services;
181         m_scan->getStats(done, total, services);
182         return services;
183 }
184
185 int eComponentScan::isDone()
186 {
187         return m_done;
188 }
189
190 int eComponentScan::getError()
191 {
192         return m_failed;
193 }
194
195 void eComponentScan::getLastServiceName(std::string &string)
196 {
197         if (!m_scan)
198                 return;
199         m_scan->getLastServiceName(string);
200 }
201
202 RESULT eComponentScan::getFrontend(ePtr<iDVBFrontend> &fe)
203 {
204         if (m_scan)
205                 return m_scan->getFrontend(fe);
206         fe = 0;
207         return -1;
208 }
209
210 RESULT eComponentScan::getCurrentTransponder(ePtr<iDVBFrontendParameters> &tp)
211 {
212         if (m_scan)
213                 return m_scan->getCurrentTransponder(tp);
214         tp = 0;
215         return -1;
216 }
217