cpp: Wrap keylist_from_data
authorAndre Heinecke <aheinecke@intevation.de>
Wed, 22 Mar 2017 15:38:35 +0000 (16:38 +0100)
committerAndre Heinecke <aheinecke@intevation.de>
Wed, 22 Mar 2017 15:43:33 +0000 (16:43 +0100)
* lang/cpp/data.h, lang/cpp/data.cpp (GpgME::Data::toKeys): New.

--
Doing this in data instead of Context is a bit more idiomatic. But
this could also be added to Context.

NEWS
lang/cpp/src/data.cpp
lang/cpp/src/data.h

diff --git a/NEWS b/NEWS
index 367b718..d03fe80 100644 (file)
--- 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.
index 2cb4fa8..32ca561 100644 (file)
@@ -25,6 +25,7 @@
 #endif
 
 #include "data_p.h"
+#include "context_p.h"
 #include <error.h>
 #include <interfaces/dataprovider.h>
 
@@ -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::Key> GpgME::Data::toKeys(Protocol proto) const
+{
+    std::vector<GpgME::Key> 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;
+}
index 50bdf62..cc7906f 100644 (file)
@@ -24,6 +24,7 @@
 #define __GPGMEPP_DATA_H__
 
 #include "global.h"
+#include "key.h"
 
 #include <sys/types.h> // for size_t, off_t
 #include <cstdio> // 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<Key> toKeys(const Protocol proto = Protocol::OpenPGP) const;
+
     class Private;
     Private *impl()
     {