SASC-NG
DVBSoftCAM

override.c

Go to the documentation of this file.
00001 /*
00002  * Softcam plugin to VDR (C++)
00003  *
00004  * This code is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU General Public License
00006  * as published by the Free Software Foundation; either version 2
00007  * of the License, or (at your option) any later version.
00008  *
00009  * This code is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  * GNU General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU General Public License
00015  * along with this program; if not, write to the Free Software
00016  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00017  * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
00018  */
00019 
00020 #include <stdlib.h>
00021 #include <string.h>
00022 #include <unistd.h>
00023 
00024 #include <vdr/sources.h>
00025 
00026 #include "override.h"
00027 #include "global.h"
00028 #include "misc.h"
00029 #include "log-core.h"
00030 
00031 // -- cValidityRange -----------------------------------------------------------
00032 
00033 cValidityRange::cValidityRange(void)
00034 {
00035   fromCaid=toCaid=-1; fromSource=toSource=-1; fromFreq=toFreq=-1;
00036   wildcard=false;
00037 }
00038 
00039 bool cValidityRange::Match(int caid, int source, int freq) const
00040 {
00041   return wildcard ||
00042          ((caid<0 || fromCaid<0 || (toCaid<0 && caid==fromCaid) || (caid>=fromCaid && caid<=toCaid)) &&
00043           (fromSource<0 || (toSource<0 && source==fromSource) || (source>=fromSource && source<=toSource)) &&
00044           (fromFreq<0 || (toFreq<0 && freq==fromFreq) || (freq>=fromFreq && freq<=toFreq)));
00045 }
00046 
00047 char *cValidityRange::Parse3(char *s)
00048 {
00049   bool log=true;
00050   s=skipspace(s);
00051   char *e=index(s,'}');
00052   if(e && *s++=='{') {
00053     *e=0; e=skipspace(e+1);
00054     char *p;
00055     if((p=index(s,':'))) {
00056       *p=0;
00057       if(ParseCaidRange(s)) {
00058         s=p+1;
00059         if((p=index(s,':'))) {
00060           *p=0;
00061           if(s==p || ParseSourceRange(s)) {
00062             s=p+1;
00063             if(!*s || ParseFreqRange(s)) return e;
00064             }
00065           log=false;
00066           }
00067         }
00068       else log=false;
00069       }
00070     }
00071   if(log) PRINTF(L_CORE_LOAD,"override: RANGE format error");
00072   return 0;
00073 }
00074 
00075 char *cValidityRange::Parse2(char *s, bool wildAllow)
00076 {
00077   bool log=true;
00078   s=skipspace(s);
00079   char *e=index(s,'}');
00080   if(e && *s++=='{') {
00081     *e=0; e=skipspace(e+1);
00082     s=skipspace(s);
00083     if(wildAllow && *s=='*' && isempty(s+1)) {
00084       wildcard=true;
00085       return e;
00086       }
00087     char *p;
00088     if((p=index(s,':'))) {
00089       *p=0;
00090       if(ParseSourceRange(s)) {
00091         s=p+1;
00092         if(!*s || ParseFreqRange(s)) return e;
00093         }
00094       log=false;
00095       }
00096     }
00097   if(log) PRINTF(L_CORE_LOAD,"override: RANGE format error");
00098   return 0;
00099 }
00100 
00101 bool cValidityRange::ParseCaidRange(const char *str)
00102 {
00103   if(sscanf(str,"%x-%x",&fromCaid,&toCaid)<1) {
00104     PRINTF(L_CORE_LOAD,"override: CAID format error");
00105     return false;
00106     }
00107   if(fromCaid<0x0001 || fromCaid>0xFFFF ||
00108      (toCaid>0 && (toCaid<0x0001 || toCaid>0xFFFF || fromCaid>toCaid))) {
00109     PRINTF(L_CORE_LOAD,"override: CAID range error");
00110     return false;
00111     }
00112   return true;
00113 }
00114 
00115 bool cValidityRange::ParseFreqRange(const char *str)
00116 {
00117   if(sscanf(str,"%d-%d",&fromFreq,&toFreq)<1) {
00118     PRINTF(L_CORE_LOAD,"override: FREQ format error");
00119     return false;
00120     }
00121   if(fromFreq<1 || fromFreq>50000 ||
00122      (toFreq>0 && (toFreq<1 || toFreq>50000 || fromFreq>toFreq))) {
00123     PRINTF(L_CORE_LOAD,"override: FREQ range error");
00124     return false;
00125     }
00126   return true;
00127 }
00128 
00129 bool cValidityRange::ParseSourceRange(const char *str)
00130 {
00131   bool res=false;
00132   int l;
00133   char *s1=0, *s2=0;
00134   if((l=sscanf(str,"%a[^-:]-%a[^-:]",&s1,&s2))>=1) {
00135     if(s1 && (fromSource=cSource::FromString(s1))>0 &&
00136        (l<2 || (s2 && (toSource=cSource::FromString(s2))>0))) {
00137       if((cSource::IsSat(fromSource) && (toSource<0 || (cSource::IsSat(toSource) && toSource>fromSource))) ||
00138          (cSource::IsCable(fromSource) && toSource<0) ||
00139          (cSource::IsTerr(fromSource) && toSource<0)) {
00140         res=true;
00141         }
00142       else PRINTF(L_CORE_LOAD,"override: SOURCE range error");
00143       }
00144     else PRINTF(L_CORE_LOAD,"override: SOURCE parse error");
00145     }
00146   else PRINTF(L_CORE_LOAD,"override: SOURCE format error");
00147   free(s1); free(s2);
00148   return res;
00149 }
00150 
00151 cString cValidityRange::Print(void)
00152 {
00153   if(wildcard) return "*";
00154   char buff[256];
00155   int q=0;
00156   if(fromCaid>0) {
00157     q+=snprintf(buff+q,sizeof(buff)-q,"%04x",fromCaid);
00158     if(toCaid>0)
00159       q+=snprintf(buff+q,sizeof(buff)-q,"-%04x",toCaid);
00160     q+=snprintf(buff+q,sizeof(buff)-q,":");
00161     }
00162   if(fromSource>0) {
00163     q+=snprintf(buff+q,sizeof(buff)-q,"%s",*cSource::ToString(fromSource));
00164     if(toSource>0)
00165       q+=snprintf(buff+q,sizeof(buff)-q,"-%s",*cSource::ToString(toSource));
00166     }
00167   q+=snprintf(buff+q,sizeof(buff)-q,":");
00168   if(fromFreq>0) {
00169     q+=snprintf(buff+q,sizeof(buff)-q,"%d",fromFreq);
00170     if(toFreq>0)
00171       q+=snprintf(buff+q,sizeof(buff)-q,"-%d",toFreq);
00172     }
00173   return buff;
00174 }
00175 
00176 // -- cOverride ----------------------------------------------------------------
00177 
00178 #define OV_CAT      1
00179 #define OV_EMMCAID  2
00180 #define OV_ECMTABLE 3
00181 #define OV_EMMTABLE 4
00182 #define OV_TUNNEL   5
00183 #define OV_IGNORE   6
00184 #define OV_ECMPRIO  7
00185 
00186 // -- cOverrideCat -------------------------------------------------------------
00187 
00188 class cOverrideCat : public cOverride {
00189 private:
00190   int caid, pid;
00191 public:
00192   cOverrideCat(void) { type=OV_CAT; }
00193   virtual bool Parse(char *str);
00194   int GetCatEntry(unsigned char *buff);
00195   };
00196 
00197 bool cOverrideCat::Parse(char *str)
00198 {
00199   if((str=Parse2(str))) {
00200     if(sscanf(str,"%x:%x",&caid,&pid)==2) {
00201       PRINTF(L_CORE_OVER,"cat: %s - caid %04x pid %04x",*Print(),caid,pid);
00202       return true;
00203       }
00204     PRINTF(L_CORE_LOAD,"override: CAT format error");
00205     }
00206   return false;
00207 }
00208 
00209 int cOverrideCat::GetCatEntry(unsigned char *buff)
00210 {
00211   PRINTF(L_CORE_OVER,"cat: added caid %04x pid %04x",caid,pid);
00212   buff[0]=0x09;
00213   buff[1]=0x04;
00214   buff[2]=(caid>>8)&0xFF;
00215   buff[3]= caid    &0xFF;
00216   buff[4]=(pid >>8)&0xFF;
00217   buff[5]= pid     &0xFF;
00218   return 6;
00219 }
00220 
00221 // -- cOverrideEmmCaid ---------------------------------------------------------
00222 
00223 class cOverrideEmmCaid : public cOverride {
00224 private:
00225   int caid;
00226 public:
00227   cOverrideEmmCaid(void) { type=OV_EMMCAID; }
00228   virtual bool Parse(char *str);
00229   int GetCaid(bool log);
00230   };
00231 
00232 bool cOverrideEmmCaid::Parse(char *str)
00233 {
00234   if((str=Parse3(str))) {
00235     if(sscanf(str,"%x",&caid)==1) {
00236       PRINTF(L_CORE_OVER,"emmcaid: %s - caid %04x",*Print(),caid);
00237       return true;
00238       }
00239     PRINTF(L_CORE_LOAD,"override: EMMCAID format error");
00240     }
00241   return false;
00242 }
00243 
00244 int cOverrideEmmCaid::GetCaid(bool log)
00245 {
00246   if(log) PRINTF(L_CORE_OVER,"emmcaid: %04x",caid);
00247   return caid;
00248 }
00249 
00250 // -- cOverrideEcmTable --------------------------------------------------------
00251 
00252 class cOverrideEcmTable : public cOverride {
00253 private:
00254   int table;
00255 public:
00256   cOverrideEcmTable(void) { type=OV_ECMTABLE; }
00257   virtual bool Parse(char *str);
00258   int GetTable(bool log);
00259   };
00260 
00261 bool cOverrideEcmTable::Parse(char *str)
00262 {
00263   if((str=Parse3(str))) {
00264     if(sscanf(str,"%x",&table)==1) {
00265       PRINTF(L_CORE_OVER,"ecmtable: %s - table %02x",*Print(),table);
00266       return true;
00267       }
00268     PRINTF(L_CORE_LOAD,"override: ECMTABLE format error");
00269     }
00270   return false;
00271 }
00272 
00273 int cOverrideEcmTable::GetTable(bool log)
00274 {
00275   if(log) PRINTF(L_CORE_OVER,"ecmtable: %02x",table);
00276   return table;
00277 }
00278 
00279 // -- cOverrideEmmTable --------------------------------------------------------
00280 
00281 #define OV_MAXTABLES 4
00282 
00283 class cOverrideEmmTable : public cOverride {
00284 public:
00285   int num, table[OV_MAXTABLES], mask[OV_MAXTABLES];
00286   //
00287   cOverrideEmmTable(void) { type=OV_EMMTABLE; }
00288   virtual bool Parse(char *str);
00289   void AddPids(cPids *pids, int pid, int caid);
00290   };
00291 
00292 bool cOverrideEmmTable::Parse(char *str)
00293 {
00294   if((str=Parse3(str))) {
00295     num=0;
00296     int n=-1;
00297     do {
00298       mask[num]=0xFF;
00299       int l=n+1;
00300       if(sscanf(&str[l],"%x%n/%x%n",&table[num],&n,&mask[num],&n)<1) {
00301         PRINTF(L_CORE_LOAD,"override: EMMTABLE format error");
00302         return false;
00303         }
00304       n+=l; num++;
00305       } while(num<OV_MAXTABLES && str[n]==':');
00306     LBSTART(L_CORE_OVER);
00307     LBPUT("emmtable: %s - tables",*Print());
00308     for(int i=0; i<num; i++) LBPUT(" %02x/%02x",table[i],mask[i]);
00309     LBEND();
00310     return true;
00311     }
00312   return false;
00313 }
00314 
00315 void cOverrideEmmTable::AddPids(cPids *pids, int pid, int caid)
00316 {
00317   LBSTARTF(L_CORE_OVER);
00318   LBPUT("emmtable: %04x:",caid);
00319   for(int i=0; i<num; i++) {
00320     LBPUT(" %02x/%02x",table[i],mask[i]);
00321     pids->AddPid(pid,table[i],mask[i]);
00322     }
00323   LBEND();
00324 }
00325 
00326 // -- cRewriter ----------------------------------------------------------------
00327 
00328 cRewriter::cRewriter(const char *Name, int Id)
00329 {
00330   name=Name; id=Id;
00331   mem=0; mlen=0;
00332 }
00333 
00334 cRewriter::~cRewriter()
00335 {
00336   free(mem);
00337 }
00338 
00339 unsigned char *cRewriter::Alloc(int len)
00340 {
00341   if(!mem || mlen<len) {
00342     free(mem);
00343     if(len<256) len=256;
00344     mem=MALLOC(unsigned char,len);
00345     mlen=len;
00346     }
00347   if(!mem) PRINTF(L_CORE_OVER,"rewriter %s: failed to alloc rewrite buffer",name);
00348   return mem;
00349 }
00350 
00351 // -- cRewriterNagraBeta -------------------------------------------------------
00352 
00353 #define RWID_NAGRA_BETA   1001
00354 #define RWNAME_NAGRA_BETA "nagra-beta"
00355 
00356 class cRewriterNagraBeta : public cRewriter {
00357 public:
00358   cRewriterNagraBeta(void);
00359   virtual bool Rewrite(unsigned char *&data, int &len);
00360   };
00361 
00362 cRewriterNagraBeta::cRewriterNagraBeta(void)
00363 :cRewriter(RWNAME_NAGRA_BETA,RWID_NAGRA_BETA)
00364 {}
00365 
00366 bool cRewriterNagraBeta::Rewrite(unsigned char *&data, int &len)
00367 {
00368   unsigned char *d=Alloc(len+10);
00369   if(d) {
00370     static const unsigned char tunnel[] = { 0xc9,0x00,0x00,0x00,0x01,0x10,0x10,0x00,0x48,0x12 };
00371     d[0]=data[0];
00372     SetSctLen(d,len+7);
00373     memcpy(&d[3],tunnel,sizeof(tunnel));
00374     memcpy(&d[13],&data[3],len-3);
00375     if(len>0x88) { // assume N3
00376       d[3]=0xc7; d[11]=0x87;
00377       }
00378     if(d[0]&0x01) d[12]++;
00379 
00380     data=d; len+=10;
00381     return true;
00382     }
00383   return false;
00384 }
00385 
00386 // -- cRewriters ---------------------------------------------------------------
00387 
00388 cRewriter *cRewriters::CreateById(int id)
00389 {
00390   switch(id) {
00391     case RWID_NAGRA_BETA: return new cRewriterNagraBeta;
00392     default: return 0;
00393     }
00394 }
00395 
00396 int cRewriters::GetIdByName(const char *name)
00397 {
00398   if(!strcasecmp(name,RWNAME_NAGRA_BETA)) return RWID_NAGRA_BETA;
00399   else return 0;
00400 }
00401 
00402 // -- cOverrideTunnel ----------------------------------------------------------
00403 
00404 class cOverrideTunnel : public cOverride {
00405 private:
00406   int caid, rewriterId;
00407 public:
00408   cOverrideTunnel(void) { type=OV_TUNNEL; }
00409   virtual bool Parse(char *str);
00410   int GetTunnel(int *id, bool log);
00411   };
00412 
00413 bool cOverrideTunnel::Parse(char *str)
00414 {
00415   bool res=false;
00416   if((str=Parse3(str))) {
00417     char *name=0;
00418     if(sscanf(str,"%x:%a[^:]",&caid,&name)>=1) {
00419       char rw[48];
00420       if(name) {
00421         if((rewriterId=cRewriters::GetIdByName(name))>0) {
00422           snprintf(rw,sizeof(rw),"%s(%d)",name,rewriterId);
00423           res=true;
00424           }
00425         else PRINTF(L_CORE_LOAD,"override: REWRITER name error");
00426         }
00427       else {
00428         strcpy(rw,"<none>");
00429         rewriterId=0;
00430         res=true;
00431         }
00432       if(res) {
00433         PRINTF(L_CORE_OVER,"tunnel: %s - to %04x, rewriter %s",*Print(),caid,rw);
00434         }
00435       }
00436     else PRINTF(L_CORE_LOAD,"override: TUNNEL format error");
00437     free(name);
00438     }
00439   return res;
00440 }
00441 
00442 int cOverrideTunnel::GetTunnel(int *id, bool log)
00443 {
00444   if(log) PRINTF(L_CORE_OVER,"tunnel: to %04x (%d)",caid,rewriterId);
00445   if(id) *id=rewriterId;
00446   return caid;
00447 }
00448 
00449 // -- cOverrideIgnore ----------------------------------------------------------
00450 
00451 #define OV_MAXIGNORES 64
00452 
00453 class cOverrideIgnore : public cOverride {
00454 private:
00455   int num, caid[OV_MAXIGNORES];
00456 public:
00457   cOverrideIgnore(void) { type=OV_IGNORE; }
00458   virtual bool Parse(char *str);
00459   bool Ignore(int Caid);
00460   };
00461 
00462 bool cOverrideIgnore::Parse(char *str)
00463 {
00464   if((str=Parse2(str,true))) {
00465     num=0;
00466     int n=-1;
00467     do {
00468       int l=n+1;
00469       if(sscanf(&str[l],"%x%n",&caid[num],&n)!=1) {
00470         PRINTF(L_CORE_LOAD,"override: IGNORE format error");
00471         return false;
00472         }
00473       n+=l; num++;
00474       } while(num<OV_MAXIGNORES && str[n]==':');
00475     LBSTART(L_CORE_OVER);
00476     LBPUT("ignore: %s - caids",*Print());
00477     for(int i=0; i<num; i++) LBPUT(" %02x",caid[i]);
00478     LBEND();
00479     return true;
00480     }
00481   return false;
00482 }
00483 
00484 bool cOverrideIgnore::Ignore(int Caid)
00485 {
00486   for(int i=0; i<num; i++)
00487     if(Caid==caid[i]) return true;
00488   return false;
00489 }
00490 
00491 // -- cOverrideEcmPrio ---------------------------------------------------------
00492 
00493 #define OV_MAXPRIOS 16
00494 
00495 class cOverrideEcmPrio : public cOverride {
00496 private:
00497   int num, caid[OV_MAXPRIOS], prov[OV_MAXPRIOS];
00498   //
00499   bool UsesProvId(int caid);
00500 public:
00501   cOverrideEcmPrio(void) { type=OV_ECMPRIO; }
00502   virtual bool Parse(char *str);
00503   int GetPrio(int Caid, int Prov);
00504   };
00505 
00506 bool cOverrideEcmPrio::Parse(char *str)
00507 {
00508   if((str=Parse2(str))) {
00509     num=0;
00510     int n=-1;
00511     do {
00512       prov[num]=-1;
00513       int l=n+1;
00514       if(sscanf(&str[l],"%x%n/%x%n",&caid[num],&n,&prov[num],&n)<1) {
00515         PRINTF(L_CORE_LOAD,"override: ECMPRIO format error");
00516         return false;
00517         }
00518       if(prov[num]>=0 && !UsesProvId(caid[num])) {
00519         PRINTF(L_CORE_LOAD,"override: ECMPRIO provider ID not supported for caid %04x",caid[num]);
00520         return false;
00521         }
00522       n+=l; num++;
00523       } while(num<OV_MAXPRIOS && str[n]==':');
00524     LBSTART(L_CORE_OVER);
00525     LBPUT("ecmprio: %s - chain",*Print());
00526     for(int i=0; i<num; i++) LBPUT(prov[i]>=0 ? " %04x/%x":" %04x",caid[i],prov[i]);
00527     LBEND();
00528     return true;
00529     }
00530   return false;
00531 }
00532 
00533 bool cOverrideEcmPrio::UsesProvId(int caid)
00534 {
00535   switch(caid>>8) {
00536     case 0x01:
00537     case 0x05: return true;
00538     }
00539   return false;
00540 }
00541 
00542 int cOverrideEcmPrio::GetPrio(int Caid, int Prov)
00543 {
00544   int pri=0;
00545   for(int i=0; i<num; i++) {
00546     if(Caid==caid[i] && (prov[i]<0 || Prov==prov[i])) break;
00547     pri--;
00548     }
00549   PRINTF(L_CORE_OVER,"ecmprio: %04x/%x pri %d",Caid,Prov,pri);
00550   return pri;
00551 }
00552 
00553 // -- cOverrides ---------------------------------------------------------------
00554 
00555 cOverrides overrides;
00556 
00557 cOverrides::cOverrides(void)
00558 :cStructList<cOverride>("overrides","override.conf",SL_MISSINGOK|SL_WATCH|SL_VERBOSE)
00559 {}
00560 
00561 void cOverrides::PreLoad(void)
00562 {
00563   caidTrigger=false;
00564 }
00565 
00566 void cOverrides::PostLoad(void)
00567 {
00568   if(caidTrigger) cGlobal::CaidsChanged();
00569 }
00570 
00571 cOverride *cOverrides::ParseLine(char *line)
00572 {
00573   cOverride *ov=0;
00574   line=skipspace(line);
00575   char *p=index(line,':');
00576   if(p) {
00577     *p++=0;
00578     if(!strncasecmp(line,"cat",3)) ov=new cOverrideCat;
00579     else if(!strncasecmp(line,"emmcaid",7)) ov=new cOverrideEmmCaid;
00580     else if(!strncasecmp(line,"ecmtable",8)) ov=new cOverrideEcmTable;
00581     else if(!strncasecmp(line,"emmtable",8)) ov=new cOverrideEmmTable;
00582     else if(!strncasecmp(line,"tunnel",6)) ov=new cOverrideTunnel;
00583     else if(!strncasecmp(line,"ignore",6)) { ov=new cOverrideIgnore; caidTrigger=true; }
00584     else if(!strncasecmp(line,"ecmprio",7)) ov=new cOverrideEcmPrio;
00585     if(ov && !ov->Parse(p)) { delete ov; ov=0; }
00586     }
00587   return ov;
00588 }
00589 
00590 cOverride *cOverrides::Find(int type, int caid, int source, int transponder, cOverride *ov)
00591 {
00592   for(ov=ov?Next(ov):First(); ov; ov=Next(ov))
00593     if(ov->Type()==type && ov->Match(caid,source,transponder%100000)) break;
00594   return ov;
00595 }
00596 
00597 int cOverrides::GetCat(int source, int transponder, unsigned char *buff, int len)
00598 {
00599   int n=0;
00600   ListLock(false);
00601   for(cOverride *ov=0; (ov=Find(OV_CAT,-1,source,transponder,ov)) && n<len-32;) {
00602     cOverrideCat *ovc=dynamic_cast<cOverrideCat *>(ov);
00603     if(ovc) n+=ovc->GetCatEntry(&buff[n]);
00604     }
00605   ListUnlock();
00606   return n;
00607 }
00608 
00609 void cOverrides::UpdateEcm(cEcmInfo *ecm, bool log)
00610 {
00611   ListLock(false);
00612   cOverrideEcmTable *ovt=dynamic_cast<cOverrideEcmTable *>(Find(OV_ECMTABLE,ecm->caId,ecm->source,ecm->transponder));
00613   if(ovt) ecm->ecm_table=ovt->GetTable(log);
00614   cOverrideEmmCaid *ovc=dynamic_cast<cOverrideEmmCaid *>(Find(OV_EMMCAID,ecm->caId,ecm->source,ecm->transponder));
00615   if(ovc) ecm->emmCaId=ovc->GetCaid(log);
00616   cOverrideTunnel *ovu=dynamic_cast<cOverrideTunnel *>(Find(OV_TUNNEL,ecm->caId,ecm->source,ecm->transponder));
00617   if(ovu) {
00618     if(ecm->emmCaId==0) ecm->emmCaId=ecm->caId;
00619     ecm->caId=ovu->GetTunnel(&ecm->rewriterId,log);
00620     ecm->provId=0;
00621     if(ecm->rewriterId) ecm->rewriter=cRewriters::CreateById(ecm->rewriterId);
00622     }
00623   ListUnlock();
00624 }
00625 
00626 bool cOverrides::AddEmmPids(int caid, int source, int transponder, cPids *pids, int pid)
00627 {
00628   bool res=false;
00629   ListLock(false);
00630   cOverrideEmmTable *ovt=dynamic_cast<cOverrideEmmTable *>(Find(OV_EMMTABLE,caid,source,transponder));
00631   if(ovt) {
00632     ovt->AddPids(pids,pid,caid);
00633     res=true;
00634     }
00635   ListUnlock();
00636   return res;
00637 }
00638 
00639 bool cOverrides::Ignore(int source, int transponder, int caid)
00640 {
00641   bool res=false;
00642   ListLock(false);
00643   for(cOverride *ov=0; (ov=Find(OV_IGNORE,-1,source,transponder,ov)) && !res;) {
00644     cOverrideIgnore *ovi=dynamic_cast<cOverrideIgnore *>(ov);
00645     if(ovi && ovi->Ignore(caid)) res=true;
00646     }
00647   ListUnlock();
00648   return res;
00649 }
00650 
00651 int cOverrides::GetEcmPrio(int source, int transponder, int caid, int prov)
00652 {
00653   int pri=0;
00654   ListLock(false);
00655   cOverrideEcmPrio *ovp=dynamic_cast<cOverrideEcmPrio *>(Find(OV_ECMPRIO,-1,source,transponder));
00656   if(ovp) pri=ovp->GetPrio(caid,prov);
00657   ListUnlock();
00658   return pri;
00659 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines