eitd: move epg filters to xmlutil.cpp

This commit is contained in:
[CST] Focus
2012-02-14 13:25:27 +04:00
parent 266349e36e
commit cc36b982d9
3 changed files with 241 additions and 145 deletions

View File

@@ -1,5 +1,4 @@
//
// sectionsd.cpp (network daemon for SI-sections)
// (dbox-II-project)
//
// Copyright (C) 2001 by fnbrd
@@ -24,48 +23,34 @@
//
#include <config.h>
#include <malloc.h>
#include <dmxapi.h>
#include <dmx.h>
#include <debug.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <signal.h>
#include <set>
#include <map>
#include <algorithm>
#include <string>
#include <limits>
#include <sys/wait.h>
#include <sys/time.h>
#include <connection/basicsocket.h>
#include <connection/basicserver.h>
#include <xmltree/xmlinterface.h>
#include <zapit/client/zapittools.h>
// Daher nehmen wir SmartPointers aus der Boost-Lib (www.boost.org)
#include <boost/shared_ptr.hpp>
#include <sectionsdclient/sectionsdMsg.h>
#include <sectionsdclient/sectionsdclient.h>
#include <eventserver.h>
#include <driver/abstime.h>
#include "xmlutil.h"
#include "eitd.h"
void addEvent(const SIevent &evt, const time_t zeit, bool cn = false);
extern MySIeventsOrderServiceUniqueKeyFirstStartTimeEventUniqueKey mySIeventsOrderServiceUniqueKeyFirstStartTimeEventUniqueKey;
extern bool reader_ready;
extern pthread_rwlock_t eventsLock;
extern bool dvb_time_update;
std::string epg_filter_dir = "/var/tuxbox/config/zapit/epgfilter.xml";
std::string dvbtime_filter_dir = "/var/tuxbox/config/zapit/dvbtimefilter.xml";
bool epg_filter_is_whitelist = false;
bool epg_filter_except_current_next = false;
inline void readLockEvents(void)
{
@@ -76,6 +61,189 @@ inline void unlockEvents(void)
pthread_rwlock_unlock(&eventsLock);
}
struct EPGFilter
{
t_original_network_id onid;
t_transport_stream_id tsid;
t_service_id sid;
EPGFilter *next;
};
struct ChannelBlacklist
{
t_channel_id chan;
t_channel_id mask;
ChannelBlacklist *next;
};
struct ChannelNoDVBTimelist
{
t_channel_id chan;
t_channel_id mask;
ChannelNoDVBTimelist *next;
};
static EPGFilter *CurrentEPGFilter = NULL;
static ChannelBlacklist *CurrentBlacklist = NULL;
static ChannelNoDVBTimelist *CurrentNoDVBTime = NULL;
bool checkEPGFilter(t_original_network_id onid, t_transport_stream_id tsid, t_service_id sid)
{
EPGFilter *filterptr = CurrentEPGFilter;
while (filterptr)
{
if (((filterptr->onid == onid) || (filterptr->onid == 0)) &&
((filterptr->tsid == tsid) || (filterptr->tsid == 0)) &&
((filterptr->sid == sid) || (filterptr->sid == 0)))
return true;
filterptr = filterptr->next;
}
return false;
}
bool checkBlacklist(t_channel_id channel_id)
{
ChannelBlacklist *blptr = CurrentBlacklist;
while (blptr)
{
if (blptr->chan == (channel_id & blptr->mask))
return true;
blptr = blptr->next;
}
return false;
}
bool checkNoDVBTimelist(t_channel_id channel_id)
{
ChannelNoDVBTimelist *blptr = CurrentNoDVBTime;
while (blptr)
{
if (blptr->chan == (channel_id & blptr->mask))
return true;
blptr = blptr->next;
}
return false;
}
static void addEPGFilter(t_original_network_id onid, t_transport_stream_id tsid, t_service_id sid)
{
if (!checkEPGFilter(onid, tsid, sid))
{
dprintf("Add EPGFilter for onid=\"%04x\" tsid=\"%04x\" service_id=\"%04x\"\n", onid, tsid, sid);
EPGFilter *node = new EPGFilter;
node->onid = onid;
node->tsid = tsid;
node->sid = sid;
node->next = CurrentEPGFilter;
CurrentEPGFilter = node;
}
}
static void addBlacklist(t_original_network_id onid, t_transport_stream_id tsid, t_service_id sid)
{
t_channel_id channel_id =
CREATE_CHANNEL_ID_FROM_SERVICE_ORIGINALNETWORK_TRANSPORTSTREAM_ID(sid, onid, tsid);
t_channel_id mask =
CREATE_CHANNEL_ID_FROM_SERVICE_ORIGINALNETWORK_TRANSPORTSTREAM_ID(
(sid ? 0xFFFF : 0), (onid ? 0xFFFF : 0), (tsid ? 0xFFFF : 0)
);
if (!checkBlacklist(channel_id))
{
xprintf("Add Channel Blacklist for channel 0x%012llx, mask 0x%012llx\n", channel_id, mask);
ChannelBlacklist *node = new ChannelBlacklist;
node->chan = channel_id;
node->mask = mask;
node->next = CurrentBlacklist;
CurrentBlacklist = node;
}
}
static void addNoDVBTimelist(t_original_network_id onid, t_transport_stream_id tsid, t_service_id sid)
{
t_channel_id channel_id =
CREATE_CHANNEL_ID_FROM_SERVICE_ORIGINALNETWORK_TRANSPORTSTREAM_ID(sid, onid, tsid);
t_channel_id mask =
CREATE_CHANNEL_ID_FROM_SERVICE_ORIGINALNETWORK_TRANSPORTSTREAM_ID(
(sid ? 0xFFFF : 0), (onid ? 0xFFFF : 0), (tsid ? 0xFFFF : 0)
);
if (!checkNoDVBTimelist(channel_id))
{
xprintf("Add channel 0x%012llx, mask 0x%012llx to NoDVBTimelist\n", channel_id, mask);
ChannelNoDVBTimelist *node = new ChannelNoDVBTimelist;
node->chan = channel_id;
node->mask = mask;
node->next = CurrentNoDVBTime;
CurrentNoDVBTime = node;
}
}
void readEPGFilter(void)
{
xmlDocPtr filter_parser = parseXmlFile(epg_filter_dir.c_str());
t_original_network_id onid = 0;
t_transport_stream_id tsid = 0;
t_service_id sid = 0;
if (filter_parser != NULL)
{
dprintf("Reading EPGFilters\n");
xmlNodePtr filter = xmlDocGetRootElement(filter_parser);
if (xmlGetNumericAttribute(filter, "is_whitelist", 10) == 1)
epg_filter_is_whitelist = true;
if (xmlGetNumericAttribute(filter, "except_current_next", 10) == 1)
epg_filter_except_current_next = true;
filter = filter->xmlChildrenNode;
while (filter) {
onid = xmlGetNumericAttribute(filter, "onid", 16);
tsid = xmlGetNumericAttribute(filter, "tsid", 16);
sid = xmlGetNumericAttribute(filter, "serviceID", 16);
if (xmlGetNumericAttribute(filter, "blacklist", 10) == 1)
addBlacklist(onid, tsid, sid);
else
addEPGFilter(onid, tsid, sid);
filter = filter->xmlNextNode;
}
}
xmlFreeDoc(filter_parser);
}
void readDVBTimeFilter(void)
{
xmlDocPtr filter_parser = parseXmlFile(dvbtime_filter_dir.c_str());
t_original_network_id onid = 0;
t_transport_stream_id tsid = 0;
t_service_id sid = 0;
if (filter_parser != NULL)
{
dprintf("Reading DVBTimeFilters\n");
xmlNodePtr filter = xmlDocGetRootElement(filter_parser);
filter = filter->xmlChildrenNode;
while (filter) {
onid = xmlGetNumericAttribute(filter, "onid", 16);
tsid = xmlGetNumericAttribute(filter, "tsid", 16);
sid = xmlGetNumericAttribute(filter, "serviceID", 16);
addNoDVBTimelist(onid, tsid, sid);
filter = filter->xmlNextNode;
}
xmlFreeDoc(filter_parser);
}
else
{
dvb_time_update = true;
}
}
void *insertEventsfromFile(void * data)
{
xmlDocPtr event_parser = NULL;