// // Created by robin on 6/28/15. // #include #include "ScReader.h" ScReader::~ScReader() { freeContext(); } bool ScReader::establishContext() { if (!freeContext()) return false; _context = new SCARDCONTEXT[1]; auto res = SCardEstablishContext(SCARD_SCOPE_SYSTEM, nullptr, nullptr, _context); return res == SCARD_S_SUCCESS; } bool ScReader::freeContext() { if (!_context) return true; auto res = SCardReleaseContext(*_context); delete[] _context; _context = nullptr; return res == SCARD_S_SUCCESS; } bool ScReader::connect(DWORD shareMode, DWORD protocols, DWORD disposition) { if (!disconnect(disposition)) return false; _card = new SCARDCONTEXT[1]; _proto = new DWORD[1]; auto res = SCardConnect(*_context, _name, shareMode, protocols, _card, _proto); return res == SCARD_S_SUCCESS; } bool ScReader::disconnect(DWORD disposition) { if (!_card) return true; auto res = SCardDisconnect(*_card, disposition); delete[] _proto; _proto = nullptr; delete[] _card; _card = nullptr; return res == SCARD_S_SUCCESS; } std::shared_ptr ScReader::transmit(const ScCommand& command, DWORD size) { auto data = command.getData(); auto resBuffer = new BYTE[size]; auto res = SCardTransmit(*_card, _sendPci, data.getData(), data.getSize(), nullptr, resBuffer, &size); if (res == SCARD_S_SUCCESS) return std::make_shared(ScByteArray(resBuffer, size)); return std::make_shared(ScByteArray()); }