filter.h 3.64 KB
Newer Older
Klaus Schmidinger's avatar
Klaus Schmidinger committed
1 2 3 4 5 6
/*
 * filter.h: Section filter
 *
 * See the main source file 'vdr.c' for copyright information and
 * how to reach the author.
 *
7
 * $Id: filter.h 4.3 2017/05/07 15:18:48 kls Exp $
Klaus Schmidinger's avatar
Klaus Schmidinger committed
8 9 10 11 12 13 14 15
 */

#ifndef __FILTER_H
#define __FILTER_H

#include <sys/types.h>
#include "tools.h"

Klaus Schmidinger's avatar
Klaus Schmidinger committed
16 17
class cSectionSyncer {
private:
18 19
  int currentVersion;
  int currentSection;
Klaus Schmidinger's avatar
Klaus Schmidinger committed
20
  bool synced;
21 22 23 24
  bool complete;
  uchar sections[32]; // holds 32 * 8 = 256 bits, as flags for the sections
  void SetSectionFlag(uchar Section, bool On) { if (On) sections[Section / 8] |= (1 << (Section % 8)); else sections[Section / 8] &= ~(1 << (Section % 8)); }
  bool GetSectionFlag(uchar Section) { return sections[Section / 8] & (1 << (Section % 8)); }
Klaus Schmidinger's avatar
Klaus Schmidinger committed
25 26 27
public:
  cSectionSyncer(void);
  void Reset(void);
28 29
  void Repeat(void);
  bool Complete(void) { return complete; }
Klaus Schmidinger's avatar
Klaus Schmidinger committed
30 31 32
  bool Sync(uchar Version, int Number, int LastNumber);
  };

Klaus Schmidinger's avatar
Klaus Schmidinger committed
33 34 35 36 37 38 39 40
class cFilterData : public cListObject {
public:
  u_short pid;
  u_char tid;
  u_char mask;
  bool sticky;
  cFilterData(void);
  cFilterData(u_short Pid, u_char Tid, u_char Mask, bool Sticky);
41
  cFilterData& operator= (const cFilterData &FilterData);
Klaus Schmidinger's avatar
Klaus Schmidinger committed
42 43 44 45
  bool Is(u_short Pid, u_char Tid, u_char Mask);
  bool Matches(u_short Pid, u_char Tid);
  };

Klaus Schmidinger's avatar
Klaus Schmidinger committed
46
class cChannel;
Klaus Schmidinger's avatar
Klaus Schmidinger committed
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
class cSectionHandler;

class cFilter : public cListObject {
  friend class cSectionHandler;
private:
  cSectionHandler *sectionHandler;
  cList<cFilterData> data;
  bool on;
protected:
  cFilter(void);
  cFilter(u_short Pid, u_char Tid, u_char Mask = 0xFF);
  virtual ~cFilter();
  virtual void SetStatus(bool On);
       ///< Turns this filter on or off, depending on the value of On.
       ///< If the filter is turned off, any filter data that has been
       ///< added without the Sticky parameter set to 'true' will be
       ///< automatically deleted. Those parameters that have been added
       ///< with Sticky set to 'true' will be automatically reused when
       ///< SetStatus(true) is called.
  virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length) = 0;
       ///< Processes the data delivered to this filter.
       ///< Pid and Tid is one of the combinations added to this filter by
       ///< a previous call to Add(), Data is a pointer to Length bytes of
       ///< data. This function will be called from the section handler's
       ///< thread, so it has to use proper locking mechanisms in case it
       ///< accesses any global data. It is guaranteed that if several cFilters
       ///< are attached to the same cSectionHandler, only _one_ of them has
       ///< its Process() function called at any given time. It is allowed
       ///< that more than one cFilter are set up to receive the same Pid/Tid.
       ///< The Process() function must return as soon as possible.
  int Source(void);
       ///< Returns the source of the data delivered to this filter.
  int Transponder(void);
       ///< Returns the transponder of the data delivered to this filter.
Klaus Schmidinger's avatar
Klaus Schmidinger committed
81 82
  const cChannel *Channel(void);
       ///< Returns the channel of the data delivered to this filter.
Klaus Schmidinger's avatar
Klaus Schmidinger committed
83 84 85 86 87 88 89 90 91 92 93 94 95
  bool Matches(u_short Pid, u_char Tid);
       ///< Indicates whether this filter wants to receive data from the given Pid/Tid.
  void Set(u_short Pid, u_char Tid, u_char Mask = 0xFF);
       ///< Sets the given filter data by calling Add() with Sticky = true.
  void Add(u_short Pid, u_char Tid, u_char Mask = 0xFF, bool Sticky = false);
       ///< Adds the given filter data to this filter.
       ///< If Sticky is true, this will survive a status change, otherwise
       ///< it will be automatically deleted.
  void Del(u_short Pid, u_char Tid, u_char Mask = 0xFF);
       ///< Deletes the given filter data from this filter.
  };

#endif //__FILTER_H