|
SASC-NG
DVBSoftCAM
|
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 }