14#include "keyple/core/service/LocalPoolPluginAdapter.hpp"
22#include "keyple/core/common/KeypleReaderExtension.hpp"
23#include "keyple/core/plugin/PluginIOException.hpp"
24#include "keyple/core/plugin/spi/reader/PoolReaderSpi.hpp"
25#include "keyple/core/service/KeyplePluginException.hpp"
26#include "keyple/core/util/KeypleAssert.hpp"
27#include "keyple/core/util/cpp/exception/Exception.hpp"
33using keyple::core::common::KeypleReaderExtension;
34using keyple::core::plugin::PluginIOException;
35using keyple::core::plugin::spi::reader::PoolReaderSpi;
36using keyple::core::util::Assert;
37using keyple::core::util::cpp::exception::Exception;
39LocalPoolPluginAdapter::LocalPoolPluginAdapter(
40 std::shared_ptr<PoolPluginSpi> poolPluginSpi)
41: AbstractPluginAdapter(
42 poolPluginSpi->getName(),
43 std::dynamic_pointer_cast<KeyplePluginExtension>(poolPluginSpi))
44, mPoolPluginSpi(poolPluginSpi)
49LocalPoolPluginAdapter::doUnregister()
52 mPoolPluginSpi->onUnregister();
53 }
catch (
const Exception& e) {
55 "[plugin=%] Failed to unregister plugin extension [reason=%]\n",
60 AbstractPluginAdapter::doUnregister();
63const std::vector<std::string>
64LocalPoolPluginAdapter::getReaderGroupReferences()
const
69 return mPoolPluginSpi->getReaderGroupReferences();
70 }
catch (
const PluginIOException& e) {
71 throw KeyplePluginException(
72 std::string(
"Plugin '") + getName()
73 +
"' failed to retrieve reader group references",
78std::shared_ptr<CardReader>
79LocalPoolPluginAdapter::allocateReader(
const std::string& readerGroupReference)
84 "[plugin=%] Allocating reader [readerGroupReference=%]\n",
86 readerGroupReference);
88 Assert::getInstance().notEmpty(
89 readerGroupReference,
"readerGroupReference");
91 std::shared_ptr<ReaderSpi> readerSpi =
nullptr;
94 readerSpi = mPoolPluginSpi->allocateReader(readerGroupReference);
95 }
catch (
const PluginIOException& e) {
96 throw KeyplePluginException(
97 std::string(
"Plugin '") + getName()
98 +
"' failed to allocate reader of reader group reference: "
99 + readerGroupReference,
103 std::shared_ptr<LocalReaderAdapter> localReaderAdapter
104 = buildLocalReaderAdapter(readerSpi);
105 getReadersMap().insert({localReaderAdapter->getName(), localReaderAdapter});
106 localReaderAdapter->doRegister();
108 mLogger->debug(
"[plugin=%] Reader allocated\n", getName());
110 return localReaderAdapter;
114LocalPoolPluginAdapter::releaseReader(std::shared_ptr<CardReader> reader)
119 "[plugin=%] Releasing reader [reader=%]\n",
121 reader !=
nullptr ? reader->getName() :
"null");
123 Assert::getInstance().notNull(reader,
"reader");
126 mPoolPluginSpi->releaseReader(
127 std::dynamic_pointer_cast<LocalReaderAdapter>(reader)
131 getReadersMap().erase(reader->getName());
132 std::dynamic_pointer_cast<LocalReaderAdapter>(reader)->doUnregister();
134 }
catch (
const PluginIOException& e) {
136 getReadersMap().erase(reader->getName());
137 std::dynamic_pointer_cast<LocalReaderAdapter>(reader)->doUnregister();
138 throw KeyplePluginException(
139 std::string(
"Plugin '") + getName()
140 +
"failed to release reader:" + reader->getName(),
144 mLogger->debug(
"[plugin=%] Reader released\n", getName());
147std::shared_ptr<SmartCard>
148LocalPoolPluginAdapter::getSelectedSmartCard(
149 const std::shared_ptr<CardReader> reader)
151 Assert::getInstance().notNull(reader,
"reader");
153 auto poolReaderSpi = std::dynamic_pointer_cast<PoolReaderSpi>(
154 getReaderExtension(
typeid(KeypleReaderExtension), reader->getName()));
156 return std::dynamic_pointer_cast<SmartCard>(
157 poolReaderSpi->getSelectedSmartCard());