Keyple Plugin PC/SC C++ Library - 2.5.2
Component of the Keyple C++ middleware
PcscUtils.hpp
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#pragma once
15
16#include <string>
17#include <cstdint>
18#include <cstdio>
19
20#if defined(WIN32) || defined(__MINGW32__) || defined(__MINGW64__)
21#include <winscard.h>
22#endif // defined(WIN32) || defined(__MINGW32__) || defined(__MINGW64__)
23
24// SCARD_PROTOCOL_ANY is not defined in Windows winscard.h
25#ifndef SCARD_PROTOCOL_ANY
26#define SCARD_PROTOCOL_ANY (SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1)
27#endif
28
29namespace keyple {
30namespace plugin {
31namespace pcsc {
32namespace cpp {
33
34#if defined(WIN32) || defined(__MINGW32__) || defined(__MINGW64__)
47inline std::string
48pcsc_stringify_error(uint64_t rv)
49{
50 const char* name;
51
52 switch (static_cast<LONG>(rv)) {
53 case SCARD_S_SUCCESS: name = "SCARD_S_SUCCESS"; break;
54 case SCARD_E_CANCELLED: name = "SCARD_E_CANCELLED"; break;
55 case SCARD_E_INVALID_HANDLE: name = "SCARD_E_INVALID_HANDLE"; break;
56 case SCARD_E_INVALID_PARAMETER: name = "SCARD_E_INVALID_PARAMETER"; break;
57 case SCARD_E_NO_MEMORY: name = "SCARD_E_NO_MEMORY"; break;
58 case SCARD_E_TIMEOUT: name = "SCARD_E_TIMEOUT"; break;
59 case SCARD_E_SHARING_VIOLATION: name = "SCARD_E_SHARING_VIOLATION"; break;
60 case SCARD_E_NO_SMARTCARD: name = "SCARD_E_NO_SMARTCARD"; break;
61 case SCARD_E_PROTO_MISMATCH: name = "SCARD_E_PROTO_MISMATCH"; break;
62 case SCARD_E_NOT_READY: name = "SCARD_E_NOT_READY"; break;
63 case SCARD_E_READER_UNAVAILABLE: name = "SCARD_E_READER_UNAVAILABLE"; break;
64 case SCARD_E_NO_SERVICE: name = "SCARD_E_NO_SERVICE"; break;
65 case SCARD_E_SERVICE_STOPPED: name = "SCARD_E_SERVICE_STOPPED"; break;
66 case SCARD_E_NO_READERS_AVAILABLE:
67 name = "SCARD_E_NO_READERS_AVAILABLE";
68 break;
69 case SCARD_E_NOT_TRANSACTED: name = "SCARD_E_NOT_TRANSACTED"; break;
70 case SCARD_E_COMM_DATA_LOST: name = "SCARD_E_COMM_DATA_LOST"; break;
71 case SCARD_E_UNKNOWN_READER: name = "SCARD_E_UNKNOWN_READER"; break;
72 case SCARD_F_COMM_ERROR: name = "SCARD_F_COMM_ERROR"; break;
73 case SCARD_F_INTERNAL_ERROR: name = "SCARD_F_INTERNAL_ERROR"; break;
74 case SCARD_F_UNKNOWN_ERROR: name = "SCARD_F_UNKNOWN_ERROR"; break;
75 case SCARD_W_UNPOWERED_CARD: name = "SCARD_W_UNPOWERED_CARD"; break;
76 case SCARD_W_UNRESPONSIVE_CARD: name = "SCARD_W_UNRESPONSIVE_CARD"; break;
77 case SCARD_W_RESET_CARD: name = "SCARD_W_RESET_CARD"; break;
78 case SCARD_W_REMOVED_CARD: name = "SCARD_W_REMOVED_CARD"; break;
79 default: name = nullptr; break;
80 }
81
82 char code[12];
83 sprintf_s(code, sizeof(code), "0x%08X", static_cast<unsigned int>(rv));
84
85 return name != nullptr ? std::string(name) + " (" + code + ")"
86 : std::string(code);
87}
88#endif // defined(WIN32) || defined(__MINGW32__) || defined(__MINGW64__)
89
94inline bool
96{
97 return rv == static_cast<uint64_t>(SCARD_W_REMOVED_CARD)
98 || rv == static_cast<uint64_t>(SCARD_W_RESET_CARD)
99 || rv == static_cast<uint64_t>(SCARD_W_UNPOWERED_CARD)
100 || rv == static_cast<uint64_t>(SCARD_W_UNRESPONSIVE_CARD)
101 || rv == static_cast<uint64_t>(SCARD_E_NO_SMARTCARD)
102 || rv == static_cast<uint64_t>(SCARD_E_NOT_TRANSACTED)
103 || rv == static_cast<uint64_t>(SCARD_E_COMM_DATA_LOST)
104 /* SCARD_F_INTERNAL_ERROR, commonly returned on a contactless
105 * card tear-off. */
106 || rv == 0x80100001;
107}
108
109} // namespace cpp
110} // namespace pcsc
111} // namespace plugin
112} // namespace keyple
bool isCardCommunicationError(uint64_t rv)
Definition: PcscUtils.hpp:95
Definition: Card.cpp:20