Keyple Service C++ Library - 3.3.5
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
18#include "keyple/core/plugin/ReaderIOException.hpp"
19#include "keyple/core/plugin/TaskCanceledException.hpp"
20#include "keyple/core/plugin/spi/reader/observable/state/processing/CardPresenceMonitorBlockingSpi.hpp"
21#include "keyple/core/plugin/spi/reader/observable/state/processing/WaitForCardRemovalDuringProcessingBlockingSpi.hpp"
22#include "keyple/core/plugin/spi/reader/observable/state/removal/CardRemovalWaiterBlockingSpi.hpp"
23#include "keyple/core/plugin/spi/reader/observable/state/removal/WaitForCardRemovalBlockingSpi.hpp"
24#include "keyple/core/service/ObservableLocalReaderAdapter.hpp"
25#include "keyple/core/util/cpp/exception/RuntimeException.hpp"
26
27namespace keyple {
28namespace core {
29namespace service {
30
31using keyple::core::plugin::ReaderIOException;
32using keyple::core::plugin::TaskCanceledException;
33using keyple::core::plugin::spi::reader::observable::state::processing::
34 CardPresenceMonitorBlockingSpi;
35using keyple::core::plugin::spi::reader::observable::state::processing::
36 WaitForCardRemovalDuringProcessingBlockingSpi;
37using keyple::core::plugin::spi::reader::observable::state::removal::
38 CardRemovalWaiterBlockingSpi;
39using keyple::core::plugin::spi::reader::observable::state::removal::
40 WaitForCardRemovalBlockingSpi;
41using keyple::core::util::cpp::exception::RuntimeException;
42
44
45/* CARD REMOVAL PASSIVE MONITORING JOB
46 * ---------------------------------------------------------- */
47
48CardRemovalPassiveMonitoringJobAdapter::CardRemovalPassiveMonitoringJob ::
49 CardRemovalPassiveMonitoringJob(
50 std::shared_ptr<AbstractObservableStateAdapter> monitoringState,
51 CardRemovalPassiveMonitoringJobAdapter* parent)
52: Job("CardRemovalPassiveMonitoringJobAdapter")
53, mMonitoringState(monitoringState)
54, mParent(parent)
55{
56}
57
58void
59CardRemovalPassiveMonitoringJobAdapter::CardRemovalPassiveMonitoringJob::
60 execute()
61{
62 bool isTaskCanceled = false;
63
64 auto cardRemovalWaiterBlockingSpi
65 = std::dynamic_pointer_cast<CardRemovalWaiterBlockingSpi>(
66 mParent->mReaderSpi);
67 auto waitForCardRemovalBlockingSpi
68 = std::dynamic_pointer_cast<WaitForCardRemovalBlockingSpi>(
69 mParent->mReaderSpi);
70 auto cardPresenceMonitorBlockingSpi
71 = std::dynamic_pointer_cast<CardPresenceMonitorBlockingSpi>(
72 mParent->mReaderSpi);
73 auto waitForCardRemovalDuringProcessingBlockingSpi
74 = std::dynamic_pointer_cast<
75 WaitForCardRemovalDuringProcessingBlockingSpi>(mParent->mReaderSpi);
76
77 try {
78 if (cardRemovalWaiterBlockingSpi) {
79 cardRemovalWaiterBlockingSpi->waitForCardRemoval();
80 } else if (waitForCardRemovalBlockingSpi) {
81 waitForCardRemovalBlockingSpi->waitForCardRemoval();
82 } else if (cardPresenceMonitorBlockingSpi) {
83 cardPresenceMonitorBlockingSpi
84 ->monitorCardPresenceDuringProcessing();
85 } else if (waitForCardRemovalDuringProcessingBlockingSpi) {
86 waitForCardRemovalDuringProcessingBlockingSpi
87 ->waitForCardRemovalDuringProcessing();
88 }
89 } catch (const ReaderIOException& e) {
90 /* Just warn as it can be a disconnection of the reader. */
91 mParent->mLogger->warn(
92 "Monitoring job error while processing card removal event on "
93 "reader [%]: %\n",
94 mParent->getReader()->getName(),
95 e.getMessage());
96 } catch (const TaskCanceledException& e) {
97 isTaskCanceled = true;
98 mParent->mLogger->warn(
99 "Monitoring job process cancelled: %\n", e.getMessage());
100 } catch (const RuntimeException& e) {
101 mParent->getReader()
102 ->getObservationExceptionHandler()
103 ->onReaderObservationError(
104 mParent->getReader()->getPluginName(),
105 mParent->getReader()->getName(),
106 std::make_shared<RuntimeException>(e));
107 }
108
109 /* Finally */
110 if (!isTaskCanceled) {
111 mMonitoringState->onEvent(InternalEvent::CARD_REMOVED);
112 }
113}
114
115/* CARD REMOVAL PASSIVE MONITORING JOB ADAPTER
116 * -------------------------------------------------- */
117
118CardRemovalPassiveMonitoringJobAdapter::CardRemovalPassiveMonitoringJobAdapter(
119 ObservableLocalReaderAdapter* reader)
120: AbstractMonitoringJobAdapter(reader)
121{
122 mReaderSpi = reader->getObservableReaderSpi();
123}
124
125std::shared_ptr<Job>
126CardRemovalPassiveMonitoringJobAdapter::getMonitoringJob(
127 std::shared_ptr<AbstractObservableStateAdapter> monitoringState)
128{
129 return std::make_shared<CardRemovalPassiveMonitoringJob>(
130 monitoringState, this);
131}
132
133void
134CardRemovalPassiveMonitoringJobAdapter::stop()
135{
136 mLogger->trace("Stop monitoring job process\n");
137
138 auto cardRemovalWaiterBlockingSpi
139 = std::dynamic_pointer_cast<CardRemovalWaiterBlockingSpi>(mReaderSpi);
140 auto waitForCardRemovalBlockingSpi
141 = std::dynamic_pointer_cast<WaitForCardRemovalBlockingSpi>(mReaderSpi);
142 auto cardPresenceMonitorBlockingSpi
143 = std::dynamic_pointer_cast<CardPresenceMonitorBlockingSpi>(mReaderSpi);
144 auto waitForCardRemovalDuringProcessingBlockingSpi
145 = std::dynamic_pointer_cast<
146 WaitForCardRemovalDuringProcessingBlockingSpi>(mReaderSpi);
147
148 if (cardRemovalWaiterBlockingSpi) {
149 cardRemovalWaiterBlockingSpi->stopWaitForCardRemoval();
150 } else if (waitForCardRemovalBlockingSpi) {
151 waitForCardRemovalBlockingSpi->stopWaitForCardRemoval();
152 } else if (cardPresenceMonitorBlockingSpi) {
153 cardPresenceMonitorBlockingSpi
154 ->stopCardPresenceMonitoringDuringProcessing();
155 } else if (waitForCardRemovalDuringProcessingBlockingSpi) {
156 waitForCardRemovalDuringProcessingBlockingSpi
157 ->stopWaitForCardRemovalDuringProcessing();
158 }
159
160 mLogger->trace("Monitoring job process stopped\n");
161}
162
163} /* namespace service */
164} /* namespace core */
165} /* namespace keyple */
ObservableLocalReaderAdapter::InternalEvent InternalEvent