2016-03-08 13:33:15 +00:00
|
|
|
/* dataprovider.cpp
|
2016-09-22 22:23:04 +00:00
|
|
|
Copyright (C) 2004 Klarävdalens Datakonsult AB
|
Change copyright from Intevation to BSI
* lang/cpp/src/gpggencardkeyinteractor.cpp,
lang/cpp/src/gpggencardkeyinteractor.h,
lang/cpp/src/gpgmepp_export.h,
lang/cpp/src/swdbresult.cpp,
lang/cpp/src/swdbresult.h,
lang/cpp/src/tofuinfo.cpp,
lang/cpp/src/tofuinfo.h,
lang/qt/src/abstractimportjob.h,
lang/qt/src/adduseridjob.h,
lang/qt/src/changeexpiryjob.h,
lang/qt/src/changeownertrustjob.h,
lang/qt/src/changepasswdjob.h,
lang/qt/src/cryptoconfig.cpp,
lang/qt/src/cryptoconfig.h,
lang/qt/src/dataprovider.cpp,
lang/qt/src/dataprovider.h,
lang/qt/src/decryptjob.h,
lang/qt/src/decryptverifyjob.h,
lang/qt/src/deletejob.h,
lang/qt/src/dn.cpp,
lang/qt/src/dn.h,
lang/qt/src/downloadjob.h,
lang/qt/src/encryptjob.h,
lang/qt/src/exportjob.h,
lang/qt/src/hierarchicalkeylistjob.h,
lang/qt/src/importfromkeyserverjob.h,
lang/qt/src/importjob.h,
lang/qt/src/job.cpp,
lang/qt/src/job.h,
lang/qt/src/keyformailboxjob.h,
lang/qt/src/keygenerationjob.h,
lang/qt/src/keylistjob.h,
lang/qt/src/listallkeysjob.h,
lang/qt/src/multideletejob.h,
lang/qt/src/protocol.h,
lang/qt/src/protocol_p.h,
lang/qt/src/qgpgme_export.h,
lang/qt/src/qgpgmeadduseridjob.cpp,
lang/qt/src/qgpgmeadduseridjob.h,
lang/qt/src/qgpgmebackend.cpp,
lang/qt/src/qgpgmebackend.h,
lang/qt/src/qgpgmechangeexpiryjob.cpp,
lang/qt/src/qgpgmechangeexpiryjob.h,
lang/qt/src/qgpgmechangeownertrustjob.cpp,
lang/qt/src/qgpgmechangeownertrustjob.h,
lang/qt/src/qgpgmechangepasswdjob.cpp,
lang/qt/src/qgpgmechangepasswdjob.h,
lang/qt/src/qgpgmedecryptjob.cpp,
lang/qt/src/qgpgmedecryptjob.h,
lang/qt/src/qgpgmedecryptverifyjob.cpp,
lang/qt/src/qgpgmedecryptverifyjob.h,
lang/qt/src/qgpgmedeletejob.cpp,
lang/qt/src/qgpgmedeletejob.h,
lang/qt/src/qgpgmedownloadjob.cpp,
lang/qt/src/qgpgmedownloadjob.h,
lang/qt/src/qgpgmeencryptjob.cpp,
lang/qt/src/qgpgmeencryptjob.h,
lang/qt/src/qgpgmeexportjob.cpp,
lang/qt/src/qgpgmeexportjob.h,
lang/qt/src/qgpgmeimportfromkeyserverjob.cpp,
lang/qt/src/qgpgmeimportfromkeyserverjob.h,
lang/qt/src/qgpgmeimportjob.cpp,
lang/qt/src/qgpgmeimportjob.h,
lang/qt/src/qgpgmekeyformailboxjob.cpp,
lang/qt/src/qgpgmekeyformailboxjob.h,
lang/qt/src/qgpgmekeygenerationjob.cpp,
lang/qt/src/qgpgmekeygenerationjob.h,
lang/qt/src/qgpgmekeylistjob.cpp,
lang/qt/src/qgpgmekeylistjob.h,
lang/qt/src/qgpgmelistallkeysjob.cpp,
lang/qt/src/qgpgmelistallkeysjob.h,
lang/qt/src/qgpgmenewcryptoconfig.cpp,
lang/qt/src/qgpgmenewcryptoconfig.h,
lang/qt/src/qgpgmerefreshkeysjob.cpp,
lang/qt/src/qgpgmerefreshkeysjob.h,
lang/qt/src/qgpgmesecretkeyexportjob.cpp,
lang/qt/src/qgpgmesecretkeyexportjob.h,
lang/qt/src/qgpgmesignencryptjob.cpp,
lang/qt/src/qgpgmesignencryptjob.h,
lang/qt/src/qgpgmesignjob.cpp,
lang/qt/src/qgpgmesignjob.h,
lang/qt/src/qgpgmesignkeyjob.cpp,
lang/qt/src/qgpgmesignkeyjob.h,
lang/qt/src/qgpgmetofupolicyjob.cpp,
lang/qt/src/qgpgmetofupolicyjob.h,
lang/qt/src/qgpgmeverifydetachedjob.cpp,
lang/qt/src/qgpgmeverifydetachedjob.h,
lang/qt/src/qgpgmeverifyopaquejob.cpp,
lang/qt/src/qgpgmeverifyopaquejob.h,
lang/qt/src/qgpgmewkspublishjob.cpp,
lang/qt/src/qgpgmewkspublishjob.h,
lang/qt/src/refreshkeysjob.h,
lang/qt/src/signencryptjob.h,
lang/qt/src/signjob.h,
lang/qt/src/signkeyjob.h,
lang/qt/src/specialjob.h,
lang/qt/src/threadedjobmixin.cpp,
lang/qt/src/threadedjobmixin.h,
lang/qt/src/tofupolicyjob.h,
lang/qt/src/verifydetachedjob.h,
lang/qt/src/verifyopaquejob.h,
lang/qt/src/wkspublishjob.h,
lang/qt/tests/run-keyformailboxjob.cpp,
lang/qt/tests/t-config.cpp,
lang/qt/tests/t-encrypt.cpp,
lang/qt/tests/t-keylist.cpp,
lang/qt/tests/t-keylocate.cpp,
lang/qt/tests/t-ownertrust.cpp,
lang/qt/tests/t-support.cpp,
lang/qt/tests/t-support.h,
lang/qt/tests/t-tofuinfo.cpp,
lang/qt/tests/t-various.cpp,
lang/qt/tests/t-verify.cpp,
lang/qt/tests/t-wkspublish.cpp,
tests/gpg/t-encrypt-mixed.c,
tests/gpg/t-thread-keylist-verify.c,
tests/gpg/t-thread-keylist.c,
tests/run-decrypt.c: Change Intevation GmbH copyright to BSI.
--
This should make it more transparent where the BSI is the actual
copyright holder as the code was mostly developed as part of a
development contract.
2017-04-25 08:24:11 +00:00
|
|
|
Copyright (c) 2016 by Bundesamt für Sicherheit in der Informationstechnik
|
|
|
|
Software engineering by Intevation GmbH
|
2016-03-08 13:33:15 +00:00
|
|
|
|
|
|
|
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++ -*-
|
|
|
|
|
cpp, qt: Include config.h
lang/cpp/src/callbacks.cpp,
lang/cpp/src/configuration.cpp,
lang/cpp/src/context.cpp,
lang/cpp/src/context_glib.cpp,
lang/cpp/src/context_qt.cpp,
lang/cpp/src/context_vanilla.cpp,
lang/cpp/src/data.cpp,
lang/cpp/src/decryptionresult.cpp,
lang/cpp/src/defaultassuantransaction.cpp,
lang/cpp/src/editinteractor.cpp,
lang/cpp/src/encryptionresult.cpp,
lang/cpp/src/engineinfo.cpp,
lang/cpp/src/eventloopinteractor.cpp,
lang/cpp/src/exception.cpp,
lang/cpp/src/gpgadduserideditinteractor.cpp,
lang/cpp/src/gpgagentgetinfoassuantransaction.cpp,
lang/cpp/src/gpgsetexpirytimeeditinteractor.cpp,
lang/cpp/src/gpgsetownertrusteditinteractor.cpp,
lang/cpp/src/gpgsignkeyeditinteractor.cpp,
lang/cpp/src/importresult.cpp,
lang/cpp/src/key.cpp,
lang/cpp/src/keygenerationresult.cpp,
lang/cpp/src/keylistresult.cpp,
lang/cpp/src/scdgetinfoassuantransaction.cpp,
lang/cpp/src/signingresult.cpp,
lang/cpp/src/tofuinfo.cpp,
lang/cpp/src/trustitem.cpp,
lang/cpp/src/verificationresult.cpp,
lang/cpp/src/vfsmountresult.cpp,
lang/qt/src/dataprovider.cpp,
lang/qt/src/defaultkeygenerationjob.cpp,
lang/qt/src/gpgme_backend_debug.cpp,
lang/qt/src/job.cpp,
lang/qt/src/qgpgmeadduseridjob.cpp,
lang/qt/src/qgpgmebackend.cpp,
lang/qt/src/qgpgmechangeexpiryjob.cpp,
lang/qt/src/qgpgmechangeownertrustjob.cpp,
lang/qt/src/qgpgmechangepasswdjob.cpp,
lang/qt/src/qgpgmedecryptjob.cpp,
lang/qt/src/qgpgmedecryptverifyjob.cpp,
lang/qt/src/qgpgmedeletejob.cpp,
lang/qt/src/qgpgmedownloadjob.cpp,
lang/qt/src/qgpgmeencryptjob.cpp,
lang/qt/src/qgpgmeexportjob.cpp,
lang/qt/src/qgpgmeimportfromkeyserverjob.cpp,
lang/qt/src/qgpgmeimportjob.cpp,
lang/qt/src/qgpgmekeyformailboxjob.cpp,
lang/qt/src/qgpgmekeygenerationjob.cpp,
lang/qt/src/qgpgmekeylistjob.cpp,
lang/qt/src/qgpgmelistallkeysjob.cpp,
lang/qt/src/qgpgmenewcryptoconfig.cpp,
lang/qt/src/qgpgmerefreshkeysjob.cpp,
lang/qt/src/qgpgmesecretkeyexportjob.cpp,
lang/qt/src/qgpgmesignencryptjob.cpp,
lang/qt/src/qgpgmesignjob.cpp,
lang/qt/src/qgpgmesignkeyjob.cpp,
lang/qt/src/qgpgmetofupolicyjob.cpp,
lang/qt/src/qgpgmeverifydetachedjob.cpp,
lang/qt/src/qgpgmeverifyopaquejob.cpp,
lang/qt/src/qgpgmewkspublishjob.cpp,
lang/qt/src/threadedjobmixin.cpp,
lang/qt/tests/run-keyformailboxjob.cpp,
lang/qt/tests/t-encrypt.cpp,
lang/qt/tests/t-keylist.cpp,
lang/qt/tests/t-keylocate.cpp,
lang/qt/tests/t-ownertrust.cpp,
lang/qt/tests/t-support.cpp,
lang/qt/tests/t-tofuinfo.cpp,
lang/qt/tests/t-wkspublish.cpp: Include config.h
--
This fixes problems with mismatching definitions. Most
notably _FILE_OFFSET_BITS is now always set correctly.
2016-09-23 13:22:29 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
|
2016-03-08 13:33:15 +00:00
|
|
|
#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
|
|
|
|
//
|
|
|
|
//
|
|
|
|
|
Cpp / Qt: Reduce boost usage (memory and tuple)
* cpp/src/assuanresult.h,
cpp/src/configuration.cpp,
cpp/src/configuration.h,
cpp/src/data.h,
cpp/src/decryptionresult.h,
cpp/src/defaultassuantransaction.cpp,
cpp/src/encryptionresult.cpp,
cpp/src/encryptionresult.h,
cpp/src/engineinfo.h,
cpp/src/gpgagentgetinfoassuantransaction.cpp,
cpp/src/gpgsignkeyeditinteractor.cpp,
cpp/src/importresult.cpp,
cpp/src/importresult.h,
cpp/src/key.h,
cpp/src/keygenerationresult.h,
cpp/src/keylistresult.h,
cpp/src/notation.h,
cpp/src/signingresult.cpp,
cpp/src/signingresult.h,
cpp/src/verificationresult.cpp,
cpp/src/verificationresult.h,
cpp/src/vfsmountresult.h,
qt/src/dataprovider.cpp,
qt/src/dataprovider.h,
qt/src/decryptjob.h,
qt/src/decryptverifyjob.h,
qt/src/downloadjob.h,
qt/src/encryptjob.h,
qt/src/qgpgmeadduseridjob.cpp,
qt/src/qgpgmechangeexpiryjob.cpp,
qt/src/qgpgmechangeownertrustjob.cpp,
qt/src/qgpgmechangepasswdjob.cpp,
qt/src/qgpgmedecryptjob.cpp,
qt/src/qgpgmedecryptjob.h,
qt/src/qgpgmedecryptverifyjob.cpp,
qt/src/qgpgmedecryptverifyjob.h,
qt/src/qgpgmedeletejob.cpp,
qt/src/qgpgmedownloadjob.cpp,
qt/src/qgpgmedownloadjob.h,
qt/src/qgpgmeencryptjob.cpp,
qt/src/qgpgmeencryptjob.h,
qt/src/qgpgmeexportjob.cpp,
qt/src/qgpgmeexportjob.h,
qt/src/qgpgmeimportfromkeyserverjob.cpp,
qt/src/qgpgmeimportfromkeyserverjob.h,
qt/src/qgpgmeimportjob.cpp,
qt/src/qgpgmeimportjob.h,
qt/src/qgpgmekeygenerationjob.cpp,
qt/src/qgpgmekeygenerationjob.h,
qt/src/qgpgmekeylistjob.cpp,
qt/src/qgpgmekeylistjob.h,
qt/src/qgpgmelistallkeysjob.cpp,
qt/src/qgpgmelistallkeysjob.h,
qt/src/qgpgmenewcryptoconfig.cpp,
qt/src/qgpgmenewcryptoconfig.h,
qt/src/qgpgmesignencryptjob.cpp,
qt/src/qgpgmesignencryptjob.h,
qt/src/qgpgmesignjob.cpp,
qt/src/qgpgmesignjob.h,
qt/src/qgpgmesignkeyjob.cpp,
qt/src/qgpgmeverifydetachedjob.cpp,
qt/src/qgpgmeverifydetachedjob.h,
qt/src/qgpgmeverifyopaquejob.cpp,
qt/src/qgpgmeverifyopaquejob.h,
qt/src/signencryptjob.h,
qt/src/signjob.h,
qt/src/threadedjobmixin.h,
qt/src/verifydetachedjob.h,
qt/src/verifyopaquejob.h: Reduce boost usage.
--
This was mostly done with search and replace to change the
templates / classes from memory and tuple to their c++11
equivalents.
2016-04-03 12:52:16 +00:00
|
|
|
QIODeviceDataProvider::QIODeviceDataProvider(const std::shared_ptr<QIODevice> &io)
|
2016-03-08 13:33:15 +00:00
|
|
|
: 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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Cpp / Qt: Reduce boost usage (memory and tuple)
* cpp/src/assuanresult.h,
cpp/src/configuration.cpp,
cpp/src/configuration.h,
cpp/src/data.h,
cpp/src/decryptionresult.h,
cpp/src/defaultassuantransaction.cpp,
cpp/src/encryptionresult.cpp,
cpp/src/encryptionresult.h,
cpp/src/engineinfo.h,
cpp/src/gpgagentgetinfoassuantransaction.cpp,
cpp/src/gpgsignkeyeditinteractor.cpp,
cpp/src/importresult.cpp,
cpp/src/importresult.h,
cpp/src/key.h,
cpp/src/keygenerationresult.h,
cpp/src/keylistresult.h,
cpp/src/notation.h,
cpp/src/signingresult.cpp,
cpp/src/signingresult.h,
cpp/src/verificationresult.cpp,
cpp/src/verificationresult.h,
cpp/src/vfsmountresult.h,
qt/src/dataprovider.cpp,
qt/src/dataprovider.h,
qt/src/decryptjob.h,
qt/src/decryptverifyjob.h,
qt/src/downloadjob.h,
qt/src/encryptjob.h,
qt/src/qgpgmeadduseridjob.cpp,
qt/src/qgpgmechangeexpiryjob.cpp,
qt/src/qgpgmechangeownertrustjob.cpp,
qt/src/qgpgmechangepasswdjob.cpp,
qt/src/qgpgmedecryptjob.cpp,
qt/src/qgpgmedecryptjob.h,
qt/src/qgpgmedecryptverifyjob.cpp,
qt/src/qgpgmedecryptverifyjob.h,
qt/src/qgpgmedeletejob.cpp,
qt/src/qgpgmedownloadjob.cpp,
qt/src/qgpgmedownloadjob.h,
qt/src/qgpgmeencryptjob.cpp,
qt/src/qgpgmeencryptjob.h,
qt/src/qgpgmeexportjob.cpp,
qt/src/qgpgmeexportjob.h,
qt/src/qgpgmeimportfromkeyserverjob.cpp,
qt/src/qgpgmeimportfromkeyserverjob.h,
qt/src/qgpgmeimportjob.cpp,
qt/src/qgpgmeimportjob.h,
qt/src/qgpgmekeygenerationjob.cpp,
qt/src/qgpgmekeygenerationjob.h,
qt/src/qgpgmekeylistjob.cpp,
qt/src/qgpgmekeylistjob.h,
qt/src/qgpgmelistallkeysjob.cpp,
qt/src/qgpgmelistallkeysjob.h,
qt/src/qgpgmenewcryptoconfig.cpp,
qt/src/qgpgmenewcryptoconfig.h,
qt/src/qgpgmesignencryptjob.cpp,
qt/src/qgpgmesignencryptjob.h,
qt/src/qgpgmesignjob.cpp,
qt/src/qgpgmesignjob.h,
qt/src/qgpgmesignkeyjob.cpp,
qt/src/qgpgmeverifydetachedjob.cpp,
qt/src/qgpgmeverifydetachedjob.h,
qt/src/qgpgmeverifyopaquejob.cpp,
qt/src/qgpgmeverifyopaquejob.h,
qt/src/signencryptjob.h,
qt/src/signjob.h,
qt/src/threadedjobmixin.h,
qt/src/verifydetachedjob.h,
qt/src/verifyopaquejob.h: Reduce boost usage.
--
This was mostly done with search and replace to change the
templates / classes from memory and tuple to their c++11
equivalents.
2016-04-03 12:52:16 +00:00
|
|
|
static qint64 blocking_read(const std::shared_ptr<QIODevice> &io, char *buffer, qint64 maxSize)
|
2016-03-08 13:33:15 +00:00
|
|
|
{
|
|
|
|
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) {
|
2017-11-14 13:28:32 +00:00
|
|
|
if (io->atEnd()) {
|
|
|
|
// EOF
|
|
|
|
return 0;
|
|
|
|
} // continue reading even if process ended to ensure
|
|
|
|
// everything is read.
|
2016-03-08 13:33:15 +00:00
|
|
|
} 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();
|
|
|
|
}
|