diff options
Diffstat (limited to 'eit2.c')
-rw-r--r-- | eit2.c | 76 |
1 files changed, 57 insertions, 19 deletions
@@ -90,18 +90,17 @@ cEvent* cEIT2::ProcessEitEvent(cSchedule* pSchedule,const SI::EIT::Event* EitEve pEvent->SetVersion (versionNumber); ProcessEventDescriptors(ExternalData, channel->Source(), Tid, EitEvent, - pEvent, Schedules, channel->GetChannelID()); + pEvent, channel->GetChannelID()); Modified = true; return pEvent; } -void cEIT2::ProcessEventDescriptors(bool ExternalData, int Source, - u_char Tid, const SI::EIT::Event* SiEitEvent, cEvent* pEvent, - cSchedules* Schedules, const tChannelID& channelId) +void cEIT2::ProcessEventDescriptors(bool ExternalData, int Source, u_char Tid, + const SI::EIT::Event* SiEitEvent, cEvent* pEvent, const tChannelID& channelId) { - cEvent *rEvent = NULL; + const cEvent *rEvent = NULL; int LanguagePreferenceShort = -1; int LanguagePreferenceExt = -1; unsigned char nDescriptorTag; @@ -114,14 +113,14 @@ void cEIT2::ProcessEventDescriptors(bool ExternalData, int Source, //uchar DishTheme = 0, DishCategory = 0; - cLinkChannels *LinkChannels = NULL; + //cLinkChannels *LinkChannels = NULL; cComponents *Components = NULL; -#if APIVERSNUM >= 20300 +/*#if APIVERSNUM >= 20300 cChannel *channel = Channels->GetByChannelID(channelId); #else cChannel *channel = Channels.GetByChannelID(channelId); -#endif +#endif*/ DescriptorLoop dl = SiEitEvent->eventDescriptors; for (SI::Loop::Iterator it2; (d = dl.getNext(it2)); ) @@ -232,13 +231,19 @@ void cEIT2::ProcessEventDescriptors(bool ExternalData, int Source, } break; case SI::TimeShiftedEventDescriptorTag: { +#if APIVERSNUM >= 20300 + LOCK_SCHEDULES_READ; +#else + cSchedulesLock SchedulesLock; + cSchedules *Schedules = (cSchedules*)(cSchedules::Schedules(SchedulesLock)); +#endif if (Schedules) { SI::TimeShiftedEventDescriptor * tsed = (SI::TimeShiftedEventDescriptor *) d; - cSchedule *rSchedule = (cSchedule *) Schedules->GetSchedule( + const cSchedule *rSchedule = Schedules->GetSchedule( tChannelID(Source, channel->Nid(), channel->Tid(), tsed->getReferenceServiceId())); if (!rSchedule) break; - rEvent = (cEvent *) rSchedule->GetEvent(tsed->getReferenceEventId()); + rEvent = rSchedule->GetEvent(tsed->getReferenceEventId()); if (!rEvent) break; pEvent->SetTitle(rEvent->Title()); @@ -248,7 +253,8 @@ void cEIT2::ProcessEventDescriptors(bool ExternalData, int Source, } break; case SI::LinkageDescriptorTag: { - SI::LinkageDescriptor * ld = (SI::LinkageDescriptor *) d; + //Leave channel linking to VDR +/* SI::LinkageDescriptor * ld = (SI::LinkageDescriptor *) d; tChannelID linkID(Source, ld->getOriginalNetworkId(), ld->getTransportStreamId(), ld->getServiceId()); if (ld->getLinkageType() == 0xB0) { // Premiere World @@ -290,7 +296,7 @@ void cEIT2::ProcessEventDescriptors(bool ExternalData, int Source, else channel->SetPortalName(linkName); } - } + }*/ } break; case SI::ComponentDescriptorTag: { @@ -455,15 +461,13 @@ void cEIT2::ProcessEventDescriptors(bool ExternalData, int Source, if (Format != DISH_BEV) pEvent->FixEpgBugs(); - if (LinkChannels) - channel->SetLinkChannels (LinkChannels); + //if (LinkChannels) + //channel->SetLinkChannels (LinkChannels); } -cEIT2::cEIT2 (cChannels* Channels, cSchedules * Schedules, int Source, u_char Tid, const u_char * Data, EFormat format, bool isEITPid, bool OnlyRunningStatus) +cEIT2::cEIT2 (int Source, u_char Tid, const u_char * Data, EFormat format, bool isEITPid) : SI::EIT (Data, false) -, OnlyRunningStatus(OnlyRunningStatus) -, Channels(Channels) -, Schedules(Schedules) +, OnlyRunningStatus(false) , Format(format) { @@ -486,6 +490,41 @@ cEIT2::cEIT2 (cChannels* Channels, cSchedules * Schedules, int Source, u_char Ti //LogD(5, prep("channelID: %s format:%d"), *channel->GetChannelID().ToString(), Format); +#if APIVERSNUM >= 20300 + LOCK_CHANNELS_WRITE; + if (!Channels) { + LogD(3, prep("Error obtaining channels lock")); + return; + } + LOCK_SCHEDULES_WRITE; + if (!Schedules) { + LogD(3, prep("Error obtaining schedules lock")); + return; + } +#else + cChannelsLock ChannelsLock(true, 10), ChannelsLockR; + cChannels *Channels = (cChannels*)(cChannels::Channels(ChannelsLock)); + cSchedulesLock SchedulesLock(true, 10), SchedulesLockR; + cSchedules *Schedules = (cSchedules*)(cSchedules::Schedules(SchedulesLock)); + if (!Channels) { + LogD(3, prep("Error obtaining channels lock")); + OnlyRunningStatus = true; + cChannels *Channels = (cChannels*)(cChannels::Channels(ChannelsLockR)); + } + if (!Schedules) { + // If we don't get a write lock, let's at least get a read lock, so + // that we can set the running status and 'seen' timestamp (well, actually + // with a read lock we shouldn't be doing that, but it's only integers that + // get changed, so it should be ok) + LogD(3, prep("Error obtaining schedules lock")); + OnlyRunningStatus = true; + cSchedules *Schedules = (cSchedules*)(cSchedules::Schedules(SchedulesLockR)); + } + if (!Schedules || !Channels) { + LogD(3, prep("Error obtaining read lock")); + return; + } +#endif cSchedule *pSchedule = (cSchedule *) Schedules->GetSchedule (channel, true); Empty = true; @@ -602,7 +641,6 @@ cEIT2::cEIT2 (cSchedule * Schedule, EFormat format) , OnlyRunningStatus(false) , SegmentStart(0) , SegmentEnd(0) -, Schedules(NULL) , Format(format) { //LogD(2, prep("cEIT2::cEIT2")); |