bool GzippedFileReader::Open(const wxString& fileName) { Close(); m_filename = fileName; if (!(m_src = PX_fopen_rb(m_filename)) || !CanHandle(fileName) || !OkIndex()) { Close(); return false; }; AsyncPrefetchOpen(); return true; };
bool cCardClientRadegast::ProcessECM(const cEcmInfo *ecm, const unsigned char *source, unsigned char *cw) { cMutexLock lock(this); if((!so.Connected() && !Login()) || !CanHandle(ecm->caId)) return false; so.Flush(); int len=SCT_LEN(source); int keynr=-1; switch(ecm->caId>>8) { case 0x01: // Seca keynr=cParseSeca::KeyNr(source)&0x0F; break; case 0x05: // Viaccess keynr=cParseViaccess::KeyNr(source); break; case 0x18: // Nagra2 if(ecm->caId>=0x1801) keynr=(source[7]&0x10) | 0x86; break; } unsigned char buff[512], tmp[10]; StartMsg(buff,1); // CMD_ECM_KEY_ASK AddNano(buff,2,1,ecm->caId>>8); // ECM_NANO_CAID_INDEX (old) AddNano(buff,10,2,ecm->caId); // ECM_NANO_CAID sprintf((char *)tmp,"%08X",ecm->provId); AddNano(buff,6,8,tmp); // ECM_NANO_PROVIDER if(keynr>=0) { sprintf((char *)tmp,"%04X",keynr); AddNano(buff,7,4,tmp); // ECM_NANO_KEYNO } if(!CheckLength(buff,len)) return false; AddNano(buff,3,len,source); // ECM_NANO_PACKET if(!Send(buff) || (len=Recv(buff,sizeof(buff)))<0) return false; if(buff[0]==2) { for(int l=GetNanoStart(buff); l<len; l+=buff[l+1]+2) { switch(buff[l]) { case 0x05: if(buff[l+1]==16) { // check for zero cw, as someone may not send both cw's every time if(!CheckNull(buff+l+ 2,8)) memcpy(cw+0,buff+l+ 2,8); if(!CheckNull(buff+l+10,8)) memcpy(cw+8,buff+l+10,8); return true; } else PRINTF(L_CC_RDGD,"wrong cw length %d from server",buff[l+1]); break; case 0x04: PRINTF(L_CC_ECM,"%s: key not available from server",name); break; default: PRINTF(L_CC_RDGD,"unknown nano %02x in ECM response",buff[l]); break; } } } else PRINTF(L_CC_RDGD,"bad ECM response from server %02x != 02",buff[0]); return false; }
void stdXmlHandler::CreateChildrenPrivately(xmlNode *rootnode) { xmlNode *root; if (rootnode == NULL) root = m_node; else root = rootnode; xmlNode *n = root->children; while (n != NULL) { if (CanHandle(n)) { CreateResource(n,stdEmptyString, NULL); } n = n->next; } }
bool cCardClientGbox::ProcessECM(const cEcmInfo *ecm, const unsigned char *data, unsigned char *cw, int cardnum) { cMutexLock lock(this); if((!so.Connected() && !Login()) || !CanHandle(ecm->caId)) return false; so.Flush(); const int caid=ecm->caId; const int pid =ecm->ecm_pid; int n; const unsigned char *descr=ecm->GetCaDescr(&n); if(!descr) { PRINTF(L_CC_GBOX,"no CA descriptor for caid %04x sid %d prov %04x",caid,ecm->prgId,ecm->provId); return false; } static const unsigned char pmt[] = { 0x87, 0x02,0xb0,0x25, // tid, sct len 0x17,0x74, // sid 0xc3,0x00,0x00, // vers, sctnr 0xff,0xec, // pcr pid 0xf0,0x00, // prg info len 0x02, 0xff,0xec, 0xf0,0x00 }; unsigned char buff[512]; if(sizeof(pmt)+n+8>sizeof(buff)) { PRINTF(L_CC_GBOX,"CA descriptor buffer overflow %d",sizeof(pmt)+n+8); return false; } memcpy(buff,pmt,sizeof(pmt)); buff[4]=ecm->prgId >> 8; buff[5]=ecm->prgId & 0xFF; memcpy(&buff[sizeof(pmt)],descr,n); buff[16]=0xF0 | ((n>>8)&0x0F); buff[17]=n & 0xFF; SetSctLen(&buff[1],sizeof(pmt)-4+n+4); buff[2]=(buff[2]&0x0F)|0xB0; if(so.SendTo("127.0.0.1",8004,buff,sizeof(pmt)+n+4)<0) { PRINTF(L_CC_GBOX,"failed to send PMT data. GBOX running?"); return false; } if((n=GetMsg(0x8a,buff,sizeof(buff)))<0) { PRINTF(L_CC_GBOX,"failed to get ECM port. GBOX running?"); return false; } int pidnum=-1; if(n>=2) { for(int i=0 ; i<buff[1]; i++) { if(WORD(buff,2+i*2,0x1FFF)==pid) { pidnum=i; break; } } } if(pidnum<0) { PRINTF(L_CC_ECM,"%s: unable to decode for CAID %04X/PID %04X",name,caid,pid); return false; } n=SCT_LEN(data); if(n>=256) { PRINTF(L_CC_ECM,"%s: ECM section too long %d > 255",name,n); return false; } buff[0]=0x88; buff[1]=(pid>>8)&0x1F; buff[2]=pid & 0xFF; buff[3]=n; memcpy(&buff[4],data,n); n+=4; if(so.SendTo("127.0.0.1",8005+pidnum,buff,n)<0) { PRINTF(L_CC_GBOX,"failed to send ECM data. GBOX running?"); return false; } if(GetMsg(0x89,buff,sizeof(buff))<0) { PRINTF(L_CC_GBOX,"failed to get CW. GBOX running?"); return false; } if(n<17) { PRINTF(L_CC_GBOX,"bad CW answer from GBOX"); return false; } memcpy(cw,&buff[1],16); return true; }