14#include "keyple/core/service/AbstractReaderAdapter.hpp"
20#include "keyple/core/util/KeypleAssert.hpp"
21#include "keyple/core/util/cpp/System.hpp"
22#include "keyple/core/util/cpp/exception/Exception.hpp"
23#include "keyple/core/util/cpp/exception/IllegalStateException.hpp"
24#include "keypop/card/CardBrokenCommunicationException.hpp"
25#include "keypop/card/UnexpectedStatusWordException.hpp"
31using keyple::core::util::Assert;
32using keyple::core::util::cpp::System;
33using keyple::core::util::cpp::exception::Exception;
34using keyple::core::util::cpp::exception::IllegalStateException;
35using keypop::card::CardBrokenCommunicationException;
36using keypop::card::UnexpectedStatusWordException;
38AbstractReaderAdapter::AbstractReaderAdapter(
39 const std::string& readerName,
40 std::shared_ptr<KeypleReaderExtension> readerExtension,
41 const std::string& pluginName)
42: mReaderName(readerName)
43, mReaderExtension(readerExtension)
44, mPluginName(pluginName)
51AbstractReaderAdapter::getPluginName()
const
56std::shared_ptr<KeypleReaderExtension>
57AbstractReaderAdapter::getExtension(
58 const std::type_info& )
const
62 return mReaderExtension;
65const std::vector<std::shared_ptr<CardSelectionResponseApi>>
66AbstractReaderAdapter::transmitCardSelectionRequests(
67 const std::vector<std::shared_ptr<CardSelectorBase>>& cardSelectors,
68 const std::vector<std::shared_ptr<CardSelectionRequestSpi>>&
69 cardSelectionRequests,
70 const MultiSelectionProcessing multiSelectionProcessing,
71 const ChannelControl channelControl)
75 std::vector<std::shared_ptr<CardSelectionResponseApi>>
76 cardSelectionResponses;
78 uint64_t timeStamp = System::nanoTime();
79 uint64_t elapsed10ms = (timeStamp - mBefore) / 100000;
83 "[reader=%] Send [type=CardSelectionRequests, "
84 "cardSelectionRequestCount=%, elapsedMs=%]\n",
86 cardSelectionRequests.size(),
90 cardSelectionResponses = processCardSelectionRequests(
92 cardSelectionRequests,
93 multiSelectionProcessing,
95 }
catch (
const UnexpectedStatusWordException& e) {
96 throw CardBrokenCommunicationException(
99 "An unexpected status word was received during the processing of "
100 "the card selection requests",
101 std::make_shared<UnexpectedStatusWordException>(e));
104 timeStamp = System::nanoTime();
105 elapsed10ms = (timeStamp - mBefore) / 100000;
109 "[reader=%] Receive [type=CardSelectionResponses, "
110 "cardSelectionResponseCount=%, elapsedMs=%]\n",
112 cardSelectionResponses.size(),
115 return cardSelectionResponses;
119AbstractReaderAdapter::checkStatus()
const
121 if (!mIsRegistered) {
122 throw IllegalStateException(
123 "Reader '" + getName() +
"' is not registered");
128AbstractReaderAdapter::doRegister()
130 mIsRegistered =
true;
134AbstractReaderAdapter::doUnregister()
136 mIsRegistered =
false;
140AbstractReaderAdapter::getName()
const
145const std::shared_ptr<CardResponseApi>
146AbstractReaderAdapter::transmitCardRequest(
147 const std::shared_ptr<CardRequestSpi> cardRequest,
148 const ChannelControl channelControl)
152 Assert::getInstance().notNull(cardRequest,
"cardRequest");
154 std::shared_ptr<CardResponseApi> cardResponse =
nullptr;
156 uint64_t timeStamp = System::nanoTime();
157 uint64_t elapsed10ms = (timeStamp - mBefore) / 100000;
161 "[reader=%] Send [type=CardRequest, apduRequestCount=%, "
164 cardRequest->getApduRequests().size(),
168 cardResponse = processCardRequest(cardRequest, channelControl);
169 }
catch (
const Exception& e) {
172 timeStamp = System::nanoTime();
173 elapsed10ms = (timeStamp - mBefore) / 100000;
176 "[reader=%] Receive [type=CardResponse, apduResponseCount=%, "
179 cardResponse !=
nullptr ? cardResponse->getApduResponses().size()
186 timeStamp = System::nanoTime();
187 elapsed10ms = (timeStamp - mBefore) / 100000;
190 "[%] receive => %, elapsed % ms\n",