From: leslie Date: Wed, 12 Aug 2009 02:38:24 +0000 (+0800) Subject: trigger rebuild caid list if smartcard/cardclient change handled caid X-Git-Tag: upstream/620~207 X-Git-Url: http://www.vanbest.org/gitweb/?a=commitdiff_plain;h=ef6d5f8b9204d59e4121e40fd6a8157516845186;p=sasc-ng.git trigger rebuild caid list if smartcard/cardclient change handled caid --- diff --git a/cam.c b/cam.c index 5561e0e..dad0adf 100644 --- a/cam.c +++ b/cam.c @@ -58,7 +58,6 @@ #define ECM_DATA_TIME 6000 // time to wait for ECM data updates #define MAX_ECM_IDLE 300000 // delay before an idle handler can be removed #define MAX_ECM_HOLD 15000 // delay before an idle handler stops processing -#define CAID_TIME 300000 // time between caid scans #define ECMCACHE_FILE "ecm.cache" @@ -865,7 +864,7 @@ for(cPrgPid *pid=pids.First(); pid; pid=pids.Next(pid)) { return HasPidCaDescr(); } -// -- cEcmSys ------------------------------------------------------------------ +// -- cEcmPri ------------------------------------------------------------------ class cEcmPri : public cSimpleItem { public: @@ -1973,6 +1972,9 @@ void cChannelList::Purge(int caid, bool fullch) // -- cScCiAdapter ------------------------------------------------------------- +#define CAID_TIME 300000 // time between caid scans +#define TRIGGER_TIME 10000 // min. time between caid scan trigger + #define TDPU_SIZE_INDICATOR 0x80 struct TPDU { @@ -1994,10 +1996,11 @@ private: cRingBufferLinear *rb; cScCamSlot *slots[MAX_CI_SLOTS]; // - cTimeMs caidTimer; + cTimeMs caidTimer, triggerTimer; int version[MAX_CI_SLOTS]; caid_t caids[MAX_CI_SLOTS][MAX_CI_SLOT_CAIDS+1]; int tcid; + bool rebuildcaids; // cTimeMs readTimer, writeTimer; // @@ -2015,6 +2018,7 @@ public: void CamAddPrg(cPrg *prg); bool CamSoftCSA(void); int GetCaids(int slot, unsigned short *Caids, int max); + void CaidsChanged(void); }; // -- cScCamSlot --------------------------------------------------------------- @@ -2224,7 +2228,7 @@ void cScCamSlot::Process(const unsigned char *data, int len) cScCiAdapter::cScCiAdapter(cDevice *Device, int CardIndex, cCam *Cam) { device=Device; cardIndex=CardIndex; cam=Cam; - tcid=0; + tcid=0; rebuildcaids=false; memset(version,0,sizeof(version)); memset(slots,0,sizeof(slots)); SetDescription("SC-CI adapter on device %d",cardIndex); @@ -2283,9 +2287,14 @@ int cScCiAdapter::GetCaids(int slot, unsigned short *Caids, int max) return version[slot]; } +void cScCiAdapter::CaidsChanged(void) +{ + rebuildcaids=true; +} + void cScCiAdapter::BuildCaids(bool force) { - if(caidTimer.TimedOut() || force) { + if(caidTimer.TimedOut() || force || (rebuildcaids && triggerTimer.TimedOut())) { PRINTF(L_CORE_CAIDS,"%d: building caid lists",cardIndex); cChannelList list(cardIndex); Channels.Lock(false); @@ -2329,6 +2338,8 @@ void cScCiAdapter::BuildCaids(bool force) ciMutex.Unlock(); caidTimer.Set(CAID_TIME); + triggerTimer.Set(TRIGGER_TIME); + rebuildcaids=false; } } @@ -3048,6 +3059,14 @@ bool cScDvbDevice::SoftCSA(bool live) return softcsa && (!fullts || !live); } +void cScDvbDevice::CaidsChanged(void) +{ +#if APIVERSNUM >= 10500 + if(ciadapter) ciadapter->CaidsChanged(); + PRINTF(L_CORE_CAIDS,"caid list rebuild triggered"); +#endif +} + bool cScDvbDevice::SetCaDescr(ca_descr_t *ca_descr, bool initial) { if(!softcsa || (fullts && ca_descr->index==0)) { @@ -3181,6 +3200,9 @@ bool cScDvbDevice::Initialize(void) return true; } +void cScDvbDevice::CaidsChanged(void) +{} + bool cScDvbDevice::SoftCSA(bool live) { return softcsa && !live; diff --git a/cam.h b/cam.h index df2f5c9..61cfef3 100644 --- a/cam.h +++ b/cam.h @@ -235,6 +235,7 @@ public: void DumpAV7110(void); cCam *Cam(void) { return cam; } bool SoftCSA(bool live); + void CaidsChanged(void); }; #endif // ___CAM_H diff --git a/sc.c b/sc.c index fc74767..8f9afbf 100644 --- a/sc.c +++ b/sc.c @@ -1064,6 +1064,14 @@ bool cSoftCAM::TriggerHook(int CardNum, int id) return dev && dev->Cam() && dev->Cam()->TriggerHook(id); } +void cSoftCAM::CaidsChanged(void) +{ + for(int n=cDevice::NumDevices(); --n>=0;) { + cScDvbDevice *dev=dynamic_cast(cDevice::GetDevice(n)); + if(dev) dev->CaidsChanged(); + } +} + // --- cScHousekeeper ---------------------------------------------------------- class cScHousekeeper : public cThread { diff --git a/sc.h b/sc.h index cb8f4fe..618ea55 100644 --- a/sc.h +++ b/sc.h @@ -35,6 +35,7 @@ public: static void SetLogStatus(int CardNum, const cEcmInfo *ecm, bool on); static void AddHook(int CardNum, cLogHook *hook); static bool TriggerHook(int CardNum, int id); + static void CaidsChanged(void); }; #endif // ___SC_H diff --git a/smartcard.c b/smartcard.c index 448fc36..49b1644 100644 --- a/smartcard.c +++ b/smartcard.c @@ -32,6 +32,7 @@ #include #include "smartcard.h" +#include "sc.h" #include "misc.h" #include "log-core.h" @@ -1879,6 +1880,11 @@ int cSmartCard::CheckSctLen(const unsigned char *data, int off) return l; } +void cSmartCard::CaidsChanged(void) +{ + cSoftCAM::CaidsChanged(); +} + // -- cSmartCardLink ----------------------------------------------------------- cSmartCardLink::cSmartCardLink(const char *Name, int Id) diff --git a/smartcard.h b/smartcard.h index db2439c..d889e43 100644 --- a/smartcard.h +++ b/smartcard.h @@ -127,6 +127,7 @@ protected: bool Status(void); void NewCardConfig(const struct CardConfig *Cfg); int CheckSctLen(const unsigned char *data, int off); + void CaidsChanged(void); public: cSmartCard(const struct CardConfig *Cfg, const struct StatusMsg *Msg); virtual ~cSmartCard() {}; diff --git a/systems/cardclient/camd.c b/systems/cardclient/camd.c index 891341a..0216451 100644 --- a/systems/cardclient/camd.c +++ b/systems/cardclient/camd.c @@ -278,7 +278,9 @@ void cCardClientCamd33::HandleEMMRequest(const unsigned char *buff, int len) { if(len>=13 && buff[0]==0 && !CheckNull(buff,len) && memcmp(buff,lastEmmReq,13)) { emmProcessing=false; - CAID=buff[1]*256+buff[2]; + int c=buff[1]*256+buff[2]; + if(c!=CAID) CaidsChanged(); + CAID=c; ResetIdSet(); switch(CAID>>8) { case 0x17: @@ -362,6 +364,7 @@ bool cCardClientBuffy::Login(void) if(caid==0xFFFF) break; if(caid) CAIDs[numCAIDs++]=caid; } + CaidsChanged(); LBSTART(L_CC_LOGIN); LBPUT("%s: CAIDs ",name); for(int i=0; iCaID()==caid) return true; + return false; +} + int cShares::GetShares(const cEcmInfo *ecm, cShares *ss) { Lock(true); @@ -499,7 +507,9 @@ void cCardClientCCcam2::PacketAnalyzer(const struct CmdHeader *hdr, int length) cShare *n=shares.Next(s); if(s->ShareID()==shareid) { PRINTF(L_CC_CCCAM2SH,"REMOVE share %08x caid: %04x",s->ShareID(),s->CaID()); + int caid=s->CaID(); shares.Del(s); + if(!shares.HasCaid(caid)) CaidsChanged(); } s=n; } @@ -511,6 +521,9 @@ void cCardClientCCcam2::PacketAnalyzer(const struct CmdHeader *hdr, int length) struct AddShare *add=(struct AddShare *)hdr; int caid=UINT16_BE(&add->caid); int shareid=UINT32_BE(&add->shareid); + shares.Lock(false); + if(!shares.HasCaid(caid)) CaidsChanged(); + shares.Unlock(); cShare *s=new cShare(shareid,caid,add->uphops); LBSTARTF(L_CC_CCCAM2SH); LBPUT("ADD share %08x hops %d maxdown %d caid %04x serial ",shareid,add->uphops,add->maxdown,caid); diff --git a/systems/cardclient/newcamd.c b/systems/cardclient/newcamd.c index 4bd6555..5487f92 100644 --- a/systems/cardclient/newcamd.c +++ b/systems/cardclient/newcamd.c @@ -421,7 +421,9 @@ bool cCardClientNewCamd::Login(void) if(!CmdSend(&so,MSG_CARD_DATA_REQ) || ReceiveMessage(&so,buffer,false)<=0) return false; if(buffer[0] == MSG_CARD_DATA) { - caId=(buffer[4]<<8)+buffer[5]; + int c=(buffer[4]<<8)+buffer[5]; + if(c!=caId) CaidsChanged(); + caId=c; LBSTARTF(L_CC_LOGIN); char str[32], str2[32]; LBPUT("%s: CaID=%04x admin=%d srvUA=%s",name,caId,buffer[3]==1,HexStr(str,&buffer[6],8)); diff --git a/systems/cardclient/radegast.c b/systems/cardclient/radegast.c index 5893611..a4907a7 100644 --- a/systems/cardclient/radegast.c +++ b/systems/cardclient/radegast.c @@ -215,7 +215,8 @@ bool cCardClientRadegast::Login(void) else PRINTF(L_CC_RDGD,"no server hello, assuming old mode"); if(emmProcessing && !emmAllowed) PRINTF(L_CC_EMM,"%s: EMM disabled from config",name); - return true; + CaidsChanged(); + return true; } bool cCardClientRadegast::ProcessECM(const cEcmInfo *ecm, const unsigned char *source, unsigned char *cw, int cardnum) diff --git a/systems/sc-conax/sc-conax.c b/systems/sc-conax/sc-conax.c index f909519..f0facec 100644 --- a/systems/sc-conax/sc-conax.c +++ b/systems/sc-conax/sc-conax.c @@ -246,7 +246,12 @@ bool cSmartCardConax::Init(void) for(int i=0; i