From: mirv Date: Fri, 4 Jan 2008 15:14:13 +0000 (+0100) Subject: rework ECM cache saving X-Git-Tag: 0.9.0~60 X-Git-Url: http://www.vanbest.org/gitweb/?a=commitdiff_plain;h=ea6736a4792f1785a376101ea89aa61880b98c93;p=sasc-ng.git rework ECM cache saving --- diff --git a/cam.c b/cam.c index 95d3d8e..0fc0372 100644 --- a/cam.c +++ b/cam.c @@ -618,7 +618,7 @@ cString cEcmData::ToString(bool hide) cEcmCache ecmcache; cEcmCache::cEcmCache(void) -:cStructList("ecm cache",ECMCACHE_FILE,SL_READWRITE|SL_MISSINGOK) +:cStructListPlain("ecm cache",ECMCACHE_FILE,SL_READWRITE|SL_MISSINGOK) {} void cEcmCache::New(cEcmInfo *e) @@ -626,10 +626,9 @@ void cEcmCache::New(cEcmInfo *e) ListLock(true); cEcmData *dat; if(!(dat=Exists(e))) { - ListUnlock(); - AutoGenWarn(); dat=new cEcmData(e); - AddItem(dat,0,0); + Add(dat); + Modified(); PRINTF(L_CORE_ECM,"cache add prgId=%d source=%x transponder=%x ecm=%x/%x",e->prgId,e->source,e->transponder,e->ecm_pid,e->ecm_table); } else { @@ -639,8 +638,8 @@ void cEcmCache::New(cEcmInfo *e) } if(dat->Update(e)) Modified(); - ListUnlock(); } + ListUnlock(); e->SetCached(); } @@ -692,12 +691,12 @@ void cEcmCache::Flush(void) ListUnlock(); } -cStructItem *cEcmCache::ParseLine(char *line) +bool cEcmCache::ParseLinePlain(char *line) { cEcmData *dat=new cEcmData; - if(dat && dat->Parse(line) && !Exists(dat)) return dat; + if(dat && dat->Parse(line) && !Exists(dat)) { Add(dat); return true; } delete dat; - return 0; + return false; } // -- cEcmSys ------------------------------------------------------------------ diff --git a/cam.h b/cam.h index 697823c..dd4ebf3 100644 --- a/cam.h +++ b/cam.h @@ -41,16 +41,17 @@ class cPrg; // ---------------------------------------------------------------- -class cEcmCache : public cStructList { +class cEcmCache : public cStructListPlain { private: cEcmData *Exists(cEcmInfo *e); +protected: + virtual bool ParseLinePlain(char *line); public: cEcmCache(void); void New(cEcmInfo *e); int GetCached(cSimpleList *list, int sid, int Source, int Transponder); void Delete(cEcmInfo *e); void Flush(void); - virtual cStructItem *ParseLine(char *line); }; extern cEcmCache ecmcache; diff --git a/data.c b/data.c index ac96b90..9a47ed0 100644 --- a/data.c +++ b/data.c @@ -229,20 +229,6 @@ void cStructLoader::DelItem(cStructItem *d, bool keep) } } -void cStructLoader::AutoGenWarn(void) -{ - if(Count()==0) { - cStructItem *n=new cCommentItem; - n->SetComment("## This is a generated file. DO NOT EDIT!!"); - cStructItem *n2=new cCommentItem; - n2->SetComment("## This file will be OVERWRITTEN WITHOUT WARNING!!"); - ListLock(true); - Add(n); - Add(n2); - ListUnlock(); - } -} - void cStructLoader::SetCfgDir(const char *cfgdir) { free(path); @@ -260,19 +246,23 @@ time_t cStructLoader::MTime(void) return st.st_mtime; } +void cStructLoader::CheckAccess(void) +{ + if(access(path,R_OK|W_OK)!=0) { + if(errno!=EACCES) + PRINTF(L_GEN_ERROR,"failed access %s: %s",path,strerror(errno)); + PRINTF(L_GEN_WARN,"no write permission on %s. Changes will not be saved!",path); + SL_CLRFLAG(SL_READWRITE); + } +} + void cStructLoader::Load(bool reload) { if(SL_TSTFLAG(SL_DISABLED) || (reload && !SL_TSTFLAG(SL_WATCH))) return; FILE *f=fopen(path,"r"); if(f) { int curr_mtime=MTime(); - if(access(path,R_OK|W_OK)!=0) { - if(errno!=EACCES) - PRINTF(L_GEN_ERROR,"failed access %s: %s",path,strerror(errno)); - PRINTF(L_GEN_WARN,"no write permission on %s. Changes will not be saved!",path); - SL_CLRFLAG(SL_READWRITE); - } - + CheckAccess(); SL_SETFLAG(SL_LOADED); ListLock(true); bool doload=false; @@ -353,7 +343,7 @@ void cStructLoader::Load(bool reload) void cStructLoader::Purge(void) { - if(!SL_TSTFLAG(SL_DISABLED)) { + if(!SL_TSTFLAG(SL_DISABLED) && !SL_TSTFLAG(SL_NOPURGE)) { ListLock(true); for(cStructItem *it=First(); it;) { cStructItem *n=Next(it); @@ -381,6 +371,82 @@ void cStructLoader::Save(void) } } +// -- cStructLoaderPlain ------------------------------------------------------- + +cStructLoaderPlain::cStructLoaderPlain(const char *Type, const char *Filename, int Flags) +:cStructLoader(Type,Filename,Flags) +{} + +void cStructLoaderPlain::Load(bool reload) +{ + if(SL_TSTFLAG(SL_DISABLED) || reload) return; + FILE *f=fopen(path,"r"); + if(f) { + CheckAccess(); + SL_SETFLAG(SL_LOADED); + ListLock(true); + Clear(); Modified(false); + PRINTF(L_GEN_INFO,"loading %s from %s",type,path); + int lineNum=0; + char buff[4096]; + while(fgets(buff,sizeof(buff),f)) { + lineNum++; + if(!index(buff,'\n') && !feof(f)) { + PRINTF(L_GEN_ERROR,"file %s readbuffer overflow line#%d",path,lineNum); + SL_CLRFLAG(SL_LOADED); + break; + } + bool hasContent=false; + char *ls; + for(ls=buff; *ls; ls++) { + if(*ls==';' || *ls=='#') break; + if(*ls>' ') hasContent=true; + } + if(hasContent) { + *ls=0; + if(!ParseLinePlain(buff)) + PRINTF(L_GEN_ERROR,"file %s has error in line #%d",path,lineNum); + } + } + PostLoad(); + ListUnlock(); + fclose(f); + } + else { + if(SL_TSTFLAG(SL_VERBOSE)) + PRINTF(L_GEN_ERROR,"failed open %s: %s",path,strerror(errno)); + if(SL_TSTFLAG(SL_MISSINGOK)) SL_SETFLAG(SL_LOADED); + else SL_CLRFLAG(SL_LOADED); + } + if(!SL_TSTFLAG(SL_LOADED)) + PRINTF(L_CORE_LOAD,"loading %s terminated with error. Changes will not be saved!",path); +} + +void cStructLoaderPlain::Save(void) +{ + if(!SL_TSTFLAG(SL_DISABLED) && SL_TSTFLAG(SL_READWRITE) && SL_TSTFLAG(SL_LOADED) && IsModified()) { + cSafeFile f(path); + if(f.Open()) { + ListLock(false); + PreSave(f); + for(cStructItem *it=First(); it; it=Next(it)) + if(!it->Deleted() && !it->Save(f)) break; + PostSave(f); + f.Close(); + Modified(false); + ListUnlock(); + PRINTF(L_CORE_LOAD,"saved %s to %s",type,path); + } + } +} + +void cStructLoaderPlain::PreSave(FILE *f) +{ + fprintf(f,"## This is a generated file. DO NOT EDIT!!\n" + "## This file will be OVERWRITTEN WITHOUT WARNING!!\n"); +} + + // -- cStructLoaders ----------------------------------------------------------- #define RELOAD_TIMEOUT 20000 diff --git a/data.h b/data.h index 4b8c1a8..c81cb0f 100644 --- a/data.h +++ b/data.h @@ -95,10 +95,11 @@ public: #define SL_MISSINGOK 2 #define SL_WATCH 4 #define SL_VERBOSE 8 +#define SL_NOPURGE 16 #define SL_CUSTOMMASK 0xFF #define SL_LOADED 0x100 #define SL_MODIFIED 0x200 -#define SL_DISABLED 0x300 +#define SL_DISABLED 0x400 #define SL_SETFLAG(x) flags|=(x) #define SL_CLRFLAG(x) flags&=~(x) @@ -116,14 +117,15 @@ protected: char *path; time_t mtime; // + void CheckAccess(void); + time_t MTime(void); + // virtual cStructItem *ParseLine(char *line)=0; void Modified(bool mod=true) { if(mod) SL_SETFLAG(SL_MODIFIED); else SL_CLRFLAG(SL_MODIFIED); } bool IsModified(void) const { return SL_TSTFLAG(SL_MODIFIED); } void ListLock(bool rw) { lock.Lock(rw); } void ListUnlock(void) { lock.Unlock(); } - void AutoGenWarn(void); virtual void PostLoad(void) {} - time_t MTime(void); public: cStructLoader(const char *Type, const char *Filename, int Flags); virtual ~cStructLoader(); @@ -133,7 +135,7 @@ public: void SetCfgDir(const char *cfgdir); virtual void Load(bool reload); virtual void Save(void); - virtual void Purge(void); + void Purge(void); void Disable(void) { SL_SETFLAG(SL_DISABLED); } }; @@ -151,11 +153,14 @@ public: class cStructLoaderPlain : public cStructLoader { protected: + virtual cStructItem *ParseLine(char *line) { return 0; } + virtual bool ParseLinePlain(char *line)=0; public: cStructLoaderPlain(const char *Type, const char *Filename, int Flags); virtual void Load(bool reload); virtual void Save(void); - virtual void Purge(void); + virtual void PreSave(FILE *f); + virtual void PostSave(FILE *f) {}; }; //--------------------------------------------------------------