Keyple Service C++ Library - 3.3.5
Component of the Keyple C++ middleware
AbstractReaderAdapter.cpp
Go to the documentation of this file.
1/******************************************************************************
2 * Copyright (c) 2025 Calypso Networks Association https://calypsonet.org/ *
3 * *
4 * See the NOTICE file(s) distributed with this work for additional *
5 * information regarding copyright ownership. *
6 * *
7 * This program and the accompanying materials are made available under the *
8 * terms of the Eclipse Public License 2.0 which is available at *
9 * http://www.eclipse.org/legal/epl-2.0 *
10 * *
11 * SPDX-License-Identifier: EPL-2.0 *
12 ******************************************************************************/
13
14#include "keyple/core/service/AbstractReaderAdapter.hpp"
15
16#include <memory>
17#include <string>
18#include <vector>
19
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"
26
27namespace keyple {
28namespace core {
29namespace service {
30
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;
37
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)
45, mIsRegistered(false)
46, mBefore(0)
47{
48}
49
50const std::string&
51AbstractReaderAdapter::getPluginName() const
52{
53 return mPluginName;
54}
55
56std::shared_ptr<KeypleReaderExtension>
57AbstractReaderAdapter::getExtension(
58 const std::type_info& /*readerExtensionClass*/) const
59{
60 checkStatus();
61
62 return mReaderExtension;
63}
64
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)
72{
73 checkStatus();
74
75 std::vector<std::shared_ptr<CardSelectionResponseApi>>
76 cardSelectionResponses;
77
78 uint64_t timeStamp = System::nanoTime();
79 uint64_t elapsed10ms = (timeStamp - mBefore) / 100000;
80 mBefore = timeStamp;
81
82 mLogger->trace(
83 "Reader [%] --> cardSelectionRequests: %, elapsed % ms\n",
84 getName(),
85 cardSelectionRequests,
86 elapsed10ms / 10.0);
87
88 try {
89 cardSelectionResponses = processCardSelectionRequests(
90 cardSelectors,
91 cardSelectionRequests,
92 multiSelectionProcessing,
93 channelControl);
94 } catch (const UnexpectedStatusWordException& e) {
95 throw CardBrokenCommunicationException(
96 e.getCardResponse(),
97 false,
98 "An unexpected status word was received",
99 std::make_shared<UnexpectedStatusWordException>(e));
100 }
101
102 timeStamp = System::nanoTime();
103 elapsed10ms = (timeStamp - mBefore) / 100000;
104 mBefore = timeStamp;
105
106 mLogger->trace(
107 "Reader [%] <-- cardSelectionResponses: %, elapsed % ms\n",
108 getName(),
109 cardSelectionResponses,
110 elapsed10ms / 10.0);
111
112 return cardSelectionResponses;
113}
114
115void
116AbstractReaderAdapter::checkStatus() const
117{
118 if (!mIsRegistered) {
119 throw IllegalStateException(
120 "This reader, " + getName() + " is not registered");
121 }
122}
123
124void
125AbstractReaderAdapter::doRegister()
126{
127 mIsRegistered = true;
128}
129
130void
131AbstractReaderAdapter::doUnregister()
132{
133 mIsRegistered = false;
134}
135
136const std::string&
137AbstractReaderAdapter::getName() const
138{
139 return mReaderName;
140}
141
142const std::shared_ptr<CardResponseApi>
143AbstractReaderAdapter::transmitCardRequest(
144 const std::shared_ptr<CardRequestSpi> cardRequest,
145 const ChannelControl channelControl)
146{
147 checkStatus();
148
149 Assert::getInstance().notNull(cardRequest, "cardRequest");
150
151 std::shared_ptr<CardResponseApi> cardResponse = nullptr;
152
153 uint64_t timeStamp = System::nanoTime();
154 uint64_t elapsed10ms = (timeStamp - mBefore) / 100000;
155 mBefore = timeStamp;
156
157 mLogger->trace(
158 "Reader [%] --> cardRequest: %, elapsed % ms\n",
159 getName(),
160 cardRequest,
161 elapsed10ms / 10.0);
162
163 try {
164 cardResponse = processCardRequest(cardRequest, channelControl);
165 } catch (const Exception& e) {
166 /* Finally block in Java */
167 (void)e;
168 timeStamp = System::nanoTime();
169 elapsed10ms = (timeStamp - mBefore) / 100000;
170 mBefore = timeStamp;
171 mLogger->trace(
172 "Reader [%] <-- cardResponse: %, elapsed % ms\n",
173 getName(),
174 cardResponse,
175 elapsed10ms / 10.0);
176 throw;
177 }
178
179 /* Finally block in Java */
180 timeStamp = System::nanoTime();
181 elapsed10ms = (timeStamp - mBefore) / 100000;
182 mBefore = timeStamp;
183 mLogger->debug(
184 "[%] receive => %, elapsed % ms\n",
185 getName(),
186 cardResponse,
187 elapsed10ms / 10.0);
188
189 return cardResponse;
190}
191
192} /* namespace service */
193} /* namespace core */
194} /* namespace keyple */