Skip to content

Commit

Permalink
Make Reader simple struct
Browse files Browse the repository at this point in the history
Signed-off-by: Raul Metsma <raul@metsma.ee>
  • Loading branch information
metsma committed Feb 7, 2025
1 parent f47fc15 commit 695ba8b
Show file tree
Hide file tree
Showing 9 changed files with 20 additions and 306 deletions.
2 changes: 0 additions & 2 deletions lib/libpcsc-cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,8 @@ add_library(${PROJECT_NAME}
include/${PROJECT_NAME}/${PROJECT_NAME}.hpp
include/${PROJECT_NAME}/${PROJECT_NAME}-utils.hpp
include/${PROJECT_NAME}/comp_winscard.hpp
include/flag-set-cpp/flag_set.hpp
include/magic_enum/magic_enum.hpp
src/Context.hpp
src/Reader.cpp
src/SCardCall.hpp
src/SmartCard.cpp
src/listReaders.cpp
Expand Down
175 changes: 0 additions & 175 deletions lib/libpcsc-cpp/include/flag-set-cpp/flag_set.hpp

This file was deleted.

37 changes: 6 additions & 31 deletions lib/libpcsc-cpp/include/pcsc-cpp/pcsc-cpp.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@

#pragma once

#include "flag-set-cpp/flag_set.hpp"

#include <limits>
#include <memory>
#include <stdexcept>
#include <string>
#include <vector>
#include <limits>

// The rule of five (C++ Core guidelines C.21).
#define PCSC_CPP_DISABLE_COPY_MOVE(Class) \
Expand Down Expand Up @@ -253,39 +253,14 @@ class SmartCard
};

/** Reader provides card reader information, status and gives access to the smart card in it. */
class Reader
struct Reader
{
public:
enum class Status {
UNAWARE,
IGNORE,
CHANGED,
UNKNOWN,
UNAVAILABLE,
EMPTY,
PRESENT,
ATRMATCH,
EXCLUSIVE,
INUSE,
MUTE,
UNPOWERED,
_
};

Reader(ContextPtr context, string_t name, byte_vector cardAtr, flag_set<Status> status);

SmartCard::ptr connectToCard() const { return std::make_unique<SmartCard>(ctx, name, cardAtr); }

bool isCardInserted() const { return status[Status::PRESENT]; }

std::string statusString() const;

ContextPtr ctx;
const string_t name;
const byte_vector cardAtr;
const flag_set<Status> status;

private:
ContextPtr ctx;
const bool isCardInserted;
};

/**
Expand Down
54 changes: 0 additions & 54 deletions lib/libpcsc-cpp/src/Reader.cpp

This file was deleted.

45 changes: 8 additions & 37 deletions lib/libpcsc-cpp/src/listReaders.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,37 +65,6 @@ std::vector<SCARD_READERSTATE> getReaderStates(const SCARDCONTEXT ctx, const str
return readerStates;
}

inline flag_set<Reader::Status> flagSetFromReaderState(const DWORD readerState)
{
if (!readerState) {
return flag_set<Reader::Status> {Reader::Status::UNAWARE};
}

static const std::map<DWORD, Reader::Status> READER_STATUS_MAP = {
// SCARD_STATE_UNAWARE is zero and covered with (!readerState) above.
{SCARD_STATE_IGNORE, Reader::Status::IGNORE},
{SCARD_STATE_CHANGED, Reader::Status::CHANGED},
{SCARD_STATE_UNKNOWN, Reader::Status::UNKNOWN},
{SCARD_STATE_UNAVAILABLE, Reader::Status::UNAVAILABLE},
{SCARD_STATE_EMPTY, Reader::Status::EMPTY},
{SCARD_STATE_PRESENT, Reader::Status::PRESENT},
{SCARD_STATE_ATRMATCH, Reader::Status::ATRMATCH},
{SCARD_STATE_EXCLUSIVE, Reader::Status::EXCLUSIVE},
{SCARD_STATE_INUSE, Reader::Status::INUSE},
{SCARD_STATE_MUTE, Reader::Status::MUTE},
{SCARD_STATE_UNPOWERED, Reader::Status::UNPOWERED}};

auto result = flag_set<Reader::Status> {};

for (const auto& [key, value] : READER_STATUS_MAP) {
if (readerState & key) {
result.set(value);
}
}

return result;
}

string_t populateReaderNames(const SCARDCONTEXT ctx)
{
// Buffer length is in characters, not bytes.
Expand All @@ -121,12 +90,14 @@ std::vector<Reader> listReaders()

try {
auto readerNames = populateReaderNames(ctx->handle());

for (const auto& readerState : getReaderStates(ctx->handle(), readerNames)) {
readers.emplace_back(
ctx, readerState.szReader,
byte_vector {readerState.rgbAtr, std::next(readerState.rgbAtr, readerState.cbAtr)},
flagSetFromReaderState(readerState.dwEventState));
auto readerStates = getReaderStates(ctx->handle(), readerNames);
readers.reserve(readerStates.size());
for (const auto& readerState : readerStates) {
readers.push_back(
{ctx, readerState.szReader,
byte_vector {std::begin(readerState.rgbAtr),
std::next(std::begin(readerState.rgbAtr), readerState.cbAtr)},
bool(readerState.dwEventState & SCARD_STATE_PRESENT)});
}
} catch (const ScardNoReadersError& /* e */) {
}
Expand Down
7 changes: 3 additions & 4 deletions lib/libpcsc-cpp/tests/integration/test-pcsc-cpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,10 @@ TEST(pcsc_cpp_test, listReaders)
for (const auto& reader : readers) {
#ifdef _WIN32
std::wcout << L"Reader name: '" << reader.name << L"', status: '"
<< std::wstring(reader.statusString().cbegin(), reader.statusString().cend())
<< L"'" << std::endl;
<< (reader.isCardInserted ? L"PRESENT" : L"NOT") << L"'" << std::endl;
#else
std::cout << "Reader name: '" << reader.name << "', status: '" << reader.statusString()
<< "'" << std::endl;
std::cout << "Reader name: '" << reader.name << "', status: '"
<< (reader.isCardInserted ? "PRESENT" : "NOT") << "'" << std::endl;
#endif
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ TEST(pcsc_cpp_test, listReadersSuccess)
#else
EXPECT_EQ(readers[0].name, "PcscMock-reader");
#endif
EXPECT_EQ(readers[0].statusString(), "PRESENT");
EXPECT_EQ(readers[0].isCardInserted, true);
}

TEST(pcsc_cpp_test, listReadersNoReaders)
Expand Down
2 changes: 1 addition & 1 deletion src/availableSupportedCards.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ std::vector<CardInfo::ptr> availableSupportedCards()
// The list may be empty, but we cannot throw yet due to the listMsCryptoApiElectronicIDs()
// call in Windows.
for (const auto& reader : readers) {
if (!reader.isCardInserted()) {
if (!reader.isCardInserted) {
continue;
}
seenCard = true;
Expand Down
Loading

0 comments on commit 695ba8b

Please sign in to comment.