From: leslie Date: Sun, 16 Aug 2009 02:48:33 +0000 (+0800) Subject: add ECM cache versioning, save rewriter X-Git-Tag: upstream/620~199 X-Git-Url: http://www.vanbest.org/gitweb/?a=commitdiff_plain;h=05c9c2df4eb59765f97f808defae87714a8ada9b;p=sasc-ng.git add ECM cache versioning, save rewriter --- diff --git a/cam.c b/cam.c index 69cfb8c..c01fd79 100644 --- a/cam.c +++ b/cam.c @@ -584,6 +584,8 @@ void cLogger::Process(cPidFilter *filter, unsigned char *data, int len) // -- cEcmData ----------------------------------------------------------------- +#define CACHE_VERS 1 + class cEcmData : public cEcmInfo { public: cEcmData(void):cEcmInfo() {} @@ -595,10 +597,14 @@ public: bool cEcmData::Parse(const char *buf) { char Name[64]; - int nu=0, num; + int nu=0, num, vers=0; Name[0]=0; - if(sscanf(buf,"%d:%x:%x:%63[^:]:%x/%x:%x:%x/%x:%d/%d%n",&prgId,&source,&transponder,Name,&caId,&emmCaId,&provId,&ecm_pid,&ecm_table,&nu,&dataIdx,&num)>=11) { + if(sscanf(buf,"V%d:%d:%x:%x:%63[^:]:%x/%x:%x:%x/%x:%d:%d/%d%n", + &vers,&prgId,&source,&transponder,Name,&caId,&emmCaId,&provId, + &ecm_pid,&ecm_table,&rewriterId,&nu,&dataIdx,&num)>=13 + && vers==CACHE_VERS) { SetName(Name); + SetRewriter(); const char *line=buf+num; if(nu>0 && *line++==':') { unsigned char *dat=AUTOMEM(nu); @@ -615,16 +621,16 @@ cString cEcmData::ToString(bool hide) char *str; if(caDescr) { str=AUTOARRAY(char,caDescrLen*2+16); - int q=sprintf(str,":%d/%d:",caDescrLen,dataIdx); + int q=sprintf(str,"%d/%d:",caDescrLen,dataIdx); HexStr(str+q,caDescr,caDescrLen); } else { - str=AUTOARRAY(char,4); - strcpy(str,":0"); + str=AUTOARRAY(char,10); + sprintf(str,"0/%d:",dataIdx); } - return cString::sprintf("%d:%x:%x:%s:%x/%x:%x:%x/%x%s", - prgId,source,transponder,name, - caId,emmCaId,provId,ecm_pid,ecm_table, + return cString::sprintf("V%d:%d:%x:%x:%s:%x/%x:%x:%x/%x:%d:%s", + CACHE_VERS,prgId,source,transponder,name, + caId,emmCaId,provId,ecm_pid,ecm_table,rewriterId, str); } @@ -712,9 +718,9 @@ void cEcmCache::Flush(void) bool cEcmCache::ParseLinePlain(const char *line) { cEcmData *dat=new cEcmData; - if(dat && dat->Parse(line) && !Exists(dat)) { Add(dat); return true; } - delete dat; - return false; + if(dat && dat->Parse(line) && !Exists(dat)) Add(dat); + else delete dat; + return true; } // -- cCaDescr ----------------------------------------------------------------- diff --git a/data.c b/data.c index c457882..0027aaa 100644 --- a/data.c +++ b/data.c @@ -590,8 +590,8 @@ cEcmInfo::cEcmInfo(const cEcmInfo *e) prgId=e->prgId; source=e->source; transponder=e->transponder; - if((rewriterId=e->rewriterId)>0) - rewriter=cRewriters::CreateById(rewriterId); + rewriterId=e->rewriterId; + SetRewriter(); } cEcmInfo::cEcmInfo(const char *Name, int Pid, int CaId, int ProvId) @@ -644,6 +644,20 @@ bool cEcmInfo::AddCaDescr(const cEcmInfo *e) return res; } +void cEcmInfo::SetRewriter(void) +{ + if(rewriterId>0) { + if(!rewriter || rewriter->Id()!=rewriterId) { + delete rewriter; + rewriter=cRewriters::CreateById(rewriterId); + } + } + else { + delete rewriter; + rewriter=0; + } +} + bool cEcmInfo::AddCaDescr(const unsigned char *descr, int len) { bool res=false; diff --git a/data.h b/data.h index 238608d..0c719bb 100644 --- a/data.h +++ b/data.h @@ -248,6 +248,7 @@ public: bool AddCaDescr(const cEcmInfo *e); bool AddCaDescr(const unsigned char *descr, int len); const unsigned char *GetCaDescr(int *l) const; + void SetRewriter(void); void Fail(bool st) { failed=st; } bool Failed(void) const { return failed; } void SetCached(void) { cached=true; } diff --git a/version.h b/version.h index 5c93005..3af783e 100644 --- a/version.h +++ b/version.h @@ -25,7 +25,7 @@ extern const char *ScVersion; // SC API version number for loading shared libraries -#define SCAPIVERS 25 +#define SCAPIVERS 26 #ifndef STATICBUILD #define SCAPIVERSTAG() int ScLibApiVersion=SCAPIVERS #else