Keyple Service C++ Library - 3.4.1
Component of the Keyple C++ middleware
LocalPoolPluginAdapter.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/LocalPoolPluginAdapter.hpp"
15
16#include <memory>
17#include <string>
18#include <typeinfo>
19#include <utility>
20#include <vector>
21
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"
28
29namespace keyple {
30namespace core {
31namespace service {
32
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;
38
39LocalPoolPluginAdapter::LocalPoolPluginAdapter(
40 std::shared_ptr<PoolPluginSpi> poolPluginSpi)
41: AbstractPluginAdapter(
42 poolPluginSpi->getName(),
43 std::dynamic_pointer_cast<KeyplePluginExtension>(poolPluginSpi))
44, mPoolPluginSpi(poolPluginSpi)
45{
46}
47
48void
49LocalPoolPluginAdapter::doUnregister()
50{
51 try {
52 mPoolPluginSpi->onUnregister();
53 } catch (const Exception& e) {
54 mLogger->warn(
55 "[plugin=%] Failed to unregister plugin extension [reason=%]\n",
56 getName(),
57 e.getMessage());
58 }
59
60 AbstractPluginAdapter::doUnregister();
61}
62
63const std::vector<std::string>
64LocalPoolPluginAdapter::getReaderGroupReferences() const
65{
66 checkStatus();
67
68 try {
69 return mPoolPluginSpi->getReaderGroupReferences();
70 } catch (const PluginIOException& e) {
71 throw KeyplePluginException(
72 std::string("Plugin '") + getName()
73 + "' failed to retrieve reader group references",
74 e);
75 }
76}
77
78std::shared_ptr<CardReader>
79LocalPoolPluginAdapter::allocateReader(const std::string& readerGroupReference)
80{
81 checkStatus();
82
83 mLogger->debug(
84 "[plugin=%] Allocating reader [readerGroupReference=%]\n",
85 getName(),
86 readerGroupReference);
87
88 Assert::getInstance().notEmpty(
89 readerGroupReference, "readerGroupReference");
90
91 std::shared_ptr<ReaderSpi> readerSpi = nullptr;
92
93 try {
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,
100 e);
101 }
102
103 std::shared_ptr<LocalReaderAdapter> localReaderAdapter
104 = buildLocalReaderAdapter(readerSpi);
105 getReadersMap().insert({localReaderAdapter->getName(), localReaderAdapter});
106 localReaderAdapter->doRegister();
107
108 mLogger->debug("[plugin=%] Reader allocated\n", getName());
109
110 return localReaderAdapter;
111}
112
113void
114LocalPoolPluginAdapter::releaseReader(std::shared_ptr<CardReader> reader)
115{
116 checkStatus();
117
118 mLogger->debug(
119 "[plugin=%] Releasing reader [reader=%]\n",
120 getName(),
121 reader != nullptr ? reader->getName() : "null");
122
123 Assert::getInstance().notNull(reader, "reader");
124
125 try {
126 mPoolPluginSpi->releaseReader(
127 std::dynamic_pointer_cast<LocalReaderAdapter>(reader)
128 ->getReaderSpi());
129
130 /* Java 'finally' code moved here */
131 getReadersMap().erase(reader->getName());
132 std::dynamic_pointer_cast<LocalReaderAdapter>(reader)->doUnregister();
133
134 } catch (const PluginIOException& e) {
135 /* Java 'finally' code moved here */
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(),
141 e);
142 }
143
144 mLogger->debug("[plugin=%] Reader released\n", getName());
145}
146
147std::shared_ptr<SmartCard>
148LocalPoolPluginAdapter::getSelectedSmartCard(
149 const std::shared_ptr<CardReader> reader)
150{
151 Assert::getInstance().notNull(reader, "reader");
152
153 auto poolReaderSpi = std::dynamic_pointer_cast<PoolReaderSpi>(
154 getReaderExtension(typeid(KeypleReaderExtension), reader->getName()));
155
156 return std::dynamic_pointer_cast<SmartCard>(
157 poolReaderSpi->getSelectedSmartCard());
158}
159
160} /* namespace service */
161} /* namespace core */
162} /* namespace keyple */