From: mirv Date: Fri, 4 Jan 2008 10:33:12 +0000 (+0100) Subject: introduce loader flags X-Git-Tag: 0.9.0~61 X-Git-Url: http://www.vanbest.org/gitweb/?a=commitdiff_plain;h=d38a38e79836cbe4e0390ce79019a896ab808c5f;p=sasc-ng.git introduce loader flags --- diff --git a/cam.c b/cam.c index bd5e178..95d3d8e 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,true,true,false,false) +:cStructList("ecm cache",ECMCACHE_FILE,SL_READWRITE|SL_MISSINGOK) {} void cEcmCache::New(cEcmInfo *e) diff --git a/data.c b/data.c index 85af8f6..ac96b90 100644 --- a/data.c +++ b/data.c @@ -180,12 +180,11 @@ cCommentItem::cCommentItem(void) // -- cStructLoader ------------------------------------------------------------ -cStructLoader::cStructLoader(const char *Type, const char *Filename, bool rw, bool miok, bool wat, bool verb) +cStructLoader::cStructLoader(const char *Type, const char *Filename, int Flags) :lock(true) { - path=0; mtime=0; modified=loaded=disabled=false; - type=Type; filename=Filename; - readwrite=rw; missingok=miok; watch=wat; verbose=verb; + path=0; mtime=0; + type=Type; filename=Filename; flags=Flags&SL_CUSTOMMASK; cStructLoaders::Register(this); } @@ -261,9 +260,9 @@ time_t cStructLoader::MTime(void) return st.st_mtime; } -bool cStructLoader::Load(bool reload) +void cStructLoader::Load(bool reload) { - if(reload && !watch) return true; + if(SL_TSTFLAG(SL_DISABLED) || (reload && !SL_TSTFLAG(SL_WATCH))) return; FILE *f=fopen(path,"r"); if(f) { int curr_mtime=MTime(); @@ -271,10 +270,10 @@ bool cStructLoader::Load(bool reload) 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); - readwrite=false; + SL_CLRFLAG(SL_READWRITE); } - loaded=true; + SL_SETFLAG(SL_LOADED); ListLock(true); bool doload=false; if(!reload) { @@ -299,7 +298,7 @@ bool cStructLoader::Load(bool reload) lineNum++; if(!index(buff,'\n') && !feof(f)) { PRINTF(L_GEN_ERROR,"file %s readbuffer overflow line#%d",path,lineNum); - loaded=false; + SL_CLRFLAG(SL_LOADED); break; } strreplace(buff,'\n',0); strreplace(buff,'\r',0); // chomp @@ -331,7 +330,7 @@ bool cStructLoader::Load(bool reload) } else { PRINTF(L_GEN_ERROR,"out of memory loading file %s",path); - loaded=false; + SL_CLRFLAG(SL_LOADED); break; } } @@ -343,39 +342,43 @@ bool cStructLoader::Load(bool reload) fclose(f); } else { - if(verbose) PRINTF(L_GEN_ERROR,"failed open %s: %s",path,strerror(errno)); - loaded=missingok; + 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(!loaded) PRINTF(L_CORE_LOAD,"loading %s terminated with error. Changes will not be saved!",path); - return loaded; + if(!SL_TSTFLAG(SL_LOADED)) + PRINTF(L_CORE_LOAD,"loading %s terminated with error. Changes will not be saved!",path); } void cStructLoader::Purge(void) { - ListLock(true); - for(cStructItem *it=First(); it;) { - cStructItem *n=Next(it); - if(it->Deleted()) Del(it); - it=n; + if(!SL_TSTFLAG(SL_DISABLED)) { + ListLock(true); + for(cStructItem *it=First(); it;) { + cStructItem *n=Next(it); + if(it->Deleted()) Del(it); + it=n; + } + ListUnlock(); } - ListUnlock(); } void cStructLoader::Save(void) { - ListLock(false); - if(readwrite && loaded && IsModified()) { + if(!SL_TSTFLAG(SL_DISABLED) && SL_TSTFLAG(SL_READWRITE) && SL_TSTFLAG(SL_LOADED) && IsModified()) { cSafeFile f(path); if(f.Open()) { + ListLock(false); for(cStructItem *it=First(); it; it=Next(it)) if(!it->Deleted() && !it->Save(f)) break; f.Close(); mtime=MTime(); - PRINTF(L_CORE_LOAD,"saved %s to %s",type,path); Modified(false); + ListUnlock(); + PRINTF(L_CORE_LOAD,"saved %s to %s",type,path); } } - ListUnlock(); } // -- cStructLoaders ----------------------------------------------------------- @@ -405,8 +408,7 @@ void cStructLoaders::SetCfgDir(const char *cfgdir) void cStructLoaders::Load(bool reload) { if(!reload || lastReload.TimedOut()) { - for(cStructLoader *ld=first; ld; ld=ld->next) - if(!ld->disabled) ld->Load(reload); + for(cStructLoader *ld=first; ld; ld=ld->next) ld->Load(reload); lastReload.Set(RELOAD_TIMEOUT); } } @@ -414,8 +416,7 @@ void cStructLoaders::Load(bool reload) void cStructLoaders::Save(void) { if(lastSave.TimedOut()) { - for(cStructLoader *ld=first; ld; ld=ld->next) - if(!ld->disabled) ld->Save(); + for(cStructLoader *ld=first; ld; ld=ld->next) ld->Save(); lastSave.Set(SAVE_TIMEOUT); } } @@ -423,8 +424,7 @@ void cStructLoaders::Save(void) void cStructLoaders::Purge(void) { if(lastPurge.TimedOut()) { - for(cStructLoader *ld=first; ld; ld=ld->next) - if(!ld->disabled) ld->Purge(); + for(cStructLoader *ld=first; ld; ld=ld->next) ld->Purge(); lastPurge.Set(PURGE_TIMEOUT); } } @@ -934,7 +934,7 @@ cPlainKeys keys; cPlainKeyType *cPlainKeys::first=0; cPlainKeys::cPlainKeys(void) -:cStructList("keys",KEY_FILE,true,true,true,true) +:cStructList("keys",KEY_FILE,SL_READWRITE|SL_MISSINGOK|SL_WATCH|SL_VERBOSE) {} void cPlainKeys::Register(cPlainKeyType *pkt, bool Super) diff --git a/data.h b/data.h index ca6c5cd..4b8c1a8 100644 --- a/data.h +++ b/data.h @@ -91,44 +91,57 @@ public: //-------------------------------------------------------------- +#define SL_READWRITE 1 +#define SL_MISSINGOK 2 +#define SL_WATCH 4 +#define SL_VERBOSE 8 +#define SL_CUSTOMMASK 0xFF +#define SL_LOADED 0x100 +#define SL_MODIFIED 0x200 +#define SL_DISABLED 0x300 + +#define SL_SETFLAG(x) flags|=(x) +#define SL_CLRFLAG(x) flags&=~(x) +#define SL_TSTFLAG(x) (flags&(x)) + class cStructLoader : public cSimpleList { friend class cStructLoaders; private: cStructLoader *next; - // cRwLock lock; + // +protected: + int flags; const char *type, *filename; char *path; time_t mtime; - bool modified, readwrite, missingok, loaded, disabled, watch, verbose; // - time_t MTime(void); -protected: virtual cStructItem *ParseLine(char *line)=0; - void Modified(bool mod=true) { modified=mod; } - bool IsModified(void) const { return modified; } + 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, bool rw, bool miok, bool wat, bool verb); + cStructLoader(const char *Type, const char *Filename, int Flags); virtual ~cStructLoader(); void AddItem(cStructItem *n, const char *com, cStructItem *ref); void DelItem(cStructItem *d, bool keep=false); // void SetCfgDir(const char *cfgdir); - bool Load(bool reload); - void Save(void); - void Purge(void); - void Disable(void) { disabled=true; } + virtual void Load(bool reload); + virtual void Save(void); + virtual void Purge(void); + void Disable(void) { SL_SETFLAG(SL_DISABLED); } }; //-------------------------------------------------------------- template class cStructList : public cStructLoader { public: - cStructList(const char *Type, const char *Filename, bool rw, bool miok, bool wat, bool verb):cStructLoader(Type,Filename,rw,miok,wat,verb) {} + cStructList(const char *Type, const char *Filename, int Flags):cStructLoader(Type,Filename,Flags) {} T *First(void) const { return (T *)cStructLoader::First(); } T *Last(void) const { return (T *)cStructLoader::Last(); } T *Next(const T *item) const { return (T *)cStructLoader::Next(item); } @@ -136,6 +149,27 @@ public: //-------------------------------------------------------------- +class cStructLoaderPlain : public cStructLoader { +protected: +public: + cStructLoaderPlain(const char *Type, const char *Filename, int Flags); + virtual void Load(bool reload); + virtual void Save(void); + virtual void Purge(void); + }; + +//-------------------------------------------------------------- + +template class cStructListPlain : public cStructLoaderPlain { +public: + cStructListPlain(const char *Type, const char *Filename, int Flags):cStructLoaderPlain(Type,Filename,Flags) {} + T *First(void) const { return (T *)cStructLoaderPlain::First(); } + T *Last(void) const { return (T *)cStructLoaderPlain::Last(); } + T *Next(const T *item) const { return (T *)cStructLoaderPlain::Next(item); } + }; + +//-------------------------------------------------------------- + class cStructLoaders { friend class cStructLoader; private: diff --git a/system-common.h b/system-common.h index c79ecd6..3d85d61 100644 --- a/system-common.h +++ b/system-common.h @@ -90,7 +90,7 @@ public: template class cCardInfos : public cStructList { public: - cCardInfos(const char *Type, const char *Filename, bool rw):cStructList(Type,Filename,rw,true,true,false) {} + cCardInfos(const char *Type, const char *Filename, int fl):cStructList(Type,Filename,fl|SL_MISSINGOK|SL_WATCH) {} virtual cStructItem *ParseLine(char *line) { T *k=new T; diff --git a/systems/irdeto/irdeto.c b/systems/irdeto/irdeto.c index 0de55da..fdc3143 100644 --- a/systems/irdeto/irdeto.c +++ b/systems/irdeto/irdeto.c @@ -85,7 +85,7 @@ public: static cIrdCardInfos Icards; cIrdCardInfos::cIrdCardInfos(void) -:cCardInfos("Irdeto cards","Ird-Beta.KID",true) +:cCardInfos("Irdeto cards","Ird-Beta.KID",SL_READWRITE) {} bool cIrdCardInfos::Update(cIrdCardInfo *ci, const unsigned char *pmk, const unsigned char *id) diff --git a/systems/seca/seca.c b/systems/seca/seca.c index b22f7f0..06dd038 100644 --- a/systems/seca/seca.c +++ b/systems/seca/seca.c @@ -190,7 +190,7 @@ bool cSecaCardInfo::Parse(const char *line) class cSecaCardInfos : public cCardInfos { public: - cSecaCardInfos(void):cCardInfos("Seca cards","Seca.KID",false) {} + cSecaCardInfos(void):cCardInfos("Seca cards","Seca.KID",0) {} }; static cSecaCardInfos Scards; diff --git a/systems/viaccess/viaccess.c b/systems/viaccess/viaccess.c index 28e7475..5278a94 100644 --- a/systems/viaccess/viaccess.c +++ b/systems/viaccess/viaccess.c @@ -146,7 +146,7 @@ bool cViaccessCardInfo::Parse(const char *line) class cViaccessCardInfos : public cCardInfos { public: - cViaccessCardInfos(void):cCardInfos("Viaccess cards","Viaccess.KID",false) {} + cViaccessCardInfos(void):cCardInfos("Viaccess cards","Viaccess.KID",0) {} }; static cViaccessCardInfos Vcards;