cCiFrame frame;
//
int GetLength(const unsigned char * &data);
+ int LengthSize(int n);
+ void SetSize(int n, unsigned char * &p);
void CaInfo(int tcid, int cid);
bool Check(void);
public:
return len;
}
+int cScCamSlot::LengthSize(int n)
+{
+ return n<TDPU_SIZE_INDICATOR?1:3;
+}
+
+void cScCamSlot::SetSize(int n, unsigned char * &p)
+{
+ if(n<TDPU_SIZE_INDICATOR) *p++=n;
+ else { *p++=2|TDPU_SIZE_INDICATOR; *p++=n>>8; *p++=n&0xFF; }
+}
+
void cScCamSlot::CaInfo(int tcid, int cid)
{
- int n=9;
- for(int i=0; caids[i]; i++) n+=2;
+ int cn=0;
+ for(int i=0; caids[i]; i++) cn+=2;
+ int n=cn+8+LengthSize(cn);
+PRINTF(L_CORE_CI,"n=%d cn=%d",n,cn);
unsigned char *p;
- if(!(p=frame.GetBuff(n+(n<TDPU_SIZE_INDICATOR?2:3)))) return;
+ if(!(p=frame.GetBuff(n+1+LengthSize(n)))) return;
*p++=0xa0;
- if(n<TDPU_SIZE_INDICATOR) *p++=n;
- else { *p++=2|TDPU_SIZE_INDICATOR; *p++=n>>8; *p++=n&0xFF; }
+ SetSize(n,p);
*p++=tcid;
*p++=0x90;
*p++=0x02; *p++=cid>>8; *p++=cid&0xff;
*p++=0x9f; *p++=0x80; *p++=0x31; // AOT_CA_INFO
- *p++=n-9;
+ SetSize(cn,p);
for(int i=0; caids[i]; i++) { *p++=caids[i]>>8; *p++=caids[i]&0xff; }
frame.Put();
PRINTF(L_CORE_CI,"%d.%d sending CA info",cardIndex,slot);
for(cShare *s=shares.First(); s;) {
cShare *n=shares.Next(s);
if(s->ShareID()==shareid) {
- PRINTF(L_CC_CCCAM2SH,"REMOVE share %08x caid: %04x",s->ShareID(),s->CaID());
+ PRINTF(L_CC_CCCAM2SH,"REMOVE share %08x caid: %04x (count %d)",s->ShareID(),s->CaID(),shares.Count());
int caid=s->CaID();
shares.Del(s);
if(!shares.HasCaid(caid)) CaidsChanged();