]> www.vanbest.org Git - sasc-ng.git/commitdiff
add ECM cache versioning, save rewriter
authorleslie <unknown>
Sun, 16 Aug 2009 02:48:33 +0000 (10:48 +0800)
committerleslie <unknown>
Sun, 16 Aug 2009 02:48:33 +0000 (10:48 +0800)
cam.c
data.c
data.h
version.h

diff --git a/cam.c b/cam.c
index 69cfb8cec3264fe1d63f17375cde4343b088f943..c01fd79c9f6c57546ed0c987dbe8ced2d802fb16 100644 (file)
--- 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 c45788297ac7e7a7c8b8765601f06ce2f8bc58c9..0027aaaccc60d7788dee1c8b4a18edef1617e75a 100644 (file)
--- 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 238608d171937cdc3adb1ec989c9232cd4d73846..0c719bb4cff278c4150fe2947c1b7ce4b58923be 100644 (file)
--- 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; }
index 5c930059fe976f59ca2c630188eea0b45485d412..3af783e6bafdcc7f79b376f84a0a1916c98767ad 100644 (file)
--- 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