From: leslie Date: Wed, 29 Jul 2009 09:19:00 +0000 (+0800) Subject: cardclient-cccam2: try all server cards X-Git-Tag: upstream/620~246 X-Git-Url: http://www.vanbest.org/gitweb/?a=commitdiff_plain;h=a710f37f48f75f9715246aada6d41a869c1f55b3;p=sasc-ng.git cardclient-cccam2: try all server cards --- diff --git a/systems/cardclient/cccam2.c b/systems/cardclient/cccam2.c index 08906e4..f1290a4 100644 --- a/systems/cardclient/cccam2.c +++ b/systems/cardclient/cccam2.c @@ -59,10 +59,43 @@ cHandlerItem::cHandlerItem(int Handlerid, int Caid, int Provid) } class cHandlers { + private: + bool CurListExist(int Handlerid); public: cSimpleList cHandlerList; + cSimpleList cCurrentList; + int GetHandlers(int Caid, int Provid); }; + +bool cHandlers::CurListExist(int Handlerid) { + for(cHandlerItem *cv=cCurrentList.First(); cv; cv=cCurrentList.Next(cv)) { + if(cv->GetHandlerID()==Handlerid) return true; + } + return false; +} + +int cHandlers::GetHandlers(int Caid, int Provid) { + cCurrentList.Clear(); + for (cHandlerItem *hv=cHandlerList.First(); hv; hv=cHandlerList.Next(hv)) { + switch(Caid>>8){ + case 5: //viaccess + if( hv->GetCaID()==Caid && hv->GetProvID()==Provid && !CurListExist(hv->GetHandlerID()) ) { + cHandlerItem *e=new cHandlerItem(hv->GetHandlerID(),hv->GetCaID(),hv->GetProvID()); + cCurrentList.Add(e); + } + break; + default: + if( hv->GetCaID()==Caid && !CurListExist(hv->GetHandlerID()) ) { + cHandlerItem *e=new cHandlerItem(hv->GetHandlerID(),hv->GetCaID(),hv->GetProvID()); + cCurrentList.Add(e); + } + break; + } + } + return cCurrentList.Count(); +} + // -- cCCcam2Card --------------------------------------------------------------- class cCCcam2Card : public cMutex { @@ -547,6 +580,7 @@ bool cCardClientCCcam2::ProcessECM(const cEcmInfo *ecm, const unsigned char *dat if((!so.Connected() && !Login()) || !CanHandle(ecm->caId)) return false; cCCcam2Card *c=&card; shareid=0; + PRINTF(L_CC_CORE,"%d: Ecm CaID %04x Provider %04x Pid %04x",cardnum,ecm->caId,ecm->provId,ecm->ecm_pid); bzero(buffer,sizeof(buffer)); memcpy(buffer,ecm_head,sizeof(ecm_head)); memcpy(buffer+sizeof(ecm_head),data,SCT_LEN(data)); @@ -562,33 +596,25 @@ bool cCardClientCCcam2::ProcessECM(const cEcmInfo *ecm, const unsigned char *dat buffer[ECM_SID_POS]=(ecm->prgId >> 8) & 0xFF; buffer[ECM_SID_POS+1]=ecm->prgId & 0xFF; buffer[ECM_LEN_POS]=SCT_LEN(data); - for ( cHandlerItem *hv=handlers->cHandlerList.First(); hv; hv=handlers->cHandlerList.Next(hv)) + if(handlers->GetHandlers(ecm->caId,ecm->provId) <1) return false; + for ( cHandlerItem *hv=handlers->cCurrentList.First(); hv; hv=handlers->cCurrentList.Next(hv)) { - if(ecm->caId >= 0x500 && ecm->caId <= 0x05FF){ - if(hv->GetCaID()==ecm->caId && hv->GetProvID()==ecm->provId) shareid=hv->GetHandlerID(); - } - else if((ecm->caId >= 0x1800 && ecm->caId <= 0x18FF) - || (ecm->caId>= 0x0600 && ecm->caId <= 0x06FF) - || (ecm->caId >= 0x0900 && ecm->caId <= 0x09FF) - || ecm->caId == 0x0B00){ - if(hv->GetCaID()==ecm->caId) shareid=hv->GetHandlerID(); - }else{ - if(hv->GetCaID()==ecm->caId && hv->GetProvID()==ecm->provId) shareid=hv->GetHandlerID(); + shareid=hv->GetHandlerID(); + if(shareid==0) return false; + buffer[ECM_HANDLER_POS]=(shareid>>24) & 0xFF; + buffer[ECM_HANDLER_POS+1]=(shareid>>16) & 0xFF; + buffer[ECM_HANDLER_POS+2]=(shareid>>8) & 0xFF; + buffer[ECM_HANDLER_POS+3]=shareid & 0xFF; + PRINTF(L_CC_CORE,"%d: Try Server HandlerID %x",cardnum,shareid); + HEXDUMP(L_CC_CCCAM,buffer,ecm_len,"%d: Send ECM Messages",cardnum); + cccam_encrypt( &client_encrypt_state,buffer,netbuff,ecm_len); + so.Write(netbuff,ecm_len); + if(c->GetCw(cw)) { + return true; + PRINTF(L_CC_CCCAM,"%d: got CW",cardnum); } } - PRINTF(L_CC_CORE,"%d: Ecm CaID %04x Provider %04x",cardnum,ecm->caId,ecm->provId); - if(shareid==0) return false; - buffer[ECM_HANDLER_POS]=(shareid>>24) & 0xFF; - buffer[ECM_HANDLER_POS+1]=(shareid>>16) & 0xFF; - buffer[ECM_HANDLER_POS+2]=(shareid>>8) & 0xFF; - buffer[ECM_HANDLER_POS+3]=shareid & 0xFF; - PRINTF(L_CC_CORE,"%d: Find Server HandlerID %x",cardnum,shareid); - HEXDUMP(L_CC_CCCAM,buffer,ecm_len,"%d: Send ECM Messages",cardnum); - cccam_encrypt( &client_encrypt_state,buffer,netbuff,ecm_len); - so.Write(netbuff,ecm_len); - if(!c->GetCw(cw)) return false; - PRINTF(L_CC_CCCAM,"%d: got CW",cardnum); - return true; + return false; } bool cCardClientCCcam2::ProcessEMM(int caSys, const unsigned char *data) @@ -599,8 +625,8 @@ bool cCardClientCCcam2::ProcessEMM(int caSys, const unsigned char *data) void cCardClientCCcam2::Action(void) { while(Running()) { - usleep(100); - bzero(recvbuff,sizeof(recvbuff)); + usleep(100); + bzero(recvbuff,sizeof(recvbuff)); int len=so.Read(recvbuff,sizeof(recvbuff),0); if(len>0) { cccam_decrypt( &client_decrypt_state, recvbuff, recvbuff, len );