// -- cEcmData -----------------------------------------------------------------
+#define CACHE_VERS 1
+
class cEcmData : public cEcmInfo {
public:
cEcmData(void):cEcmInfo() {}
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);
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);
}
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 -----------------------------------------------------------------
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)
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;