aboutsummaryrefslogtreecommitdiffstats
path: root/lang/cpp/src/context.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lang/cpp/src/context.cpp')
-rw-r--r--lang/cpp/src/context.cpp214
1 files changed, 0 insertions, 214 deletions
diff --git a/lang/cpp/src/context.cpp b/lang/cpp/src/context.cpp
index ab633d7a..398836c9 100644
--- a/lang/cpp/src/context.cpp
+++ b/lang/cpp/src/context.cpp
@@ -20,8 +20,6 @@
Boston, MA 02110-1301, USA.
*/
-#include "config-gpgme++.h"
-
#include <context.h>
#include <eventloopinteractor.h>
#include <trustitem.h>
@@ -58,8 +56,6 @@ using std::endl;
#include <cassert>
-#include <qglobal.h>
-
namespace GpgME
{
@@ -77,7 +73,6 @@ static inline int xtoi_2(const char *str)
return xtoi_1(str) * 16U + xtoi_1(str + 1);
}
-#ifdef HAVE_GPGME_ASSUAN_ENGINE
static void percent_unescape(std::string &s, bool plus2space)
{
std::string::iterator src = s.begin(), dest = s.begin(), end = s.end();
@@ -94,7 +89,6 @@ static void percent_unescape(std::string &s, bool plus2space)
}
s.erase(dest, end);
}
-#endif
void initializeLibrary()
{
@@ -158,11 +152,7 @@ int Error::toErrno() const
// static
bool Error::hasSystemError()
{
-#ifdef HAVE_GPGME_GPG_ERROR_WRAPPERS
return gpgme_err_code_from_syserror() == GPG_ERR_MISSING_ERRNO ;
-#else
- return gpg_err_code_from_syserror() == GPG_ERR_MISSING_ERRNO ;
-#endif
}
// static
@@ -174,41 +164,25 @@ void Error::setSystemError(gpg_err_code_t err)
// static
void Error::setErrno(int err)
{
-#ifdef HAVE_GPGME_GPG_ERROR_WRAPPERS
gpgme_err_set_errno(err);
-#else
- gpg_err_set_errno(err);
-#endif
}
// static
Error Error::fromSystemError(unsigned int src)
{
-#ifdef HAVE_GPGME_GPG_ERROR_WRAPPERS
return Error(gpgme_err_make(static_cast<gpgme_err_source_t>(src), gpgme_err_code_from_syserror()));
-#else
- return Error(gpg_err_make(static_cast<gpg_err_source_t>(src), gpg_err_code_from_syserror()));
-#endif
}
// static
Error Error::fromErrno(int err, unsigned int src)
{
-//#ifdef HAVE_GPGME_GPG_ERROR_WRAPPERS
return Error(gpgme_err_make(static_cast<gpgme_err_source_t>(src), gpgme_err_code_from_errno(err)));
-//#else
-// return Error( gpg_err_make( static_cast<gpg_err_source_t>( src ), gpg_err_from_from_errno( err ) ) );
-//#endif
}
// static
Error Error::fromCode(unsigned int err, unsigned int src)
{
-//#ifdef HAVE_GPGME_GPG_ERROR_WRAPPERS
return Error(gpgme_err_make(static_cast<gpgme_err_source_t>(src), static_cast<gpgme_err_code_t>(err)));
-//#else
-// return Error( gpg_err_make( static_cast<gpg_err_source_t>( src ), static_cast<gpgme_err_code_t>( err ) ) );
-//#endif
}
std::ostream &operator<<(std::ostream &os, const Error &err)
@@ -264,7 +238,6 @@ std::auto_ptr<Context> Context::createForEngine(Engine eng, Error *error)
switch (eng) {
case AssuanEngine:
-#ifdef HAVE_GPGME_ASSUAN_ENGINE
if (const gpgme_error_t err = gpgme_set_protocol(ctx, GPGME_PROTOCOL_ASSUAN)) {
gpgme_release(ctx);
if (error) {
@@ -273,14 +246,7 @@ std::auto_ptr<Context> Context::createForEngine(Engine eng, Error *error)
return std::auto_ptr<Context>();
}
break;
-#else
- if (error) {
- *error = Error::fromCode(GPG_ERR_NOT_SUPPORTED);
- }
- return std::auto_ptr<Context>();
-#endif
case G13Engine:
-#ifdef HAVE_GPGME_G13_VFS
if (const gpgme_error_t err = gpgme_set_protocol(ctx, GPGME_PROTOCOL_G13)) {
gpgme_release(ctx);
if (error) {
@@ -289,12 +255,6 @@ std::auto_ptr<Context> Context::createForEngine(Engine eng, Error *error)
return std::auto_ptr<Context>();
}
break;
-#else
- if (error) {
- *error = Error::fromCode(GPG_ERR_NOT_SUPPORTED);
- }
- return std::auto_ptr<Context>();
-#endif
default:
if (error) {
*error = Error::fromCode(GPG_ERR_INV_ARG);
@@ -373,29 +333,17 @@ bool Context::textMode() const
void Context::setOffline(bool useOfflineMode)
{
-#ifdef HAVE_GPGME_CTX_OFFLINE
gpgme_set_offline(d->ctx, int(useOfflineMode));
-#else
- Q_UNUSED(useOfflineMode);
-#endif
}
bool Context::offline() const
{
-#ifdef HAVE_GPGME_CTX_OFFLINE
return gpgme_get_offline(d->ctx);
-#else
- return false;
-#endif
}
void Context::setIncludeCertificates(int which)
{
if (which == DefaultCertificates) {
-#ifdef HAVE_GPGME_INCLUDE_CERTS_DEFAULT
which = GPGME_INCLUDE_CERTS_DEFAULT;
-#else
- which = 1;
-#endif
}
gpgme_set_include_certs(d->ctx, which);
}
@@ -492,31 +440,19 @@ Error Context::setLocale(int cat, const char *val)
EngineInfo Context::engineInfo() const
{
-#ifdef HAVE_GPGME_CTX_GETSET_ENGINE_INFO
return EngineInfo(gpgme_ctx_get_engine_info(d->ctx));
-#else
- return EngineInfo();
-#endif
}
Error Context::setEngineFileName(const char *filename)
{
-#ifdef HAVE_GPGME_CTX_GETSET_ENGINE_INFO
const char *const home_dir = engineInfo().homeDirectory();
return Error(gpgme_ctx_set_engine_info(d->ctx, gpgme_get_protocol(d->ctx), filename, home_dir));
-#else
- return Error::fromCode(GPG_ERR_NOT_IMPLEMENTED);
-#endif
}
Error Context::setEngineHomeDirectory(const char *home_dir)
{
-#ifdef HAVE_GPGME_CTX_GETSET_ENGINE_INFO
const char *const filename = engineInfo().fileName();
return Error(gpgme_ctx_set_engine_info(d->ctx, gpgme_get_protocol(d->ctx), filename, home_dir));
-#else
- return Error::fromCode(GPG_ERR_NOT_IMPLEMENTED);
-#endif
}
//
@@ -648,7 +584,6 @@ ImportResult Context::importKeys(const std::vector<Key> &kk)
d->lasterr = make_error(GPG_ERR_NOT_IMPLEMENTED);
bool shouldHaveResult = false;
-#ifdef HAVE_GPGME_OP_IMPORT_KEYS
const boost::scoped_array<gpgme_key_t> keys(new gpgme_key_t[ kk.size() + 1 ]);
gpgme_key_t *keys_it = &keys[0];
for (std::vector<Key>::const_iterator it = kk.begin(), end = kk.end() ; it != end ; ++it) {
@@ -659,7 +594,6 @@ ImportResult Context::importKeys(const std::vector<Key> &kk)
*keys_it++ = 0;
d->lasterr = gpgme_op_import_keys(d->ctx, keys.get());
shouldHaveResult = true;
-#endif
if ((gpgme_err_code(d->lasterr) == GPG_ERR_NOT_IMPLEMENTED ||
gpgme_err_code(d->lasterr) == GPG_ERR_NOT_SUPPORTED) &&
protocol() == CMS) {
@@ -706,7 +640,6 @@ Error Context::startKeyImport(const Data &data)
Error Context::startKeyImport(const std::vector<Key> &kk)
{
d->lastop = Private::Import;
-#ifdef HAVE_GPGME_OP_IMPORT_KEYS
const boost::scoped_array<gpgme_key_t> keys(new gpgme_key_t[ kk.size() + 1 ]);
gpgme_key_t *keys_it = &keys[0];
for (std::vector<Key>::const_iterator it = kk.begin(), end = kk.end() ; it != end ; ++it) {
@@ -716,10 +649,6 @@ Error Context::startKeyImport(const std::vector<Key> &kk)
}
*keys_it++ = 0;
return Error(d->lasterr = gpgme_op_import_keys_start(d->ctx, keys.get()));
-#else
- (void)kk;
- return Error(d->lasterr = make_error(GPG_ERR_NOT_IMPLEMENTED));
-#endif
}
ImportResult Context::importResult() const
@@ -746,23 +675,13 @@ Error Context::startKeyDeletion(const Key &key, bool allowSecretKeyDeletion)
Error Context::passwd(const Key &key)
{
d->lastop = Private::Passwd;
-#ifdef HAVE_GPGME_OP_PASSWD
return Error(d->lasterr = gpgme_op_passwd(d->ctx, key.impl(), 0U));
-#else
- (void)key;
- return Error(d->lasterr = make_error(GPG_ERR_NOT_IMPLEMENTED));
-#endif
}
Error Context::startPasswd(const Key &key)
{
d->lastop = Private::Passwd;
-#ifdef HAVE_GPGME_OP_PASSWD
return Error(d->lasterr = gpgme_op_passwd_start(d->ctx, key.impl(), 0U));
-#else
- (void)key;
- return Error(d->lasterr = make_error(GPG_ERR_NOT_IMPLEMENTED));
-#endif
}
Error Context::edit(const Key &key, std::auto_ptr<EditInteractor> func, Data &data)
@@ -847,7 +766,6 @@ Error Context::endTrustItemListing()
return Error(d->lasterr = gpgme_op_trustlist_end(d->ctx));
}
-#ifdef HAVE_GPGME_ASSUAN_ENGINE
static gpgme_error_t assuan_transaction_data_callback(void *opaque, const void *data, size_t datalen)
{
assert(opaque);
@@ -881,7 +799,6 @@ static gpgme_error_t assuan_transaction_status_callback(void *opaque, const char
percent_unescape(a, true); // ### why doesn't gpgme do this??
return t->status(status, a.c_str()).encodedError();
}
-#endif
AssuanResult Context::assuanTransact(const char *command)
{
@@ -895,7 +812,6 @@ AssuanResult Context::assuanTransact(const char *command, std::auto_ptr<AssuanTr
if (!d->lastAssuanTransaction.get()) {
return AssuanResult(Error(d->lasterr = make_error(GPG_ERR_INV_ARG)));
}
-#ifdef HAVE_GPGME_ASSUAN_ENGINE
d->lasterr = gpgme_op_assuan_transact(d->ctx, command,
assuan_transaction_data_callback,
d->lastAssuanTransaction.get(),
@@ -903,10 +819,6 @@ AssuanResult Context::assuanTransact(const char *command, std::auto_ptr<AssuanTr
d, // sic!
assuan_transaction_status_callback,
d->lastAssuanTransaction.get());
-#else
- (void)command;
- d->lasterr = make_error(GPG_ERR_NOT_SUPPORTED);
-#endif
return AssuanResult(d->ctx, d->lasterr);
}
@@ -922,7 +834,6 @@ Error Context::startAssuanTransaction(const char *command, std::auto_ptr<AssuanT
if (!d->lastAssuanTransaction.get()) {
return Error(d->lasterr = make_error(GPG_ERR_INV_ARG));
}
-#ifdef HAVE_GPGME_ASSUAN_ENGINE
return Error(d->lasterr = gpgme_op_assuan_transact_start(d->ctx, command,
assuan_transaction_data_callback,
d->lastAssuanTransaction.get(),
@@ -930,10 +841,6 @@ Error Context::startAssuanTransaction(const char *command, std::auto_ptr<AssuanT
d, // sic!
assuan_transaction_status_callback,
d->lastAssuanTransaction.get()));
-#else
- (void)command;
- return Error(d->lasterr = make_error(GPG_ERR_NOT_SUPPORTED));
-#endif
}
AssuanResult Context::assuanResult() const
@@ -1042,7 +949,6 @@ Error Context::startCombinedDecryptionAndVerification(const Data &cipherText, Da
return Error(d->lasterr = gpgme_op_decrypt_verify_start(d->ctx, cdp ? cdp->data : 0, pdp ? pdp->data : 0));
}
-#ifdef HAVE_GPGME_OP_GETAUDITLOG
unsigned int to_auditlog_flags(unsigned int flags)
{
unsigned int result = 0;
@@ -1054,30 +960,19 @@ unsigned int to_auditlog_flags(unsigned int flags)
}
return result;
}
-#endif // HAVE_GPGME_OP_GETAUDITLOG
Error Context::startGetAuditLog(Data &output, unsigned int flags)
{
d->lastop = Private::GetAuditLog;
-#ifdef HAVE_GPGME_OP_GETAUDITLOG
Data::Private *const odp = output.impl();
return Error(d->lasterr = gpgme_op_getauditlog_start(d->ctx, odp ? odp->data : 0, to_auditlog_flags(flags)));
-#else
- (void)output; (void)flags;
- return Error(d->lasterr = make_error(GPG_ERR_NOT_IMPLEMENTED));
-#endif
}
Error Context::getAuditLog(Data &output, unsigned int flags)
{
d->lastop = Private::GetAuditLog;
-#ifdef HAVE_GPGME_OP_GETAUDITLOG
Data::Private *const odp = output.impl();
return Error(d->lasterr = gpgme_op_getauditlog(d->ctx, odp ? odp->data : 0, to_auditlog_flags(flags)));
-#else
- (void)output; (void)flags;
- return Error(d->lasterr = make_error(GPG_ERR_NOT_IMPLEMENTED));
-#endif
}
void Context::clearSigningKeys()
@@ -1108,46 +1003,30 @@ std::vector<Key> Context::signingKeys() const
void Context::clearSignatureNotations()
{
-#ifdef HAVE_GPGME_SIG_NOTATION_CLEARADDGET
gpgme_sig_notation_clear(d->ctx);
-#endif
}
GpgME::Error Context::addSignatureNotation(const char *name, const char *value, unsigned int flags)
{
-#ifdef HAVE_GPGME_SIG_NOTATION_CLEARADDGET
return Error(gpgme_sig_notation_add(d->ctx, name, value, add_to_gpgme_sig_notation_flags_t(0, flags)));
-#else
- (void)name; (void)value; (void)flags;
- return Error(make_error(GPG_ERR_NOT_IMPLEMENTED));
-#endif
}
GpgME::Error Context::addSignaturePolicyURL(const char *url, bool critical)
{
-#ifdef HAVE_GPGME_SIG_NOTATION_CLEARADDGET
return Error(gpgme_sig_notation_add(d->ctx, 0, url, critical ? GPGME_SIG_NOTATION_CRITICAL : 0));
-#else
- (void)url; (void)critical;
- return Error(make_error(GPG_ERR_NOT_IMPLEMENTED));
-#endif
}
const char *Context::signaturePolicyURL() const
{
-#ifdef HAVE_GPGME_SIG_NOTATION_CLEARADDGET
for (gpgme_sig_notation_t n = gpgme_sig_notation_get(d->ctx) ; n ; n = n->next) {
if (!n->name) {
return n->value;
}
}
-#endif
- return 0;
}
Notation Context::signatureNotation(unsigned int idx) const
{
-#ifdef HAVE_GPGME_SIG_NOTATION_CLEARADDGET
for (gpgme_sig_notation_t n = gpgme_sig_notation_get(d->ctx) ; n ; n = n->next) {
if (n->name) {
if (idx-- == 0) {
@@ -1155,20 +1034,17 @@ Notation Context::signatureNotation(unsigned int idx) const
}
}
}
-#endif
return Notation();
}
std::vector<Notation> Context::signatureNotations() const
{
std::vector<Notation> result;
-#ifdef HAVE_GPGME_SIG_NOTATION_CLEARADDGET
for (gpgme_sig_notation_t n = gpgme_sig_notation_get(d->ctx) ; n ; n = n->next) {
if (n->name) {
result.push_back(Notation(n));
}
}
-#endif
return result;
}
@@ -1214,22 +1090,18 @@ static gpgme_encrypt_flags_t encryptflags2encryptflags(Context::EncryptionFlags
if (flags & Context::AlwaysTrust) {
result |= GPGME_ENCRYPT_ALWAYS_TRUST;
}
-#ifdef HAVE_GPGME_ENCRYPT_NO_ENCRYPT_TO
if (flags & Context::NoEncryptTo) {
result |= GPGME_ENCRYPT_NO_ENCRYPT_TO;
}
-#endif
return static_cast<gpgme_encrypt_flags_t>(result);
}
EncryptionResult Context::encrypt(const std::vector<Key> &recipients, const Data &plainText, Data &cipherText, EncryptionFlags flags)
{
d->lastop = Private::Encrypt;
-#ifndef HAVE_GPGME_ENCRYPT_NO_ENCRYPT_TO
if (flags & NoEncryptTo) {
return EncryptionResult(Error(d->lasterr = make_error(GPG_ERR_NOT_IMPLEMENTED)));
}
-#endif
const Data::Private *const pdp = plainText.impl();
Data::Private *const cdp = cipherText.impl();
gpgme_key_t *const keys = new gpgme_key_t[ recipients.size() + 1 ];
@@ -1258,11 +1130,9 @@ Error Context::encryptSymmetrically(const Data &plainText, Data &cipherText)
Error Context::startEncryption(const std::vector<Key> &recipients, const Data &plainText, Data &cipherText, EncryptionFlags flags)
{
d->lastop = Private::Encrypt;
-#ifndef HAVE_GPGME_ENCRYPT_NO_ENCRYPT_TO
if (flags & NoEncryptTo) {
return Error(d->lasterr = make_error(GPG_ERR_NOT_IMPLEMENTED));
}
-#endif
const Data::Private *const pdp = plainText.impl();
Data::Private *const cdp = cipherText.impl();
gpgme_key_t *const keys = new gpgme_key_t[ recipients.size() + 1 ];
@@ -1330,7 +1200,6 @@ Error Context::startCombinedSigningAndEncryption(const std::vector<Key> &recipie
Error Context::createVFS(const char *containerFile, const std::vector< Key > &recipients)
{
d->lastop = Private::CreateVFS;
-#ifdef HAVE_GPGME_G13_VFS
gpgme_key_t *const keys = new gpgme_key_t[ recipients.size() + 1 ];
gpgme_key_t *keys_it = keys;
for (std::vector<Key>::const_iterator it = recipients.begin() ; it != recipients.end() ; ++it) {
@@ -1348,34 +1217,19 @@ Error Context::createVFS(const char *containerFile, const std::vector< Key > &re
return error;
}
return Error(d->lasterr = op_err);
-#else
- Q_UNUSED(containerFile);
- Q_UNUSED(recipients);
- return Error(d->lasterr = make_error(GPG_ERR_NOT_SUPPORTED));
-#endif
}
VfsMountResult Context::mountVFS(const char *containerFile, const char *mountDir)
{
d->lastop = Private::MountVFS;
-#ifdef HAVE_GPGME_G13_VFS
gpgme_error_t op_err;
d->lasterr = gpgme_op_vfs_mount(d->ctx, containerFile, mountDir, 0, &op_err);
return VfsMountResult(d->ctx, Error(d->lasterr), Error(op_err));
-#else
- Q_UNUSED(containerFile);
- Q_UNUSED(mountDir);
- return VfsMountResult(d->ctx, Error(d->lasterr = make_error(GPG_ERR_NOT_SUPPORTED)), Error());
-#endif
}
Error Context::cancelPendingOperation()
{
-#ifdef HAVE_GPGME_CANCEL_ASYNC
return Error(gpgme_cancel_async(d->ctx));
-#else
- return Error(gpgme_cancel(d->ctx));
-#endif
}
bool Context::poll()
@@ -1553,23 +1407,11 @@ static gpgme_protocol_t engine2protocol(const GpgME::Engine engine)
case GpgME::GpgEngine: return GPGME_PROTOCOL_OpenPGP;
case GpgME::GpgSMEngine: return GPGME_PROTOCOL_CMS;
case GpgME::GpgConfEngine:
-#ifdef HAVE_GPGME_PROTOCOL_GPGCONF
return GPGME_PROTOCOL_GPGCONF;
-#else
- break;
-#endif
case GpgME::AssuanEngine:
-#ifdef HAVE_GPGME_ASSUAN_ENGINE
return GPGME_PROTOCOL_ASSUAN;
-#else
- break;
-#endif
case GpgME::G13Engine:
-#ifdef HAVE_GPGME_G13_VFS
return GPGME_PROTOCOL_G13;
-#else
- break;
-#endif
case GpgME::UnknownEngine:
;
}
@@ -1605,90 +1447,34 @@ static const unsigned long supported_features = 0
| GpgME::ValidatingKeylistModeFeature
| GpgME::CancelOperationFeature
| GpgME::WrongKeyUsageFeature
-#ifdef HAVE_GPGME_INCLUDE_CERTS_DEFAULT
| GpgME::DefaultCertificateInclusionFeature
-#endif
-#ifdef HAVE_GPGME_CTX_GETSET_ENGINE_INFO
| GpgME::GetSetEngineInfoFeature
-#endif
-#ifdef HAVE_GPGME_SIG_NOTATION_CLEARADDGET
| GpgME::ClearAddGetSignatureNotationsFeature
-#endif
-#ifdef HAVE_GPGME_DATA_SET_FILE_NAME
| GpgME::SetDataFileNameFeeature
-#endif
-#ifdef HAVE_GPGME_KEYLIST_MODE_SIG_NOTATIONS
| GpgME::SignatureNotationsKeylistModeFeature
-#endif
-#ifdef HAVE_GPGME_KEY_SIG_NOTATIONS
| GpgME::KeySignatureNotationsFeature
-#endif
-#ifdef HAVE_GPGME_KEY_T_IS_QUALIFIED
| GpgME::KeyIsQualifiedFeature
-#endif
-#ifdef HAVE_GPGME_SIG_NOTATION_CRITICAL
| GpgME::SignatureNotationsCriticalFlagFeature
-#endif
-#ifdef HAVE_GPGME_SIG_NOTATION_FLAGS_T
| GpgME::SignatureNotationsFlagsFeature
-#endif
-#ifdef HAVE_GPGME_SIG_NOTATION_HUMAN_READABLE
| GpgME::SignatureNotationsHumanReadableFlagFeature
-#endif
-#ifdef HAVE_GPGME_SUBKEY_T_IS_QUALIFIED
| GpgME::SubkeyIsQualifiedFeature
-#endif
-#ifdef HAVE_GPGME_ENGINE_INFO_T_HOME_DIR
| GpgME::EngineInfoHomeDirFeature
-#endif
-#ifdef HAVE_GPGME_DECRYPT_RESULT_T_FILE_NAME
| GpgME::DecryptionResultFileNameFeature
-#endif
-#ifdef HAVE_GPGME_DECRYPT_RESULT_T_RECIPIENTS
| GpgME::DecryptionResultRecipientsFeature
-#endif
-#ifdef HAVE_GPGME_VERIFY_RESULT_T_FILE_NAME
| GpgME::VerificationResultFileNameFeature
-#endif
-#ifdef HAVE_GPGME_SIGNATURE_T_PKA_FIELDS
| GpgME::SignaturePkaFieldsFeature
-#endif
-#ifdef HAVE_GPGME_SIGNATURE_T_ALGORITHM_FIELDS
| GpgME::SignatureAlgorithmFieldsFeature
-#endif
-#ifdef HAVE_GPGME_GET_FDPTR
| GpgME::FdPointerFeature
-#endif
-#ifdef HAVE_GPGME_OP_GETAUDITLOG
| GpgME::AuditLogFeature
-#endif
-#ifdef HAVE_GPGME_PROTOCOL_GPGCONF
| GpgME::GpgConfEngineFeature
-#endif
-#ifdef HAVE_GPGME_CANCEL_ASYNC
| GpgME::CancelOperationAsyncFeature
-#endif
-#ifdef HAVE_GPGME_ENCRYPT_NO_ENCRYPT_TO
| GpgME::NoEncryptToEncryptionFlagFeature
-#endif
-#ifdef HAVE_GPGME_SUBKEY_T_IS_CARDKEY
| GpgME::CardKeyFeature
-#endif
-#ifdef HAVE_GPGME_ASSUAN_ENGINE
| GpgME::AssuanEngineFeature
-#endif
-#ifdef HAVE_GPGME_KEYLIST_MODE_EPHEMERAL
| GpgME::EphemeralKeylistModeFeature
-#endif
-#ifdef HAVE_GPGME_OP_IMPORT_KEYS
| GpgME::ImportFromKeyserverFeature
-#endif
-#ifdef HAVE_GPGME_G13_VFS
| GpgME::G13VFSFeature
-#endif
-#ifdef HAVE_GPGME_OP_PASSWD
| GpgME::PasswdFeature
-#endif
;
static const unsigned long supported_features2 = 0