Line data Source code
1 : /* swdbresult.cpp - wraps gpgme swdb result / query
2 : Copyright (C) 2016 Intevation GmbH
3 :
4 : This file is part of GPGME++.
5 :
6 : GPGME++ is free software; you can redistribute it and/or
7 : modify it under the terms of the GNU Library General Public
8 : License as published by the Free Software Foundation; either
9 : version 2 of the License, or (at your option) any later version.
10 :
11 : GPGME++ is distributed in the hope that it will be useful,
12 : but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : GNU Library General Public License for more details.
15 :
16 : You should have received a copy of the GNU Library General Public License
17 : along with GPGME++; see the file COPYING.LIB. If not, write to the
18 : Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 : Boston, MA 02110-1301, USA.
20 : */
21 :
22 : #ifdef HAVE_CONFIG_H
23 : #include "config.h"
24 : #endif
25 :
26 : #include "swdbresult.h"
27 :
28 : #include <istream>
29 :
30 : #include "error.h"
31 :
32 : #include "gpgme.h"
33 :
34 : class GpgME::SwdbResult::Private
35 : {
36 : public:
37 : Private() {}
38 0 : Private(gpgme_query_swdb_result_t result)
39 0 : : mResult(result ? new _gpgme_op_query_swdb_result (*result) : nullptr)
40 : {
41 0 : if (!result) {
42 0 : mResult->name = nullptr;
43 0 : return;
44 : }
45 0 : if (result->name) {
46 0 : mResult->name = strdup(result->name);
47 : }
48 0 : if (result->version) {
49 0 : mVersion = result->version;
50 : }
51 0 : if (result->iversion) {
52 0 : mIVersion = result->iversion;
53 : }
54 : }
55 :
56 : Private(const Private &other)
57 : : mResult(other.mResult)
58 : {
59 : if (mResult && mResult->name) {
60 : mResult->name = strdup(mResult->name);
61 : }
62 : mVersion = other.mVersion;
63 : mIVersion = other.mIVersion;
64 : }
65 :
66 0 : ~Private()
67 : {
68 0 : if (mResult) {
69 0 : std::free(mResult->name);
70 0 : delete mResult;
71 : }
72 0 : }
73 :
74 : GpgME::EngineInfo::Version mVersion;
75 : GpgME::EngineInfo::Version mIVersion;
76 : gpgme_query_swdb_result_t mResult;
77 : };
78 :
79 0 : GpgME::SwdbResult::SwdbResult(gpgme_query_swdb_result_t result)
80 0 : : d(new Private(result))
81 : {
82 0 : }
83 :
84 0 : GpgME::SwdbResult::SwdbResult() : d()
85 : {
86 0 : }
87 :
88 0 : bool GpgME::SwdbResult::isNull() const
89 : {
90 0 : return !d || !d->mResult;
91 : }
92 :
93 0 : std::string GpgME::SwdbResult::name() const
94 : {
95 0 : if (isNull() || !d->mResult->name) {
96 0 : return std::string();
97 : }
98 0 : return d->mResult->name;
99 : }
100 :
101 0 : GpgME::EngineInfo::Version GpgME::SwdbResult::version() const
102 : {
103 0 : if (isNull()) {
104 0 : return GpgME::EngineInfo::Version();
105 : }
106 0 : return d->mVersion;
107 : }
108 :
109 0 : GpgME::EngineInfo::Version GpgME::SwdbResult::installedVersion() const
110 : {
111 0 : if (isNull()) {
112 0 : return GpgME::EngineInfo::Version();
113 : }
114 0 : return d->mIVersion;
115 : }
116 :
117 0 : unsigned long GpgME::SwdbResult::created() const
118 : {
119 0 : return isNull() ? 0 : d->mResult->created;
120 : }
121 :
122 0 : unsigned long GpgME::SwdbResult::retrieved() const
123 : {
124 0 : return isNull() ? 0 : d->mResult->retrieved;
125 : }
126 :
127 0 : unsigned long GpgME::SwdbResult::releaseDate() const
128 : {
129 0 : return isNull() ? 0 : d->mResult->reldate;
130 : }
131 :
132 0 : bool GpgME::SwdbResult::warning() const
133 : {
134 0 : return isNull() ? 0 : d->mResult->warning;
135 : }
136 :
137 0 : bool GpgME::SwdbResult::update() const
138 : {
139 0 : return isNull() ? 0 : d->mResult->update;
140 : }
141 :
142 0 : bool GpgME::SwdbResult::noinfo() const
143 : {
144 0 : return isNull() ? 0 : d->mResult->noinfo;
145 : }
146 :
147 0 : bool GpgME::SwdbResult::unknown() const
148 : {
149 0 : return isNull() ? 0 : d->mResult->unknown;
150 : }
151 :
152 0 : bool GpgME::SwdbResult::error() const
153 : {
154 0 : return isNull() ? 0 : d->mResult->error;
155 : }
156 :
157 0 : bool GpgME::SwdbResult::tooOld() const
158 : {
159 0 : return isNull() ? 0 : d->mResult->tooold;
160 : }
161 :
162 0 : bool GpgME::SwdbResult::urgent() const
163 : {
164 0 : return isNull() ? 0 : d->mResult->urgent;
165 : }
166 :
167 0 : std::vector<GpgME::SwdbResult> GpgME::SwdbResult::query(const char *name,
168 : const char *iversion,
169 : Error *err)
170 : {
171 0 : std::vector <GpgME::SwdbResult> ret;
172 : gpgme_ctx_t ctx;
173 0 : gpgme_error_t gpgerr = gpgme_new(&ctx);
174 :
175 0 : if (gpgerr) {
176 0 : if (err) {
177 0 : *err = Error (gpgerr);
178 : }
179 0 : return ret;
180 : }
181 :
182 0 : gpgerr = gpgme_set_protocol(ctx, GPGME_PROTOCOL_GPGCONF);
183 :
184 0 : if (gpgerr) {
185 0 : if (err) {
186 0 : *err = Error(gpgerr);
187 : }
188 0 : gpgme_release(ctx);
189 0 : return ret;
190 : }
191 :
192 0 : gpgerr = gpgme_op_query_swdb(ctx, name, iversion, 0);
193 :
194 0 : if (gpgerr) {
195 0 : if (err) {
196 0 : *err = Error(gpgerr);
197 : }
198 0 : gpgme_release(ctx);
199 0 : return ret;
200 : }
201 0 : gpgme_query_swdb_result_t result = gpgme_op_query_swdb_result(ctx);
202 0 : while (result) {
203 0 : ret.push_back(SwdbResult(result));
204 0 : result = result->next;
205 : }
206 :
207 0 : gpgme_release(ctx);
208 0 : return ret;
209 : }
210 :
211 0 : std::ostream &GpgME::operator<<(std::ostream &os, const GpgME::SwdbResult &result)
212 : {
213 0 : os << "GpgME::SwdbResult(";
214 0 : if (!result.isNull()) {
215 0 : os << "\n name: " << result.name()
216 0 : << "\n version: " << result.version()
217 0 : << "\n installed: "<< result.installedVersion()
218 0 : << "\n created: " << result.created()
219 0 : << "\n retrieved: "<< result.retrieved()
220 0 : << "\n warning: " << result.warning()
221 0 : << "\n update: " << result.update()
222 0 : << "\n urgent: " << result.urgent()
223 0 : << "\n noinfo: " << result.noinfo()
224 0 : << "\n unknown: " << result.unknown()
225 0 : << "\n tooOld: " << result.tooOld()
226 0 : << "\n error: " << result.error()
227 0 : << "\n reldate: " << result.releaseDate()
228 0 : << '\n';
229 : }
230 0 : return os << ")\n";
231 18 : }
|