APDUHeaderParser::Result<APDUHeader> APDUHeaderParser::ParseRequest(const openpal::RSlice& apdu, openpal::Logger* logger) { if (apdu.Size() < APDUHeader::REQUEST_SIZE) { FORMAT_LOGGER_BLOCK(logger, flags::WARN, "Request fragment with insufficient size of %u bytes", apdu.Size()); return Result<APDUHeader>::Error(); } return Result<APDUHeader>::Ok(APDUHeader(AppControlField(apdu[0]), FunctionCodeFromType(apdu[1])), apdu.Skip(APDUHeader::REQUEST_SIZE)); }
ParseResult NumParser::ParseRange(openpal::RSlice& buffer, Range& range, openpal::Logger* pLogger) const { if (buffer.Size() < (2 * static_cast<uint32_t>(size))) { SIMPLE_LOGGER_BLOCK(pLogger, flags::WARN, "Not enough data for start / stop"); return ParseResult::NOT_ENOUGH_DATA_FOR_RANGE; } else { range.start = this->ReadNum(buffer); range.stop = this->ReadNum(buffer); if (range.IsValid()) { return ParseResult::OK; } else { FORMAT_LOGGER_BLOCK(pLogger, flags::WARN, "start (%u) > stop (%u)", range.start, range.stop); return ParseResult::BAD_START_STOP; } } }