summaryrefslogtreecommitdiff
path: root/lang/qt/src
diff options
context:
space:
mode:
Diffstat (limited to 'lang/qt/src')
-rw-r--r--lang/qt/src/AddUserIDJob1
-rw-r--r--lang/qt/src/ChangeExpiryJob1
-rw-r--r--lang/qt/src/ChangeOwnerTrustJob1
-rw-r--r--lang/qt/src/ChangePasswdJob1
-rw-r--r--lang/qt/src/CryptoConfig1
-rw-r--r--lang/qt/src/DataProvider1
-rw-r--r--lang/qt/src/DecryptJob1
-rw-r--r--lang/qt/src/DecryptVerifyJob1
-rw-r--r--lang/qt/src/DefaultKeyGenerationJob1
-rw-r--r--lang/qt/src/DeleteJob1
-rw-r--r--lang/qt/src/DownloadJob1
-rw-r--r--lang/qt/src/EncryptJob1
-rw-r--r--lang/qt/src/ExportJob1
-rw-r--r--lang/qt/src/HierarchicalKeyKistJob1
-rw-r--r--lang/qt/src/ImportFromKeyserverJob1
-rw-r--r--lang/qt/src/ImportJob1
-rw-r--r--lang/qt/src/Job1
-rw-r--r--lang/qt/src/KeyForMailboxJob1
-rw-r--r--lang/qt/src/KeyGenerationJob1
-rw-r--r--lang/qt/src/KeyListJob1
-rw-r--r--lang/qt/src/ListAllKeysJob1
-rw-r--r--lang/qt/src/Makefile.am256
-rw-r--r--lang/qt/src/Makefile.in1123
-rw-r--r--lang/qt/src/MultiDeleteJob1
-rw-r--r--lang/qt/src/Protocol1
-rw-r--r--lang/qt/src/QGpgMENewCryptoConfig1
-rw-r--r--lang/qt/src/QGpgmeConfig.cmake.in.in107
-rw-r--r--lang/qt/src/QGpgmeConfigVersion.cmake.in31
-rw-r--r--lang/qt/src/RefreshKeysJob1
-rw-r--r--lang/qt/src/SignEncryptJob1
-rw-r--r--lang/qt/src/SignJob1
-rw-r--r--lang/qt/src/SignKeyJob1
-rw-r--r--lang/qt/src/TofuPolicyJob1
-rw-r--r--lang/qt/src/VerifyDetachedJob1
-rw-r--r--lang/qt/src/VerifyOpaqueJob1
-rw-r--r--lang/qt/src/WKSPublishJob1
-rw-r--r--lang/qt/src/abstractimportjob.h64
-rw-r--r--lang/qt/src/adduseridjob.h84
-rw-r--r--lang/qt/src/changeexpiryjob.h84
-rw-r--r--lang/qt/src/changeownertrustjob.h81
-rw-r--r--lang/qt/src/changepasswdjob.h82
-rw-r--r--lang/qt/src/cryptoconfig.h400
-rw-r--r--lang/qt/src/dataprovider.cpp282
-rw-r--r--lang/qt/src/dataprovider.h95
-rw-r--r--lang/qt/src/decryptjob.h100
-rw-r--r--lang/qt/src/decryptverifyjob.h105
-rw-r--r--lang/qt/src/defaultkeygenerationjob.cpp125
-rw-r--r--lang/qt/src/defaultkeygenerationjob.h76
-rw-r--r--lang/qt/src/deletejob.h83
-rw-r--r--lang/qt/src/downloadjob.h103
-rw-r--r--lang/qt/src/encryptjob.h136
-rw-r--r--lang/qt/src/exportjob.h87
-rw-r--r--lang/qt/src/gpgme_backend_debug.cpp10
-rw-r--r--lang/qt/src/gpgme_backend_debug.h11
-rw-r--r--lang/qt/src/hierarchicalkeylistjob.h125
-rw-r--r--lang/qt/src/importfromkeyserverjob.h84
-rw-r--r--lang/qt/src/importjob.h83
-rw-r--r--lang/qt/src/job.cpp159
-rw-r--r--lang/qt/src/job.h92
-rw-r--r--lang/qt/src/keyformailboxjob.h106
-rw-r--r--lang/qt/src/keygenerationjob.h85
-rw-r--r--lang/qt/src/keylistjob.h109
-rw-r--r--lang/qt/src/listallkeysjob.h104
-rw-r--r--lang/qt/src/multideletejob.h107
-rw-r--r--lang/qt/src/protocol.h183
-rw-r--r--lang/qt/src/protocol_p.h419
-rw-r--r--lang/qt/src/qgpgme_export.h73
-rw-r--r--lang/qt/src/qgpgme_version.h.in32
-rw-r--r--lang/qt/src/qgpgmeadduseridjob.cpp80
-rw-r--r--lang/qt/src/qgpgmeadduseridjob.h65
-rw-r--r--lang/qt/src/qgpgmebackend.cpp203
-rw-r--r--lang/qt/src/qgpgmebackend.h92
-rw-r--r--lang/qt/src/qgpgmechangeexpiryjob.cpp80
-rw-r--r--lang/qt/src/qgpgmechangeexpiryjob.h66
-rw-r--r--lang/qt/src/qgpgmechangeownertrustjob.cpp76
-rw-r--r--lang/qt/src/qgpgmechangeownertrustjob.h65
-rw-r--r--lang/qt/src/qgpgmechangepasswdjob.cpp79
-rw-r--r--lang/qt/src/qgpgmechangepasswdjob.h66
-rw-r--r--lang/qt/src/qgpgmedecryptjob.cpp128
-rw-r--r--lang/qt/src/qgpgmedecryptjob.h84
-rw-r--r--lang/qt/src/qgpgmedecryptverifyjob.cpp135
-rw-r--r--lang/qt/src/qgpgmedecryptverifyjob.h89
-rw-r--r--lang/qt/src/qgpgmedeletejob.cpp65
-rw-r--r--lang/qt/src/qgpgmedeletejob.h71
-rw-r--r--lang/qt/src/qgpgmedownloadjob.cpp100
-rw-r--r--lang/qt/src/qgpgmedownloadjob.h69
-rw-r--r--lang/qt/src/qgpgmeencryptjob.cpp170
-rw-r--r--lang/qt/src/qgpgmeencryptjob.h109
-rw-r--r--lang/qt/src/qgpgmeexportjob.cpp76
-rw-r--r--lang/qt/src/qgpgmeexportjob.h66
-rw-r--r--lang/qt/src/qgpgmeimportfromkeyserverjob.cpp82
-rw-r--r--lang/qt/src/qgpgmeimportfromkeyserverjob.h81
-rw-r--r--lang/qt/src/qgpgmeimportjob.cpp85
-rw-r--r--lang/qt/src/qgpgmeimportjob.h81
-rw-r--r--lang/qt/src/qgpgmekeyformailboxjob.cpp138
-rw-r--r--lang/qt/src/qgpgmekeyformailboxjob.h84
-rw-r--r--lang/qt/src/qgpgmekeygenerationjob.cpp71
-rw-r--r--lang/qt/src/qgpgmekeygenerationjob.h72
-rw-r--r--lang/qt/src/qgpgmekeylistjob.cpp172
-rw-r--r--lang/qt/src/qgpgmekeylistjob.h88
-rw-r--r--lang/qt/src/qgpgmelistallkeysjob.cpp168
-rw-r--r--lang/qt/src/qgpgmelistallkeysjob.h86
-rw-r--r--lang/qt/src/qgpgmenewcryptoconfig.cpp738
-rw-r--r--lang/qt/src/qgpgmenewcryptoconfig.h189
-rw-r--r--lang/qt/src/qgpgmerefreshkeysjob.cpp225
-rw-r--r--lang/qt/src/qgpgmerefreshkeysjob.h79
-rw-r--r--lang/qt/src/qgpgmesecretkeyexportjob.cpp142
-rw-r--r--lang/qt/src/qgpgmesecretkeyexportjob.h81
-rw-r--r--lang/qt/src/qgpgmesignencryptjob.cpp171
-rw-r--r--lang/qt/src/qgpgmesignencryptjob.h121
-rw-r--r--lang/qt/src/qgpgmesignjob.cpp163
-rw-r--r--lang/qt/src/qgpgmesignjob.h101
-rw-r--r--lang/qt/src/qgpgmesignkeyjob.cpp125
-rw-r--r--lang/qt/src/qgpgmesignkeyjob.h94
-rw-r--r--lang/qt/src/qgpgmetofupolicyjob.cpp65
-rw-r--r--lang/qt/src/qgpgmetofupolicyjob.h65
-rw-r--r--lang/qt/src/qgpgmeverifydetachedjob.cpp118
-rw-r--r--lang/qt/src/qgpgmeverifydetachedjob.h85
-rw-r--r--lang/qt/src/qgpgmeverifyopaquejob.cpp125
-rw-r--r--lang/qt/src/qgpgmeverifyopaquejob.h84
-rw-r--r--lang/qt/src/qgpgmewkspublishjob.cpp189
-rw-r--r--lang/qt/src/qgpgmewkspublishjob.h70
-rw-r--r--lang/qt/src/refreshkeysjob.h94
-rw-r--r--lang/qt/src/signencryptjob.h153
-rw-r--r--lang/qt/src/signjob.h122
-rw-r--r--lang/qt/src/signkeyjob.h117
-rw-r--r--lang/qt/src/specialjob.h91
-rw-r--r--lang/qt/src/threadedjobmixin.cpp110
-rw-r--r--lang/qt/src/threadedjobmixin.h272
-rw-r--r--lang/qt/src/tofupolicyjob.h80
-rw-r--r--lang/qt/src/verifydetachedjob.h99
-rw-r--r--lang/qt/src/verifyopaquejob.h101
-rw-r--r--lang/qt/src/wkspublishjob.h101
133 files changed, 12930 insertions, 0 deletions
diff --git a/lang/qt/src/AddUserIDJob b/lang/qt/src/AddUserIDJob
new file mode 100644
index 0000000..87d82ec
--- /dev/null
+++ b/lang/qt/src/AddUserIDJob
@@ -0,0 +1 @@
+#include "qgpgme/adduseridjob.h"
diff --git a/lang/qt/src/ChangeExpiryJob b/lang/qt/src/ChangeExpiryJob
new file mode 100644
index 0000000..f5eea6a
--- /dev/null
+++ b/lang/qt/src/ChangeExpiryJob
@@ -0,0 +1 @@
+#include "qgpgme/changeexpiryjob.h"
diff --git a/lang/qt/src/ChangeOwnerTrustJob b/lang/qt/src/ChangeOwnerTrustJob
new file mode 100644
index 0000000..03635d5
--- /dev/null
+++ b/lang/qt/src/ChangeOwnerTrustJob
@@ -0,0 +1 @@
+#include "qgpgme/changeownertrustjob.h"
diff --git a/lang/qt/src/ChangePasswdJob b/lang/qt/src/ChangePasswdJob
new file mode 100644
index 0000000..3660940
--- /dev/null
+++ b/lang/qt/src/ChangePasswdJob
@@ -0,0 +1 @@
+#include "qgpgme/changepasswdjob.h"
diff --git a/lang/qt/src/CryptoConfig b/lang/qt/src/CryptoConfig
new file mode 100644
index 0000000..4edbd19
--- /dev/null
+++ b/lang/qt/src/CryptoConfig
@@ -0,0 +1 @@
+#include "qgpgme/cryptoconfig.h"
diff --git a/lang/qt/src/DataProvider b/lang/qt/src/DataProvider
new file mode 100644
index 0000000..6a43c1d
--- /dev/null
+++ b/lang/qt/src/DataProvider
@@ -0,0 +1 @@
+#include "qgpgme/dataprovider.h"
diff --git a/lang/qt/src/DecryptJob b/lang/qt/src/DecryptJob
new file mode 100644
index 0000000..c0f9845
--- /dev/null
+++ b/lang/qt/src/DecryptJob
@@ -0,0 +1 @@
+#include "qgpgme/decryptjob.h"
diff --git a/lang/qt/src/DecryptVerifyJob b/lang/qt/src/DecryptVerifyJob
new file mode 100644
index 0000000..e3de1cc
--- /dev/null
+++ b/lang/qt/src/DecryptVerifyJob
@@ -0,0 +1 @@
+#include "qgpgme/decryptverifyjob.h"
diff --git a/lang/qt/src/DefaultKeyGenerationJob b/lang/qt/src/DefaultKeyGenerationJob
new file mode 100644
index 0000000..1dc8c40
--- /dev/null
+++ b/lang/qt/src/DefaultKeyGenerationJob
@@ -0,0 +1 @@
+#include "qgpgme/defaultkeygenerationjob.h"
diff --git a/lang/qt/src/DeleteJob b/lang/qt/src/DeleteJob
new file mode 100644
index 0000000..a2fdc4a
--- /dev/null
+++ b/lang/qt/src/DeleteJob
@@ -0,0 +1 @@
+#include "qgpgme/deletejob.h"
diff --git a/lang/qt/src/DownloadJob b/lang/qt/src/DownloadJob
new file mode 100644
index 0000000..9b47aac
--- /dev/null
+++ b/lang/qt/src/DownloadJob
@@ -0,0 +1 @@
+#include "qgpgme/downloadjob.h"
diff --git a/lang/qt/src/EncryptJob b/lang/qt/src/EncryptJob
new file mode 100644
index 0000000..59a878d
--- /dev/null
+++ b/lang/qt/src/EncryptJob
@@ -0,0 +1 @@
+#include "qgpgme/encryptjob.h"
diff --git a/lang/qt/src/ExportJob b/lang/qt/src/ExportJob
new file mode 100644
index 0000000..1d053fd
--- /dev/null
+++ b/lang/qt/src/ExportJob
@@ -0,0 +1 @@
+#include "qgpgme/exportjob.h"
diff --git a/lang/qt/src/HierarchicalKeyKistJob b/lang/qt/src/HierarchicalKeyKistJob
new file mode 100644
index 0000000..cd31f48
--- /dev/null
+++ b/lang/qt/src/HierarchicalKeyKistJob
@@ -0,0 +1 @@
+#include "qgpgme/hierarchicalkeykistjob.h"
diff --git a/lang/qt/src/ImportFromKeyserverJob b/lang/qt/src/ImportFromKeyserverJob
new file mode 100644
index 0000000..17a5fd6
--- /dev/null
+++ b/lang/qt/src/ImportFromKeyserverJob
@@ -0,0 +1 @@
+#include "qgpgme/importfromkeyserverjob.h"
diff --git a/lang/qt/src/ImportJob b/lang/qt/src/ImportJob
new file mode 100644
index 0000000..e5228d7
--- /dev/null
+++ b/lang/qt/src/ImportJob
@@ -0,0 +1 @@
+#include "qgpgme/importjob.h"
diff --git a/lang/qt/src/Job b/lang/qt/src/Job
new file mode 100644
index 0000000..3a45ca7
--- /dev/null
+++ b/lang/qt/src/Job
@@ -0,0 +1 @@
+#include "qgpgme/job.h"
diff --git a/lang/qt/src/KeyForMailboxJob b/lang/qt/src/KeyForMailboxJob
new file mode 100644
index 0000000..2d2b8cb
--- /dev/null
+++ b/lang/qt/src/KeyForMailboxJob
@@ -0,0 +1 @@
+#include "qgpgme/keyformailboxjob.h"
diff --git a/lang/qt/src/KeyGenerationJob b/lang/qt/src/KeyGenerationJob
new file mode 100644
index 0000000..1612ba7
--- /dev/null
+++ b/lang/qt/src/KeyGenerationJob
@@ -0,0 +1 @@
+#include "qgpgme/keygenerationjob.h"
diff --git a/lang/qt/src/KeyListJob b/lang/qt/src/KeyListJob
new file mode 100644
index 0000000..7366665
--- /dev/null
+++ b/lang/qt/src/KeyListJob
@@ -0,0 +1 @@
+#include "qgpgme/keylistjob.h"
diff --git a/lang/qt/src/ListAllKeysJob b/lang/qt/src/ListAllKeysJob
new file mode 100644
index 0000000..8023f8f
--- /dev/null
+++ b/lang/qt/src/ListAllKeysJob
@@ -0,0 +1 @@
+#include "qgpgme/listallkeysjob.h"
diff --git a/lang/qt/src/Makefile.am b/lang/qt/src/Makefile.am
new file mode 100644
index 0000000..c15da18
--- /dev/null
+++ b/lang/qt/src/Makefile.am
@@ -0,0 +1,256 @@
+# Makefile.am for GPGMEPP.
+# Copyright (C) 2016 Intevation GmbH
+#
+# This file is part of GPGMEPP.
+#
+# GPGME-CL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GPGME-CL 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 Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA
+lib_LTLIBRARIES = libqgpgme.la
+EXTRA_DIST = QGpgmeConfig.cmake.in.in QGpgmeConfigVersion.cmake.in \
+ gpgme_backend_debug.h qgpgme_version.h.in
+
+qgpgme_sources = \
+ dataprovider.cpp job.cpp qgpgmeadduseridjob.cpp \
+ qgpgmebackend.cpp qgpgmechangeexpiryjob.cpp qgpgmechangeownertrustjob.cpp \
+ qgpgmechangepasswdjob.cpp qgpgmedecryptjob.cpp \
+ qgpgmedecryptverifyjob.cpp qgpgmedeletejob.cpp qgpgmedownloadjob.cpp \
+ qgpgmeencryptjob.cpp qgpgmeexportjob.cpp qgpgmeimportfromkeyserverjob.cpp \
+ qgpgmeimportjob.cpp qgpgmekeygenerationjob.cpp qgpgmekeylistjob.cpp \
+ qgpgmelistallkeysjob.cpp qgpgmenewcryptoconfig.cpp \
+ qgpgmerefreshkeysjob.cpp \
+ qgpgmesecretkeyexportjob.cpp qgpgmesignencryptjob.cpp \
+ qgpgmesignjob.cpp qgpgmesignkeyjob.cpp qgpgmeverifydetachedjob.cpp \
+ qgpgmeverifyopaquejob.cpp threadedjobmixin.cpp \
+ qgpgmekeyformailboxjob.cpp gpgme_backend_debug.cpp \
+ qgpgmetofupolicyjob.cpp \
+ defaultkeygenerationjob.cpp qgpgmewkspublishjob.cpp
+
+# If you add one here make sure that you also add one in camelcase
+qgpgme_headers= \
+ adduseridjob.h \
+ changeexpiryjob.h \
+ changeownertrustjob.h \
+ changepasswdjob.h \
+ dataprovider.h \
+ decryptjob.h \
+ decryptverifyjob.h \
+ downloadjob.h \
+ encryptjob.h \
+ exportjob.h \
+ hierarchicalkeylistjob.h \
+ job.h \
+ keyformailboxjob.h \
+ multideletejob.h \
+ protocol.h \
+ qgpgme_export.h \
+ qgpgmenewcryptoconfig.h \
+ signjob.h \
+ signkeyjob.h \
+ signencryptjob.h \
+ verifyopaquejob.h \
+ refreshkeysjob.h \
+ cryptoconfig.h \
+ deletejob.h \
+ importfromkeyserverjob.h \
+ importjob.h \
+ keygenerationjob.h \
+ keylistjob.h \
+ listallkeysjob.h \
+ verifydetachedjob.h \
+ defaultkeygenerationjob.h \
+ tofupolicyjob.h \
+ wkspublishjob.h
+
+camelcase_headers= \
+ AddUserIDJob \
+ ChangeExpiryJob \
+ ChangeOwnerTrustJob \
+ ChangePasswdJob \
+ DataProvider \
+ DecryptJob \
+ DecryptVerifyJob \
+ DownloadJob \
+ EncryptJob \
+ ExportJob \
+ HierarchicalKeyKistJob \
+ Job \
+ MultiDeleteJob \
+ Protocol \
+ QGpgMENewCryptoConfig \
+ SignJob \
+ SignKeyJob \
+ SignEncryptJob \
+ VerifyOpaqueJob \
+ RefreshKeysJob \
+ CryptoConfig \
+ DeleteJob \
+ ImportFromKeyserverJob \
+ ImportJob \
+ KeyGenerationJob \
+ KeyListJob \
+ ListAllKeysJob \
+ VerifyDetachedJob \
+ KeyForMailboxJob \
+ DefaultKeyGenerationJob \
+ WKSPublishJob \
+ TofuPolicyJob
+
+private_qgpgme_headers = \
+ qgpgme_export.h \
+ abstractimportjob.h \
+ protocol_p.h \
+ qgpgmeadduseridjob.h \
+ qgpgmebackend.h \
+ qgpgmechangeexpiryjob.h \
+ qgpgmechangeownertrustjob.h \
+ qgpgmechangepasswdjob.h \
+ qgpgmedecryptjob.h \
+ qgpgmedecryptverifyjob.h \
+ qgpgmedeletejob.h \
+ qgpgmedownloadjob.h \
+ qgpgmeencryptjob.h \
+ qgpgmeexportjob.h \
+ qgpgmeimportfromkeyserverjob.h \
+ qgpgmeimportjob.h \
+ qgpgmekeygenerationjob.h \
+ qgpgmekeylistjob.h \
+ qgpgmelistallkeysjob.h \
+ qgpgmerefreshkeysjob.h \
+ qgpgmesecretkeyexportjob.h \
+ qgpgmesignencryptjob.h \
+ qgpgmesignjob.h \
+ qgpgmesignkeyjob.h \
+ qgpgmeverifydetachedjob.h \
+ qgpgmeverifyopaquejob.h \
+ qgpgmekeyformailboxjob.h \
+ qgpgmewkspublishjob.h \
+ qgpgmetofupolicyjob.h \
+ specialjob.h \
+ threadedjobmixin.h
+
+qgpgme_moc_sources = \
+ abstractimportjob.moc \
+ adduseridjob.moc \
+ changeexpiryjob.moc \
+ changeownertrustjob.moc \
+ changepasswdjob.moc \
+ decryptjob.moc \
+ decryptverifyjob.moc \
+ deletejob.moc \
+ downloadjob.moc \
+ encryptjob.moc \
+ exportjob.moc \
+ hierarchicalkeylistjob.moc \
+ importfromkeyserverjob.moc \
+ importjob.moc \
+ job.moc \
+ keygenerationjob.moc \
+ keylistjob.moc \
+ listallkeysjob.moc \
+ multideletejob.moc \
+ qgpgmeadduseridjob.moc \
+ qgpgmechangeexpiryjob.moc \
+ qgpgmechangeownertrustjob.moc \
+ qgpgmechangepasswdjob.moc \
+ qgpgmedecryptjob.moc \
+ qgpgmedecryptverifyjob.moc \
+ qgpgmedeletejob.moc \
+ qgpgmedownloadjob.moc \
+ qgpgmeencryptjob.moc \
+ qgpgmeexportjob.moc \
+ qgpgmeimportfromkeyserverjob.moc \
+ qgpgmeimportjob.moc \
+ qgpgmekeygenerationjob.moc \
+ qgpgmekeylistjob.moc \
+ qgpgmelistallkeysjob.moc \
+ qgpgmerefreshkeysjob.moc \
+ qgpgmesecretkeyexportjob.moc \
+ qgpgmesignencryptjob.moc \
+ qgpgmesignjob.moc \
+ qgpgmesignkeyjob.moc \
+ qgpgmeverifydetachedjob.moc \
+ qgpgmeverifyopaquejob.moc \
+ qgpgmewkspublishjob.moc \
+ tofupolicyjob.moc \
+ qgpgmetofupolicyjob.moc \
+ refreshkeysjob.moc \
+ signencryptjob.moc \
+ signjob.moc \
+ signkeyjob.moc \
+ specialjob.moc \
+ verifydetachedjob.moc \
+ verifyopaquejob.moc \
+ keyformailboxjob.moc \
+ wkspublishjob.moc \
+ qgpgmekeyformailboxjob.moc \
+ defaultkeygenerationjob.moc
+
+qgpgmeincludedir = $(includedir)/qgpgme
+qgpgmeinclude_HEADERS = $(qgpgme_headers)
+camelcaseincludedir = $(includedir)/QGpgME
+camelcaseinclude_HEADERS = $(camelcase_headers)
+nodist_include_HEADERS = qgpgme_version.h
+
+libqgpgme_la_SOURCES = $(qgpgme_sources) $(qgpgme_headers) $(private_qgpgme_headers)
+
+AM_CPPFLAGS = -I$(top_srcdir)/lang/cpp/src -I$(top_builddir)/src \
+ @GPGME_QT_CFLAGS@ @GPG_ERROR_CFLAGS@ @LIBASSUAN_CFLAGS@ \
+ -DBUILDING_QGPGME
+
+libqgpgme_la_LIBADD = ../../cpp/src/libgpgmepp.la ../../../src/libgpgme.la \
+ @LIBASSUAN_LIBS@ @GPGME_QT_LIBS@
+libqgpgme_la_LDFLAGS = -version-info \
+ @LIBQGPGME_LT_CURRENT@:@LIBQGPGME_LT_REVISION@:@LIBQGPGME_LT_AGE@
+
+if HAVE_W32_SYSTEM
+libsuffix=.dll.a
+else
+libsuffix=.so
+endif
+
+QGpgmeConfig.cmake: QGpgmeConfig.cmake.in
+ sed -e 's|[@]resolved_libdir@|$(libdir)|g' < "$<" > "$@"
+ sed -e 's|[@]libsuffix@|$(libsuffix)|g' < "$@" > "$@".2
+ mv "$@".2 "$@"
+
+$(camelcase_headers): Makefile.am
+ echo -n "#include \"qgpgme/" > "$@"
+ echo -n "$@" | tr '[:upper:]' '[:lower:]' >> "$@"
+ echo ".h\"" >> "$@"
+
+install-cmake-files: QGpgmeConfig.cmake QGpgmeConfigVersion.cmake
+ -$(INSTALL) -d $(DESTDIR)$(libdir)/cmake/Gpgmepp
+ $(INSTALL) QGpgmeConfig.cmake \
+ $(DESTDIR)$(libdir)/cmake/Gpgmepp/QGpgmeConfig.cmake
+ $(INSTALL) QGpgmeConfigVersion.cmake \
+ $(DESTDIR)$(libdir)/cmake/Gpgmepp/QGpgmeConfigVersion.cmake
+
+uninstall-cmake-files:
+ -rm $(DESTDIR)$(libdir)/cmake/Gpgmepp/QGpgmeConfigVersion.cmake
+ -rm $(DESTDIR)$(libdir)/cmake/Gpgmepp/QGpgmeConfig.cmake
+ -rmdir $(DESTDIR)$(libdir)/cmake/Gpgmepp/
+
+install-data-local: install-cmake-files
+
+uninstall-local: uninstall-cmake-files
+
+BUILT_SOURCES = $(qgpgme_moc_sources) $(camelcase_headers)
+
+CLEANFILES = $(qgpgme_moc_sources) $(camelcase_headers) QGpgmeConfig.cmake
+
+nodist_libqgpgme_la_SOURCES = $(qgpgme_moc_sources)
+
+.h.moc:
+ $(MOC) `test -f '$<' || echo '$(srcdir)/'`$< -o $@
diff --git a/lang/qt/src/Makefile.in b/lang/qt/src/Makefile.in
new file mode 100644
index 0000000..d10eca3
--- /dev/null
+++ b/lang/qt/src/Makefile.in
@@ -0,0 +1,1123 @@
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = lang/qt/src
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/build-aux/mkinstalldirs \
+ $(srcdir)/QGpgmeConfig.cmake.in.in \
+ $(srcdir)/QGpgmeConfigVersion.cmake.in \
+ $(srcdir)/qgpgme_version.h.in $(top_srcdir)/build-aux/depcomp \
+ $(camelcaseinclude_HEADERS) $(qgpgmeinclude_HEADERS)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_pkg_swig.m4 \
+ $(top_srcdir)/m4/ax_python_devel.m4 \
+ $(top_srcdir)/m4/glib-2.0.m4 $(top_srcdir)/m4/glibc21.m4 \
+ $(top_srcdir)/m4/gnupg-ttyname.m4 \
+ $(top_srcdir)/m4/gpg-error.m4 $(top_srcdir)/m4/libassuan.m4 \
+ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
+ $(top_srcdir)/m4/qt.m4 $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/build-aux/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = QGpgmeConfig.cmake.in QGpgmeConfigVersion.cmake \
+ qgpgme_version.h
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(libdir)" \
+ "$(DESTDIR)$(camelcaseincludedir)" "$(DESTDIR)$(includedir)" \
+ "$(DESTDIR)$(qgpgmeincludedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+libqgpgme_la_DEPENDENCIES = ../../cpp/src/libgpgmepp.la \
+ ../../../src/libgpgme.la
+am__objects_1 = dataprovider.lo job.lo qgpgmeadduseridjob.lo \
+ qgpgmebackend.lo qgpgmechangeexpiryjob.lo \
+ qgpgmechangeownertrustjob.lo qgpgmechangepasswdjob.lo \
+ qgpgmedecryptjob.lo qgpgmedecryptverifyjob.lo \
+ qgpgmedeletejob.lo qgpgmedownloadjob.lo qgpgmeencryptjob.lo \
+ qgpgmeexportjob.lo qgpgmeimportfromkeyserverjob.lo \
+ qgpgmeimportjob.lo qgpgmekeygenerationjob.lo \
+ qgpgmekeylistjob.lo qgpgmelistallkeysjob.lo \
+ qgpgmenewcryptoconfig.lo qgpgmerefreshkeysjob.lo \
+ qgpgmesecretkeyexportjob.lo qgpgmesignencryptjob.lo \
+ qgpgmesignjob.lo qgpgmesignkeyjob.lo \
+ qgpgmeverifydetachedjob.lo qgpgmeverifyopaquejob.lo \
+ threadedjobmixin.lo qgpgmekeyformailboxjob.lo \
+ gpgme_backend_debug.lo qgpgmetofupolicyjob.lo \
+ defaultkeygenerationjob.lo qgpgmewkspublishjob.lo
+am__objects_2 =
+am_libqgpgme_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
+ $(am__objects_2)
+nodist_libqgpgme_la_OBJECTS = $(am__objects_2)
+libqgpgme_la_OBJECTS = $(am_libqgpgme_la_OBJECTS) \
+ $(nodist_libqgpgme_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+libqgpgme_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(libqgpgme_la_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(libqgpgme_la_SOURCES) $(nodist_libqgpgme_la_SOURCES)
+DIST_SOURCES = $(libqgpgme_la_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+HEADERS = $(camelcaseinclude_HEADERS) $(nodist_include_HEADERS) \
+ $(qgpgmeinclude_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_FILEVERSION = @BUILD_FILEVERSION@
+BUILD_REVISION = @BUILD_REVISION@
+BUILD_TIMESTAMP = @BUILD_TIMESTAMP@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOXYGEN = @DOXYGEN@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLED_LANGUAGES = @ENABLED_LANGUAGES@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GITLOG_TO_CHANGELOG = @GITLOG_TO_CHANGELOG@
+GLIBC21 = @GLIBC21@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_QUERY = @GOBJECT_QUERY@
+GPGME_CONFIG_API_VERSION = @GPGME_CONFIG_API_VERSION@
+GPGME_CONFIG_AVAIL_LANG = @GPGME_CONFIG_AVAIL_LANG@
+GPGME_CONFIG_CFLAGS = @GPGME_CONFIG_CFLAGS@
+GPGME_CONFIG_HOST = @GPGME_CONFIG_HOST@
+GPGME_CONFIG_LIBS = @GPGME_CONFIG_LIBS@
+GPGME_QTTEST_CFLAGS = @GPGME_QTTEST_CFLAGS@
+GPGME_QTTEST_LIBS = @GPGME_QTTEST_LIBS@
+GPGME_QT_CFLAGS = @GPGME_QT_CFLAGS@
+GPGME_QT_LIBS = @GPGME_QT_LIBS@
+GPG_ERROR_CFLAGS = @GPG_ERROR_CFLAGS@
+GPG_ERROR_CONFIG = @GPG_ERROR_CONFIG@
+GPG_ERROR_LIBS = @GPG_ERROR_LIBS@
+GPG_ERROR_MT_CFLAGS = @GPG_ERROR_MT_CFLAGS@
+GPG_ERROR_MT_LIBS = @GPG_ERROR_MT_LIBS@
+GRAPHVIZ = @GRAPHVIZ@
+GREP = @GREP@
+HAVE_CXX11 = @HAVE_CXX11@
+HAVE_DOT = @HAVE_DOT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBASSUAN_CFLAGS = @LIBASSUAN_CFLAGS@
+LIBASSUAN_CONFIG = @LIBASSUAN_CONFIG@
+LIBASSUAN_LIBS = @LIBASSUAN_LIBS@
+LIBGPGMEPP_LT_AGE = @LIBGPGMEPP_LT_AGE@
+LIBGPGMEPP_LT_CURRENT = @LIBGPGMEPP_LT_CURRENT@
+LIBGPGMEPP_LT_REVISION = @LIBGPGMEPP_LT_REVISION@
+LIBGPGME_LT_AGE = @LIBGPGME_LT_AGE@
+LIBGPGME_LT_CURRENT = @LIBGPGME_LT_CURRENT@
+LIBGPGME_LT_REVISION = @LIBGPGME_LT_REVISION@
+LIBOBJS = @LIBOBJS@
+LIBQGPGME_LT_AGE = @LIBQGPGME_LT_AGE@
+LIBQGPGME_LT_CURRENT = @LIBQGPGME_LT_CURRENT@
+LIBQGPGME_LT_REVISION = @LIBQGPGME_LT_REVISION@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MOC = @MOC@
+MOC2 = @MOC2@
+NEED__FILE_OFFSET_BITS = @NEED__FILE_OFFSET_BITS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PYTHON = @PYTHON@
+PYTHONS = @PYTHONS@
+PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@
+PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@
+PYTHON_LDFLAGS = @PYTHON_LDFLAGS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_SITE_PKG = @PYTHON_SITE_PKG@
+PYTHON_VERSION = @PYTHON_VERSION@
+PYTHON_VERSIONS = @PYTHON_VERSIONS@
+QTCHOOSER = @QTCHOOSER@
+RANLIB = @RANLIB@
+RC = @RC@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SWIG_LIB = @SWIG_LIB@
+SYSROOT = @SYSROOT@
+VERSION = @VERSION@
+VERSION_NUMBER = @VERSION_NUMBER@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+emacs_local_vars_begin = @emacs_local_vars_begin@
+emacs_local_vars_end = @emacs_local_vars_end@
+emacs_local_vars_read_only = @emacs_local_vars_read_only@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# Makefile.am for GPGMEPP.
+# Copyright (C) 2016 Intevation GmbH
+#
+# This file is part of GPGMEPP.
+#
+# GPGME-CL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GPGME-CL 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 Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA
+lib_LTLIBRARIES = libqgpgme.la
+EXTRA_DIST = QGpgmeConfig.cmake.in.in QGpgmeConfigVersion.cmake.in \
+ gpgme_backend_debug.h qgpgme_version.h.in
+
+qgpgme_sources = \
+ dataprovider.cpp job.cpp qgpgmeadduseridjob.cpp \
+ qgpgmebackend.cpp qgpgmechangeexpiryjob.cpp qgpgmechangeownertrustjob.cpp \
+ qgpgmechangepasswdjob.cpp qgpgmedecryptjob.cpp \
+ qgpgmedecryptverifyjob.cpp qgpgmedeletejob.cpp qgpgmedownloadjob.cpp \
+ qgpgmeencryptjob.cpp qgpgmeexportjob.cpp qgpgmeimportfromkeyserverjob.cpp \
+ qgpgmeimportjob.cpp qgpgmekeygenerationjob.cpp qgpgmekeylistjob.cpp \
+ qgpgmelistallkeysjob.cpp qgpgmenewcryptoconfig.cpp \
+ qgpgmerefreshkeysjob.cpp \
+ qgpgmesecretkeyexportjob.cpp qgpgmesignencryptjob.cpp \
+ qgpgmesignjob.cpp qgpgmesignkeyjob.cpp qgpgmeverifydetachedjob.cpp \
+ qgpgmeverifyopaquejob.cpp threadedjobmixin.cpp \
+ qgpgmekeyformailboxjob.cpp gpgme_backend_debug.cpp \
+ qgpgmetofupolicyjob.cpp \
+ defaultkeygenerationjob.cpp qgpgmewkspublishjob.cpp
+
+
+# If you add one here make sure that you also add one in camelcase
+qgpgme_headers = \
+ adduseridjob.h \
+ changeexpiryjob.h \
+ changeownertrustjob.h \
+ changepasswdjob.h \
+ dataprovider.h \
+ decryptjob.h \
+ decryptverifyjob.h \
+ downloadjob.h \
+ encryptjob.h \
+ exportjob.h \
+ hierarchicalkeylistjob.h \
+ job.h \
+ keyformailboxjob.h \
+ multideletejob.h \
+ protocol.h \
+ qgpgme_export.h \
+ qgpgmenewcryptoconfig.h \
+ signjob.h \
+ signkeyjob.h \
+ signencryptjob.h \
+ verifyopaquejob.h \
+ refreshkeysjob.h \
+ cryptoconfig.h \
+ deletejob.h \
+ importfromkeyserverjob.h \
+ importjob.h \
+ keygenerationjob.h \
+ keylistjob.h \
+ listallkeysjob.h \
+ verifydetachedjob.h \
+ defaultkeygenerationjob.h \
+ tofupolicyjob.h \
+ wkspublishjob.h
+
+camelcase_headers = \
+ AddUserIDJob \
+ ChangeExpiryJob \
+ ChangeOwnerTrustJob \
+ ChangePasswdJob \
+ DataProvider \
+ DecryptJob \
+ DecryptVerifyJob \
+ DownloadJob \
+ EncryptJob \
+ ExportJob \
+ HierarchicalKeyKistJob \
+ Job \
+ MultiDeleteJob \
+ Protocol \
+ QGpgMENewCryptoConfig \
+ SignJob \
+ SignKeyJob \
+ SignEncryptJob \
+ VerifyOpaqueJob \
+ RefreshKeysJob \
+ CryptoConfig \
+ DeleteJob \
+ ImportFromKeyserverJob \
+ ImportJob \
+ KeyGenerationJob \
+ KeyListJob \
+ ListAllKeysJob \
+ VerifyDetachedJob \
+ KeyForMailboxJob \
+ DefaultKeyGenerationJob \
+ WKSPublishJob \
+ TofuPolicyJob
+
+private_qgpgme_headers = \
+ qgpgme_export.h \
+ abstractimportjob.h \
+ protocol_p.h \
+ qgpgmeadduseridjob.h \
+ qgpgmebackend.h \
+ qgpgmechangeexpiryjob.h \
+ qgpgmechangeownertrustjob.h \
+ qgpgmechangepasswdjob.h \
+ qgpgmedecryptjob.h \
+ qgpgmedecryptverifyjob.h \
+ qgpgmedeletejob.h \
+ qgpgmedownloadjob.h \
+ qgpgmeencryptjob.h \
+ qgpgmeexportjob.h \
+ qgpgmeimportfromkeyserverjob.h \
+ qgpgmeimportjob.h \
+ qgpgmekeygenerationjob.h \
+ qgpgmekeylistjob.h \
+ qgpgmelistallkeysjob.h \
+ qgpgmerefreshkeysjob.h \
+ qgpgmesecretkeyexportjob.h \
+ qgpgmesignencryptjob.h \
+ qgpgmesignjob.h \
+ qgpgmesignkeyjob.h \
+ qgpgmeverifydetachedjob.h \
+ qgpgmeverifyopaquejob.h \
+ qgpgmekeyformailboxjob.h \
+ qgpgmewkspublishjob.h \
+ qgpgmetofupolicyjob.h \
+ specialjob.h \
+ threadedjobmixin.h
+
+qgpgme_moc_sources = \
+ abstractimportjob.moc \
+ adduseridjob.moc \
+ changeexpiryjob.moc \
+ changeownertrustjob.moc \
+ changepasswdjob.moc \
+ decryptjob.moc \
+ decryptverifyjob.moc \
+ deletejob.moc \
+ downloadjob.moc \
+ encryptjob.moc \
+ exportjob.moc \
+ hierarchicalkeylistjob.moc \
+ importfromkeyserverjob.moc \
+ importjob.moc \
+ job.moc \
+ keygenerationjob.moc \
+ keylistjob.moc \
+ listallkeysjob.moc \
+ multideletejob.moc \
+ qgpgmeadduseridjob.moc \
+ qgpgmechangeexpiryjob.moc \
+ qgpgmechangeownertrustjob.moc \
+ qgpgmechangepasswdjob.moc \
+ qgpgmedecryptjob.moc \
+ qgpgmedecryptverifyjob.moc \
+ qgpgmedeletejob.moc \
+ qgpgmedownloadjob.moc \
+ qgpgmeencryptjob.moc \
+ qgpgmeexportjob.moc \
+ qgpgmeimportfromkeyserverjob.moc \
+ qgpgmeimportjob.moc \
+ qgpgmekeygenerationjob.moc \
+ qgpgmekeylistjob.moc \
+ qgpgmelistallkeysjob.moc \
+ qgpgmerefreshkeysjob.moc \
+ qgpgmesecretkeyexportjob.moc \
+ qgpgmesignencryptjob.moc \
+ qgpgmesignjob.moc \
+ qgpgmesignkeyjob.moc \
+ qgpgmeverifydetachedjob.moc \
+ qgpgmeverifyopaquejob.moc \
+ qgpgmewkspublishjob.moc \
+ tofupolicyjob.moc \
+ qgpgmetofupolicyjob.moc \
+ refreshkeysjob.moc \
+ signencryptjob.moc \
+ signjob.moc \
+ signkeyjob.moc \
+ specialjob.moc \
+ verifydetachedjob.moc \
+ verifyopaquejob.moc \
+ keyformailboxjob.moc \
+ wkspublishjob.moc \
+ qgpgmekeyformailboxjob.moc \
+ defaultkeygenerationjob.moc
+
+qgpgmeincludedir = $(includedir)/qgpgme
+qgpgmeinclude_HEADERS = $(qgpgme_headers)
+camelcaseincludedir = $(includedir)/QGpgME
+camelcaseinclude_HEADERS = $(camelcase_headers)
+nodist_include_HEADERS = qgpgme_version.h
+libqgpgme_la_SOURCES = $(qgpgme_sources) $(qgpgme_headers) $(private_qgpgme_headers)
+AM_CPPFLAGS = -I$(top_srcdir)/lang/cpp/src -I$(top_builddir)/src \
+ @GPGME_QT_CFLAGS@ @GPG_ERROR_CFLAGS@ @LIBASSUAN_CFLAGS@ \
+ -DBUILDING_QGPGME
+
+libqgpgme_la_LIBADD = ../../cpp/src/libgpgmepp.la ../../../src/libgpgme.la \
+ @LIBASSUAN_LIBS@ @GPGME_QT_LIBS@
+
+libqgpgme_la_LDFLAGS = -version-info \
+ @LIBQGPGME_LT_CURRENT@:@LIBQGPGME_LT_REVISION@:@LIBQGPGME_LT_AGE@
+
+@HAVE_W32_SYSTEM_FALSE@libsuffix = .so
+@HAVE_W32_SYSTEM_TRUE@libsuffix = .dll.a
+BUILT_SOURCES = $(qgpgme_moc_sources) $(camelcase_headers)
+CLEANFILES = $(qgpgme_moc_sources) $(camelcase_headers) QGpgmeConfig.cmake
+nodist_libqgpgme_la_SOURCES = $(qgpgme_moc_sources)
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .h .lo .moc .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lang/qt/src/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu lang/qt/src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+QGpgmeConfig.cmake.in: $(top_builddir)/config.status $(srcdir)/QGpgmeConfig.cmake.in.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+QGpgmeConfigVersion.cmake: $(top_builddir)/config.status $(srcdir)/QGpgmeConfigVersion.cmake.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+qgpgme_version.h: $(top_builddir)/config.status $(srcdir)/qgpgme_version.h.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+libqgpgme.la: $(libqgpgme_la_OBJECTS) $(libqgpgme_la_DEPENDENCIES) $(EXTRA_libqgpgme_la_DEPENDENCIES)
+ $(AM_V_CXXLD)$(libqgpgme_la_LINK) -rpath $(libdir) $(libqgpgme_la_OBJECTS) $(libqgpgme_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dataprovider.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/defaultkeygenerationjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgme_backend_debug.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeadduseridjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmebackend.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmechangeexpiryjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmechangeownertrustjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmechangepasswdjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmedecryptjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmedecryptverifyjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmedeletejob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmedownloadjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeencryptjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeexportjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeimportfromkeyserverjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeimportjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmekeyformailboxjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmekeygenerationjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmekeylistjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmelistallkeysjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmenewcryptoconfig.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmerefreshkeysjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmesecretkeyexportjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmesignencryptjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmesignjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmesignkeyjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmetofupolicyjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeverifydetachedjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeverifyopaquejob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmewkspublishjob.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threadedjobmixin.Plo@am__quote@
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-camelcaseincludeHEADERS: $(camelcaseinclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ @list='$(camelcaseinclude_HEADERS)'; test -n "$(camelcaseincludedir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(camelcaseincludedir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(camelcaseincludedir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(camelcaseincludedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(camelcaseincludedir)" || exit $$?; \
+ done
+
+uninstall-camelcaseincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(camelcaseinclude_HEADERS)'; test -n "$(camelcaseincludedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(camelcaseincludedir)'; $(am__uninstall_files_from_dir)
+install-nodist_includeHEADERS: $(nodist_include_HEADERS)
+ @$(NORMAL_INSTALL)
+ @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+ done
+
+uninstall-nodist_includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+install-qgpgmeincludeHEADERS: $(qgpgmeinclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ @list='$(qgpgmeinclude_HEADERS)'; test -n "$(qgpgmeincludedir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(qgpgmeincludedir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(qgpgmeincludedir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(qgpgmeincludedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(qgpgmeincludedir)" || exit $$?; \
+ done
+
+uninstall-qgpgmeincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(qgpgmeinclude_HEADERS)'; test -n "$(qgpgmeincludedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(qgpgmeincludedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(camelcaseincludedir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(qgpgmeincludedir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-camelcaseincludeHEADERS install-data-local \
+ install-nodist_includeHEADERS install-qgpgmeincludeHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-camelcaseincludeHEADERS \
+ uninstall-libLTLIBRARIES uninstall-local \
+ uninstall-nodist_includeHEADERS uninstall-qgpgmeincludeHEADERS
+
+.MAKE: all check install install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \
+ ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am \
+ install-camelcaseincludeHEADERS install-data install-data-am \
+ install-data-local install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-libLTLIBRARIES install-man \
+ install-nodist_includeHEADERS install-pdf install-pdf-am \
+ install-ps install-ps-am install-qgpgmeincludeHEADERS \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-camelcaseincludeHEADERS uninstall-libLTLIBRARIES \
+ uninstall-local uninstall-nodist_includeHEADERS \
+ uninstall-qgpgmeincludeHEADERS
+
+
+QGpgmeConfig.cmake: QGpgmeConfig.cmake.in
+ sed -e 's|[@]resolved_libdir@|$(libdir)|g' < "$<" > "$@"
+ sed -e 's|[@]libsuffix@|$(libsuffix)|g' < "$@" > "$@".2
+ mv "$@".2 "$@"
+
+$(camelcase_headers): Makefile.am
+ echo -n "#include \"qgpgme/" > "$@"
+ echo -n "$@" | tr '[:upper:]' '[:lower:]' >> "$@"
+ echo ".h\"" >> "$@"
+
+install-cmake-files: QGpgmeConfig.cmake QGpgmeConfigVersion.cmake
+ -$(INSTALL) -d $(DESTDIR)$(libdir)/cmake/Gpgmepp
+ $(INSTALL) QGpgmeConfig.cmake \
+ $(DESTDIR)$(libdir)/cmake/Gpgmepp/QGpgmeConfig.cmake
+ $(INSTALL) QGpgmeConfigVersion.cmake \
+ $(DESTDIR)$(libdir)/cmake/Gpgmepp/QGpgmeConfigVersion.cmake
+
+uninstall-cmake-files:
+ -rm $(DESTDIR)$(libdir)/cmake/Gpgmepp/QGpgmeConfigVersion.cmake
+ -rm $(DESTDIR)$(libdir)/cmake/Gpgmepp/QGpgmeConfig.cmake
+ -rmdir $(DESTDIR)$(libdir)/cmake/Gpgmepp/
+
+install-data-local: install-cmake-files
+
+uninstall-local: uninstall-cmake-files
+
+.h.moc:
+ $(MOC) `test -f '$<' || echo '$(srcdir)/'`$< -o $@
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/lang/qt/src/MultiDeleteJob b/lang/qt/src/MultiDeleteJob
new file mode 100644
index 0000000..e398c79
--- /dev/null
+++ b/lang/qt/src/MultiDeleteJob
@@ -0,0 +1 @@
+#include "qgpgme/multideletejob.h"
diff --git a/lang/qt/src/Protocol b/lang/qt/src/Protocol
new file mode 100644
index 0000000..6f92b75
--- /dev/null
+++ b/lang/qt/src/Protocol
@@ -0,0 +1 @@
+#include "qgpgme/protocol.h"
diff --git a/lang/qt/src/QGpgMENewCryptoConfig b/lang/qt/src/QGpgMENewCryptoConfig
new file mode 100644
index 0000000..99f353f
--- /dev/null
+++ b/lang/qt/src/QGpgMENewCryptoConfig
@@ -0,0 +1 @@
+#include "qgpgme/qgpgmenewcryptoconfig.h"
diff --git a/lang/qt/src/QGpgmeConfig.cmake.in.in b/lang/qt/src/QGpgmeConfig.cmake.in.in
new file mode 100644
index 0000000..3d19696
--- /dev/null
+++ b/lang/qt/src/QGpgmeConfig.cmake.in.in
@@ -0,0 +1,107 @@
+# CMake Config file for QGPGME.
+# Copyright (C) 2016 Intevation GmbH
+#
+# This file is part of GPGME.
+#
+# GPGME-CL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GPGME-CL 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 Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA
+
+# based on a generated file from cmake.
+# Generated by CMake 3.0.2
+
+if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.5)
+ message(FATAL_ERROR "CMake >= 2.6.0 required")
+endif()
+cmake_policy(PUSH)
+cmake_policy(VERSION 2.6)
+#----------------------------------------------------------------
+# Generated CMake target import file.
+#----------------------------------------------------------------
+
+# Commands may need to know the format version.
+set(CMAKE_IMPORT_FILE_VERSION 1)
+
+# Protect against multiple inclusion, which would fail when already imported targets are added once more.
+set(_targetsDefined)
+set(_targetsNotDefined)
+set(_expectedTargets)
+foreach(_expectedTarget QGpgme KF5::QGpgme)
+ list(APPEND _expectedTargets ${_expectedTarget})
+ if(NOT TARGET ${_expectedTarget})
+ list(APPEND _targetsNotDefined ${_expectedTarget})
+ endif()
+ if(TARGET ${_expectedTarget})
+ list(APPEND _targetsDefined ${_expectedTarget})
+ endif()
+endforeach()
+if("${_targetsDefined}" STREQUAL "${_expectedTargets}")
+ set(CMAKE_IMPORT_FILE_VERSION)
+ cmake_policy(POP)
+ return()
+endif()
+if(NOT "${_targetsDefined}" STREQUAL "")
+ message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_targetsDefined}\nTargets not yet defined: ${_targetsNotDefined}\n")
+endif()
+unset(_targetsDefined)
+unset(_targetsNotDefined)
+unset(_expectedTargets)
+
+# Compute the installation prefix relative to this file.
+get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
+get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
+get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
+get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
+
+# Create imported target QGpgme
+add_library(QGpgme SHARED IMPORTED)
+
+set_target_properties(QGpgme PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${_IMPORT_PREFIX}/include/qgpgme"
+ INTERFACE_LINK_LIBRARIES "Gpgmepp;Qt5::Core"
+ IMPORTED_LOCATION "@resolved_libdir@/libqgpgme@libsuffix@"
+)
+
+if(CMAKE_VERSION VERSION_LESS 2.8.12)
+ message(FATAL_ERROR "This file relies on consumers using CMake 2.8.12 or greater.")
+endif()
+
+# Cleanup temporary variables.
+set(_IMPORT_PREFIX)
+
+# Loop over all imported files and verify that they actually exist
+foreach(target ${_IMPORT_CHECK_TARGETS} )
+ foreach(file ${_IMPORT_CHECK_FILES_FOR_${target}} )
+ if(NOT EXISTS "${file}" )
+ message(FATAL_ERROR "The imported target \"${target}\" references the file
+ \"${file}\"
+but this file does not exist. Possible reasons include:
+* The file was deleted, renamed, or moved to another location.
+* An install or uninstall procedure did not complete successfully.
+* The installation package was faulty and contained
+ \"${CMAKE_CURRENT_LIST_FILE}\"
+but not all the files it references.
+")
+ endif()
+ endforeach()
+ unset(_IMPORT_CHECK_FILES_FOR_${target})
+endforeach()
+unset(_IMPORT_CHECK_TARGETS)
+
+# This file does not depend on other imported targets which have
+# been exported from the same project but in a separate export set.
+
+# Commands beyond this point should not need to know the version.
+set(CMAKE_IMPORT_FILE_VERSION)
+cmake_policy(POP)
diff --git a/lang/qt/src/QGpgmeConfigVersion.cmake.in b/lang/qt/src/QGpgmeConfigVersion.cmake.in
new file mode 100644
index 0000000..04a12cb
--- /dev/null
+++ b/lang/qt/src/QGpgmeConfigVersion.cmake.in
@@ -0,0 +1,31 @@
+# CMake Version file for QGPGME.
+# Copyright (C) 2016 Intevation GmbH
+#
+# This file is part of GPGME.
+#
+# GPGME-CL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GPGME-CL 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 Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA
+
+# based on a generated file from cmake.
+set(PACKAGE_VERSION "@LIBQGPGME_LT_CURRENT@.@LIBQGPGME_LT_AGE@.@LIBQGPGME_LT_REVISION@.@BUILD_REVISION@")
+
+if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}" )
+ set(PACKAGE_VERSION_COMPATIBLE FALSE)
+else()
+ set(PACKAGE_VERSION_COMPATIBLE TRUE)
+ if( "${PACKAGE_FIND_VERSION}" STREQUAL "${PACKAGE_VERSION}")
+ set(PACKAGE_VERSION_EXACT TRUE)
+ endif()
+endif()
diff --git a/lang/qt/src/RefreshKeysJob b/lang/qt/src/RefreshKeysJob
new file mode 100644
index 0000000..678d8d0
--- /dev/null
+++ b/lang/qt/src/RefreshKeysJob
@@ -0,0 +1 @@
+#include "qgpgme/refreshkeysjob.h"
diff --git a/lang/qt/src/SignEncryptJob b/lang/qt/src/SignEncryptJob
new file mode 100644
index 0000000..4075e49
--- /dev/null
+++ b/lang/qt/src/SignEncryptJob
@@ -0,0 +1 @@
+#include "qgpgme/signencryptjob.h"
diff --git a/lang/qt/src/SignJob b/lang/qt/src/SignJob
new file mode 100644
index 0000000..135cab1
--- /dev/null
+++ b/lang/qt/src/SignJob
@@ -0,0 +1 @@
+#include "qgpgme/signjob.h"
diff --git a/lang/qt/src/SignKeyJob b/lang/qt/src/SignKeyJob
new file mode 100644
index 0000000..094753c
--- /dev/null
+++ b/lang/qt/src/SignKeyJob
@@ -0,0 +1 @@
+#include "qgpgme/signkeyjob.h"
diff --git a/lang/qt/src/TofuPolicyJob b/lang/qt/src/TofuPolicyJob
new file mode 100644
index 0000000..e379942
--- /dev/null
+++ b/lang/qt/src/TofuPolicyJob
@@ -0,0 +1 @@
+#include "qgpgme/tofupolicyjob.h"
diff --git a/lang/qt/src/VerifyDetachedJob b/lang/qt/src/VerifyDetachedJob
new file mode 100644
index 0000000..445fe27
--- /dev/null
+++ b/lang/qt/src/VerifyDetachedJob
@@ -0,0 +1 @@
+#include "qgpgme/verifydetachedjob.h"
diff --git a/lang/qt/src/VerifyOpaqueJob b/lang/qt/src/VerifyOpaqueJob
new file mode 100644
index 0000000..5292a70
--- /dev/null
+++ b/lang/qt/src/VerifyOpaqueJob
@@ -0,0 +1 @@
+#include "qgpgme/verifyopaquejob.h"
diff --git a/lang/qt/src/WKSPublishJob b/lang/qt/src/WKSPublishJob
new file mode 100644
index 0000000..747f7c8
--- /dev/null
+++ b/lang/qt/src/WKSPublishJob
@@ -0,0 +1 @@
+#include "qgpgme/wkspublishjob.h"
diff --git a/lang/qt/src/abstractimportjob.h b/lang/qt/src/abstractimportjob.h
new file mode 100644
index 0000000..572f203
--- /dev/null
+++ b/lang/qt/src/abstractimportjob.h
@@ -0,0 +1,64 @@
+/*
+ abstractimportjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2009 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_ABSTRACTIMPORTJOB_H__
+#define __KLEO_ABSTRACTIMPORTJOB_H__
+
+#include "job.h"
+
+#include "qgpgme_export.h"
+
+namespace GpgME
+{
+class Error;
+class ImportResult;
+}
+
+namespace QGpgME
+{
+
+class QGPGME_EXPORT AbstractImportJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit AbstractImportJob(QObject *parent);
+public:
+ ~AbstractImportJob();
+
+Q_SIGNALS:
+ void result(const GpgME::ImportResult &result, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_IMPORTJOB_H__
diff --git a/lang/qt/src/adduseridjob.h b/lang/qt/src/adduseridjob.h
new file mode 100644
index 0000000..1b5676f
--- /dev/null
+++ b/lang/qt/src/adduseridjob.h
@@ -0,0 +1,84 @@
+/*
+ adduseridjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_ADDUSERIDJOB_H__
+#define __KLEO_ADDUSERIDJOB_H__
+
+#include "job.h"
+
+#include <QtCore/QString>
+
+namespace GpgME
+{
+class Error;
+class Key;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class to asynchronously add UIDs to OpenPGP keys
+
+ To use a AddUserIDJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the job with a call
+ to start(). This call might fail, in which case the AddUserIDJob
+ instance will have scheduled it's own destruction with a call to
+ QObject::deleteLater().
+
+ After result() is emitted, the AddUserIDJob will schedule it's own
+ destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT AddUserIDJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit AddUserIDJob(QObject *parent);
+public:
+ ~AddUserIDJob();
+
+ /**
+ Starts the operation. \a key is the key to add the UID to. \a
+ name, \a email and \a comment are the components of the user id.
+ */
+ virtual GpgME::Error start(const GpgME::Key &key, const QString &name,
+ const QString &email, const QString &comment = QString()) = 0;
+
+Q_SIGNALS:
+ void result(const GpgME::Error &result, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_ADDUSERIDJOB_H__
diff --git a/lang/qt/src/changeexpiryjob.h b/lang/qt/src/changeexpiryjob.h
new file mode 100644
index 0000000..7902cb8
--- /dev/null
+++ b/lang/qt/src/changeexpiryjob.h
@@ -0,0 +1,84 @@
+/*
+ changeexpiryjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_CHANGEEXPIRYJOB_H__
+#define __KLEO_CHANGEEXPIRYJOB_H__
+
+#include "job.h"
+
+namespace GpgME
+{
+class Error;
+class Key;
+}
+
+class QDateTime;
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class to change expiry asynchronously
+
+ To use a ChangeExpiryJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the job with a call
+ to start(). This call might fail, in which case the ChangeExpiryJob
+ instance will have scheduled it's own destruction with a call to
+ QObject::deleteLater().
+
+ After result() is emitted, the ChangeExpiryJob will schedule it's own
+ destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT ChangeExpiryJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit ChangeExpiryJob(QObject *parent);
+public:
+ ~ChangeExpiryJob();
+
+ /**
+ Starts the change-expiry operation. \a key is the key to change
+ the expiry of. \a expiry is the new expiry time. If \a expiry
+ is not valid, \a key is set to never expire.
+ */
+ virtual GpgME::Error start(const GpgME::Key &key, const QDateTime &expiry) = 0;
+
+Q_SIGNALS:
+ void result(const GpgME::Error &result, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_CHANGEEXPIRYJOB_H__
diff --git a/lang/qt/src/changeownertrustjob.h b/lang/qt/src/changeownertrustjob.h
new file mode 100644
index 0000000..75c1163
--- /dev/null
+++ b/lang/qt/src/changeownertrustjob.h
@@ -0,0 +1,81 @@
+/*
+ changeownertrustjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_CHANGEOWNERTRUST_H__
+#define __KLEO_CHANGEOWNERTRUST_H__
+
+#include "job.h"
+
+#ifdef BUILDING_QGPGME
+# include "key.h"
+#else
+# include <gpgme++/key.h>
+#endif
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class to change owner trust asynchronously
+
+ To use a ChangeOwnerTrustJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the job with a call
+ to start(). This call might fail, in which case the ChangeOwnerTrustJob
+ instance will have scheduled it's own destruction with a call to
+ QObject::deleteLater().
+
+ After result() is emitted, the ChangeOwnerTrustJob will schedule it's own
+ destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT ChangeOwnerTrustJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit ChangeOwnerTrustJob(QObject *parent);
+public:
+ ~ChangeOwnerTrustJob();
+
+ /**
+ Starts the change-owner trust operation. \a key is the key to change
+ the owner trust of . \a trust is the new trust level.
+ */
+ virtual GpgME::Error start(const GpgME::Key &key, GpgME::Key::OwnerTrust trust) = 0;
+
+Q_SIGNALS:
+ void result(const GpgME::Error &result, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_CHANGEOWNERTRUSTJOB_H__
diff --git a/lang/qt/src/changepasswdjob.h b/lang/qt/src/changepasswdjob.h
new file mode 100644
index 0000000..7290898
--- /dev/null
+++ b/lang/qt/src/changepasswdjob.h
@@ -0,0 +1,82 @@
+/*
+ changepasswdjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2010 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_CHANGEPASSWDJOB_H__
+#define __KLEO_CHANGEPASSWDJOB_H__
+
+#include "job.h"
+
+namespace GpgME
+{
+class Error;
+class Key;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class to change a key's passphrase asynchronously
+
+ To use a ChangePasswdJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the job with a call
+ to start(). This call might fail, in which case the ChangePasswdJob
+ instance will have scheduled it's own destruction with a call to
+ QObject::deleteLater().
+
+ After result() is emitted, the ChangePasswdJob will schedule it's own
+ destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT ChangePasswdJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit ChangePasswdJob(QObject *parent);
+public:
+ ~ChangePasswdJob();
+
+ /**
+ Starts the passphrase-change operation. \a key is the key to
+ change the passphrase of. The passphrase is queried by the
+ backend directly, you cannot give it to the job beforehand.
+ */
+ virtual GpgME::Error start(const GpgME::Key &key) = 0;
+
+Q_SIGNALS:
+ void result(const GpgME::Error &result, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_CHANGEPASSWDJOB_H__
diff --git a/lang/qt/src/cryptoconfig.h b/lang/qt/src/cryptoconfig.h
new file mode 100644
index 0000000..c3f0c7e
--- /dev/null
+++ b/lang/qt/src/cryptoconfig.h
@@ -0,0 +1,400 @@
+/*
+ cryptoconfig.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef CRYPTOCONFIG_H
+#define CRYPTOCONFIG_H
+
+#include "qgpgme_export.h"
+#ifdef __cplusplus
+/* we read this file from a C compiler, and are only interested in the
+ * enums... */
+
+#include <QUrl>
+
+#include <vector>
+
+/* Start reading this file from the bottom up :) */
+
+namespace QGpgME
+{
+
+/**
+ * Description of a single option
+ */
+class QGPGME_EXPORT CryptoConfigEntry
+{
+
+public:
+#endif /* __cplusplus */
+ /**
+ @li basic This option should always be offered to the user.
+ @li advanced This option may be offered to advanced users.
+ @li expert This option should only be offered to expert users.
+ */
+ enum Level { Level_Basic = 0,
+ Level_Advanced = 1,
+ Level_Expert = 2
+ };
+
+ /**
+ Type of the argument
+ @li ArgType_None The option is set or not set, but no argument.
+ @li ArgType_String An unformatted string.
+ @li ArgType_Int A signed integer number.
+ @li ArgType_UInt An unsigned integer number.
+ @li ArgType_Path A string that describes the pathname of a file.
+ The file does not necessarily need to exist.
+ Separated from string so that e.g. a FileDialog can be used.
+ @li ArgType_DirPath A string that describes the pathname of a directory.
+ The directory does not necessarily need to exist.
+ Separated from path so that e.g. a FileDialog can be used which only
+ allows directories to be selected.
+ @li ArgType_LDAPURL A LDAP URL
+ Separated from URL so that a more specific widget can be shown, hiding the url syntax
+ */
+ enum ArgType { ArgType_None = 0,
+ ArgType_String = 1,
+ ArgType_Int = 2,
+ ArgType_UInt = 3,
+ ArgType_Path = 4,
+ /* Nr. 5 was URL historically. */
+ ArgType_LDAPURL = 6,
+ ArgType_DirPath = 7,
+
+ NumArgType
+ };
+
+#ifdef __cplusplus
+ virtual ~CryptoConfigEntry() {}
+
+ /**
+ * Return the internal name of this entry
+ */
+ virtual QString name() const = 0;
+
+ /**
+ * @return user-visible description of this entry
+ */
+ virtual QString description() const = 0;
+
+ /**
+ * @return "component/group/name"
+ */
+ virtual QString path() const = 0;
+
+ /**
+ * @return true if the argument is optional
+ */
+ virtual bool isOptional() const = 0;
+
+ /**
+ * @return true if the entry is readonly
+ */
+ virtual bool isReadOnly() const = 0;
+
+ /**
+ * @return true if the argument can be given multiple times
+ */
+ virtual bool isList() const = 0;
+
+ /**
+ * @return true if the argument can be changed at runtime
+ */
+ virtual bool isRuntime() const = 0;
+
+ /**
+ * User level
+ */
+ virtual Level level() const = 0;
+
+ /**
+ * Argument type
+ */
+ virtual ArgType argType() const = 0;
+
+ /**
+ * Return true if the option is set, i.e. different from default
+ */
+ virtual bool isSet() const = 0;
+
+ /**
+ * Return value as a bool (only allowed for ArgType_None)
+ */
+ virtual bool boolValue() const = 0;
+
+ /**
+ * Return value as a string (available for all argtypes)
+ * The returned string can be empty (explicitly set to empty) or null (not set).
+ */
+ virtual QString stringValue() const = 0;
+
+ /**
+ * Return value as a signed int
+ */
+ virtual int intValue() const = 0;
+
+ /**
+ * Return value as an unsigned int
+ */
+ virtual unsigned int uintValue() const = 0;
+
+ /**
+ * Return value as a URL (only meaningful for Path and URL argtypes)
+ */
+ virtual QUrl urlValue() const = 0;
+
+ /**
+ * Return number of times the option is set (only valid for ArgType_None, if isList())
+ */
+ virtual unsigned int numberOfTimesSet() const = 0;
+
+ /**
+ * Return value as a list of signed ints
+ */
+ virtual std::vector<int> intValueList() const = 0;
+
+ /**
+ * Return value as a list of unsigned ints
+ */
+ virtual std::vector<unsigned int> uintValueList() const = 0;
+
+ /**
+ * Return value as a list of URLs (only meaningful for Path and URL argtypes, if isList())
+ */
+ virtual QList<QUrl> urlValueList() const = 0;
+
+ /**
+ * Reset an option to its default value
+ */
+ virtual void resetToDefault() = 0;
+
+ /**
+ * Define whether the option is set or not (only allowed for ArgType_None)
+ * #### TODO: and for options with optional args
+ */
+ virtual void setBoolValue(bool) = 0;
+
+ /**
+ * Set string value (allowed for all argtypes)
+ */
+ virtual void setStringValue(const QString &) = 0;
+
+ /**
+ * Set a new signed int value
+ */
+ virtual void setIntValue(int) = 0;
+
+ /**
+ * Set a new unsigned int value
+ */
+ virtual void setUIntValue(unsigned int) = 0;
+
+ /**
+ * Set value as a URL (only meaningful for Path (if local) and URL argtypes)
+ */
+ virtual void setURLValue(const QUrl &) = 0;
+
+ /**
+ * Set the number of times the option is set (only valid for ArgType_None, if isList())
+ */
+ virtual void setNumberOfTimesSet(unsigned int) = 0;
+
+ /**
+ * Set a new list of signed int values
+ */
+ virtual void setIntValueList(const std::vector<int> &) = 0;
+
+ /**
+ * Set a new list of unsigned int values
+ */
+ virtual void setUIntValueList(const std::vector<unsigned int> &) = 0;
+
+ /**
+ * Set value as a URL list (only meaningful for Path (if all URLs are local) and URL argtypes, if isList())
+ */
+ virtual void setURLValueList(const QList<QUrl> &) = 0;
+
+ /**
+ * @return true if the value was changed
+ */
+ virtual bool isDirty() const = 0;
+};
+
+/**
+ * Group containing a set of config options
+ */
+class QGPGME_EXPORT CryptoConfigGroup
+{
+
+public:
+ virtual ~CryptoConfigGroup() {}
+
+ /**
+ * Return the internal name of this group
+ */
+ virtual QString name() const = 0;
+
+ /**
+ * Return the name of the icon for this group
+ */
+ virtual QString iconName() const = 0;
+
+ /**
+ * @return user-visible description of this group
+ */
+ virtual QString description() const = 0;
+
+ /**
+ * @return "component/group"
+ */
+ virtual QString path() const = 0;
+
+ /**
+ * User level
+ */
+ virtual CryptoConfigEntry::Level level() const = 0;
+
+ /**
+ * Returns the list of entries that are known by this group.
+ *
+ * @return list of group entry names.
+ **/
+ virtual QStringList entryList() const = 0;
+
+ /**
+ * @return the configuration object for a given entry in this group
+ * The object is owned by CryptoConfigGroup, don't delete it.
+ * Groups cannot be nested, so all entries returned here are pure entries, no groups.
+ */
+ virtual CryptoConfigEntry *entry(const QString &name) const = 0;
+};
+
+/**
+ * Crypto config for one component (e.g. gpg-agent, dirmngr etc.)
+ */
+class QGPGME_EXPORT CryptoConfigComponent
+{
+
+public:
+ virtual ~CryptoConfigComponent() {}
+
+ /**
+ * Return the internal name of this component
+ */
+ virtual QString name() const = 0;
+
+ /**
+ * Return the name of the icon for this component
+ */
+ virtual QString iconName() const = 0;
+
+ /**
+ * Return user-visible description of this component
+ */
+ virtual QString description() const = 0;
+
+ /**
+ * Returns the list of groups that are known about.
+ *
+ * @return list of group names. One of them can be "<nogroup>", which is the group where all
+ * "toplevel" options (belonging to no group) are.
+ */
+ virtual QStringList groupList() const = 0;
+
+ /**
+ * @return the configuration object for a given group
+ * The object is owned by CryptoConfigComponent, don't delete it.
+ */
+ virtual CryptoConfigGroup *group(const QString &name) const = 0;
+
+};
+
+/**
+ * Main interface to crypto configuration.
+ */
+class QGPGME_EXPORT CryptoConfig
+{
+
+public:
+ virtual ~CryptoConfig() {}
+
+ /**
+ * Returns the list of known components (e.g. "gpg-agent", "dirmngr" etc.).
+ * Use @ref component() to retrieve more information about each one.
+ * @return list of component names.
+ **/
+ virtual QStringList componentList() const = 0;
+
+ /**
+ * @return the configuration object for a given component
+ * The object is owned by CryptoConfig, don't delete it.
+ */
+ virtual CryptoConfigComponent *component(const QString &name) const = 0;
+
+ /**
+ * Convenience method to get hold of a single configuration entry when
+ * its component, group and name are known. This can be used to read
+ * the value and/or to set a value to it.
+ *
+ * @return the configuration object for a single configuration entry, 0 if not found.
+ * The object is owned by CryptoConfig, don't delete it.
+ */
+ CryptoConfigEntry *entry(const QString &componentName, const QString &groupName, const QString &entryName) const
+ {
+ const QGpgME::CryptoConfigComponent *comp = component(componentName);
+ const QGpgME::CryptoConfigGroup *group = comp ? comp->group(groupName) : 0;
+ return group ? group->entry(entryName) : 0;
+ }
+
+ /**
+ * Write back changes
+ *
+ * @param runtime If this option is set, the changes will take effect at run-time, as
+ * far as this is possible. Otherwise, they will take effect at the next
+ * start of the respective backend programs.
+ */
+ virtual void sync(bool runtime) = 0;
+
+ /**
+ * Tells the CryptoConfig to discard any cached information, including
+ * all components, groups and entries.
+ * Call this to free some memory when you won't be using the object
+ * for some time.
+ * DON'T call this if you're holding pointers to components, groups or entries.
+ */
+ virtual void clear() = 0;
+};
+
+}
+#endif /* __cplusplus */
+#endif /* CRYPTOCONFIG_H */
diff --git a/lang/qt/src/dataprovider.cpp b/lang/qt/src/dataprovider.cpp
new file mode 100644
index 0000000..533b67d
--- /dev/null
+++ b/lang/qt/src/dataprovider.cpp
@@ -0,0 +1,282 @@
+/* dataprovider.cpp
+ Copyright (C) 2004 Klar�vdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ This file is part of QGPGME.
+
+ QGPGME 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.
+
+ QGPGME 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 QGPGME; see the file COPYING.LIB. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA. */
+
+// -*- c++ -*-
+
+#include <dataprovider.h>
+
+#include <error.h>
+
+#include <QIODevice>
+#include <QProcess>
+
+#include <cstdio>
+#include <cstring>
+#include <cassert>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+//
+//
+// QByteArrayDataProvider
+//
+//
+
+static bool resizeAndInit(QByteArray &ba, size_t newSize)
+{
+ const size_t oldSize = ba.size();
+ ba.resize(newSize);
+ const bool ok = (newSize == static_cast<size_t>(ba.size()));
+ if (ok) {
+ memset(ba.data() + oldSize, 0, newSize - oldSize);
+ }
+ return ok;
+}
+
+QByteArrayDataProvider::QByteArrayDataProvider()
+ : GpgME::DataProvider(), mOff(0) {}
+
+QByteArrayDataProvider::QByteArrayDataProvider(const QByteArray &initialData)
+ : GpgME::DataProvider(), mArray(initialData), mOff(0) {}
+
+QByteArrayDataProvider::~QByteArrayDataProvider() {}
+
+ssize_t QByteArrayDataProvider::read(void *buffer, size_t bufSize)
+{
+#ifndef NDEBUG
+ //qDebug( "QByteArrayDataProvider::read( %p, %d )", buffer, bufSize );
+#endif
+ if (bufSize == 0) {
+ return 0;
+ }
+ if (!buffer) {
+ Error::setSystemError(GPG_ERR_EINVAL);
+ return -1;
+ }
+ if (mOff >= mArray.size()) {
+ return 0; // EOF
+ }
+ size_t amount = qMin(bufSize, static_cast<size_t>(mArray.size() - mOff));
+ assert(amount > 0);
+ memcpy(buffer, mArray.data() + mOff, amount);
+ mOff += amount;
+ return amount;
+}
+
+ssize_t QByteArrayDataProvider::write(const void *buffer, size_t bufSize)
+{
+#ifndef NDEBUG
+ //qDebug( "QByteArrayDataProvider::write( %p, %lu )", buffer, static_cast<unsigned long>( bufSize ) );
+#endif
+ if (bufSize == 0) {
+ return 0;
+ }
+ if (!buffer) {
+ Error::setSystemError(GPG_ERR_EINVAL);
+ return -1;
+ }
+ if (mOff >= mArray.size()) {
+ resizeAndInit(mArray, mOff + bufSize);
+ }
+ if (mOff >= mArray.size()) {
+ Error::setSystemError(GPG_ERR_EIO);
+ return -1;
+ }
+ assert(bufSize <= static_cast<size_t>(mArray.size()) - mOff);
+ memcpy(mArray.data() + mOff, buffer, bufSize);
+ mOff += bufSize;
+ return bufSize;
+}
+
+off_t QByteArrayDataProvider::seek(off_t offset, int whence)
+{
+#ifndef NDEBUG
+ //qDebug( "QByteArrayDataProvider::seek( %d, %d )", int(offset), whence );
+#endif
+ int newOffset = mOff;
+ switch (whence) {
+ case SEEK_SET:
+ newOffset = offset;
+ break;
+ case SEEK_CUR:
+ newOffset += offset;
+ break;
+ case SEEK_END:
+ newOffset = mArray.size() + offset;
+ break;
+ default:
+ Error::setSystemError(GPG_ERR_EINVAL);
+ return (off_t) - 1;
+ }
+ return mOff = newOffset;
+}
+
+void QByteArrayDataProvider::release()
+{
+#ifndef NDEBUG
+ //qDebug( "QByteArrayDataProvider::release()" );
+#endif
+ mArray = QByteArray();
+}
+
+//
+//
+// QIODeviceDataProvider
+//
+//
+
+QIODeviceDataProvider::QIODeviceDataProvider(const std::shared_ptr<QIODevice> &io)
+ : GpgME::DataProvider(),
+ mIO(io),
+ mErrorOccurred(false),
+ mHaveQProcess(qobject_cast<QProcess *>(io.get()))
+{
+ assert(mIO);
+}
+
+QIODeviceDataProvider::~QIODeviceDataProvider() {}
+
+bool QIODeviceDataProvider::isSupported(Operation op) const
+{
+ const QProcess *const proc = qobject_cast<QProcess *>(mIO.get());
+ bool canRead = true;
+ if (proc) {
+ canRead = proc->readChannel() == QProcess::StandardOutput;
+ }
+
+ switch (op) {
+ case Read: return mIO->isReadable() && canRead;
+ case Write: return mIO->isWritable();
+ case Seek: return !mIO->isSequential();
+ case Release: return true;
+ default: return false;
+ }
+}
+
+static qint64 blocking_read(const std::shared_ptr<QIODevice> &io, char *buffer, qint64 maxSize)
+{
+ while (!io->bytesAvailable()) {
+ if (!io->waitForReadyRead(-1)) {
+ if (const QProcess *const p = qobject_cast<QProcess *>(io.get())) {
+ if (p->error() == QProcess::UnknownError &&
+ p->exitStatus() == QProcess::NormalExit &&
+ p->exitCode() == 0) {
+ return 0;
+ } else {
+ Error::setSystemError(GPG_ERR_EIO);
+ return -1;
+ }
+ } else {
+ return 0; // assume EOF (loses error cases :/ )
+ }
+ }
+ }
+ return io->read(buffer, maxSize);
+}
+
+ssize_t QIODeviceDataProvider::read(void *buffer, size_t bufSize)
+{
+#ifndef NDEBUG
+ //qDebug( "QIODeviceDataProvider::read( %p, %lu )", buffer, bufSize );
+#endif
+ if (bufSize == 0) {
+ return 0;
+ }
+ if (!buffer) {
+ Error::setSystemError(GPG_ERR_EINVAL);
+ return -1;
+ }
+ const qint64 numRead = mHaveQProcess
+ ? blocking_read(mIO, static_cast<char *>(buffer), bufSize)
+ : mIO->read(static_cast<char *>(buffer), bufSize);
+
+ //workaround: some QIODevices (known example: QProcess) might not return 0 (EOF), but immediately -1 when finished. If no
+ //errno is set, gpgme doesn't detect the error and loops forever. So return 0 on the very first -1 in case errno is 0
+
+ ssize_t rc = numRead;
+ if (numRead < 0 && !Error::hasSystemError()) {
+ if (mErrorOccurred) {
+ Error::setSystemError(GPG_ERR_EIO);
+ } else {
+ rc = 0;
+ }
+ }
+ if (numRead < 0) {
+ mErrorOccurred = true;
+ }
+ return rc;
+}
+
+ssize_t QIODeviceDataProvider::write(const void *buffer, size_t bufSize)
+{
+#ifndef NDEBUG
+ //qDebug( "QIODeviceDataProvider::write( %p, %lu )", buffer, static_cast<unsigned long>( bufSize ) );
+#endif
+ if (bufSize == 0) {
+ return 0;
+ }
+ if (!buffer) {
+ Error::setSystemError(GPG_ERR_EINVAL);
+ return -1;
+ }
+
+ return mIO->write(static_cast<const char *>(buffer), bufSize);
+}
+
+off_t QIODeviceDataProvider::seek(off_t offset, int whence)
+{
+#ifndef NDEBUG
+ //qDebug( "QIODeviceDataProvider::seek( %d, %d )", int(offset), whence );
+#endif
+ if (mIO->isSequential()) {
+ Error::setSystemError(GPG_ERR_ESPIPE);
+ return (off_t) - 1;
+ }
+ qint64 newOffset = mIO->pos();
+ switch (whence) {
+ case SEEK_SET:
+ newOffset = offset;
+ break;
+ case SEEK_CUR:
+ newOffset += offset;
+ break;
+ case SEEK_END:
+ newOffset = mIO->size() + offset;
+ break;
+ default:
+ Error::setSystemError(GPG_ERR_EINVAL);
+ return (off_t) - 1;
+ }
+ if (!mIO->seek(newOffset)) {
+ Error::setSystemError(GPG_ERR_EINVAL);
+ return (off_t) - 1;
+ }
+ return newOffset;
+}
+
+void QIODeviceDataProvider::release()
+{
+#ifndef NDEBUG
+ //qDebug( "QIODeviceDataProvider::release()" );
+#endif
+ mIO->close();
+}
diff --git a/lang/qt/src/dataprovider.h b/lang/qt/src/dataprovider.h
new file mode 100644
index 0000000..337f264
--- /dev/null
+++ b/lang/qt/src/dataprovider.h
@@ -0,0 +1,95 @@
+/* dataprovider.h
+ Copyright (C) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ This file is part of QGPGME.
+
+ QGPGME 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.
+
+ QGPGME 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 QGPGME; see the file COPYING.LIB. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA. */
+
+// -*- c++ -*-
+#ifndef __QGPGME_DATAPROVIDER_H__
+#define __QGPGME_DATAPROVIDER_H__
+
+#include "qgpgme_export.h"
+#include <interfaces/dataprovider.h>
+#include <memory>
+
+#include <QtCore/QByteArray>
+
+
+class QIODevice;
+
+namespace QGpgME
+{
+
+class QGPGME_EXPORT QByteArrayDataProvider : public GpgME::DataProvider
+{
+public:
+ QByteArrayDataProvider();
+ explicit QByteArrayDataProvider(const QByteArray &initialData);
+ ~QByteArrayDataProvider();
+
+ const QByteArray &data() const
+ {
+ return mArray;
+ }
+
+private:
+ // these shall only be accessed through the dataprovider
+ // interface, where they're public:
+ bool isSupported(Operation) const
+ {
+ return true;
+ }
+ ssize_t read(void *buffer, size_t bufSize);
+ ssize_t write(const void *buffer, size_t bufSize);
+ off_t seek(off_t offset, int whence);
+ void release();
+
+private:
+ QByteArray mArray;
+ off_t mOff;
+};
+
+class QGPGME_EXPORT QIODeviceDataProvider : public GpgME::DataProvider
+{
+public:
+ explicit QIODeviceDataProvider(const std::shared_ptr<QIODevice> &initialData);
+ ~QIODeviceDataProvider();
+
+ const std::shared_ptr<QIODevice> &ioDevice() const
+ {
+ return mIO;
+ }
+
+private:
+ // these shall only be accessed through the dataprovider
+ // interface, where they're public:
+ bool isSupported(Operation) const;
+ ssize_t read(void *buffer, size_t bufSize);
+ ssize_t write(const void *buffer, size_t bufSize);
+ off_t seek(off_t offset, int whence);
+ void release();
+
+private:
+ const std::shared_ptr<QIODevice> mIO;
+ bool mErrorOccurred : 1;
+ bool mHaveQProcess : 1;
+};
+
+} // namespace QGpgME
+
+#endif
diff --git a/lang/qt/src/decryptjob.h b/lang/qt/src/decryptjob.h
new file mode 100644
index 0000000..c4fc86f
--- /dev/null
+++ b/lang/qt/src/decryptjob.h
@@ -0,0 +1,100 @@
+/*
+ decryptjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004, 2007 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_DECRYPTJOB_H__
+#define __KLEO_DECRYPTJOB_H__
+
+#include "job.h"
+
+#include <memory>
+
+class QByteArray;
+class QIODevice;
+
+namespace GpgME
+{
+class Error;
+class DecryptionResult;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for asynchronous decrypters
+
+ To use a DecryptJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the decryption with a
+ call to start(). This call might fail, in which case the
+ DecryptJob instance will have scheduled it's own destruction with
+ a call to QObject::deleteLater().
+
+ After result() is emitted, the DecryptJob will schedule it's own
+ destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT DecryptJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit DecryptJob(QObject *parent);
+public:
+ ~DecryptJob();
+
+ /**
+ Starts the decryption operation. \a cipherText is the data to
+ decrypt.
+ */
+ virtual QGPGME_DEPRECATED_EXPORT GpgME::Error start(const QByteArray &cipherText) = 0;
+
+ /*!
+ \overload
+
+ If \a plainText is non-null, the plaintext is written
+ there. Otherwise, it will be delivered in the second argument
+ of result().
+
+ \throws GpgME::Exception if starting fails
+ */
+ virtual void start(const std::shared_ptr<QIODevice> &cipherText, const std::shared_ptr<QIODevice> &plainText = std::shared_ptr<QIODevice>()) = 0;
+
+ virtual GpgME::DecryptionResult exec(const QByteArray &cipherText,
+ QByteArray &plainText) = 0;
+
+Q_SIGNALS:
+ void result(const GpgME::DecryptionResult &result, const QByteArray &plainText, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_DECRYPTJOB_H__
diff --git a/lang/qt/src/decryptverifyjob.h b/lang/qt/src/decryptverifyjob.h
new file mode 100644
index 0000000..97af008
--- /dev/null
+++ b/lang/qt/src/decryptverifyjob.h
@@ -0,0 +1,105 @@
+/*
+ decryptverifyjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004, 2007 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_DECRYPTVERIFYJOB_H__
+#define __KLEO_DECRYPTVERIFYJOB_H__
+
+#include "job.h"
+
+#include <memory>
+
+class QByteArray;
+class QIODevice;
+
+namespace GpgME
+{
+class Error;
+class DecryptionResult;
+class VerificationResult;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for asynchronous combined decrypters and verifiers
+
+ To use a DecryptVerifyJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the operation with a
+ call to start(). This call might fail, in which case the
+ DecryptVerifyJob instance will have scheduled it's own destruction with
+ a call to QObject::deleteLater().
+
+ After result() is emitted, the DecryptVerifyJob will schedule it's own
+ destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT DecryptVerifyJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit DecryptVerifyJob(QObject *parent);
+public:
+ ~DecryptVerifyJob();
+
+ /**
+ Starts the combined decryption and verification operation.
+ \a cipherText is the data to decrypt and later verify.
+ */
+ virtual QGPGME_DEPRECATED_EXPORT GpgME::Error start(const QByteArray &cipherText) = 0;
+
+ /*!
+ \overload
+
+ If \a plainText is non-null, the plaintext is written
+ there. Otherwise, it will be delivered in the third argument
+ of result().
+
+ \throws GpgME::Exception if starting fails
+ */
+ virtual void start(const std::shared_ptr<QIODevice> &cipherText, const std::shared_ptr<QIODevice> &plainText = std::shared_ptr<QIODevice>()) = 0;
+
+ /** Synchronous equivalent of start() */
+ virtual std::pair<GpgME::DecryptionResult, GpgME::VerificationResult>
+ exec(const QByteArray &cipherText, QByteArray &plainText) = 0;
+
+Q_SIGNALS:
+ void result(const GpgME::DecryptionResult &decryptionresult,
+ const GpgME::VerificationResult &verificationresult,
+ const QByteArray &plainText, const QString &auditLogAsHtml = QString(),
+ const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_DECRYPTVERIFYJOB_H__
diff --git a/lang/qt/src/defaultkeygenerationjob.cpp b/lang/qt/src/defaultkeygenerationjob.cpp
new file mode 100644
index 0000000..8257a72
--- /dev/null
+++ b/lang/qt/src/defaultkeygenerationjob.cpp
@@ -0,0 +1,125 @@
+/* defaultkeygenerationjob.cpp
+
+ Copyright (c) 2016 Klarälvdalens Datakonsult AB
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "defaultkeygenerationjob.h"
+#include "protocol.h"
+#include "keygenerationjob.h"
+
+#include <QPointer>
+#include <QEvent>
+
+using namespace QGpgME;
+
+namespace QGpgME {
+
+class DefaultKeyGenerationJob::Private
+{
+public:
+ Private()
+ {}
+
+ ~Private()
+ {
+ if (job) {
+ job->deleteLater();
+ }
+ }
+
+ QPointer<KeyGenerationJob> job;
+};
+}
+
+
+DefaultKeyGenerationJob::DefaultKeyGenerationJob(QObject* parent)
+ : Job(parent)
+ , d(new DefaultKeyGenerationJob::Private())
+{
+}
+
+DefaultKeyGenerationJob::~DefaultKeyGenerationJob()
+{
+ delete d;
+}
+
+QString DefaultKeyGenerationJob::auditLogAsHtml() const
+{
+ return d->job ? d->job->auditLogAsHtml() : QString();
+}
+
+GpgME::Error DefaultKeyGenerationJob::auditLogError() const
+{
+ return d->job ? d->job->auditLogError() : GpgME::Error();
+}
+
+void DefaultKeyGenerationJob::slotCancel()
+{
+ if (d->job) {
+ d->job->slotCancel();
+ }
+}
+
+GpgME::Error DefaultKeyGenerationJob::start(const QString &email, const QString &name)
+{
+ const QString args = QStringLiteral("<GnupgKeyParms format=\"internal\">\n"
+ "%ask-passphrase\n"
+ "key-type: RSA\n"
+ "key-length: 2048\n"
+ "key-usage: sign\n"
+ "subkey-type: RSA\n"
+ "subkey-length: 2048\n"
+ "subkey-usage: encrypt\n"
+ "name-email: %1\n"
+ "name-real: %2\n"
+ "</GnupgKeyParms>").arg(email, name);
+
+ d->job = openpgp()->keyGenerationJob();
+ d->job->installEventFilter(this);
+ connect(d->job, &KeyGenerationJob::result,
+ this, &DefaultKeyGenerationJob::result);
+ connect(d->job, &KeyGenerationJob::done,
+ this, &DefaultKeyGenerationJob::done);
+ connect(d->job, &KeyGenerationJob::done,
+ this, &QObject::deleteLater);
+ return d->job->start(args);
+}
+
+bool DefaultKeyGenerationJob::eventFilter(QObject *watched, QEvent *event)
+{
+ // Intercept the KeyGenerationJob's deferred delete event. We want the job
+ // to live at least as long as we do so we can delegate calls to it. We will
+ // delete the job manually afterwards.
+ if (watched == d->job && event->type() == QEvent::DeferredDelete) {
+ return true;
+ }
+
+ return Job::eventFilter(watched, event);
+}
+
+#include "defaultkeygenerationjob.moc"
diff --git a/lang/qt/src/defaultkeygenerationjob.h b/lang/qt/src/defaultkeygenerationjob.h
new file mode 100644
index 0000000..5b7334c
--- /dev/null
+++ b/lang/qt/src/defaultkeygenerationjob.h
@@ -0,0 +1,76 @@
+/* defaultkeygenerationjob.h
+
+ Copyright (c) 2016 Klarälvdalens Datakonsult AB
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+#ifndef QGPGME_DEFAULTKEYGENERATION_H
+#define QGPGME_DEFAULTKEYGENERATION_H
+
+#include "job.h"
+
+#include "qgpgme_export.h"
+
+namespace GpgME {
+class KeyGenerationResult;
+}
+
+namespace QGpgME{
+
+/**
+ * Generates a PGP RSA/2048 bit key pair for given name and email address.
+ */
+class QGPGME_EXPORT DefaultKeyGenerationJob : public Job
+{
+ Q_OBJECT
+public:
+ explicit DefaultKeyGenerationJob(QObject *parent = Q_NULLPTR);
+ ~DefaultKeyGenerationJob();
+
+ GpgME::Error start(const QString &email, const QString &name);
+
+ QString auditLogAsHtml() const Q_DECL_OVERRIDE;
+ GpgME::Error auditLogError() const Q_DECL_OVERRIDE;
+
+
+public Q_SLOTS:
+ void slotCancel() Q_DECL_OVERRIDE;
+
+Q_SIGNALS:
+ void result(const GpgME::KeyGenerationResult &result, const QByteArray &pubkeyData,
+ const QString &auditLogAsHtml, const GpgME::Error &auditLogError);
+
+protected:
+ bool eventFilter(QObject *watched, QEvent *event) Q_DECL_OVERRIDE;
+
+private:
+ class Private;
+ Private * const d;
+};
+
+}
+
+#endif
diff --git a/lang/qt/src/deletejob.h b/lang/qt/src/deletejob.h
new file mode 100644
index 0000000..f8479b1
--- /dev/null
+++ b/lang/qt/src/deletejob.h
@@ -0,0 +1,83 @@
+/*
+ deletejob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_DELETEJOB_H__
+#define __KLEO_DELETEJOB_H__
+
+#include "qgpgme_export.h"
+#include "job.h"
+
+namespace GpgME
+{
+class Error;
+class Key;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for asynchronous deleters
+
+ To use a DeleteJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the delete with a call
+ to start(). This call might fail, in which case the DeleteJob
+ instance will have scheduled it's own destruction with a call to
+ QObject::deleteLater().
+
+ After result() is emitted, the DeleteJob will schedule it's own
+ destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT DeleteJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit DeleteJob(QObject *parent);
+public:
+ ~DeleteJob();
+
+ /**
+ Starts the delete operation. \a key represents the key to
+ delete, \a allowSecretKeyDeletion specifies if a key may also
+ be deleted if the secret key part is available, too.
+ */
+ virtual GpgME::Error start(const GpgME::Key &key, bool allowSecretKeyDeletion = false) = 0;
+
+Q_SIGNALS:
+ void result(const GpgME::Error &result, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_DELETEJOB_H__
diff --git a/lang/qt/src/downloadjob.h b/lang/qt/src/downloadjob.h
new file mode 100644
index 0000000..09eecf6
--- /dev/null
+++ b/lang/qt/src/downloadjob.h
@@ -0,0 +1,103 @@
+/*
+ downloadjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_DOWNLOADJOB_H__
+#define __KLEO_DOWNLOADJOB_H__
+
+#include "job.h"
+
+#include <QtCore/QByteArray>
+
+#include <memory>
+
+namespace GpgME
+{
+class Error;
+}
+
+class QStringList;
+class QIODevice;
+class QByteArray;
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for asynchronous downloaders
+
+ To use a DownloadJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the download with a call
+ to start(). This call might fail, in which case the DownloadJob
+ instance will have scheduled it's own destruction with a call to
+ QObject::deleteLater().
+
+ After result() is emitted, the DownloadJob will schedule it's own
+ destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT DownloadJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit DownloadJob(QObject *parent);
+public:
+ ~DownloadJob();
+
+ /**
+ Starts the download operation. \a fingerprint is the
+ fingerprint of the key to download. If \a fingerprint is empty,
+ contains only whitespace or anything other than a fingerprint,
+ the result is undefined.
+
+ Output is written to \a keyData, if given. Otherwise, it is
+ passed as the second argument of result().
+ */
+ virtual GpgME::Error start(const QByteArray &fingerprint,
+ const std::shared_ptr<QIODevice> &keyData) = 0;
+
+ /**
+ Starts the download operation. \a fingerprints is a list of
+ fingerprints used to specify the list of keys downloaded. Empty
+ patterns are ignored. If \a fingerprints is empty, contains
+ only empty strings or anything other than fingerprints, the
+ result is undefined.
+ */
+ virtual QGPGME_DEPRECATED_EXPORT GpgME::Error start(const QStringList &fingerprints) = 0;
+
+Q_SIGNALS:
+ void result(const GpgME::Error &result, const QByteArray &keyData, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_DOWNLOADJOB_H__
diff --git a/lang/qt/src/encryptjob.h b/lang/qt/src/encryptjob.h
new file mode 100644
index 0000000..4ff9c82
--- /dev/null
+++ b/lang/qt/src/encryptjob.h
@@ -0,0 +1,136 @@
+/*
+ encryptjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004, 2007 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_ENCRYPTJOB_H__
+#define __KLEO_ENCRYPTJOB_H__
+
+#include "job.h"
+
+#include <memory>
+#include <vector>
+
+#ifdef BUILDING_QGPGME
+# include "context.h"
+#else
+# include <gpgme++/context.h>
+#endif
+
+class QByteArray;
+class QIODevice;
+
+namespace GpgME
+{
+class Error;
+class Key;
+class EncryptionResult;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for asynchronous encrypters
+
+ To use a EncryptJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the encryption with a
+ call to start(). This call might fail, in which case the
+ EncryptJob instance will have scheduled it's own destruction with
+ a call to QObject::deleteLater().
+
+ After result() is emitted, the EncryptJob will schedule it's own
+ destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT EncryptJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit EncryptJob(QObject *parent);
+public:
+ ~EncryptJob();
+
+ /**
+ Starts the encryption operation. \a recipients is the a list of
+ keys to encrypt \a plainText to. Empty (null) keys are
+ ignored. If \a recipients is empty, performs symmetric
+ (passphrase) encryption.
+
+ If \a alwaysTrust is true, validity checking for the keys will
+ not be performed, but full validity assumed for all keys
+ without further checks.
+ */
+ virtual QGPGME_DEPRECATED_EXPORT GpgME::Error start(const std::vector<GpgME::Key> &recipients,
+ const QByteArray &plainText, bool alwaysTrust = false) = 0;
+
+ /*!
+ \overload
+
+ If \a cipherText is non-null, the ciphertext is written
+ there. Otherwise, it will be delivered in the second argument of
+ result().
+
+ \throws GpgME::Exception if starting fails
+ */
+ virtual void start(const std::vector<GpgME::Key> &recipients,
+ const std::shared_ptr<QIODevice> &plainText,
+ const std::shared_ptr<QIODevice> &cipherText = std::shared_ptr<QIODevice>(),
+ bool alwaysTrust = false) = 0;
+
+ virtual GpgME::EncryptionResult exec(const std::vector<GpgME::Key> &recipients,
+ const QByteArray &plainText,
+ bool alwaysTrust, QByteArray &cipherText) = 0;
+ /*!
+ This is a hack to request BASE64 output (instead of whatever
+ comes out normally).
+ */
+ virtual void setOutputIsBase64Encoded(bool) = 0;
+
+ /** Like start but with an additional argument for EncryptionFlags for
+ * more flexibility. */
+ virtual void start(const std::vector<GpgME::Key> &recipients,
+ const std::shared_ptr<QIODevice> &plainText,
+ const std::shared_ptr<QIODevice> &cipherText = std::shared_ptr<QIODevice>(),
+ const GpgME::Context::EncryptionFlags flags = GpgME::Context::None) = 0;
+
+ /** Like exec but with an additional argument for EncryptionFlags for
+ * more flexibility. */
+ virtual GpgME::EncryptionResult exec(const std::vector<GpgME::Key> &recipients,
+ const QByteArray &plainText,
+ const GpgME::Context::EncryptionFlags flags, QByteArray &cipherText) = 0;
+Q_SIGNALS:
+ void result(const GpgME::EncryptionResult &result, const QByteArray &cipherText, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_ENCRYPTJOB_H__
diff --git a/lang/qt/src/exportjob.h b/lang/qt/src/exportjob.h
new file mode 100644
index 0000000..583d4c0
--- /dev/null
+++ b/lang/qt/src/exportjob.h
@@ -0,0 +1,87 @@
+/*
+ exportjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_EXPORTJOB_H__
+#define __QGPGME_EXPORTJOB_H__
+
+#include "qgpgme_export.h"
+#include "job.h"
+
+#include <QtCore/QByteArray>
+
+namespace GpgME
+{
+class Error;
+}
+
+class QStringList;
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for asynchronous exporters
+
+ To use a ExportJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the export with a call
+ to start(). This call might fail, in which case the ExportJob
+ instance will have scheduled it's own destruction with a call to
+ QObject::deleteLater().
+
+ After result() is emitted, the ExportJob will schedule it's own
+ destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT ExportJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit ExportJob(QObject *parent);
+public:
+ ~ExportJob();
+
+ /**
+ Starts the export operation. \a patterns is a list of patterns
+ used to restrict the list of keys exported. Empty patterns are
+ ignored. If \a patterns is empty or contains only empty
+ strings, all available keys are exported.
+ */
+ virtual GpgME::Error start(const QStringList &patterns) = 0;
+
+Q_SIGNALS:
+ void result(const GpgME::Error &result, const QByteArray &keyData, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __QGPGME_EXPORTJOB_H__
diff --git a/lang/qt/src/gpgme_backend_debug.cpp b/lang/qt/src/gpgme_backend_debug.cpp
new file mode 100644
index 0000000..6dfb313
--- /dev/null
+++ b/lang/qt/src/gpgme_backend_debug.cpp
@@ -0,0 +1,10 @@
+// This file is autogenerated by CMake: DO NOT EDIT
+
+#include "gpgme_backend_debug.h"
+
+
+#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)
+Q_LOGGING_CATEGORY(GPGPME_BACKEND_LOG, "log_gpgme_backend", QtWarningMsg)
+#else
+Q_LOGGING_CATEGORY(GPGPME_BACKEND_LOG, "log_gpgme_backend")
+#endif
diff --git a/lang/qt/src/gpgme_backend_debug.h b/lang/qt/src/gpgme_backend_debug.h
new file mode 100644
index 0000000..5ac93db
--- /dev/null
+++ b/lang/qt/src/gpgme_backend_debug.h
@@ -0,0 +1,11 @@
+// This file is autogenerated by CMake: DO NOT EDIT
+
+#ifndef GPGPME_BACKEND_LOG_H
+#define GPGPME_BACKEND_LOG_H
+
+#include <QLoggingCategory>
+
+Q_DECLARE_LOGGING_CATEGORY(GPGPME_BACKEND_LOG)
+
+
+#endif
diff --git a/lang/qt/src/hierarchicalkeylistjob.h b/lang/qt/src/hierarchicalkeylistjob.h
new file mode 100644
index 0000000..2ec187d
--- /dev/null
+++ b/lang/qt/src/hierarchicalkeylistjob.h
@@ -0,0 +1,125 @@
+/*
+ hierarchicalkeylistjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_HIERARCHICALKEYLISTJOB_H__
+#define __KLEO_HIERARCHICALKEYLISTJOB_H__
+
+#include "qgpgme_export.h"
+#include "keylistjob.h"
+#include "cryptobackend.h"
+
+#ifdef BUILDING_QGPGME
+# include "keylistresult.h"
+#else
+#include <gpgme++/keylistresult.h>
+#endif
+
+#include <QPointer>
+
+#include <set>
+
+namespace GpgME
+{
+class Error;
+class Key;
+}
+
+namespace QGpgME
+{
+class KeyListJob;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short A convenience job that additionally fetches all available issuers.
+
+ To use a HierarchicalKeyListJob, pass it a CryptoBackend
+ implementation, connect the progress() and result() signals to
+ suitable slots and then start the keylisting with a call to
+ start(). This call might fail, in which case the
+ HierarchicalKeyListJob instance will have scheduled it's own
+ destruction with a call to QObject::deleteLater().
+
+ After result() is emitted, the HierarchicalKeyListJob will
+ schedule its own destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT HierarchicalKeyListJob : public KeyListJob
+{
+ Q_OBJECT
+public:
+ explicit HierarchicalKeyListJob(const Protocol *protocol,
+ bool remote = false, bool includeSigs = false,
+ bool validating = false);
+ ~HierarchicalKeyListJob();
+
+ /**
+ Starts the keylist operation. \a patterns is a list of patterns
+ used to restrict the list of keys returned. Empty patterns are
+ ignored. \a patterns must not be empty or contain only empty
+ patterns; use the normal KeyListJob for a full listing.
+
+ The \a secretOnly parameter is ignored by
+ HierarchicalKeyListJob and must be set to false.
+ */
+ GpgME::Error start(const QStringList &patterns, bool secretOnly = false) Q_DECL_OVERRIDE;
+
+ GpgME::KeyListResult exec(const QStringList &patterns, bool secretOnly,
+ std::vector<GpgME::Key> &keys) Q_DECL_OVERRIDE;
+
+private Q_SLOTS:
+ void slotResult(const GpgME::KeyListResult &);
+ void slotNextKey(const GpgME::Key &key);
+ /* from Job */
+ void slotCancel() Q_DECL_OVERRIDE;
+
+private:
+ GpgME::Error startAJob();
+
+private:
+ const Protocol *const mProtocol;
+ const bool mRemote;
+ const bool mIncludeSigs;
+ const bool mValidating;
+ bool mTruncated;
+ std::set<QString> mSentSet; // keys already sent (prevent duplicates even if the backend should return them)
+ std::set<QString> mScheduledSet; // keys already scheduled (by starting a job for them)
+ std::set<QString> mNextSet; // keys to schedule for the next iteraton
+ GpgME::KeyListResult mIntermediateResult;
+ QPointer<KeyListJob> mJob;
+};
+
+}
+
+#endif // __KLEO_HIERARCHICALKEYLISTJOB_H__
diff --git a/lang/qt/src/importfromkeyserverjob.h b/lang/qt/src/importfromkeyserverjob.h
new file mode 100644
index 0000000..f548ea7
--- /dev/null
+++ b/lang/qt/src/importfromkeyserverjob.h
@@ -0,0 +1,84 @@
+/*
+ importfromkeyserverjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_IMPORTFROMKEYSERVERJOB_H__
+#define __KLEO_IMPORTFROMKEYSERVERJOB_H__
+
+#include "abstractimportjob.h"
+#include "qgpgme_export.h"
+
+namespace GpgME
+{
+class Key;
+class Error;
+class ImportResult;
+}
+
+#include <vector>
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for asynchronous keyserver-importers
+
+ To use a ImportJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the import with a call
+ to start(). This call might fail, in which case the ImportJob
+ instance will have scheduled it's own destruction with a call to
+ QObject::deleteLater().
+
+ After result() is emitted, the ImportJob will schedule it's own
+ destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT ImportFromKeyserverJob : public AbstractImportJob
+{
+ Q_OBJECT
+protected:
+ explicit ImportFromKeyserverJob(QObject *parent);
+public:
+ ~ImportFromKeyserverJob();
+
+ /**
+ Starts the importing operation. \a keyData contains the data to
+ import from.
+ */
+ virtual GpgME::Error start(const std::vector<GpgME::Key> &keys) = 0;
+
+ virtual GpgME::ImportResult exec(const std::vector<GpgME::Key> &keys) = 0;
+};
+
+}
+
+#endif // __KLEO_IMPORTFROMKEYSERVERJOB_H__
diff --git a/lang/qt/src/importjob.h b/lang/qt/src/importjob.h
new file mode 100644
index 0000000..5c7b24d
--- /dev/null
+++ b/lang/qt/src/importjob.h
@@ -0,0 +1,83 @@
+/*
+ importjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_IMPORTJOB_H__
+#define __KLEO_IMPORTJOB_H__
+
+#include "abstractimportjob.h"
+#include "qgpgme_export.h"
+
+#include <QtCore/QByteArray>
+
+namespace GpgME
+{
+class Error;
+class ImportResult;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for asynchronous importers
+
+ To use a ImportJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the import with a call
+ to start(). This call might fail, in which case the ImportJob
+ instance will have scheduled it's own destruction with a call to
+ QObject::deleteLater().
+
+ After result() is emitted, the ImportJob will schedule it's own
+ destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT ImportJob : public AbstractImportJob
+{
+ Q_OBJECT
+protected:
+ explicit ImportJob(QObject *parent);
+public:
+ ~ImportJob();
+
+ /**
+ Starts the importing operation. \a keyData contains the data to
+ import from.
+ */
+ virtual GpgME::Error start(const QByteArray &keyData) = 0;
+
+ virtual GpgME::ImportResult exec(const QByteArray &keyData) = 0;
+};
+
+}
+
+#endif // __KLEO_IMPORTJOB_H__
diff --git a/lang/qt/src/job.cpp b/lang/qt/src/job.cpp
new file mode 100644
index 0000000..8936ea5
--- /dev/null
+++ b/lang/qt/src/job.cpp
@@ -0,0 +1,159 @@
+/*
+ job.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2005 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "job.h"
+
+#include "keylistjob.h"
+#include "listallkeysjob.h"
+#include "encryptjob.h"
+#include "decryptjob.h"
+#include "decryptverifyjob.h"
+#include "signjob.h"
+#include "signkeyjob.h"
+#include "signencryptjob.h"
+#include "verifydetachedjob.h"
+#include "verifyopaquejob.h"
+#include "keygenerationjob.h"
+#include "importjob.h"
+#include "importfromkeyserverjob.h"
+#include "exportjob.h"
+#include "changeexpiryjob.h"
+#include "changeownertrustjob.h"
+#include "changepasswdjob.h"
+#include "downloadjob.h"
+#include "deletejob.h"
+#include "refreshkeysjob.h"
+#include "adduseridjob.h"
+#include "specialjob.h"
+#include "keyformailboxjob.h"
+#include "wkspublishjob.h"
+#include "tofupolicyjob.h"
+
+#include <QCoreApplication>
+#include <QDebug>
+
+#include <gpg-error.h>
+
+QGpgME::Job::Job(QObject *parent)
+ : QObject(parent)
+{
+ if (QCoreApplication *app = QCoreApplication::instance()) {
+ connect(app, &QCoreApplication::aboutToQuit, this, &Job::slotCancel);
+ }
+}
+
+QGpgME::Job::~Job()
+{
+
+}
+
+QString QGpgME::Job::auditLogAsHtml() const
+{
+ qDebug() << "QGpgME::Job::auditLogAsHtml() should be reimplemented in Kleo::Job subclasses!";
+ return QString();
+}
+
+GpgME::Error QGpgME::Job::auditLogError() const
+{
+ qDebug() << "QGpgME::Job::auditLogError() should be reimplemented in Kleo::Job subclasses!";
+ return GpgME::Error::fromCode(GPG_ERR_NOT_IMPLEMENTED);
+}
+
+bool QGpgME::Job::isAuditLogSupported() const
+{
+ return auditLogError().code() != GPG_ERR_NOT_IMPLEMENTED;
+}
+
+#define make_job_subclass_ext(x,y) \
+ QGpgME::x::x( QObject * parent ) : y( parent ) {} \
+ QGpgME::x::~x() {}
+
+#define make_job_subclass(x) make_job_subclass_ext(x,Job)
+
+make_job_subclass(KeyListJob)
+make_job_subclass(ListAllKeysJob)
+make_job_subclass(EncryptJob)
+make_job_subclass(DecryptJob)
+make_job_subclass(DecryptVerifyJob)
+make_job_subclass(SignJob)
+make_job_subclass(SignEncryptJob)
+make_job_subclass(SignKeyJob)
+make_job_subclass(VerifyDetachedJob)
+make_job_subclass(VerifyOpaqueJob)
+make_job_subclass(KeyGenerationJob)
+make_job_subclass(AbstractImportJob)
+make_job_subclass_ext(ImportJob, AbstractImportJob)
+make_job_subclass_ext(ImportFromKeyserverJob, AbstractImportJob)
+make_job_subclass(ExportJob)
+make_job_subclass(ChangeExpiryJob)
+make_job_subclass(ChangeOwnerTrustJob)
+make_job_subclass(ChangePasswdJob)
+make_job_subclass(DownloadJob)
+make_job_subclass(DeleteJob)
+make_job_subclass(RefreshKeysJob)
+make_job_subclass(AddUserIDJob)
+make_job_subclass(SpecialJob)
+make_job_subclass(KeyForMailboxJob)
+make_job_subclass(WKSPublishJob)
+make_job_subclass(TofuPolicyJob)
+
+#undef make_job_subclass
+
+#include "job.moc"
+
+#include "keylistjob.moc"
+#include "listallkeysjob.moc"
+#include "encryptjob.moc"
+#include "decryptjob.moc"
+#include "decryptverifyjob.moc"
+#include "signjob.moc"
+#include "signencryptjob.moc"
+#include "signkeyjob.moc"
+#include "verifydetachedjob.moc"
+#include "verifyopaquejob.moc"
+#include "keygenerationjob.moc"
+#include "abstractimportjob.moc"
+#include "importjob.moc"
+#include "importfromkeyserverjob.moc"
+#include "exportjob.moc"
+#include "changeexpiryjob.moc"
+#include "changeownertrustjob.moc"
+#include "changepasswdjob.moc"
+#include "downloadjob.moc"
+#include "deletejob.moc"
+#include "refreshkeysjob.moc"
+#include "adduseridjob.moc"
+#include "specialjob.moc"
+#include "keyformailboxjob.moc"
+#include "wkspublishjob.moc"
+#include "tofupolicyjob.moc"
diff --git a/lang/qt/src/job.h b/lang/qt/src/job.h
new file mode 100644
index 0000000..5767729
--- /dev/null
+++ b/lang/qt/src/job.h
@@ -0,0 +1,92 @@
+/*
+ job.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_JOB_H__
+#define __KLEO_JOB_H__
+
+#include "qgpgme_export.h"
+
+#include <QObject>
+#include <QString>
+
+#ifdef BUILDING_QGPGME
+# include "error.h"
+#else
+# include <gpgme++/error.h>
+#endif
+
+class QWidget;
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for asynchronous crypto operations
+
+ During the operation, you might receive progress updates through
+ the progress() signal as they arrive, but an implementation is
+ free to not send progress information. You should show a busy
+ progressbar until the first progress() signal is received.
+
+ The done() signal is emitted _before_ the result() signals of
+ subclasses and should be used to hide and/or reset progress bars,
+ not to learn of the end of the operation. Use the result()
+ signals for that.
+
+ To cancel the operation, simply call slotCancel(). The result()
+ signal of subclasses will still be emitted, though, and will
+ carry the information that the operation was canceled.
+*/
+class QGPGME_EXPORT Job : public QObject
+{
+ Q_OBJECT
+protected:
+ explicit Job(QObject *parent);
+public:
+ ~Job();
+
+ virtual QString auditLogAsHtml() const;
+ virtual GpgME::Error auditLogError() const;
+ bool isAuditLogSupported() const;
+
+public Q_SLOTS:
+ virtual void slotCancel() = 0;
+
+Q_SIGNALS:
+ void progress(const QString &what, int current, int total);
+ void done();
+};
+
+}
+
+#endif // __KLEO_JOB_H__
diff --git a/lang/qt/src/keyformailboxjob.h b/lang/qt/src/keyformailboxjob.h
new file mode 100644
index 0000000..d8b6c6b
--- /dev/null
+++ b/lang/qt/src/keyformailboxjob.h
@@ -0,0 +1,106 @@
+/*
+ keyformailboxjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+#ifndef __KLEO_KEYFORMAILBOX_H__
+#define __KLEO_KEYFORMAILBOX_H__
+
+#include <QString>
+
+#include "job.h"
+
+#ifdef BUILDING_QGPGME
+# include "key.h"
+#else
+# include <gpgme++/key.h>
+#endif
+
+namespace GpgME
+{
+class Error;
+class KeyListResult;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short Get the best key to use for a Mailbox
+
+ To use the keyformailboxjob, first obtain an instance from the
+ CryptoBackend and either exec it or start and
+ conncet the result() signals to a suitable slot.
+ The job will be automatically deleted in which
+ case the KeylistJob instance will have schedules it's own
+ destruction with a call to QObject::deleteLater().
+
+ The best key is defined as the key with a UID that has an
+ E-Mail that matches the mailbox provided. If multiple
+ keys are found the one with the highest validity is returned.
+
+ After result() is emitted, the
+ KeyListJob will schedule it's own destruction by calling
+ QObject::deleteLater().
+*/
+class QGPGME_EXPORT KeyForMailboxJob: public Job
+{
+ Q_OBJECT
+protected:
+ explicit KeyForMailboxJob(QObject *parent);
+
+public:
+ ~KeyForMailboxJob();
+
+ /**
+ Starts the operation. \a mailbox is the mailbox to
+ look for.
+
+ The result is the same as for the LocateKeysJob.
+
+ If \a canEncrypt is true, only keys that have a subkey for encryption
+ usage are returned. Use this if you need to select a
+ key for signing.
+ */
+ virtual GpgME::Error start(const QString &mailbox, bool canEncrypt = true) = 0;
+
+ virtual GpgME::KeyListResult exec(const QString &mailbox, bool canEncrypt, GpgME::Key &key, GpgME::UserID &uid) = 0;
+
+Q_SIGNALS:
+ /** The result. \a Key is the key found or a Null key.
+ *
+ * The userid is the uid where the mailbox matches.
+ *
+ * The auditlog params are always null / empty.
+ */
+ void result(const GpgME::KeyListResult &result, const GpgME::Key &key, const GpgME::UserID &uid, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+#endif
diff --git a/lang/qt/src/keygenerationjob.h b/lang/qt/src/keygenerationjob.h
new file mode 100644
index 0000000..a0beeac
--- /dev/null
+++ b/lang/qt/src/keygenerationjob.h
@@ -0,0 +1,85 @@
+/*
+ keygenerationjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_KEYGENERATIONJOB_H__
+#define __KLEO_KEYGENERATIONJOB_H__
+
+#include "job.h"
+#include "qgpgme_export.h"
+
+#include <QtCore/QByteArray>
+
+namespace GpgME
+{
+class Error;
+class KeyGenerationResult;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for asynchronous key generation
+
+ To use a KeyGenerationJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the key generation with
+ a call to start(). This call might fail, in which case the
+ KeyGenerationJob instance will have scheduled it's own
+ destruction with a call to QObject::deleteLater().
+
+ After result() is emitted, the KeyGenerationJob will schedule it's own
+ destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT KeyGenerationJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit KeyGenerationJob(QObject *parent);
+public:
+ ~KeyGenerationJob();
+
+ /**
+ Starts the key generation operation. \a parameters is a
+ backend-specific string containing the parameters of the key to
+ create (length, capabilities, etc).
+ */
+ virtual GpgME::Error start(const QString &parameters) = 0;
+
+Q_SIGNALS:
+ void result(const GpgME::KeyGenerationResult &result, const QByteArray &pubKeyData, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_KEYGENERATIONJOB_H__
diff --git a/lang/qt/src/keylistjob.h b/lang/qt/src/keylistjob.h
new file mode 100644
index 0000000..8dc736e
--- /dev/null
+++ b/lang/qt/src/keylistjob.h
@@ -0,0 +1,109 @@
+/*
+ keylistjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_KEYLISTJOB_H__
+#define __KLEO_KEYLISTJOB_H__
+
+#include "job.h"
+#include "qgpgme_export.h"
+
+#ifdef BUILDING_QGPGME
+# include "key.h"
+#else
+# include <gpgme++/key.h>
+#endif
+
+#include <vector>
+
+namespace GpgME
+{
+class Error;
+class KeyListResult;
+}
+
+class QStringList;
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for asynchronous key listers
+
+ To use a KeyListJob, first obtain an instance from the
+ CryptoBackend implementation, connect the nextKey(), progress()
+ and result() signals to suitable slots and then start the key
+ listing with a call to start(). This call might fail, in which
+ case the KeylistJob instance will have schedules it's own
+ destruction with a call to QObject::deleteLater().
+
+ During keylisting, you will receive new key objects through the
+ nextKey() signal as they arrive. After result() is emitted, the
+ KeyListJob will schedule it's own destruction by calling
+ QObject::deleteLater().
+*/
+class QGPGME_EXPORT KeyListJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit KeyListJob(QObject *parent);
+
+public:
+ ~KeyListJob();
+
+ /**
+ Starts the keylist operation. \a pattern is a list of patterns
+ used to restrict the list of keys returned. Empty patterns are
+ ignored. If \a pattern is empty or contains only empty strings,
+ all keys are returned (however, the backend is free to truncate
+ the result and should do so; when this happens, it will be
+ reported by the reult object).
+
+ If \a secretOnly is true, only keys for which the secret key is
+ also available are returned. Use this if you need to select a
+ key for signing.
+ */
+ virtual GpgME::Error start(const QStringList &patterns, bool secretOnly = false) = 0;
+
+ virtual GpgME::KeyListResult exec(const QStringList &patterns, bool secretOnly, std::vector<GpgME::Key> &keys) = 0;
+
+ /** Add a flag to the keylistmode used. */
+ virtual void addMode(GpgME::KeyListMode mode) = 0;
+
+Q_SIGNALS:
+ void nextKey(const GpgME::Key &key);
+ void result(const GpgME::KeyListResult &result, const std::vector<GpgME::Key> &keys = std::vector<GpgME::Key>(), const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_KEYLISTJOB_H__
diff --git a/lang/qt/src/listallkeysjob.h b/lang/qt/src/listallkeysjob.h
new file mode 100644
index 0000000..4fbb469
--- /dev/null
+++ b/lang/qt/src/listallkeysjob.h
@@ -0,0 +1,104 @@
+/*
+ listallkeysjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_LISTALLKEYSJOB_H__
+#define __KLEO_LISTALLKEYSJOB_H__
+
+#include "job.h"
+#include "qgpgme_export.h"
+
+#ifdef BUILDING_QGPGME
+# include "key.h"
+#else
+# include <gpgme++/key.h>
+#endif
+
+#include <vector>
+
+namespace GpgME
+{
+class Error;
+class KeyListResult;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for asynchronously listing all keys
+
+ To use a ListAllKeysJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress()
+ and result() signals to suitable slots and then start the key
+ listing with a call to start(). This call might fail, in which
+ case the ListAllKeysJob instance will have schedules it's own
+ destruction with a call to QObject::deleteLater().
+
+ After result() is emitted, the ListAllKeysJob will schedule it's
+ own destruction by calling QObject::deleteLater().
+
+ This is potentially much faster than a KeyListJob with empty
+ pattern.
+*/
+class QGPGME_EXPORT ListAllKeysJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit ListAllKeysJob(QObject *parent);
+
+public:
+ ~ListAllKeysJob();
+
+ /**
+ Starts the listallkeys operation. In general, all keys are
+ returned (however, the backend is free to truncate the result
+ and should do so; when this happens, it will be reported by the
+ result object).
+
+ If \a mergeKeys is true, secret keys are merged into public
+ keys.
+ */
+ virtual GpgME::Error start(bool mergeKeys = false) = 0;
+
+ /**
+ Synchronous version of start().
+ */
+ virtual GpgME::KeyListResult exec(std::vector<GpgME::Key> &pub, std::vector<GpgME::Key> &sec, bool mergeKeys = false) = 0;
+
+Q_SIGNALS:
+ void result(const GpgME::KeyListResult &result, const std::vector<GpgME::Key> &pub = std::vector<GpgME::Key>(), const std::vector<GpgME::Key> &sec = std::vector<GpgME::Key>(), const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_LISTALLKEYSJOB_H__
diff --git a/lang/qt/src/multideletejob.h b/lang/qt/src/multideletejob.h
new file mode 100644
index 0000000..8915cd1
--- /dev/null
+++ b/lang/qt/src/multideletejob.h
@@ -0,0 +1,107 @@
+/*
+ multideletejob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_MULTIDELETEJOB_H__
+#define __KLEO_MULTIDELETEJOB_H__
+
+#include "qgpgme_export.h"
+#include "job.h"
+#include "cryptobackend.h"
+
+#include <QPointer>
+
+#include <vector>
+
+namespace GpgME
+{
+class Error;
+class Key;
+}
+
+namespace QGpgME
+{
+class DeleteJob;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short A convenience class bundling together multiple DeleteJobs.
+
+ To use a MultiDeleteJob, pass it a CryptoBackend implementation,
+ connect the progress() and result() signals to suitable slots and
+ then start the delete with a call to start(). This call might
+ fail, in which case the MultiDeleteJob instance will have scheduled
+ it's own destruction with a call to QObject::deleteLater().
+
+ After result() is emitted, the MultiDeleteJob will schedule it's own
+ destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT MultiDeleteJob : public Job
+{
+ Q_OBJECT
+public:
+ explicit MultiDeleteJob(const Protocol *protocol);
+ ~MultiDeleteJob();
+
+ /**
+ Starts the delete operation. \a keys is the list of keys to
+ delete, \a allowSecretKeyDeletion specifies if a key may also
+ be deleted if the secret key part is available, too.
+ */
+ GpgME::Error start(const std::vector<GpgME::Key> &keys, bool allowSecretKeyDeletion = false);
+
+ /* from Job */
+ void slotCancel() Q_DECL_OVERRIDE;
+
+Q_SIGNALS:
+ void result(const GpgME::Error &result, const GpgME::Key &errorKey);
+
+private Q_SLOTS:
+ void slotResult(const GpgME::Error &);
+
+private:
+ GpgME::Error startAJob();
+
+private:
+ const Protocol *mProtocol;
+ QPointer<DeleteJob> mJob;
+ std::vector<GpgME::Key> mKeys;
+ std::vector<GpgME::Key>::const_iterator mIt;
+ bool mAllowSecretKeyDeletion;
+};
+
+}
+
+#endif // __KLEO_MULTIDELETEJOB_H__
diff --git a/lang/qt/src/protocol.h b/lang/qt/src/protocol.h
new file mode 100644
index 0000000..40ddcb5
--- /dev/null
+++ b/lang/qt/src/protocol.h
@@ -0,0 +1,183 @@
+/*
+ protocol.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2005 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+#ifndef __QGPGME_PROTOCOL_H__
+#define __QGPGME_PROTOCOL_H__
+
+#include <QString>
+#include <QVariant>
+
+#include "qgpgme_export.h"
+
+namespace QGpgME {
+class CryptoConfig;
+class KeyListJob;
+class ListAllKeysJob;
+class KeyGenerationJob;
+class ImportJob;
+class ImportFromKeyserverJob;
+class ExportJob;
+class DownloadJob;
+class DeleteJob;
+class EncryptJob;
+class DecryptJob;
+class SignJob;
+class SignKeyJob;
+class VerifyDetachedJob;
+class VerifyOpaqueJob;
+class SignEncryptJob;
+class DecryptVerifyJob;
+class RefreshKeysJob;
+class ChangeExpiryJob;
+class ChangeOwnerTrustJob;
+class ChangePasswdJob;
+class AddUserIDJob;
+class SpecialJob;
+class KeyForMailboxJob;
+class WKSPublishJob;
+class TofuPolicyJob;
+
+/** The main entry point for QGpgME Comes in OpenPGP and SMIME(CMS) flavors.
+ *
+ * Use the proctocol class to obtain an instance of a job. Jobs
+ * provide async API for GnuPG that can be connected to signals / slots.
+ *
+ * A job is usually started with start() and emits a result signal.
+ * The parameters of the result signal depend on the job but the last
+ * two are always a QString for the auditlog and an GpgME::Error for
+ * an eventual error.
+ *
+ * In case async API is used and the result signal is emited a
+ * job schedules its own deletion.
+ *
+ * Most jobs also provide a synchronous call exec in which case
+ * you have to explicitly delete the job if you don't need it anymore.
+ *
+ * \code
+ * // Async example:
+ * KeyListJob *job = openpgp()->keyListJob();
+ * connect(job, &KeyListJob::result, job, [this, job](KeyListResult, std::vector<Key> keys, QString, Error)
+ * {
+ * // keys and resuls can now be used.
+ * });
+ * \endcode
+ *
+ * \code
+ * // Sync eaxmple:
+ * KeyListJob *job = openpgp()->keyListJob(false, false, false);
+ * std::vector<GpgME::Key> keys;
+ * GpgME::KeyListResult result = job->exec(QStringList() <<
+ * QStringLiteral("alfa@example.net"),
+ * false, keys);
+ * delete job;
+ * \endcode
+ */
+class QGPGME_EXPORT Protocol
+{
+public:
+ virtual ~Protocol() {}
+
+ virtual QString name() const = 0;
+
+ virtual QString displayName() const = 0;
+
+ virtual KeyListJob *keyListJob(bool remote = false, bool includeSigs = false, bool validate = false) const = 0;
+ virtual ListAllKeysJob *listAllKeysJob(bool includeSigs = false, bool validate = false) const = 0;
+ virtual EncryptJob *encryptJob(bool armor = false, bool textmode = false) const = 0;
+ virtual DecryptJob *decryptJob() const = 0;
+ virtual SignJob *signJob(bool armor = false, bool textMode = false) const = 0;
+ virtual VerifyDetachedJob *verifyDetachedJob(bool textmode = false) const = 0;
+ virtual VerifyOpaqueJob *verifyOpaqueJob(bool textmode = false) const = 0;
+ virtual KeyGenerationJob *keyGenerationJob() const = 0;
+ virtual ImportJob *importJob() const = 0;
+ virtual ImportFromKeyserverJob *importFromKeyserverJob() const = 0;
+ virtual ExportJob *publicKeyExportJob(bool armor = false) const = 0;
+ // @param charset the encoding of the passphrase in the exported file
+ virtual ExportJob *secretKeyExportJob(bool armor = false, const QString &charset = QString()) const = 0;
+ virtual DownloadJob *downloadJob(bool armor = false) const = 0;
+ virtual DeleteJob *deleteJob() const = 0;
+ virtual SignEncryptJob *signEncryptJob(bool armor = false, bool textMode = false) const = 0;
+ virtual DecryptVerifyJob *decryptVerifyJob(bool textmode = false) const = 0;
+ virtual RefreshKeysJob *refreshKeysJob() const = 0;
+ virtual ChangeExpiryJob *changeExpiryJob() const = 0;
+ virtual SignKeyJob *signKeyJob() const = 0;
+ virtual ChangePasswdJob *changePasswdJob() const = 0;
+ virtual ChangeOwnerTrustJob *changeOwnerTrustJob() const = 0;
+ virtual AddUserIDJob *addUserIDJob() const = 0;
+ virtual SpecialJob *specialJob(const char *type, const QMap<QString, QVariant> &args) const = 0;
+
+ /** A key locate job.
+ *
+ * This tries to find a key in local
+ * and remote sources, if the key was remote it is imported
+ * by GnuPG. Same as KeyListJob but intended to be used
+ * to locate keys automatically. This ends up calling --locate-keys.
+ *
+ * Only available for OpenPGP
+ *
+ * Results are validated. As if keyListJob was called
+ * with both includeSigs and validate options.
+ */
+ virtual KeyListJob *locateKeysJob() const = 0;
+ /** Find the best key to use for a mailbox. */
+ virtual KeyForMailboxJob *keyForMailboxJob() const = 0;
+
+ /** A Job for interacting with gnupg's wks tools. */
+ virtual WKSPublishJob *wksPublishJob() const = 0;
+
+ /** A Job to set tofu policy */
+ virtual TofuPolicyJob *tofuPolicyJob() const = 0;
+};
+
+/** Obtain a reference to the OpenPGP Protocol.
+ *
+ * The reference is to a static object.
+ * @returns Refrence to the OpenPGP Protocol.
+ */
+QGPGME_EXPORT Protocol *openpgp();
+
+/** Obtain a reference to the smime Protocol.
+ *
+ * The reference is to a static object.
+ * @returns Refrence to the smime Protocol.
+ */
+QGPGME_EXPORT Protocol *smime();
+
+/** Obtain a reference to a cryptoConfig object.
+ *
+ * The reference is to a static object.
+ * @returns reference to cryptoConfig object.
+ */
+QGPGME_EXPORT CryptoConfig *cryptoConfig();
+
+}
+#endif
diff --git a/lang/qt/src/protocol_p.h b/lang/qt/src/protocol_p.h
new file mode 100644
index 0000000..7f66fa4
--- /dev/null
+++ b/lang/qt/src/protocol_p.h
@@ -0,0 +1,419 @@
+/*
+ protocol_p.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2005 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+#ifndef __QGPGME_PROTOCOL_P_H__
+#define __QGPGME_PROTOCOL_P_H__
+#include "qgpgmenewcryptoconfig.h"
+
+#include "qgpgmekeygenerationjob.h"
+#include "qgpgmekeylistjob.h"
+#include "qgpgmelistallkeysjob.h"
+#include "qgpgmedecryptjob.h"
+#include "qgpgmedecryptverifyjob.h"
+#include "qgpgmerefreshkeysjob.h"
+#include "qgpgmedeletejob.h"
+#include "qgpgmesecretkeyexportjob.h"
+#include "qgpgmedownloadjob.h"
+#include "qgpgmesignencryptjob.h"
+#include "qgpgmeencryptjob.h"
+#include "qgpgmesignjob.h"
+#include "qgpgmesignkeyjob.h"
+#include "qgpgmeexportjob.h"
+#include "qgpgmeverifydetachedjob.h"
+#include "qgpgmeimportjob.h"
+#include "qgpgmeimportfromkeyserverjob.h"
+#include "qgpgmeverifyopaquejob.h"
+#include "qgpgmechangeexpiryjob.h"
+#include "qgpgmechangeownertrustjob.h"
+#include "qgpgmechangepasswdjob.h"
+#include "qgpgmeadduseridjob.h"
+#include "qgpgmekeyformailboxjob.h"
+#include "qgpgmewkspublishjob.h"
+#include "qgpgmetofupolicyjob.h"
+
+namespace
+{
+
+class Protocol : public QGpgME::Protocol
+{
+ GpgME::Protocol mProtocol;
+public:
+ explicit Protocol(GpgME::Protocol proto) : mProtocol(proto) {}
+
+ QString name() const Q_DECL_OVERRIDE
+ {
+ switch (mProtocol) {
+ case GpgME::OpenPGP: return QStringLiteral("OpenPGP");
+ case GpgME::CMS: return QStringLiteral("SMIME");
+ default: return QString();
+ }
+ }
+
+ QString displayName() const Q_DECL_OVERRIDE
+ {
+ // ah (2.4.16): Where is this used and isn't this inverted
+ // with name
+ switch (mProtocol) {
+ case GpgME::OpenPGP: return QStringLiteral("gpg");
+ case GpgME::CMS: return QStringLiteral("gpgsm");
+ default: return QStringLiteral("unknown");
+ }
+ }
+
+ QGpgME::SpecialJob *specialJob(const char *, const QMap<QString, QVariant> &) const Q_DECL_OVERRIDE
+ {
+ return 0;
+ }
+
+ QGpgME::KeyListJob *keyListJob(bool remote, bool includeSigs, bool validate) const Q_DECL_OVERRIDE
+ {
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+
+ unsigned int mode = context->keyListMode();
+ if (remote) {
+ mode |= GpgME::Extern;
+ mode &= ~GpgME::Local;
+ } else {
+ mode |= GpgME::Local;
+ mode &= ~GpgME::Extern;
+ }
+ if (includeSigs) {
+ mode |= GpgME::Signatures;
+ }
+ if (validate) {
+ mode |= GpgME::Validate;
+ }
+ context->setKeyListMode(mode);
+ return new QGpgME::QGpgMEKeyListJob(context);
+ }
+
+ QGpgME::ListAllKeysJob *listAllKeysJob(bool includeSigs, bool validate) const Q_DECL_OVERRIDE
+ {
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+
+ unsigned int mode = context->keyListMode();
+ mode |= GpgME::Local;
+ mode &= ~GpgME::Extern;
+ if (includeSigs) {
+ mode |= GpgME::Signatures;
+ }
+ if (validate) {
+ mode |= GpgME::Validate;
+ /* Setting the context to offline mode disables CRL / OCSP checks in
+ this Job. Otherwise we would try to fetch the CRL's for all CMS
+ keys in the users keyring because GpgME::Validate includes remote
+ resources by default in the validity check.
+ This setting only has any effect if gpgsm >= 2.1.6 is used.
+ */
+ context->setOffline(true);
+ }
+ context->setKeyListMode(mode);
+ return new QGpgME::QGpgMEListAllKeysJob(context);
+ }
+
+ QGpgME::EncryptJob *encryptJob(bool armor, bool textmode) const Q_DECL_OVERRIDE
+ {
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+
+ context->setArmor(armor);
+ context->setTextMode(textmode);
+ return new QGpgME::QGpgMEEncryptJob(context);
+ }
+
+ QGpgME::DecryptJob *decryptJob() const Q_DECL_OVERRIDE
+ {
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+ return new QGpgME::QGpgMEDecryptJob(context);
+ }
+
+ QGpgME::SignJob *signJob(bool armor, bool textMode) const Q_DECL_OVERRIDE
+ {
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+
+ context->setArmor(armor);
+ context->setTextMode(textMode);
+ return new QGpgME::QGpgMESignJob(context);
+ }
+
+ QGpgME::VerifyDetachedJob *verifyDetachedJob(bool textMode) const Q_DECL_OVERRIDE
+ {
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+
+ context->setTextMode(textMode);
+ return new QGpgME::QGpgMEVerifyDetachedJob(context);
+ }
+
+ QGpgME::VerifyOpaqueJob *verifyOpaqueJob(bool textMode) const Q_DECL_OVERRIDE
+ {
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+
+ context->setTextMode(textMode);
+ return new QGpgME::QGpgMEVerifyOpaqueJob(context);
+ }
+
+ QGpgME::KeyGenerationJob *keyGenerationJob() const Q_DECL_OVERRIDE
+ {
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+ return new QGpgME::QGpgMEKeyGenerationJob(context);
+ }
+
+ QGpgME::ImportJob *importJob() const Q_DECL_OVERRIDE
+ {
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+ return new QGpgME::QGpgMEImportJob(context);
+ }
+
+ QGpgME::ImportFromKeyserverJob *importFromKeyserverJob() const Q_DECL_OVERRIDE
+ {
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+ return new QGpgME::QGpgMEImportFromKeyserverJob(context);
+ }
+
+ QGpgME::ExportJob *publicKeyExportJob(bool armor) const Q_DECL_OVERRIDE
+ {
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+
+ context->setArmor(armor);
+ return new QGpgME::QGpgMEExportJob(context);
+ }
+
+ QGpgME::ExportJob *secretKeyExportJob(bool armor, const QString &charset) const Q_DECL_OVERRIDE
+ {
+ if (mProtocol != GpgME::CMS) { // fixme: add support for gpg, too
+ return 0;
+ }
+
+ // this operation is not supported by gpgme, so we have to call gpgsm ourselves:
+ return new QGpgME::QGpgMESecretKeyExportJob(armor, charset);
+ }
+
+ QGpgME::RefreshKeysJob *refreshKeysJob() const Q_DECL_OVERRIDE
+ {
+ if (mProtocol != GpgME::CMS) { // fixme: add support for gpg, too
+ return 0;
+ }
+
+ // this operation is not supported by gpgme, so we have to call gpgsm ourselves:
+ return new QGpgME::QGpgMERefreshKeysJob();
+ }
+
+ QGpgME::DownloadJob *downloadJob(bool armor) const Q_DECL_OVERRIDE
+ {
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+
+ context->setArmor(armor);
+ // this is the hackish interface for downloading from keyserers currently:
+ context->setKeyListMode(GpgME::Extern);
+ return new QGpgME::QGpgMEDownloadJob(context);
+ }
+
+ QGpgME::DeleteJob *deleteJob() const Q_DECL_OVERRIDE
+ {
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+ return new QGpgME::QGpgMEDeleteJob(context);
+ }
+
+ QGpgME::SignEncryptJob *signEncryptJob(bool armor, bool textMode) const Q_DECL_OVERRIDE
+ {
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+
+ context->setArmor(armor);
+ context->setTextMode(textMode);
+ return new QGpgME::QGpgMESignEncryptJob(context);
+ }
+
+ QGpgME::DecryptVerifyJob *decryptVerifyJob(bool textMode) const Q_DECL_OVERRIDE
+ {
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+
+ context->setTextMode(textMode);
+ return new QGpgME::QGpgMEDecryptVerifyJob(context);
+ }
+
+ QGpgME::ChangeExpiryJob *changeExpiryJob() const Q_DECL_OVERRIDE
+ {
+ if (mProtocol != GpgME::OpenPGP) {
+ return 0; // only supported by gpg
+ }
+
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+ return new QGpgME::QGpgMEChangeExpiryJob(context);
+ }
+
+ QGpgME::ChangePasswdJob *changePasswdJob() const Q_DECL_OVERRIDE
+ {
+ if (!GpgME::hasFeature(GpgME::PasswdFeature, 0)) {
+ return 0;
+ }
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+ return new QGpgME::QGpgMEChangePasswdJob(context);
+ }
+
+ QGpgME::SignKeyJob *signKeyJob() const Q_DECL_OVERRIDE
+ {
+ if (mProtocol != GpgME::OpenPGP) {
+ return 0; // only supported by gpg
+ }
+
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+ return new QGpgME::QGpgMESignKeyJob(context);
+ }
+
+ QGpgME::ChangeOwnerTrustJob *changeOwnerTrustJob() const Q_DECL_OVERRIDE
+ {
+ if (mProtocol != GpgME::OpenPGP) {
+ return 0; // only supported by gpg
+ }
+
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+ return new QGpgME::QGpgMEChangeOwnerTrustJob(context);
+ }
+
+ QGpgME::AddUserIDJob *addUserIDJob() const Q_DECL_OVERRIDE
+ {
+ if (mProtocol != GpgME::OpenPGP) {
+ return 0; // only supported by gpg
+ }
+
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return 0;
+ }
+ return new QGpgME::QGpgMEAddUserIDJob(context);
+ }
+
+ QGpgME::KeyListJob *locateKeysJob() const Q_DECL_OVERRIDE
+ {
+ if (mProtocol != GpgME::OpenPGP) {
+ return Q_NULLPTR;
+ }
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return Q_NULLPTR;
+ }
+ context->setKeyListMode(GpgME::Extern | GpgME::Local | GpgME::Signatures | GpgME::Validate);
+ return new QGpgME::QGpgMEKeyListJob(context);
+ }
+
+ QGpgME::KeyForMailboxJob *keyForMailboxJob() const Q_DECL_OVERRIDE
+ {
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return Q_NULLPTR;
+ }
+ return new QGpgME::QGpgMEKeyForMailboxJob(context);
+ }
+
+ QGpgME::WKSPublishJob *wksPublishJob() const Q_DECL_OVERRIDE
+ {
+ if (mProtocol != GpgME::OpenPGP) {
+ return Q_NULLPTR;
+ }
+ auto context = GpgME::Context::createForEngine(GpgME::SpawnEngine);
+ if (!context) {
+ return Q_NULLPTR;
+ }
+ return new QGpgME::QGpgMEWKSPublishJob(context.release());
+ }
+
+ QGpgME::TofuPolicyJob *tofuPolicyJob() const Q_DECL_OVERRIDE
+ {
+ if (mProtocol != GpgME::OpenPGP) {
+ return Q_NULLPTR;
+ }
+ GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+ if (!context) {
+ return Q_NULLPTR;
+ }
+ return new QGpgME::QGpgMETofuPolicyJob(context);
+ }
+};
+
+}
+#endif
diff --git a/lang/qt/src/qgpgme_export.h b/lang/qt/src/qgpgme_export.h
new file mode 100644
index 0000000..ceb3888
--- /dev/null
+++ b/lang/qt/src/qgpgme_export.h
@@ -0,0 +1,73 @@
+/*qgpgme_export.h - Export macros for qgpgme
+ 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 QGPGME_EXPORT_H
+#define QGPGME_EXPORT_H
+
+#ifdef QGPGME_STATIC_DEFINE
+# define QGPGME_EXPORT
+# define QGPGME_NO_EXPORT
+#else
+# ifndef QGPGME_EXPORT
+# ifdef BUILDING_QGPGME
+ /* We are building this library */
+# ifdef WIN32
+# define QGPGME_EXPORT __declspec(dllexport)
+# else
+# define QGPGME_EXPORT __attribute__((visibility("default")))
+# endif
+# else
+ /* We are using this library */
+# ifdef WIN32
+# define QGPGME_EXPORT __declspec(dllimport)
+# else
+# define QGPGME_EXPORT __attribute__((visibility("default")))
+# endif
+# endif
+# endif
+
+# ifndef QGPGME_NO_EXPORT
+# ifdef WIN32
+# define QGPGME_NO_EXPORT
+# else
+# define QGPGME_NO_EXPORT __attribute__((visibility("hidden")))
+# endif
+# endif
+#endif
+
+#ifndef QGPGME_DEPRECATED
+# define QGPGME_DEPRECATED __attribute__ ((__deprecated__))
+#endif
+
+#ifndef QGPGME_DEPRECATED_EXPORT
+# define QGPGME_DEPRECATED_EXPORT QGPGME_EXPORT QGPGME_DEPRECATED
+#endif
+
+#ifndef QGPGME_DEPRECATED_NO_EXPORT
+# define QGPGME_DEPRECATED_NO_EXPORT QGPGME_NO_EXPORT QGPGME_DEPRECATED
+#endif
+
+#define DEFINE_NO_DEPRECATED 0
+#if DEFINE_NO_DEPRECATED
+# define QGPGME_NO_DEPRECATED
+#endif
+
+#endif
diff --git a/lang/qt/src/qgpgme_version.h.in b/lang/qt/src/qgpgme_version.h.in
new file mode 100644
index 0000000..9fbe965
--- /dev/null
+++ b/lang/qt/src/qgpgme_version.h.in
@@ -0,0 +1,32 @@
+/*qgpgme_version.h - Version macros for qgpgme
+ 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 QGPGME_VERSION_H
+#define QGPGME_VERSION_H
+
+#define QGPGME_VERSION_STRING "@LIBQGPGME_LT_CURRENT@.@LIBQGPGME_LT_AGE@.@LIBQGPGME_LT_REVISION@"
+#define QGPGME_VERSION_MAJOR @LIBQGPGME_LT_CURRENT@
+#define QGPGME_VERSION_MINOR @LIBQGPGME_LT_AGE@
+#define QGPGME_VERSION_PATCH @LIBQGPGME_LT_REVISION@
+#define QGPGME_VERSION ((@LIBQGPGME_LT_CURRENT@<<16)|(@LIBQGPGME_LT_AGE@<<8)|(@LIBQGPGME_LT_REVISION@))
+
+#endif
diff --git a/lang/qt/src/qgpgmeadduseridjob.cpp b/lang/qt/src/qgpgmeadduseridjob.cpp
new file mode 100644
index 0000000..eb3bfab
--- /dev/null
+++ b/lang/qt/src/qgpgmeadduseridjob.cpp
@@ -0,0 +1,80 @@
+/*
+ qgpgmeadduseridjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmeadduseridjob.h"
+
+#include "dataprovider.h"
+
+#include "context.h"
+#include "data.h"
+#include "gpgadduserideditinteractor.h"
+#include "key.h"
+
+#include <cassert>
+#include <memory>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEAddUserIDJob::QGpgMEAddUserIDJob(Context *context)
+ : mixin_type(context)
+{
+ lateInitialization();
+}
+
+QGpgMEAddUserIDJob::~QGpgMEAddUserIDJob() {}
+
+static QGpgMEAddUserIDJob::result_type add_user_id(Context *ctx, const Key &key, const QString &name, const QString &email, const QString &comment)
+{
+
+ GpgAddUserIDEditInteractor *gau = new GpgAddUserIDEditInteractor;
+
+ gau->setNameUtf8(name.toUtf8().constData());
+ gau->setEmailUtf8(email.toUtf8().constData());
+ gau->setCommentUtf8(comment.toUtf8().constData());
+
+ QGpgME::QByteArrayDataProvider dp;
+ Data data(&dp);
+ assert(!data.isNull());
+ const Error err = ctx->edit(key, std::unique_ptr<EditInteractor> (gau), data);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(err, log, ae);
+}
+
+Error QGpgMEAddUserIDJob::start(const Key &key, const QString &name, const QString &email, const QString &comment)
+{
+ run(std::bind(&add_user_id, std::placeholders::_1, key, name, email, comment));
+ return Error();
+}
+#include "qgpgmeadduseridjob.moc"
diff --git a/lang/qt/src/qgpgmeadduseridjob.h b/lang/qt/src/qgpgmeadduseridjob.h
new file mode 100644
index 0000000..294eb6c
--- /dev/null
+++ b/lang/qt/src/qgpgmeadduseridjob.h
@@ -0,0 +1,65 @@
+/*
+ qgpgmeadduseridjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMEADDUSERIDJOB_H__
+#define __QGPGME_QGPGMEADDUSERIDJOB_H__
+
+#include "adduseridjob.h"
+
+#include "threadedjobmixin.h"
+
+namespace QGpgME
+{
+
+class QGpgMEAddUserIDJob
+#ifdef Q_MOC_RUN
+ : public AddUserIDJob
+#else
+ : public _detail::ThreadedJobMixin<AddUserIDJob>
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+private Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEAddUserIDJob(GpgME::Context *context);
+ ~QGpgMEAddUserIDJob();
+
+ /* from AddUserIDJob */
+ GpgME::Error start(const GpgME::Key &key, const QString &name, const QString &email, const QString &comment) Q_DECL_OVERRIDE;
+};
+}
+
+#endif // __QGPGME_QGPGMEADDUSERIDJOB_H__
diff --git a/lang/qt/src/qgpgmebackend.cpp b/lang/qt/src/qgpgmebackend.cpp
new file mode 100644
index 0000000..797e58a
--- /dev/null
+++ b/lang/qt/src/qgpgmebackend.cpp
@@ -0,0 +1,203 @@
+/*
+ qgpgmebackend.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2005 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmebackend.h"
+
+
+#include "error.h"
+#include "engineinfo.h"
+
+#include "protocol_p.h"
+
+#include <QFile>
+#include <QString>
+
+const char QGpgME::QGpgMEBackend::OpenPGP[] = "OpenPGP";
+const char QGpgME::QGpgMEBackend::SMIME[] = "SMIME";
+
+
+QGpgME::QGpgMEBackend::QGpgMEBackend()
+ : mCryptoConfig(0),
+ mOpenPGPProtocol(0),
+ mSMIMEProtocol(0)
+{
+ GpgME::initializeLibrary();
+}
+
+QGpgME::QGpgMEBackend::~QGpgMEBackend()
+{
+ delete mCryptoConfig; mCryptoConfig = 0;
+ delete mOpenPGPProtocol; mOpenPGPProtocol = 0;
+ delete mSMIMEProtocol; mSMIMEProtocol = 0;
+}
+
+QString QGpgME::QGpgMEBackend::name() const
+{
+ return QStringLiteral("gpgme");
+}
+
+QString QGpgME::QGpgMEBackend::displayName() const
+{
+ return QStringLiteral("GpgME");
+}
+
+QGpgME::CryptoConfig *QGpgME::QGpgMEBackend::config() const
+{
+ if (!mCryptoConfig) {
+ if (GpgME::hasFeature(GpgME::GpgConfEngineFeature, 0)) {
+ mCryptoConfig = new QGpgMENewCryptoConfig;
+ }
+ }
+ return mCryptoConfig;
+}
+
+static bool check(GpgME::Protocol proto, QString *reason)
+{
+ if (!GpgME::checkEngine(proto)) {
+ return true;
+ }
+ if (!reason) {
+ return false;
+ }
+ // error, check why:
+#if 0
+Port away from localised string or delete.
+ const GpgME::EngineInfo ei = GpgME::engineInfo(proto);
+ if (ei.isNull()) {
+ *reason = i18n("GPGME was compiled without support for %1.", proto == GpgME::CMS ? QLatin1String("S/MIME") : QLatin1String("OpenPGP"));
+ } else if (ei.fileName() && !ei.version()) {
+ *reason = i18n("Engine %1 is not installed properly.", QFile::decodeName(ei.fileName()));
+ } else if (ei.fileName() && ei.version() && ei.requiredVersion())
+ *reason = i18n("Engine %1 version %2 installed, "
+ "but at least version %3 is required.",
+ QFile::decodeName(ei.fileName()), QLatin1String(ei.version()), QLatin1String(ei.requiredVersion()));
+ else {
+ *reason = i18n("Unknown problem with engine for protocol %1.", proto == GpgME::CMS ? QLatin1String("S/MIME") : QLatin1String("OpenPGP"));
+ }
+#endif
+ return false;
+}
+
+bool QGpgME::QGpgMEBackend::checkForOpenPGP(QString *reason) const
+{
+ return check(GpgME::OpenPGP, reason);
+}
+
+bool QGpgME::QGpgMEBackend::checkForSMIME(QString *reason) const
+{
+ return check(GpgME::CMS, reason);
+}
+
+bool QGpgME::QGpgMEBackend::checkForProtocol(const char *name, QString *reason) const
+{
+ if (qstricmp(name, OpenPGP) == 0) {
+ return check(GpgME::OpenPGP, reason);
+ }
+ if (qstricmp(name, SMIME) == 0) {
+ return check(GpgME::CMS, reason);
+ }
+ if (reason) {
+ *reason = QStringLiteral("Unsupported protocol \"%1\"").arg(QLatin1String(name));
+ }
+ return false;
+}
+
+QGpgME::Protocol *QGpgME::QGpgMEBackend::openpgp() const
+{
+ if (!mOpenPGPProtocol)
+ if (checkForOpenPGP()) {
+ mOpenPGPProtocol = new ::Protocol(GpgME::OpenPGP);
+ }
+ return mOpenPGPProtocol;
+}
+
+QGpgME::Protocol *QGpgME::QGpgMEBackend::smime() const
+{
+ if (!mSMIMEProtocol)
+ if (checkForSMIME()) {
+ mSMIMEProtocol = new ::Protocol(GpgME::CMS);
+ }
+ return mSMIMEProtocol;
+}
+
+QGpgME::Protocol *QGpgME::QGpgMEBackend::protocol(const char *name) const
+{
+ if (qstricmp(name, OpenPGP) == 0) {
+ return openpgp();
+ }
+ if (qstricmp(name, SMIME) == 0) {
+ return smime();
+ }
+ return 0;
+}
+
+bool QGpgME::QGpgMEBackend::supportsProtocol(const char *name) const
+{
+ return qstricmp(name, OpenPGP) == 0 || qstricmp(name, SMIME) == 0;
+}
+
+const char *QGpgME::QGpgMEBackend::enumerateProtocols(int i) const
+{
+ switch (i) {
+ case 0: return OpenPGP;
+ case 1: return SMIME;
+ default: return 0;
+ }
+}
+
+static QGpgME::QGpgMEBackend *gpgmeBackend;
+
+QGpgME::CryptoConfig *QGpgME::cryptoConfig()
+{
+ if (!gpgmeBackend) {
+ gpgmeBackend = new QGpgME::QGpgMEBackend();
+ }
+ return gpgmeBackend->config();
+
+}
+
+QGpgME::Protocol *QGpgME::openpgp()
+{
+ if (!gpgmeBackend) {
+ gpgmeBackend = new QGpgME::QGpgMEBackend();
+ }
+ return gpgmeBackend->openpgp();
+}
+
+QGpgME::Protocol *QGpgME::smime()
+{
+ if (!gpgmeBackend) {
+ gpgmeBackend = new QGpgME::QGpgMEBackend();
+ }
+ return gpgmeBackend->smime();
+}
diff --git a/lang/qt/src/qgpgmebackend.h b/lang/qt/src/qgpgmebackend.h
new file mode 100644
index 0000000..cca8b71
--- /dev/null
+++ b/lang/qt/src/qgpgmebackend.h
@@ -0,0 +1,92 @@
+/*
+ qgpgmebackend.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2005 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMEBACKEND_H__
+#define __QGPGME_QGPGMEBACKEND_H__
+
+#include <QString>
+
+#include "protocol.h"
+
+class QString;
+template <typename T_Key, typename T_Value> class QMap;
+
+namespace QGpgME
+{
+class CryptoConfig;
+class Protocol;
+
+
+class QGpgMEBackend
+{
+public:
+ QGpgMEBackend();
+ ~QGpgMEBackend();
+
+ QString name() const;
+ QString displayName() const;
+
+ CryptoConfig *config() const;
+
+ Protocol *openpgp() const;
+ Protocol *smime() const;
+ Protocol *protocol(const char *name) const;
+
+ static const char OpenPGP[];
+ static const char SMIME[];
+
+ bool checkForOpenPGP(QString *reason = Q_NULLPTR) const;
+ bool checkForSMIME(QString *reason = Q_NULLPTR) const;
+ bool checkForProtocol(const char *name, QString *reason) const;
+
+ bool supportsOpenPGP() const
+ {
+ return true;
+ }
+ bool supportsSMIME() const
+ {
+ return true;
+ }
+ bool supportsProtocol(const char *name) const;
+
+ const char *enumerateProtocols(int i) const;
+
+private:
+ mutable QGpgME::CryptoConfig *mCryptoConfig;
+ mutable Protocol *mOpenPGPProtocol;
+ mutable Protocol *mSMIMEProtocol;
+};
+
+}
+
+#endif // __QGPGME_QGPGMEBACKEND_H__
diff --git a/lang/qt/src/qgpgmechangeexpiryjob.cpp b/lang/qt/src/qgpgmechangeexpiryjob.cpp
new file mode 100644
index 0000000..43ceee3
--- /dev/null
+++ b/lang/qt/src/qgpgmechangeexpiryjob.cpp
@@ -0,0 +1,80 @@
+/*
+ qgpgmechangeexpiryjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmechangeexpiryjob.h"
+
+#include "dataprovider.h"
+
+#include "context.h"
+#include "data.h"
+#include "gpgsetexpirytimeeditinteractor.h"
+#include "key.h"
+
+#include <QDateTime>
+
+#include <cassert>
+#include <memory>
+#include <string>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEChangeExpiryJob::QGpgMEChangeExpiryJob(Context *context)
+ : mixin_type(context)
+{
+ lateInitialization();
+}
+
+QGpgMEChangeExpiryJob::~QGpgMEChangeExpiryJob() {}
+
+static QGpgMEChangeExpiryJob::result_type change_expiry(Context *ctx, const Key &key, const QDateTime &expiry)
+{
+ EditInteractor *ei = expiry.isValid()
+ ? new GpgSetExpiryTimeEditInteractor(expiry.date().toString(Qt::ISODate).toStdString())
+ : new GpgSetExpiryTimeEditInteractor();
+
+ QGpgME::QByteArrayDataProvider dp;
+ Data data(&dp);
+ assert(!data.isNull());
+ const Error err = ctx->edit(key, std::unique_ptr<EditInteractor> (ei), data);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(err, log, ae);
+}
+
+Error QGpgMEChangeExpiryJob::start(const Key &key, const QDateTime &expiry)
+{
+ run(std::bind(&change_expiry, std::placeholders::_1, key, expiry));
+ return Error();
+}
+#include "qgpgmechangeexpiryjob.moc"
diff --git a/lang/qt/src/qgpgmechangeexpiryjob.h b/lang/qt/src/qgpgmechangeexpiryjob.h
new file mode 100644
index 0000000..4abdf78
--- /dev/null
+++ b/lang/qt/src/qgpgmechangeexpiryjob.h
@@ -0,0 +1,66 @@
+/*
+ qgpgmechangeexpiryjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMECHANGEEXPIRYJOB_H__
+#define __QGPGME_QGPGMECHANGEEXPIRYJOB_H__
+
+#include "changeexpiryjob.h"
+
+#include "threadedjobmixin.h"
+
+namespace QGpgME
+{
+
+class QGpgMEChangeExpiryJob
+#ifdef Q_MOC_RUN
+ : public ChangeExpiryJob
+#else
+ : public _detail::ThreadedJobMixin<ChangeExpiryJob>
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+private Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEChangeExpiryJob(GpgME::Context *context);
+ ~QGpgMEChangeExpiryJob();
+
+ /* from ChangeExpiryJob */
+ GpgME::Error start(const GpgME::Key &key, const QDateTime &expiry) Q_DECL_OVERRIDE;
+};
+
+}
+
+#endif // __QGPGME_QGPGMECHANGEEXPIRYJOB_H__
diff --git a/lang/qt/src/qgpgmechangeownertrustjob.cpp b/lang/qt/src/qgpgmechangeownertrustjob.cpp
new file mode 100644
index 0000000..55131d9
--- /dev/null
+++ b/lang/qt/src/qgpgmechangeownertrustjob.cpp
@@ -0,0 +1,76 @@
+/*
+ qgpgmechangeownertrustjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmechangeownertrustjob.h"
+
+#include "dataprovider.h"
+
+#include "context.h"
+#include "data.h"
+#include "gpgsetownertrusteditinteractor.h"
+#include "key.h"
+
+#include <cassert>
+#include <memory>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEChangeOwnerTrustJob::QGpgMEChangeOwnerTrustJob(Context *context)
+ : mixin_type(context)
+{
+ lateInitialization();
+}
+
+QGpgMEChangeOwnerTrustJob::~QGpgMEChangeOwnerTrustJob() {}
+
+static QGpgMEChangeOwnerTrustJob::result_type change_ownertrust(Context *ctx, const Key &key, Key::OwnerTrust trust)
+{
+ EditInteractor *ei = new GpgSetOwnerTrustEditInteractor(trust);
+
+ QGpgME::QByteArrayDataProvider dp;
+ Data data(&dp);
+ assert(!data.isNull());
+
+ const Error err = ctx->edit(key, std::unique_ptr<EditInteractor>(ei), data);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(err, log, ae);
+}
+
+Error QGpgMEChangeOwnerTrustJob::start(const Key &key, Key::OwnerTrust trust)
+{
+ run(std::bind(&change_ownertrust, std::placeholders::_1, key, trust));
+ return Error();
+}
+#include "qgpgmechangeownertrustjob.moc"
diff --git a/lang/qt/src/qgpgmechangeownertrustjob.h b/lang/qt/src/qgpgmechangeownertrustjob.h
new file mode 100644
index 0000000..7740616
--- /dev/null
+++ b/lang/qt/src/qgpgmechangeownertrustjob.h
@@ -0,0 +1,65 @@
+/*
+ qgpgmechangeexpiryjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMECHANGEOWNERTRUSTJOB_H__
+#define __QGPGME_QGPGMECHANGEOWNERTRUSTJOB_H__
+
+#include "changeownertrustjob.h"
+
+#include "threadedjobmixin.h"
+
+namespace QGpgME
+{
+
+class QGpgMEChangeOwnerTrustJob
+#ifdef Q_MOC_RUN
+ : public ChangeOwnerTrustJob
+#else
+ : public _detail::ThreadedJobMixin<ChangeOwnerTrustJob>
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+private Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEChangeOwnerTrustJob(GpgME::Context *context);
+ ~QGpgMEChangeOwnerTrustJob();
+
+ /* from ChangeOwnerTrustJob */
+ GpgME::Error start(const GpgME::Key &key, GpgME::Key::OwnerTrust trust) Q_DECL_OVERRIDE;
+};
+}
+
+#endif // __QGPGME_QGPGMECHANGEOWNERTRUSTJOB_H__
diff --git a/lang/qt/src/qgpgmechangepasswdjob.cpp b/lang/qt/src/qgpgmechangepasswdjob.cpp
new file mode 100644
index 0000000..0aec927
--- /dev/null
+++ b/lang/qt/src/qgpgmechangepasswdjob.cpp
@@ -0,0 +1,79 @@
+/*
+ qgpgmechangepasswdjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2010 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmechangepasswdjob.h"
+
+#include "dataprovider.h"
+
+#include "context.h"
+#include "data.h"
+#include "key.h"
+
+#include <cassert>
+#include <memory>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEChangePasswdJob::QGpgMEChangePasswdJob(Context *context)
+ : mixin_type(context)
+{
+ lateInitialization();
+}
+
+QGpgMEChangePasswdJob::~QGpgMEChangePasswdJob() {}
+
+static QGpgMEChangePasswdJob::result_type change_passwd(Context *ctx, const Key &key)
+{
+#if 0 // in case we want to fall back to edit interactor for gpg...
+ std::unique_ptr<EditInteractor> ei(new GpgChangePasswdEditInteractor);
+
+ QGpgME::QByteArrayDataProvider dp;
+ Data data(&dp);
+ assert(!data.isNull());
+ const Error err = ctx->edit(key, ei, data);
+#else
+ const Error err = ctx->passwd(key);
+#endif
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(err, log, ae);
+}
+
+Error QGpgMEChangePasswdJob::start(const Key &key)
+{
+ run(std::bind(&change_passwd, std::placeholders::_1, key));
+ return Error();
+}
+
+#include "qgpgmechangepasswdjob.moc"
diff --git a/lang/qt/src/qgpgmechangepasswdjob.h b/lang/qt/src/qgpgmechangepasswdjob.h
new file mode 100644
index 0000000..e37789e
--- /dev/null
+++ b/lang/qt/src/qgpgmechangepasswdjob.h
@@ -0,0 +1,66 @@
+/*
+ qgpgmechangepasswdjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2010 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMECHANGEPASSWDJOB_H__
+#define __QGPGME_QGPGMECHANGEPASSWDJOB_H__
+
+#include "changepasswdjob.h"
+
+#include "threadedjobmixin.h"
+
+namespace QGpgME
+{
+
+class QGpgMEChangePasswdJob
+#ifdef Q_MOC_RUN
+ : public ChangePasswdJob
+#else
+ : public _detail::ThreadedJobMixin<ChangePasswdJob>
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+private Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEChangePasswdJob(GpgME::Context *context);
+ ~QGpgMEChangePasswdJob();
+
+ /* from ChangePasswdJob */
+ GpgME::Error start(const GpgME::Key &key) Q_DECL_OVERRIDE;
+};
+
+}
+
+#endif // __QGPGME_QGPGMECHANGEPASSWDJOB_H__
diff --git a/lang/qt/src/qgpgmedecryptjob.cpp b/lang/qt/src/qgpgmedecryptjob.cpp
new file mode 100644
index 0000000..7116449
--- /dev/null
+++ b/lang/qt/src/qgpgmedecryptjob.cpp
@@ -0,0 +1,128 @@
+/*
+ qgpgmedecryptjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmedecryptjob.h"
+
+#include "dataprovider.h"
+
+#include "context.h"
+#include "decryptionresult.h"
+#include "data.h"
+
+#include <QBuffer>
+
+#include <cassert>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEDecryptJob::QGpgMEDecryptJob(Context *context)
+ : mixin_type(context)
+{
+ lateInitialization();
+}
+
+QGpgMEDecryptJob::~QGpgMEDecryptJob() {}
+
+static QGpgMEDecryptJob::result_type decrypt(Context *ctx, QThread *thread,
+ const std::weak_ptr<QIODevice> &cipherText_,
+ const std::weak_ptr<QIODevice> &plainText_)
+{
+
+ const std::shared_ptr<QIODevice> cipherText = cipherText_.lock();
+ const std::shared_ptr<QIODevice> plainText = plainText_.lock();
+
+ const _detail::ToThreadMover ctMover(cipherText, thread);
+ const _detail::ToThreadMover ptMover(plainText, thread);
+
+ QGpgME::QIODeviceDataProvider in(cipherText);
+ const Data indata(&in);
+
+ if (!plainText) {
+ QGpgME::QByteArrayDataProvider out;
+ Data outdata(&out);
+
+ const DecryptionResult res = ctx->decrypt(indata, outdata);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(res, out.data(), log, ae);
+ } else {
+ QGpgME::QIODeviceDataProvider out(plainText);
+ Data outdata(&out);
+
+ const DecryptionResult res = ctx->decrypt(indata, outdata);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(res, QByteArray(), log, ae);
+ }
+
+}
+
+static QGpgMEDecryptJob::result_type decrypt_qba(Context *ctx, const QByteArray &cipherText)
+{
+ const std::shared_ptr<QBuffer> buffer(new QBuffer);
+ buffer->setData(cipherText);
+ if (!buffer->open(QIODevice::ReadOnly)) {
+ assert(!"This should never happen: QBuffer::open() failed");
+ }
+ return decrypt(ctx, 0, buffer, std::shared_ptr<QIODevice>());
+}
+
+Error QGpgMEDecryptJob::start(const QByteArray &cipherText)
+{
+ run(std::bind(&decrypt_qba, std::placeholders::_1, cipherText));
+ return Error();
+}
+
+void QGpgMEDecryptJob::start(const std::shared_ptr<QIODevice> &cipherText, const std::shared_ptr<QIODevice> &plainText)
+{
+ run(std::bind(&decrypt, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4), cipherText, plainText);
+}
+
+GpgME::DecryptionResult QGpgME::QGpgMEDecryptJob::exec(const QByteArray &cipherText,
+ QByteArray &plainText)
+{
+ const result_type r = decrypt_qba(context(), cipherText);
+ plainText = std::get<1>(r);
+ resultHook(r);
+ return mResult;
+}
+
+//PENDING(marc) implement showErrorDialog()
+
+void QGpgMEDecryptJob::resultHook(const result_type &tuple)
+{
+ mResult = std::get<0>(tuple);
+}
+
+#include "qgpgmedecryptjob.moc"
diff --git a/lang/qt/src/qgpgmedecryptjob.h b/lang/qt/src/qgpgmedecryptjob.h
new file mode 100644
index 0000000..5335e84
--- /dev/null
+++ b/lang/qt/src/qgpgmedecryptjob.h
@@ -0,0 +1,84 @@
+/*
+ qgpgmedecryptjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMEDECRYPTJOB_H__
+#define __QGPGME_QGPGMEDECRYPTJOB_H__
+
+#include "decryptjob.h"
+
+#include "threadedjobmixin.h"
+
+#ifdef BUILDING_QGPGME
+# include "decryptionresult.h"
+#else
+#include <gpgme++/decryptionresult.h>
+#endif
+
+namespace QGpgME
+{
+
+class QGpgMEDecryptJob
+#ifdef Q_MOC_RUN
+ : public DecryptJob
+#else
+ : public _detail::ThreadedJobMixin<DecryptJob, std::tuple<GpgME::DecryptionResult, QByteArray, QString, GpgME::Error> >
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+private Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEDecryptJob(GpgME::Context *context);
+ ~QGpgMEDecryptJob();
+
+ /* from DecryptJob */
+ GpgME::Error start(const QByteArray &cipherText) Q_DECL_OVERRIDE;
+
+ /* from DecryptJob */
+ void start(const std::shared_ptr<QIODevice> &cipherText, const std::shared_ptr<QIODevice> &plainText) Q_DECL_OVERRIDE;
+
+ /* from DecryptJob */
+ GpgME::DecryptionResult exec(const QByteArray &cipherText,
+ QByteArray &plainText) Q_DECL_OVERRIDE;
+
+ /* from ThreadedJobMixin */
+ void resultHook(const result_type &r) Q_DECL_OVERRIDE;
+
+private:
+ GpgME::DecryptionResult mResult;
+};
+
+}
+#endif // __QGPGME_QGPGMEDECRYPTJOB_H__
diff --git a/lang/qt/src/qgpgmedecryptverifyjob.cpp b/lang/qt/src/qgpgmedecryptverifyjob.cpp
new file mode 100644
index 0000000..d46a9b5
--- /dev/null
+++ b/lang/qt/src/qgpgmedecryptverifyjob.cpp
@@ -0,0 +1,135 @@
+/*
+ qgpgmedecryptverifyjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmedecryptverifyjob.h"
+
+#include "dataprovider.h"
+
+#include "context.h"
+#include "decryptionresult.h"
+#include "verificationresult.h"
+#include "data.h"
+
+#include <QDebug>
+#include "gpgme_backend_debug.h"
+
+#include <QBuffer>
+
+#include <cassert>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEDecryptVerifyJob::QGpgMEDecryptVerifyJob(Context *context)
+ : mixin_type(context)
+{
+ lateInitialization();
+}
+
+QGpgMEDecryptVerifyJob::~QGpgMEDecryptVerifyJob() {}
+
+static QGpgMEDecryptVerifyJob::result_type decrypt_verify(Context *ctx, QThread *thread,
+ const std::weak_ptr<QIODevice> &cipherText_,
+ const std::weak_ptr<QIODevice> &plainText_)
+{
+
+ qCDebug(GPGPME_BACKEND_LOG);
+
+ const std::shared_ptr<QIODevice> cipherText = cipherText_.lock();
+ const std::shared_ptr<QIODevice> plainText = plainText_.lock();
+
+ const _detail::ToThreadMover ctMover(cipherText, thread);
+ const _detail::ToThreadMover ptMover(plainText, thread);
+
+ QGpgME::QIODeviceDataProvider in(cipherText);
+ const Data indata(&in);
+
+ if (!plainText) {
+ QGpgME::QByteArrayDataProvider out;
+ Data outdata(&out);
+
+ const std::pair<DecryptionResult, VerificationResult> res = ctx->decryptAndVerify(indata, outdata);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ qCDebug(GPGPME_BACKEND_LOG) << "End no plainText. Error: " << ae;
+ return std::make_tuple(res.first, res.second, out.data(), log, ae);
+ } else {
+ QGpgME::QIODeviceDataProvider out(plainText);
+ Data outdata(&out);
+
+ const std::pair<DecryptionResult, VerificationResult> res = ctx->decryptAndVerify(indata, outdata);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ qCDebug(GPGPME_BACKEND_LOG) << "End plainText. Error: " << ae;
+ return std::make_tuple(res.first, res.second, QByteArray(), log, ae);
+ }
+
+}
+
+static QGpgMEDecryptVerifyJob::result_type decrypt_verify_qba(Context *ctx, const QByteArray &cipherText)
+{
+ const std::shared_ptr<QBuffer> buffer(new QBuffer);
+ buffer->setData(cipherText);
+ if (!buffer->open(QIODevice::ReadOnly)) {
+ assert(!"This should never happen: QBuffer::open() failed");
+ }
+ return decrypt_verify(ctx, 0, buffer, std::shared_ptr<QIODevice>());
+}
+
+Error QGpgMEDecryptVerifyJob::start(const QByteArray &cipherText)
+{
+ run(std::bind(&decrypt_verify_qba, std::placeholders::_1, cipherText));
+ return Error();
+}
+
+void QGpgMEDecryptVerifyJob::start(const std::shared_ptr<QIODevice> &cipherText, const std::shared_ptr<QIODevice> &plainText)
+{
+ run(std::bind(&decrypt_verify, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4), cipherText, plainText);
+}
+
+std::pair<GpgME::DecryptionResult, GpgME::VerificationResult>
+QGpgME::QGpgMEDecryptVerifyJob::exec(const QByteArray &cipherText, QByteArray &plainText)
+{
+ const result_type r = decrypt_verify_qba(context(), cipherText);
+ plainText = std::get<2>(r);
+ resultHook(r);
+ return mResult;
+}
+
+//PENDING(marc) implement showErrorDialog()
+
+void QGpgMEDecryptVerifyJob::resultHook(const result_type &tuple)
+{
+ mResult = std::make_pair(std::get<0>(tuple), std::get<1>(tuple));
+}
+#include "qgpgmedecryptverifyjob.moc"
diff --git a/lang/qt/src/qgpgmedecryptverifyjob.h b/lang/qt/src/qgpgmedecryptverifyjob.h
new file mode 100644
index 0000000..de2bce7
--- /dev/null
+++ b/lang/qt/src/qgpgmedecryptverifyjob.h
@@ -0,0 +1,89 @@
+/*
+ qgpgmedecryptverifyjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMEDECRYPTVERIFYJOB_H__
+#define __QGPGME_QGPGMEDECRYPTVERIFYJOB_H__
+
+#include "decryptverifyjob.h"
+
+#include "threadedjobmixin.h"
+
+#ifdef BUILDING_QGPGME
+# include "decryptionresult.h"
+#else
+#include <gpgme++/decryptionresult.h>
+#endif
+#ifdef BUILDING_QGPGME
+# include "verificationresult.h"
+#else
+#include <gpgme++/verificationresult.h>
+#endif
+
+namespace QGpgME
+{
+
+class QGpgMEDecryptVerifyJob
+#ifdef Q_MOC_RUN
+ : public DecryptVerifyJob
+#else
+ : public _detail::ThreadedJobMixin<DecryptVerifyJob, std::tuple<GpgME::DecryptionResult, GpgME::VerificationResult, QByteArray, QString, GpgME::Error> >
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+private Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEDecryptVerifyJob(GpgME::Context *context);
+ ~QGpgMEDecryptVerifyJob();
+
+ /* from DecryptVerifyJob */
+ GpgME::Error start(const QByteArray &cipherText) Q_DECL_OVERRIDE;
+
+ /* from DecryptVerifyJob */
+ void start(const std::shared_ptr<QIODevice> &cipherText, const std::shared_ptr<QIODevice> &plainText) Q_DECL_OVERRIDE;
+
+ /* from DecryptVerifyJob */
+ std::pair<GpgME::DecryptionResult, GpgME::VerificationResult>
+ exec(const QByteArray &cipherText, QByteArray &plainText) Q_DECL_OVERRIDE;
+
+ /* from ThreadedJobMixin */
+ void resultHook(const result_type &r) Q_DECL_OVERRIDE;
+
+private:
+ std::pair<GpgME::DecryptionResult, GpgME::VerificationResult> mResult;
+};
+
+}
+#endif // __QGPGME_QGPGMEDECRYPTVERIFYJOB_H__
diff --git a/lang/qt/src/qgpgmedeletejob.cpp b/lang/qt/src/qgpgmedeletejob.cpp
new file mode 100644
index 0000000..323aec4
--- /dev/null
+++ b/lang/qt/src/qgpgmedeletejob.cpp
@@ -0,0 +1,65 @@
+/*
+ qgpgmedeletejob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmedeletejob.h"
+
+#include "context.h"
+#include "key.h"
+
+#include <cassert>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEDeleteJob::QGpgMEDeleteJob(Context *context)
+ : mixin_type(context)
+{
+ lateInitialization();
+}
+
+QGpgMEDeleteJob::~QGpgMEDeleteJob() {}
+
+static QGpgMEDeleteJob::result_type delete_key(Context *ctx, const Key &key, bool allowSecretKeyDeletion)
+{
+ const Error err = ctx->deleteKey(key, allowSecretKeyDeletion);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(err, log, ae);
+}
+
+Error QGpgMEDeleteJob::start(const Key &key, bool allowSecretKeyDeletion)
+{
+ run(std::bind(&delete_key, std::placeholders::_1, key, allowSecretKeyDeletion));
+ return Error();
+}
+#include "qgpgmedeletejob.moc"
diff --git a/lang/qt/src/qgpgmedeletejob.h b/lang/qt/src/qgpgmedeletejob.h
new file mode 100644
index 0000000..992442f
--- /dev/null
+++ b/lang/qt/src/qgpgmedeletejob.h
@@ -0,0 +1,71 @@
+/*
+ qgpgmedeletejob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMEDELETEJOB_H__
+#define __QGPGME_QGPGMEDELETEJOB_H__
+
+#include "deletejob.h"
+
+#include "threadedjobmixin.h"
+
+namespace GpgME
+{
+class Key;
+}
+
+namespace QGpgME
+{
+
+class QGpgMEDeleteJob
+#ifdef Q_MOC_RUN
+ : public DeleteJob
+#else
+ : public _detail::ThreadedJobMixin<DeleteJob>
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEDeleteJob(GpgME::Context *context);
+ ~QGpgMEDeleteJob();
+
+ /* from DeleteJob */
+ GpgME::Error start(const GpgME::Key &key, bool allowSecretKeyDeletion) Q_DECL_OVERRIDE;
+};
+
+}
+
+#endif // __QGPGME_QGPGMEDELETEJOB_H__
diff --git a/lang/qt/src/qgpgmedownloadjob.cpp b/lang/qt/src/qgpgmedownloadjob.cpp
new file mode 100644
index 0000000..48cc907
--- /dev/null
+++ b/lang/qt/src/qgpgmedownloadjob.cpp
@@ -0,0 +1,100 @@
+/*
+ qgpgmedownloadjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmedownloadjob.h"
+
+#include "dataprovider.h"
+
+#include "context.h"
+#include "data.h"
+
+#include <QStringList>
+
+#include <cassert>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEDownloadJob::QGpgMEDownloadJob(Context *context)
+ : mixin_type(context)
+{
+ lateInitialization();
+}
+
+QGpgMEDownloadJob::~QGpgMEDownloadJob() {}
+
+static QGpgMEDownloadJob::result_type download_qsl(Context *ctx, const QStringList &pats)
+{
+ QGpgME::QByteArrayDataProvider dp;
+ Data data(&dp);
+
+ const _detail::PatternConverter pc(pats);
+
+ const Error err = ctx->exportPublicKeys(pc.patterns(), data);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(err, dp.data(), log, ae);
+}
+
+static QGpgMEDownloadJob::result_type download(Context *ctx, QThread *thread, const QByteArray &fpr, const std::weak_ptr<QIODevice> &keyData_)
+{
+ const std::shared_ptr<QIODevice> keyData = keyData_.lock();
+ if (!keyData) {
+ return download_qsl(ctx, QStringList(QString::fromUtf8(fpr)));
+ }
+
+ const _detail::ToThreadMover kdMover(keyData, thread);
+
+ QGpgME::QIODeviceDataProvider dp(keyData);
+ Data data(&dp);
+
+ const _detail::PatternConverter pc(fpr);
+
+ const Error err = ctx->exportPublicKeys(pc.patterns(), data);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(err, QByteArray(), log, ae);
+}
+
+Error QGpgMEDownloadJob::start(const QStringList &pats)
+{
+ run(std::bind(&download_qsl, std::placeholders::_1, pats));
+ return Error();
+}
+
+Error QGpgMEDownloadJob::start(const QByteArray &fpr, const std::shared_ptr<QIODevice> &keyData)
+{
+ run(std::bind(&download, std::placeholders::_1, std::placeholders::_2, fpr, std::placeholders::_3), keyData);
+ return Error();
+}
+#include "qgpgmedownloadjob.moc"
diff --git a/lang/qt/src/qgpgmedownloadjob.h b/lang/qt/src/qgpgmedownloadjob.h
new file mode 100644
index 0000000..4091190
--- /dev/null
+++ b/lang/qt/src/qgpgmedownloadjob.h
@@ -0,0 +1,69 @@
+/*
+ qgpgmedownloadjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMEDOWNLOADJOB_H__
+#define __QGPGME_QGPGMEDOWNLOADJOB_H__
+
+#include "downloadjob.h"
+
+#include "threadedjobmixin.h"
+
+namespace QGpgME
+{
+
+class QGpgMEDownloadJob
+#ifdef Q_MOC_RUN
+ : public DownloadJob
+#else
+ : public _detail::ThreadedJobMixin<DownloadJob, std::tuple<GpgME::Error, QByteArray, QString, GpgME::Error> >
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEDownloadJob(GpgME::Context *context);
+ ~QGpgMEDownloadJob();
+
+ /* from DownloadJob */
+ GpgME::Error start(const QStringList &fingerprints) Q_DECL_OVERRIDE;
+
+ /* from DownloadJob */
+ GpgME::Error start(const QByteArray &fingerprint, const std::shared_ptr<QIODevice> &keyData) Q_DECL_OVERRIDE;
+};
+
+}
+
+#endif // __QGPGME_QGPGMEDOWNLOADJOB_H__
diff --git a/lang/qt/src/qgpgmeencryptjob.cpp b/lang/qt/src/qgpgmeencryptjob.cpp
new file mode 100644
index 0000000..82c8ed8
--- /dev/null
+++ b/lang/qt/src/qgpgmeencryptjob.cpp
@@ -0,0 +1,170 @@
+/*
+ qgpgmeencryptjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2007,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmeencryptjob.h"
+
+#include "dataprovider.h"
+
+#include "context.h"
+#include "encryptionresult.h"
+#include "data.h"
+
+#include <QBuffer>
+
+
+#include <cassert>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEEncryptJob::QGpgMEEncryptJob(Context *context)
+ : mixin_type(context),
+ mOutputIsBase64Encoded(false)
+{
+ lateInitialization();
+}
+
+QGpgMEEncryptJob::~QGpgMEEncryptJob() {}
+
+void QGpgMEEncryptJob::setOutputIsBase64Encoded(bool on)
+{
+ mOutputIsBase64Encoded = on;
+}
+
+static QGpgMEEncryptJob::result_type encrypt(Context *ctx, QThread *thread,
+ const std::vector<Key> &recipients,
+ const std::weak_ptr<QIODevice> &plainText_,
+ const std::weak_ptr<QIODevice> &cipherText_,
+ const Context::EncryptionFlags eflags,
+ bool outputIsBsse64Encoded)
+{
+
+ const std::shared_ptr<QIODevice> plainText = plainText_.lock();
+ const std::shared_ptr<QIODevice> cipherText = cipherText_.lock();
+
+ const _detail::ToThreadMover ctMover(cipherText, thread);
+ const _detail::ToThreadMover ptMover(plainText, thread);
+
+ QGpgME::QIODeviceDataProvider in(plainText);
+ const Data indata(&in);
+
+ if (!cipherText) {
+ QGpgME::QByteArrayDataProvider out;
+ Data outdata(&out);
+
+ if (outputIsBsse64Encoded) {
+ outdata.setEncoding(Data::Base64Encoding);
+ }
+
+ const EncryptionResult res = ctx->encrypt(recipients, indata, outdata, eflags);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(res, out.data(), log, ae);
+ } else {
+ QGpgME::QIODeviceDataProvider out(cipherText);
+ Data outdata(&out);
+
+ if (outputIsBsse64Encoded) {
+ outdata.setEncoding(Data::Base64Encoding);
+ }
+
+ const EncryptionResult res = ctx->encrypt(recipients, indata, outdata, eflags);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(res, QByteArray(), log, ae);
+ }
+
+}
+
+static QGpgMEEncryptJob::result_type encrypt_qba(Context *ctx, const std::vector<Key> &recipients, const QByteArray &plainText, const Context::EncryptionFlags eflags, bool outputIsBsse64Encoded)
+{
+ const std::shared_ptr<QBuffer> buffer(new QBuffer);
+ buffer->setData(plainText);
+ if (!buffer->open(QIODevice::ReadOnly)) {
+ assert(!"This should never happen: QBuffer::open() failed");
+ }
+ return encrypt(ctx, 0, recipients, buffer, std::shared_ptr<QIODevice>(), eflags, outputIsBsse64Encoded);
+}
+
+Error QGpgMEEncryptJob::start(const std::vector<Key> &recipients, const QByteArray &plainText, bool alwaysTrust)
+{
+ run(std::bind(&encrypt_qba, std::placeholders::_1, recipients, plainText,
+ alwaysTrust ? Context::AlwaysTrust : Context::None, mOutputIsBase64Encoded));
+ return Error();
+}
+
+void QGpgMEEncryptJob::start(const std::vector<Key> &recipients, const std::shared_ptr<QIODevice> &plainText,
+ const std::shared_ptr<QIODevice> &cipherText, const Context::EncryptionFlags eflags)
+{
+ run(std::bind(&encrypt,
+ std::placeholders::_1, std::placeholders::_2,
+ recipients,
+ std::placeholders::_3, std::placeholders::_4,
+ eflags,
+ mOutputIsBase64Encoded),
+ plainText, cipherText);
+}
+
+EncryptionResult QGpgMEEncryptJob::exec(const std::vector<Key> &recipients, const QByteArray &plainText,
+ const Context::EncryptionFlags eflags, QByteArray &cipherText)
+{
+ const result_type r = encrypt_qba(context(), recipients, plainText, eflags, mOutputIsBase64Encoded);
+ cipherText = std::get<1>(r);
+ resultHook(r);
+ return mResult;
+}
+
+void QGpgMEEncryptJob::start(const std::vector<Key> &recipients, const std::shared_ptr<QIODevice> &plainText, const std::shared_ptr<QIODevice> &cipherText, bool alwaysTrust)
+{
+ return start(recipients, plainText, cipherText, alwaysTrust ? Context::AlwaysTrust : Context::None);
+}
+
+EncryptionResult QGpgMEEncryptJob::exec(const std::vector<Key> &recipients, const QByteArray &plainText, bool alwaysTrust, QByteArray &cipherText)
+{
+ return exec(recipients, plainText, alwaysTrust ? Context::AlwaysTrust : Context::None, cipherText);
+}
+
+void QGpgMEEncryptJob::resultHook(const result_type &tuple)
+{
+ mResult = std::get<0>(tuple);
+}
+
+#if 0
+void QGpgMEEncryptJob::showErrorDialog(QWidget *parent, const QString &caption) const
+{
+ if (mResult.error() && !mResult.error().isCanceled()) {
+ MessageBox::error(parent, mResult, this, caption);
+ }
+}
+#endif
+#include "qgpgmeencryptjob.moc"
diff --git a/lang/qt/src/qgpgmeencryptjob.h b/lang/qt/src/qgpgmeencryptjob.h
new file mode 100644
index 0000000..42c1c78
--- /dev/null
+++ b/lang/qt/src/qgpgmeencryptjob.h
@@ -0,0 +1,109 @@
+/*
+ qgpgmeencryptjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2007,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMEENCRYPTJOB_H__
+#define __QGPGME_QGPGMEENCRYPTJOB_H__
+
+#include "encryptjob.h"
+
+#include "threadedjobmixin.h"
+
+#ifdef BUILDING_QGPGME
+# include "encryptionresult.h"
+#else
+#include <gpgme++/encryptionresult.h>
+#endif
+#ifdef BUILDING_QGPGME
+# include "key.h"
+#else
+#include <gpgme++/key.h>
+#endif
+
+namespace QGpgME
+{
+
+class QGpgMEEncryptJob
+#ifdef Q_MOC_RUN
+ : public EncryptJob
+#else
+ : public _detail::ThreadedJobMixin<EncryptJob, std::tuple<GpgME::EncryptionResult, QByteArray, QString, GpgME::Error> >
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEEncryptJob(GpgME::Context *context);
+ ~QGpgMEEncryptJob();
+
+ /* from EncryptJob */
+ GpgME::Error start(const std::vector<GpgME::Key> &recipients,
+ const QByteArray &plainText, bool alwaysTrust) Q_DECL_OVERRIDE;
+
+ /* from EncryptJob */
+ void start(const std::vector<GpgME::Key> &recipients,
+ const std::shared_ptr<QIODevice> &plainText,
+ const std::shared_ptr<QIODevice> &cipherText,
+ bool alwaysTrust) Q_DECL_OVERRIDE;
+
+ /* from EncryptJob */
+ GpgME::EncryptionResult exec(const std::vector<GpgME::Key> &recipients,
+ const QByteArray &plainText, bool alwaysTrust,
+ QByteArray &cipherText) Q_DECL_OVERRIDE;
+ /* from EncryptJob */
+ void start(const std::vector<GpgME::Key> &recipients,
+ const std::shared_ptr<QIODevice> &plainText,
+ const std::shared_ptr<QIODevice> &cipherText,
+ const GpgME::Context::EncryptionFlags flags) Q_DECL_OVERRIDE;
+
+ /* from EncryptJob */
+ GpgME::EncryptionResult exec(const std::vector<GpgME::Key> &recipients,
+ const QByteArray &plainText, const GpgME::Context::EncryptionFlags flags,
+ QByteArray &cipherText) Q_DECL_OVERRIDE;
+
+ /* from EncryptJob */
+ void setOutputIsBase64Encoded(bool on) Q_DECL_OVERRIDE;
+
+ /* from ThreadedJobMixin */
+ void resultHook(const result_type &r) Q_DECL_OVERRIDE;
+
+private:
+ bool mOutputIsBase64Encoded;
+ GpgME::EncryptionResult mResult;
+};
+
+}
+
+#endif // __QGPGME_QGPGMEENCRYPTJOB_H__
diff --git a/lang/qt/src/qgpgmeexportjob.cpp b/lang/qt/src/qgpgmeexportjob.cpp
new file mode 100644
index 0000000..dfc5fc9
--- /dev/null
+++ b/lang/qt/src/qgpgmeexportjob.cpp
@@ -0,0 +1,76 @@
+/*
+ qgpgmeexportjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmeexportjob.h"
+
+#include "dataprovider.h"
+
+#include "context.h"
+#include "data.h"
+#include "key.h"
+
+#include <QStringList>
+
+#include <cassert>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEExportJob::QGpgMEExportJob(Context *context)
+ : mixin_type(context)
+{
+ lateInitialization();
+}
+
+QGpgMEExportJob::~QGpgMEExportJob() {}
+
+static QGpgMEExportJob::result_type export_qba(Context *ctx, const QStringList &patterns)
+{
+
+ const _detail::PatternConverter pc(patterns);
+
+ QGpgME::QByteArrayDataProvider dp;
+ Data data(&dp);
+
+ const Error err = ctx->exportPublicKeys(pc.patterns(), data);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(err, dp.data(), log, ae);
+}
+
+Error QGpgMEExportJob::start(const QStringList &patterns)
+{
+ run(std::bind(&export_qba, std::placeholders::_1, patterns));
+ return Error();
+}
+#include "qgpgmeexportjob.moc"
diff --git a/lang/qt/src/qgpgmeexportjob.h b/lang/qt/src/qgpgmeexportjob.h
new file mode 100644
index 0000000..7561054
--- /dev/null
+++ b/lang/qt/src/qgpgmeexportjob.h
@@ -0,0 +1,66 @@
+/*
+ qgpgmeexportjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMEEXPORTJOB_H__
+#define __QGPGME_QGPGMEEXPORTJOB_H__
+
+#include "exportjob.h"
+
+#include "threadedjobmixin.h"
+
+namespace QGpgME
+{
+
+class QGpgMEExportJob
+#ifdef Q_MOC_RUN
+ : public ExportJob
+#else
+ : public _detail::ThreadedJobMixin<ExportJob, std::tuple<GpgME::Error, QByteArray, QString, GpgME::Error> >
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEExportJob(GpgME::Context *context);
+ ~QGpgMEExportJob();
+
+ /* from ExportJob */
+ GpgME::Error start(const QStringList &patterns) Q_DECL_OVERRIDE;
+};
+
+}
+
+#endif // __QGPGME_QGPGMEEXPORTJOB_H__
diff --git a/lang/qt/src/qgpgmeimportfromkeyserverjob.cpp b/lang/qt/src/qgpgmeimportfromkeyserverjob.cpp
new file mode 100644
index 0000000..0f19679
--- /dev/null
+++ b/lang/qt/src/qgpgmeimportfromkeyserverjob.cpp
@@ -0,0 +1,82 @@
+/*
+ qgpgmeimportfromkeyserverjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmeimportfromkeyserverjob.h"
+
+#include "dataprovider.h"
+
+#include "context.h"
+#include "data.h"
+#include "key.h"
+
+#include <cassert>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEImportFromKeyserverJob::QGpgMEImportFromKeyserverJob(Context *context)
+ : mixin_type(context)
+{
+ lateInitialization();
+}
+
+QGpgMEImportFromKeyserverJob::~QGpgMEImportFromKeyserverJob() {}
+
+static QGpgMEImportFromKeyserverJob::result_type importfromkeyserver(Context *ctx, const std::vector<Key> &keys)
+{
+ const ImportResult res = ctx->importKeys(keys);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(res, log, ae);
+}
+
+Error QGpgMEImportFromKeyserverJob::start(const std::vector<Key> &keys)
+{
+ run(std::bind(&importfromkeyserver, std::placeholders::_1, keys));
+ return Error();
+}
+
+GpgME::ImportResult QGpgME::QGpgMEImportFromKeyserverJob::exec(const std::vector<Key> &keys)
+{
+ const result_type r = importfromkeyserver(context(), keys);
+ resultHook(r);
+ return mResult;
+}
+
+// PENDING(marc) implement showErrorDialog()
+
+void QGpgME::QGpgMEImportFromKeyserverJob::resultHook(const result_type &tuple)
+{
+ mResult = std::get<0>(tuple);
+}
+#include "qgpgmeimportfromkeyserverjob.moc"
diff --git a/lang/qt/src/qgpgmeimportfromkeyserverjob.h b/lang/qt/src/qgpgmeimportfromkeyserverjob.h
new file mode 100644
index 0000000..8c9f944
--- /dev/null
+++ b/lang/qt/src/qgpgmeimportfromkeyserverjob.h
@@ -0,0 +1,81 @@
+/*
+ qgpgmeimportfromkeyserverjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMEIMPORTFROMKEYSERVERJOB_H__
+#define __QGPGME_QGPGMEIMPORTFROMKEYSERVERJOB_H__
+
+#include "importfromkeyserverjob.h"
+
+#include "threadedjobmixin.h"
+
+#ifdef BUILDING_QGPGME
+# include "importresult.h"
+#else
+#include <gpgme++/importresult.h>
+#endif
+
+namespace QGpgME
+{
+
+class QGpgMEImportFromKeyserverJob
+#ifdef Q_MOC_RUN
+ : public ImportFromKeyserverJob
+#else
+ : public _detail::ThreadedJobMixin<ImportFromKeyserverJob, std::tuple<GpgME::ImportResult, QString, GpgME::Error> >
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEImportFromKeyserverJob(GpgME::Context *context);
+ ~QGpgMEImportFromKeyserverJob();
+
+ /* from ImportFromKeyserverJob */
+ GpgME::Error start(const std::vector<GpgME::Key> &keys) Q_DECL_OVERRIDE;
+
+ /* from ImportFromKeyserverJob */
+ GpgME::ImportResult exec(const std::vector<GpgME::Key> &keys) Q_DECL_OVERRIDE;
+
+ /* from ThreadedJobMixin */
+ void resultHook(const result_type &r) Q_DECL_OVERRIDE;
+
+private:
+ GpgME::ImportResult mResult;
+};
+
+}
+
+#endif // __QGPGME_QGPGMEIMPORTFROMKEYSERVERJOB_H__
diff --git a/lang/qt/src/qgpgmeimportjob.cpp b/lang/qt/src/qgpgmeimportjob.cpp
new file mode 100644
index 0000000..f125b12
--- /dev/null
+++ b/lang/qt/src/qgpgmeimportjob.cpp
@@ -0,0 +1,85 @@
+/*
+ qgpgmeimportjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmeimportjob.h"
+
+#include "dataprovider.h"
+
+#include "context.h"
+#include "data.h"
+#include "key.h"
+
+#include <cassert>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEImportJob::QGpgMEImportJob(Context *context)
+ : mixin_type(context)
+{
+ lateInitialization();
+}
+
+QGpgMEImportJob::~QGpgMEImportJob() {}
+
+static QGpgMEImportJob::result_type import_qba(Context *ctx, const QByteArray &certData)
+{
+ QGpgME::QByteArrayDataProvider dp(certData);
+ Data data(&dp);
+
+ const ImportResult res = ctx->importKeys(data);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(res, log, ae);
+}
+
+Error QGpgMEImportJob::start(const QByteArray &certData)
+{
+ run(std::bind(&import_qba, std::placeholders::_1, certData));
+ return Error();
+}
+
+GpgME::ImportResult QGpgME::QGpgMEImportJob::exec(const QByteArray &keyData)
+{
+ const result_type r = import_qba(context(), keyData);
+ resultHook(r);
+ return mResult;
+}
+
+// PENDING(marc) implement showErrorDialog()
+
+void QGpgME::QGpgMEImportJob::resultHook(const result_type &tuple)
+{
+ mResult = std::get<0>(tuple);
+}
+#include "qgpgmeimportjob.moc"
diff --git a/lang/qt/src/qgpgmeimportjob.h b/lang/qt/src/qgpgmeimportjob.h
new file mode 100644
index 0000000..424cb50
--- /dev/null
+++ b/lang/qt/src/qgpgmeimportjob.h
@@ -0,0 +1,81 @@
+/*
+ qgpgmeimportjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMEIMPORTJOB_H__
+#define __QGPGME_QGPGMEIMPORTJOB_H__
+
+#include "importjob.h"
+
+#include "threadedjobmixin.h"
+
+#ifdef BUILDING_QGPGME
+# include "importresult.h"
+#else
+#include <gpgme++/importresult.h>
+#endif
+
+namespace QGpgME
+{
+
+class QGpgMEImportJob
+#ifdef Q_MOC_RUN
+ : public ImportJob
+#else
+ : public _detail::ThreadedJobMixin<ImportJob, std::tuple<GpgME::ImportResult, QString, GpgME::Error> >
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEImportJob(GpgME::Context *context);
+ ~QGpgMEImportJob();
+
+ /* from ImportJob */
+ GpgME::Error start(const QByteArray &keyData) Q_DECL_OVERRIDE;
+
+ /* from ImportJob */
+ GpgME::ImportResult exec(const QByteArray &keyData) Q_DECL_OVERRIDE;
+
+ /* from ThreadedJobMixin */
+ void resultHook(const result_type &r) Q_DECL_OVERRIDE;
+
+private:
+ GpgME::ImportResult mResult;
+};
+
+}
+
+#endif // __QGPGME_QGPGMEIMPORTJOB_H__
diff --git a/lang/qt/src/qgpgmekeyformailboxjob.cpp b/lang/qt/src/qgpgmekeyformailboxjob.cpp
new file mode 100644
index 0000000..803d0e6
--- /dev/null
+++ b/lang/qt/src/qgpgmekeyformailboxjob.cpp
@@ -0,0 +1,138 @@
+/*
+ qgpgmekeyformailboxjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmekeyformailboxjob.h"
+#include "qgpgmekeylistjob.h"
+
+#include <QStringList>
+
+#include <tuple>
+
+using namespace GpgME;
+using namespace QGpgME;
+
+QGpgMEKeyForMailboxJob::QGpgMEKeyForMailboxJob(Context *context)
+ : mixin_type(context)
+{
+ lateInitialization();
+}
+
+QGpgMEKeyForMailboxJob::~QGpgMEKeyForMailboxJob() {}
+
+static bool keyIsOk(const Key k)
+{
+ return !k.isExpired() && !k.isRevoked() && !k.isInvalid() && !k.isDisabled();
+}
+
+static bool uidIsOk(const UserID uid)
+{
+ return keyIsOk(uid.parent()) && !uid.isRevoked() && !uid.isInvalid();
+}
+
+static bool subkeyIsOk(const Subkey s)
+{
+ return !s.isRevoked() && !s.isInvalid() && !s.isDisabled();
+}
+
+static QGpgMEKeyForMailboxJob::result_type do_work(Context *ctx, const QString &mailbox, bool canEncrypt)
+{
+ /* Do a Keylisting. */
+ ctx->setKeyListMode(GpgME::Extern | GpgME::Local | GpgME::Signatures | GpgME::Validate);
+ std::vector<Key> keys;
+ QGpgMEKeyListJob *keylist = new QGpgMEKeyListJob(ctx);
+
+ KeyListResult result = keylist->exec(QStringList() << mailbox, false, keys);
+
+ if (result.error()) {
+ return std::make_tuple(result, Key(), UserID(), QString(), Error());
+ }
+
+ // This should ideally be decided by GnuPG and this Job changed
+ // to just call the according API in GpgME
+ // See: https://bugs.gnupg.org/gnupg/issue2359
+ Key keyC;
+ UserID uidC;
+ Q_FOREACH (const Key k, keys) {
+ if (canEncrypt && !k.canEncrypt()) {
+ continue;
+ }
+ /* First get the uid that matches the mailbox */
+ Q_FOREACH (const UserID u, k.userIDs()) {
+ if (QString::fromUtf8(u.email()).toLower() == mailbox.toLower()) {
+ if (uidC.isNull()) {
+ keyC = k;
+ uidC = u;
+ } else if ((!uidIsOk(uidC) && uidIsOk(u)) || uidC.validity() < u.validity()) {
+ /* Validity of the new key is better. */
+ uidC = u;
+ keyC = k;
+ } else if (uidC.validity() == u.validity() && uidIsOk(u)) {
+ /* Both are the same check which one is newer. */
+ time_t oldTime = 0;
+ Q_FOREACH (const Subkey s, keyC.subkeys()) {
+ if ((canEncrypt && s.canEncrypt()) && subkeyIsOk(s)) {
+ oldTime = s.creationTime();
+ }
+ }
+ time_t newTime = 0;
+ Q_FOREACH (const Subkey s, k.subkeys()) {
+ if ((canEncrypt && s.canEncrypt()) && subkeyIsOk(s)) {
+ newTime = s.creationTime();
+ }
+ }
+ if (newTime > oldTime) {
+ uidC = u;
+ keyC = k;
+ }
+ }
+ }
+ }
+ }
+ return std::make_tuple(result, keyC, uidC, QString(), Error());
+}
+
+Error QGpgMEKeyForMailboxJob::start(const QString &mailbox, bool canEncrypt)
+{
+ run(std::bind(&do_work, std::placeholders::_1, mailbox, canEncrypt));
+ return Error();
+}
+
+KeyListResult QGpgMEKeyForMailboxJob::exec(const QString &mailbox, bool canEncrypt, Key &key, UserID &uid)
+{
+ const result_type r = do_work(context(), mailbox, canEncrypt);
+ resultHook(r);
+ key = std::get<1>(r);
+ uid = std::get<2>(r);
+ return std::get<0>(r);
+}
+
+#include "qgpgmekeyformailboxjob.moc"
diff --git a/lang/qt/src/qgpgmekeyformailboxjob.h b/lang/qt/src/qgpgmekeyformailboxjob.h
new file mode 100644
index 0000000..8ac2c1f
--- /dev/null
+++ b/lang/qt/src/qgpgmekeyformailboxjob.h
@@ -0,0 +1,84 @@
+/*
+ qgpgmekeyformailboxjob.h
+
+ This file is part of libkleopatra, the KDE keymanagement library
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMEKEYFORMAILBOXJOB_H__
+#define __QGPGME_QGPGMEKEYFORMAILBOXJOB_H__
+#include "keyformailboxjob.h"
+
+#include "threadedjobmixin.h"
+
+#ifdef BUILDING_QGPGME
+# include "keylistresult.h"
+# include "key.h"
+#else
+# include <gpgme++/keylistresult.h>
+# include <gpgme++/key.h>
+#endif
+
+namespace QGpgME
+{
+
+class QGpgMEKeyForMailboxJob
+#ifdef Q_MOC_RUN
+ : public KeyForMailboxJob
+#else
+ : public _detail::ThreadedJobMixin<KeyForMailboxJob, std::tuple<GpgME::KeyListResult, GpgME::Key, GpgME::UserID, QString, GpgME::Error> >
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEKeyForMailboxJob(GpgME::Context *context);
+ ~QGpgMEKeyForMailboxJob();
+
+ /**
+ Starts the operation. \a mailbox is the mailbox to
+ look for.
+
+ The result is the same as for the LocateKeysJob.
+
+ If \a canEncrypt is true, only keys that have a subkey for encryption
+ usage are returned. Use this if you need to select a
+ key for signing.
+ */
+ GpgME::Error start(const QString &mailbox, bool canEncrypt = true) Q_DECL_OVERRIDE;
+
+ GpgME::KeyListResult exec(const QString &mailbox, bool canEncrypt, GpgME::Key &key, GpgME::UserID &uid) Q_DECL_OVERRIDE;
+};
+
+}
+#endif
diff --git a/lang/qt/src/qgpgmekeygenerationjob.cpp b/lang/qt/src/qgpgmekeygenerationjob.cpp
new file mode 100644
index 0000000..cba6b76
--- /dev/null
+++ b/lang/qt/src/qgpgmekeygenerationjob.cpp
@@ -0,0 +1,71 @@
+/*
+ qgpgmekeygenerationjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmekeygenerationjob.h"
+
+#include "dataprovider.h"
+
+#include "context.h"
+#include "data.h"
+
+#include <cassert>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEKeyGenerationJob::QGpgMEKeyGenerationJob(Context *context)
+ : mixin_type(context)
+{
+ lateInitialization();
+}
+
+QGpgMEKeyGenerationJob::~QGpgMEKeyGenerationJob() {}
+
+static QGpgMEKeyGenerationJob::result_type generate_key(Context *ctx, const QString &parameters)
+{
+ QGpgME::QByteArrayDataProvider dp;
+ Data data = ctx->protocol() == CMS ? Data(&dp) : Data(Data::null);
+ assert(data.isNull() == (ctx->protocol() != CMS));
+
+ const KeyGenerationResult res = ctx->generateKey(parameters.toUtf8().constData(), data);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(res, dp.data(), log, ae);
+}
+
+Error QGpgMEKeyGenerationJob::start(const QString &parameters)
+{
+ run(std::bind(&generate_key, std::placeholders::_1, parameters));
+ return Error();
+}
+#include "qgpgmekeygenerationjob.moc"
diff --git a/lang/qt/src/qgpgmekeygenerationjob.h b/lang/qt/src/qgpgmekeygenerationjob.h
new file mode 100644
index 0000000..808b714
--- /dev/null
+++ b/lang/qt/src/qgpgmekeygenerationjob.h
@@ -0,0 +1,72 @@
+/*
+ qgpgmekeygenerationjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMEKEYGENERATIONJOB_H__
+#define __QGPGME_QGPGMEKEYGENERATIONJOB_H__
+
+#include "keygenerationjob.h"
+
+#include "threadedjobmixin.h"
+
+#ifdef BUILDING_QGPGME
+# include "keygenerationresult.h"
+#else
+#include <gpgme++/keygenerationresult.h>
+#endif
+
+namespace QGpgME
+{
+
+class QGpgMEKeyGenerationJob
+#ifdef Q_MOC_RUN
+ : public KeyGenerationJob
+#else
+ : public _detail::ThreadedJobMixin<KeyGenerationJob, std::tuple<GpgME::KeyGenerationResult, QByteArray, QString, GpgME::Error> >
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+private Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEKeyGenerationJob(GpgME::Context *context);
+ ~QGpgMEKeyGenerationJob();
+
+ /* from KeygenerationJob */
+ GpgME::Error start(const QString &parameters) Q_DECL_OVERRIDE;
+};
+
+}
+
+#endif // __QGPGME_QGPGMEKEYGENERATIONJOB_H__
diff --git a/lang/qt/src/qgpgmekeylistjob.cpp b/lang/qt/src/qgpgmekeylistjob.cpp
new file mode 100644
index 0000000..1169c46
--- /dev/null
+++ b/lang/qt/src/qgpgmekeylistjob.cpp
@@ -0,0 +1,172 @@
+/*
+ qgpgmekeylistjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmekeylistjob.h"
+
+#include "key.h"
+#include "context.h"
+#include "keylistresult.h"
+#include <gpg-error.h>
+
+#include <QStringList>
+
+#include <algorithm>
+
+#include <cstdlib>
+#include <cstring>
+#include <cassert>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEKeyListJob::QGpgMEKeyListJob(Context *context)
+ : mixin_type(context),
+ mResult(), mSecretOnly(false)
+{
+ lateInitialization();
+}
+
+QGpgMEKeyListJob::~QGpgMEKeyListJob() {}
+
+static KeyListResult do_list_keys(Context *ctx, const QStringList &pats, std::vector<Key> &keys, bool secretOnly)
+{
+
+ const _detail::PatternConverter pc(pats);
+
+ if (const Error err = ctx->startKeyListing(pc.patterns(), secretOnly)) {
+ return KeyListResult(0, err);
+ }
+
+ Error err;
+ do {
+ keys.push_back(ctx->nextKey(err));
+ } while (!err);
+
+ keys.pop_back();
+
+ const KeyListResult result = ctx->endKeyListing();
+ ctx->cancelPendingOperation();
+ return result;
+}
+
+static QGpgMEKeyListJob::result_type list_keys(Context *ctx, QStringList pats, bool secretOnly)
+{
+ if (pats.size() < 2) {
+ std::vector<Key> keys;
+ const KeyListResult r = do_list_keys(ctx, pats, keys, secretOnly);
+ return std::make_tuple(r, keys, QString(), Error());
+ }
+
+ // The communication channel between gpgme and gpgsm is limited in
+ // the number of patterns that can be transported, but they won't
+ // say to how much, so we need to find out ourselves if we get a
+ // LINE_TOO_LONG error back...
+
+ // We could of course just feed them single patterns, and that would
+ // probably be easier, but the performance penalty would currently
+ // be noticeable.
+
+ unsigned int chunkSize = pats.size();
+retry:
+ std::vector<Key> keys;
+ keys.reserve(pats.size());
+ KeyListResult result;
+ do {
+ const KeyListResult this_result = do_list_keys(ctx, pats.mid(0, chunkSize), keys, secretOnly);
+ if (this_result.error().code() == GPG_ERR_LINE_TOO_LONG) {
+ // got LINE_TOO_LONG, try a smaller chunksize:
+ chunkSize /= 2;
+ if (chunkSize < 1)
+ // chunks smaller than one can't be -> return the error.
+ {
+ return std::make_tuple(this_result, keys, QString(), Error());
+ } else {
+ goto retry;
+ }
+ } else if (this_result.error().code() == GPG_ERR_EOF) {
+ // early end of keylisting (can happen when ~/.gnupg doesn't
+ // exist). Fakeing an empty result:
+ return std::make_tuple(KeyListResult(), std::vector<Key>(), QString(), Error());
+ }
+ // ok, that seemed to work...
+ result.mergeWith(this_result);
+ if (result.error().code()) {
+ break;
+ }
+ pats = pats.mid(chunkSize);
+ } while (!pats.empty());
+ return std::make_tuple(result, keys, QString(), Error());
+}
+
+Error QGpgMEKeyListJob::start(const QStringList &patterns, bool secretOnly)
+{
+ mSecretOnly = secretOnly;
+ run(std::bind(&list_keys, std::placeholders::_1, patterns, secretOnly));
+ return Error();
+}
+
+KeyListResult QGpgMEKeyListJob::exec(const QStringList &patterns, bool secretOnly, std::vector<Key> &keys)
+{
+ mSecretOnly = secretOnly;
+ const result_type r = list_keys(context(), patterns, secretOnly);
+ resultHook(r);
+ keys = std::get<1>(r);
+ return std::get<0>(r);
+}
+
+void QGpgMEKeyListJob::resultHook(const result_type &tuple)
+{
+ mResult = std::get<0>(tuple);
+ Q_FOREACH (const Key &key, std::get<1>(tuple)) {
+ Q_EMIT nextKey(key);
+ }
+}
+
+void QGpgMEKeyListJob::addMode(KeyListMode mode)
+{
+ context()->addKeyListMode(mode);
+}
+#if 0
+void QGpgMEKeyListJob::showErrorDialog(QWidget *parent, const QString &caption) const
+{
+ if (!mResult.error() || mResult.error().isCanceled()) {
+ return;
+ }
+ const QString msg = i18n("<qt><p>An error occurred while fetching "
+ "the keys from the backend:</p>"
+ "<p><b>%1</b></p></qt>",
+ QString::fromLocal8Bit(mResult.error().asString()));
+ KMessageBox::error(parent, msg, caption);
+}
+#endif
+#include "qgpgmekeylistjob.moc"
diff --git a/lang/qt/src/qgpgmekeylistjob.h b/lang/qt/src/qgpgmekeylistjob.h
new file mode 100644
index 0000000..2d5406a
--- /dev/null
+++ b/lang/qt/src/qgpgmekeylistjob.h
@@ -0,0 +1,88 @@
+/*
+ qgpgmekeylistjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMEKEYLISTJOB_H__
+#define __QGPGME_QGPGMEKEYLISTJOB_H__
+
+#include "keylistjob.h"
+
+#include "threadedjobmixin.h"
+
+#ifdef BUILDING_QGPGME
+# include "keylistresult.h"
+#else
+#include <gpgme++/keylistresult.h>
+#endif
+#ifdef BUILDING_QGPGME
+# include "key.h"
+#else
+#include <gpgme++/key.h>
+#endif
+
+namespace QGpgME
+{
+
+class QGpgMEKeyListJob
+#ifdef Q_MOC_RUN
+ : public KeyListJob
+#else
+ : public _detail::ThreadedJobMixin<KeyListJob, std::tuple<GpgME::KeyListResult, std::vector<GpgME::Key>, QString, GpgME::Error> >
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEKeyListJob(GpgME::Context *context);
+ ~QGpgMEKeyListJob();
+
+ /* from KeyListJob */
+ GpgME::Error start(const QStringList &patterns, bool secretOnly) Q_DECL_OVERRIDE;
+
+ /* from KeyListJob */
+ GpgME::KeyListResult exec(const QStringList &patterns, bool secretOnly, std::vector<GpgME::Key> &keys) Q_DECL_OVERRIDE;
+
+ void addMode(GpgME::KeyListMode mode) Q_DECL_OVERRIDE;
+
+ /* from ThreadedJobMixin */
+ void resultHook(const result_type &result) Q_DECL_OVERRIDE;
+private:
+ GpgME::KeyListResult mResult;
+ bool mSecretOnly;
+};
+
+}
+
+#endif // __QGPGME_QGPGMEKEYLISTJOB_H__
diff --git a/lang/qt/src/qgpgmelistallkeysjob.cpp b/lang/qt/src/qgpgmelistallkeysjob.cpp
new file mode 100644
index 0000000..fd8bfc3
--- /dev/null
+++ b/lang/qt/src/qgpgmelistallkeysjob.cpp
@@ -0,0 +1,168 @@
+/*
+ qgpgmelistallkeysjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmelistallkeysjob.h"
+
+#include "key.h"
+#include "context.h"
+#include "keylistresult.h"
+#include <gpg-error.h>
+
+#include <algorithm>
+
+#include <cstdlib>
+#include <cstring>
+#include <cassert>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEListAllKeysJob::QGpgMEListAllKeysJob(Context *context)
+ : mixin_type(context),
+ mResult()
+{
+ lateInitialization();
+}
+
+QGpgMEListAllKeysJob::~QGpgMEListAllKeysJob() {}
+
+static KeyListResult do_list_keys(Context *ctx, std::vector<Key> &keys, bool secretOnly)
+{
+
+ const char **pat = 0;
+ if (const Error err = ctx->startKeyListing(pat, secretOnly)) {
+ return KeyListResult(0, err);
+ }
+
+ Error err;
+ do {
+ keys.push_back(ctx->nextKey(err));
+ } while (!err);
+
+ keys.pop_back();
+
+ const KeyListResult result = ctx->endKeyListing();
+ ctx->cancelPendingOperation();
+ return result;
+}
+
+namespace
+{
+
+template <typename ForwardIterator, typename BinaryPredicate>
+ForwardIterator unique_by_merge(ForwardIterator first, ForwardIterator last, BinaryPredicate pred)
+{
+ first = std::adjacent_find(first, last, pred);
+ if (first == last) {
+ return last;
+ }
+
+ ForwardIterator dest = first;
+ dest->mergeWith(*++first);
+ while (++first != last)
+ if (pred(*dest, *first)) {
+ dest->mergeWith(*first);
+ } else {
+ *++dest = *first;
+ }
+ return ++dest;
+}
+
+}
+
+static void merge_keys(std::vector<Key> &merged, std::vector<Key> &pub, std::vector<Key> &sec)
+{
+ merged.reserve(pub.size() + sec.size());
+
+ std::merge(pub.begin(), pub.end(),
+ sec.begin(), sec.end(),
+ std::back_inserter(merged),
+ ByFingerprint<std::less>());
+
+ merged.erase(unique_by_merge(merged.begin(), merged.end(), ByFingerprint<std::equal_to>()),
+ merged.end());
+}
+
+static QGpgMEListAllKeysJob::result_type list_keys(Context *ctx, bool mergeKeys)
+{
+ std::vector<Key> pub, sec, merged;
+ KeyListResult r;
+
+ r.mergeWith(do_list_keys(ctx, pub, false));
+ std::sort(pub.begin(), pub.end(), ByFingerprint<std::less>());
+
+ r.mergeWith(do_list_keys(ctx, sec, true));
+ std::sort(sec.begin(), sec.end(), ByFingerprint<std::less>());
+
+ if (mergeKeys) {
+ merge_keys(merged, pub, sec);
+ } else {
+ merged.swap(pub);
+ }
+ return std::make_tuple(r, merged, sec, QString(), Error());
+}
+
+Error QGpgMEListAllKeysJob::start(bool mergeKeys)
+{
+ run(std::bind(&list_keys, std::placeholders::_1, mergeKeys));
+ return Error();
+}
+
+KeyListResult QGpgMEListAllKeysJob::exec(std::vector<Key> &pub, std::vector<Key> &sec, bool mergeKeys)
+{
+ const result_type r = list_keys(context(), mergeKeys);
+ resultHook(r);
+ pub = std::get<1>(r);
+ sec = std::get<2>(r);
+ return std::get<0>(r);
+}
+
+void QGpgMEListAllKeysJob::resultHook(const result_type &tuple)
+{
+ mResult = std::get<0>(tuple);
+}
+
+#if 0
+void QGpgMEListAllKeysJob::showErrorDialog(QWidget *parent, const QString &caption) const
+{
+ if (!mResult.error() || mResult.error().isCanceled()) {
+ return;
+ }
+ const QString msg = i18n("<qt><p>An error occurred while fetching "
+ "the keys from the backend:</p>"
+ "<p><b>%1</b></p></qt>",
+ QString::fromLocal8Bit(mResult.error().asString()));
+ KMessageBox::error(parent, msg, caption);
+}
+#endif
+#include "qgpgmelistallkeysjob.moc"
diff --git a/lang/qt/src/qgpgmelistallkeysjob.h b/lang/qt/src/qgpgmelistallkeysjob.h
new file mode 100644
index 0000000..1fc69d4
--- /dev/null
+++ b/lang/qt/src/qgpgmelistallkeysjob.h
@@ -0,0 +1,86 @@
+/*
+ qgpgmelistallkeysjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMELISTALLKEYSJOB_H__
+#define __QGPGME_QGPGMELISTALLKEYSJOB_H__
+
+#include "listallkeysjob.h"
+
+#include "threadedjobmixin.h"
+
+#ifdef BUILDING_QGPGME
+# include "keylistresult.h"
+#else
+#include <gpgme++/keylistresult.h>
+#endif
+#ifdef BUILDING_QGPGME
+# include "key.h"
+#else
+#include <gpgme++/key.h>
+#endif
+
+namespace QGpgME
+{
+
+class QGpgMEListAllKeysJob
+#ifdef Q_MOC_RUN
+ : public ListAllKeysJob
+#else
+ : public _detail::ThreadedJobMixin<ListAllKeysJob, std::tuple<GpgME::KeyListResult, std::vector<GpgME::Key>, std::vector<GpgME::Key>, QString, GpgME::Error> >
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEListAllKeysJob(GpgME::Context *context);
+ ~QGpgMEListAllKeysJob();
+
+ /* from ListAllKeysJob */
+ GpgME::Error start(bool mergeKeys) Q_DECL_OVERRIDE;
+
+ /* from ListAllKeysJob */
+ GpgME::KeyListResult exec(std::vector<GpgME::Key> &pub, std::vector<GpgME::Key> &sec, bool mergeKeys) Q_DECL_OVERRIDE;
+
+ /* from ThreadedJobMixin */
+ void resultHook(const result_type &result) Q_DECL_OVERRIDE;
+
+private:
+ GpgME::KeyListResult mResult;
+};
+
+}
+
+#endif // __QGPGME_QGPGMELISTALLKEYSJOB_H__
diff --git a/lang/qt/src/qgpgmenewcryptoconfig.cpp b/lang/qt/src/qgpgmenewcryptoconfig.cpp
new file mode 100644
index 0000000..7303f10
--- /dev/null
+++ b/lang/qt/src/qgpgmenewcryptoconfig.cpp
@@ -0,0 +1,738 @@
+/*
+ qgpgmenewcryptoconfig.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2010 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmenewcryptoconfig.h"
+
+#include <QDebug>
+#include "gpgme_backend_debug.h"
+
+#include <QFile>
+
+#include "global.h"
+#include "error.h"
+
+
+#include <sstream>
+#include <string>
+#include <cassert>
+
+using namespace QGpgME;
+using namespace GpgME;
+using namespace GpgME::Configuration;
+
+namespace
+{
+struct Select1St {
+ template <typename U, typename V>
+ const U &operator()(const std::pair<U, V> &p) const
+ {
+ return p.first;
+ }
+ template <typename U, typename V>
+ const U &operator()(const QPair<U, V> &p) const
+ {
+ return p.first;
+ }
+};
+}
+
+// Just for the Q_ASSERT in the dtor. Not thread-safe, but who would
+// have 2 threads talking to gpgconf anyway? :)
+static bool s_duringClear = false;
+
+QGpgMENewCryptoConfig::QGpgMENewCryptoConfig()
+ : m_parsed(false)
+{
+}
+
+QGpgMENewCryptoConfig::~QGpgMENewCryptoConfig()
+{
+ clear();
+}
+
+void QGpgMENewCryptoConfig::reloadConfiguration(bool showErrors)
+{
+ clear();
+
+ Error error;
+ const std::vector<Component> components = Component::load(error);
+#ifndef NDEBUG
+ {
+ std::stringstream ss;
+ ss << "error: " << error
+ << "components:\n";
+ std::copy(components.begin(), components.end(),
+ std::ostream_iterator<Component>(ss, "\n"));
+ qCDebug(GPGPME_BACKEND_LOG) << ss.str().c_str();
+ }
+#endif
+#if 0
+ TODO port?
+ if (error && showErrors) {
+ const QString wmsg = i18n("<qt>Failed to execute gpgconf:<p>%1</p></qt>", QString::fromLocal8Bit(error.asString()));
+ qCWarning(GPGPME_BACKEND_LOG) << wmsg; // to see it from test_cryptoconfig.cpp
+ KMessageBox::error(0, wmsg);
+ }
+#endif
+ Q_FOREACH(const Component & c, components) {
+ const std::shared_ptr<QGpgMENewCryptoConfigComponent> comp(new QGpgMENewCryptoConfigComponent);
+ comp->setComponent(c);
+ m_componentsByName[ comp->name() ] = comp;
+ }
+ m_parsed = true;
+}
+
+QStringList QGpgMENewCryptoConfig::componentList() const
+{
+ if (!m_parsed) {
+ const_cast<QGpgMENewCryptoConfig *>(this)->reloadConfiguration(true);
+ }
+ QStringList result;
+ std::transform(m_componentsByName.begin(), m_componentsByName.end(),
+ std::back_inserter(result),
+ mem_fn(&QGpgMENewCryptoConfigComponent::name));
+ return result;
+}
+
+QGpgMENewCryptoConfigComponent *QGpgMENewCryptoConfig::component(const QString &name) const
+{
+ if (!m_parsed) {
+ const_cast<QGpgMENewCryptoConfig *>(this)->reloadConfiguration(false);
+ }
+ return m_componentsByName.value(name).get();
+}
+
+void QGpgMENewCryptoConfig::sync(bool runtime)
+{
+ Q_FOREACH(const std::shared_ptr<QGpgMENewCryptoConfigComponent> &c, m_componentsByName)
+ c->sync(runtime);
+}
+
+void QGpgMENewCryptoConfig::clear()
+{
+ s_duringClear = true;
+ m_componentsByName.clear();
+ s_duringClear = false;
+ m_parsed = false; // next call to componentList/component will need to run gpgconf again
+}
+
+////
+
+QGpgMENewCryptoConfigComponent::QGpgMENewCryptoConfigComponent()
+ : CryptoConfigComponent(),
+ m_component()
+{
+
+}
+
+void QGpgMENewCryptoConfigComponent::setComponent(const Component &component)
+{
+ m_component = component;
+ m_groupsByName.clear();
+
+ std::shared_ptr<QGpgMENewCryptoConfigGroup> group;
+
+ const std::vector<Option> options = m_component.options();
+ Q_FOREACH(const Option & o, options)
+ if (o.flags() & Group) {
+ if (group) {
+ m_groupsByName[group->name()] = group;
+ }
+ group.reset(new QGpgMENewCryptoConfigGroup(shared_from_this(), o));
+ } else if (group) {
+ const std::shared_ptr<QGpgMENewCryptoConfigEntry> entry(new QGpgMENewCryptoConfigEntry(group, o));
+ const QString name = entry->name();
+ group->m_entryNames.push_back(name);
+ group->m_entriesByName[name] = entry;
+ } else {
+ qCWarning(GPGPME_BACKEND_LOG) << "found no group for entry" << o.name() << "of component" << name();
+ }
+ if (group) {
+ m_groupsByName[group->name()] = group;
+ }
+
+}
+
+QGpgMENewCryptoConfigComponent::~QGpgMENewCryptoConfigComponent() {}
+
+QString QGpgMENewCryptoConfigComponent::name() const
+{
+ return QString::fromUtf8(m_component.name());
+}
+
+QString QGpgMENewCryptoConfigComponent::description() const
+{
+ return QString::fromUtf8(m_component.description());
+}
+
+QStringList QGpgMENewCryptoConfigComponent::groupList() const
+{
+ QStringList result;
+ result.reserve(m_groupsByName.size());
+ std::transform(m_groupsByName.begin(), m_groupsByName.end(),
+ std::back_inserter(result),
+ std::mem_fn(&QGpgMENewCryptoConfigGroup::name));
+ return result;
+}
+
+QGpgMENewCryptoConfigGroup *QGpgMENewCryptoConfigComponent::group(const QString &name) const
+{
+ return m_groupsByName.value(name).get();
+}
+
+void QGpgMENewCryptoConfigComponent::sync(bool runtime)
+{
+ Q_UNUSED(runtime)
+ // ### how to pass --runtime to gpgconf? -> marcus: not yet supported (2010-11-20)
+ if (const Error err = m_component.save()) {
+#if 0
+ TODO port
+ const QString wmsg = i18n("Error from gpgconf while saving configuration: %1", QString::fromLocal8Bit(err.asString()));
+ qCWarning(GPGPME_BACKEND_LOG) << ":" << wmsg;
+ KMessageBox::error(0, wmsg);
+#endif
+ }
+ // ### unset dirty state again
+}
+
+////
+
+QGpgMENewCryptoConfigGroup::QGpgMENewCryptoConfigGroup(const std::shared_ptr<QGpgMENewCryptoConfigComponent> &comp, const Option &option)
+ : CryptoConfigGroup(),
+ m_component(comp),
+ m_option(option)
+{
+}
+
+QGpgMENewCryptoConfigGroup::~QGpgMENewCryptoConfigGroup() {}
+
+QString QGpgMENewCryptoConfigGroup::name() const
+{
+ return QString::fromUtf8(m_option.name());
+}
+
+QString QGpgMENewCryptoConfigGroup::description() const
+{
+ return QString::fromUtf8(m_option.description());
+}
+
+QString QGpgMENewCryptoConfigGroup::path() const
+{
+ if (const std::shared_ptr<QGpgMENewCryptoConfigComponent> c = m_component.lock()) {
+ return c->name() + QLatin1Char('/') + name();
+ } else {
+ return QString();
+ }
+}
+
+CryptoConfigEntry::Level QGpgMENewCryptoConfigGroup::level() const
+{
+ // two casts to make SunCC happy:
+ return static_cast<CryptoConfigEntry::Level>(static_cast<unsigned int>(m_option.level()));
+}
+
+QStringList QGpgMENewCryptoConfigGroup::entryList() const
+{
+ return m_entryNames;
+}
+
+QGpgMENewCryptoConfigEntry *QGpgMENewCryptoConfigGroup::entry(const QString &name) const
+{
+ return m_entriesByName.value(name).get();
+}
+
+static QString urlpart_encode(const QString &str)
+{
+ QString enc(str);
+ enc.replace(QLatin1Char('%'), QStringLiteral("%25")); // first!
+ enc.replace(QLatin1Char(':'), QStringLiteral("%3a"));
+ //qCDebug(GPGPME_BACKEND_LOG) <<" urlpart_encode:" << str <<" ->" << enc;
+ return enc;
+}
+
+static QString urlpart_decode(const QString &str)
+{
+ return QUrl::fromPercentEncoding(str.toLatin1());
+}
+
+// gpgconf arg type number -> NewCryptoConfigEntry arg type enum mapping
+static QGpgME::CryptoConfigEntry::ArgType knownArgType(int argType, bool &ok)
+{
+ ok = true;
+ switch (argType) {
+ case 0: // none
+ return QGpgME::CryptoConfigEntry::ArgType_None;
+ case 1: // string
+ return QGpgME::CryptoConfigEntry::ArgType_String;
+ case 2: // int32
+ return QGpgME::CryptoConfigEntry::ArgType_Int;
+ case 3: // uint32
+ return QGpgME::CryptoConfigEntry::ArgType_UInt;
+ case 32: // pathname
+ return QGpgME::CryptoConfigEntry::ArgType_Path;
+ case 33: // ldap server
+ return QGpgME::CryptoConfigEntry::ArgType_LDAPURL;
+ default:
+ ok = false;
+ return QGpgME::CryptoConfigEntry::ArgType_None;
+ }
+}
+
+QGpgMENewCryptoConfigEntry::QGpgMENewCryptoConfigEntry(const std::shared_ptr<QGpgMENewCryptoConfigGroup> &group, const Option &option)
+ : m_group(group), m_option(option)
+{
+}
+
+#if 0
+QVariant QGpgMENewCryptoConfigEntry::stringToValue(const QString &str, bool unescape) const
+{
+ const bool isString = isStringType();
+
+ if (isList()) {
+ if (argType() == ArgType_None) {
+ bool ok = true;
+ const QVariant v = str.isEmpty() ? 0U : str.toUInt(&ok);
+ if (!ok) {
+ qCWarning(GPGPME_BACKEND_LOG) << "list-of-none should have an unsigned int as value:" << str;
+ }
+ return v;
+ }
+ QList<QVariant> lst;
+ QStringList items = str.split(',', QString::SkipEmptyParts);
+ for (QStringList::const_iterator valit = items.constBegin(); valit != items.constEnd(); ++valit) {
+ QString val = *valit;
+ if (isString) {
+ if (val.isEmpty()) {
+ lst << QVariant(QString());
+ continue;
+ } else if (unescape) {
+ if (val[0] != '"') { // see README.gpgconf
+ qCWarning(GPGPME_BACKEND_LOG) << "String value should start with '\"' :" << val;
+ }
+ val = val.mid(1);
+ }
+ }
+ lst << QVariant(unescape ? gpgconf_unescape(val) : val);
+ }
+ return lst;
+ } else { // not a list
+ QString val(str);
+ if (isString) {
+ if (val.isEmpty()) {
+ return QVariant(QString()); // not set [ok with lists too?]
+ } else if (unescape) {
+ if (val[0] != '"') { // see README.gpgconf
+ qCWarning(GPGPME_BACKEND_LOG) << "String value should start with '\"' :" << val;
+ }
+ val = val.mid(1);
+ }
+ }
+ return QVariant(unescape ? gpgconf_unescape(val) : val);
+ }
+}
+#endif
+
+QGpgMENewCryptoConfigEntry::~QGpgMENewCryptoConfigEntry()
+{
+#ifndef NDEBUG
+ if (!s_duringClear && m_option.dirty())
+ qCWarning(GPGPME_BACKEND_LOG) << "Deleting a QGpgMENewCryptoConfigEntry that was modified (" << m_option.description() << ")"
+ << "You forgot to call sync() (to commit) or clear() (to discard)";
+#endif
+}
+
+QString QGpgMENewCryptoConfigEntry::name() const
+{
+ return QString::fromUtf8(m_option.name());
+}
+
+QString QGpgMENewCryptoConfigEntry::description() const
+{
+ return QString::fromUtf8(m_option.description());
+}
+
+QString QGpgMENewCryptoConfigEntry::path() const
+{
+ if (const std::shared_ptr<QGpgMENewCryptoConfigGroup> g = m_group.lock()) {
+ return g->path() + QLatin1Char('/') + name();
+ } else {
+ return QString();
+ }
+}
+
+bool QGpgMENewCryptoConfigEntry::isOptional() const
+{
+ return m_option.flags() & Optional;
+}
+
+bool QGpgMENewCryptoConfigEntry::isReadOnly() const
+{
+ return m_option.flags() & NoChange;
+}
+
+bool QGpgMENewCryptoConfigEntry::isList() const
+{
+ return m_option.flags() & List;
+}
+
+bool QGpgMENewCryptoConfigEntry::isRuntime() const
+{
+ return m_option.flags() & Runtime;
+}
+
+CryptoConfigEntry::Level QGpgMENewCryptoConfigEntry::level() const
+{
+ // two casts to make SunCC happy:
+ return static_cast<Level>(static_cast<unsigned int>(m_option.level()));
+}
+
+CryptoConfigEntry::ArgType QGpgMENewCryptoConfigEntry::argType() const
+{
+ bool ok = false;
+ const ArgType type = knownArgType(m_option.type(), ok);
+ if (ok) {
+ return type;
+ } else {
+ return knownArgType(m_option.alternateType(), ok);
+ }
+}
+
+bool QGpgMENewCryptoConfigEntry::isSet() const
+{
+ return m_option.set();
+}
+
+bool QGpgMENewCryptoConfigEntry::boolValue() const
+{
+ Q_ASSERT(m_option.alternateType() == NoType);
+ Q_ASSERT(!isList());
+ return m_option.currentValue().boolValue();
+}
+
+QString QGpgMENewCryptoConfigEntry::stringValue() const
+{
+ //return toString( false );
+ Q_ASSERT(m_option.alternateType() == StringType);
+ Q_ASSERT(!isList());
+ return QString::fromUtf8(m_option.currentValue().stringValue());
+}
+
+int QGpgMENewCryptoConfigEntry::intValue() const
+{
+ Q_ASSERT(m_option.alternateType() == IntegerType);
+ Q_ASSERT(!isList());
+ return m_option.currentValue().intValue();
+}
+
+unsigned int QGpgMENewCryptoConfigEntry::uintValue() const
+{
+ Q_ASSERT(m_option.alternateType() == UnsignedIntegerType);
+ Q_ASSERT(!isList());
+ return m_option.currentValue().uintValue();
+}
+
+static QUrl parseURL(int mRealArgType, const QString &str)
+{
+ if (mRealArgType == 33) { // LDAP server
+ // The format is HOSTNAME:PORT:USERNAME:PASSWORD:BASE_DN
+ QStringList items = str.split(QLatin1Char(':'));
+ if (items.count() == 5) {
+ QStringList::const_iterator it = items.constBegin();
+ QUrl url;
+ url.setScheme(QStringLiteral("ldap"));
+ url.setHost(urlpart_decode(*it++));
+
+ bool ok;
+ const int port = (*it++).toInt(&ok);
+ if (ok) {
+ url.setPort(port);
+ } else if (!it->isEmpty()) {
+ qCWarning(GPGPME_BACKEND_LOG) << "parseURL: malformed LDAP server port, ignoring: \"" << *it << "\"";
+ }
+
+ const QString userName = urlpart_decode(*it++);
+ if (!userName.isEmpty()) {
+ url.setUserName(userName);
+ }
+ const QString passWord = urlpart_decode(*it++);
+ if (!passWord.isEmpty()) {
+ url.setPassword(passWord);
+ }
+ url.setQuery(urlpart_decode(*it));
+ return url;
+ } else {
+ qCWarning(GPGPME_BACKEND_LOG) << "parseURL: malformed LDAP server:" << str;
+ }
+ }
+ // other URLs : assume wellformed URL syntax.
+ return QUrl(str);
+}
+
+// The opposite of parseURL
+static QString splitURL(int mRealArgType, const QUrl &url)
+{
+ if (mRealArgType == 33) { // LDAP server
+ // The format is HOSTNAME:PORT:USERNAME:PASSWORD:BASE_DN
+ Q_ASSERT(url.scheme() == QLatin1String("ldap"));
+ return urlpart_encode(url.host()) + QLatin1Char(':') +
+ (url.port() != -1 ? QString::number(url.port()) : QString()) + QLatin1Char(':') + // -1 is used for default ports, omit
+ urlpart_encode(url.userName()) + QLatin1Char(':') +
+ urlpart_encode(url.password()) + QLatin1Char(':') +
+ urlpart_encode(url.query());
+ }
+ return url.path();
+}
+
+QUrl QGpgMENewCryptoConfigEntry::urlValue() const
+{
+ const Type type = m_option.type();
+ Q_ASSERT(type == FilenameType || type == LdapServerType);
+ Q_ASSERT(!isList());
+ if (type == FilenameType) {
+ QUrl url;
+ url.setPath(QFile::decodeName(m_option.currentValue().stringValue()));
+ return url;
+ }
+ return parseURL(type, stringValue());
+}
+
+unsigned int QGpgMENewCryptoConfigEntry::numberOfTimesSet() const
+{
+ Q_ASSERT(m_option.alternateType() == NoType);
+ Q_ASSERT(isList());
+ return m_option.currentValue().uintValue();
+}
+
+std::vector<int> QGpgMENewCryptoConfigEntry::intValueList() const
+{
+ Q_ASSERT(m_option.alternateType() == IntegerType);
+ Q_ASSERT(isList());
+ return m_option.currentValue().intValues();
+}
+
+std::vector<unsigned int> QGpgMENewCryptoConfigEntry::uintValueList() const
+{
+ Q_ASSERT(m_option.alternateType() == UnsignedIntegerType);
+ Q_ASSERT(isList());
+ return m_option.currentValue().uintValues();
+}
+
+QList<QUrl> QGpgMENewCryptoConfigEntry::urlValueList() const
+{
+ const Type type = m_option.type();
+ Q_ASSERT(type == FilenameType || type == LdapServerType);
+ Q_ASSERT(isList());
+ const Argument arg = m_option.currentValue();
+ const std::vector<const char *> values = arg.stringValues();
+ QList<QUrl> ret;
+ Q_FOREACH(const char *value, values)
+ if (type == FilenameType) {
+ QUrl url;
+ url.setPath(QFile::decodeName(value));
+ ret << url;
+ } else {
+ ret << parseURL(type, QString::fromUtf8(value));
+ }
+ return ret;
+}
+
+void QGpgMENewCryptoConfigEntry::resetToDefault()
+{
+ m_option.resetToDefaultValue();
+}
+
+void QGpgMENewCryptoConfigEntry::setBoolValue(bool b)
+{
+ Q_ASSERT(m_option.alternateType() == NoType);
+ Q_ASSERT(!isList());
+ // A "no arg" option is either set or not set.
+ // Being set means createNoneArgument(), being unset means resetToDefault()
+ m_option.setNewValue(m_option.createNoneArgument(b));
+}
+
+void QGpgMENewCryptoConfigEntry::setStringValue(const QString &str)
+{
+ Q_ASSERT(m_option.alternateType() == StringType);
+ Q_ASSERT(!isList());
+ const Type type = m_option.type();
+ // When setting a string to empty (and there's no default), we need to act like resetToDefault
+ // Otherwise we try e.g. "ocsp-responder:0:" and gpgconf answers:
+ // "gpgconf: argument required for option ocsp-responder"
+ if (str.isEmpty() && !isOptional()) {
+ m_option.resetToDefaultValue();
+ } else if (type == FilenameType) {
+ m_option.setNewValue(m_option.createStringArgument(QFile::encodeName(str).constData()));
+ } else {
+ m_option.setNewValue(m_option.createStringArgument(str.toUtf8().constData()));
+ }
+}
+
+void QGpgMENewCryptoConfigEntry::setIntValue(int i)
+{
+ Q_ASSERT(m_option.alternateType() == IntegerType);
+ Q_ASSERT(!isList());
+ m_option.setNewValue(m_option.createIntArgument(i));
+}
+
+void QGpgMENewCryptoConfigEntry::setUIntValue(unsigned int i)
+{
+ Q_ASSERT(m_option.alternateType() == UnsignedIntegerType);
+ Q_ASSERT(!isList());
+ m_option.setNewValue(m_option.createUIntArgument(i));
+}
+
+void QGpgMENewCryptoConfigEntry::setURLValue(const QUrl &url)
+{
+ const Type type = m_option.type();
+ Q_ASSERT(type == FilenameType || type == LdapServerType);
+ Q_ASSERT(!isList());
+ const QString str = splitURL(type, url);
+ // cf. setStringValue()
+ if (str.isEmpty() && !isOptional()) {
+ m_option.resetToDefaultValue();
+ } else if (type == FilenameType) {
+ m_option.setNewValue(m_option.createStringArgument(QFile::encodeName(str).constData()));
+ } else {
+ m_option.setNewValue(m_option.createStringArgument(str.toUtf8().constData()));
+ }
+}
+
+void QGpgMENewCryptoConfigEntry::setNumberOfTimesSet(unsigned int i)
+{
+ Q_ASSERT(m_option.alternateType() == NoType);
+ Q_ASSERT(isList());
+ m_option.setNewValue(m_option.createNoneListArgument(i));
+}
+
+void QGpgMENewCryptoConfigEntry::setIntValueList(const std::vector<int> &lst)
+{
+ Q_ASSERT(m_option.alternateType() == IntegerType);
+ Q_ASSERT(isList());
+ m_option.setNewValue(m_option.createIntListArgument(lst));
+}
+
+void QGpgMENewCryptoConfigEntry::setUIntValueList(const std::vector<unsigned int> &lst)
+{
+ Q_ASSERT(m_option.alternateType() == UnsignedIntegerType);
+ Q_ASSERT(isList());
+ m_option.setNewValue(m_option.createUIntListArgument(lst));
+}
+
+void QGpgMENewCryptoConfigEntry::setURLValueList(const QList<QUrl> &urls)
+{
+ const Type type = m_option.type();
+ Q_ASSERT(m_option.alternateType() == StringType);
+ Q_ASSERT(isList());
+ std::vector<std::string> values;
+ values.reserve(urls.size());
+ Q_FOREACH (const QUrl &url, urls)
+ if (type == FilenameType) {
+ values.push_back(QFile::encodeName(url.path()).constData());
+ } else {
+ values.push_back(splitURL(type, url).toUtf8().constData());
+ }
+ m_option.setNewValue(m_option.createStringListArgument(values));
+}
+
+bool QGpgMENewCryptoConfigEntry::isDirty() const
+{
+ return m_option.dirty();
+}
+
+#if 0
+QString QGpgMENewCryptoConfigEntry::toString(bool escape) const
+{
+ // Basically the opposite of stringToValue
+ if (isStringType()) {
+ if (mValue.isNull()) {
+ return QString();
+ } else if (isList()) { // string list
+ QStringList lst = mValue.toStringList();
+ if (escape) {
+ for (QStringList::iterator it = lst.begin(); it != lst.end(); ++it) {
+ if (!(*it).isNull()) {
+ *it = gpgconf_escape(*it).prepend("\"");
+ }
+ }
+ }
+ QString res = lst.join(",");
+ //qCDebug(GPGPME_BACKEND_LOG) <<"toString:" << res;
+ return res;
+ } else { // normal string
+ QString res = mValue.toString();
+ if (escape) {
+ res = gpgconf_escape(res).prepend("\"");
+ }
+ return res;
+ }
+ }
+ if (!isList()) { // non-list non-string
+ if (mArgType == ArgType_None) {
+ return mValue.toBool() ? QString::fromLatin1("1") : QString();
+ } else { // some int
+ Q_ASSERT(mArgType == ArgType_Int || mArgType == ArgType_UInt);
+ return mValue.toString(); // int to string conversion
+ }
+ }
+
+ // Lists (of other types than strings)
+ if (mArgType == ArgType_None) {
+ return QString::number(numberOfTimesSet());
+ }
+ QStringList ret;
+ QList<QVariant> lst = mValue.toList();
+ for (QList<QVariant>::const_iterator it = lst.constBegin(); it != lst.constEnd(); ++it) {
+ ret << (*it).toString(); // QVariant does the conversion
+ }
+ return ret.join(",");
+}
+
+QString QGpgMENewCryptoConfigEntry::outputString() const
+{
+ Q_ASSERT(mSet);
+ return toString(true);
+}
+
+bool QGpgMENewCryptoConfigEntry::isStringType() const
+{
+ return (mArgType == QGpgME::NewCryptoConfigEntry::ArgType_String
+ || mArgType == QGpgME::NewCryptoConfigEntry::ArgType_Path
+ || mArgType == QGpgME::NewCryptoConfigEntry::ArgType_URL
+ || mArgType == QGpgME::NewCryptoConfigEntry::ArgType_LDAPURL);
+}
+
+void QGpgMENewCryptoConfigEntry::setDirty(bool b)
+{
+ mDirty = b;
+}
+#endif
diff --git a/lang/qt/src/qgpgmenewcryptoconfig.h b/lang/qt/src/qgpgmenewcryptoconfig.h
new file mode 100644
index 0000000..81b4cb4
--- /dev/null
+++ b/lang/qt/src/qgpgmenewcryptoconfig.h
@@ -0,0 +1,189 @@
+/*
+ qgpgmenewcryptoconfig.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2010 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef QGPGME_QGPGMENEWCRYPTOCONFIG_H
+#define QGPGME_QGPGMENEWCRYPTOCONFIG_H
+
+#include "qgpgme_export.h"
+#include "cryptoconfig.h"
+
+#include <QHash>
+#include <QStringList>
+#include <QVariant>
+
+#ifdef BUILDING_QGPGME
+# include "configuration.h"
+#else
+# include <gpgme++/configuration.h>
+#endif
+
+
+#include <vector>
+#include <utility>
+
+class QGpgMENewCryptoConfig;
+class QGpgMENewCryptoConfigComponent;
+class QGpgMENewCryptoConfigGroup;
+class QGpgMENewCryptoConfigEntry;
+
+class QGpgMENewCryptoConfigEntry : public QGpgME::CryptoConfigEntry
+{
+public:
+ QGpgMENewCryptoConfigEntry(const std::shared_ptr<QGpgMENewCryptoConfigGroup> &group, const GpgME::Configuration::Option &option);
+ ~QGpgMENewCryptoConfigEntry();
+
+ QString name() const Q_DECL_OVERRIDE;
+ QString description() const Q_DECL_OVERRIDE;
+ QString path() const Q_DECL_OVERRIDE;
+ bool isOptional() const Q_DECL_OVERRIDE;
+ bool isReadOnly() const Q_DECL_OVERRIDE;
+ bool isList() const Q_DECL_OVERRIDE;
+ bool isRuntime() const Q_DECL_OVERRIDE;
+ Level level() const Q_DECL_OVERRIDE;
+ ArgType argType() const Q_DECL_OVERRIDE;
+ bool isSet() const Q_DECL_OVERRIDE;
+ bool boolValue() const Q_DECL_OVERRIDE;
+ QString stringValue() const Q_DECL_OVERRIDE;
+ int intValue() const Q_DECL_OVERRIDE;
+ unsigned int uintValue() const Q_DECL_OVERRIDE;
+ QUrl urlValue() const Q_DECL_OVERRIDE;
+ unsigned int numberOfTimesSet() const Q_DECL_OVERRIDE;
+ std::vector<int> intValueList() const Q_DECL_OVERRIDE;
+ std::vector<unsigned int> uintValueList() const Q_DECL_OVERRIDE;
+ QList<QUrl> urlValueList() const Q_DECL_OVERRIDE;
+ void resetToDefault() Q_DECL_OVERRIDE;
+ void setBoolValue(bool) Q_DECL_OVERRIDE;
+ void setStringValue(const QString &) Q_DECL_OVERRIDE;
+ void setIntValue(int) Q_DECL_OVERRIDE;
+ void setUIntValue(unsigned int) Q_DECL_OVERRIDE;
+ void setURLValue(const QUrl &) Q_DECL_OVERRIDE;
+ void setNumberOfTimesSet(unsigned int) Q_DECL_OVERRIDE;
+ void setIntValueList(const std::vector<int> &) Q_DECL_OVERRIDE;
+ void setUIntValueList(const std::vector<unsigned int> &) Q_DECL_OVERRIDE;
+ void setURLValueList(const QList<QUrl> &) Q_DECL_OVERRIDE;
+ bool isDirty() const Q_DECL_OVERRIDE;
+
+#if 0
+ void setDirty(bool b);
+ QString outputString() const;
+
+protected:
+ bool isStringType() const;
+ QVariant stringToValue(const QString &value, bool unescape) const;
+ QString toString(bool escape) const;
+#endif
+private:
+ std::weak_ptr<QGpgMENewCryptoConfigGroup> m_group;
+ GpgME::Configuration::Option m_option;
+};
+
+class QGpgMENewCryptoConfigGroup : public QGpgME::CryptoConfigGroup
+{
+public:
+ QGpgMENewCryptoConfigGroup(const std::shared_ptr<QGpgMENewCryptoConfigComponent> &parent, const GpgME::Configuration::Option &option);
+ ~QGpgMENewCryptoConfigGroup();
+
+ QString name() const Q_DECL_OVERRIDE;
+ QString iconName() const Q_DECL_OVERRIDE
+ {
+ return QString();
+ }
+ QString description() const Q_DECL_OVERRIDE;
+ QString path() const Q_DECL_OVERRIDE;
+ QGpgME::CryptoConfigEntry::Level level() const Q_DECL_OVERRIDE;
+ QStringList entryList() const Q_DECL_OVERRIDE;
+ QGpgMENewCryptoConfigEntry *entry(const QString &name) const Q_DECL_OVERRIDE;
+
+private:
+ friend class QGpgMENewCryptoConfigComponent; // it adds the entries
+ std::weak_ptr<QGpgMENewCryptoConfigComponent> m_component;
+ GpgME::Configuration::Option m_option;
+ QStringList m_entryNames;
+ QHash< QString, std::shared_ptr<QGpgMENewCryptoConfigEntry> > m_entriesByName;
+};
+
+/// For docu, see kleo/cryptoconfig.h
+class QGpgMENewCryptoConfigComponent : public QGpgME::CryptoConfigComponent, public std::enable_shared_from_this<QGpgMENewCryptoConfigComponent>
+{
+public:
+ QGpgMENewCryptoConfigComponent();
+ ~QGpgMENewCryptoConfigComponent();
+
+ void setComponent(const GpgME::Configuration::Component &component);
+
+ QString name() const Q_DECL_OVERRIDE;
+ QString iconName() const Q_DECL_OVERRIDE
+ {
+ return name();
+ }
+ QString description() const Q_DECL_OVERRIDE;
+ QStringList groupList() const Q_DECL_OVERRIDE;
+ QGpgMENewCryptoConfigGroup *group(const QString &name) const Q_DECL_OVERRIDE;
+
+ void sync(bool runtime);
+
+private:
+ GpgME::Configuration::Component m_component;
+ QHash< QString, std::shared_ptr<QGpgMENewCryptoConfigGroup> > m_groupsByName;
+};
+
+/**
+ * CryptoConfig implementation around the gpgconf command-line tool
+ * For method docu, see kleo/cryptoconfig.h
+ */
+class QGPGME_EXPORT QGpgMENewCryptoConfig : public QGpgME::CryptoConfig
+{
+public:
+ /**
+ * Constructor
+ */
+ QGpgMENewCryptoConfig();
+ ~QGpgMENewCryptoConfig();
+
+ QStringList componentList() const Q_DECL_OVERRIDE;
+
+ QGpgMENewCryptoConfigComponent *component(const QString &name) const Q_DECL_OVERRIDE;
+
+ void clear() Q_DECL_OVERRIDE;
+ void sync(bool runtime) Q_DECL_OVERRIDE;
+
+private:
+ /// @param showErrors if true, a messagebox will be shown if e.g. gpgconf wasn't found
+ void reloadConfiguration(bool showErrors);
+
+private:
+ QHash< QString, std::shared_ptr<QGpgMENewCryptoConfigComponent> > m_componentsByName;
+ bool m_parsed;
+};
+
+#endif /* QGPGME_QGPGMENEWCRYPTOCONFIG_H */
diff --git a/lang/qt/src/qgpgmerefreshkeysjob.cpp b/lang/qt/src/qgpgmerefreshkeysjob.cpp
new file mode 100644
index 0000000..3d221f6
--- /dev/null
+++ b/lang/qt/src/qgpgmerefreshkeysjob.cpp
@@ -0,0 +1,225 @@
+/*
+ qgpgmerefreshkeysjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klar�vdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#define MAX_CMD_LENGTH 32768
+
+#include "qgpgmerefreshkeysjob.h"
+
+#include <QDebug>
+#include "gpgme_backend_debug.h"
+
+#include "context.h"
+
+#include <QByteArray>
+#include <QStringList>
+
+#include <gpg-error.h>
+
+#include <assert.h>
+
+QGpgME::QGpgMERefreshKeysJob::QGpgMERefreshKeysJob()
+ : RefreshKeysJob(0),
+ mProcess(0),
+ mError(0)
+{
+
+}
+
+QGpgME::QGpgMERefreshKeysJob::~QGpgMERefreshKeysJob()
+{
+
+}
+
+GpgME::Error QGpgME::QGpgMERefreshKeysJob::start(const QStringList &patterns)
+{
+ assert(mPatternsToDo.empty());
+
+ mPatternsToDo = patterns;
+ if (mPatternsToDo.empty()) {
+ mPatternsToDo.push_back(QStringLiteral(" ")); // empty list means all -> mae
+ }
+ // sure to fail the first
+ // startAProcess() guard clause
+
+ return startAProcess();
+}
+
+#if MAX_CMD_LENGTH < 65 + 128
+#error MAX_CMD_LENGTH is too low
+#endif
+
+GpgME::Error QGpgME::QGpgMERefreshKeysJob::startAProcess()
+{
+ if (mPatternsToDo.empty()) {
+ return GpgME::Error();
+ }
+ // create and start gpgsm process:
+ mProcess = new QProcess(this);
+ mProcess->setObjectName(QStringLiteral("gpgsm -k --with-validation --force-crl-refresh --enable-crl-checks"));
+
+ // FIXME: obbtain the path to gpgsm from gpgme, so we use the same instance.
+ mProcess->setProgram(QStringLiteral("gpgsm"));
+ QStringList arguments;
+ arguments << QStringLiteral("-k")
+ << QStringLiteral("--with-validation")
+ << QStringLiteral("--force-crl-refresh")
+ << QStringLiteral("--enable-crl-checks");
+ unsigned int commandLineLength = MAX_CMD_LENGTH;
+ commandLineLength -=
+ strlen("gpgsm") + 1 + strlen("-k") + 1 +
+ strlen("--with-validation") + 1 + strlen("--force-crl-refresh") + 1 +
+ strlen("--enable-crl-checks") + 1;
+ while (!mPatternsToDo.empty()) {
+ const QByteArray pat = mPatternsToDo.front().toUtf8().trimmed();
+ const unsigned int patLength = pat.length();
+ if (patLength >= commandLineLength) {
+ break;
+ }
+ mPatternsToDo.pop_front();
+ if (pat.isEmpty()) {
+ continue;
+ }
+ arguments << QLatin1String(pat);
+ commandLineLength -= patLength + 1;
+ }
+
+ mProcess->setArguments(arguments);
+
+ connect(mProcess, SIGNAL(finished(int,QProcess::ExitStatus)),
+ SLOT(slotProcessExited(int,QProcess::ExitStatus)));
+ connect(mProcess, SIGNAL(readyReadStandardOutput()),
+ SLOT(slotStdout()));
+ connect(mProcess, &QProcess::readyReadStandardError,
+ this, &QGpgMERefreshKeysJob::slotStderr);
+
+ mProcess->start();
+ if (!mProcess->waitForStarted()) {
+ mError = GpgME::Error::fromCode(GPG_ERR_ENOENT, GPG_ERR_SOURCE_GPGSM); // what else?
+ deleteLater();
+ return mError;
+ } else {
+ return GpgME::Error();
+ }
+}
+
+void QGpgME::QGpgMERefreshKeysJob::slotCancel()
+{
+ if (mProcess) {
+ mProcess->kill();
+ }
+ mProcess = 0;
+ mError = GpgME::Error::fromCode(GPG_ERR_CANCELED, GPG_ERR_SOURCE_GPGSM);
+}
+
+void QGpgME::QGpgMERefreshKeysJob::slotStatus(QProcess *proc, const QString &type, const QStringList &args)
+{
+ if (proc != mProcess) {
+ return;
+ }
+ QStringList::const_iterator it = args.begin();
+ bool ok = false;
+
+ if (type == QLatin1String("ERROR")) {
+
+ if (args.size() < 2) {
+ qCDebug(GPGPME_BACKEND_LOG) << "not recognising ERROR with < 2 args!";
+ return;
+ }
+ const int source = (*++it).toInt(&ok);
+ if (!ok) {
+ qCDebug(GPGPME_BACKEND_LOG) << "expected number for first ERROR arg, got something else";
+ return;
+ }
+ ok = false;
+ const int code = (*++it).toInt(&ok);
+ if (!ok) {
+ qCDebug(GPGPME_BACKEND_LOG) << "expected number for second ERROR arg, got something else";
+ return;
+ }
+ mError = GpgME::Error::fromCode(code, source);
+
+ } else if (type == QLatin1String("PROGRESS")) {
+
+ if (args.size() < 4) {
+ qCDebug(GPGPME_BACKEND_LOG) << "not recognising PROGRESS with < 4 args!";
+ return;
+ }
+ const QString what = *++it;
+ ok = false;
+ (*++it).toInt(&ok);
+ if (!ok) {
+ qCDebug(GPGPME_BACKEND_LOG) << "expected number for \"type\", got something else";
+ return;
+ }
+ ok = false;
+ const int cur = (*++it).toInt(&ok);
+ if (!ok) {
+ qCDebug(GPGPME_BACKEND_LOG) << "expected number for \"cur\", got something else";
+ return;
+ }
+ ok = false;
+ const int total = (*++it).toInt(&ok);
+ if (!ok) {
+ qCDebug(GPGPME_BACKEND_LOG) << "expected number for \"total\", got something else";
+ return;
+ }
+ // TODO port
+ Q_EMIT progress(QString(), cur, total);
+
+ }
+}
+
+void QGpgME::QGpgMERefreshKeysJob::slotStderr()
+{
+ // implement? or not?
+}
+
+void QGpgME::QGpgMERefreshKeysJob::slotProcessExited(int exitCode, QProcess::ExitStatus exitStatus)
+{
+ if (!mError && !mPatternsToDo.empty()) {
+ if (const GpgME::Error err = startAProcess()) {
+ mError = err;
+ } else {
+ return;
+ }
+ }
+
+ Q_EMIT done();
+ if (!mError &&
+ (exitStatus != QProcess::NormalExit || exitCode != 0)) {
+ mError = GpgME::Error::fromCode(GPG_ERR_GENERAL, GPG_ERR_SOURCE_GPGSM);
+ }
+ Q_EMIT result(mError);
+ deleteLater();
+}
+#include "qgpgmerefreshkeysjob.moc"
diff --git a/lang/qt/src/qgpgmerefreshkeysjob.h b/lang/qt/src/qgpgmerefreshkeysjob.h
new file mode 100644
index 0000000..2a54e38
--- /dev/null
+++ b/lang/qt/src/qgpgmerefreshkeysjob.h
@@ -0,0 +1,79 @@
+/*
+ qgpgmerefreshkeysjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMEREFRESHKEYSJOB_H__
+#define __QGPGME_QGPGMEREFRESHKEYSJOB_H__
+
+#include "refreshkeysjob.h"
+#ifdef BUILDING_QGPGME
+# include "context.h"
+#else
+#include "gpgme++/context.h"
+#endif
+
+#include <QStringList>
+#include <QProcess>
+
+namespace QGpgME
+{
+
+class QGpgMERefreshKeysJob : public RefreshKeysJob
+{
+ Q_OBJECT
+public:
+ QGpgMERefreshKeysJob();
+ ~QGpgMERefreshKeysJob();
+
+ /* from RefreshKeysJob */
+ GpgME::Error start(const QStringList &patterns) Q_DECL_OVERRIDE;
+
+private Q_SLOTS:
+ /* from Job */
+ void slotCancel() Q_DECL_OVERRIDE;
+
+ void slotStatus(QProcess *, const QString &, const QStringList &);
+ void slotStderr();
+ void slotProcessExited(int exitCode, QProcess::ExitStatus exitStatus);
+
+private:
+ GpgME::Error startAProcess();
+
+private:
+ QProcess *mProcess;
+ GpgME::Error mError;
+ QStringList mPatternsToDo;
+};
+
+}
+
+#endif // __QGPGME_QGPGMEREFRESHKEYSJOB_H__
diff --git a/lang/qt/src/qgpgmesecretkeyexportjob.cpp b/lang/qt/src/qgpgmesecretkeyexportjob.cpp
new file mode 100644
index 0000000..f4ec698
--- /dev/null
+++ b/lang/qt/src/qgpgmesecretkeyexportjob.cpp
@@ -0,0 +1,142 @@
+/*
+ qgpgmesecretexportjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klar�vdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmesecretkeyexportjob.h"
+
+#include <QDebug>
+#include "gpgme_backend_debug.h"
+
+#include "context.h"
+#include "data.h"
+
+#include <QStringList>
+
+#include <gpg-error.h>
+
+#include <string.h>
+#include <assert.h>
+
+QGpgME::QGpgMESecretKeyExportJob::QGpgMESecretKeyExportJob(bool armour, const QString &charset)
+ : ExportJob(0),
+ mProcess(0),
+ mError(0),
+ mArmour(armour),
+ mCharset(charset)
+{
+
+}
+
+QGpgME::QGpgMESecretKeyExportJob::~QGpgMESecretKeyExportJob()
+{
+
+}
+
+GpgME::Error QGpgME::QGpgMESecretKeyExportJob::start(const QStringList &patterns)
+{
+ assert(mKeyData.isEmpty());
+
+ if (patterns.size() != 1 || patterns.front().isEmpty()) {
+ deleteLater();
+ return mError = GpgME::Error::fromCode(GPG_ERR_INV_VALUE, GPG_ERR_SOURCE_GPGSM);
+ }
+
+ // create and start gpgsm process:
+ mProcess = new QProcess(this);
+ mProcess->setObjectName(QStringLiteral("gpgsm --export-secret-key-p12"));
+
+ // FIXME: obtain the path to gpgsm from gpgme, so we use the same instance.
+ mProcess->setProgram("gpgsm");
+ QStringList arguments;
+ arguments << QStringLiteral("--export-secret-key-p12");
+ if (mArmour) {
+ arguments << QStringLiteral("--armor");
+ }
+ if (!mCharset.isEmpty()) {
+ arguments << QStringLiteral("--p12-charset") << mCharset;
+ }
+ arguments << QLatin1String(patterns.front().toUtf8());
+
+ mProcess->setArguments(arguments);
+ connect(mProcess, SIGNAL(finished(int,QProcess::ExitStatus)),
+ SLOT(slotProcessExited(int,QProcess::ExitStatus)));
+ connect(mProcess, &QProcess::readyReadStandardOutput,
+ this, &QGpgMESecretKeyExportJob::slotStdout);
+ connect(mProcess, &QProcess::readyReadStandardError,
+ this, &QGpgMESecretKeyExportJob::slotStderr);
+
+ mProcess->start();
+ if (!mProcess->waitForStarted()) {
+ mError = GpgME::Error::fromCode(GPG_ERR_ENOENT, GPG_ERR_SOURCE_GPGSM); // what else?
+ deleteLater();
+ return mError;
+ } else {
+ return GpgME::Error();
+ }
+}
+
+void QGpgME::QGpgMESecretKeyExportJob::slotCancel()
+{
+ if (mProcess) {
+ mProcess->kill();
+ }
+ mProcess = 0;
+ mError = GpgME::Error::fromCode(GPG_ERR_CANCELED, GPG_ERR_SOURCE_GPGSM);
+}
+
+void QGpgME::QGpgMESecretKeyExportJob::slotStdout()
+{
+ QString line = QString::fromLocal8Bit(mProcess->readLine());
+ if (!line.isEmpty()) {
+ return;
+ }
+ const unsigned int oldlen = mKeyData.size();
+ mKeyData.resize(oldlen + line.length());
+ memcpy(mKeyData.data() + oldlen, line.toLatin1(), line.length());
+}
+
+void QGpgME::QGpgMESecretKeyExportJob::slotStderr()
+{
+ // implement? or not?
+}
+
+void QGpgME::QGpgMESecretKeyExportJob::slotProcessExited(int exitCode, QProcess::ExitStatus exitStatus)
+{
+ Q_EMIT done();
+ if (!mError &&
+ (exitStatus != QProcess::NormalExit || exitCode != 0)) {
+ mError = GpgME::Error::fromCode(GPG_ERR_GENERAL, GPG_ERR_SOURCE_GPGSM);
+ }
+ Q_EMIT result(mError, mKeyData);
+ deleteLater();
+}
+#include "qgpgmesecretkeyexportjob.moc"
diff --git a/lang/qt/src/qgpgmesecretkeyexportjob.h b/lang/qt/src/qgpgmesecretkeyexportjob.h
new file mode 100644
index 0000000..ad53f99
--- /dev/null
+++ b/lang/qt/src/qgpgmesecretkeyexportjob.h
@@ -0,0 +1,81 @@
+/*
+ qgpgmesecretkeyexportjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMESECRETKEYEXPORTJOB_H__
+#define __QGPGME_QGPGMESECRETKEYEXPORTJOB_H__
+
+#include "exportjob.h"
+#ifdef BUILDING_QGPGME
+# include "context.h"
+#else
+#include "gpgme++/context.h"
+#endif
+#include <QProcess>
+
+namespace GpgME
+{
+class Data;
+}
+
+namespace QGpgME
+{
+
+class QGpgMESecretKeyExportJob : public ExportJob
+{
+ Q_OBJECT
+public:
+ QGpgMESecretKeyExportJob(bool armour, const QString &charset);
+ ~QGpgMESecretKeyExportJob();
+
+ /* from ExportJob */
+ GpgME::Error start(const QStringList &patterns) Q_DECL_OVERRIDE;
+
+private Q_SLOTS:
+ /* from Job */
+ void slotCancel() Q_DECL_OVERRIDE;
+
+ void slotStdout();
+ void slotStderr();
+ void slotProcessExited(int exitCode, QProcess::ExitStatus exitStatus);
+
+private:
+ QProcess *mProcess;
+ QByteArray mKeyData;
+ GpgME::Error mError;
+ bool mArmour;
+ QString mCharset;
+};
+
+}
+
+#endif // __QGPGME_QGPGMESECRETKEYEXPORTJOB_H__
diff --git a/lang/qt/src/qgpgmesignencryptjob.cpp b/lang/qt/src/qgpgmesignencryptjob.cpp
new file mode 100644
index 0000000..d2e45b1
--- /dev/null
+++ b/lang/qt/src/qgpgmesignencryptjob.cpp
@@ -0,0 +1,171 @@
+/*
+ qgpgmesignencryptjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004, 2007 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmesignencryptjob.h"
+
+#include "dataprovider.h"
+
+#include "context.h"
+#include "data.h"
+#include "key.h"
+#include "exception.h"
+
+#include <QBuffer>
+
+
+#include <cassert>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMESignEncryptJob::QGpgMESignEncryptJob(Context *context)
+ : mixin_type(context),
+ mOutputIsBase64Encoded(false)
+{
+ lateInitialization();
+}
+
+QGpgMESignEncryptJob::~QGpgMESignEncryptJob() {}
+
+void QGpgMESignEncryptJob::setOutputIsBase64Encoded(bool on)
+{
+ mOutputIsBase64Encoded = on;
+}
+
+static QGpgMESignEncryptJob::result_type sign_encrypt(Context *ctx, QThread *thread, const std::vector<Key> &signers,
+ const std::vector<Key> &recipients, const std::weak_ptr<QIODevice> &plainText_,
+ const std::weak_ptr<QIODevice> &cipherText_, const Context::EncryptionFlags eflags, bool outputIsBsse64Encoded)
+{
+ const std::shared_ptr<QIODevice> &plainText = plainText_.lock();
+ const std::shared_ptr<QIODevice> &cipherText = cipherText_.lock();
+
+ const _detail::ToThreadMover ctMover(cipherText, thread);
+ const _detail::ToThreadMover ptMover(plainText, thread);
+
+ QGpgME::QIODeviceDataProvider in(plainText);
+ const Data indata(&in);
+
+ ctx->clearSigningKeys();
+ Q_FOREACH (const Key &signer, signers)
+ if (!signer.isNull())
+ if (const Error err = ctx->addSigningKey(signer)) {
+ return std::make_tuple(SigningResult(err), EncryptionResult(), QByteArray(), QString(), Error());
+ }
+
+ if (!cipherText) {
+ QGpgME::QByteArrayDataProvider out;
+ Data outdata(&out);
+
+ if (outputIsBsse64Encoded) {
+ outdata.setEncoding(Data::Base64Encoding);
+ }
+
+ const std::pair<SigningResult, EncryptionResult> res = ctx->signAndEncrypt(recipients, indata, outdata, eflags);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(res.first, res.second, out.data(), log, ae);
+ } else {
+ QGpgME::QIODeviceDataProvider out(cipherText);
+ Data outdata(&out);
+
+ if (outputIsBsse64Encoded) {
+ outdata.setEncoding(Data::Base64Encoding);
+ }
+
+ const std::pair<SigningResult, EncryptionResult> res = ctx->signAndEncrypt(recipients, indata, outdata, eflags);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(res.first, res.second, QByteArray(), log, ae);
+ }
+
+}
+
+static QGpgMESignEncryptJob::result_type sign_encrypt_qba(Context *ctx, const std::vector<Key> &signers,
+ const std::vector<Key> &recipients, const QByteArray &plainText, const Context::EncryptionFlags eflags, bool outputIsBsse64Encoded)
+{
+ const std::shared_ptr<QBuffer> buffer(new QBuffer);
+ buffer->setData(plainText);
+ if (!buffer->open(QIODevice::ReadOnly)) {
+ assert(!"This should never happen: QBuffer::open() failed");
+ }
+ return sign_encrypt(ctx, 0, signers, recipients, buffer, std::shared_ptr<QIODevice>(), eflags, outputIsBsse64Encoded);
+}
+
+Error QGpgMESignEncryptJob::start(const std::vector<Key> &signers, const std::vector<Key> &recipients, const QByteArray &plainText, bool alwaysTrust)
+{
+ run(std::bind(&sign_encrypt_qba, std::placeholders::_1, signers, recipients, plainText, alwaysTrust ? Context::AlwaysTrust : Context::None, mOutputIsBase64Encoded));
+ return Error();
+}
+
+void QGpgMESignEncryptJob::start(const std::vector<Key> &signers, const std::vector<Key> &recipients,
+ const std::shared_ptr<QIODevice> &plainText, const std::shared_ptr<QIODevice> &cipherText, const Context::EncryptionFlags eflags)
+{
+ run(std::bind(&sign_encrypt, std::placeholders::_1, std::placeholders::_2, signers, recipients, std::placeholders::_3, std::placeholders::_4, eflags, mOutputIsBase64Encoded), plainText, cipherText);
+}
+
+void QGpgMESignEncryptJob::start(const std::vector<Key> &signers, const std::vector<Key> &recipients, const std::shared_ptr<QIODevice> &plainText, const std::shared_ptr<QIODevice> &cipherText, bool alwaysTrust)
+{
+ return start(signers, recipients, plainText, cipherText, alwaysTrust ? Context::AlwaysTrust : Context::None);
+}
+
+std::pair<SigningResult, EncryptionResult> QGpgMESignEncryptJob::exec(const std::vector<Key> &signers, const std::vector<Key> &recipients, const QByteArray &plainText, const Context::EncryptionFlags eflags, QByteArray &cipherText)
+{
+ const result_type r = sign_encrypt_qba(context(), signers, recipients, plainText, eflags, mOutputIsBase64Encoded);
+ cipherText = std::get<2>(r);
+ resultHook(r);
+ return mResult;
+}
+
+std::pair<SigningResult, EncryptionResult> QGpgMESignEncryptJob::exec(const std::vector<Key> &signers, const std::vector<Key> &recipients, const QByteArray &plainText, bool alwaysTrust, QByteArray &cipherText)
+{
+ return exec(signers, recipients, plainText, alwaysTrust ? Context::AlwaysTrust : Context::None, cipherText);
+}
+
+
+#if 0
+
+TODO port?
+void QGpgMESignEncryptJob::showErrorDialog(QWidget *parent, const QString &caption) const
+{
+ if ((mResult.first.error() && !mResult.first.error().isCanceled()) ||
+ (mResult.second.error() && !mResult.second.error().isCanceled())) {
+ MessageBox::error(parent, mResult.first, mResult.second, this, caption);
+ }
+}
+#endif
+
+void QGpgMESignEncryptJob::resultHook(const result_type &tuple)
+{
+ mResult = std::make_pair(std::get<0>(tuple), std::get<1>(tuple));
+}
+#include "qgpgmesignencryptjob.moc"
diff --git a/lang/qt/src/qgpgmesignencryptjob.h b/lang/qt/src/qgpgmesignencryptjob.h
new file mode 100644
index 0000000..e76c245
--- /dev/null
+++ b/lang/qt/src/qgpgmesignencryptjob.h
@@ -0,0 +1,121 @@
+/*
+ qgpgmesignencryptjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2007,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMESIGNENCRYPTJOB_H__
+#define __QGPGME_QGPGMESIGNENCRYPTJOB_H__
+
+#include "signencryptjob.h"
+
+#include "threadedjobmixin.h"
+
+#ifdef BUILDING_QGPGME
+# include "signingresult.h"
+#else
+#include <gpgme++/signingresult.h>
+#endif
+#ifdef BUILDING_QGPGME
+# include "encryptionresult.h"
+#else
+#include <gpgme++/encryptionresult.h>
+#endif
+#ifdef BUILDING_QGPGME
+# include "key.h"
+#else
+#include <gpgme++/key.h>
+#endif
+
+#include <utility>
+
+namespace QGpgME
+{
+
+class QGpgMESignEncryptJob
+#ifdef Q_MOC_RUN
+ : public SignEncryptJob
+#else
+ : public _detail::ThreadedJobMixin<SignEncryptJob, std::tuple<GpgME::SigningResult, GpgME::EncryptionResult, QByteArray, QString, GpgME::Error> >
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMESignEncryptJob(GpgME::Context *context);
+ ~QGpgMESignEncryptJob();
+
+ /* from SignEncryptJob */
+ GpgME::Error start(const std::vector<GpgME::Key> &signers,
+ const std::vector<GpgME::Key> &recipients,
+ const QByteArray &plainText, bool alwaysTrust) Q_DECL_OVERRIDE;
+
+ /* from SignEncryptJob */
+ void start(const std::vector<GpgME::Key> &signers,
+ const std::vector<GpgME::Key> &recipients,
+ const std::shared_ptr<QIODevice> &plainText,
+ const std::shared_ptr<QIODevice> &cipherText,
+ bool alwaysTrust) Q_DECL_OVERRIDE;
+
+ void start(const std::vector<GpgME::Key> &signers,
+ const std::vector<GpgME::Key> &recipients,
+ const std::shared_ptr<QIODevice> &plainText,
+ const std::shared_ptr<QIODevice> &cipherText,
+ const GpgME::Context::EncryptionFlags flags) Q_DECL_OVERRIDE;
+
+ std::pair<GpgME::SigningResult, GpgME::EncryptionResult>
+ exec(const std::vector<GpgME::Key> &signers,
+ const std::vector<GpgME::Key> &recipients,
+ const QByteArray &plainText, bool alwaysTrust,
+ QByteArray &cipherText) Q_DECL_OVERRIDE;
+
+ std::pair<GpgME::SigningResult, GpgME::EncryptionResult>
+ exec(const std::vector<GpgME::Key> &signers,
+ const std::vector<GpgME::Key> &recipients,
+ const QByteArray &plainText, const GpgME::Context::EncryptionFlags flags,
+ QByteArray &cipherText) Q_DECL_OVERRIDE;
+
+ /* from SignEncryptJob */
+ void setOutputIsBase64Encoded(bool on) Q_DECL_OVERRIDE;
+
+ /* from ThreadedJobMixin */
+ void resultHook(const result_type &r) Q_DECL_OVERRIDE;
+
+private:
+ bool mOutputIsBase64Encoded;
+ std::pair<GpgME::SigningResult, GpgME::EncryptionResult> mResult;
+};
+
+}
+
+#endif // __QGPGME_QGPGMESIGNENCRYPTJOB_H__
diff --git a/lang/qt/src/qgpgmesignjob.cpp b/lang/qt/src/qgpgmesignjob.cpp
new file mode 100644
index 0000000..4e2312b
--- /dev/null
+++ b/lang/qt/src/qgpgmesignjob.cpp
@@ -0,0 +1,163 @@
+/*
+ qgpgmesignjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2007,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmesignjob.h"
+
+#include "dataprovider.h"
+
+#include "context.h"
+#include "signingresult.h"
+#include "data.h"
+
+#include <QBuffer>
+
+
+#include <cassert>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMESignJob::QGpgMESignJob(Context *context)
+ : mixin_type(context),
+ mOutputIsBase64Encoded(false)
+{
+ lateInitialization();
+}
+
+QGpgMESignJob::~QGpgMESignJob() {}
+
+void QGpgMESignJob::setOutputIsBase64Encoded(bool on)
+{
+ mOutputIsBase64Encoded = on;
+}
+
+static QGpgMESignJob::result_type sign(Context *ctx, QThread *thread,
+ const std::vector<Key> &signers,
+ const std::weak_ptr<QIODevice> &plainText_,
+ const std::weak_ptr<QIODevice> &signature_,
+ SignatureMode mode,
+ bool outputIsBsse64Encoded)
+{
+
+ const std::shared_ptr<QIODevice> plainText = plainText_.lock();
+ const std::shared_ptr<QIODevice> signature = signature_.lock();
+
+ const _detail::ToThreadMover ptMover(plainText, thread);
+ const _detail::ToThreadMover sgMover(signature, thread);
+
+ QGpgME::QIODeviceDataProvider in(plainText);
+ const Data indata(&in);
+
+ ctx->clearSigningKeys();
+ Q_FOREACH (const Key &signer, signers)
+ if (!signer.isNull())
+ if (const Error err = ctx->addSigningKey(signer)) {
+ return std::make_tuple(SigningResult(err), QByteArray(), QString(), Error());
+ }
+
+ if (!signature) {
+ QGpgME::QByteArrayDataProvider out;
+ Data outdata(&out);
+
+ if (outputIsBsse64Encoded) {
+ outdata.setEncoding(Data::Base64Encoding);
+ }
+
+ const SigningResult res = ctx->sign(indata, outdata, mode);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(res, out.data(), log, ae);
+ } else {
+ QGpgME::QIODeviceDataProvider out(signature);
+ Data outdata(&out);
+
+ if (outputIsBsse64Encoded) {
+ outdata.setEncoding(Data::Base64Encoding);
+ }
+
+ const SigningResult res = ctx->sign(indata, outdata, mode);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(res, QByteArray(), log, ae);
+ }
+
+}
+
+static QGpgMESignJob::result_type sign_qba(Context *ctx,
+ const std::vector<Key> &signers,
+ const QByteArray &plainText,
+ SignatureMode mode,
+ bool outputIsBsse64Encoded)
+{
+ const std::shared_ptr<QBuffer> buffer(new QBuffer);
+ buffer->setData(plainText);
+ if (!buffer->open(QIODevice::ReadOnly)) {
+ assert(!"This should never happen: QBuffer::open() failed");
+ }
+ return sign(ctx, 0, signers, buffer, std::shared_ptr<QIODevice>(), mode, outputIsBsse64Encoded);
+}
+
+Error QGpgMESignJob::start(const std::vector<Key> &signers, const QByteArray &plainText, SignatureMode mode)
+{
+ run(std::bind(&sign_qba, std::placeholders::_1, signers, plainText, mode, mOutputIsBase64Encoded));
+ return Error();
+}
+
+void QGpgMESignJob::start(const std::vector<Key> &signers, const std::shared_ptr<QIODevice> &plainText, const std::shared_ptr<QIODevice> &signature, SignatureMode mode)
+{
+ run(std::bind(&sign, std::placeholders::_1, std::placeholders::_2, signers, std::placeholders::_3, std::placeholders::_4, mode, mOutputIsBase64Encoded), plainText, signature);
+}
+
+SigningResult QGpgMESignJob::exec(const std::vector<Key> &signers, const QByteArray &plainText, SignatureMode mode, QByteArray &signature)
+{
+ const result_type r = sign_qba(context(), signers, plainText, mode, mOutputIsBase64Encoded);
+ signature = std::get<1>(r);
+ resultHook(r);
+ return mResult;
+}
+
+void QGpgMESignJob::resultHook(const result_type &tuple)
+{
+ mResult = std::get<0>(tuple);
+}
+
+#if 0
+TODO port
+void QGpgMESignJob::showErrorDialog(QWidget *parent, const QString &caption) const
+{
+ if (mResult.error() && !mResult.error().isCanceled()) {
+ MessageBox::error(parent, mResult, this, caption);
+ }
+}
+#endif
+#include "qgpgmesignjob.moc"
diff --git a/lang/qt/src/qgpgmesignjob.h b/lang/qt/src/qgpgmesignjob.h
new file mode 100644
index 0000000..1d4a174
--- /dev/null
+++ b/lang/qt/src/qgpgmesignjob.h
@@ -0,0 +1,101 @@
+/*
+ qgpgmesignjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2007,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMESIGNJOB_H__
+#define __QGPGME_QGPGMESIGNJOB_H__
+
+#include "signjob.h"
+
+#include "threadedjobmixin.h"
+
+#ifdef BUILDING_QGPGME
+# include "signingresult.h"
+#else
+#include <gpgme++/signingresult.h>
+#endif
+#ifdef BUILDING_QGPGME
+# include "key.h"
+#else
+#include <gpgme++/key.h>
+#endif
+
+namespace QGpgME
+{
+
+class QGpgMESignJob
+#ifdef Q_MOC_RUN
+ : public SignJob
+#else
+ : public _detail::ThreadedJobMixin<SignJob, std::tuple<GpgME::SigningResult, QByteArray, QString, GpgME::Error> >
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMESignJob(GpgME::Context *context);
+ ~QGpgMESignJob();
+
+ /* from SignJob */
+ GpgME::Error start(const std::vector<GpgME::Key> &signers,
+ const QByteArray &plainText,
+ GpgME::SignatureMode mode) Q_DECL_OVERRIDE;
+
+ /* from SignJob */
+ void start(const std::vector<GpgME::Key> &signers,
+ const std::shared_ptr<QIODevice> &plainText,
+ const std::shared_ptr<QIODevice> &signature,
+ GpgME::SignatureMode mode) Q_DECL_OVERRIDE;
+
+ /* from SignJob */
+ GpgME::SigningResult exec(const std::vector<GpgME::Key> &signers,
+ const QByteArray &plainText,
+ GpgME::SignatureMode mode,
+ QByteArray &signature) Q_DECL_OVERRIDE;
+
+ /* from SignJob */
+ void setOutputIsBase64Encoded(bool on) Q_DECL_OVERRIDE;
+
+ /* from ThreadedJobMixin */
+ void resultHook(const result_type &r) Q_DECL_OVERRIDE;
+
+private:
+ GpgME::SigningResult mResult;
+ bool mOutputIsBase64Encoded;
+};
+
+}
+
+#endif // __QGPGME_QGPGMESIGNJOB_H__
diff --git a/lang/qt/src/qgpgmesignkeyjob.cpp b/lang/qt/src/qgpgmesignkeyjob.cpp
new file mode 100644
index 0000000..e6c1478
--- /dev/null
+++ b/lang/qt/src/qgpgmesignkeyjob.cpp
@@ -0,0 +1,125 @@
+/*
+ qgpgmesignkeyjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmesignkeyjob.h"
+
+#include "dataprovider.h"
+
+#include "context.h"
+#include "data.h"
+#include "gpgsignkeyeditinteractor.h"
+
+#include <cassert>
+#include <memory>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMESignKeyJob::QGpgMESignKeyJob(Context *context)
+ : mixin_type(context),
+ m_userIDsToSign(),
+ m_signingKey(),
+ m_checkLevel(0),
+ m_exportable(false),
+ m_nonRevocable(false),
+ m_started(false)
+{
+ lateInitialization();
+}
+
+QGpgMESignKeyJob::~QGpgMESignKeyJob() {}
+
+static QGpgMESignKeyJob::result_type sign_key(Context *ctx, const Key &key, const std::vector<unsigned int> &uids, unsigned int checkLevel, const Key &signer, unsigned int opts)
+{
+ QGpgME::QByteArrayDataProvider dp;
+ Data data(&dp);
+
+ GpgSignKeyEditInteractor *skei(new GpgSignKeyEditInteractor);
+ skei->setUserIDsToSign(uids);
+ skei->setCheckLevel(checkLevel);
+ skei->setSigningOptions(opts);
+
+ if (!signer.isNull())
+ if (const Error err = ctx->addSigningKey(signer)) {
+ return std::make_tuple(err, QString(), Error());
+ }
+ const Error err = ctx->edit(key, std::unique_ptr<EditInteractor> (skei), data);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(err, log, ae);
+}
+
+Error QGpgMESignKeyJob::start(const Key &key)
+{
+ unsigned int opts = 0;
+ if (m_nonRevocable) {
+ opts |= GpgSignKeyEditInteractor::NonRevocable;
+ }
+ if (m_exportable) {
+ opts |= GpgSignKeyEditInteractor::Exportable;
+ }
+ run(std::bind(&sign_key, std::placeholders::_1, key, m_userIDsToSign, m_checkLevel, m_signingKey, opts));
+ m_started = true;
+ return Error();
+}
+
+void QGpgMESignKeyJob::setUserIDsToSign(const std::vector<unsigned int> &idsToSign)
+{
+ assert(!m_started);
+ m_userIDsToSign = idsToSign;
+}
+
+void QGpgMESignKeyJob::setCheckLevel(unsigned int checkLevel)
+{
+ assert(!m_started);
+ m_checkLevel = checkLevel;
+}
+
+void QGpgMESignKeyJob::setExportable(bool exportable)
+{
+ assert(!m_started);
+ m_exportable = exportable;
+}
+
+void QGpgMESignKeyJob::setSigningKey(const Key &key)
+{
+ assert(!m_started);
+ m_signingKey = key;
+}
+
+void QGpgMESignKeyJob::setNonRevocable(bool nonRevocable)
+{
+ assert(!m_started);
+ m_nonRevocable = nonRevocable;
+}
+#include "qgpgmesignkeyjob.moc"
diff --git a/lang/qt/src/qgpgmesignkeyjob.h b/lang/qt/src/qgpgmesignkeyjob.h
new file mode 100644
index 0000000..6cdb7db
--- /dev/null
+++ b/lang/qt/src/qgpgmesignkeyjob.h
@@ -0,0 +1,94 @@
+/*
+ qgpgmesignkeyjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMESIGNKEYJOB_H__
+#define __QGPGME_QGPGMESIGNKEYJOB_H__
+
+#include "signkeyjob.h"
+
+#include "threadedjobmixin.h"
+
+#ifdef BUILDING_QGPGME
+# include "key.h"
+#else
+#include <gpgme++/key.h>
+#endif
+
+namespace QGpgME
+{
+
+class QGpgMESignKeyJob
+#ifdef Q_MOC_RUN
+ : public SignKeyJob
+#else
+ : public _detail::ThreadedJobMixin<SignKeyJob>
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMESignKeyJob(GpgME::Context *context);
+ ~QGpgMESignKeyJob();
+
+ /* from SignKeyJob */
+ GpgME::Error start(const GpgME::Key &key) Q_DECL_OVERRIDE;
+
+ /* from SignKeyJob */
+ void setUserIDsToSign(const std::vector<unsigned int> &idsToSign) Q_DECL_OVERRIDE;
+
+ /* from SignKeyJob */
+ void setCheckLevel(unsigned int checkLevel) Q_DECL_OVERRIDE;
+
+ /* from SignKeyJob */
+ void setExportable(bool exportable) Q_DECL_OVERRIDE;
+
+ /* from SignKeyJob */
+ void setSigningKey(const GpgME::Key &key) Q_DECL_OVERRIDE;
+
+ /* from SignKeyJob */
+ void setNonRevocable(bool nonRevocable) Q_DECL_OVERRIDE;
+
+private:
+ std::vector<unsigned int> m_userIDsToSign;
+ GpgME::Key m_signingKey;
+ unsigned int m_checkLevel;
+ bool m_exportable;
+ bool m_nonRevocable;
+ bool m_started;
+};
+}
+
+#endif // __QGPGME_QGPGMESIGNKEYJOB_H__
diff --git a/lang/qt/src/qgpgmetofupolicyjob.cpp b/lang/qt/src/qgpgmetofupolicyjob.cpp
new file mode 100644
index 0000000..a24c946
--- /dev/null
+++ b/lang/qt/src/qgpgmetofupolicyjob.cpp
@@ -0,0 +1,65 @@
+/* qgpgmetofupolicyjob.cpp
+
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmetofupolicyjob.h"
+
+#include "context.h"
+#include "key.h"
+#include "tofuinfo.h"
+
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMETofuPolicyJob::QGpgMETofuPolicyJob(Context *context)
+ : mixin_type(context)
+{
+ lateInitialization();
+}
+
+QGpgMETofuPolicyJob::~QGpgMETofuPolicyJob() {}
+
+static QGpgMETofuPolicyJob::result_type policy_worker(Context *ctx, const Key &key, TofuInfo::Policy policy)
+{
+ return std::make_tuple (ctx->setTofuPolicy(key, policy),
+ QString(), Error());
+}
+
+void QGpgMETofuPolicyJob::start(const Key &key, TofuInfo::Policy policy)
+{
+ run(std::bind(&policy_worker, std::placeholders::_1, key, policy));
+}
+
+Error QGpgMETofuPolicyJob::exec(const Key &key, TofuInfo::Policy policy)
+{
+ return std::get<0>(policy_worker(context(), key, policy));
+}
+
+#include "qgpgmetofupolicyjob.moc"
diff --git a/lang/qt/src/qgpgmetofupolicyjob.h b/lang/qt/src/qgpgmetofupolicyjob.h
new file mode 100644
index 0000000..e7272e7
--- /dev/null
+++ b/lang/qt/src/qgpgmetofupolicyjob.h
@@ -0,0 +1,65 @@
+/* qgpgmetofupolicyjob.h
+
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+#ifndef QGPGME_QGPGMETOFUPOLICYJOB_H
+#define QGPGME_QGPGMETOFUPOLICYJOB_H
+
+#include "tofupolicyjob.h"
+
+#include "threadedjobmixin.h"
+namespace GpgME
+{
+ class Key;
+} // namespace GpgME
+
+namespace QGpgME {
+
+class QGpgMETofuPolicyJob
+#ifdef Q_MOC_RUN
+ : public TofuPolicyJob
+#else
+ : public _detail::ThreadedJobMixin<TofuPolicyJob, std::tuple<GpgME::Error, QString, GpgME::Error> >
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMETofuPolicyJob(GpgME::Context *context);
+ ~QGpgMETofuPolicyJob();
+
+ void start(const GpgME::Key &key, GpgME::TofuInfo::Policy policy) Q_DECL_OVERRIDE;
+ GpgME::Error exec(const GpgME::Key &key, GpgME::TofuInfo::Policy policy) Q_DECL_OVERRIDE;
+};
+
+}
+
+#endif
diff --git a/lang/qt/src/qgpgmeverifydetachedjob.cpp b/lang/qt/src/qgpgmeverifydetachedjob.cpp
new file mode 100644
index 0000000..8efef05
--- /dev/null
+++ b/lang/qt/src/qgpgmeverifydetachedjob.cpp
@@ -0,0 +1,118 @@
+/*
+ qgpgmeverifydetachedjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2007,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmeverifydetachedjob.h"
+
+#include "dataprovider.h"
+
+#include "context.h"
+#include "verificationresult.h"
+#include "data.h"
+
+#include <cassert>
+
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEVerifyDetachedJob::QGpgMEVerifyDetachedJob(Context *context)
+ : mixin_type(context)
+{
+ lateInitialization();
+}
+
+QGpgMEVerifyDetachedJob::~QGpgMEVerifyDetachedJob() {}
+
+static QGpgMEVerifyDetachedJob::result_type verify_detached(Context *ctx, QThread *thread, const std::weak_ptr<QIODevice> &signature_, const std::weak_ptr<QIODevice> &signedData_)
+{
+ const std::shared_ptr<QIODevice> signature = signature_.lock();
+ const std::shared_ptr<QIODevice> signedData = signedData_.lock();
+
+ const _detail::ToThreadMover sgMover(signature, thread);
+ const _detail::ToThreadMover sdMover(signedData, thread);
+
+ QGpgME::QIODeviceDataProvider sigDP(signature);
+ Data sig(&sigDP);
+
+ QGpgME::QIODeviceDataProvider dataDP(signedData);
+ Data data(&dataDP);
+
+ const VerificationResult res = ctx->verifyDetachedSignature(sig, data);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+
+ return std::make_tuple(res, log, ae);
+}
+
+static QGpgMEVerifyDetachedJob::result_type verify_detached_qba(Context *ctx, const QByteArray &signature, const QByteArray &signedData)
+{
+ QGpgME::QByteArrayDataProvider sigDP(signature);
+ Data sig(&sigDP);
+
+ QGpgME::QByteArrayDataProvider dataDP(signedData);
+ Data data(&dataDP);
+
+ const VerificationResult res = ctx->verifyDetachedSignature(sig, data);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+
+ return std::make_tuple(res, log, ae);
+
+}
+
+Error QGpgMEVerifyDetachedJob::start(const QByteArray &signature, const QByteArray &signedData)
+{
+ run(std::bind(&verify_detached_qba, std::placeholders::_1, signature, signedData));
+ return Error();
+}
+
+void QGpgMEVerifyDetachedJob::start(const std::shared_ptr<QIODevice> &signature, const std::shared_ptr<QIODevice> &signedData)
+{
+ run(std::bind(&verify_detached, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4), signature, signedData);
+}
+
+GpgME::VerificationResult QGpgME::QGpgMEVerifyDetachedJob::exec(const QByteArray &signature,
+ const QByteArray &signedData)
+{
+ const result_type r = verify_detached_qba(context(), signature, signedData);
+ resultHook(r);
+ return mResult;
+}
+
+//PENDING(marc) implement showErrorDialog()
+
+void QGpgME::QGpgMEVerifyDetachedJob::resultHook(const result_type &tuple)
+{
+ mResult = std::get<0>(tuple);
+}
+#include "qgpgmeverifydetachedjob.moc"
diff --git a/lang/qt/src/qgpgmeverifydetachedjob.h b/lang/qt/src/qgpgmeverifydetachedjob.h
new file mode 100644
index 0000000..051caf0
--- /dev/null
+++ b/lang/qt/src/qgpgmeverifydetachedjob.h
@@ -0,0 +1,85 @@
+/*
+ qgpgmeverifydetachedjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2007,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMEVERIFYDETACHEDJOB_H__
+#define __QGPGME_QGPGMEVERIFYDETACHEDJOB_H__
+
+#include "verifydetachedjob.h"
+
+#include "threadedjobmixin.h"
+
+#ifdef BUILDING_QGPGME
+# include "verificationresult.h"
+#else
+#include <gpgme++/verificationresult.h>
+#endif
+
+namespace QGpgME
+{
+
+class QGpgMEVerifyDetachedJob
+#ifdef Q_MOC_RUN
+ : public VerifyDetachedJob
+#else
+ : public _detail::ThreadedJobMixin<VerifyDetachedJob, std::tuple<GpgME::VerificationResult, QString, GpgME::Error> >
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEVerifyDetachedJob(GpgME::Context *context);
+ ~QGpgMEVerifyDetachedJob();
+
+ /* from VerifyDetachedJob */
+ GpgME::Error start(const QByteArray &signature, const QByteArray &signedData) Q_DECL_OVERRIDE;
+
+ /* from VerifyDetachedJob */
+ void start(const std::shared_ptr<QIODevice> &signature, const std::shared_ptr<QIODevice> &signedData) Q_DECL_OVERRIDE;
+
+ /* from VerifyDetachedJob */
+ GpgME::VerificationResult exec(const QByteArray &signature,
+ const QByteArray &signedData) Q_DECL_OVERRIDE;
+
+ /* from ThreadedJobMixin */
+ void resultHook(const result_type &r) Q_DECL_OVERRIDE;
+
+private:
+ GpgME::VerificationResult mResult;
+};
+
+}
+
+#endif // __QGPGME_QGPGMEVERIFYDETACHEDJOB_H__
diff --git a/lang/qt/src/qgpgmeverifyopaquejob.cpp b/lang/qt/src/qgpgmeverifyopaquejob.cpp
new file mode 100644
index 0000000..b513f82
--- /dev/null
+++ b/lang/qt/src/qgpgmeverifyopaquejob.cpp
@@ -0,0 +1,125 @@
+/*
+ qgpgmeverifyopaquejob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2007,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmeverifyopaquejob.h"
+
+#include "dataprovider.h"
+
+#include "context.h"
+#include "verificationresult.h"
+#include "data.h"
+
+#include <QBuffer>
+
+
+#include <cassert>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEVerifyOpaqueJob::QGpgMEVerifyOpaqueJob(Context *context)
+ : mixin_type(context)
+{
+ lateInitialization();
+}
+
+QGpgMEVerifyOpaqueJob::~QGpgMEVerifyOpaqueJob() {}
+
+static QGpgMEVerifyOpaqueJob::result_type verify_opaque(Context *ctx, QThread *thread, const std::weak_ptr<QIODevice> &signedData_, const std::weak_ptr<QIODevice> &plainText_)
+{
+
+ const std::shared_ptr<QIODevice> plainText = plainText_.lock();
+ const std::shared_ptr<QIODevice> signedData = signedData_.lock();
+
+ const _detail::ToThreadMover ptMover(plainText, thread);
+ const _detail::ToThreadMover sdMover(signedData, thread);
+
+ QGpgME::QIODeviceDataProvider in(signedData);
+ const Data indata(&in);
+
+ if (!plainText) {
+ QGpgME::QByteArrayDataProvider out;
+ Data outdata(&out);
+
+ const VerificationResult res = ctx->verifyOpaqueSignature(indata, outdata);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(res, out.data(), log, ae);
+ } else {
+ QGpgME::QIODeviceDataProvider out(plainText);
+ Data outdata(&out);
+
+ const VerificationResult res = ctx->verifyOpaqueSignature(indata, outdata);
+ Error ae;
+ const QString log = _detail::audit_log_as_html(ctx, ae);
+ return std::make_tuple(res, QByteArray(), log, ae);
+ }
+
+}
+
+static QGpgMEVerifyOpaqueJob::result_type verify_opaque_qba(Context *ctx, const QByteArray &signedData)
+{
+ const std::shared_ptr<QBuffer> buffer(new QBuffer);
+ buffer->setData(signedData);
+ if (!buffer->open(QIODevice::ReadOnly)) {
+ assert(!"This should never happen: QBuffer::open() failed");
+ }
+ return verify_opaque(ctx, 0, buffer, std::shared_ptr<QIODevice>());
+}
+
+Error QGpgMEVerifyOpaqueJob::start(const QByteArray &signedData)
+{
+ run(std::bind(&verify_opaque_qba, std::placeholders::_1, signedData));
+ return Error();
+}
+
+void QGpgMEVerifyOpaqueJob::start(const std::shared_ptr<QIODevice> &signedData, const std::shared_ptr<QIODevice> &plainText)
+{
+ run(std::bind(&verify_opaque, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4), signedData, plainText);
+}
+
+GpgME::VerificationResult QGpgME::QGpgMEVerifyOpaqueJob::exec(const QByteArray &signedData, QByteArray &plainText)
+{
+ const result_type r = verify_opaque_qba(context(), signedData);
+ plainText = std::get<1>(r);
+ resultHook(r);
+ return mResult;
+}
+
+//PENDING(marc) implement showErrorDialog()
+
+void QGpgME::QGpgMEVerifyOpaqueJob::resultHook(const result_type &tuple)
+{
+ mResult = std::get<0>(tuple);
+}
+#include "qgpgmeverifyopaquejob.moc"
diff --git a/lang/qt/src/qgpgmeverifyopaquejob.h b/lang/qt/src/qgpgmeverifyopaquejob.h
new file mode 100644
index 0000000..87c94a3
--- /dev/null
+++ b/lang/qt/src/qgpgmeverifyopaquejob.h
@@ -0,0 +1,84 @@
+/*
+ qgpgmeverifyopaquejob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004,2007,2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_QGPGMEVERIFYOPAQUEJOB_H__
+#define __QGPGME_QGPGMEVERIFYOPAQUEJOB_H__
+
+#include "verifyopaquejob.h"
+
+#include "threadedjobmixin.h"
+
+#ifdef BUILDING_QGPGME
+# include "verificationresult.h"
+#else
+#include <gpgme++/verificationresult.h>
+#endif
+
+namespace QGpgME
+{
+
+class QGpgMEVerifyOpaqueJob
+#ifdef Q_MOC_RUN
+ : public VerifyOpaqueJob
+#else
+ : public _detail::ThreadedJobMixin<VerifyOpaqueJob, std::tuple<GpgME::VerificationResult, QByteArray, QString, GpgME::Error> >
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEVerifyOpaqueJob(GpgME::Context *context);
+ ~QGpgMEVerifyOpaqueJob();
+
+ /* from VerifyOpaqueJob */
+ GpgME::Error start(const QByteArray &signedData) Q_DECL_OVERRIDE;
+
+ /* from VerifyOpaqueJob */
+ void start(const std::shared_ptr<QIODevice> &signedData, const std::shared_ptr<QIODevice> &plainText) Q_DECL_OVERRIDE;
+
+ /* form VerifyOpaqueJob */
+ GpgME::VerificationResult exec(const QByteArray &signedData, QByteArray &plainData) Q_DECL_OVERRIDE;
+
+ /* from ThreadedJobMixin */
+ void resultHook(const result_type &r) Q_DECL_OVERRIDE;
+
+private:
+ GpgME::VerificationResult mResult;
+};
+
+}
+
+#endif // __QGPGME_QGPGMEVERIFYOPAQUEJOB_H__
diff --git a/lang/qt/src/qgpgmewkspublishjob.cpp b/lang/qt/src/qgpgmewkspublishjob.cpp
new file mode 100644
index 0000000..8f97cb5
--- /dev/null
+++ b/lang/qt/src/qgpgmewkspublishjob.cpp
@@ -0,0 +1,189 @@
+/* wkspublishjob.cpp
+
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "qgpgmewkspublishjob.h"
+
+#include "context.h"
+#include "key.h"
+#include "util.h"
+
+#include <QFileInfo>
+#include <QDir>
+#include <QProcess>
+
+/* Timeout for the WKS Processes will be 5 Minutes as
+ * they can involve pinentry questions. */
+#define TIMEOUT_VALUE (5*60*1000)
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEWKSPublishJob::QGpgMEWKSPublishJob(Context *context)
+ : mixin_type(context)
+{
+ lateInitialization();
+}
+
+QGpgMEWKSPublishJob::~QGpgMEWKSPublishJob() {}
+
+static QString getWKSClient()
+{
+ auto libexecdir = QString::fromLocal8Bit(dirInfo("libexecdir"));
+ if (libexecdir.isEmpty()) {
+ return QString();
+ }
+
+ const QFileInfo fi(QDir(libexecdir).absoluteFilePath(QStringLiteral("gpg-wks-client")));
+ if (fi.exists() && fi.isExecutable()) {
+ return fi.absoluteFilePath();
+ }
+ return QString();
+}
+
+static QGpgMEWKSPublishJob::result_type check_worker(const QString &mail)
+{
+ if (mail.isEmpty()) {
+ return std::make_tuple (Error(make_error(GPG_ERR_INV_ARG)),
+ QByteArray(), QByteArray(), QString(), Error());
+ }
+
+ const auto wksPath = getWKSClient();
+ if (wksPath.isEmpty()) {
+ return std::make_tuple (Error(make_error(GPG_ERR_NOT_SUPPORTED)),
+ QByteArray(), QByteArray(), QString(), Error());
+ }
+
+ /* QProcess instead of engine_spawn because engine_spawn does not communicate
+ * the return value of the process and we are in qt anyway. */
+ QProcess proc;
+ proc.setProgram(wksPath);
+ proc.setArguments(QStringList() << QStringLiteral("--supported") << mail);
+ proc.start();
+ if (!proc.waitForStarted()) {
+ return std::make_tuple (Error(make_error(GPG_ERR_NOT_SUPPORTED)),
+ QByteArray(), QByteArray(), QString(), Error());
+ }
+ if (!proc.waitForFinished(TIMEOUT_VALUE)) {
+ return std::make_tuple (Error(make_error(GPG_ERR_TIMEOUT)),
+ QByteArray(), QByteArray(), QString(), Error());
+ }
+ if (proc.exitStatus() == QProcess::NormalExit && proc.exitCode() == 0) {
+ return std::make_tuple (Error(), QByteArray(), QByteArray(), QString(), Error());
+ }
+ return std::make_tuple (Error(make_error(GPG_ERR_NOT_ENABLED)),
+ QByteArray(), QByteArray(), QString(), Error());
+}
+
+static QGpgMEWKSPublishJob::result_type create_worker(const char *fpr, const QString &mail)
+{
+ if (mail.isEmpty() || !fpr) {
+ return std::make_tuple (Error(make_error(GPG_ERR_INV_ARG)),
+ QByteArray(), QByteArray(), QString(), Error());
+ }
+
+ const auto wksPath = getWKSClient();
+ if (wksPath.isEmpty()) {
+ return std::make_tuple (Error(make_error(GPG_ERR_NOT_SUPPORTED)),
+ QByteArray(), QByteArray(), QString(), Error());
+ }
+
+ QProcess proc;
+ proc.setProgram(wksPath);
+ proc.setArguments(QStringList() << QStringLiteral("--create")
+ << QLatin1String(fpr)
+ << mail);
+ proc.start();
+ if (!proc.waitForStarted()) {
+ return std::make_tuple (Error(make_error(GPG_ERR_NOT_SUPPORTED)),
+ QByteArray(), QByteArray(), QString(), Error());
+ }
+
+ if (!proc.waitForFinished(TIMEOUT_VALUE)) {
+ return std::make_tuple (Error(make_error(GPG_ERR_TIMEOUT)),
+ QByteArray(), QByteArray(), QString(), Error());
+ }
+ if (proc.exitStatus() == QProcess::NormalExit && proc.exitCode() == 0) {
+ return std::make_tuple (Error(), proc.readAllStandardOutput(),
+ proc.readAllStandardError(), QString(), Error());
+ }
+ return std::make_tuple (Error(make_error(GPG_ERR_GENERAL)),
+ proc.readAllStandardOutput(), proc.readAllStandardError(), QString(), Error());
+}
+
+static QGpgMEWKSPublishJob::result_type recieve_worker(const QByteArray &response)
+{
+ if (response.isEmpty()) {
+ return std::make_tuple (Error(make_error(GPG_ERR_INV_ARG)),
+ QByteArray(), QByteArray(), QString(), Error());
+ }
+
+ const auto wksPath = getWKSClient();
+ if (wksPath.isEmpty()) {
+ return std::make_tuple (Error(make_error(GPG_ERR_NOT_SUPPORTED)),
+ QByteArray(), QByteArray(), QString(), Error());
+ }
+
+ QProcess proc;
+ proc.setProgram(wksPath);
+ proc.setArguments(QStringList() << QStringLiteral("--receive"));
+ proc.start();
+ if (!proc.waitForStarted()) {
+ return std::make_tuple (Error(make_error(GPG_ERR_NOT_SUPPORTED)),
+ QByteArray(), QByteArray(), QString(), Error());
+ }
+ proc.write(response);
+ proc.closeWriteChannel();
+ if (!proc.waitForFinished(TIMEOUT_VALUE)) {
+ return std::make_tuple (Error(make_error(GPG_ERR_TIMEOUT)),
+ QByteArray(), QByteArray(), QString(), Error());
+ }
+ if (proc.exitStatus() == QProcess::NormalExit && proc.exitCode() == 0) {
+ return std::make_tuple (Error(), proc.readAllStandardOutput(),
+ proc.readAllStandardError(), QString(), Error());
+ }
+ return std::make_tuple (Error(make_error(GPG_ERR_GENERAL)),
+ proc.readAllStandardOutput(), proc.readAllStandardError(), QString(), Error());
+}
+
+void QGpgMEWKSPublishJob::startCheck(const QString &mailbox)
+{
+ run(std::bind(&check_worker, mailbox));
+}
+
+void QGpgMEWKSPublishJob::startCreate(const char *fpr, const QString &mailbox) {
+ run(std::bind(&create_worker, fpr, mailbox));
+}
+
+void QGpgMEWKSPublishJob::startRecieve(const QByteArray &response)
+{
+ run(std::bind(&recieve_worker, response));
+}
+
+#include "qgpgmewkspublishjob.moc"
diff --git a/lang/qt/src/qgpgmewkspublishjob.h b/lang/qt/src/qgpgmewkspublishjob.h
new file mode 100644
index 0000000..1a31149
--- /dev/null
+++ b/lang/qt/src/qgpgmewkspublishjob.h
@@ -0,0 +1,70 @@
+/* qgpgmewkspublishjob.h
+
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+#ifndef QGPGME_QGPGMEWKSPUBLISHJOB_H
+#define QGPGME_QGPGMEWKSPUBLISHJOB_H
+
+#include "wkspublishjob.h"
+
+#include "threadedjobmixin.h"
+namespace GpgME
+{
+ class Key;
+} // namespace GpgME
+
+namespace QGpgME {
+
+/**
+ * Handles Web Key Service Publishing. Needs WKS tools installed and
+ * server support.
+ */
+class QGpgMEWKSPublishJob
+#ifdef Q_MOC_RUN
+ : public WKSPublishJob
+#else
+ : public _detail::ThreadedJobMixin<WKSPublishJob, std::tuple<GpgME::Error, QByteArray, QByteArray, QString, GpgME::Error> >
+#endif
+{
+ Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+ void slotFinished();
+#endif
+public:
+ explicit QGpgMEWKSPublishJob(GpgME::Context *context);
+ ~QGpgMEWKSPublishJob();
+
+ void startCheck(const QString &mailbox) Q_DECL_OVERRIDE;
+ void startCreate(const char *fpr, const QString &mailbox) Q_DECL_OVERRIDE;
+ void startRecieve(const QByteArray &response) Q_DECL_OVERRIDE;
+};
+
+}
+
+#endif
diff --git a/lang/qt/src/refreshkeysjob.h b/lang/qt/src/refreshkeysjob.h
new file mode 100644
index 0000000..a97de80
--- /dev/null
+++ b/lang/qt/src/refreshkeysjob.h
@@ -0,0 +1,94 @@
+/*
+ refreshkeysjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_REFRESHKEYSJOB_H__
+#define __KLEO_REFRESHKEYSJOB_H__
+
+#include "job.h"
+#include "qgpgme_export.h"
+
+#include <vector>
+
+namespace GpgME
+{
+class Error;
+class Key;
+}
+
+class QStringList;
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for asynchronous key refreshers.
+
+ To use a RefreshKeysJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the key refresh with a
+ call to start(). This call might fail, in which case the
+ RefreshKeysJob instance will have scheduled its own destruction
+ with a call to QObject::deleteLater().
+
+ After result() is emitted, the KeyListJob will schedule it's own
+ destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT RefreshKeysJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit RefreshKeysJob(QObject *parent);
+public:
+ ~RefreshKeysJob();
+
+ /**
+ Starts the keylist operation. \a pattern is a list of patterns
+ used to restrict the list of keys returned. Empty patterns are
+ ignored. If \a pattern is empty or contains only empty strings,
+ all keys are returned (however, the backend is free to truncate
+ the result and should do so; when this happens, it will be
+ reported by the reult object).
+
+ If \a secretOnly is true, only keys for which the secret key is
+ also available are returned. Use this if you need to select a
+ key for signing.
+ */
+ virtual GpgME::Error start(const QStringList &patterns) = 0;
+
+Q_SIGNALS:
+ void result(const GpgME::Error &error);
+};
+
+}
+
+#endif // __KLEO_REFRESHKEYSJOB_H__
diff --git a/lang/qt/src/signencryptjob.h b/lang/qt/src/signencryptjob.h
new file mode 100644
index 0000000..4e07744
--- /dev/null
+++ b/lang/qt/src/signencryptjob.h
@@ -0,0 +1,153 @@
+/*
+ signencryptjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004, 2007 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_SIGNENCRYPTJOB_H__
+#define __KLEO_SIGNENCRYPTJOB_H__
+
+#include "job.h"
+#include "qgpgme_export.h"
+
+#ifdef BUILDING_QGPGME
+# include "global.h"
+# include "context.h"
+#else
+# include <gpgme++/global.h>
+# include <gpgme++/context.h>
+#endif
+
+#include <memory>
+#include <vector>
+#include <utility>
+
+class QByteArray;
+class QIODevice;
+
+namespace GpgME
+{
+class Error;
+class Key;
+class SigningResult;
+class EncryptionResult;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for asynchronous combined signing and encrypting
+
+ To use a SignEncryptJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the operation with a
+ call to start(). This call might fail, in which case the
+ SignEncryptJob instance will have scheduled it's own destruction
+ with a call to QObject::deleteLater().
+
+ After result() is emitted, the SignEncryptJob will schedule it's
+ own destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT SignEncryptJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit SignEncryptJob(QObject *parent);
+public:
+ ~SignEncryptJob();
+
+ /**
+ Starts the combined signing and encrypting operation. \a signers
+ is the list of keys to sign \a plainText with. \a recipients is
+ a list of keys to encrypt the signed \a plainText to. In both
+ lists, empty (null) keys are ignored.
+
+ If \a alwaysTrust is true, validity checking for the
+ \em recipient keys will not be performed, but full validity
+ assumed for all \em recipient keys without further checks.
+ */
+ virtual QGPGME_DEPRECATED_EXPORT GpgME::Error start(const std::vector<GpgME::Key> &signers,
+ const std::vector<GpgME::Key> &recipients,
+ const QByteArray &plainText,
+ bool alwaysTrust = false) = 0;
+
+ /*!
+ \overload
+
+ If \a cipherText is non-null, the ciphertext is written
+ there. Otherwise, it will be delivered in the third argument of
+ result().
+
+ \throws GpgME::Exception if starting fails
+ */
+ virtual void start(const std::vector<GpgME::Key> &signers,
+ const std::vector<GpgME::Key> &recipients,
+ const std::shared_ptr<QIODevice> &plainText,
+ const std::shared_ptr<QIODevice> &cipherText = std::shared_ptr<QIODevice>(),
+ bool alwaysTrust = false) = 0;
+
+ virtual std::pair<GpgME::SigningResult, GpgME::EncryptionResult>
+ exec(const std::vector<GpgME::Key> &signers,
+ const std::vector<GpgME::Key> &recipients,
+ const QByteArray &plainText,
+ bool alwaysTrust, QByteArray &cipherText) = 0;
+
+ /*!
+ This is a hack to request BASE64 output (instead of whatever
+ comes out normally).
+ */
+ virtual void setOutputIsBase64Encoded(bool) = 0;
+
+ /** Like start but with an additional argument for EncryptionFlags for
+ * more flexibility. */
+ virtual void start(const std::vector<GpgME::Key> &signers,
+ const std::vector<GpgME::Key> &recipients,
+ const std::shared_ptr<QIODevice> &plainText,
+ const std::shared_ptr<QIODevice> &cipherText = std::shared_ptr<QIODevice>(),
+ const GpgME::Context::EncryptionFlags flags = GpgME::Context::None) = 0;
+
+ /** Like exec but with an additional argument for EncryptionFlags for
+ * more flexibility. */
+ virtual std::pair<GpgME::SigningResult, GpgME::EncryptionResult>
+ exec(const std::vector<GpgME::Key> &signers,
+ const std::vector<GpgME::Key> &recipients,
+ const QByteArray &plainText,
+ const GpgME::Context::EncryptionFlags flags, QByteArray &cipherText) = 0;
+Q_SIGNALS:
+ void result(const GpgME::SigningResult &signingresult,
+ const GpgME::EncryptionResult &encryptionresult,
+ const QByteArray &cipherText, const QString &auditLogAsHtml = QString(),
+ const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_SIGNENCRYPTJOB_H__
diff --git a/lang/qt/src/signjob.h b/lang/qt/src/signjob.h
new file mode 100644
index 0000000..cf5c628
--- /dev/null
+++ b/lang/qt/src/signjob.h
@@ -0,0 +1,122 @@
+/*
+ signjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004, 2007 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_SIGNJOB_H__
+#define __KLEO_SIGNJOB_H__
+
+#include "job.h"
+
+#ifdef BUILDING_QGPGME
+# include "global.h"
+#else
+# include <gpgme++/global.h>
+#endif
+
+
+#include <vector>
+#include <memory>
+
+class QByteArray;
+class QIODevice;
+
+namespace GpgME
+{
+class Error;
+class Key;
+class SigningResult;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for asynchronous signing
+
+ To use a SignJob, first obtain an instance from the CryptoBackend
+ implementation, connect the progress() and result() signals to
+ suitable slots and then start the signing with a call to
+ start(). This call might fail, in which case the SignJob instance
+ will have scheduled it's own destruction with a call to
+ QObject::deleteLater().
+
+ After result() is emitted, the SignJob will schedule it's own
+ destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT SignJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit SignJob(QObject *parent);
+public:
+ ~SignJob();
+
+ /**
+ Starts the signing operation. \a signers is the list of keys to
+ sign \a plainText with. Empty (null) keys are ignored.
+ */
+ virtual QGPGME_DEPRECATED_EXPORT GpgME::Error start(const std::vector<GpgME::Key> &signers,
+ const QByteArray &plainText,
+ GpgME::SignatureMode mode) = 0;
+
+ /*!
+ \overload
+
+ If \a signature is non-null the signature is written
+ there. Otherwise, it will be delivered in the second argument of
+ result().
+
+ \throws GpgME::Exception if starting fails
+ */
+ virtual void start(const std::vector<GpgME::Key> &signers,
+ const std::shared_ptr<QIODevice> &plainText,
+ const std::shared_ptr<QIODevice> &signature,
+ GpgME::SignatureMode mode) = 0;
+
+ virtual GpgME::SigningResult exec(const std::vector<GpgME::Key> &signers,
+ const QByteArray &plainText,
+ GpgME::SignatureMode mode,
+ QByteArray &signature) = 0;
+
+ /*!
+ This is a hack to request BASE64 output (instead of whatever
+ comes out normally).
+ */
+ virtual void setOutputIsBase64Encoded(bool) = 0;
+
+Q_SIGNALS:
+ void result(const GpgME::SigningResult &result, const QByteArray &signature, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_SIGNJOB_H__
diff --git a/lang/qt/src/signkeyjob.h b/lang/qt/src/signkeyjob.h
new file mode 100644
index 0000000..b5efc01
--- /dev/null
+++ b/lang/qt/src/signkeyjob.h
@@ -0,0 +1,117 @@
+/*
+ signkeyjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_SIGNKEYJOB_H__
+#define __KLEO_SIGNKEYJOB_H__
+
+#include "job.h"
+
+#include <vector>
+
+namespace GpgME
+{
+class Error;
+class Key;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class to sign keys asynchronously
+
+ To use a SignKeyJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the job with a call
+ to start(). This call might fail, in which case the ChangeExpiryJob
+ instance will have scheduled it's own destruction with a call to
+ QObject::deleteLater().
+
+ After result() is emitted, the SignKeyJob will schedule it's own
+ destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT SignKeyJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit SignKeyJob(QObject *parent);
+public:
+ ~SignKeyJob();
+
+ /**
+ Starts the key signing operation. \a key is the key to sign.
+ @param keyToSign the key to be signed
+ @param idsToSign the user IDs to sign
+ @param signingKey the secret key to use for signing
+ @param option the signing mode, either local or exportable
+ */
+ virtual GpgME::Error start(const GpgME::Key &keyToSign) = 0;
+
+ /**
+ * If explicitly specified, only the listed user IDs will be signed. Otherwise all user IDs
+ * are signed.
+ * @param list of user ID indexes (of the key to be signed).
+ */
+ virtual void setUserIDsToSign(const std::vector<unsigned int> &idsToSign) = 0;
+
+ /**
+ * sets the check level
+ * @param the check level, ranges from 0 (no claim) and 3 (extensively checked),
+ * default is 0
+ */
+ virtual void setCheckLevel(unsigned int checkLevel) = 0;
+
+ /**
+ * sets whether the signature should be exportable, or local only.
+ * default is local.
+ */
+ virtual void setExportable(bool exportable) = 0;
+
+ /**
+ * sets an alternate signing key
+ */
+ virtual void setSigningKey(const GpgME::Key &key) = 0;
+
+ /**
+ * if set, the created signature won't be revocable. By default signatures
+ * can be revoked.
+ */
+ virtual void setNonRevocable(bool nonRevocable) = 0;
+
+Q_SIGNALS:
+ void result(const GpgME::Error &result, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_SIGNKEYJOB_H__
diff --git a/lang/qt/src/specialjob.h b/lang/qt/src/specialjob.h
new file mode 100644
index 0000000..2c80f20
--- /dev/null
+++ b/lang/qt/src/specialjob.h
@@ -0,0 +1,91 @@
+/*
+ specialjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_SPECIALJOB_H__
+#define __KLEO_SPECIALJOB_H__
+
+#include "job.h"
+#include "qgpgme_export.h"
+
+namespace GpgME
+{
+class Error;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for protocol-specific jobs
+
+ To use a SpecialJob, first obtain an instance from the
+ CryptoBackend implementation, connect progress() and result()
+ signals to suitable slots and then start the job with a call to
+ start(). This call might fail, in which case the SpecialJob
+ instance will have schedules its own destruction with a call to
+ QObject::deleteLater().
+
+ After result() is emitted, the SpecialJob will schedule its own
+ destruction by calling QObject::deleteLater().
+
+ Parameters are set using the Qt property system. More general, or
+ constructor parameters are given in the call to
+ QGpgME::Protocol::specialJob().
+
+ The result is made available through the result signal, and
+ through the read-only result property, the latter of which needs
+ to be defined in each SpecialJob subclass.
+*/
+class QGPGME_EXPORT SpecialJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit SpecialJob(QObject *parent);
+
+public:
+ ~SpecialJob();
+
+ /**
+ Starts the special operation.
+ */
+ virtual GpgME::Error start() = 0;
+
+ virtual GpgME::Error exec() = 0;
+
+Q_SIGNALS:
+ void result(const GpgME::Error &result, const QVariant &data);
+};
+
+}
+
+#endif // __KLEO_SPECIALJOB_H__
diff --git a/lang/qt/src/threadedjobmixin.cpp b/lang/qt/src/threadedjobmixin.cpp
new file mode 100644
index 0000000..cd6ab5f
--- /dev/null
+++ b/lang/qt/src/threadedjobmixin.cpp
@@ -0,0 +1,110 @@
+/*
+ threadedjobmixin.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include "threadedjobmixin.h"
+
+#include "dataprovider.h"
+
+#include "data.h"
+
+#include <QString>
+#include <QStringList>
+#include <QByteArray>
+
+
+#include <algorithm>
+#include <iterator>
+
+using namespace QGpgME;
+using namespace GpgME;
+
+static const unsigned int GetAuditLogFlags = Context::AuditLogWithHelp | Context::HtmlAuditLog;
+
+QString _detail::audit_log_as_html(Context *ctx, GpgME::Error &err)
+{
+ assert(ctx);
+ QGpgME::QByteArrayDataProvider dp;
+ Data data(&dp);
+ assert(!data.isNull());
+ if ((err = ctx->lastError()) || (err = ctx->getAuditLog(data, GetAuditLogFlags))) {
+ return QString::fromLocal8Bit(err.asString());
+ }
+ const QByteArray ba = dp.data();
+ return QString::fromUtf8(ba.data(), ba.size());
+}
+
+static QList<QByteArray> from_sl(const QStringList &sl)
+{
+ QList<QByteArray> result;
+ Q_FOREACH (const QString &str, sl) {
+ result.append(str.toUtf8());
+ }
+
+#if 0
+ std::transform(sl.begin(), sl.end(), std::back_inserter(result),
+ mem_fn(static_cast<QByteArray()const>(&QString::toUtf8)));
+#endif
+ return result;
+}
+
+static QList<QByteArray> single(const QByteArray &ba)
+{
+ QList<QByteArray> result;
+ result.push_back(ba);
+ return result;
+}
+
+_detail::PatternConverter::PatternConverter(const QByteArray &ba)
+ : m_list(single(ba)), m_patterns(0) {}
+_detail::PatternConverter::PatternConverter(const QString &s)
+ : m_list(single(s.toUtf8())), m_patterns(0) {}
+_detail::PatternConverter::PatternConverter(const QList<QByteArray> &lba)
+ : m_list(lba), m_patterns(0) {}
+_detail::PatternConverter::PatternConverter(const QStringList &sl)
+ : m_list(from_sl(sl)), m_patterns(0) {}
+
+const char **_detail::PatternConverter::patterns() const
+{
+ if (!m_patterns) {
+ m_patterns = new const char *[ m_list.size() + 1 ];
+ const char **end = std::transform(m_list.begin(), m_list.end(), m_patterns,
+ std::mem_fn(&QByteArray::constData));
+ *end = 0;
+ }
+ return m_patterns;
+}
+
+_detail::PatternConverter::~PatternConverter()
+{
+ delete [] m_patterns;
+}
diff --git a/lang/qt/src/threadedjobmixin.h b/lang/qt/src/threadedjobmixin.h
new file mode 100644
index 0000000..62d7f1c
--- /dev/null
+++ b/lang/qt/src/threadedjobmixin.h
@@ -0,0 +1,272 @@
+/*
+ threadedjobmixin.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2008 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __QGPGME_THREADEDJOBMIXING_H__
+#define __QGPGME_THREADEDJOBMIXING_H__
+
+#include <QMutex>
+#include <QMutexLocker>
+#include <QThread>
+#include <QString>
+#include <QIODevice>
+
+#ifdef BUILDING_QGPGME
+# include "context.h"
+# include "interfaces/progressprovider.h"
+#else
+# include <gpgme++/context.h>
+# include <gpgme++/interfaces/progressprovider.h>
+#endif
+
+
+#include <cassert>
+
+namespace QGpgME
+{
+namespace _detail
+{
+
+QString audit_log_as_html(GpgME::Context *ctx, GpgME::Error &err);
+
+class PatternConverter
+{
+ const QList<QByteArray> m_list;
+ mutable const char **m_patterns;
+public:
+ explicit PatternConverter(const QByteArray &ba);
+ explicit PatternConverter(const QString &s);
+ explicit PatternConverter(const QList<QByteArray> &lba);
+ explicit PatternConverter(const QStringList &sl);
+ ~PatternConverter();
+
+ const char **patterns() const;
+};
+
+class ToThreadMover
+{
+ QObject *const m_object;
+ QThread *const m_thread;
+public:
+ ToThreadMover(QObject *o, QThread *t) : m_object(o), m_thread(t) {}
+ ToThreadMover(QObject &o, QThread *t) : m_object(&o), m_thread(t) {}
+ ToThreadMover(const std::shared_ptr<QObject> &o, QThread *t) : m_object(o.get()), m_thread(t) {}
+ ~ToThreadMover()
+ {
+ if (m_object && m_thread) {
+ m_object->moveToThread(m_thread);
+ }
+ }
+};
+
+template <typename T_result>
+class Thread : public QThread
+{
+public:
+ explicit Thread(QObject *parent = Q_NULLPTR) : QThread(parent) {}
+
+ void setFunction(const std::function<T_result()> &function)
+ {
+ const QMutexLocker locker(&m_mutex);
+ m_function = function;
+ }
+
+ T_result result() const
+ {
+ const QMutexLocker locker(&m_mutex);
+ return m_result;
+ }
+
+private:
+ void run() Q_DECL_OVERRIDE {
+ const QMutexLocker locker(&m_mutex);
+ m_result = m_function();
+ }
+private:
+ mutable QMutex m_mutex;
+ std::function<T_result()> m_function;
+ T_result m_result;
+};
+
+template <typename T_base, typename T_result = std::tuple<GpgME::Error, QString, GpgME::Error> >
+class ThreadedJobMixin : public T_base, public GpgME::ProgressProvider
+{
+public:
+ typedef ThreadedJobMixin<T_base, T_result> mixin_type;
+ typedef T_result result_type;
+
+protected:
+ static_assert(std::tuple_size<T_result>::value > 2,
+ "Result tuple too small");
+ static_assert(std::is_same <
+ typename std::tuple_element <
+ std::tuple_size<T_result>::value - 2,
+ T_result
+ >::type,
+ QString
+ >::value,
+ "Second to last result type not a QString");
+ static_assert(std::is_same <
+ typename std::tuple_element <
+ std::tuple_size<T_result>::value - 1,
+ T_result
+ >::type,
+ GpgME::Error
+ >::value,
+ "Last result type not a GpgME::Error");
+
+ explicit ThreadedJobMixin(GpgME::Context *ctx)
+ : T_base(0), m_ctx(ctx), m_thread(), m_auditLog(), m_auditLogError()
+ {
+
+ }
+
+ void lateInitialization()
+ {
+ assert(m_ctx);
+ QObject::connect(&m_thread, SIGNAL(finished()), this, SLOT(slotFinished()));
+ m_ctx->setProgressProvider(this);
+ }
+
+ template <typename T_binder>
+ void run(const T_binder &func)
+ {
+ m_thread.setFunction(std::bind(func, this->context()));
+ m_thread.start();
+ }
+ template <typename T_binder>
+ void run(const T_binder &func, const std::shared_ptr<QIODevice> &io)
+ {
+ if (io) {
+ io->moveToThread(&m_thread);
+ }
+ // the arguments passed here to the functor are stored in a QThread, and are not
+ // necessarily destroyed (living outside the UI thread) at the time the result signal
+ // is emitted and the signal receiver wants to clean up IO devices.
+ // To avoid such races, we pass std::weak_ptr's to the functor.
+ m_thread.setFunction(std::bind(func, this->context(), this->thread(), std::weak_ptr<QIODevice>(io)));
+ m_thread.start();
+ }
+ template <typename T_binder>
+ void run(const T_binder &func, const std::shared_ptr<QIODevice> &io1, const std::shared_ptr<QIODevice> &io2)
+ {
+ if (io1) {
+ io1->moveToThread(&m_thread);
+ }
+ if (io2) {
+ io2->moveToThread(&m_thread);
+ }
+ // the arguments passed here to the functor are stored in a QThread, and are not
+ // necessarily destroyed (living outside the UI thread) at the time the result signal
+ // is emitted and the signal receiver wants to clean up IO devices.
+ // To avoid such races, we pass std::weak_ptr's to the functor.
+ m_thread.setFunction(std::bind(func, this->context(), this->thread(), std::weak_ptr<QIODevice>(io1), std::weak_ptr<QIODevice>(io2)));
+ m_thread.start();
+ }
+ GpgME::Context *context() const
+ {
+ return m_ctx.get();
+ }
+
+ virtual void resultHook(const result_type &) {}
+
+ void slotFinished()
+ {
+ const T_result r = m_thread.result();
+ m_auditLog = std::get < std::tuple_size<T_result>::value - 2 > (r);
+ m_auditLogError = std::get < std::tuple_size<T_result>::value - 1 > (r);
+ resultHook(r);
+ Q_EMIT this->done();
+ doEmitResult(r);
+ this->deleteLater();
+ }
+ void slotCancel() Q_DECL_OVERRIDE {
+ if (m_ctx)
+ {
+ m_ctx->cancelPendingOperation();
+ }
+ }
+ QString auditLogAsHtml() const Q_DECL_OVERRIDE
+ {
+ return m_auditLog;
+ }
+ GpgME::Error auditLogError() const Q_DECL_OVERRIDE
+ {
+ return m_auditLogError;
+ }
+ void showProgress(const char *what, int type, int current, int total) Q_DECL_OVERRIDE {
+ // will be called from the thread exec'ing the operation, so
+ // just bounce everything to the owning thread:
+ // ### hope this is thread-safe (meta obj is const, and
+ // ### portEvent is thread-safe, so should be ok)
+ QMetaObject::invokeMethod(this, "progress", Qt::QueuedConnection,
+ // TODO port
+ Q_ARG(QString, QString()),
+ Q_ARG(int, current),
+ Q_ARG(int, total));
+ }
+private:
+ template <typename T1, typename T2>
+ void doEmitResult(const std::tuple<T1, T2> &tuple)
+ {
+ Q_EMIT this->result(std::get<0>(tuple), std::get<1>(tuple));
+ }
+
+ template <typename T1, typename T2, typename T3>
+ void doEmitResult(const std::tuple<T1, T2, T3> &tuple)
+ {
+ Q_EMIT this->result(std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple));
+ }
+
+ template <typename T1, typename T2, typename T3, typename T4>
+ void doEmitResult(const std::tuple<T1, T2, T3, T4> &tuple)
+ {
+ Q_EMIT this->result(std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), std::get<3>(tuple));
+ }
+
+ template <typename T1, typename T2, typename T3, typename T4, typename T5>
+ void doEmitResult(const std::tuple<T1, T2, T3, T4, T5> &tuple)
+ {
+ Q_EMIT this->result(std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), std::get<3>(tuple), std::get<4>(tuple));
+ }
+
+private:
+ std::shared_ptr<GpgME::Context> m_ctx;
+ Thread<T_result> m_thread;
+ QString m_auditLog;
+ GpgME::Error m_auditLogError;
+};
+
+}
+}
+
+#endif /* __QGPGME_THREADEDJOBMIXING_H__ */
diff --git a/lang/qt/src/tofupolicyjob.h b/lang/qt/src/tofupolicyjob.h
new file mode 100644
index 0000000..3079f91
--- /dev/null
+++ b/lang/qt/src/tofupolicyjob.h
@@ -0,0 +1,80 @@
+/* tofupolicyjob.h
+
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+#ifndef QGPGME_TOFUPOLICYJOB_H
+#define QGPGME_TOFUPOLICYJOB_H
+
+#include "job.h"
+
+#include "qgpgme_export.h"
+
+#ifdef BUILDING_QGPGME
+# include "tofuinfo.h"
+#else
+# include <gpgme++/tofuinfo.h>
+#endif
+
+namespace GpgME
+{
+ class Key;
+} // namespace GpgME
+
+namespace QGpgME {
+
+/**
+ * Set the TOFU Policy for a key
+ */
+class QGPGME_EXPORT TofuPolicyJob: public Job
+{
+ Q_OBJECT
+protected:
+ explicit TofuPolicyJob(QObject *parent);
+public:
+ ~TofuPolicyJob();
+
+
+ /* Set the policy to \a policy see the gpgme manual for
+ * policy explanations. */
+ virtual void start(const GpgME::Key &key, GpgME::TofuInfo::Policy policy) = 0;
+
+ virtual GpgME::Error exec(const GpgME::Key &key, GpgME::TofuInfo::Policy policy) = 0;
+
+Q_SIGNALS:
+ /* Result of the operation
+ *
+ * As usual auditLogAsHtml and auditLogError can be ignored.
+ **/
+ void result(const GpgME::Error &error,
+ const QString &auditLogAsHtml = QString(),
+ const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif
diff --git a/lang/qt/src/verifydetachedjob.h b/lang/qt/src/verifydetachedjob.h
new file mode 100644
index 0000000..b339a8c
--- /dev/null
+++ b/lang/qt/src/verifydetachedjob.h
@@ -0,0 +1,99 @@
+/*
+ verifydetachedjob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004, 2007 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_VERIFYDETACHEDJOB_H__
+#define __KLEO_VERIFYDETACHEDJOB_H__
+
+#include "job.h"
+#include "qgpgme_export.h"
+
+#include <memory>
+
+class QByteArray;
+class QIODevice;
+
+namespace GpgME
+{
+class Error;
+class VerificationResult;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for asynchronous verification of detached signatures
+
+ To use a VerifyDetachedJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the verification with a
+ call to start(). This call might fail, in which case the
+ VerifyDetachedJob instance will have scheduled it's own
+ destruction with a call to QObject::deleteLater().
+
+ After result() is emitted, the VerifyDetachedJob will schedule
+ it's own destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT VerifyDetachedJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit VerifyDetachedJob(QObject *parent);
+public:
+ ~VerifyDetachedJob();
+
+ /**
+ Starts the verification operation. \a signature contains the
+ signature data, while \a signedData contains the data over
+ which the signature was made.
+ */
+ virtual QGPGME_DEPRECATED_EXPORT GpgME::Error start(const QByteArray &signature,
+ const QByteArray &signedData) = 0;
+
+ /*!
+ \overload
+
+ \throws GpgME::Exception if starting fails.
+ */
+ virtual void start(const std::shared_ptr<QIODevice> &signature, const std::shared_ptr<QIODevice> &signedData) = 0;
+
+ virtual GpgME::VerificationResult exec(const QByteArray &signature,
+ const QByteArray &signedData) = 0;
+
+Q_SIGNALS:
+ void result(const GpgME::VerificationResult &result, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_VERIFYDETACHEDJOB_H__
diff --git a/lang/qt/src/verifyopaquejob.h b/lang/qt/src/verifyopaquejob.h
new file mode 100644
index 0000000..f064049
--- /dev/null
+++ b/lang/qt/src/verifyopaquejob.h
@@ -0,0 +1,101 @@
+/*
+ verifyopaquejob.h
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2004, 2007 Klarälvdalens Datakonsult AB
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef __KLEO_VERIFYOPAQUEJOB_H__
+#define __KLEO_VERIFYOPAQUEJOB_H__
+
+#include "job.h"
+
+#include <memory>
+
+class QByteArray;
+class QIODevice;
+
+namespace GpgME
+{
+class Error;
+class VerificationResult;
+}
+
+namespace QGpgME
+{
+
+/**
+ @short An abstract base class for asynchronous verification of opaque signatures
+
+ To use a VerifyOpaqueJob, first obtain an instance from the
+ CryptoBackend implementation, connect the progress() and result()
+ signals to suitable slots and then start the verification with a
+ call to start(). This call might fail, in which case the
+ VerifyOpaqueJob instance will have scheduled it's own
+ destruction with a call to QObject::deleteLater().
+
+ After result() is emitted, the VerifyOpaqueJob will schedule
+ it's own destruction by calling QObject::deleteLater().
+*/
+class QGPGME_EXPORT VerifyOpaqueJob : public Job
+{
+ Q_OBJECT
+protected:
+ explicit VerifyOpaqueJob(QObject *parent);
+public:
+ ~VerifyOpaqueJob();
+
+ /**
+ Starts the verification operation. \a signature contains the
+ signature data, while \a signedData contains the data over
+ which the signature was made.
+ */
+ virtual QGPGME_DEPRECATED_EXPORT GpgME::Error start(const QByteArray &signedData) = 0;
+
+ /*!
+ \overload
+
+ If \a plainText is non-null, the plaintext is written
+ there. Otherwise, it will be delivered in the second argument
+ of result().
+
+ \throws GpgME::Exception if starting fails
+ */
+ virtual void start(const std::shared_ptr<QIODevice> &signedData, const std::shared_ptr<QIODevice> &plainText = std::shared_ptr<QIODevice>()) = 0;
+
+ /** Synchronous version of @ref start */
+ virtual GpgME::VerificationResult exec(const QByteArray &signedData, QByteArray &plainText) = 0;
+
+Q_SIGNALS:
+ void result(const GpgME::VerificationResult &result, const QByteArray &plainText, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif // __KLEO_VERIFYOPAQUEJOB_H__
diff --git a/lang/qt/src/wkspublishjob.h b/lang/qt/src/wkspublishjob.h
new file mode 100644
index 0000000..782112f
--- /dev/null
+++ b/lang/qt/src/wkspublishjob.h
@@ -0,0 +1,101 @@
+/* wkspublishjob.h
+
+ Copyright (c) 2016 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME 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
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+#ifndef QGPGME_WKSPUBLISHJOB_H
+#define QGPGME_WKSPUBLISHJOB_H
+
+#include "job.h"
+
+#include "qgpgme_export.h"
+
+namespace GpgME
+{
+ class Key;
+} // namespace GpgME
+
+namespace QGpgME {
+
+/**
+ * Handles Web Key Service Publishing. Needs WKS tools installed and
+ * server support.
+ *
+ * Remember that after a result is emited the job is auto deleted
+ * so you can only use it for a single action.
+ */
+class QGPGME_EXPORT WKSPublishJob: public Job
+{
+ Q_OBJECT
+protected:
+ explicit WKSPublishJob(QObject *parent);
+public:
+ ~WKSPublishJob();
+
+
+ /** Start a check if WKS Publishing is supported. As this involves
+ * an HTTP Query it might take a while. Returns GPG_ERR_NOT_SUPPORED
+ * result if GnuPG is too old or the required tools are not installed.
+ *
+ * The error GPG_ERR_NOT_ENABLED indicates that wks-tools failed to
+ * detect a working wks service for this.
+ *
+ * @param the mailbox to check for.
+ **/
+ virtual void startCheck(const QString &mailbox) = 0;
+
+ /** Create a publish request.
+ * The returned Data from the result will contain
+ * the full Mail as returned by gpg-wks-client --create
+ *
+ * @param fpr the fingerprint of the key to create the request for.
+ * @param mailbox A simple mail address without a Name.
+ */
+ virtual void startCreate(const char *fpr, const QString &mailbox) = 0;
+
+ /** Handle a submisson response. The returned Data will contain
+ * the full Mail as returned by gpg-wks-client --create
+ *
+ * @param response The response of the server.
+ **/
+ virtual void startRecieve(const QByteArray &response) = 0;
+
+Q_SIGNALS:
+ /* Result of the operation returned Data and returned Error are
+ * the results from gpg-wks-client's stdout or stderr respectively.
+ *
+ * As usual auditLogAsHtml and auditLogError can be ignored.
+ **/
+ void result(const GpgME::Error &error, const QByteArray &returnedData,
+ const QByteArray &returnedError,
+ const QString &auditLogAsHtml = QString(),
+ const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif