From 3509cf2f9846360848b6c08d36cbca18373c935e Mon Sep 17 00:00:00 2001 From: Andre Heinecke Date: Fri, 4 Nov 2016 12:33:57 +0100 Subject: [PATCH] cpp: Add API for swdb queries * lang/cpp/src/swdbresult.cpp, lang/cpp/src/swdbresult.h (SwdbResult): New. * lang/cpp/src/Makefile.am: Update accordingly. --- NEWS | 1 + lang/cpp/src/Makefile.am | 4 +- lang/cpp/src/swdbresult.cpp | 231 ++++++++++++++++++++++++++++++++++++ lang/cpp/src/swdbresult.h | 128 ++++++++++++++++++++ 4 files changed, 362 insertions(+), 2 deletions(-) create mode 100644 lang/cpp/src/swdbresult.cpp create mode 100644 lang/cpp/src/swdbresult.h diff --git a/NEWS b/NEWS index 4d2a110e..1cf401ea 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,7 @@ Noteworthy changes in version 1.7.2 (unreleased) qt: DN::Attribute NEW. cpp: EngineInfo::Version::Version(const char*) NEW. cpp: EngineInfo::Version::Version() NEW. + cpp: SwdbResult NEW. Noteworthy changes in version 1.7.1 (2016-10-18) diff --git a/lang/cpp/src/Makefile.am b/lang/cpp/src/Makefile.am index 8ea99f5c..608d2d98 100644 --- a/lang/cpp/src/Makefile.am +++ b/lang/cpp/src/Makefile.am @@ -33,7 +33,7 @@ main_sources = \ gpgsetownertrusteditinteractor.cpp gpgsignkeyeditinteractor.cpp \ gpgadduserideditinteractor.cpp defaultassuantransaction.cpp \ scdgetinfoassuantransaction.cpp gpgagentgetinfoassuantransaction.cpp \ - vfsmountresult.cpp configuration.cpp tofuinfo.cpp + vfsmountresult.cpp configuration.cpp tofuinfo.cpp swdbresult.cpp gpgmepp_headers = \ configuration.h context.h data.h decryptionresult.h \ @@ -45,7 +45,7 @@ gpgmepp_headers = \ importresult.h keygenerationresult.h key.h keylistresult.h \ notation.h result.h scdgetinfoassuantransaction.h signingresult.h \ trustitem.h verificationresult.h vfsmountresult.h gpgmepp_export.h \ - tofuinfo.h + tofuinfo.h swdbresult.h private_gpgmepp_headers = \ result_p.h context_p.h util.h callbacks.h data_p.h diff --git a/lang/cpp/src/swdbresult.cpp b/lang/cpp/src/swdbresult.cpp new file mode 100644 index 00000000..3afa8b5b --- /dev/null +++ b/lang/cpp/src/swdbresult.cpp @@ -0,0 +1,231 @@ +/* swdbresult.cpp - wraps gpgme swdb result / query + Copyright (C) 2016 Intevation GmbH + + This file is part of GPGME++. + + GPGME++ is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + GPGME++ is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with GPGME++; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#include "swdbresult.h" + +#include + +#include "error.h" + +#include "gpgme.h" + +class GpgME::SwdbResult::Private +{ +public: + Private() {} + Private(gpgme_query_swdb_result_t result) + : mResult(result ? new _gpgme_op_query_swdb_result (*result) : nullptr) + { + if (!result) { + mResult->name = nullptr; + return; + } + if (result->name) { + mResult->name = strdup(result->name); + } + if (result->version) { + mVersion = result->version; + } + if (result->iversion) { + mIVersion = result->iversion; + } + } + + Private(const Private &other) + : mResult(other.mResult) + { + if (mResult && mResult->name) { + mResult->name = strdup(mResult->name); + } + mVersion = other.mVersion; + mIVersion = other.mIVersion; + } + + ~Private() + { + if (mResult) { + std::free(mResult->name); + delete mResult; + } + } + + GpgME::EngineInfo::Version mVersion; + GpgME::EngineInfo::Version mIVersion; + gpgme_query_swdb_result_t mResult; +}; + +GpgME::SwdbResult::SwdbResult(gpgme_query_swdb_result_t result) + : d(new Private(result)) +{ +} + +GpgME::SwdbResult::SwdbResult() : d() +{ +} + +bool GpgME::SwdbResult::isNull() const +{ + return !d || !d->mResult; +} + +std::string GpgME::SwdbResult::name() const +{ + if (isNull() || !d->mResult->name) { + return std::string(); + } + return d->mResult->name; +} + +GpgME::EngineInfo::Version GpgME::SwdbResult::version() const +{ + if (isNull()) { + return GpgME::EngineInfo::Version(); + } + return d->mVersion; +} + +GpgME::EngineInfo::Version GpgME::SwdbResult::installedVersion() const +{ + if (isNull()) { + return GpgME::EngineInfo::Version(); + } + return d->mIVersion; +} + +unsigned long GpgME::SwdbResult::created() const +{ + return isNull() ? 0 : d->mResult->created; +} + +unsigned long GpgME::SwdbResult::retrieved() const +{ + return isNull() ? 0 : d->mResult->retrieved; +} + +unsigned long GpgME::SwdbResult::releaseDate() const +{ + return isNull() ? 0 : d->mResult->reldate; +} + +bool GpgME::SwdbResult::warning() const +{ + return isNull() ? 0 : d->mResult->warning; +} + +bool GpgME::SwdbResult::update() const +{ + return isNull() ? 0 : d->mResult->update; +} + +bool GpgME::SwdbResult::noinfo() const +{ + return isNull() ? 0 : d->mResult->noinfo; +} + +bool GpgME::SwdbResult::unknown() const +{ + return isNull() ? 0 : d->mResult->unknown; +} + +bool GpgME::SwdbResult::error() const +{ + return isNull() ? 0 : d->mResult->error; +} + +bool GpgME::SwdbResult::tooOld() const +{ + return isNull() ? 0 : d->mResult->tooold; +} + +bool GpgME::SwdbResult::urgent() const +{ + return isNull() ? 0 : d->mResult->urgent; +} + +std::vector GpgME::SwdbResult::query(const char *name, + const char *iversion, + Error *err) +{ + std::vector ret; + gpgme_ctx_t ctx; + gpgme_error_t gpgerr = gpgme_new(&ctx); + + if (gpgerr) { + if (err) { + *err = Error (gpgerr); + } + return ret; + } + + gpgerr = gpgme_set_protocol(ctx, GPGME_PROTOCOL_GPGCONF); + + if (gpgerr) { + if (err) { + *err = Error(gpgerr); + } + gpgme_release(ctx); + return ret; + } + + gpgerr = gpgme_op_query_swdb(ctx, name, iversion, 0); + + if (gpgerr) { + if (err) { + *err = Error(gpgerr); + } + gpgme_release(ctx); + return ret; + } + gpgme_query_swdb_result_t result = gpgme_op_query_swdb_result(ctx); + while (result) { + ret.push_back(SwdbResult(result)); + result = result->next; + } + + gpgme_release(ctx); + return ret; +} + +std::ostream &GpgME::operator<<(std::ostream &os, const GpgME::SwdbResult &result) +{ + os << "GpgME::SwdbResult("; + if (!result.isNull()) { + os << "\n name: " << result.name() + << "\n version: " << result.version() + << "\n installed: "<< result.installedVersion() + << "\n created: " << result.created() + << "\n retrieved: "<< result.retrieved() + << "\n warning: " << result.warning() + << "\n update: " << result.update() + << "\n urgent: " << result.urgent() + << "\n noinfo: " << result.noinfo() + << "\n unknown: " << result.unknown() + << "\n tooOld: " << result.tooOld() + << "\n error: " << result.error() + << "\n reldate: " << result.releaseDate() + << '\n'; + } + return os << ")\n"; +} diff --git a/lang/cpp/src/swdbresult.h b/lang/cpp/src/swdbresult.h new file mode 100644 index 00000000..e15954dc --- /dev/null +++ b/lang/cpp/src/swdbresult.h @@ -0,0 +1,128 @@ +/* + swdbresult.h - wraps a gpgme swdb query / rsult + Copyright (C) 2016 Intevation GmbH + + This file is part of GPGME++. + + GPGME++ is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + GPGME++ is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with GPGME++; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ +#ifndef __GPGMEPP_SWDB_H__ +#define __GPGMEPP_SWDB_H__ + +#include "gpgmepp_export.h" + +#include "global.h" +#include "engineinfo.h" + +#include +#include +#include +#include + +namespace GpgME +{ + +class GPGMEPP_EXPORT SwdbResult +{ +public: + /* Obtain swdb results through query() */ + SwdbResult(); + explicit SwdbResult(gpgme_query_swdb_result_t result); + + /** Query the swdb to get information about updates. + * + * Runs gpgconf --query-swdb through gpgme and + * returns a list of results. + * If iversion is given as NULL a check is only done if GPGME + * can figure out the version by itself (for example when using + * "gpgme" or "gnupg"). + * + * If NULL is used for name the current gpgme version is + * checked. + * + * @param name: Name of the component to query. + * @param iversion: Optionally the installed version. + * @param err: Optional error. + */ + static std::vector query(const char *name, + const char *iversion = NULL, + Error *err = NULL); + + const SwdbResult &operator=(SwdbResult other) + { + swap(other); + return *this; + } + + void swap(SwdbResult &other) + { + using std::swap; + swap(this->d, other.d); + } + bool isNull() const; + + /* The name of the package (e.g. "gpgme", "gnupg") */ + std::string name() const; + + /* The version of the installed version. */ + EngineInfo::Version installedVersion() const; + + /* The time the online info was created. */ + unsigned long created() const; + + /* The time the online info was retrieved. */ + unsigned long retrieved() const; + + /* This bit is set if an error occured or some of the information + * in this structure may not be set. */ + bool warning() const; + + /* An update is available. */ + bool update() const; + + /* The update is important. */ + bool urgent() const; + + /* No information at all available. */ + bool noinfo() const; + + /* The package name is not known. */ + bool unknown() const; + + /* The information here is too old. */ + bool tooOld() const; + + /* Other error. */ + bool error() const; + + /* The version of the latest released version. */ + EngineInfo::Version version() const; + + /* The release date of that version. */ + unsigned long releaseDate() const; + +private: + class Private; + std::shared_ptr d; +}; + +GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const SwdbResult &info); + +} // namespace GpgME + +GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(SwdbResult) + +#endif