void CTDriver::CTPort::performCmd(byte target,ByteVec cmd,ByteVec &resp, std::ostream *mLogger,bool consumeStatus ) { byte response[512]; ushort lenr = sizeof(response); byte sad = CTSAD_HOST; dump(mLogger,string("CTAPI->cmd ") + (target == CTDAD_CT ? "CT " : "ICC " ),cmd); byte res = dri->pCTData(mCtn,&target,&sad, ushort(cmd.size()),&cmd[0],&lenr,response); if (res!=CTERR_OK || lenr < 2) throw CTAPIError("performCmd",res,lenr,0,0); resp.resize(0); resp.insert(resp.end(),response,response+lenr); dump(mLogger,"CTAPI<-resp ",resp); if (consumeStatus) { byte SW1 = resp[ lenr - 2 ]; byte SW2 = resp[ lenr - 1 ]; if (SW1 != 0x90) { if (sad == CTDAD_CT) { if (SW1==0x64 && ( SW2 == 0x00 || SW2 == 0x01 || SW2 == 0x02) ) { throw AuthError(SW1,SW2); } } throw CardError(SW1,SW2); } resp.resize(lenr - 2); } }
string CTAPIManager::getReaderState(uint index) { string retval; ensureReaders(index); cPort *dri = mPorts[index]; // byte cmd[] = {0x20,INS_GETSTATUS,0x00,0x80,0x00}; //GET STATUS, CT, all ICC status // byte cmd[] = {0x20,INS_GETSTATUS,0x00,0x81,0x00}; //GET STATUS, CT, functional spec byte cmd[] = {0x20,INS_GETSTATUS,0x01,0x80,0x00}; //GET STATUS, ICC0, ICC0 status initclose _i(dri); ByteVec resp; dri->performCmd(CTDAD_CT,MAKEVECTOR(cmd),resp,mLogger); if(resp.size() != 3) { if (resp.size() == 2) //workaround for openct resp.insert(resp.begin(),0x80); else throw CTAPIError("getReaderState0",0,resp.size(),0,0); } if (resp[0] != 0x80) throw CTAPIError("getReaderState1",0,resp.size(),resp[0],0); byte statusICC0 = resp[2]; if (statusICC0 & 0x01) retval+= "PRESENT|"; else retval+= "EMPTY|"; if ((statusICC0 & 0x6) == 0x2) retval+= "UNPOWERED|"; if ((statusICC0 & 0x6) == 0x4) retval+= "INUSE|"; if (retval.length() > 0 ) retval = retval.substr(0,retval.length()-1); return retval; }