// Entfernt anhand der Services alle time shifted events (ohne Text, // mit service-id welcher im nvod steht) // und sortiert deren Zeiten in die Events mit dem Text ein. void SIevents::mergeAndRemoveTimeShiftedEvents(const SIservices &services) { // Wir gehen alle services durch, suchen uns die services mit nvods raus // und fuegen dann die Zeiten der Events mit der service-id eines nvods // in das entsprechende Event mit der service-id das die nvods hat ein. // die 'nvod-events' werden auch geloescht // SIevents eventsToDelete; // Hier rein kommen Events die geloescht werden sollen for(SIservices::iterator k=services.begin(); k!=services.end(); k++) if(k->nvods.size()) { // NVOD-Referenzen gefunden // Zuerst mal das Event mit dem Text holen // iterator e; iterator e; for(e=begin(); e!=end(); e++) if(e->serviceID==k->serviceID) break; if(e!=end()) { // *e == event mit dem Text SIevent newEvent(*e); // Kopie des Events // Jetzt die nvods druchgehen und deren Uhrzeiten in obiges Event einfuegen for(SInvodReferences::iterator n=k->nvods.begin(); n!=k->nvods.end(); n++) { // Alle druchgehen und deren Events suchen for(iterator en=begin(); en!=end(); en++) { if(en->serviceID==n->getServiceID()) { newEvent.times.insert(en->times.begin(), en->times.end()); // newEvent.times.insert(SItime(en->startzeit, en->dauer)); // eventsToDelete.insert(SIevent(*en)); } } } erase(e); // Altes Event loeschen -> iterator (e) ungültig insert(newEvent); // und das erweiterte Event wieder einfuegen } } // // delete all events with serviceID that have a service type 0 // for (iterator it = begin(); it != end(); ) { SIservices::iterator s = services.find(SIservice(it->serviceID, it->originalNetworkID)); if ((s != services.end()) && (s->serviceTyp == 0)) { // Set is a Sorted Associative Container // Erasing an element from a set also does not invalidate any iterators, // except, of course, for iterators that actually point to the element // that is being erased. iterator jt = it; it++; // the iterator it points to the next element erase(jt); // hence it is not invalidated } else it++; } }
void operator() (const SIevent &e) { SIservices::iterator k=s->find(SIservice(e.service_id, e.original_network_id, e.transport_stream_id)); if(k!=s->end()) { if(k->serviceName.length()) e.saveXML(f, k->serviceName.c_str()); } else e.saveXML(f); }