Keyple Service C++ Library - 3.4.1
Component of the Keyple C++ middleware
CardRemovalPassiveMonitoringJobAdapter.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/CardRemovalPassiveMonitoringJobAdapter.hpp"
15
16#include <memory>
17#include <string>
18
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"
27
28namespace keyple {
29namespace core {
30namespace service {
31
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;
43
45
46const std::string CardRemovalPassiveMonitoringJobAdapter::JOB_ID
47 = "REMOVAL_PASSIVE";
48
49/* CARD REMOVAL PASSIVE MONITORING JOB
50 * ---------------------------------------------------------- */
51
52CardRemovalPassiveMonitoringJobAdapter::CardRemovalPassiveMonitoringJob ::
53 CardRemovalPassiveMonitoringJob(
54 std::shared_ptr<AbstractObservableStateAdapter> monitoringState,
55 CardRemovalPassiveMonitoringJobAdapter* parent)
56: Job("CardRemovalPassiveMonitoringJobAdapter")
57, mMonitoringState(monitoringState)
58, mParent(parent)
59{
60}
61
62void
63CardRemovalPassiveMonitoringJobAdapter::CardRemovalPassiveMonitoringJob::
64 execute()
65{
66 bool isTaskCanceled = false;
67
68 auto cardRemovalWaiterBlockingSpi
69 = std::dynamic_pointer_cast<CardRemovalWaiterBlockingSpi>(
70 mParent->mReaderSpi);
71 auto waitForCardRemovalBlockingSpi
72 = std::dynamic_pointer_cast<WaitForCardRemovalBlockingSpi>(
73 mParent->mReaderSpi);
74 auto cardPresenceMonitorBlockingSpi
75 = std::dynamic_pointer_cast<CardPresenceMonitorBlockingSpi>(
76 mParent->mReaderSpi);
77 auto waitForCardRemovalDuringProcessingBlockingSpi
78 = std::dynamic_pointer_cast<
79 WaitForCardRemovalDuringProcessingBlockingSpi>(mParent->mReaderSpi);
80
81 try {
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();
92 }
93 } catch (const ReaderIOException& e) {
94 /* Just warn as it can be a disconnection of the reader. */
95 mParent->mLogger->warn(
96 "[fsmJob=%, reader=%] Failed to process card removal event "
97 "[reason=%]\n",
98 JOB_ID,
99 mParent->getReader()->getName(),
100 e.getMessage());
101 } catch (const TaskCanceledException& e) {
102 isTaskCanceled = true;
103 mParent->mLogger->warn(
104 "[fsmJob=%, reader=%] Monitoring job process cancelled "
105 "[reason=%]\n",
106 JOB_ID,
107 mParent->getReader()->getName(),
108 e.getMessage());
109 } catch (const RuntimeException& e) {
110 mParent->getReader()
111 ->getObservationExceptionHandler()
112 ->onReaderObservationError(
113 mParent->getReader()->getPluginName(),
114 mParent->getReader()->getName(),
115 std::make_shared<RuntimeException>(e));
116 }
117
118 /* Finally */
119 if (!isTaskCanceled) {
120 mMonitoringState->onEvent(InternalEvent::CARD_REMOVED);
121 }
122}
123
124CardRemovalPassiveMonitoringJobAdapter::CardRemovalPassiveMonitoringJobAdapter(
125 ObservableLocalReaderAdapter* reader)
126: AbstractMonitoringJobAdapter(reader)
127{
128 mReaderSpi = reader->getObservableReaderSpi();
129}
130
131std::shared_ptr<Job>
132CardRemovalPassiveMonitoringJobAdapter::getMonitoringJob(
133 std::shared_ptr<AbstractObservableStateAdapter> monitoringState)
134{
135 return std::make_shared<CardRemovalPassiveMonitoringJob>(
136 monitoringState, this);
137}
138
139void
140CardRemovalPassiveMonitoringJobAdapter::stop()
141{
142 mLogger->trace(
143 "[fsmJob=%, reader=%] Stopping monitoring job process\n",
144 JOB_ID,
145 getReader()->getName());
146
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);
156
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();
167 }
168
169 mLogger->trace(
170 "[fsmJob=%, reader=%] Monitoring job process stopped\n",
171 JOB_ID,
172 getReader()->getName());
173}
174
175} /* namespace service */
176} /* namespace core */
177} /* namespace keyple */
ObservableLocalReaderAdapter::InternalEvent InternalEvent