Keyple Card Calypso C++ Library 2.2.2
Reference Terminal Reader API for C++
CommonTransactionManagerAdapter.h
Go to the documentation of this file.
1/**************************************************************************************************
2 * Copyright (c) 2022 Calypso Networks Association https://calypsonet.org/ *
3 * *
4 * See the NOTICE file(s) distributed with this work for additional information regarding *
5 * copyright ownership. *
6 * *
7 * This program and the accompanying materials are made available under the terms of the Eclipse *
8 * Public License 2.0 which is available at http://www.eclipse.org/legal/epl-2.0 *
9 * *
10 * SPDX-License-Identifier: EPL-2.0 *
11 **************************************************************************************************/
12
13#pragma once
14
15#include <cstdint>
16#include <memory>
17#include <string>
18#include <sstream>
19#include <vector>
20
21/* Calypsonet Terminal Calypso */
22#include "CommonTransactionManager.h"
23
24/* Calypsonet Terminal Reader */
25#include "SmartCard.h"
26
27/* Keyple Card Calypso */
28#include "AbstractApduCommand.h"
30
31/* Keyple Core Util */
32#include "HexUtil.h"
33
34namespace keyple {
35namespace card {
36namespace calypso {
37
38using namespace calypsonet::terminal::calypso::transaction;
39using namespace calypsonet::terminal::reader::selection::spi;
40using namespace keyple::core::util;
41
51template <typename T, typename S, typename U>
53: virtual public CommonTransactionManager<T, S> {
54public:
55 /* Prefix/suffix used to compose exception messages */
57 "A communication error with the SAM reader occurred ";
58 const std::string MSG_SAM_COMMUNICATION_ERROR =
59 "A communication error with the SAM occurred ";
60 const std::string MSG_SAM_COMMAND_ERROR =
61 "A SAM command error occurred ";
63 "while transmitting commands.";
64
75 std::shared_ptr<SmartCard> targetSmartCard,
76 const std::shared_ptr<CommonSecuritySettingAdapter<U>> securitySetting,
77 const std::vector<std::vector<uint8_t>>& transactionAuditData)
78 : mTargetSmartCard(targetSmartCard),
79 mSecuritySetting(securitySetting),
80 mTransactionAuditData(transactionAuditData) {}
81
87 const std::vector<std::vector<uint8_t>>& getTransactionAuditData() const override
88 {
89 /* CL-CSS-INFODATA.1 */
90 return mTransactionAuditData;
91 }
92
101 const std::vector<std::shared_ptr<ApduRequestSpi>> getApduRequests(
102 const std::vector<std::shared_ptr<AbstractApduCommand>>& commands)
103 {
104 std::vector<std::shared_ptr<ApduRequestSpi>> apduRequests;
105
106 for (const auto& command : commands) {
107 apduRequests.push_back(command->getApduRequest());
108 }
109
110 return apduRequests;
111 }
112
121 virtual void saveTransactionAuditData(const std::shared_ptr<CardRequestSpi> cardRequest,
122 const std::shared_ptr<CardResponseApi> cardResponse)
123 {
124 if (cardResponse != nullptr) {
125 const std::vector<std::shared_ptr<ApduRequestSpi>>& requests =
126 cardRequest->getApduRequests();
127 const std::vector<std::shared_ptr<ApduResponseApi>>& responses =
128 cardResponse->getApduResponses();
129
130 for (int i = 0; i < static_cast<int>(responses.size()); i++) {
131 mTransactionAuditData.push_back(requests[i]->getApdu());
132 mTransactionAuditData.push_back(responses[i]->getApdu());
133 }
134 }
135 }
136
147 const std::shared_ptr<CardRequestSpi> cardRequest,
148 const std::shared_ptr<CardResponseApi> cardResponse,
149 std::vector<std::vector<uint8_t>>& transactionAuditData)
150 {
151 if (cardResponse != nullptr) {
152 const std::vector<std::shared_ptr<ApduRequestSpi>>& requests =
153 cardRequest->getApduRequests();
154 const std::vector<std::shared_ptr<ApduResponseApi>>& responses =
155 cardResponse->getApduResponses();
156
157 for (int i = 0; i < static_cast<int>(responses.size()); i++) {
158 transactionAuditData.push_back(requests[i]->getApdu());
159 transactionAuditData.push_back(responses[i]->getApdu());
160 }
161 }
162 }
163
170 const std::string getTransactionAuditDataAsString() const
171 {
172 std::stringstream ss;
173
174 ss << "\nTransaction audit JSON data: {";
175 ss << "\"targetSmartCard\":" << mTargetSmartCard << ",";
176
177 if (mSecuritySetting != nullptr && mSecuritySetting->getControlSam() != nullptr) {
178 ss << "\"controlSam\":" << mSecuritySetting->getControlSam() << ",";
179 }
180
181 ss << "\"apdus\": {";
182 for(auto it = mTransactionAuditData.begin(); it != mTransactionAuditData.end(); it++) {
183 ss << HexUtil::toHex(*it);
184 if (it != mTransactionAuditData.end() - 1) {
185 ss << ", ";
186 }
187 }
188 ss << "}";
189
190 return ss.str();
191 }
192
193private:
197 std::shared_ptr<SmartCard> mTargetSmartCard;
198
202 std::shared_ptr<CommonSecuritySettingAdapter<U>> mSecuritySetting;
203
207 std::vector<std::vector<uint8_t>> mTransactionAuditData;
208};
209
210}
211}
212}
virtual void saveTransactionAuditData(const std::shared_ptr< CardRequestSpi > cardRequest, const std::shared_ptr< CardResponseApi > cardResponse)
CommonTransactionManagerAdapter(std::shared_ptr< SmartCard > targetSmartCard, const std::shared_ptr< CommonSecuritySettingAdapter< U > > securitySetting, const std::vector< std::vector< uint8_t > > &transactionAuditData)
static void saveTransactionAuditData(const std::shared_ptr< CardRequestSpi > cardRequest, const std::shared_ptr< CardResponseApi > cardResponse, std::vector< std::vector< uint8_t > > &transactionAuditData)
const std::vector< std::shared_ptr< ApduRequestSpi > > getApduRequests(const std::vector< std::shared_ptr< AbstractApduCommand > > &commands)
const std::vector< std::vector< uint8_t > > & getTransactionAuditData() const override