Line data Source code
1 : /*
2 : scdgetinfoassuantransaction.cpp - Assuan Transaction to get information from scdaemon
3 : Copyright (C) 2009 Klarälvdalens Datakonsult AB
4 :
5 : This file is part of GPGME++.
6 :
7 : GPGME++ is free software; you can redistribute it and/or
8 : modify it under the terms of the GNU Library General Public
9 : License as published by the Free Software Foundation; either
10 : version 2 of the License, or (at your option) any later version.
11 :
12 : GPGME++ is distributed in the hope that it will be useful,
13 : but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 : GNU Library General Public License for more details.
16 :
17 : You should have received a copy of the GNU Library General Public License
18 : along with GPGME++; see the file COPYING.LIB. If not, write to the
19 : Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 : Boston, MA 02110-1301, USA.
21 : */
22 :
23 : #include "scdgetinfoassuantransaction.h"
24 : #include "error.h"
25 : #include "data.h"
26 : #include "util.h"
27 :
28 : #include <sstream>
29 : #include <assert.h>
30 :
31 : using namespace GpgME;
32 :
33 0 : ScdGetInfoAssuanTransaction::ScdGetInfoAssuanTransaction(InfoItem item)
34 : : AssuanTransaction(),
35 : m_item(item),
36 : m_command(),
37 0 : m_data()
38 : {
39 :
40 0 : }
41 :
42 0 : ScdGetInfoAssuanTransaction::~ScdGetInfoAssuanTransaction() {}
43 :
44 0 : static std::vector<std::string> to_reader_list(const std::string &s)
45 : {
46 0 : std::vector<std::string> result;
47 0 : std::stringstream ss(s);
48 0 : std::string tok;
49 0 : while (std::getline(ss, tok, '\n')) {
50 0 : result.push_back(tok);
51 : }
52 0 : return result;
53 : }
54 :
55 0 : static std::vector<std::string> to_app_list(const std::string &s)
56 : {
57 0 : return to_reader_list(s);
58 : }
59 :
60 0 : std::string ScdGetInfoAssuanTransaction::version() const
61 : {
62 0 : if (m_item == Version) {
63 0 : return m_data;
64 : } else {
65 0 : return std::string();
66 : }
67 : }
68 :
69 0 : unsigned int ScdGetInfoAssuanTransaction::pid() const
70 : {
71 0 : if (m_item == Pid) {
72 0 : return to_pid(m_data);
73 : } else {
74 0 : return 0U;
75 : }
76 : }
77 :
78 0 : std::string ScdGetInfoAssuanTransaction::socketName() const
79 : {
80 0 : if (m_item == SocketName) {
81 0 : return m_data;
82 : } else {
83 0 : return std::string();
84 : }
85 : }
86 :
87 0 : char ScdGetInfoAssuanTransaction::status() const
88 : {
89 0 : if (m_item == Status && !m_data.empty()) {
90 0 : return m_data[0];
91 : } else {
92 0 : return '\0';
93 : }
94 : }
95 :
96 0 : std::vector<std::string> ScdGetInfoAssuanTransaction::readerList() const
97 : {
98 0 : if (m_item == ReaderList) {
99 0 : return to_reader_list(m_data);
100 : } else {
101 0 : return std::vector<std::string>();
102 : }
103 : }
104 :
105 0 : std::vector<std::string> ScdGetInfoAssuanTransaction::applicationList() const
106 : {
107 0 : if (m_item == ApplicationList) {
108 0 : return to_app_list(m_data);
109 : } else {
110 0 : return std::vector<std::string>();
111 : }
112 : }
113 :
114 : static const char *const scd_getinfo_tokens[] = {
115 : "version",
116 : "pid",
117 : "socket_name",
118 : "status",
119 : "reader_list",
120 : "deny_admin",
121 : "app_list",
122 : };
123 : static_assert((sizeof scd_getinfo_tokens / sizeof * scd_getinfo_tokens == ScdGetInfoAssuanTransaction::LastInfoItem),
124 : "getinfo_tokens size mismatch");
125 :
126 0 : void ScdGetInfoAssuanTransaction::makeCommand() const
127 : {
128 0 : assert(m_item >= 0);
129 0 : assert(m_item < LastInfoItem);
130 0 : m_command = "SCD GETINFO ";
131 0 : m_command += scd_getinfo_tokens[m_item];
132 0 : }
133 :
134 0 : const char *ScdGetInfoAssuanTransaction::command() const
135 : {
136 0 : makeCommand();
137 0 : return m_command.c_str();
138 : }
139 :
140 0 : Error ScdGetInfoAssuanTransaction::data(const char *data, size_t len)
141 : {
142 0 : m_data.append(data, len);
143 0 : return Error();
144 : }
145 :
146 0 : Data ScdGetInfoAssuanTransaction::inquire(const char *name, const char *args, Error &err)
147 : {
148 : (void)name; (void)args; (void)err;
149 0 : return Data::null;
150 : }
151 :
152 0 : Error ScdGetInfoAssuanTransaction::status(const char *status, const char *args)
153 : {
154 : (void)status; (void)args;
155 0 : return Error();
156 18 : }
|