while((sys=cSystems::FindBySysId(sysId,!cam->IsSoftCSA(filterCwIndex==0),sysPri))) {
sysPri=sys->Pri();
cSimpleList<cEcmInfo> ecms;
- sys->ParseCADescriptor(&ecms,sysId,&buff[index+2],buff[index+1]);
+ sys->ParseCADescriptor(&ecms,sysId,filterSource,&buff[index+2],buff[index+1]);
delete sys;
if(ecms.Count()) {
cEcmInfo *n;
}
}
-void cSystem::ParseCADescriptor(cSimpleList<cEcmInfo> *ecms, unsigned short sysId, const unsigned char *data, int len)
+void cSystem::ParseCADescriptor(cSimpleList<cEcmInfo> *ecms, unsigned short sysId, int source, const unsigned char *data, int len)
{
const int pid=WORD(data,2,0x1FFF);
switch(sysId>>8) {
default: // default style
{
cEcmInfo *n=new cEcmInfo(name,pid,sysId,0);
- if(sysId==0x1234) { // BEV
+ if(sysId==0x1234 || (sysId==0x1801 && (source==0x8334 || source==0x838e))) { // BEV
n->ecm_table=0x8e;
n->emmCaId=0x1801;
}
virtual void CheckECMResult(const cEcmInfo *ecm, const unsigned char *data, bool result);
virtual bool ProcessECM(const cEcmInfo *ecm, unsigned char *buffer)=0;
virtual void ProcessEMM(int pid, int caid, unsigned char *buffer) {};
- virtual void ParseCADescriptor(cSimpleList<cEcmInfo> *ecms, unsigned short sysId, const unsigned char *data, int len);
+ virtual void ParseCADescriptor(cSimpleList<cEcmInfo> *ecms, unsigned short sysId, int source, const unsigned char *data, int len);
virtual void ParseCAT(cPids *pids, const unsigned char *buffer);
unsigned char *CW(void) { return cw; }
void DoLog(bool Log) { doLog=Log; }
memcpy(odata,data,sizeof(odata));
if(ecm->source>=NA_SOURCE_START && ecm->source<=NA_SOURCE_END) {
if(ecm->caId==0x1234) data[5]=0x09; // NA rev 248 morph
- else if(ecm->caId==0x1801 && ecm->source==0x83ca) data[5]=0xC1; // 97W
- else data[5]=0x01; // I _HATE_ this provider
- data[6]&=0x1F; // specific stuff :(
+ else {
+ if(ecm->source==0x83ca) data[5]=0xC1; // 97W
+ else if(ecm->source==0x8334 || ecm->source==0x838e) data[5]=0x09; // 82W 91W
+ else data[5]=0x01;
+ }
+ data[6]&=0x1F;
data[7]=data[7]&0x10|0x86;
data[8]=0;
data[9]=data[9]&0x80|0x08;
class cSystemScViaccess : public cSystemScCore { //, private cTPS {
public:
cSystemScViaccess(void);
- virtual void ParseCADescriptor(cSimpleList<cEcmInfo> *ecms, unsigned short sysId, const unsigned char *data, int len);
+ virtual void ParseCADescriptor(cSimpleList<cEcmInfo> *ecms, unsigned short sysId, int source, const unsigned char *data, int len);
};
cSystemScViaccess::cSystemScViaccess(void)
hasLogger=true;
}
-void cSystemScViaccess::ParseCADescriptor(cSimpleList<cEcmInfo> *ecms, unsigned short sysId, const unsigned char *data, int len)
+void cSystemScViaccess::ParseCADescriptor(cSimpleList<cEcmInfo> *ecms, unsigned short sysId, int source, const unsigned char *data, int len)
{
const int pid=WORD(data,2,0x1FFF);
if(pid>=0xAA && pid<=0xCF) {
PRINTF(L_CORE_ECMPROC,"sc-viaccess: dropped \"fake\" ecm pid 0x%04xn",pid);
return;
}
- cSystem::ParseCADescriptor(ecms,sysId,data,len);
+ cSystem::ParseCADescriptor(ecms,sysId,source,data,len);
}
// -- cSystemLinkScViaccess --------------------------------------------------------------
cSystemViaccess(void);
virtual bool ProcessECM(const cEcmInfo *ecm, unsigned char *data);
virtual void ProcessEMM(int pid, int caid, unsigned char *data);
- virtual void ParseCADescriptor(cSimpleList<cEcmInfo> *ecms, unsigned short sysId, const unsigned char *data, int len);
+ virtual void ParseCADescriptor(cSimpleList<cEcmInfo> *ecms, unsigned short sysId, int source, const unsigned char *data, int len);
};
cSystemViaccess::cSystemViaccess(void)
hasLogger=true;
}
-void cSystemViaccess::ParseCADescriptor(cSimpleList<cEcmInfo> *ecms, unsigned short sysId, const unsigned char *data, int len)
+void cSystemViaccess::ParseCADescriptor(cSimpleList<cEcmInfo> *ecms, unsigned short sysId, int source, const unsigned char *data, int len)
{
const int pid=WORD(data,2,0x1FFF);
if(pid>=0xAA && pid<=0xCF) {
PRINTF(L_CORE_ECMPROC,"viaccess: dropped \"fake\" ecm pid 0x%04x",pid);
return;
}
- cSystem::ParseCADescriptor(ecms,sysId,data,len);
+ cSystem::ParseCADescriptor(ecms,sysId,source,data,len);
}
bool cSystemViaccess::ProcessECM(const cEcmInfo *ecm, unsigned char *data)