From 69cd319cd47047d7a3e4e1205a218ed66fd8f353 Mon Sep 17 00:00:00 2001
From: leslie <unknown>
Date: Mon, 11 Jan 2010 18:46:37 +0100
Subject: [PATCH] generic filter handle open

---
 cam.c    | 29 +++++++++++++++++++++++++++++
 cam.h    |  5 +++++
 filter.c |  3 ++-
 misc.c   | 14 --------------
 misc.h   |  7 -------
 sc.c     |  6 ++++++
 sc.h     |  1 +
 7 files changed, 43 insertions(+), 22 deletions(-)

diff --git a/cam.c b/cam.c
index 0ad88e0..570529b 100644
--- a/cam.c
+++ b/cam.c
@@ -2996,6 +2996,10 @@ uchar *cDeCsaTSBuffer::Get(void)
 
 // --- cScDvbDeviceProbe -------------------------------------------------------
 
+#define DEV_DVB_DVR      "dvr"
+#define DEV_DVB_DEMUX    "demux"
+#define DEV_DVB_CA       "ca"
+
 #if APIVERSNUM >= 10711
 static cScDvbDeviceProbe *scProbe=0;
 
@@ -3195,6 +3199,31 @@ bool cScDvbDevice::Initialize(void)
 #endif
 }
 
+int cScDvbDevice::FilterHandle(void)
+{
+#if APIVERSNUM >= 10711
+  return DvbOpen(DEV_DVB_DEMUX,adapter,frontend,O_RDWR|O_NONBLOCK);
+#else
+  return DvbOpen(DEV_DVB_DEMUX,CardIndex(),O_RDWR|O_NONBLOCK);
+#endif
+}
+
+#if APIVERSNUM < 10711
+void cScDvbDevice::DvbName(const char *Name, int n, char *buffer, int len)
+{
+  snprintf(buffer,len,"/dev/dvb/adapter%d/%s%d",n,Name,0);
+}
+
+int cScDvbDevice::DvbOpen(const char *Name, int n, int Mode, bool ReportError)
+{
+  char FileName[128];
+  DvbName(Name,n,FileName,sizeof(FileName));
+  int fd=open(FileName,Mode);
+  if(fd<0 && ReportError) LOG_ERROR_STR(FileName);
+  return fd;
+}
+#endif
+
 #if APIVERSNUM >= 10501
 bool cScDvbDevice::HasCi(void)
 {
diff --git a/cam.h b/cam.h
index 519d49b..67e03c8 100644
--- a/cam.h
+++ b/cam.h
@@ -225,6 +225,10 @@ protected:
   virtual bool OpenDvr(void);
   virtual void CloseDvr(void);
   virtual bool GetTSPacket(uchar *&Data);
+#if APIVERSNUM < 10711
+  static void DvbName(const char *Name, int n, char *buffer, int len);
+  static int DvbOpen(const char *Name, int n, int Mode, bool ReportError=false);
+#endif
 #endif //SASC
 public:
 #if APIVERSNUM >= 10711
@@ -249,6 +253,7 @@ public:
   static bool ForceBudget(int n);
   virtual bool SetCaDescr(ca_descr_t *ca_descr, bool initial);
   virtual bool SetCaPid(ca_pid_t *ca_pid);
+  int FilterHandle(void);
   void DumpAV7110(void);
   cCam *Cam(void) { return cam; }
   bool SoftCSA(bool live);
diff --git a/filter.c b/filter.c
index 36eae04..fd69536 100644
--- a/filter.c
+++ b/filter.c
@@ -30,6 +30,7 @@
 #include <vdr/tools.h>
 
 #include "filter.h"
+#include "sc.h"
 #include "misc.h"
 #include "log-core.h"
 
@@ -59,7 +60,7 @@ bool cPidFilter::Open(void)
 {
   cMutexLock lock(this);
   if(fd<0) {
-    fd=DvbOpen(DEV_DVB_DEMUX,dvbNum,O_RDWR|O_NONBLOCK);
+    fd=cSoftCAM::FilterHandle(dvbNum);
     if(fd>=0) return true;
     }
   return false;
diff --git a/misc.c b/misc.c
index 04939db..eb41c6b 100644
--- a/misc.c
+++ b/misc.c
@@ -29,20 +29,6 @@
 
 // -----------------------------------------------------------------------------
 
-void DvbName(const char *Name, int n, char *buffer, int len)
-{
-  snprintf(buffer,len,"/dev/dvb/adapter%d/%s%d",n,Name,0);
-}
-
-int DvbOpen(const char *Name, int n, int Mode, bool ReportError)
-{
-  char FileName[128];
-  DvbName(Name,n,FileName,sizeof(FileName));
-  int fd=open(FileName,Mode);
-  if(fd<0 && ReportError) LOG_ERROR_STR(FileName);
-  return fd;
-}
-
 const char *HexStr(char *str, const unsigned char *mem, int len)
 {
   for(int i=0 ; i<len ; i++) sprintf(&str[i*2],"%02X",mem[i]);
diff --git a/misc.h b/misc.h
index 3207e9c..11e5551 100644
--- a/misc.h
+++ b/misc.h
@@ -40,13 +40,6 @@
 
 // ----------------------------------------------------------------
 
-#define DEV_DVB_FRONTEND "frontend"
-#define DEV_DVB_DVR      "dvr"
-#define DEV_DVB_DEMUX    "demux"
-#define DEV_DVB_CA       "ca"
-void DvbName(const char *Name, int n, char *buffer, int len);
-int DvbOpen(const char *Name, int n, int Mode, bool ReportError=false);
-
 const char *HexStr(char *str, const unsigned char *mem, int len);
 #define KeyStr(str,key) HexStr(str,key,8)
 
diff --git a/sc.c b/sc.c
index 85dc9d5..120b887 100644
--- a/sc.c
+++ b/sc.c
@@ -1062,6 +1062,12 @@ void cSoftCAM::CaidsChanged(void)
     }
 }
 
+int cSoftCAM::FilterHandle(int CardNum)
+{
+  cScDvbDevice *dev=dynamic_cast<cScDvbDevice *>(cDevice::GetDevice(CardNum));
+  return dev ? dev->FilterHandle() : -1;
+}
+
 // --- cScHousekeeper ----------------------------------------------------------
 
 class cScHousekeeper : public cThread {
diff --git a/sc.h b/sc.h
index 618ea55..5e0717e 100644
--- a/sc.h
+++ b/sc.h
@@ -36,6 +36,7 @@ public:
   static void AddHook(int CardNum, cLogHook *hook);
   static bool TriggerHook(int CardNum, int id);
   static void CaidsChanged(void);
+  static int FilterHandle(int CardNum);
   };
 
 #endif // ___SC_H
-- 
2.39.5