cEcmCache ecmcache;
cEcmCache::cEcmCache(void)
-:cStructList<cEcmData>("ecm cache",ECMCACHE_FILE,true,true,false,false)
+:cStructList<cEcmData>("ecm cache",ECMCACHE_FILE,SL_READWRITE|SL_MISSINGOK)
{}
void cEcmCache::New(cEcmInfo *e)
// -- 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);
}
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();
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) {
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
}
else {
PRINTF(L_GEN_ERROR,"out of memory loading file %s",path);
- loaded=false;
+ SL_CLRFLAG(SL_LOADED);
break;
}
}
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 -----------------------------------------------------------
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);
}
}
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);
}
}
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);
}
}
cPlainKeyType *cPlainKeys::first=0;
cPlainKeys::cPlainKeys(void)
-:cStructList<cPlainKey>("keys",KEY_FILE,true,true,true,true)
+:cStructList<cPlainKey>("keys",KEY_FILE,SL_READWRITE|SL_MISSINGOK|SL_WATCH|SL_VERBOSE)
{}
void cPlainKeys::Register(cPlainKeyType *pkt, bool Super)
//--------------------------------------------------------------
+#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<cStructItem> {
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 T> class cStructList : public cStructLoader {
public:
- cStructList<T>(const char *Type, const char *Filename, bool rw, bool miok, bool wat, bool verb):cStructLoader(Type,Filename,rw,miok,wat,verb) {}
+ cStructList<T>(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); }
//--------------------------------------------------------------
+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 T> class cStructListPlain : public cStructLoaderPlain {
+public:
+ cStructListPlain<T>(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:
template<class T> class cCardInfos : public cStructList<T> {
public:
- cCardInfos(const char *Type, const char *Filename, bool rw):cStructList<T>(Type,Filename,rw,true,true,false) {}
+ cCardInfos(const char *Type, const char *Filename, int fl):cStructList<T>(Type,Filename,fl|SL_MISSINGOK|SL_WATCH) {}
virtual cStructItem *ParseLine(char *line)
{
T *k=new T;
static cIrdCardInfos Icards;
cIrdCardInfos::cIrdCardInfos(void)
-:cCardInfos<cIrdCardInfo>("Irdeto cards","Ird-Beta.KID",true)
+:cCardInfos<cIrdCardInfo>("Irdeto cards","Ird-Beta.KID",SL_READWRITE)
{}
bool cIrdCardInfos::Update(cIrdCardInfo *ci, const unsigned char *pmk, const unsigned char *id)
class cSecaCardInfos : public cCardInfos<cSecaCardInfo> {
public:
- cSecaCardInfos(void):cCardInfos<cSecaCardInfo>("Seca cards","Seca.KID",false) {}
+ cSecaCardInfos(void):cCardInfos<cSecaCardInfo>("Seca cards","Seca.KID",0) {}
};
static cSecaCardInfos Scards;
class cViaccessCardInfos : public cCardInfos<cViaccessCardInfo> {
public:
- cViaccessCardInfos(void):cCardInfos<cViaccessCardInfo>("Viaccess cards","Viaccess.KID",false) {}
+ cViaccessCardInfos(void):cCardInfos<cViaccessCardInfo>("Viaccess cards","Viaccess.KID",0) {}
};
static cViaccessCardInfos Vcards;