class cCiFrame {
private:
+ cRingBufferLinear *rb;
unsigned char *mem;
int len, alen, glen;
public:
cCiFrame(void);
~cCiFrame();
+ void SetRb(cRingBufferLinear *Rb) { rb=Rb; }
unsigned char *GetBuff(int l);
- void Put(cRingBufferLinear *rb);
- unsigned char *Get(cRingBufferLinear *rb, int &l);
- void Del(cRingBufferLinear *rb);
+ void Put(void);
+ unsigned char *Get(int &l);
+ void Del(void);
+ int Avail(void);
};
cCiFrame::cCiFrame(void)
{
- mem=0; len=alen=glen=0;
+ rb=0; mem=0; len=alen=glen=0;
}
cCiFrame::~cCiFrame()
return mem+LEN_OFF;
}
-void cCiFrame::Put(cRingBufferLinear *rb)
+void cCiFrame::Put(void)
{
if(rb && mem) {
*((short *)mem)=len;
}
}
-unsigned char *cCiFrame::Get(cRingBufferLinear *rb, int &l)
+unsigned char *cCiFrame::Get(int &l)
{
if(rb) {
int c;
return 0;
}
-void cCiFrame::Del(cRingBufferLinear *rb)
+int cCiFrame::Avail(void)
+{
+ return rb ? rb->Available() : 0;
+}
+
+void cCiFrame::Del(void)
{
if(rb && glen) {
rb->Del(glen+LEN_OFF);
#define SLOT_CAID_CHECK 10000
#define SLOT_RESET_TIME 600
-class cScCamSlot : public cCamSlot, public cRingBufferLinear {
+class cScCamSlot : public cCamSlot {
private:
cScCiAdapter *ciadapter;
unsigned short caids[MAX_CI_SLOT_CAIDS+1];
bool reset, doReply;
cTimeMs resetTimer;
eModuleStatus lastStatus;
+ cRingBufferLinear rb;
cCiFrame frame;
//
int GetLength(const unsigned char * &data);
void Process(const unsigned char *data, int len);
eModuleStatus Status(void);
bool Reset(bool log=true);
+ cCiFrame *Frame(void) { return &frame; }
};
cScCamSlot::cScCamSlot(cScCiAdapter *ca, int CardIndex, int Slot)
:cCamSlot(ca)
-,cRingBufferLinear(KILOBYTE(4),5+1,false,"SC-CI slot answer")
,checkTimer(-SLOT_CAID_CHECK-1000)
+,rb(KILOBYTE(4),5+1,false,"SC-CI slot answer")
{
ciadapter=ca; cardIndex=CardIndex; slot=Slot;
version=0; caids[0]=0; doReply=false; lastStatus=msReset;
+ frame.SetRb(&rb);
Reset(false);
}
bool cScCamSlot::Reset(bool log)
{
reset=true; resetTimer.Set(SLOT_RESET_TIME);
- Clear();
+ rb.Clear();
if(log) PRINTF(L_CORE_CI,"%d.%d: reset",cardIndex,slot);
return true;
}
*p++=0x9f; *p++=0x80; *p++=0x31; // AOT_CA_INFO
*p++=n-9;
for(int i=0; caids[i]; i++) { *p++=caids[i]>>8; *p++=caids[i]&0xff; }
- frame.Put(this);
+ frame.Put();
PRINTF(L_CORE_CI,"%d.%d sending CA info",cardIndex,slot);
}
b[13]=0x00;
b[14]=0x81; // CA_ENABLE
b[10]=4; b[1]=4+9;
- frame.Put(this);
+ frame.Put();
PRINTF(L_CORE_CI,"%d.%d answer to query",cardIndex,slot);
}
}
rb=new cRingBufferLinear(KILOBYTE(8),6+1,false,"SC-CI adapter read");
if(rb) {
rb->SetTimeouts(0,CAM_READ_TIMEOUT);
+ frame.SetRb(rb);
/*
bool spare=true;
for(int i=0; i<MAX_CI_SLOTS; i++) {
cMutexLock lock(&ciMutex);
if(cam && rb && Buffer && MaxLength>0) {
int s;
- unsigned char *data=frame.Get(rb,s);
+ unsigned char *data=frame.Get(s);
if(data) {
if(s<=MaxLength) memcpy(Buffer,data,s);
else PRINTF(L_GEN_DEBUG,"internal: sc-ci %d rb frame size exceeded %d",cardIndex,s);
- frame.Del(rb);
+ frame.Del();
if(Buffer[2]!=0x80 || LOG(L_CORE_CIFULL)) {
LDUMP(L_CORE_CI,Buffer,s,"%d.%d <-",cardIndex,Buffer[0]);
readTimer.Set();
if(cam && buff && len>=5) {
struct TPDU *tpdu=(struct TPDU *)buff;
int slot=tpdu->slot;
+ cCiFrame *slotframe=slots[slot]->Frame();
if(buff[2]!=0xA0 || buff[3]>0x01 || LOG(L_CORE_CIFULL))
LDUMP(L_CORE_CI,buff,len,"%d.%d ->",cardIndex,slot);
if(slots[slot]) {
case 0x81: // T_RCV
{
int s;
- unsigned char *d=frame.Get(slots[slot],s);
+ unsigned char *d=slotframe->Get(s);
if(d) {
unsigned char *b;
if((b=frame.GetBuff(s+6))) {
TPDU(b,slot);
memcpy(b+2,d,s);
SB_TAG(b+2+s,0x00);
- frame.Put(rb);
+ frame.Put();
}
- frame.Del(slots[slot]);
+ slotframe->Del();
}
break;
}
TPDU(b,slot);
TAG(&b[2],0x83,0x01); b[4]=tcid;
SB_TAG(&b[5],0x00);
- frame.Put(rb);
+ frame.Put();
}
static const unsigned char reqCAS[] = { 0xA0,0x07,0x01,0x91,0x04,0x00,0x03,0x00,0x41 };
- if((b=frame.GetBuff(sizeof(reqCAS)))) {
+ if((b=slotframe->GetBuff(sizeof(reqCAS)))) {
memcpy(b,reqCAS,sizeof(reqCAS));
b[2]=tcid;
- frame.Put(slots[slot]);
+ slotframe->Put();
}
break;
}
unsigned char *b;
if((b=frame.GetBuff(6))) {
TPDU(b,slot);
- SB_TAG(&b[2],slots[slot]->Available()>0 ? 0x80:0x00);
- frame.Put(rb);
+ SB_TAG(&b[2],slotframe->Avail()>0 ? 0x80:0x00);
+ frame.Put();
}
break;
}