14#include "keyple/core/service/AbstractPluginAdapter.hpp"
22#include "keyple/core/service/AbstractReaderAdapter.hpp"
23#include "keyple/core/service/LocalConfigurableReaderAdapter.hpp"
24#include "keyple/core/service/ObservableLocalConfigurableReaderAdapter.hpp"
25#include "keyple/core/util/cpp/StringUtils.hpp"
26#include "keyple/core/util/cpp/exception/Exception.hpp"
27#include "keyple/core/util/cpp/exception/IllegalArgumentException.hpp"
28#include "keyple/core/util/cpp/exception/IllegalStateException.hpp"
34using keyple::core::util::cpp::StringUtils;
35using keyple::core::util::cpp::exception::Exception;
36using keyple::core::util::cpp::exception::IllegalArgumentException;
37using keyple::core::util::cpp::exception::IllegalStateException;
39AbstractPluginAdapter::AbstractPluginAdapter(
40 const std::string& pluginName,
41 std::shared_ptr<KeyplePluginExtension> pluginExtension)
42: mPluginName(pluginName)
43, mPluginExtension(pluginExtension)
48std::shared_ptr<LocalReaderAdapter>
49AbstractPluginAdapter::buildLocalReaderAdapter(
50 std::shared_ptr<ReaderSpi> readerSpi)
52 std::shared_ptr<LocalReaderAdapter> adapter =
nullptr;
54 const auto& observable
55 = std::dynamic_pointer_cast<ObservableReaderSpi>(readerSpi);
56 const auto& configurable
57 = std::dynamic_pointer_cast<ConfigurableReaderSpi>(readerSpi);
62 = std::make_shared<ObservableLocalConfigurableReaderAdapter>(
63 configurable, getName());
65 adapter = std::make_shared<ObservableLocalReaderAdapter>(
66 observable, getName());
68 }
else if (configurable) {
69 adapter = std::make_shared<LocalConfigurableReaderAdapter>(
70 configurable, getName());
72 adapter = std::make_shared<LocalReaderAdapter>(readerSpi, getName());
79AbstractPluginAdapter::checkStatus()
const
82 throw IllegalStateException(
83 "Plugin [" + mPluginName +
"] is not or no longer registered");
88AbstractPluginAdapter::doRegister()
94AbstractPluginAdapter::doUnregister()
96 mIsRegistered =
false;
98 for (
const auto& pair : mReaders) {
100 std::dynamic_pointer_cast<AbstractReaderAdapter>(pair.second)
102 }
catch (
const Exception& e) {
104 "Error unregistering reader [%] %'\n",
105 pair.second->getName(),
111 mIsRegistered =
false;
115AbstractPluginAdapter::getName()
const
120std::shared_ptr<KeyplePluginExtension>
121AbstractPluginAdapter::getExtension(
122 const std::type_info& pluginExtensionClass)
const
124 (void)pluginExtensionClass;
128 return mPluginExtension;
131std::shared_ptr<KeypleReaderExtension>
132AbstractPluginAdapter::getReaderExtension(
133 const std::type_info& readerExtensionClass,
134 const std::string& readerName)
const
138 const auto reader = std::dynamic_pointer_cast<AbstractReaderAdapter>(
139 getReader(readerName));
140 if (reader ==
nullptr) {
141 throw IllegalArgumentException(
142 "Reader [" + readerName +
"] not found!");
145 return reader->getExtension(readerExtensionClass);
148std::map<const std::string, std::shared_ptr<CardReader>>&
149AbstractPluginAdapter::getReadersMap()
154const std::vector<std::string>
155AbstractPluginAdapter::getReaderNames()
const
159 std::vector<std::string> readerNames;
160 for (
const auto& pair : mReaders) {
161 readerNames.push_back(pair.first);
167const std::vector<std::shared_ptr<CardReader>>
168AbstractPluginAdapter::getReaders()
const
172 std::vector<std::shared_ptr<CardReader>> readers;
173 for (
const auto& pair : mReaders) {
174 readers.push_back(pair.second);
180std::shared_ptr<CardReader>
181AbstractPluginAdapter::getReader(
const std::string& name)
const
185 if (mReaders.find(name) != mReaders.end()) {
186 return mReaders.at(name);
192std::shared_ptr<CardReader>
193AbstractPluginAdapter::findReader(
const std::string& readerNameRegex)
const
195 for (
const auto& reader : mReaders) {
197 if (StringUtils::matches(
198 reader.second->getName(), readerNameRegex)) {
199 return reader.second;
202 }
catch (
const std::regex_error& e) {
203 throw IllegalArgumentException(
204 "readerNameRegex is invalid: " + std::string(e.what()));