#include <stdio.h>\r
#include <stdlib.h>\r
#include <errno.h>\r
-#include <string.h>\r
#include <unistd.h>\r
-#include <errno.h>\r
#include <sys/socket.h>\r
#include <sys/un.h>\r
-#include <fcntl.h>\r
-#include <netinet/in.h>\r
-#include <arpa/inet.h>\r
-#include <signal.h>\r
\r
#include <vdr/pat.h>\r
\r
#include "cc.h"\r
#include "network.h"\r
-//#include "parse.h"\r
\r
#define LIST_ONLY 0x03 /* CA application should clear the list when an 'ONLY' CAPMT object is received, and start working with the object */\r
\r
\r
// -- cCardClientCCcam ---------------------------------------------------------\r
\r
-class cCardClientCCcam : public cCardClient , private cThread {\r
+class cCardClientCCcam : public cCardClient, private cThread {\r
private:\r
cNetSocket so;\r
cCCcamCard card[4];\r
virtual void Action(void);\r
public:\r
cCardClientCCcam(const char *Name);\r
+ ~cCardClientCCcam();\r
virtual bool Init(const char *CfgDir);\r
virtual bool ProcessECM(const cEcmInfo *ecm, const unsigned char *data, unsigned char *Cw, int cardnum);\r
- virtual bool CanHandle(unsigned short SysId);\r
};\r
\r
static cCardClientLinkReg<cCardClientCCcam> __ncd("CCcam");\r
for(int i=0; i<4; i++) card[i].Setup(i,socketPath);\r
}\r
\r
+cCardClientCCcam::~cCardClientCCcam()\r
+{\r
+ Cancel(3);\r
+}\r
+\r
bool cCardClientCCcam::Init(const char *config)\r
{\r
cMutexLock lock(this);\r
return true;\r
}\r
\r
-bool cCardClientCCcam::CanHandle(unsigned short SysId)\r
-{\r
- if((SysId & 0xf000) != 0x5000) return true;\r
- return false;\r
-}\r
-\r
bool cCardClientCCcam::Login(void)\r
{\r
- if(!so.Connected()) {\r
- so.Disconnect();\r
- if(!so.Bind("127.0.0.1",port)) return false;\r
- PRINTF(L_CC_CCCAM,"Bound to port %d, starting UDP listener",port);\r
- Start();\r
- }\r
+ cMutexLock lock(this);\r
+ so.Disconnect();\r
+ if(!so.Bind("127.0.0.1",port)) return false;\r
+ PRINTF(L_CC_CCCAM,"Bound to port %d, starting UDP listener",port);\r
+ Start();\r
return true;\r
}\r
\r
bool cCardClientCCcam::ProcessECM(const cEcmInfo *ecm, const unsigned char *data, unsigned char *cw, int cardnum)\r
{\r
- // if(((ccam_fd ==0) && !Login()) || !CanHandle(ecm->caId)) return false;\r
- //so.Flush();\r
- // cMutexLock lock(this);\r
- //newcw[cardnum] =0;\r
+ cMutexLock lock(this);\r
+ if((!so.Connected() && !Login()) || !CanHandle(ecm->caId)) return false;\r
\r
static const unsigned char pmt[] = {\r
- 0x9f,0x80,0x32,0x82,0x00,0x00,\r
+ 0x9f,0x80,0x32,0x82,0xFF,0xFF,\r
0x01,\r
#define PRG_POS 7\r
0xFF,0xFF, // prg-nr\r
capmt[DMX_POS+3]=cardnum ;\r
capmt[PID_POS+2]=ecm->ecm_pid>>8;\r
capmt[PID_POS+3]=ecm->ecm_pid&0xFF;\r
- bool streamflag = 1;\r
+ bool streamflag=1;\r
#if APIVERSNUM >= 10500\r
int casys[2];\r
#else\r
if(!c->GetCw(cw,timeout)) {\r
// somethings up, so we will send capmt again.\r
c->WriteCaPmt();\r
- timeout=1000;\r
- if(!c->GetCw(cw,timeout)) {\r
+ if(!c->GetCw(cw,1000)) {\r
PRINTF(L_CC_CCCAM,"%d: FAILED ECM !",cardnum);\r
c->Disconnect();\r
failedcw++;\r
return true;\r
}\r
\r
-void cCardClientCCcam::Action()\r
+void cCardClientCCcam::Action(void)\r
{\r
unsigned char cw[18];\r
while(Running()) {\r
if(so.Read(cw,sizeof(cw))==sizeof(cw)) {\r
- PRINTF(L_CC_CCCAM," Got: %02hhx%02hhx %02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx %02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx",\r
- cw[0],cw[1],\r
- cw[2],cw[3],cw[4],cw[5],cw[6],cw[7],cw[8],cw[9],\r
- cw[10],cw[11],cw[12],cw[13],cw[14],cw[15],cw[16],cw[17]);\r
-\r
+ LDUMP(L_CC_CCCAM,cw+2,16,"got: %02x%02x",cw[0],cw[1]);\r
if(cw[1]==0x0f && cw[0]<4)\r
card[cw[0]].NewCw(cw+2);\r
}\r