14#include "keyple/core/service/CardRemovalPassiveMonitoringJobAdapter.hpp"
19#include "keyple/core/plugin/ReaderIOException.hpp"
20#include "keyple/core/plugin/TaskCanceledException.hpp"
21#include "keyple/core/plugin/spi/reader/observable/state/processing/CardPresenceMonitorBlockingSpi.hpp"
22#include "keyple/core/plugin/spi/reader/observable/state/processing/WaitForCardRemovalDuringProcessingBlockingSpi.hpp"
23#include "keyple/core/plugin/spi/reader/observable/state/removal/CardRemovalWaiterBlockingSpi.hpp"
24#include "keyple/core/plugin/spi/reader/observable/state/removal/WaitForCardRemovalBlockingSpi.hpp"
25#include "keyple/core/service/ObservableLocalReaderAdapter.hpp"
26#include "keyple/core/util/cpp/exception/RuntimeException.hpp"
32using keyple::core::plugin::ReaderIOException;
33using keyple::core::plugin::TaskCanceledException;
34using keyple::core::plugin::spi::reader::observable::state::processing::
35 CardPresenceMonitorBlockingSpi;
36using keyple::core::plugin::spi::reader::observable::state::processing::
37 WaitForCardRemovalDuringProcessingBlockingSpi;
38using keyple::core::plugin::spi::reader::observable::state::removal::
39 CardRemovalWaiterBlockingSpi;
40using keyple::core::plugin::spi::reader::observable::state::removal::
41 WaitForCardRemovalBlockingSpi;
42using keyple::core::util::cpp::exception::RuntimeException;
46const std::string CardRemovalPassiveMonitoringJobAdapter::JOB_ID
52CardRemovalPassiveMonitoringJobAdapter::CardRemovalPassiveMonitoringJob ::
53 CardRemovalPassiveMonitoringJob(
54 std::shared_ptr<AbstractObservableStateAdapter> monitoringState,
55 CardRemovalPassiveMonitoringJobAdapter* parent)
56: Job(
"CardRemovalPassiveMonitoringJobAdapter")
57, mMonitoringState(monitoringState)
63CardRemovalPassiveMonitoringJobAdapter::CardRemovalPassiveMonitoringJob::
66 bool isTaskCanceled =
false;
68 auto cardRemovalWaiterBlockingSpi
69 = std::dynamic_pointer_cast<CardRemovalWaiterBlockingSpi>(
71 auto waitForCardRemovalBlockingSpi
72 = std::dynamic_pointer_cast<WaitForCardRemovalBlockingSpi>(
74 auto cardPresenceMonitorBlockingSpi
75 = std::dynamic_pointer_cast<CardPresenceMonitorBlockingSpi>(
77 auto waitForCardRemovalDuringProcessingBlockingSpi
78 = std::dynamic_pointer_cast<
79 WaitForCardRemovalDuringProcessingBlockingSpi>(mParent->mReaderSpi);
82 if (cardRemovalWaiterBlockingSpi) {
83 cardRemovalWaiterBlockingSpi->waitForCardRemoval();
84 }
else if (waitForCardRemovalBlockingSpi) {
85 waitForCardRemovalBlockingSpi->waitForCardRemoval();
86 }
else if (cardPresenceMonitorBlockingSpi) {
87 cardPresenceMonitorBlockingSpi
88 ->monitorCardPresenceDuringProcessing();
89 }
else if (waitForCardRemovalDuringProcessingBlockingSpi) {
90 waitForCardRemovalDuringProcessingBlockingSpi
91 ->waitForCardRemovalDuringProcessing();
93 }
catch (
const ReaderIOException& e) {
95 mParent->mLogger->warn(
96 "[fsmJob=%, reader=%] Failed to process card removal event "
99 mParent->getReader()->getName(),
101 }
catch (
const TaskCanceledException& e) {
102 isTaskCanceled =
true;
103 mParent->mLogger->warn(
104 "[fsmJob=%, reader=%] Monitoring job process cancelled "
107 mParent->getReader()->getName(),
109 }
catch (
const RuntimeException& e) {
111 ->getObservationExceptionHandler()
112 ->onReaderObservationError(
113 mParent->getReader()->getPluginName(),
114 mParent->getReader()->getName(),
115 std::make_shared<RuntimeException>(e));
119 if (!isTaskCanceled) {
120 mMonitoringState->onEvent(InternalEvent::CARD_REMOVED);
124CardRemovalPassiveMonitoringJobAdapter::CardRemovalPassiveMonitoringJobAdapter(
125 ObservableLocalReaderAdapter* reader)
126: AbstractMonitoringJobAdapter(reader)
128 mReaderSpi = reader->getObservableReaderSpi();
132CardRemovalPassiveMonitoringJobAdapter::getMonitoringJob(
133 std::shared_ptr<AbstractObservableStateAdapter> monitoringState)
135 return std::make_shared<CardRemovalPassiveMonitoringJob>(
136 monitoringState,
this);
140CardRemovalPassiveMonitoringJobAdapter::stop()
143 "[fsmJob=%, reader=%] Stopping monitoring job process\n",
145 getReader()->getName());
147 auto cardRemovalWaiterBlockingSpi
148 = std::dynamic_pointer_cast<CardRemovalWaiterBlockingSpi>(mReaderSpi);
149 auto waitForCardRemovalBlockingSpi
150 = std::dynamic_pointer_cast<WaitForCardRemovalBlockingSpi>(mReaderSpi);
151 auto cardPresenceMonitorBlockingSpi
152 = std::dynamic_pointer_cast<CardPresenceMonitorBlockingSpi>(mReaderSpi);
153 auto waitForCardRemovalDuringProcessingBlockingSpi
154 = std::dynamic_pointer_cast<
155 WaitForCardRemovalDuringProcessingBlockingSpi>(mReaderSpi);
157 if (cardRemovalWaiterBlockingSpi) {
158 cardRemovalWaiterBlockingSpi->stopWaitForCardRemoval();
159 }
else if (waitForCardRemovalBlockingSpi) {
160 waitForCardRemovalBlockingSpi->stopWaitForCardRemoval();
161 }
else if (cardPresenceMonitorBlockingSpi) {
162 cardPresenceMonitorBlockingSpi
163 ->stopCardPresenceMonitoringDuringProcessing();
164 }
else if (waitForCardRemovalDuringProcessingBlockingSpi) {
165 waitForCardRemovalDuringProcessingBlockingSpi
166 ->stopWaitForCardRemovalDuringProcessing();
170 "[fsmJob=%, reader=%] Monitoring job process stopped\n",
172 getReader()->getName());
ObservableLocalReaderAdapter::InternalEvent InternalEvent