Line data Source code
1 : /* swdbresult.cpp - wraps gpgme swdb result / query
2 : Copyright (C) 2016 by Bundesamt für Sicherheit in der Informationstechnik
3 : Software engineering by Intevation GmbH
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 : #ifdef HAVE_CONFIG_H
24 : #include "config.h"
25 : #endif
26 :
27 : #include "swdbresult.h"
28 :
29 : #include <istream>
30 :
31 : #include "error.h"
32 :
33 : #include "gpgme.h"
34 :
35 : class GpgME::SwdbResult::Private
36 : {
37 : public:
38 : Private() {}
39 0 : Private(gpgme_query_swdb_result_t result)
40 0 : : mResult(result ? new _gpgme_op_query_swdb_result (*result) : nullptr)
41 : {
42 0 : if (!result) {
43 0 : mResult->name = nullptr;
44 0 : return;
45 : }
46 0 : if (result->name) {
47 0 : mResult->name = strdup(result->name);
48 : }
49 0 : if (result->version) {
50 0 : mVersion = result->version;
51 : }
52 0 : if (result->iversion) {
53 0 : mIVersion = result->iversion;
54 : }
55 : }
56 :
57 : Private(const Private &other)
58 : : mResult(other.mResult)
59 : {
60 : if (mResult && mResult->name) {
61 : mResult->name = strdup(mResult->name);
62 : }
63 : mVersion = other.mVersion;
64 : mIVersion = other.mIVersion;
65 : }
66 :
67 0 : ~Private()
68 0 : {
69 0 : if (mResult) {
70 0 : std::free(mResult->name);
71 0 : delete mResult;
72 : }
73 0 : }
74 :
75 : GpgME::EngineInfo::Version mVersion;
76 : GpgME::EngineInfo::Version mIVersion;
77 : gpgme_query_swdb_result_t mResult;
78 : };
79 :
80 0 : GpgME::SwdbResult::SwdbResult(gpgme_query_swdb_result_t result)
81 0 : : d(new Private(result))
82 : {
83 0 : }
84 :
85 0 : GpgME::SwdbResult::SwdbResult() : d()
86 : {
87 0 : }
88 :
89 0 : bool GpgME::SwdbResult::isNull() const
90 : {
91 0 : return !d || !d->mResult;
92 : }
93 :
94 0 : std::string GpgME::SwdbResult::name() const
95 : {
96 0 : if (isNull() || !d->mResult->name) {
97 0 : return std::string();
98 : }
99 0 : return d->mResult->name;
100 : }
101 :
102 0 : GpgME::EngineInfo::Version GpgME::SwdbResult::version() const
103 : {
104 0 : if (isNull()) {
105 0 : return GpgME::EngineInfo::Version();
106 : }
107 0 : return d->mVersion;
108 : }
109 :
110 0 : GpgME::EngineInfo::Version GpgME::SwdbResult::installedVersion() const
111 : {
112 0 : if (isNull()) {
113 0 : return GpgME::EngineInfo::Version();
114 : }
115 0 : return d->mIVersion;
116 : }
117 :
118 0 : unsigned long GpgME::SwdbResult::created() const
119 : {
120 0 : return isNull() ? 0 : d->mResult->created;
121 : }
122 :
123 0 : unsigned long GpgME::SwdbResult::retrieved() const
124 : {
125 0 : return isNull() ? 0 : d->mResult->retrieved;
126 : }
127 :
128 0 : unsigned long GpgME::SwdbResult::releaseDate() const
129 : {
130 0 : return isNull() ? 0 : d->mResult->reldate;
131 : }
132 :
133 0 : bool GpgME::SwdbResult::warning() const
134 : {
135 0 : return isNull() ? 0 : d->mResult->warning;
136 : }
137 :
138 0 : bool GpgME::SwdbResult::update() const
139 : {
140 0 : return isNull() ? 0 : d->mResult->update;
141 : }
142 :
143 0 : bool GpgME::SwdbResult::noinfo() const
144 : {
145 0 : return isNull() ? 0 : d->mResult->noinfo;
146 : }
147 :
148 0 : bool GpgME::SwdbResult::unknown() const
149 : {
150 0 : return isNull() ? 0 : d->mResult->unknown;
151 : }
152 :
153 0 : bool GpgME::SwdbResult::error() const
154 : {
155 0 : return isNull() ? 0 : d->mResult->error;
156 : }
157 :
158 0 : bool GpgME::SwdbResult::tooOld() const
159 : {
160 0 : return isNull() ? 0 : d->mResult->tooold;
161 : }
162 :
163 0 : bool GpgME::SwdbResult::urgent() const
164 : {
165 0 : return isNull() ? 0 : d->mResult->urgent;
166 : }
167 :
168 0 : std::vector<GpgME::SwdbResult> GpgME::SwdbResult::query(const char *name,
169 : const char *iversion,
170 : Error *err)
171 : {
172 0 : std::vector <GpgME::SwdbResult> ret;
173 : gpgme_ctx_t ctx;
174 0 : gpgme_error_t gpgerr = gpgme_new(&ctx);
175 :
176 0 : if (gpgerr) {
177 0 : if (err) {
178 0 : *err = Error (gpgerr);
179 : }
180 0 : return ret;
181 : }
182 :
183 0 : gpgerr = gpgme_set_protocol(ctx, GPGME_PROTOCOL_GPGCONF);
184 :
185 0 : if (gpgerr) {
186 0 : if (err) {
187 0 : *err = Error(gpgerr);
188 : }
189 0 : gpgme_release(ctx);
190 0 : return ret;
191 : }
192 :
193 0 : gpgerr = gpgme_op_query_swdb(ctx, name, iversion, 0);
194 :
195 0 : if (gpgerr) {
196 0 : if (err) {
197 0 : *err = Error(gpgerr);
198 : }
199 0 : gpgme_release(ctx);
200 0 : return ret;
201 : }
202 0 : gpgme_query_swdb_result_t result = gpgme_op_query_swdb_result(ctx);
203 0 : while (result) {
204 0 : ret.push_back(SwdbResult(result));
205 0 : result = result->next;
206 : }
207 :
208 0 : gpgme_release(ctx);
209 0 : return ret;
210 : }
211 :
212 0 : std::ostream &GpgME::operator<<(std::ostream &os, const GpgME::SwdbResult &result)
213 : {
214 0 : os << "GpgME::SwdbResult(";
215 0 : if (!result.isNull()) {
216 0 : os << "\n name: " << result.name()
217 0 : << "\n version: " << result.version()
218 0 : << "\n installed: "<< result.installedVersion()
219 0 : << "\n created: " << result.created()
220 0 : << "\n retrieved: "<< result.retrieved()
221 0 : << "\n warning: " << result.warning()
222 0 : << "\n update: " << result.update()
223 0 : << "\n urgent: " << result.urgent()
224 0 : << "\n noinfo: " << result.noinfo()
225 0 : << "\n unknown: " << result.unknown()
226 0 : << "\n tooOld: " << result.tooOld()
227 0 : << "\n error: " << result.error()
228 0 : << "\n reldate: " << result.releaseDate()
229 0 : << '\n';
230 : }
231 0 : return os << ")\n";
232 24 : }
|