// // Created by robin on 6/28/15. // #include #include #include "ScReader.h" LPSCARDCONTEXT ScReader::_context = nullptr; ScReader::~ScReader() { disconnect(); } 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.c_str(), 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()); } std::vector> ScReader::getReaders() { std::vector> readers; DWORD readerCount = SCARD_AUTOALLOCATE; LPTSTR readersNames = nullptr; auto res = SCardListReaders(*_context, nullptr, (LPTSTR)&readersNames, &readerCount); if (res == SCARD_S_SUCCESS) { LPTSTR reader = readersNames; while (*reader) { readers.push_back(std::make_shared(reader)); reader += strlen(reader) + 1; } } SCardFreeMemory(*_context, readersNames); return readers; }