trunk 20080912
[gitenigma.git] / lib / dvb / settings.cpp
blobeebed5235a66a672bed2d249ea0dc7d2c0f7ebcb
1 #include <lib/dvb/settings.h>
2 #include <lib/dvb/edvb.h>
3 #include <lib/dvb/frontend.h>
5 typedef std::list<eServiceReferenceDVB>::iterator ServiceReferenceDVBIterator;
7 eDVBSettings::eDVBSettings(eDVB &dvb): dvb(dvb)
9 transponderlist=new eTransponderList;
10 loadServices();
11 loadBouquets();
12 CONNECT( transponderlist->service_found, eDVBSettings::service_found );
13 CONNECT( transponderlist->service_removed, eDVBSettings::service_removed );
16 void eDVBSettings::removeDVBBouquets()
18 for (std::map<int, eBouquet*>::iterator i(bouquet_id_map.begin()); i != bouquet_id_map.end();)
20 if ( i->first >= 0)
22 // eDebug("removing bouquet '%s'", i->bouquet_name.c_str());
23 bouquet_name_map.erase(i->second->bouquet_name); // remove from name map
24 delete i->second; // release heap memory
25 bouquet_id_map.erase(i++); // remove from id map
26 bouquetsChanged=1;
28 else
30 // eDebug("leaving bouquet '%s'", i->bouquet_name.c_str());
31 ++i;
36 void eDVBSettings::removeDVBBouquet(int bouquet_id)
38 std::map<int, eBouquet*>::iterator i(bouquet_id_map.find(bouquet_id));
39 if ( i != bouquet_id_map.end() )
41 bouquet_name_map.erase(i->second->bouquet_name); // remove from name map
42 delete i->second; // release heap memory
43 bouquet_id_map.erase(i); // remove from id map
44 bouquetsChanged=1;
48 void eDVBSettings::renameDVBBouquet(int bouquet_id, eString& new_name)
50 std::map<int, eBouquet*>::iterator i(bouquet_id_map.find(bouquet_id));
51 if ( i != bouquet_id_map.end() )
53 bouquet_name_map.erase(i->second->bouquet_name); // remove from name map
54 bouquet_name_map[new_name] = i->second;
55 i->second->bouquet_name = new_name;
56 bouquetsChanged=1;
60 void eDVBSettings::addDVBBouquet(eDVBNamespace origin, const BAT *bat )
62 eDebug("wir haben da eine bat, id %x our id is %08x", bat->bouquet_id, -(bat->bouquet_id | 0xF000000));
63 eString bouquet_name="Weiteres Bouquet";
64 for (ePtrList<Descriptor>::const_iterator i(bat->bouquet_descriptors); i != bat->bouquet_descriptors.end(); ++i)
66 if (i->Tag()==DESCR_BOUQUET_NAME)
68 bouquet_name=((BouquetNameDescriptor*)*i)->name;
69 bouquet_name+=" (BAT)";
72 eBouquet *bouquet=createBouquet(-(bat->bouquet_id|0xF000000), bouquet_name);
73 bouquet->list.clear();
74 for (ePtrList<BATEntry>::const_iterator be(bat->entries); be != bat->entries.end(); ++be)
75 for (ePtrList<Descriptor>::const_iterator i(be->transport_descriptors); i != be->transport_descriptors.end(); ++i)
76 if (i->Tag()==DESCR_SERVICE_LIST)
78 const ServiceListDescriptor *s=(ServiceListDescriptor*)*i;
79 for (ePtrList<ServiceListDescriptorEntry>::const_iterator a(s->entries); a != s->entries.end(); ++a)
81 bouquet->add(
82 eServiceReferenceDVB(
83 origin,
84 eTransportStreamID(be->transport_stream_id),
85 eOriginalNetworkID(be->original_network_id),
86 eServiceID(a->service_id), a->service_type));
91 eBouquet *eDVBSettings::getBouquet(int bouquet_id)
93 std::map<int, eBouquet*>::iterator i(bouquet_id_map.find(bouquet_id));
94 if ( i != bouquet_id_map.end() )
95 return i->second;
96 return 0;
99 static eString beautifyBouquetName(eString bouquet_name)
101 /* if ( (bouquet_name.find("ARD") != eString::npos)
102 || (bouquet_name.find("ZDF") != eString::npos)
103 || (bouquet_name.find("RTL") != eString::npos)
104 || (bouquet_name.find("n-tv") != eString::npos)
105 || (bouquet_name.find("ProSieben") != eString::npos)
106 || (bouquet_name.find("VIVA") != eString::npos) )
107 bouquet_name="German Free";
108 else*/
109 if ( bouquet_name.upper().find("POLSAT") != eString::npos
110 || ( bouquet_name.length() == 5
111 && (bouquet_name.find("D11") != eString::npos
112 || bouquet_name.find("D10") != eString::npos ) ) )
113 bouquet_name="POLSAT";
114 else if (bouquet_name.find("HRT") != eString::npos)
115 bouquet_name="HRT Zagreb";
116 else if (bouquet_name.find("TVP") != eString::npos)
117 bouquet_name="TVP";
118 else if (bouquet_name.find("RVTS") != eString::npos)
119 bouquet_name="RVTS";
120 else if (bouquet_name=="AB SAT")
121 bouquet_name="ABSAT";
122 else if (bouquet_name=="Astra-Net")
123 bouquet_name="ASTRA";
124 else if (bouquet_name=="CSAT")
125 bouquet_name="CANALSATELLITE";
126 else if (bouquet_name.find("SES")!=eString::npos)
127 bouquet_name="SES Multimedia";
128 else if (!bouquet_name)
129 bouquet_name="no name";
130 return bouquet_name;
133 eBouquet *eDVBSettings::getBouquet(eString& bouquet_name)
135 std::map<eString, eBouquet*>::iterator i(bouquet_name_map.find(bouquet_name));
136 if ( i != bouquet_name_map.end() )
137 return i->second;
138 return 0;
141 eBouquet* eDVBSettings::createBouquet(int bouquet_id, eString bouquet_name)
143 eBouquet *n=getBouquet(bouquet_id);
144 if (!n)
146 n = new eBouquet(bouquet_id, bouquet_name);
147 bouquet_name_map[bouquet_name] = n;
148 bouquet_id_map[bouquet_id] = n;
149 bouquetsChanged=1;
151 return n;
154 eBouquet *eDVBSettings::createBouquet(eString bouquet_name)
156 eBouquet *n=getBouquet(bouquet_name);
157 if (!n)
159 int bouquet_id=getUnusedBouquetID(0);
160 n = new eBouquet(bouquet_id, bouquet_name);
161 bouquet_name_map[bouquet_name] = n;
162 bouquet_id_map[bouquet_id] = n;
163 bouquetsChanged=1;
165 return n;
168 int eDVBSettings::getUnusedBouquetID(int range)
170 if (range)
171 range=-1;
172 else
173 range=1;
175 int bouquet_id=0;
177 while(true) // Evtl hier nochmal nachschauen....
179 if (!getBouquet(bouquet_id))
180 return bouquet_id;
182 bouquet_id+=range;
186 void eDVBSettings::revalidateBouquets()
188 /*emit*/ dvb.bouquetListChanged();
191 struct sortinChannel
193 eDVBSettings &edvb;
194 sortinChannel(eDVBSettings &edvb): edvb(edvb)
197 void operator()(eServiceDVB &service)
199 eBouquet *b = edvb.createBouquet(beautifyBouquetName(service.service_provider) );
200 b->add(eServiceReferenceDVB(service.dvb_namespace, service.transport_stream_id, service.original_network_id, service.service_id, service.service_type));
204 void eDVBSettings::service_found( const eServiceReferenceDVB &ref, bool newAdded )
206 if ( !eDVB::getInstance()->getScanAPI() && newAdded )
208 eServiceDVB *service = transponderlist->searchService(ref);
209 if ( service )
211 eBouquet *b = createBouquet(beautifyBouquetName(service->service_provider));
212 if ( b->bouquet_id >=0 && !b->list.size() || std::find(b->list.begin(),b->list.end(),ref) == b->list.end() )
214 b->add(ref);
215 /* emit */ eDVB::getInstance()->serviceListChanged();
221 void eDVBSettings::service_removed( const eServiceReferenceDVB &ref)
223 eServiceDVB *service = transponderlist->searchService(ref);
224 if ( !eDVB::getInstance()->getScanAPI() && service )
226 eBouquet *b = createBouquet(beautifyBouquetName(service->service_provider));
227 if (b->bouquet_id >=0 )
229 std::list<eServiceReferenceDVB>::iterator it =
230 std::find(b->list.begin(), b->list.end(), ref);
231 if ( it != b->list.end() )
233 b->list.erase(it);
234 if ( !b->list.size()) // delete last service in bouquet
235 removeDVBBouquet(b->bouquet_id);
236 /* emit */ eDVB::getInstance()->serviceListChanged();
242 void eDVBSettings::sortInChannels()
244 eDebug("sorting in channels");
245 removeDVBBouquets();
246 getTransponders()->forEachService(sortinChannel(*this));
247 revalidateBouquets();
250 struct saveService
252 FILE *f;
253 saveService(FILE *out): f(out)
255 fprintf(f, "services\n");
257 void operator()(eServiceDVB& s)
259 fprintf(f, "%04x:%08x:%04x:%04x:%d:%d\n", s.service_id.get(), s.dvb_namespace.get(), s.transport_stream_id.get(), s.original_network_id.get(), s.service_type, s.service_number);
260 fprintf(f, "%s\n", s.service_name.c_str());
261 if (s.dxflags)
262 fprintf(f, "f:%x,", s.dxflags);
263 for (int i=0; i<eServiceDVB::cacheMax; ++i)
265 short val = s.get((eServiceDVB::cacheID)i);
266 if (val != -1)
267 fprintf(f, "c:%02d%04x,", i, val);
269 eString prov;
270 prov=s.service_provider;
271 for (eString::iterator i=prov.begin(); i != prov.end(); ++i)
272 if (*i == ',')
273 *i='_';
275 fprintf(f, "p:%s\n", prov.c_str());
277 ~saveService()
279 fprintf(f, "end\n");
282 struct saveSubService
284 FILE *f;
285 saveSubService(FILE *out): f(out)
287 fprintf(f, "subservices\n");
289 void operator()(eServiceDVB& s)
291 bool bChanged = false;
292 for (int i=0; i<eServiceDVB::cacheMax; ++i)
294 if (s.get((eServiceDVB::cacheID)i) != -1)
296 bChanged = true;
297 break;
300 if (!bChanged) return;
301 fprintf(f, "%04x:%08x:%04x:%04x\n", s.service_id.get(), s.dvb_namespace.get(), s.transport_stream_id.get(), s.original_network_id.get());
302 fprintf(f, "%s\n", s.service_name.c_str());
303 if (s.dxflags)
304 fprintf(f, "f:%x,", s.dxflags);
305 for (int i=0; i<eServiceDVB::cacheMax; ++i)
307 short val = s.get((eServiceDVB::cacheID)i);
308 if (val != -1)
309 fprintf(f, "c:%02d%04x,", i, val);
311 eString prov;
312 prov=s.service_provider;
313 for (eString::iterator i=prov.begin(); i != prov.end(); ++i)
314 if (*i == ',')
315 *i='_';
317 fprintf(f, "p:%s\n", prov.c_str());
319 ~saveSubService()
321 fprintf(f, "end\n");
325 struct saveTransponder
327 FILE *f;
328 saveTransponder(FILE *out): f(out)
330 fprintf(f, "transponders\n");
332 void operator()(eTransponder &t)
334 if (t.state&eTransponder::stateOK)
336 fprintf(f, "%08x:%04x:%04x\n", t.dvb_namespace.get(), t.transport_stream_id.get(), t.original_network_id.get());
337 if (t.cable.valid)
338 fprintf(f, "\tc %d:%d:%d:%d:%d", t.cable.frequency, t.cable.symbol_rate, t.cable.inversion, t.cable.modulation, t.cable.fec_inner);
339 if (t.satellite.valid)
340 fprintf(f, "\ts %d:%d:%d:%d:%d:%d", t.satellite.frequency, t.satellite.symbol_rate, t.satellite.polarisation, t.satellite.fec, t.satellite.orbital_position, t.satellite.inversion);
341 if (t.terrestrial.valid)
342 fprintf(f, "\tt %d:%d:%d:%d:%d:%d:%d:%d:%d",
343 t.terrestrial.centre_frequency,
344 t.terrestrial.code_rate_hp,
345 t.terrestrial.code_rate_lp,
346 t.terrestrial.bandwidth,
347 t.terrestrial.constellation,
348 t.terrestrial.guard_interval,
349 t.terrestrial.hierarchy_information,
350 t.terrestrial.transmission_mode,
351 t.terrestrial.inversion);
352 fprintf(f, ":%d\n/\n", t.state & eTransponder::stateOnlyFree );
355 ~saveTransponder()
357 fprintf(f, "end\n");
361 void eDVBSettings::saveServices()
363 FILE *f=fopen(CONFIGDIR "/enigma/services", "wt");
364 if (!f)
365 eFatal("couldn't open servicefile - create " CONFIGDIR "/enigma!");
366 fprintf(f, "eDVB services /2/\n");
368 getTransponders()->forEachTransponder(saveTransponder(f));
369 getTransponders()->forEachService(saveService(f));
370 getTransponders()->forEachSubService(saveSubService(f));
371 fprintf(f, "Have a lot of fun!\n");
372 fclose(f);
375 void eDVBSettings::loadServices()
377 FILE *f=fopen(CONFIGDIR "/enigma/services", "rt");
378 if (!f)
379 return;
380 char line[256];
381 if ((!fgets(line, 256, f)) || strncmp(line, "eDVB services", 13))
383 eDebug("not a servicefile");
384 return;
386 eDebug("reading services");
387 if ((!fgets(line, 256, f)) || strcmp(line, "transponders\n"))
389 eDebug("services invalid, no transponders");
390 return;
392 if (transponderlist)
393 transponderlist->clearAllTransponders();
395 while (!feof(f))
397 if (!fgets(line, 256, f))
398 break;
399 if (!strcmp(line, "end\n"))
400 break;
401 int dvb_namespace=-1, transport_stream_id=-1, original_network_id=-1;
402 sscanf(line, "%x:%x:%x", &dvb_namespace, &transport_stream_id, &original_network_id);
403 if (original_network_id == -1)
404 continue;
405 eTransponder &t=transponderlist->createTransponder(eDVBNamespace(dvb_namespace), eTransportStreamID(transport_stream_id), eOriginalNetworkID(original_network_id));
406 t.state=eTransponder::stateOK;
407 while (!feof(f))
409 fgets(line, 256, f);
410 if (!strcmp(line, "/\n"))
411 break;
412 int onlyFree=0;
413 if (line[1]=='s')
415 int frequency, symbol_rate, polarisation, fec, sat, inversion=INVERSION_OFF;
416 sscanf(line+2, "%d:%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &polarisation, &fec, &sat, &inversion, &onlyFree);
417 t.setSatellite(frequency, symbol_rate, polarisation, fec, sat, inversion);
419 if (line[1]=='c')
421 int frequency, symbol_rate, inversion=INVERSION_OFF, modulation=3, fec_inner=0;
422 int ret = sscanf(line+2, "%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &inversion, &modulation, &fec_inner, &onlyFree);
423 if ( ret < 6 )
425 onlyFree = fec_inner;
426 fec_inner=0;
428 t.setCable(frequency, symbol_rate, inversion, modulation, fec_inner);
430 if (line[1]=='t')
432 int centre_frequency, code_rate_hp, code_rate_lp, bandwidth, constellation, guard_interval, hierarchy_information, transmission_mode, inversion=INVERSION_OFF;
433 sscanf(line+2, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d", &centre_frequency, &code_rate_hp, &code_rate_lp, &bandwidth, &constellation, &guard_interval, &hierarchy_information, &transmission_mode, &inversion, &onlyFree );
434 t.setTerrestrial(centre_frequency, bandwidth, constellation, hierarchy_information, code_rate_hp, code_rate_lp, guard_interval, transmission_mode, inversion);
436 if ( onlyFree )
437 t.state |= eTransponder::stateOnlyFree;
441 if ((!fgets(line, 256, f)) || strcmp(line, "services\n"))
443 eDebug("services invalid, no services");
444 return;
447 if (transponderlist)
448 transponderlist->clearAllServices();
450 int count=0;
452 while (!feof(f))
454 if (!fgets(line, 256, f))
455 break;
456 if (!strcmp(line, "end\n"))
457 break;
459 int service_id=-1, dvb_namespace, transport_stream_id=-1, original_network_id=-1, service_type=-1, service_number=-1;
460 sscanf(line, "%x:%x:%x:%x:%d:%d", &service_id, &dvb_namespace, &transport_stream_id, &original_network_id, &service_type, &service_number);
461 if (service_number == -1)
462 continue;
463 eServiceDVB &s=transponderlist->createService(
464 eServiceReferenceDVB(
465 eDVBNamespace(dvb_namespace),
466 eTransportStreamID(transport_stream_id),
467 eOriginalNetworkID(original_network_id),
468 eServiceID(service_id),
469 service_type), service_number);
470 count++;
471 s.service_type=service_type;
472 fgets(line, 256, f);
473 if (strlen(line))
474 line[strlen(line)-1]=0;
475 s.service_name=line;
476 fgets(line, 256, f);
477 if (strlen(line))
478 line[strlen(line)-1]=0;
480 eString str=line;
482 if (str[1]!=':') // old ... (only service_provider)
484 s.service_provider=line;
485 } else
486 while ((!str.empty()) && str[1]==':') // new: p:, f:, c:%02d...
488 unsigned int c=str.find(',');
489 char p=str[0];
490 eString v;
491 if (c == eString::npos)
493 v=str.mid(2);
494 str="";
495 } else
497 v=str.mid(2, c-2);
498 str=str.mid(c+1);
500 // eDebug("%c ... %s", p, v.c_str());
501 if (p == 'p')
502 s.service_provider=v;
503 else if (p == 'f')
505 int dummyval= 0;
506 sscanf(v.c_str(), "%x", &dummyval);
507 s.dxflags = dummyval;
508 } else if (p == 'c')
510 int cid, val;
511 sscanf(v.c_str(), "%02d%04x", &cid, &val);
512 if (cid < eServiceDVB::cacheMax)
513 s.set((eServiceDVB::cacheID)cid,val);
518 eDebug("loaded %d services", count);
520 if ((!fgets(line, 256, f)) || strcmp(line, "subservices\n"))
522 eDebug("subservices invalid, no subservices");
523 return;
526 if (transponderlist)
527 transponderlist->clearAllSubServices();
529 count=0;
531 while (!feof(f))
533 if (!fgets(line, 256, f))
534 break;
535 if (!strcmp(line, "end\n"))
536 break;
538 int service_id=-1, dvb_namespace, transport_stream_id=-1, original_network_id=-1;
539 sscanf(line, "%x:%x:%x:%x", &service_id, &dvb_namespace, &transport_stream_id, &original_network_id);
540 eServiceDVB &s=transponderlist->createSubService(
541 eServiceReferenceDVB(
542 eDVBNamespace(dvb_namespace),
543 eTransportStreamID(transport_stream_id),
544 eOriginalNetworkID(original_network_id),
545 eServiceID(service_id),7
547 count++;
548 s.service_type=7;
549 fgets(line, 256, f);
550 if (strlen(line))
551 line[strlen(line)-1]=0;
552 s.service_name=line;
553 fgets(line, 256, f);
554 if (strlen(line))
555 line[strlen(line)-1]=0;
557 eString str=line;
559 if (str[1]!=':') // old ... (only service_provider)
561 s.service_provider=line;
562 } else
563 while ((!str.empty()) && str[1]==':') // new: p:, f:, c:%02d...
565 unsigned int c=str.find(',');
566 char p=str[0];
567 eString v;
568 if (c == eString::npos)
570 v=str.mid(2);
571 str="";
572 } else
574 v=str.mid(2, c-2);
575 str=str.mid(c+1);
577 // eDebug("%c ... %s", p, v.c_str());
578 if (p == 'p')
579 s.service_provider=v;
580 else if (p == 'f')
582 sscanf(v.c_str(), "%x", &s.dxflags);
583 } else if (p == 'c')
585 int cid, val;
586 sscanf(v.c_str(), "%02d%04x", &cid, &val);
587 if (cid < eServiceDVB::cacheMax)
588 s.set((eServiceDVB::cacheID)cid,val);
593 eDebug("loaded %d subservices", count);
595 fclose(f);
598 void eDVBSettings::saveBouquets()
600 if ( !bouquetsChanged )
601 return;
603 eDebug("saving bouquets...");
604 bouquetsChanged=0;
606 FILE *f=fopen(CONFIGDIR "/enigma/bouquets", "wt");
607 if (!f)
608 eFatal("couldn't open bouquetfile - create " CONFIGDIR "/enigma!");
609 fprintf(f, "eDVB bouquets /2/\n");
610 fprintf(f, "bouquets\n");
611 for (std::map<int,eBouquet*>::iterator i(bouquet_id_map.begin()); i != bouquet_id_map.end(); ++i)
613 eBouquet *b = i->second;
614 fprintf(f, "%0d\n", b->bouquet_id);
615 fprintf(f, "%s\n", b->bouquet_name.c_str());
616 for (ServiceReferenceDVBIterator s = b->list.begin(); s != b->list.end(); s++)
617 fprintf(f, "%04x:%08x:%04x:%04x:%d\n", s->getServiceID().get(), s->getDVBNamespace().get(), s->getTransportStreamID().get(), s->getOriginalNetworkID().get(), s->getServiceType());
618 fprintf(f, "/\n");
620 fprintf(f, "end\n");
621 fprintf(f, "Have a lot of fun!\n");
622 fclose(f);
623 eDebug("done");
626 void eDVBSettings::loadBouquets()
628 FILE *f=fopen(CONFIGDIR "/enigma/bouquets", "rt");
629 if (!f)
630 return;
631 bouquetsChanged=0;
632 char line[256];
633 if ((!fgets(line, 256, f)) || strncmp(line, "eDVB bouquets", 13))
635 eDebug("not a bouquetfile");
636 return;
638 eDebug("reading bouquets");
639 if ((!fgets(line, 256, f)) || strcmp(line, "bouquets\n"))
641 eDebug("settings invalid, no transponders");
642 return;
645 bouquet_id_map.clear();
646 for (std::map<eString, eBouquet*>::iterator it(bouquet_name_map.begin()); it != bouquet_name_map.end(); ++it)
647 delete it->second;
648 bouquet_name_map.clear();
650 while (!feof(f))
652 if (!fgets(line, 256, f))
653 break;
654 if (!strcmp(line, "end\n"))
655 break;
656 int bouquet_id=-1;
657 sscanf(line, "%d", &bouquet_id);
658 if (!fgets(line, 256, f))
659 break;
660 line[strlen(line)-1]=0;
661 eBouquet *bouquet=createBouquet(bouquet_id, line);
662 while (!feof(f))
664 fgets(line, 256, f);
665 if (!strcmp(line, "/\n"))
666 break;
667 int service_id=-1, dvb_namespace=-1, transport_stream_id=-1, original_network_id=-1, service_type=-1;
668 sscanf(line, "%x:%x:%x:%x:%d", &service_id, &dvb_namespace, &transport_stream_id, &original_network_id, &service_type);
669 if (service_type == -1)
670 continue;
671 bouquet->add(
672 eServiceReferenceDVB(
673 eDVBNamespace(dvb_namespace),
674 eTransportStreamID(transport_stream_id),
675 eOriginalNetworkID(original_network_id),
676 eServiceID(service_id),
677 service_type));
681 eDebug("loaded %d bouquets", getBouquets()->size());
683 fclose(f);
685 revalidateBouquets();
686 eDebug("ok");
689 void eDVBSettings::clearList()
691 if (transponderlist)
693 transponderlist->clearAllTransponders();
694 transponderlist->clearAllServices();
695 removeDVBBouquets(); // user Bouquets do not delete...
698 /*emit*/ dvb.bouquetListChanged();
701 void eDVBSettings::removeOrbitalPosition(int orbital_position)
703 if (transponderlist)
705 transponderlist->removeOrbitalPosition(orbital_position);
706 removeDVBBouquets();
707 sortInChannels();
710 /*emit*/ dvb.bouquetListChanged();
713 int eDVBSettings::importSatcoDX(eString line)
715 // hier versuchen wir das komische "SatcoDX"-format zu parsen, was wahrlich noch aus analog-tv zeiten stammt...
716 if (line.left(7) != "SATCODX")
718 eDebug("SatcoDX: header invalid.");
719 return -1;
721 // stammen MUSS.
722 if (line.mid(7, 1) != "1")
724 eDebug("SatcoDX: unsupported page.");
725 return -2;
727 if (line.mid(8, 2) != "03")
729 eDebug("SatcoDX: must be version 03");
730 return -3;
732 // denn damals kam man wohl mit 20 zeichen fuer den kanalnamen aus, und somit festen strukturen. dvb2k laesst gruessen.
733 if (line.size() != 128)
735 eDebug("SatcoDX: invalid line length.");
736 return -4;
738 // also definieren wir den satelliten-NAMEN. bloss nicht zu kompliziert. darf natuerlich nur begrenzt lang sein, klar.
739 eString satname=line.mid(10, 18);
740 // und den TYP. Ah! Doch etsi? service_type? nee quatsch. T fuer TV, R fuer Radio, D fuer Data (ist mpeg nicht auch data? *wunder*) und _ fuer "package transponder". HAE? naja gut.
741 eString type=line.mid(28, 1);
742 // oh und das broadcasting system. so wie im etsi? klar. TRAEUM WEITER. hier gibts es:
743 // (langweilig) 422_, ADR_, BMAC_, D2MAC (wie das in 4 zeichen passt ist mir WIRKLICH unklar.), DIC1, DIC2, ISDB, und jetzt kommts:
744 // MPG1 ... ok, MPEG-1 halt.
745 // MP15 MPEG-1.5 (HAEEE???? was issen das? mpeg 2.5 mag es ja noch geben (wer auch immer SOLCHE low bitrate services ueber dvb macht.. pah)
746 // MPG2 MPEG-2
747 // MPG4 MPEG-4
748 // MUSE, NTSC, PAL_, SECM (ich sag ja, analog.)
749 eString system=line.mid(29, 4);
750 // oh die frequenz. in ascii.
751 eString frequency=line.mid(33, 9);
752 // ooh! laut DVB? ne quatsch, man brauch mal wieder ne lookup table. 0 ist vertikal, 1 horiz, 2 ist linksdrehend und 3 ist im joghurt. (oder so)
753 eString polarization=line.mid(42, 1);
754 // der anfang vom ende. der kanalname. WELCH EIN WUNDER dass hier nicht noch die kanalNUMMER steht.
755 eString channelname=line.mid(43, 8);
756 // orbital position. JUHUU. endlich mal was brauchbares.
757 eString orbital_position=line.mid(51, 4);
758 // coverage mit dem man nix anfangen kann.
759 eString coverage=line.mid(55, 8);
760 // audio frequency ;))
761 eString audio_freq=line.mid(63, 6);
762 // die symbolrate.
763 eString symbolrate=line.mid(69, 5);
764 // FEC, gaenzlich unkonform aber naja. 0 fuer KEINE FEC .. (??), 1, 2, 3, 5, 7 fuer 1/2, 2/3, 3/4, 5/6, 7/8)
765 eString fec=line.mid(74, 1);
766 // die pids. in hex. .... .... Satcodx? nein, natuerlich IN ASCII.
767 eString vpid=line.mid(75, 4);
768 eString apid=line.mid(79, 4);
769 eString pcrpid=line.mid(83, 4);
770 // die sid
771 eString sid=line.mid(87, 5);
772 // die nid. (JA, die jungs kennen sich aus.)
773 eString onid=line.mid(92, 5);
774 // die tsid (JA, die jungs kennen sich WIRKLICH aus.)
775 eString tsid=line.mid(97, 5);
776 // die primary language. ok, wenn die danach filtern wollen, sollen sie es tun. meinetwegen.
777 eString lang=line.mid(102, 3);
778 // der mighty underscore
779 if (line[105] != '_')
781 eDebug("SatcoDX: underscore missing.");
782 return -5;
784 // blakram
785 eString cc=line.mid(106, 2);
786 eString lang2=line.mid(108, 2);
787 eString crypt=line.mid(111, 4);
788 // und der rest vom ende.
789 channelname+=line.mid(115, 12);
790 if (line[127] != '\r')
792 eDebug("SatcoDX: missing CR.");
793 return -6;
796 if (type[0] == '_')
797 return 0;
798 if (system.left(3) != "MPG")
799 return 0;
801 int service_type=3;
802 if (type == "T")
803 service_type=1;
804 else if (type == "R")
805 service_type=2;
807 eDVBNamespace dvb_namespace;
809 // create transponder.
811 int my_orbital_position=atoi(orbital_position.c_str());
812 if (my_orbital_position >= 1800) // convert 0..3599 to -1800..1799
813 my_orbital_position-=3600;
815 dvb_namespace=eDVBNamespace(orbital_position << 16);
817 eServiceDVB &dvbservice=transponderlist->createService(
818 eServiceReferenceDVB(
819 dvb_namespace,
820 eTransportStreamID(atoi(tsid.c_str())), eOriginalNetworkID(atoi(onid.c_str())), eServiceID(atoi(sid.c_str())),
821 service_type)
823 dvbservice.service_type=service_type;
824 dvbservice.service_name=channelname;
825 dvbservice.service_provider=satname; // HA! jetzt hab ich's den lamern aber gegeben!
826 dvbservice.dxflags=eServiceDVB::dxNoDVB; // ists ja auch nicht.
827 if (vpid[0] != '_')
828 dvbservice.set(eServiceDVB::cVPID, atoi(vpid.c_str()));
829 if (apid[0] != '_')
830 dvbservice.set(eServiceDVB::cAPID, atoi(apid.c_str()));
831 if (pcrpid[0] != '_')
832 dvbservice.set(eServiceDVB::cPCRPID, atoi(pcrpid.c_str()));
834 eTransponder &t=transponderlist->createTransponder(dvb_namespace, eTransportStreamID(atoi(tsid.c_str())), eOriginalNetworkID(atoi(onid.c_str())));
835 t.state=eTransponder::stateOK;
837 int myfec;
838 switch (atoi(fec.c_str()))
840 case 0:
841 myfec=FEC_AUTO;
842 break;
843 case 1:
844 myfec=FEC_1_2;
845 break;
846 case 2:
847 myfec=FEC_2_3;
848 break;
849 case 3:
850 myfec=FEC_3_4;
851 break;
852 case 5:
853 myfec=FEC_5_6;
854 break;
855 case 7:
856 myfec=FEC_7_8;
857 break;
858 default:
859 myfec=FEC_AUTO;
860 break;
863 t.setSatellite(atoi(frequency.c_str()), atoi(symbolrate.c_str())*1000, atoi(polarization.c_str())^1, myfec, my_orbital_position, 0);
865 return 0;
868 eDVBSettings::~eDVBSettings()
870 saveServices();
871 saveBouquets();
872 for (std::map<int, eBouquet*>::iterator it(bouquet_id_map.begin()); it != bouquet_id_map.end(); ++it )
873 delete it->second;
874 if (transponderlist)
875 delete transponderlist;