diff --git a/NEWS b/NEWS index 367b718f..d03fe80b 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,7 @@ Noteworthy changes in version 1.8.1 (unreleased) cpp: GpgGenCardKeyInteractor NEW. cpp: Subkey::keyGrip NEW. cpp: Subkey::isDeVs NEW. + cpp: Data::toKeys NEW. qt: CryptoConfig::stringValueList() NEW. py: Context.__init__ EXTENDED: New keyword arg home_dir. py: Context.home_dir NEW. diff --git a/lang/cpp/src/data.cpp b/lang/cpp/src/data.cpp index 2cb4fa88..32ca561b 100644 --- a/lang/cpp/src/data.cpp +++ b/lang/cpp/src/data.cpp @@ -25,6 +25,7 @@ #endif #include "data_p.h" +#include "context_p.h" #include #include @@ -230,3 +231,26 @@ off_t GpgME::Data::seek(off_t offset, int whence) { return gpgme_data_seek(d->data, offset, whence); } + +std::vector GpgME::Data::toKeys(Protocol proto) const +{ + std::vector ret; + if (isNull()) { + return ret; + } + auto ctx = GpgME::Context::createForProtocol(proto); + if (!ctx) { + return ret; + } + + if (gpgme_op_keylist_from_data_start (ctx->impl()->ctx, d->data, 0)) { + return ret; + } + + gpgme_key_t key; + while (!gpgme_op_keylist_next (ctx->impl()->ctx, &key)) { + ret.push_back(GpgME::Key(key, false)); + } + delete ctx; + return ret; +} diff --git a/lang/cpp/src/data.h b/lang/cpp/src/data.h index 50bdf627..cc7906fb 100644 --- a/lang/cpp/src/data.h +++ b/lang/cpp/src/data.h @@ -24,6 +24,7 @@ #define __GPGMEPP_DATA_H__ #include "global.h" +#include "key.h" #include // for size_t, off_t #include // FILE @@ -109,6 +110,10 @@ public: ssize_t write(const void *buffer, size_t length); off_t seek(off_t offset, int whence); + /** Try to parse the data to a key object using the + * Protocol proto. Returns an empty list on error.*/ + std::vector toKeys(const Protocol proto = Protocol::OpenPGP) const; + class Private; Private *impl() {