package com.simplytapp.cardagent;
import java.io.Serializable;
public class Cache implements Serializable {
private static final long serialVersionUID = 1L;
CmdRsp[] cmdRsp = null;
private void rmCmdRsp(short index)
{
CmdRsp[] tmp=null;
for(short i=0;i<cmdRsp.length;i++)
if(i==index)
{
tmp = new CmdRsp[cmdRsp.length-1];
break;
}
if(tmp!=null)
{
short j=0;
for(short i=0;i<cmdRsp.length;i++)
if(i!=index)
tmp[j++] = cmdRsp[i];
cmdRsp = tmp;
}
}
private short getMatchIndex(byte[] cmd)
{
if(cmdRsp==null)
return -1;
//check for match in cache for any command
for(short i=0;i<cmdRsp.length;i++)
{
if(cmd!=null && cmd.length>4 && cmdRsp[i].cmd.length>1 && cmd[1] == cmdRsp[i].cmd[1] &&
(short)(cmd[4]&0xff)+5<=cmd.length &&
cmdRsp[i].cmd.length<=cmd.length)
{
//command code is the same...now compare content
short j=0;
short len = (short)cmdRsp[i].cmd.length;
if(cmdRsp[i].cmd.length>4 && len>((short)(cmdRsp[i].cmd[4]&0xFF)+5))
len=(short)(5+(short)(cmdRsp[i].cmd[4]&0xFF));
for(j=0;j<len;j++)
{
if(j!=4 && cmd[j]!=cmdRsp[i].cmd[j]) //ignore length byte
break;
}
if(j==len)
{
//match!
return i;
}
}
}
return -1;
}
void addCmd(byte[] cmd, byte[] rsp)
{
if(cmd==null || rsp==null)
return;
short i = getMatchIndex(cmd);
if(i>-1)
{
rmCmdRsp(i);
}
if(cmdRsp==null)
cmdRsp = new CmdRsp[0];
CmdRsp[] tmp = new CmdRsp[cmdRsp.length+1];
for(i=0;i<cmdRsp.length;i++)
tmp[i]=cmdRsp[i];
tmp[i] = new CmdRsp(cmd,rsp);
cmdRsp = tmp;
}
byte[] getRsp(byte[] cmd)
{
short i = getMatchIndex(cmd);
if(i>-1 && i<cmdRsp.length)
return cmdRsp[i].rsp;
else
return null;
}
}