Add qgpgme as qt language binding
* configure.ac: Add version defines. Check for qt if neccessary. * lang/README: Mention qt * lang/cpp/src/GpgmeppConfig.cmake.in.in: Remove comment. Find qgpgme. * lang/qt/src/Makefile.am: New. Build qgpgme. * lang/qt/README, lang/qt/src/Makefile.am, lang/qt/src/QGpgmeConfig.cmake.in.in, lang/qt/src/QGpgmeConfigVersion.cmake.in, lang/qt/src/dataprovider.cpp, lang/qt/src/dataprovider.h, lang/qt/src/qgpgme_export.h, m4/qt.m4: New. * lang/cpp/src/GpgmeppConfig.cmake.in.in, lang/cpp/src/Makefile.am: Fix generated config file. -- For now this is just the dataprovider which was part of the KF5 Gpgmepp QGpgme variant. This is very thin but a useful class which is used downstream.
This commit is contained in:
parent
58ed9c17f0
commit
8347f3d5fc
32
configure.ac
32
configure.ac
@ -65,6 +65,10 @@ LIBGPGMEPP_LT_CURRENT=3
|
||||
LIBGPGMEPP_LT_AGE=0
|
||||
LIBGPGMEPP_LT_REVISION=0
|
||||
|
||||
LIBQGPGME_LT_CURRENT=1
|
||||
LIBQGPGME_LT_AGE=0
|
||||
LIBQGPGME_LT_REVISION=0
|
||||
|
||||
# If the API is changed in an incompatible way: increment the next counter.
|
||||
GPGME_CONFIG_API_VERSION=1
|
||||
##############################################
|
||||
@ -111,6 +115,9 @@ AC_SUBST(LIBGPGME_LT_REVISION)
|
||||
AC_SUBST(LIBGPGMEPP_LT_CURRENT)
|
||||
AC_SUBST(LIBGPGMEPP_LT_AGE)
|
||||
AC_SUBST(LIBGPGMEPP_LT_REVISION)
|
||||
AC_SUBST(LIBQGPGME_LT_CURRENT)
|
||||
AC_SUBST(LIBQGPGME_LT_AGE)
|
||||
AC_SUBST(LIBQGPGME_LT_REVISION)
|
||||
|
||||
AC_SUBST(PACKAGE)
|
||||
AC_SUBST(VERSION)
|
||||
@ -153,8 +160,8 @@ have_w32_system=no
|
||||
have_w64_system=no
|
||||
build_w32_glib=no
|
||||
build_w32_qt=no
|
||||
available_languages="cpp cl"
|
||||
default_languages="cpp cl"
|
||||
available_languages="cpp cl qt"
|
||||
default_languages="cpp cl qt"
|
||||
case "${host}" in
|
||||
x86_64-*mingw32*)
|
||||
have_w64_system=yes
|
||||
@ -259,6 +266,24 @@ for language in $enabled_languages; do
|
||||
AC_MSG_ERROR([unsupported language binding specified])
|
||||
fi
|
||||
done
|
||||
# Check that if qt is enabled cpp also is enabled
|
||||
LIST_MEMBER("qt", $enabled_languages)
|
||||
if test "$found" = "1"; then
|
||||
LIST_MEMBER("cpp", $enabled_languages)
|
||||
if test "$found" = "0"; then
|
||||
AC_MSG_ERROR([qt binding depends on cpp language binding])
|
||||
fi
|
||||
FIND_QT
|
||||
if test "$have_qt5_libs" != "yes"; then
|
||||
AC_MSG_ERROR([[
|
||||
***
|
||||
*** Qt5 (Qt5Core) is required for qt binding.
|
||||
***]])
|
||||
fi
|
||||
# Make sure that qt comes after cpp
|
||||
enabled_languages=`echo $enabled_languages | sed 's/qt//'`
|
||||
enabled_languages=`echo $enabled_languages qt`
|
||||
fi
|
||||
AC_SUBST(ENABLED_LANGUAGES, $enabled_languages)
|
||||
|
||||
#
|
||||
@ -650,6 +675,9 @@ AC_CONFIG_FILES(src/gpgme-config, chmod +x src/gpgme-config)
|
||||
AC_CONFIG_FILES(lang/cpp/Makefile lang/cpp/src/Makefile)
|
||||
AC_CONFIG_FILES(lang/cpp/src/GpgmeppConfig.cmake.in)
|
||||
AC_CONFIG_FILES(lang/cpp/src/GpgmeppConfigVersion.cmake)
|
||||
AC_CONFIG_FILES(lang/qt/Makefile lang/qt/src/Makefile)
|
||||
AC_CONFIG_FILES(lang/qt/src/QGpgmeConfig.cmake.in)
|
||||
AC_CONFIG_FILES(lang/qt/src/QGpgmeConfigVersion.cmake)
|
||||
AC_CONFIG_FILES([lang/Makefile lang/cl/Makefile lang/cl/gpgme.asd])
|
||||
AC_OUTPUT
|
||||
|
||||
|
@ -11,3 +11,4 @@ Directory Language
|
||||
|
||||
cl Common Lisp
|
||||
cpp C++
|
||||
qt Qt-Framework API
|
||||
|
@ -37,7 +37,7 @@ set(CMAKE_IMPORT_FILE_VERSION 1)
|
||||
set(_targetsDefined)
|
||||
set(_targetsNotDefined)
|
||||
set(_expectedTargets)
|
||||
foreach(_expectedTarget KF5::Gpgmepp KF5::QGpgme)
|
||||
foreach(_expectedTarget KF5::Gpgmepp Gpgmepp)
|
||||
list(APPEND _expectedTargets ${_expectedTarget})
|
||||
if(NOT TARGET ${_expectedTarget})
|
||||
list(APPEND _targetsNotDefined ${_expectedTarget})
|
||||
@ -69,18 +69,10 @@ add_library(Gpgmepp SHARED IMPORTED)
|
||||
|
||||
set_target_properties(Gpgmepp PROPERTIES
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include/gpgme++"
|
||||
INTERFACE_LINK_LIBRARIES "@libdir@/libgpgme.dll.a;@LIBASSUAN_LIBS@;@GPG_ERROR_LIBS@"
|
||||
INTERFACE_LINK_LIBRARIES "@resolved_libdir@/libgpgme@libsuffix@;@LIBASSUAN_LIBS@;@GPG_ERROR_LIBS@"
|
||||
IMPORTED_LOCATION "@resolved_libdir@/libgpgmepp@libsuffix@"
|
||||
)
|
||||
|
||||
# Create imported target QGpgme
|
||||
#add_library(QGpgme SHARED IMPORTED)
|
||||
|
||||
#set_target_properties(KF5::QGpgme PROPERTIES
|
||||
# INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include/qgpgme"
|
||||
# INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX} TODO"
|
||||
# INTERFACE_LINK_LIBRARIES "Qt5::Core"
|
||||
#)
|
||||
|
||||
if(CMAKE_VERSION VERSION_LESS 2.8.12)
|
||||
message(FATAL_ERROR "This file relies on consumers using CMake 2.8.12 or greater.")
|
||||
endif()
|
||||
@ -107,9 +99,10 @@ but not all the files it references.
|
||||
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)
|
||||
|
||||
get_filename_component(QGpgme_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
|
||||
# Pull in QGpgme for compatibility with KF5 variant.
|
||||
find_package(QGpgme CONFIG)
|
||||
|
@ -62,8 +62,16 @@ libgpgmepp_la_LIBADD = ../../../src/libgpgme.la @LIBASSUAN_LIBS@
|
||||
libgpgmepp_la_LDFLAGS = -version-info \
|
||||
@LIBGPGMEPP_LT_CURRENT@:@LIBGPGMEPP_LT_REVISION@:@LIBGPGMEPP_LT_AGE@
|
||||
|
||||
if HAVE_W32_SYSTEM
|
||||
libsuffix=.dll.a
|
||||
else
|
||||
libsuffix=.so
|
||||
endif
|
||||
|
||||
GpgmeppConfig.cmake: GpgmeppConfig.cmake.in
|
||||
sed -e 's|[@]resolved_libdir@|$(libdir)|g' < "$<" > "$@"
|
||||
sed -e 's|[@]libsuffix@|$(libsuffix)|g' < "$@" > "$@".2
|
||||
mv "$@".2 "$@"
|
||||
|
||||
install-cmake-files: GpgmeppConfig.cmake GpgmeppConfigVersion.cmake
|
||||
-$(INSTALL) -d $(DESTDIR)$(libdir)/cmake/Gpgmepp
|
||||
|
23
lang/qt/Makefile.am
Normal file
23
lang/qt/Makefile.am
Normal file
@ -0,0 +1,23 @@
|
||||
# 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
|
||||
|
||||
SUBDIRS = src
|
||||
|
||||
EXTRA_DIST = README
|
27
lang/qt/README
Normal file
27
lang/qt/README
Normal file
@ -0,0 +1,27 @@
|
||||
Qt API bindings/wrapper for gpgme
|
||||
----------------------------------------
|
||||
Based on KF5gpgmepp 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 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.
|
||||
|
||||
Overview
|
||||
--------
|
||||
QGpgme provides Qt API bindings around Gpgmepp. It depends on Gpgmepp.
|
||||
|
||||
Currently this is a very thin library that only provides a QByteArray
|
||||
and QIODevice dataprovider. But might be extended in the future with
|
||||
code that is currently part of KDE's libkleopatra. To provide an easy
|
||||
to use API for Qt Applications.
|
67
lang/qt/src/Makefile.am
Normal file
67
lang/qt/src/Makefile.am
Normal file
@ -0,0 +1,67 @@
|
||||
# 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
|
||||
|
||||
qgpgme_sources = \
|
||||
dataprovider.cpp
|
||||
|
||||
qgpgme_headers = \
|
||||
dataprovider.h qgpgme_export.h
|
||||
|
||||
qgpgmeincludedir = $(includedir)/qgpgme
|
||||
qgpgmeinclude_HEADERS = $(qgpgme_headers)
|
||||
|
||||
libqgpgme_la_SOURCES = $(qgpgme_sources) $(qgpgme_headers)
|
||||
|
||||
AM_CPPFLAGS = @GPGME_QT_CFLAGS@ @GPG_ERROR_CFLAGS@ @LIBASSUAN_CFLAGS@ \
|
||||
-DBUILDING_QGPGME -I$(top_srcdir)/lang/cpp/src
|
||||
|
||||
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 "$@"
|
||||
|
||||
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
|
107
lang/qt/src/QGpgmeConfig.cmake.in.in
Normal file
107
lang/qt/src/QGpgmeConfig.cmake.in.in
Normal file
@ -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/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)
|
31
lang/qt/src/QGpgmeConfigVersion.cmake.in
Normal file
31
lang/qt/src/QGpgmeConfigVersion.cmake.in
Normal file
@ -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()
|
281
lang/qt/src/dataprovider.cpp
Normal file
281
lang/qt/src/dataprovider.cpp
Normal file
@ -0,0 +1,281 @@
|
||||
/* dataprovider.cpp
|
||||
Copyright (C) 2004 Klar<EFBFBD>vdalens Datakonsult AB
|
||||
|
||||
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 boost::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 boost::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();
|
||||
}
|
104
lang/qt/src/dataprovider.h
Normal file
104
lang/qt/src/dataprovider.h
Normal file
@ -0,0 +1,104 @@
|
||||
/* dataprovider.h
|
||||
Copyright (C) 2004 Klarälvdalens Datakonsult AB
|
||||
|
||||
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 <QtCore/QByteArray>
|
||||
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
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:
|
||||
/*! \reimp */
|
||||
bool isSupported(Operation) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
/*! \reimp */
|
||||
ssize_t read(void *buffer, size_t bufSize);
|
||||
/*! \reimp */
|
||||
ssize_t write(const void *buffer, size_t bufSize);
|
||||
/*! \reimp */
|
||||
off_t seek(off_t offset, int whence);
|
||||
/*! \reimp */
|
||||
void release();
|
||||
|
||||
private:
|
||||
QByteArray mArray;
|
||||
off_t mOff;
|
||||
};
|
||||
|
||||
class QGPGME_EXPORT QIODeviceDataProvider : public GpgME::DataProvider
|
||||
{
|
||||
public:
|
||||
explicit QIODeviceDataProvider(const boost::shared_ptr<QIODevice> &initialData);
|
||||
~QIODeviceDataProvider();
|
||||
|
||||
const boost::shared_ptr<QIODevice> &ioDevice() const
|
||||
{
|
||||
return mIO;
|
||||
}
|
||||
|
||||
private:
|
||||
// these shall only be accessed through the dataprovider
|
||||
// interface, where they're public:
|
||||
/*! \reimp */
|
||||
bool isSupported(Operation) const;
|
||||
/*! \reimp */
|
||||
ssize_t read(void *buffer, size_t bufSize);
|
||||
/*! \reimp */
|
||||
ssize_t write(const void *buffer, size_t bufSize);
|
||||
/*! \reimp */
|
||||
off_t seek(off_t offset, int whence);
|
||||
/*! \reimp */
|
||||
void release();
|
||||
|
||||
private:
|
||||
const boost::shared_ptr<QIODevice> mIO;
|
||||
bool mErrorOccurred : 1;
|
||||
bool mHaveQProcess : 1;
|
||||
};
|
||||
|
||||
} // namespace QGpgME
|
||||
|
||||
#endif
|
53
lang/qt/src/qgpgme_export.h
Normal file
53
lang/qt/src/qgpgme_export.h
Normal file
@ -0,0 +1,53 @@
|
||||
|
||||
#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
|
51
m4/qt.m4
Normal file
51
m4/qt.m4
Normal file
@ -0,0 +1,51 @@
|
||||
dnl qt.m4
|
||||
dnl Copyright (C) 2016 Intevation GmbH
|
||||
dnl
|
||||
dnl This file is part of gpgme and is provided under the same license as gpgme
|
||||
|
||||
dnl Autoconf macro to find either Qt4 or Qt5
|
||||
dnl
|
||||
dnl sets GPGME_QT_LIBS and GPGME_QT_CFLAGS
|
||||
dnl
|
||||
dnl if QT5 was found have_qt5_libs is set to yes
|
||||
|
||||
AC_DEFUN([FIND_QT],
|
||||
[
|
||||
have_qt5_libs="no";
|
||||
|
||||
PKG_CHECK_MODULES(GPGME_QT,
|
||||
Qt5Core >= 5.0.0,
|
||||
[have_qt5_libs="yes"],
|
||||
[have_qt5_libs="no"])
|
||||
|
||||
if "$PKG_CONFIG" --variable qt_config Qt5Core | grep -q "reduce_relocations"; then
|
||||
GPGME_QT_CFLAGS="$GPGME_QT_CFLAGS -fpic"
|
||||
fi
|
||||
if test "$have_qt5_libs" = "yes"; then
|
||||
AC_CHECK_TOOL(MOC, moc)
|
||||
AC_MSG_CHECKING([moc version])
|
||||
mocversion=`$MOC -v 2>&1`
|
||||
mocversiongrep=`echo $mocversion | grep "Qt 5\|moc 5"`
|
||||
if test x"$mocversiongrep" != x"$mocversion"; then
|
||||
AC_MSG_RESULT([no])
|
||||
# moc was not the qt5 one, try with moc-qt5
|
||||
AC_CHECK_TOOL(MOC2, moc-qt5)
|
||||
mocversion=`$MOC2 -v 2>&1`
|
||||
mocversiongrep=`echo $mocversion | grep "Qt 5\|moc-qt5 5\|moc 5"`
|
||||
if test x"$mocversiongrep" != x"$mocversion"; then
|
||||
AC_CHECK_TOOL(QTCHOOSER, qtchooser)
|
||||
qt5tooldir=`QT_SELECT=qt5 qtchooser -print-env | grep QTTOOLDIR | cut -d '=' -f 2 | cut -d \" -f 2`
|
||||
mocversion=`$qt5tooldir/moc -v 2>&1`
|
||||
mocversiongrep=`echo $mocversion | grep "Qt 5\|moc 5"`
|
||||
if test x"$mocversiongrep" != x"$mocversion"; then
|
||||
# no valid moc found
|
||||
have_qt5_libs="no";
|
||||
else
|
||||
MOC=$qt5tooldir/moc
|
||||
fi
|
||||
else
|
||||
MOC=$MOC2
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
])
|
Loading…
Reference in New Issue
Block a user