diff options
Diffstat (limited to 'filter.c')
-rw-r--r-- | filter.c | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/filter.c b/filter.c new file mode 100644 index 0000000..668b7d3 --- /dev/null +++ b/filter.c @@ -0,0 +1,126 @@ +/* + * filter.c: Section filter + * + * See the main source file 'vdr.c' for copyright information and + * how to reach the author. + * + * $Id: filter.c 1.1 2003/12/21 15:26:16 kls Exp $ + */ + +#include "filter.h" +#include "sections.h" + +// --- cFilterData ----------------------------------------------------------- + +cFilterData::cFilterData(void) +{ + pid = 0; + tid = 0; + mask = 0; + sticky = false; +} + +cFilterData::cFilterData(u_short Pid, u_char Tid, u_char Mask, bool Sticky) +{ + pid = Pid; + tid = Tid; + mask = Mask; + sticky = Sticky; +} + +bool cFilterData::Is(u_short Pid, u_char Tid, u_char Mask) +{ + return pid == Pid && tid == Tid && mask == Mask; +} + +bool cFilterData::Matches(u_short Pid, u_char Tid) +{ + return pid == Pid && tid == (Tid & mask); +} + +// --- cFilter --------------------------------------------------------------- + +cFilter::cFilter(void) +{ + sectionHandler = NULL; + on = false; +} + +cFilter::cFilter(u_short Pid, u_char Tid, u_char Mask) +{ + sectionHandler = NULL; + on = false; + Set(Pid, Tid, Mask); +} + +cFilter::~cFilter() +{ + if (sectionHandler) + sectionHandler->Detach(this); +} + +int cFilter::Source(void) +{ + return sectionHandler ? sectionHandler->Source() : 0; +} + +int cFilter::Transponder(void) +{ + return sectionHandler ? sectionHandler->Transponder() : 0; +} + +void cFilter::SetStatus(bool On) +{ + if (sectionHandler && on != On) { + cFilterData *fd = data.First(); + while (fd) { + if (On) + sectionHandler->Add(fd); + else { + sectionHandler->Del(fd); + if (!fd->sticky) { + cFilterData *next = data.Next(fd); + data.Del(fd); + fd = next; + continue; + } + } + fd = data.Next(fd); + } + on = On; + } +} + +bool cFilter::Matches(u_short Pid, u_char Tid) +{ + for (cFilterData *fd = data.First(); fd; fd = data.Next(fd)) { + if (fd->Matches(Pid, Tid)) + return true; + } + return false; +} + +void cFilter::Set(u_short Pid, u_char Tid, u_char Mask) +{ + Add(Pid, Tid, Mask, true); +} + +void cFilter::Add(u_short Pid, u_char Tid, u_char Mask, bool Sticky) +{ + cFilterData *fd = new cFilterData(Pid, Tid, Mask, Sticky); + data.Add(fd); + if (sectionHandler && on) + sectionHandler->Add(fd); +} + +void cFilter::Del(u_short Pid, u_char Tid, u_char Mask) +{ + for (cFilterData *fd = data.First(); fd; fd = data.Next(fd)) { + if (fd->Is(Pid, Tid, Mask)) { + if (sectionHandler && on) + sectionHandler->Del(fd); + data.Del(fd); + return; + } + } +} |