31using namespace keyple::core::util;
32using namespace keyple::core::util::cpp;
35const std::map<const int, const std::shared_ptr<StatusProperties>>
36 CmdCardReadRecords::STATUS_TABLE = initStatusTable();
40 const uint8_t firstRecordNumber,
42 const uint8_t expectedLength)
45 mFirstRecordNumber(firstRecordNumber),
48 const uint8_t p1 =
static_cast<uint8_t
>(firstRecordNumber);
49 uint8_t p2 = sfi == 0x00 ? 0x05 :
static_cast<uint8_t
>((sfi * 8) + 5);
53 const uint8_t le = expectedLength;
56 std::make_shared<ApduRequestAdapter>(
61 std::stringstream extraInfo;
62 extraInfo <<
"SFI: " << sfi <<
"h, "
63 <<
"REC: " << firstRecordNumber <<
", "
64 <<
"READMODE: " << readMode <<
", "
65 <<
"EXPECTEDLENGTH: " << expectedLength;
74const std::map<const int, const std::shared_ptr<StatusProperties>>
75 CmdCardReadRecords::initStatusTable()
77 std::map<const int, const std::shared_ptr<StatusProperties>> m =
81 std::make_shared<StatusProperties>(
"Command forbidden on binary files",
84 std::make_shared<StatusProperties>(
"Security conditions not fulfilled (PIN code " \
85 "not presented, encryption required).",
86 typeid(CardSecurityContextException))});
88 std::make_shared<StatusProperties>(
"Access forbidden (Never access mode, stored " \
89 "value log file and a stored value operation was" \
90 " done during the current session).",
91 typeid(CardAccessForbiddenException))});
93 std::make_shared<StatusProperties>(
"Command not allowed (no current EF)",
94 typeid(CardDataAccessException))});
96 std::make_shared<StatusProperties>(
"File not found",
97 typeid(CardDataAccessException))});
99 std::make_shared<StatusProperties>(
"Record not found (record index is 0, or above " \
101 typeid(CardDataAccessException))});
103 std::make_shared<StatusProperties>(
"P2 value not supported",
104 typeid(CardIllegalParameterException))});
109const std::map<const int, const std::shared_ptr<StatusProperties>>&
116 const std::shared_ptr<ApduResponseApi> apduResponse)
120 if (apduResponse->getDataOut().size() > 0) {
122 mRecords.insert({mFirstRecordNumber, apduResponse->getDataOut()});
124 const std::vector<uint8_t> mApdu = apduResponse->getDataOut();
125 uint8_t apduLen =
static_cast<uint8_t
>(mApdu.size());
127 while (apduLen > 0) {
128 const uint8_t recordNb = mApdu[index++];
129 const uint8_t len = mApdu[index++];
130 mRecords.insert({recordNb, Arrays::copyOfRange(mApdu, index, index + len)});
132 apduLen -= (2 + len);
147 return mFirstRecordNumber;
166 os <<
"MULTIPLE_RECORD";
static const std::map< const int, const std::shared_ptr< StatusProperties > > STATUS_TABLE
virtual void addSubName(const std::string &subName) final
virtual void setApduRequest(const std::shared_ptr< ApduRequestAdapter > apduRequest) final
AbstractCardCommand & setApduResponse(const std::shared_ptr< ApduResponseApi > apduResponse) override
static const CalypsoCardCommand READ_RECORDS
uint8_t getInstructionByte() const
CmdCardReadRecords(const CalypsoCardClass calypsoCardClass, const uint8_t sfi, const uint8_t firstRecordNumber, const ReadMode readMode, const uint8_t expectedLength)
ReadMode getReadMode() const
bool isSessionBufferUsed() const override
const std::map< const uint8_t, const std::vector< uint8_t > > & getRecords() const
const std::map< const int, const std::shared_ptr< StatusProperties > > & getStatusTable() const override
uint8_t getFirstRecordNumber() const
CmdCardReadRecords & setApduResponse(const std::shared_ptr< ApduResponseApi > apduResponse) override
std::ostream & operator<<(std::ostream &os, const std::shared_ptr< ApduRequestAdapter > ara)