summaryrefslogtreecommitdiff
path: root/eit2.c
diff options
context:
space:
mode:
Diffstat (limited to 'eit2.c')
-rw-r--r--eit2.c76
1 files changed, 57 insertions, 19 deletions
diff --git a/eit2.c b/eit2.c
index a8b0561..5aeb60d 100644
--- a/eit2.c
+++ b/eit2.c
@@ -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"));