1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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;
}
}
}
|