diff --git a/CMakeLists.txt b/CMakeLists.txt
index 86d2aee14..c3fbd3e98 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,471 +1,471 @@
cmake_minimum_required(VERSION 3.0)
# KDE Application Version, managed by release script
set (KDE_APPLICATIONS_VERSION_MAJOR "18")
set (KDE_APPLICATIONS_VERSION_MINOR "07")
set (KDE_APPLICATIONS_VERSION_MICRO "70")
set (KDE_APPLICATIONS_VERSION "${KDE_APPLICATIONS_VERSION_MAJOR}.${KDE_APPLICATIONS_VERSION_MINOR}.${KDE_APPLICATIONS_VERSION_MICRO}")
project(okular VERSION 1.4.${KDE_APPLICATIONS_VERSION_MICRO})
set(QT_REQUIRED_VERSION "5.8.0")
set(KF5_REQUIRED_VERSION "5.33.0")
find_package(ECM 5.33.0 CONFIG REQUIRED)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH})
include(ECMInstallIcons)
include(ECMSetupVersion)
include(ECMOptionalAddSubdirectory)
include(GenerateExportHeader)
include(FeatureSummary)
include(ECMAddAppIcon)
include(KDECompilerSettings NO_POLICY_SCOPE)
include(KDEInstallDirs)
include(KDECMakeSettings)
include(ECMAddTests)
include(ECMAddAppIcon)
include(CMakePackageConfigHelpers)
ecm_setup_version(${PROJECT_VERSION}
VARIABLE_PREFIX OKULAR
VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/core/version.h"
PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/Okular5ConfigVersion.cmake")
find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED COMPONENTS Core DBus Test Widgets PrintSupport Svg Qml Quick)
find_package(Qt5 ${QT_REQUIRED_VERSION} OPTIONAL_COMPONENTS TextToSpeech)
if (NOT Qt5TextToSpeech_FOUND)
message(STATUS "Qt5TextToSpeech not found, speech features will be disabled")
else()
add_definitions(-DHAVE_SPEECH)
endif()
if(NOT CMAKE_VERSION VERSION_LESS "3.10.0")
# CMake 3.9+ warns about automoc on files without Q_OBJECT, and doesn't know about other macros.
# 3.10+ lets us provide more macro names that require automoc.
list(APPEND CMAKE_AUTOMOC_MACRO_NAMES "OKULAR_EXPORT_PLUGIN")
endif()
set(optionalComponents)
if (ANDROID)
# we want to make sure that generally all components are found
set(optionalComponents "OPTIONAL_COMPONENTS")
endif()
find_package(KF5 ${KF5_REQUIRED_VERSION} REQUIRED COMPONENTS
Archive
Bookmarks
Completion
Config
ConfigWidgets
CoreAddons
Crash
IconThemes
KIO
Parts
ThreadWeaver
WindowSystem
${optionalComponents}
DocTools
JS
Wallet
)
if(KF5Wallet_FOUND)
add_definitions(-DWITH_KWALLET=1)
endif()
if(KF5JS_FOUND)
add_definitions(-DWITH_KJS=1)
endif()
if(NOT WIN32 AND NOT ANDROID)
find_package(KF5 ${KF5_REQUIRED_VERSION} REQUIRED COMPONENTS
Activities
)
set_package_properties("KF5Activities" PROPERTIES
DESCRIPTION "Activities interface library"
URL "https://api.kde.org/frameworks/kactivities/html/"
TYPE RECOMMENDED
PURPOSE "Required for Activities integration.")
endif()
find_package(KF5Kirigami2)
set_package_properties(KF5Kirigami2 PROPERTIES
DESCRIPTION "A QtQuick based components set"
PURPOSE "Required at runtime by the mobile app"
TYPE RUNTIME
)
find_package(Phonon4Qt5 CONFIG REQUIRED)
find_package(KDEExperimentalPurpose)
set_package_properties(KDEExperimentalPurpose PROPERTIES
DESCRIPTION "A framework for services and actions integration"
PURPOSE "Required for enabling the share menu in Okular"
TYPE OPTIONAL
)
if (KDEExperimentalPurpose_FOUND)
set(PURPOSE_FOUND 1)
else()
set(PURPOSE_FOUND 0)
endif()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake/modules)
find_package(ZLIB REQUIRED)
# This is here instead of in generators since we use if(Poppler_Qt5_FOUND) in autotests/
find_package(Poppler "0.12.1" COMPONENTS Qt5)
set_package_properties("Poppler" PROPERTIES
TYPE RECOMMENDED
PURPOSE "Support for PDF files in okular.")
add_definitions(-DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS)
add_definitions(-DTRANSLATION_DOMAIN="okular")
add_definitions(-DQT_NO_URL_CAST_FROM_STRING)
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${PHONON_INCLUDES} core/synctex ${ZLIB_INCLUDE_DIR} ${CMAKE_BINARY_DIR}/core)
option(BUILD_OKULARKIRIGAMI "Builds the touch-friendly frontend" ON)
if (BUILD_OKULARKIRIGAMI)
add_subdirectory( mobile )
endif()
option(BUILD_COVERAGE "Build the project with gcov support" OFF)
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.0.0")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsuggest-override" )
endif()
endif()
if(BUILD_COVERAGE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lgcov")
endif()
add_subdirectory( ui )
add_subdirectory( shell )
add_subdirectory( generators )
add_subdirectory( autotests )
add_subdirectory( conf/autotests )
if(KF5DocTools_FOUND)
add_subdirectory(doc)
endif()
include(OkularConfigureChecks.cmake)
if(NOT WIN32)
set(MATH_LIB m)
else(NOT WIN32)
set(MATH_LIB)
endif(NOT WIN32)
# okularcore
set(okularcore_SRCS
core/action.cpp
core/annotations.cpp
core/area.cpp
core/audioplayer.cpp
core/bookmarkmanager.cpp
core/chooseenginedialog.cpp
core/document.cpp
core/documentcommands.cpp
core/fontinfo.cpp
core/form.cpp
core/generator.cpp
core/generator_p.cpp
core/misc.cpp
core/movie.cpp
core/observer.cpp
core/debug.cpp
core/page.cpp
core/pagecontroller.cpp
core/pagesize.cpp
core/pagetransition.cpp
core/rotationjob.cpp
core/scripter.cpp
core/sound.cpp
core/sourcereference.cpp
core/textdocumentgenerator.cpp
core/textdocumentsettings.cpp
core/textpage.cpp
core/tilesmanager.cpp
core/utils.cpp
core/view.cpp
core/fileprinter.cpp
- core/signatureutils.cpp
+ core/signatureinfo.cpp
core/script/event.cpp
core/synctex/synctex_parser.c
core/synctex/synctex_parser_utils.c
)
qt5_add_resources(okularcore_SRCS
core/script/builtin.qrc
)
ki18n_wrap_ui(okularcore_SRCS
conf/textdocumentsettings.ui
)
install( FILES
core/action.h
core/annotations.h
core/area.h
core/document.h
core/fontinfo.h
core/form.h
core/generator.h
core/global.h
core/page.h
core/pagesize.h
core/pagetransition.h
- core/signatureutils.h
+ core/signatureinfo.h
core/sound.h
core/sourcereference.h
core/textdocumentgenerator.h
core/textdocumentsettings.h
core/textpage.h
core/tile.h
core/utils.h
core/fileprinter.h
core/observer.h
${CMAKE_CURRENT_BINARY_DIR}/core/version.h
${CMAKE_CURRENT_BINARY_DIR}/core/okularcore_export.h
${CMAKE_CURRENT_BINARY_DIR}/settings_core.h
DESTINATION ${KDE_INSTALL_INCLUDEDIR}/okular/core COMPONENT Devel)
install( FILES
interfaces/configinterface.h
interfaces/guiinterface.h
interfaces/printinterface.h
interfaces/saveinterface.h
interfaces/viewerinterface.h
DESTINATION ${KDE_INSTALL_INCLUDEDIR}/okular/interfaces COMPONENT Devel)
ki18n_wrap_ui(okularcore_SRCS
core/chooseenginewidget.ui
)
kconfig_add_kcfg_files(okularcore_SRCS conf/settings_core.kcfgc)
add_library(okularcore SHARED ${okularcore_SRCS})
generate_export_header(okularcore BASE_NAME okularcore EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/core/okularcore_export.h")
if (ANDROID)
set(fileName ${CMAKE_BINARY_DIR}/Okular5Core-android-dependencies.xml)
file(WRITE "${fileName}" "\n"
"\n"
"\n")
install(FILES ${fileName} DESTINATION ${KDE_INSTALL_LIBDIR})
endif()
# Special handling for linking okularcore on OSX/Apple
IF(APPLE)
SET(OKULAR_IOKIT "-framework IOKit" CACHE STRING "Apple IOKit framework")
ENDIF(APPLE)
# Extra library needed by imported synctex code on Windows
if(WIN32)
set(SHLWAPI shlwapi)
endif(WIN32)
target_link_libraries(okularcore
PRIVATE
${OKULAR_IOKIT}
${SHLWAPI}
KF5::Archive
KF5::KIOCore
KF5::KIOWidgets
KF5::I18n
KF5::ThreadWeaver
KF5::Bookmarks
Phonon::phonon4qt5
${MATH_LIB}
${ZLIB_LIBRARIES}
PUBLIC # these are included from the installed headers
KF5::CoreAddons
KF5::XmlGui
KF5::ConfigGui
Qt5::PrintSupport
Qt5::Widgets
)
if (KF5Wallet_FOUND)
target_link_libraries(okularcore PRIVATE KF5::Wallet)
endif()
if (KF5JS_FOUND)
target_sources(okularcore PRIVATE
core/script/executor_kjs.cpp
core/script/kjs_app.cpp
core/script/kjs_console.cpp
core/script/kjs_data.cpp
core/script/kjs_document.cpp
core/script/kjs_field.cpp
core/script/kjs_fullscreen.cpp
core/script/kjs_field.cpp
core/script/kjs_spell.cpp
core/script/kjs_util.cpp
core/script/kjs_event.cpp
)
target_link_libraries(okularcore PRIVATE KF5::JS KF5::JSApi)
endif()
set_target_properties(okularcore PROPERTIES VERSION 9.0.0 SOVERSION 9 OUTPUT_NAME Okular5Core EXPORT_NAME Core)
install(TARGETS okularcore EXPORT Okular5Targets ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
install(FILES conf/okular.kcfg DESTINATION ${KDE_INSTALL_KCFGDIR})
install(FILES conf/okular_core.kcfg DESTINATION ${KDE_INSTALL_KCFGDIR})
install(FILES core/okularGenerator.desktop DESTINATION ${KDE_INSTALL_KSERVICETYPES5DIR})
# okularpart
set(okularpart_conf_SRCS
conf/preferencesdialog.cpp
conf/dlgaccessibility.cpp
conf/dlgdebug.cpp
conf/dlgeditor.cpp
conf/dlggeneral.cpp
conf/dlgannotations.cpp
conf/dlgperformance.cpp
conf/dlgpresentation.cpp
conf/editannottooldialog.cpp
conf/editdrawingtooldialog.cpp
conf/widgetannottools.cpp
conf/widgetconfigurationtoolsbase.cpp
conf/widgetdrawingtools.cpp
)
set(okularpart_SRCS
${okularpart_conf_SRCS}
part.cpp
extensions.cpp
ui/embeddedfilesdialog.cpp
ui/annotwindow.cpp
ui/annotationmodel.cpp
ui/annotationpopup.cpp
ui/annotationpropertiesdialog.cpp
ui/annotationproxymodels.cpp
ui/annotationtools.cpp
ui/annotationwidgets.cpp
ui/bookmarklist.cpp
ui/debug_ui.cpp
ui/drawingtoolactions.cpp
ui/fileprinterpreview.cpp
ui/findbar.cpp
ui/formwidgets.cpp
ui/guiutils.cpp
ui/ktreeviewsearchline.cpp
ui/latexrenderer.cpp
ui/minibar.cpp
ui/okmenutitle.cpp
ui/pageitemdelegate.cpp
ui/pagepainter.cpp
ui/pagesizelabel.cpp
ui/pageviewannotator.cpp
ui/pageviewmouseannotation.cpp
ui/pageview.cpp
ui/magnifierview.cpp
ui/pageviewutils.cpp
ui/presentationsearchbar.cpp
ui/presentationwidget.cpp
ui/propertiesdialog.cpp
ui/searchlineedit.cpp
ui/searchwidget.cpp
ui/sidebar.cpp
ui/side_reviews.cpp
ui/snapshottaker.cpp
ui/thumbnaillist.cpp
ui/toc.cpp
ui/tocmodel.cpp
ui/toolaction.cpp
ui/videowidget.cpp
ui/layers.cpp
ui/signaturewidgets.cpp
)
if (Qt5TextToSpeech_FOUND)
set(okularpart_SRCS ${okularpart_SRCS}
ui/tts.cpp)
endif()
ki18n_wrap_ui(okularpart_SRCS
conf/dlgaccessibilitybase.ui
conf/dlgeditorbase.ui
conf/dlggeneralbase.ui
conf/dlgannotationsbase.ui
conf/dlgperformancebase.ui
conf/dlgpresentationbase.ui
)
kconfig_add_kcfg_files(okularpart_SRCS conf/settings.kcfgc)
add_library(okularpart SHARED ${okularpart_SRCS})
generate_export_header(okularpart BASE_NAME okularpart)
target_link_libraries(okularpart okularcore
${MATH_LIB}
Qt5::Svg
Phonon::phonon4qt5
KF5::Archive
KF5::Bookmarks
KF5::I18n
KF5::IconThemes
KF5::ItemViews
KF5::KIOCore
KF5::KIOFileWidgets
KF5::KIOWidgets
KF5::Parts
KF5::Solid
KF5::WindowSystem
)
if(KF5Wallet_FOUND)
target_link_libraries(okularpart KF5::Wallet)
endif()
if (KDEExperimentalPurpose_FOUND)
target_link_libraries(okularpart KDEExperimental::PurposeWidgets)
endif()
set_target_properties(okularpart PROPERTIES PREFIX "")
if (Qt5TextToSpeech_FOUND)
target_link_libraries(okularpart Qt5::TextToSpeech)
endif()
install(TARGETS okularpart DESTINATION ${KDE_INSTALL_PLUGINDIR})
########### install files ###############
install(FILES okular.upd DESTINATION ${KDE_INSTALL_DATADIR}/kconf_update)
install( FILES okular_part.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR} )
install( FILES part.rc part-viewermode.rc DESTINATION ${KDE_INSTALL_KXMLGUI5DIR}/okular )
install( FILES okular.categories DESTINATION ${KDE_INSTALL_CONFDIR} )
########### cmake files #################
set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/Okular5")
configure_package_config_file(
"${CMAKE_CURRENT_SOURCE_DIR}/Okular5Config.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/Okular5Config.cmake"
INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR}
PATH_VARS INCLUDE_INSTALL_DIR CMAKE_INSTALL_PREFIX
)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/Okular5Config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/Okular5ConfigVersion.cmake"
DESTINATION "${CMAKECONFIG_INSTALL_DIR}"
COMPONENT Devel
)
install(EXPORT Okular5Targets DESTINATION "${CMAKECONFIG_INSTALL_DIR}" FILE Okular5Targets.cmake NAMESPACE Okular::)
########### summary #################
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
diff --git a/core/form.h b/core/form.h
index e3637f50f..e7b08f885 100644
--- a/core/form.h
+++ b/core/form.h
@@ -1,434 +1,434 @@
/***************************************************************************
* Copyright (C) 2007 by Pino Toscano *
* *
* This program 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. *
***************************************************************************/
#ifndef _OKULAR_FORM_H_
#define _OKULAR_FORM_H_
#include "okularcore_export.h"
#include "area.h"
#include "annotations.h"
-#include "signatureutils.h"
+#include "signatureinfo.h"
#include
namespace Okular {
class Action;
class Page;
class PagePrivate;
class FormFieldPrivate;
class FormFieldButtonPrivate;
class FormFieldTextPrivate;
class FormFieldChoicePrivate;
class FormFieldSignaturePrivate;
/**
* @short The base interface of a form field.
*
* This is the very basic interface to represent a field in a form.
*
* This is not meant to be used as a direct base for the form fields in a
* document, but its abstract subclasses are.
*/
class OKULARCORE_EXPORT FormField
{
/// @cond PRIVATE
friend class Page;
friend class PagePrivate;
/// @endcond
public:
/**
* The types of form field.
*/
enum FieldType
{
FormButton, ///< A "button". See @ref FormFieldButton::ButtonType.
FormText, ///< A field of variable text. See @ref FormFieldText::TextType.
FormChoice, ///< A choice field. See @ref FormFieldChoice::ChoiceType.
FormSignature ///< A signature.
};
virtual ~FormField();
/**
* The type of the field.
*/
FieldType type() const;
/**
* The bouding rect of the field, in normalized coordinates.
*/
virtual NormalizedRect rect() const = 0;
/**
* The ID of the field.
*/
virtual int id() const = 0;
/**
* The internal name of the field, to be used when referring to the
* field in eg scripts.
*/
virtual QString name() const = 0;
/**
* The visible name of the field, to be used in the user interface
* (eg in error messages, etc).
*/
virtual QString uiName() const = 0;
/**
* Whether the field is read-only.
*/
virtual bool isReadOnly() const;
/**
* Whether the field is read-only.
*
* @since 1.4
*/
virtual void setReadOnly( bool value );
/**
* Whether this form field is visible.
*/
virtual bool isVisible() const;
/**
* Whether the field is visible.
*
* @since 1.5
*/
virtual void setVisible( bool value );
Action* activationAction() const;
/**
* Describes the type of form additional action.
*
* @since 1.1
*/
enum AdditionalActionType
{
FieldModified, ///< An action to be performed when the user modifies the field
FormatField, ///< An action to be performed before the field is formatted to display its value
ValidateField, ///< An action to be performed when the field value changes
CalculateField, ///< An action to be performed when the field needs to be recalculated
};
/**
* Returns the additional action of the given @p type or @c nullptr if no action has been defined.
*
* @since 1.1
*/
Action* additionalAction( AdditionalActionType type ) const;
/* Returns the additional action of the given @p type or @c nullptr if no action has been defined.
*
* This is for actions of annotation widgets associated with the FormField
*
* @since 1.5
*/
Action* additionalAction( Annotation::AdditionalActionType type ) const;
protected:
/// @cond PRIVATE
FormField( FormFieldPrivate &dd );
Q_DECLARE_PRIVATE( FormField )
FormFieldPrivate *d_ptr;
/// @endcond
void setActivationAction( Action *action );
void setAdditionalAction( AdditionalActionType type, Action *action );
void setAdditionalAction( Annotation::AdditionalActionType type, Action *action );
private:
Q_DISABLE_COPY( FormField )
};
/**
* @short Interface of a button form field.
*
* This is the base interface to reimplement to represent a button field, like
* a push button, a check box or a radio button.
*
* @since 0.7 (KDE 4.1)
*/
class OKULARCORE_EXPORT FormFieldButton : public FormField
{
public:
/**
* The types of button field.
*/
enum ButtonType
{
Push, ///< A simple push button.
CheckBox, ///< A check box.
Radio ///< A radio button.
};
virtual ~FormFieldButton();
/**
The particular type of the button field.
*/
virtual ButtonType buttonType() const = 0;
/**
* The caption to be used for the button.
*/
virtual QString caption() const = 0;
/**
* The state of the button.
*/
virtual bool state() const = 0;
/**
* Sets the state of the button to the new \p state .
*/
virtual void setState( bool state );
/**
* The list with the IDs of siblings (ie, buttons belonging to the same
* group as the current one.
*
* Valid only for \ref Radio buttons, an empty list otherwise.
*/
virtual QList< int > siblings() const = 0;
protected:
FormFieldButton();
private:
Q_DECLARE_PRIVATE( FormFieldButton )
Q_DISABLE_COPY( FormFieldButton )
};
/**
* @short Interface of a text form field.
*
* This is the base interface to reimplement to represent a text field, ie a
* field where the user insert text.
*/
class OKULARCORE_EXPORT FormFieldText : public FormField
{
public:
/**
* The types of text field.
*/
enum TextType
{
Normal, ///< A simple singleline text field.
Multiline, ///< A multiline text field.
FileSelect ///< An input field to select the path of a file on disk.
};
virtual ~FormFieldText();
/**
* The particular type of the text field.
*/
virtual TextType textType() const = 0;
/**
* The text of text field.
*/
virtual QString text() const = 0;
/**
* Sets the new @p text in the text field.
*
* The default implementation does nothing.
*
* Reimplemented only if the setting of new text is supported.
*/
virtual void setText( const QString& text );
/**
* Whether this text field is a password input, eg its text @b must be
* replaced with asterisks.
*
* Always false for @ref FileSelect text fields.
*/
virtual bool isPassword() const;
/**
* Whether this text field should allow rich text.
*/
virtual bool isRichText() const;
/**
* The maximum length allowed for the text of text field, or -1 if
* there is no limitation for the text.
*/
virtual int maximumLength() const;
/**
* The alignment of the text within the field.
*/
virtual Qt::Alignment textAlignment() const;
/**
* Whether the text inserted manually in the field (where possible)
* can be spell-checked.
*
* @note meaningful only if the field is editable.
*/
virtual bool canBeSpellChecked() const;
protected:
FormFieldText();
private:
Q_DECLARE_PRIVATE( FormFieldText )
Q_DISABLE_COPY( FormFieldText )
};
/**
* @short Interface of a choice form field.
*
* This is the base interface to reimplement to represent a choice field, ie a
* field where the user can select one (of more) element(s) among a set of
* choices.
*/
class OKULARCORE_EXPORT FormFieldChoice : public FormField
{
public:
/**
* The types of choice field.
*/
enum ChoiceType
{
ComboBox, ///< A combo box choice field.
ListBox ///< A list box choice field.
};
virtual ~FormFieldChoice();
/**
* The particular type of the choice field.
*/
virtual ChoiceType choiceType() const = 0;
/**
* The possible choices of the choice field.
*/
virtual QStringList choices() const = 0;
/**
* Whether this ComboBox is editable, ie the user can type in a custom
* value.
*
* Always false for the other types of choices.
*/
virtual bool isEditable() const;
/**
* Whether more than one choice of this ListBox can be selected at the
* same time.
*
* Always false for the other types of choices.
*/
virtual bool multiSelect() const;
/**
* The currently selected choices.
*
* Always one element in the list in case of single choice elements.
*/
virtual QList< int > currentChoices() const = 0;
/**
* Sets the selected choices to @p choices .
*/
virtual void setCurrentChoices( const QList< int >& choices );
/**
The text entered into an editable combo box choice field
@since 0.16 (KDE 4.10)
*/
virtual QString editChoice() const;
/**
Sets the text entered into an editable combo box choice field
@since 0.16 (KDE 4.10)
*/
virtual void setEditChoice( const QString& text );
/**
* The alignment of the text within the field.
*/
virtual Qt::Alignment textAlignment() const;
/**
* Whether the text inserted manually in the field (where possible)
* can be spell-checked.
*
* @note meaningful only if the field is editable.
*/
virtual bool canBeSpellChecked() const;
protected:
FormFieldChoice();
private:
Q_DECLARE_PRIVATE( FormFieldChoice )
Q_DISABLE_COPY( FormFieldChoice )
};
/**
* @short Interface of a signature form field.
*
* This is the base interface to reimplement to represent a signature field.
*/
class OKULARCORE_EXPORT FormFieldSignature : public FormField
{
public:
/**
* The types of signature.
*/
enum SignatureType {
AdbePkcs7sha1,
AdbePkcs7detached,
EtsiCAdESdetached,
UnknownType
};
~FormFieldSignature();
/**
* The signature type
*/
virtual SignatureType signatureType() const = 0;
/**
* Validate the signature with 'now' as validation time.
*
*/
virtual SignatureInfo validate() const = 0;
protected:
FormFieldSignature();
private:
Q_DECLARE_PRIVATE( FormFieldSignature )
Q_DISABLE_COPY( FormFieldSignature )
};
}
#endif
diff --git a/core/signatureutils.cpp b/core/signatureinfo.cpp
similarity index 99%
rename from core/signatureutils.cpp
rename to core/signatureinfo.cpp
index 476eceb95..7d03ec6da 100644
--- a/core/signatureutils.cpp
+++ b/core/signatureinfo.cpp
@@ -1,386 +1,385 @@
/***************************************************************************
* Copyright (C) 2018 by Chinmoy Ranjan Pradhan *
* *
* This program 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. *
***************************************************************************/
-#include "signatureutils.h".h"
+#include "signatureinfo.h"
using namespace Okular;
class Okular::CertificateInfoPrivate
{
public:
CertificateInfoPrivate()
: pkType( CertificateInfo::OtherKey ), keyUsages( CertificateInfo::KuNone ),
certificateDer( QByteArray() ), serialNumber( QByteArray() ), publicKey( QByteArray() ),
version( QByteArray() ), validityStart( QDateTime() ), validityEnd( QDateTime() ),
issuerName( QString() ), issuerDN( QString() ), pkStrength( -1 )
{
}
CertificateInfo::PublicKeyType pkType;
CertificateInfo::KeyUsages keyUsages;
QByteArray certificateDer;
QByteArray serialNumber;
QByteArray publicKey;
QByteArray version;
QDateTime validityStart;
QDateTime validityEnd;
QString issuerName;
QString issuerDN;
int pkStrength;
};
-
CertificateInfo::CertificateInfo( CertificateInfoPrivate *priv )
: d_ptr( priv )
{
}
CertificateInfo::CertificateInfo( const CertificateInfo &other )
: d_ptr( other.d_ptr )
{
}
CertificateInfo &CertificateInfo::operator=( const CertificateInfo &other )
{
if ( this != &other )
d_ptr = other.d_ptr;
return *this;
}
CertificateInfo::~CertificateInfo()
{
}
Q_DECLARE_OPERATORS_FOR_FLAGS( CertificateInfo::KeyUsages )
bool CertificateInfo::isValid() const
{
return d_ptr.data() != nullptr;
}
QByteArray CertificateInfo::version() const
{
Q_D( const CertificateInfo );
return d->version;
}
QString CertificateInfo::issuerName() const
{
Q_D( const CertificateInfo );
return d->issuerName;
}
QString CertificateInfo::issuerDN() const
{
Q_D( const CertificateInfo );
return d->issuerDN;
}
QByteArray CertificateInfo::serialNumber() const
{
Q_D( const CertificateInfo );
return d->serialNumber;
}
QDateTime CertificateInfo::validityStart() const
{
Q_D( const CertificateInfo );
return d->validityStart;
}
QDateTime CertificateInfo::validityEnd() const
{
Q_D( const CertificateInfo );
return d->validityEnd;
}
CertificateInfo::KeyUsages CertificateInfo::keyUsages() const
{
Q_D( const CertificateInfo );
return d->keyUsages;
}
QByteArray CertificateInfo::publicKey() const
{
Q_D( const CertificateInfo );
return d->publicKey;
}
CertificateInfo::PublicKeyType CertificateInfo::publicKeyType() const
{
Q_D( const CertificateInfo );
return d->pkType;
}
int CertificateInfo::publicKeyStrength() const
{
Q_D( const CertificateInfo );
return d->pkStrength;
}
QByteArray CertificateInfo::certificateData() const
{
Q_D( const CertificateInfo );
return d->certificateDer;
}
void CertificateInfo::initPrivate()
{
if ( d_ptr.isNull() )
d_ptr = QSharedPointer( new CertificateInfoPrivate );
}
void CertificateInfo::setVersion( const QByteArray &version )
{
Q_D( CertificateInfo );
d->version = version;
}
void CertificateInfo::setIssuerName( const QString &issuerName )
{
Q_D( CertificateInfo );
d->issuerName = issuerName;
}
void CertificateInfo::setIssuerDN( const QString &issuerDN )
{
Q_D( CertificateInfo );
d->issuerDN = issuerDN;
}
void CertificateInfo::setSerialNumber( const QByteArray &serialNumber )
{
Q_D( CertificateInfo );
d->serialNumber = serialNumber;
}
void CertificateInfo::setValidityStart( const QDateTime &validityStart )
{
Q_D( CertificateInfo );
d->validityStart = validityStart;
}
void CertificateInfo::setValidityEnd( const QDateTime & validityEnd )
{
Q_D( CertificateInfo );
d->validityEnd = validityEnd;
}
void CertificateInfo::setKeyUsages( KeyUsages ku )
{
Q_D( CertificateInfo );
d->keyUsages = ku;
}
void CertificateInfo::setPublicKey( const QByteArray &publicKey )
{
Q_D( CertificateInfo );
d->publicKey = publicKey;
}
void CertificateInfo::setPublicKeyType( PublicKeyType pkType )
{
Q_D( CertificateInfo );
d->pkType = pkType;
}
void CertificateInfo::setPublicKeyStrength( int pkStrength )
{
Q_D( CertificateInfo );
d->pkStrength = pkStrength;
}
void CertificateInfo::setCertificateData( const QByteArray &data )
{
Q_D( CertificateInfo );
d->certificateDer = data;
}
class Okular::SignatureInfoPrivate
{
public:
SignatureInfoPrivate()
: signatureStatus( SignatureInfo::SignatureStatusUnknown ),
certificateStatus( SignatureInfo::CertificateStatusUnknown ),
hashAlgorithm( SignatureInfo::HashAlgorithmUnknown ),
rangeBounds( QList() ), signingTime( QDateTime() ), signature( QByteArray() ),
subjectName( QString() ), subjectDN( QString() ), signsTotalDoc( false )
{
}
SignatureInfo::SignatureStatus signatureStatus;
SignatureInfo::CertificateStatus certificateStatus;
SignatureInfo::HashAlgorithm hashAlgorithm;
CertificateInfo certInfo;
QList rangeBounds;
QDateTime signingTime;
QByteArray signature;
QString subjectName;
QString subjectDN;
bool signsTotalDoc;
};
SignatureInfo::SignatureInfo( SignatureInfoPrivate *priv )
: d_ptr( priv )
{
}
SignatureInfo::SignatureInfo( const SignatureInfo &other )
: d_ptr( other.d_ptr )
{
}
SignatureInfo &SignatureInfo::operator=( const SignatureInfo &other )
{
if ( this != &other )
d_ptr = other.d_ptr;
return *this;
}
SignatureInfo::~SignatureInfo()
{
}
bool SignatureInfo::isValid() const
{
return d_ptr.data() != nullptr;
}
SignatureInfo::SignatureStatus SignatureInfo::signatureStatus() const
{
Q_D( const SignatureInfo );
return d->signatureStatus;
}
SignatureInfo::CertificateStatus SignatureInfo::certificateStatus() const
{
Q_D( const SignatureInfo);
return d->certificateStatus;
}
SignatureInfo::HashAlgorithm SignatureInfo::hashAlgorithm() const
{
Q_D( const SignatureInfo );
return d->hashAlgorithm;
}
QString SignatureInfo::subjectName() const
{
Q_D( const SignatureInfo );
return d->subjectName;
}
QString SignatureInfo::subjectDN() const
{
Q_D( const SignatureInfo );
return d->subjectDN;
}
QDateTime SignatureInfo::signingTime() const
{
Q_D( const SignatureInfo );
return d->signingTime;
}
QByteArray SignatureInfo::signature() const
{
Q_D( const SignatureInfo );
return d->signature;
}
QList SignatureInfo::signedRangeBounds() const
{
Q_D( const SignatureInfo );
return d->rangeBounds;
}
bool SignatureInfo::signsTotalDocument() const
{
Q_D( const SignatureInfo );
return d->signsTotalDoc;
}
CertificateInfo SignatureInfo::certificateInfo() const
{
Q_D( const SignatureInfo );
return d->certInfo;
}
void SignatureInfo::initPrivate()
{
if ( d_ptr.isNull() )
d_ptr = QSharedPointer( new SignatureInfoPrivate );
}
void SignatureInfo::setSignatureStatus( SignatureStatus sigStatus )
{
Q_D( SignatureInfo );
d->signatureStatus = sigStatus;
}
void SignatureInfo::setCertificateStatus( CertificateStatus certStatus )
{
Q_D( SignatureInfo );
d->certificateStatus = certStatus;
}
void SignatureInfo::setSubjectName( const QString &subjectName )
{
Q_D( SignatureInfo );
d->subjectName = subjectName;
}
void SignatureInfo::setSubjectDN( const QString &subjectDN )
{
Q_D( SignatureInfo );
d->subjectDN = subjectDN;
}
void SignatureInfo::setHashAlgorithm( HashAlgorithm hashAlgorithm )
{
Q_D( SignatureInfo );
d->hashAlgorithm = hashAlgorithm;
}
void SignatureInfo::setSigningTime( const QDateTime & signingTime)
{
Q_D( SignatureInfo );
d->signingTime = signingTime;
}
void SignatureInfo::setSignature( const QByteArray &data )
{
Q_D( SignatureInfo );
d->signature = data;
}
void SignatureInfo::setSignedRangeBounds( const QList &rangeBounds )
{
Q_D( SignatureInfo );
d->rangeBounds = rangeBounds;
}
void SignatureInfo::setSignsTotalDocument( bool signsTotalDoc )
{
Q_D( SignatureInfo );
d->signsTotalDoc = signsTotalDoc;
}
void SignatureInfo::setCertificateInfo( CertificateInfo certInfo )
{
Q_D( SignatureInfo );
d->certInfo = certInfo;
}
diff --git a/core/signatureutils.h b/core/signatureinfo.h
similarity index 100%
rename from core/signatureutils.h
rename to core/signatureinfo.h
diff --git a/generators/poppler/CMakeLists.txt b/generators/poppler/CMakeLists.txt
index e2105d0ee..ecea4ed7f 100644
--- a/generators/poppler/CMakeLists.txt
+++ b/generators/poppler/CMakeLists.txt
@@ -1,130 +1,130 @@
remove_definitions(-DTRANSLATION_DOMAIN="okular")
add_definitions(-DTRANSLATION_DOMAIN="okular_poppler")
add_subdirectory( conf )
if (Poppler_VERSION VERSION_GREATER "0.23.99")
set (HAVE_POPPLER_0_24 1)
endif()
if (Poppler_VERSION VERSION_GREATER "0.27.99")
set (HAVE_POPPLER_0_28 1)
endif()
if (Poppler_VERSION VERSION_GREATER "0.35.99")
set (HAVE_POPPLER_0_36 1)
endif()
if (Poppler_VERSION VERSION_GREATER "0.36.99")
set (HAVE_POPPLER_0_37 1)
endif()
set(CMAKE_REQUIRED_LIBRARIES Poppler::Qt5 Qt5::Core Qt5::Gui)
check_cxx_source_compiles("
#include
int main()
{
Poppler::LinkOCGState *l = 0;
return 0;
}
" HAVE_POPPLER_0_50)
check_cxx_source_compiles("
#include
#include
int main()
{
Poppler::FormFieldButton *ff = 0;
Poppler::Link *l = ff->additionalAction(Poppler::FormField::CalculateField);
return 0;
}
" HAVE_POPPLER_0_53)
check_cxx_source_compiles("
#include
int main()
{
Poppler::Document::RenderHint hint = Poppler::Document::HideAnnotations;
return 0;
}
" HAVE_POPPLER_0_60)
check_cxx_source_compiles("
#include
#include
int main()
{
Poppler::Page *p;
p->renderToImage(0, 0, 0, 0, 0, 0, Poppler::Page::Rotate0, nullptr, nullptr, QVariant());
return 0;
}
" HAVE_POPPLER_0_62)
check_cxx_source_compiles("
#include
#include
int main()
{
Poppler::Page *p;
p->renderToImage(0, 0, 0, 0, 0, 0, Poppler::Page::Rotate0, nullptr, nullptr, nullptr, QVariant());
return 0;
}
" HAVE_POPPLER_0_63)
check_cxx_source_compiles("
#include
#include
#include
int main()
{
Poppler::FormField *f;
f->setReadOnly(true);
f->setVisible(true);
Poppler::Link *l;
l->nextLinks();
}
" HAVE_POPPLER_0_64)
check_cxx_source_compiles("
#include
#include
int main()
{
Poppler::FormField *f;
f->additionalAction(Poppler::Annotation::CursorEnteringAction);
}
" HAVE_POPPLER_0_65)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/config-okular-poppler.h.cmake
${CMAKE_CURRENT_BINARY_DIR}/config-okular-poppler.h
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/../..
)
########### next target ###############
set(okularGenerator_poppler_PART_SRCS
generator_pdf.cpp
formfields.cpp
annots.cpp
- pdfsignatureutils.cpp
+ pdfsignatureinfo.cpp
)
ki18n_wrap_ui(okularGenerator_poppler_PART_SRCS
conf/pdfsettingswidget.ui
)
kconfig_add_kcfg_files(okularGenerator_poppler_PART_SRCS conf/pdfsettings.kcfgc )
okular_add_generator(okularGenerator_poppler ${okularGenerator_poppler_PART_SRCS})
target_link_libraries(okularGenerator_poppler okularcore KF5::I18n KF5::Completion Poppler::Qt5 Qt5::Xml)
########### install files ###############
install( FILES okularPoppler.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR} )
install( PROGRAMS okularApplication_pdf.desktop org.kde.mobile.okular_pdf.desktop DESTINATION ${KDE_INSTALL_APPDIR} )
install( FILES org.kde.okular-poppler.metainfo.xml DESTINATION ${KDE_INSTALL_METAINFODIR} )
diff --git a/generators/poppler/formfields.cpp b/generators/poppler/formfields.cpp
index 019ce9290..ccee3e3c7 100644
--- a/generators/poppler/formfields.cpp
+++ b/generators/poppler/formfields.cpp
@@ -1,434 +1,434 @@
/***************************************************************************
* Copyright (C) 2007 by Pino Toscano *
* Copyright (C) 2018 by Intevation GmbH *
* *
* This program 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. *
***************************************************************************/
#include "formfields.h"
#include "core/action.h"
-#include "pdfsignatureutils.h"
+#include "pdfsignatureinfo.h"
#include
#include
extern Okular::Action* createLinkFromPopplerLink(const Poppler::Link *popplerLink, bool deletePopplerLink = true);
#ifdef HAVE_POPPLER_0_65
# define SET_ANNOT_ACTIONS \
setAdditionalAction( Okular::Annotation::CursorEntering, createLinkFromPopplerLink( field->additionalAction( Poppler::Annotation::CursorEnteringAction ) ) ); \
setAdditionalAction( Okular::Annotation::CursorLeaving, createLinkFromPopplerLink( field->additionalAction( Poppler::Annotation::CursorLeavingAction ) ) ); \
setAdditionalAction( Okular::Annotation::MousePressed, createLinkFromPopplerLink( field->additionalAction( Poppler::Annotation::MousePressedAction ) ) ); \
setAdditionalAction( Okular::Annotation::MouseReleased, createLinkFromPopplerLink( field->additionalAction( Poppler::Annotation::MouseReleasedAction ) ) ); \
setAdditionalAction( Okular::Annotation::FocusIn, createLinkFromPopplerLink( field->additionalAction( Poppler::Annotation::FocusInAction ) ) ); \
setAdditionalAction( Okular::Annotation::FocusOut, createLinkFromPopplerLink( field->additionalAction( Poppler::Annotation::FocusOutAction ) ) );
#else
# define SET_ANNOT_ACTIONS
#endif
#ifdef HAVE_POPPLER_0_53
#define SET_ACTIONS \
setActivationAction( createLinkFromPopplerLink( field->activationAction() ) ); \
setAdditionalAction( Okular::FormField::FieldModified, createLinkFromPopplerLink( field->additionalAction( Poppler::FormField::FieldModified ) ) ); \
setAdditionalAction( Okular::FormField::FormatField, createLinkFromPopplerLink( field->additionalAction( Poppler::FormField::FormatField ) ) ); \
setAdditionalAction( Okular::FormField::ValidateField, createLinkFromPopplerLink( field->additionalAction( Poppler::FormField::ValidateField ) ) ); \
setAdditionalAction( Okular::FormField::CalculateField, createLinkFromPopplerLink( field->additionalAction( Poppler::FormField::CalculateField ) ) ); \
SET_ANNOT_ACTIONS
#else
#define SET_ACTIONS \
setActivationAction( createLinkFromPopplerLink( field->activationAction() ) );
#endif
PopplerFormFieldButton::PopplerFormFieldButton( Poppler::FormFieldButton * field )
: Okular::FormFieldButton(), m_field( field )
{
m_rect = Okular::NormalizedRect::fromQRectF( m_field->rect() );
m_id = m_field->id();
SET_ACTIONS
}
PopplerFormFieldButton::~PopplerFormFieldButton()
{
delete m_field;
}
Okular::NormalizedRect PopplerFormFieldButton::rect() const
{
return m_rect;
}
int PopplerFormFieldButton::id() const
{
return m_id;
}
QString PopplerFormFieldButton::name() const
{
return m_field->name();
}
QString PopplerFormFieldButton::uiName() const
{
return m_field->uiName();
}
bool PopplerFormFieldButton::isReadOnly() const
{
return m_field->isReadOnly();
}
void PopplerFormFieldButton::setReadOnly( bool value )
{
#ifdef HAVE_POPPLER_0_64
m_field->setReadOnly( value );
#else
Q_UNUSED( value );
#endif
}
bool PopplerFormFieldButton::isVisible() const
{
return m_field->isVisible();
}
void PopplerFormFieldButton::setVisible( bool value )
{
#ifdef HAVE_POPPLER_0_64
m_field->setVisible( value );
#else
Q_UNUSED( value );
#endif
}
Okular::FormFieldButton::ButtonType PopplerFormFieldButton::buttonType() const
{
switch ( m_field->buttonType() )
{
case Poppler::FormFieldButton::Push:
return Okular::FormFieldButton::Push;
case Poppler::FormFieldButton::CheckBox:
return Okular::FormFieldButton::CheckBox;
case Poppler::FormFieldButton::Radio:
return Okular::FormFieldButton::Radio;
}
return Okular::FormFieldButton::Push;
}
QString PopplerFormFieldButton::caption() const
{
return m_field->caption();
}
bool PopplerFormFieldButton::state() const
{
return m_field->state();
}
void PopplerFormFieldButton::setState( bool state )
{
m_field->setState( state );
}
QList< int > PopplerFormFieldButton::siblings() const
{
return m_field->siblings();
}
PopplerFormFieldText::PopplerFormFieldText( Poppler::FormFieldText * field )
: Okular::FormFieldText(), m_field( field )
{
m_rect = Okular::NormalizedRect::fromQRectF( m_field->rect() );
m_id = m_field->id();
SET_ACTIONS
}
PopplerFormFieldText::~PopplerFormFieldText()
{
delete m_field;
}
Okular::NormalizedRect PopplerFormFieldText::rect() const
{
return m_rect;
}
int PopplerFormFieldText::id() const
{
return m_id;
}
QString PopplerFormFieldText::name() const
{
return m_field->name();
}
QString PopplerFormFieldText::uiName() const
{
return m_field->uiName();
}
bool PopplerFormFieldText::isReadOnly() const
{
return m_field->isReadOnly();
}
void PopplerFormFieldText::setReadOnly( bool value )
{
#ifdef HAVE_POPPLER_0_64
m_field->setReadOnly( value );
#else
Q_UNUSED( value );
#endif
}
bool PopplerFormFieldText::isVisible() const
{
return m_field->isVisible();
}
void PopplerFormFieldText::setVisible( bool value )
{
#ifdef HAVE_POPPLER_0_64
m_field->setVisible( value );
#else
Q_UNUSED( value );
#endif
}
Okular::FormFieldText::TextType PopplerFormFieldText::textType() const
{
switch ( m_field->textType() )
{
case Poppler::FormFieldText::Normal:
return Okular::FormFieldText::Normal;
case Poppler::FormFieldText::Multiline:
return Okular::FormFieldText::Multiline;
case Poppler::FormFieldText::FileSelect:
return Okular::FormFieldText::FileSelect;
}
return Okular::FormFieldText::Normal;
}
QString PopplerFormFieldText::text() const
{
return m_field->text();
}
void PopplerFormFieldText::setText( const QString& text )
{
m_field->setText( text );
}
bool PopplerFormFieldText::isPassword() const
{
return m_field->isPassword();
}
bool PopplerFormFieldText::isRichText() const
{
return m_field->isRichText();
}
int PopplerFormFieldText::maximumLength() const
{
return m_field->maximumLength();
}
Qt::Alignment PopplerFormFieldText::textAlignment() const
{
return Qt::AlignTop | m_field->textAlignment();
}
bool PopplerFormFieldText::canBeSpellChecked() const
{
return m_field->canBeSpellChecked();
}
PopplerFormFieldChoice::PopplerFormFieldChoice( Poppler::FormFieldChoice * field )
: Okular::FormFieldChoice(), m_field( field )
{
m_rect = Okular::NormalizedRect::fromQRectF( m_field->rect() );
m_id = m_field->id();
SET_ACTIONS
}
PopplerFormFieldChoice::~PopplerFormFieldChoice()
{
delete m_field;
}
Okular::NormalizedRect PopplerFormFieldChoice::rect() const
{
return m_rect;
}
int PopplerFormFieldChoice::id() const
{
return m_id;
}
QString PopplerFormFieldChoice::name() const
{
return m_field->name();
}
QString PopplerFormFieldChoice::uiName() const
{
return m_field->uiName();
}
bool PopplerFormFieldChoice::isReadOnly() const
{
return m_field->isReadOnly();
}
void PopplerFormFieldChoice::setReadOnly( bool value )
{
#ifdef HAVE_POPPLER_0_64
m_field->setReadOnly( value );
#else
Q_UNUSED( value );
#endif
}
bool PopplerFormFieldChoice::isVisible() const
{
return m_field->isVisible();
}
void PopplerFormFieldChoice::setVisible( bool value )
{
#ifdef HAVE_POPPLER_0_64
m_field->setVisible( value );
#else
Q_UNUSED( value );
#endif
}
Okular::FormFieldChoice::ChoiceType PopplerFormFieldChoice::choiceType() const
{
switch ( m_field->choiceType() )
{
case Poppler::FormFieldChoice::ComboBox:
return Okular::FormFieldChoice::ComboBox;
case Poppler::FormFieldChoice::ListBox:
return Okular::FormFieldChoice::ListBox;
}
return Okular::FormFieldChoice::ListBox;
}
QStringList PopplerFormFieldChoice::choices() const
{
return m_field->choices();
}
bool PopplerFormFieldChoice::isEditable() const
{
return m_field->isEditable();
}
bool PopplerFormFieldChoice::multiSelect() const
{
return m_field->multiSelect();
}
QList PopplerFormFieldChoice::currentChoices() const
{
return m_field->currentChoices();
}
void PopplerFormFieldChoice::setCurrentChoices( const QList& choices )
{
m_field->setCurrentChoices( choices );
}
QString PopplerFormFieldChoice::editChoice() const
{
return m_field->editChoice();
}
void PopplerFormFieldChoice::setEditChoice( const QString& text )
{
m_field->setEditChoice( text );
}
Qt::Alignment PopplerFormFieldChoice::textAlignment() const
{
return Qt::AlignTop | m_field->textAlignment();
}
bool PopplerFormFieldChoice::canBeSpellChecked() const
{
return m_field->canBeSpellChecked();
}
PopplerFormFieldSignature::PopplerFormFieldSignature( Poppler::FormFieldSignature * field )
: Okular::FormFieldSignature(), m_field( field )
{
m_rect = Okular::NormalizedRect::fromQRectF( m_field->rect() );
m_id = m_field->id();
SET_ACTIONS
}
PopplerFormFieldSignature::~PopplerFormFieldSignature()
{
delete m_field;
}
Okular::NormalizedRect PopplerFormFieldSignature::rect() const
{
return m_rect;
}
int PopplerFormFieldSignature::id() const
{
return m_id;
}
QString PopplerFormFieldSignature::name() const
{
return m_field->name();
}
QString PopplerFormFieldSignature::uiName() const
{
return m_field->uiName();
}
bool PopplerFormFieldSignature::isReadOnly() const
{
return m_field->isReadOnly();
}
bool PopplerFormFieldSignature::isVisible() const
{
return m_field->isVisible();
}
PopplerFormFieldSignature::SignatureType PopplerFormFieldSignature::signatureType() const
{
switch ( m_field->signatureType() )
{
case Poppler::FormFieldSignature::AdbePkcs7sha1:
return Okular::FormFieldSignature::AdbePkcs7sha1;
case Poppler::FormFieldSignature::AdbePkcs7detached:
return Okular::FormFieldSignature::AdbePkcs7detached;
case Poppler::FormFieldSignature::EtsiCAdESdetached:
return Okular::FormFieldSignature::EtsiCAdESdetached;
default:
return Okular::FormFieldSignature::UnknownType;
}
}
Okular::SignatureInfo PopplerFormFieldSignature::validate() const
{
auto sigInfo = m_field->validate( Poppler::FormFieldSignature::ValidateVerifyCertificate );
return PopplerSignatureInfo( sigInfo );
}
diff --git a/generators/poppler/formfields.h b/generators/poppler/formfields.h
index a34a607e8..f560a0029 100644
--- a/generators/poppler/formfields.h
+++ b/generators/poppler/formfields.h
@@ -1,139 +1,139 @@
/***************************************************************************
* Copyright (C) 2007 by Pino Toscano *
* *
* This program 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. *
***************************************************************************/
#ifndef _OKULAR_GENERATOR_PDF_FORMFIELDS_H_
#define _OKULAR_GENERATOR_PDF_FORMFIELDS_H_
#include
#include "core/form.h"
-#include "core/signatureutils.h"
+#include "core/signatureinfo.h"
class PopplerFormFieldButton : public Okular::FormFieldButton
{
public:
PopplerFormFieldButton( Poppler::FormFieldButton * field );
virtual ~PopplerFormFieldButton();
// inherited from Okular::FormField
Okular::NormalizedRect rect() const override;
int id() const override;
QString name() const override;
QString uiName() const override;
bool isReadOnly() const override;
void setReadOnly( bool value ) override;
bool isVisible() const override;
void setVisible( bool value ) override;
// inherited from Okular::FormFieldButton
ButtonType buttonType() const override;
QString caption() const override;
bool state() const override;
void setState( bool state ) override;
QList< int > siblings() const override;
private:
Poppler::FormFieldButton * m_field;
Okular::NormalizedRect m_rect;
int m_id;
};
class PopplerFormFieldText : public Okular::FormFieldText
{
public:
PopplerFormFieldText( Poppler::FormFieldText * field );
virtual ~PopplerFormFieldText();
// inherited from Okular::FormField
Okular::NormalizedRect rect() const override;
int id() const override;
QString name() const override;
QString uiName() const override;
bool isReadOnly() const override;
void setReadOnly( bool value ) override;
bool isVisible() const override;
void setVisible( bool value ) override;
// inherited from Okular::FormFieldText
Okular::FormFieldText::TextType textType() const override;
QString text() const override;
void setText( const QString& text ) override;
bool isPassword() const override;
bool isRichText() const override;
int maximumLength() const override;
Qt::Alignment textAlignment() const override;
bool canBeSpellChecked() const override;
private:
Poppler::FormFieldText * m_field;
Okular::NormalizedRect m_rect;
int m_id;
};
class PopplerFormFieldChoice : public Okular::FormFieldChoice
{
public:
PopplerFormFieldChoice( Poppler::FormFieldChoice * field );
virtual ~PopplerFormFieldChoice();
// inherited from Okular::FormField
Okular::NormalizedRect rect() const override;
int id() const override;
QString name() const override;
QString uiName() const override;
bool isReadOnly() const override;
void setReadOnly( bool value ) override;
bool isVisible() const override;
void setVisible( bool value ) override;
// inherited from Okular::FormFieldChoice
ChoiceType choiceType() const override;
QStringList choices() const override;
bool isEditable() const override;
bool multiSelect() const override;
QList currentChoices() const override;
void setCurrentChoices( const QList& choices ) override;
QString editChoice() const override;
void setEditChoice( const QString& text ) override;
Qt::Alignment textAlignment() const override;
bool canBeSpellChecked() const override;
private:
Poppler::FormFieldChoice * m_field;
Okular::NormalizedRect m_rect;
int m_id;
};
class PopplerFormFieldSignature : public Okular::FormFieldSignature
{
public:
PopplerFormFieldSignature( Poppler::FormFieldSignature * field );
virtual ~PopplerFormFieldSignature();
// inherited from Okular::FormField
Okular::NormalizedRect rect() const override;
int id() const override;
QString name() const override;
QString uiName() const override;
bool isReadOnly() const override;
bool isVisible() const override;
// inherited from Okular::FormFieldSignature
SignatureType signatureType() const override;
Okular::SignatureInfo validate() const override;
private:
Poppler::FormFieldSignature * m_field;
Okular::NormalizedRect m_rect;
int m_id;
};
#endif
diff --git a/generators/poppler/pdfsignatureutils.cpp b/generators/poppler/pdfsignatureinfo.cpp
similarity index 99%
rename from generators/poppler/pdfsignatureutils.cpp
rename to generators/poppler/pdfsignatureinfo.cpp
index 12e4fcc9a..b6ffb2dc5 100644
--- a/generators/poppler/pdfsignatureutils.cpp
+++ b/generators/poppler/pdfsignatureinfo.cpp
@@ -1,160 +1,160 @@
/***************************************************************************
* Copyright (C) 2018 by Chinmoy Ranjan Pradhan *
* *
* This program 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. *
***************************************************************************/
-#include "pdfsignatureutils.h"
+#include "pdfsignatureinfo.h"
PopplerCertificateInfo::PopplerCertificateInfo( const Poppler::CertificateInfo &info )
: Okular::CertificateInfo()
{
initPrivate();
setVersion( info.version() );
setIssuerName( info.issuerName() );
setIssuerDN( info.issuerDN() );
setSerialNumber( info.serialNumber() );
setValidityStart( info.validityStart() );
setValidityEnd( info.validityEnd() );
setKeyUsages( convertToOkularKeyUsages( info.keyUsages() ) );
setPublicKey( info.publicKey() );
setPublicKeyStrength( info.publicKeyStrength() );
setPublicKeyType( convertToOkularPublicKeyType( info.publicKeyType() ) );
setCertificateData( info.certificateData() );
}
PopplerCertificateInfo::~PopplerCertificateInfo()
{
}
PopplerCertificateInfo::KeyUsages PopplerCertificateInfo::convertToOkularKeyUsages( Poppler::CertificateInfo::KeyUsages popplerKu )
{
KeyUsages ku = KuNone;
if ( popplerKu.testFlag( Poppler::CertificateInfo::KuDigitalSignature ) )
ku |= KuDigitalSignature;
if ( popplerKu.testFlag( Poppler::CertificateInfo::KuNonRepudiation ) )
ku |= KuNonRepudiation;
if ( popplerKu.testFlag( Poppler::CertificateInfo::KuKeyEncipherment ) )
ku |= KuKeyEncipherment;
if ( popplerKu.testFlag( Poppler::CertificateInfo::KuDataEncipherment ) )
ku |= KuDataEncipherment;
if ( popplerKu.testFlag( Poppler::CertificateInfo::KuKeyAgreement ) )
ku |= KuKeyAgreement;
if ( popplerKu.testFlag( Poppler::CertificateInfo::KuKeyCertSign ) )
ku |= KuKeyCertSign;
if ( popplerKu.testFlag( Poppler::CertificateInfo::KuClrSign ) )
ku |= KuClrSign;
if ( popplerKu.testFlag( Poppler::CertificateInfo::KuEncipherOnly ) )
ku |= KuEncipherOnly;
return ku;
}
PopplerCertificateInfo::PublicKeyType PopplerCertificateInfo::convertToOkularPublicKeyType( Poppler::CertificateInfo::PublicKeyType popplerPkType )
{
switch ( popplerPkType )
{
case Poppler::CertificateInfo::RsaKey:
return RsaKey;
case Poppler::CertificateInfo::DsaKey:
return DsaKey;
case Poppler::CertificateInfo::EcKey:
return EcKey;
case Poppler::CertificateInfo::OtherKey:
return OtherKey;
}
}
PopplerSignatureInfo::PopplerSignatureInfo(const Poppler::SignatureValidationInfo &info)
: Okular::SignatureInfo()
{
initPrivate();
setSignatureStatus( convertToOkularSigStatus( info.signatureStatus() ) );
setCertificateStatus( convertToOkularCertStatus( info.certificateStatus() ) );
setSubjectName( info.signerName() );
setSubjectDN( info.signerSubjectDN() );
setHashAlgorithm( convertToOkularHashAlg( info.hashAlgorithm() ) );
setSigningTime( QDateTime::fromTime_t( info.signingTime() ) );
setSignature( info.signature() );
setSignedRangeBounds( info.signedRangeBounds() );
setSignsTotalDocument( info.signsTotalDocument() );
setCertificateInfo( PopplerCertificateInfo( info.certificateInfo() ) );
}
PopplerSignatureInfo::~PopplerSignatureInfo()
{
}
PopplerSignatureInfo::SignatureStatus PopplerSignatureInfo::convertToOkularSigStatus( Poppler::SignatureValidationInfo::SignatureStatus popplerSigStatus)
{
switch( popplerSigStatus )
{
case Poppler::SignatureValidationInfo::SignatureValid:
return SignatureValid;
case Poppler::SignatureValidationInfo::SignatureInvalid:
return SignatureInvalid;
case Poppler::SignatureValidationInfo::SignatureDigestMismatch:
return SignatureDigestMismatch;
case Poppler::SignatureValidationInfo::SignatureDecodingError:
return SignatureDecodingError;
case Poppler::SignatureValidationInfo::SignatureGenericError:
return SignatureGenericError;
case Poppler::SignatureValidationInfo::SignatureNotFound:
return SignatureNotFound;
case Poppler::SignatureValidationInfo::SignatureNotVerified:
return SignatureNotVerified;
default:
return SignatureStatusUnknown;
}
}
PopplerSignatureInfo::CertificateStatus PopplerSignatureInfo::convertToOkularCertStatus( Poppler::SignatureValidationInfo::CertificateStatus popplerCertStatus )
{
switch( popplerCertStatus )
{
case Poppler::SignatureValidationInfo::CertificateTrusted:
return CertificateTrusted;
case Poppler::SignatureValidationInfo::CertificateUntrustedIssuer:
return CertificateUntrustedIssuer;
case Poppler::SignatureValidationInfo::CertificateUnknownIssuer:
return CertificateUnknownIssuer;
case Poppler::SignatureValidationInfo::CertificateRevoked:
return CertificateRevoked;
case Poppler::SignatureValidationInfo::CertificateExpired:
return CertificateExpired;
case Poppler::SignatureValidationInfo::CertificateGenericError:
return CertificateGenericError;
case Poppler::SignatureValidationInfo::CertificateNotVerified:
return CertificateNotVerified;
default:
return CertificateStatusUnknown;
}
}
PopplerSignatureInfo::HashAlgorithm PopplerSignatureInfo::convertToOkularHashAlg( Poppler::SignatureValidationInfo::HashAlgorithm popplerHashAlg )
{
switch( popplerHashAlg )
{
case Poppler::SignatureValidationInfo::HashAlgorithmMd2:
return HashAlgorithmMd2;
case Poppler::SignatureValidationInfo::HashAlgorithmMd5:
return HashAlgorithmMd5;
case Poppler::SignatureValidationInfo::HashAlgorithmSha1:
return HashAlgorithmSha1;
case Poppler::SignatureValidationInfo::HashAlgorithmSha256:
return HashAlgorithmSha256;
case Poppler::SignatureValidationInfo::HashAlgorithmSha384:
return HashAlgorithmSha384;
case Poppler::SignatureValidationInfo::HashAlgorithmSha512:
return HashAlgorithmSha512;
case Poppler::SignatureValidationInfo::HashAlgorithmSha224:
return HashAlgorithmSha224;
case Poppler::SignatureValidationInfo::HashAlgorithmUnknown:
return HashAlgorithmUnknown;
}
}
diff --git a/generators/poppler/pdfsignatureutils.h b/generators/poppler/pdfsignatureinfo.h
similarity index 95%
rename from generators/poppler/pdfsignatureutils.h
rename to generators/poppler/pdfsignatureinfo.h
index 4d1f4c985..6139a67a9 100644
--- a/generators/poppler/pdfsignatureutils.h
+++ b/generators/poppler/pdfsignatureinfo.h
@@ -1,43 +1,41 @@
/***************************************************************************
* Copyright (C) 2018 by Chinmoy Ranjan Pradhan *
* *
* This program 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. *
***************************************************************************/
#ifndef _OKULAR_GENERATOR_PDF_SIGNATUREINFO_H_
#define _OKULAR_GENERATOR_PDF_SIGNATUREINFO_H_
#include
-#include "core/signatureutils.h"
+#include "core/signatureinfo.h"
class PopplerCertificateInfo : public Okular::CertificateInfo
{
public:
PopplerCertificateInfo(const Poppler::CertificateInfo &info);
~PopplerCertificateInfo();
private:
KeyUsages convertToOkularKeyUsages( Poppler::CertificateInfo::KeyUsages );
PublicKeyType convertToOkularPublicKeyType( Poppler::CertificateInfo::PublicKeyType );
-
- Poppler::CertificateInfo *info;
};
class PopplerSignatureInfo : public Okular::SignatureInfo
{
public:
PopplerSignatureInfo(const Poppler::SignatureValidationInfo &info);
~PopplerSignatureInfo();
private:
SignatureStatus convertToOkularSigStatus( Poppler::SignatureValidationInfo::SignatureStatus );
CertificateStatus convertToOkularCertStatus( Poppler::SignatureValidationInfo::CertificateStatus );
HashAlgorithm convertToOkularHashAlg( Poppler::SignatureValidationInfo::HashAlgorithm );
};
#endif
diff --git a/ui/formwidgets.h b/ui/formwidgets.h
index 980771d83..ce46a197b 100644
--- a/ui/formwidgets.h
+++ b/ui/formwidgets.h
@@ -1,378 +1,378 @@
/***************************************************************************
* Copyright (C) 2007 by Pino Toscano *
* Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group *
* company, info@kdab.com. Work sponsored by the *
* LiMux project of the city of Munich *
* *
* This program 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. *
***************************************************************************/
#ifndef _OKULAR_FORMWIDGETS_H_
#define _OKULAR_FORMWIDGETS_H_
#include "core/area.h"
-#include "core/signatureutils.h"
+#include "core/signatureinfo.h"
#include
#include
#include
#include
#include
#include
#include
#include
class ComboEdit;
class QMenu;
class QButtonGroup;
class FormWidgetIface;
class PageViewItem;
class RadioButtonEdit;
class QEvent;
namespace Okular {
class Action;
class FormField;
class FormFieldButton;
class FormFieldChoice;
class FormFieldText;
class FormFieldSignature;
class Document;
}
struct RadioData
{
RadioData() {}
QList< int > ids;
QButtonGroup *group;
};
class FormWidgetsController : public QObject
{
Q_OBJECT
public:
FormWidgetsController( Okular::Document *doc );
virtual ~FormWidgetsController();
void signalAction( Okular::Action *action );
void registerRadioButton( FormWidgetIface *fwButton, Okular::FormFieldButton *formButton );
void dropRadioButtons();
bool canUndo();
bool canRedo();
Q_SIGNALS:
void changed( int pageNumber );
void requestUndo();
void requestRedo();
void canUndoChanged( bool undoAvailable );
void canRedoChanged( bool redoAvailable);
void formTextChangedByWidget( int pageNumber,
Okular::FormFieldText *form,
const QString & newContents,
int newCursorPos,
int prevCursorPos,
int prevAnchorPos );
void formTextChangedByUndoRedo( int pageNumber,
Okular::FormFieldText *form,
const QString & contents,
int cursorPos,
int anchorPos );
void formListChangedByWidget( int pageNumber,
Okular::FormFieldChoice *form,
const QList< int > & newChoices );
void formListChangedByUndoRedo( int pageNumber,
Okular::FormFieldChoice *form,
const QList< int > & choices );
void formComboChangedByWidget( int pageNumber,
Okular::FormFieldChoice *form,
const QString & newText,
int newCursorPos,
int prevCursorPos,
int prevAnchorPos
);
void formComboChangedByUndoRedo( int pageNumber,
Okular::FormFieldChoice *form,
const QString & text,
int cursorPos,
int anchorPos
);
void formButtonsChangedByWidget( int pageNumber,
const QList< Okular::FormFieldButton* > & formButtons,
const QList< bool > & newButtonStates );
void action( Okular::Action *action );
void refreshFormWidget( Okular::FormField * form );
private Q_SLOTS:
void slotButtonClicked( QAbstractButton *button );
void slotFormButtonsChangedByUndoRedo( int pageNumber,
const QList< Okular::FormFieldButton* > & formButtons );
private:
friend class TextAreaEdit;
friend class FormLineEdit;
friend class FileEdit;
friend class ListEdit;
friend class ComboEdit;
QList< RadioData > m_radios;
QHash< int, QAbstractButton* > m_buttons;
Okular::Document* m_doc;
};
class FormWidgetFactory
{
public:
static FormWidgetIface * createWidget( Okular::FormField * ff, QWidget * parent = nullptr );
};
class FormWidgetIface
{
public:
FormWidgetIface( QWidget * w, Okular::FormField * ff );
virtual ~FormWidgetIface();
Okular::NormalizedRect rect() const;
void setWidthHeight( int w, int h );
void moveTo( int x, int y );
bool setVisibility( bool visible );
void setCanBeFilled( bool fill );
void setPageItem( PageViewItem *pageItem );
PageViewItem* pageItem() const;
void setFormField( Okular::FormField *field );
Okular::FormField* formField() const;
virtual void setFormWidgetsController( FormWidgetsController *controller );
protected:
virtual void slotRefresh( Okular::FormField *form );
FormWidgetsController * m_controller;
Okular::FormField * m_ff;
private:
QWidget * m_widget;
PageViewItem * m_pageItem;
};
#define DECLARE_ADDITIONAL_ACTIONS \
protected: \
virtual void mousePressEvent( QMouseEvent *event ) override; \
virtual void mouseReleaseEvent( QMouseEvent *event ) override; \
virtual void focusInEvent( QFocusEvent *event ) override; \
virtual void focusOutEvent( QFocusEvent *event ) override; \
virtual void leaveEvent( QEvent *event ) override; \
virtual void enterEvent( QEvent *event ) override;
class PushButtonEdit : public QPushButton, public FormWidgetIface
{
Q_OBJECT
public:
explicit PushButtonEdit( Okular::FormFieldButton * button, QWidget * parent = nullptr );
DECLARE_ADDITIONAL_ACTIONS
};
class CheckBoxEdit : public QCheckBox, public FormWidgetIface
{
Q_OBJECT
public:
explicit CheckBoxEdit( Okular::FormFieldButton * button, QWidget * parent = nullptr );
// reimplemented from FormWidgetIface
void setFormWidgetsController( FormWidgetsController *controller ) override;
void doActivateAction();
protected:
void slotRefresh( Okular::FormField *form ) override;
DECLARE_ADDITIONAL_ACTIONS
};
class RadioButtonEdit : public QRadioButton, public FormWidgetIface
{
Q_OBJECT
public:
explicit RadioButtonEdit( Okular::FormFieldButton * button, QWidget * parent = nullptr );
// reimplemented from FormWidgetIface
void setFormWidgetsController( FormWidgetsController *controller ) override;
DECLARE_ADDITIONAL_ACTIONS
};
class FormLineEdit : public QLineEdit, public FormWidgetIface
{
Q_OBJECT
public:
explicit FormLineEdit( Okular::FormFieldText * text, QWidget * parent = nullptr );
void setFormWidgetsController( FormWidgetsController *controller ) override;
bool event ( QEvent * e ) override;
void contextMenuEvent( QContextMenuEvent* event ) override;
public Q_SLOTS:
void slotHandleTextChangedByUndoRedo( int pageNumber,
Okular::FormFieldText* textForm,
const QString & contents,
int cursorPos,
int anchorPos );
private Q_SLOTS:
void slotChanged();
protected:
void slotRefresh( Okular::FormField* form ) override;
private:
int m_prevCursorPos;
int m_prevAnchorPos;
DECLARE_ADDITIONAL_ACTIONS
};
class TextAreaEdit : public KTextEdit, public FormWidgetIface
{
Q_OBJECT
public:
explicit TextAreaEdit( Okular::FormFieldText * text, QWidget * parent = nullptr );
void setFormWidgetsController( FormWidgetsController *controller ) override;
bool event ( QEvent * e ) override;
public Q_SLOTS:
void slotHandleTextChangedByUndoRedo( int pageNumber,
Okular::FormFieldText * textForm,
const QString & contents,
int cursorPos,
int anchorPos );
void slotUpdateUndoAndRedoInContextMenu( QMenu* menu );
private Q_SLOTS:
void slotChanged();
protected:
void slotRefresh( Okular::FormField* form ) override;
private:
int m_prevCursorPos;
int m_prevAnchorPos;
DECLARE_ADDITIONAL_ACTIONS
};
class FileEdit : public KUrlRequester, public FormWidgetIface
{
Q_OBJECT
public:
explicit FileEdit( Okular::FormFieldText * text, QWidget * parent = nullptr );
void setFormWidgetsController( FormWidgetsController *controller ) override;
protected:
bool eventFilter( QObject *obj, QEvent *event ) override;
private Q_SLOTS:
void slotChanged();
void slotHandleFileChangedByUndoRedo( int pageNumber,
Okular::FormFieldText * form,
const QString & contents,
int cursorPos,
int anchorPos );
private:
int m_prevCursorPos;
int m_prevAnchorPos;
DECLARE_ADDITIONAL_ACTIONS
};
class ListEdit : public QListWidget, public FormWidgetIface
{
Q_OBJECT
public:
explicit ListEdit( Okular::FormFieldChoice * choice, QWidget * parent = nullptr );
void setFormWidgetsController( FormWidgetsController *controller ) override;
private Q_SLOTS:
void slotSelectionChanged();
void slotHandleFormListChangedByUndoRedo( int pageNumber,
Okular::FormFieldChoice * listForm,
const QList< int > & choices );
DECLARE_ADDITIONAL_ACTIONS
};
class ComboEdit : public QComboBox, public FormWidgetIface
{
Q_OBJECT
public:
explicit ComboEdit( Okular::FormFieldChoice * choice, QWidget * parent = nullptr );
void setFormWidgetsController( FormWidgetsController *controller ) override;
bool event ( QEvent * e ) override;
void contextMenuEvent( QContextMenuEvent* event ) override;
private Q_SLOTS:
void slotValueChanged();
void slotHandleFormComboChangedByUndoRedo( int pageNumber,
Okular::FormFieldChoice * comboForm,
const QString & text,
int cursorPos,
int anchorPos
);
private:
int m_prevCursorPos;
int m_prevAnchorPos;
DECLARE_ADDITIONAL_ACTIONS
};
class SignatureEdit : public QAbstractButton, public FormWidgetIface
{
Q_OBJECT
public:
explicit SignatureEdit( Okular::FormFieldSignature * signature, QWidget * parent = nullptr );
Okular::SignatureInfo validate();
protected:
bool event( QEvent * e ) override;
void contextMenuEvent( QContextMenuEvent * event ) override;
void paintEvent( QPaintEvent * event ) override;
private Q_SLOTS:
void slotShowSummary();
void slotShowProperties();
private:
Okular::SignatureInfo m_sigInfo;
bool m_leftMouseButtonPressed;
bool m_signatureValidated;
DECLARE_ADDITIONAL_ACTIONS
};
#undef DECLARE_ADDITIONAL_ACTIONS
#endif
diff --git a/ui/signaturewidgets.cpp b/ui/signaturewidgets.cpp
index 700ba65fd..1f8f62680 100644
--- a/ui/signaturewidgets.cpp
+++ b/ui/signaturewidgets.cpp
@@ -1,228 +1,229 @@
/***************************************************************************
* Copyright (C) 2018 by Chinmoy Ranjan Pradhan *
* *
* This program 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. *
***************************************************************************/
#include "signaturewidgets.h"
+#include "core/signatureinfo.h"
#include
#include
#include
#include
#include
#include
#include
#include
static QString getReadableSigState( Okular::SignatureInfo::SignatureStatus sigStatus )
{
switch ( sigStatus )
{
case Okular::SignatureInfo::SignatureValid:
return i18n("Signature is Valid.");
case Okular::SignatureInfo::SignatureInvalid:
return i18n("Signature is Invalid.");
case Okular::SignatureInfo::SignatureDigestMismatch:
return i18n("Digest Mismatch.");
case Okular::SignatureInfo::SignatureDecodingError:
return i18n("Document isn't signed or corrupted data.");
case Okular::SignatureInfo::SignatureNotVerified:
return i18n("Signature has not yet been verified.");
default:
return i18n("Unknown Validation Failure.");
}
}
static QString getReadableCertState( Okular::SignatureInfo::CertificateStatus certStatus )
{
switch ( certStatus )
{
case Okular::SignatureInfo::CertificateTrusted:
return i18n("Certificate is Trusted.");
case Okular::SignatureInfo::CertificateUntrustedIssuer:
return i18n("Certificate issuer isn't Trusted.");
case Okular::SignatureInfo::CertificateUnknownIssuer:
return i18n("Certificate issuer is unknown.");
case Okular::SignatureInfo::CertificateRevoked:
return i18n("Certificate has been Revoked.");
case Okular::SignatureInfo::CertificateExpired:
return i18n("Certificate has Expired.");
case Okular::SignatureInfo::CertificateNotVerified:
return i18n("Certificate has not yet been verified.");
default:
return i18n("Unknown issue with Certificate or corrupted data.");
}
}
static QString getReadableHashAlgorithm( Okular::SignatureInfo::HashAlgorithm hashAlg )
{
switch ( hashAlg )
{
case Okular::SignatureInfo::HashAlgorithmMd2:
return i18n("MD2");
case Okular::SignatureInfo::HashAlgorithmMd5:
return i18n("MD5");
case Okular::SignatureInfo::HashAlgorithmSha1:
return i18n("SHA1");
case Okular::SignatureInfo::HashAlgorithmSha256:
return i18n("SHA256");
case Okular::SignatureInfo::HashAlgorithmSha384:
return i18n("SHA384");
case Okular::SignatureInfo::HashAlgorithmSha512:
return i18n("SHA512");
case Okular::SignatureInfo::HashAlgorithmSha224:
return i18n("SHA224");
default:
return i18n("Unknown");
}
}
SignaturePropertiesModel::SignaturePropertiesModel( const Okular::SignatureInfo sigInfo, QObject * parent )
: QAbstractTableModel( parent )
{
m_sigProperties.append( qMakePair( i18n("Subject Name"), sigInfo.subjectName() ) );
m_sigProperties.append( qMakePair( i18n("Subject Distinguished Name"), sigInfo.subjectDN() ) );
m_sigProperties.append( qMakePair( i18n("Signing Time"), sigInfo.signingTime().toString( QStringLiteral("MMM dd yyyy hh:mm:ss") ) ) );
m_sigProperties.append( qMakePair( i18n("Hash Algorithm"), getReadableHashAlgorithm( sigInfo.hashAlgorithm() ) ) );
m_sigProperties.append( qMakePair( i18n("Signature Status"), getReadableSigState( sigInfo.signatureStatus() ) ) );
m_sigProperties.append( qMakePair( i18n("Certificate Status"), getReadableCertState( sigInfo.certificateStatus() ) ) );
m_sigProperties.append( qMakePair( i18n("Signature Data"), QString::fromUtf8( sigInfo.signature().toHex(' ') ) ) );
m_sigProperties.append( qMakePair( QStringLiteral("----------"), QString("------Certificate Properties--------") ) );
Okular::CertificateInfo certInfo = sigInfo.certificateInfo();
m_sigProperties.append( qMakePair( i18n("Version"), certInfo.version() ) );
m_sigProperties.append( qMakePair( i18n("Issuer Name"), certInfo.issuerName() ) );
m_sigProperties.append( qMakePair( i18n("Issuer Distinguished Name"), certInfo.issuerDN() ) );
m_sigProperties.append( qMakePair( i18n("Serial Number"), certInfo.serialNumber() ) );
m_sigProperties.append( qMakePair( i18n("Validity Start"), certInfo.validityStart().toString( QStringLiteral("MMM dd yyyy hh:mm:ss") ) ) );
m_sigProperties.append( qMakePair( i18n("Validity End"), certInfo.validityEnd().toString( QStringLiteral("MMM dd yyyy hh:mm:ss") ) ) );
m_sigProperties.append( qMakePair( i18n("Public Key"), certInfo.publicKey() ) );
}
int SignaturePropertiesModel::columnCount( const QModelIndex &parent ) const
{
return parent.isValid() ? 0 : 2;
}
int SignaturePropertiesModel::rowCount( const QModelIndex &parent ) const
{
return parent.isValid() ? 0 : m_sigProperties.size();
}
QVariant SignaturePropertiesModel::data( const QModelIndex &index, int role ) const
{
int row = index.row();
if ( !index.isValid() || row < 0 || row >= m_sigProperties.count() )
return QVariant();
switch ( role )
{
case Qt::DisplayRole:
case Qt::ToolTipRole:
switch ( index.column() )
{
case 0:
return m_sigProperties[row].first;
case 1:
return m_sigProperties[row].second;
default:
return QString();
}
case PropertyValueRole:
return m_sigProperties[row].second;
}
return QVariant();
}
QVariant SignaturePropertiesModel::headerData( int section, Qt::Orientation orientation, int role ) const
{
if ( role == Qt::TextAlignmentRole )
return QVariant( Qt::AlignLeft );
if ( orientation != Qt::Horizontal || role != Qt::DisplayRole)
return QVariant();
switch ( section )
{
case 0:
return i18n("Property");
case 1:
return i18n("Value");
default:
return QVariant();
}
}
SignaturePropertiesDialog::SignaturePropertiesDialog( const Okular::SignatureInfo &sigInfo, QWidget *parent )
: QDialog( parent ), m_sigInfo( sigInfo )
{
setModal( true );
setFixedSize( QSize( 450, 500 ));
setWindowTitle( i18n("Signature Properties") );
auto sigPropLabel = new QLabel( this );
sigPropLabel->setText( i18n("Signature Properties:") );
auto sigPropTree = new QTreeView( this );
sigPropTree->setIndentation( 0 );
m_sigPropModel = new SignaturePropertiesModel( m_sigInfo, this );
sigPropTree->setModel( m_sigPropModel );
connect( sigPropTree, &QTreeView::clicked, this, &SignaturePropertiesDialog::updateText );
m_sigPropText = new QTextEdit( this );
m_sigPropText->setReadOnly( true );
auto btnBox = new QDialogButtonBox( QDialogButtonBox::Close, this );
btnBox->button( QDialogButtonBox::Close )->setDefault( true );
connect( btnBox, &QDialogButtonBox::rejected, this, &SignatureSummaryDialog::reject );
auto mainLayout = new QVBoxLayout( this );
mainLayout->addWidget( sigPropLabel );
mainLayout->addWidget( sigPropTree );
mainLayout->addWidget( m_sigPropText );
mainLayout->addWidget( btnBox );
setLayout( mainLayout );
}
void SignaturePropertiesDialog::updateText( const QModelIndex &index )
{
m_sigPropText->setText( m_sigPropModel->data( index, SignaturePropertiesModel::PropertyValueRole ).toString() );
}
SignatureSummaryDialog::SignatureSummaryDialog( const Okular::SignatureInfo &sigInfo, QWidget *parent )
: QDialog( parent ), m_sigInfo( sigInfo )
{
setModal( true );
setFixedSize( QSize(250, 100) );
setWindowTitle( i18n("Signature Validation Status") );
auto sigStatusLabel = new QLabel( this );
sigStatusLabel->setText( getReadableSigState( m_sigInfo.signatureStatus() ) );
auto btnBox = new QDialogButtonBox( QDialogButtonBox::Close, this );
auto sigPropBtn = new QPushButton( i18n( "Signature Properties"), this );
btnBox->button( QDialogButtonBox::Close )->setDefault( true );
btnBox->addButton( sigPropBtn, QDialogButtonBox::ActionRole );
connect( btnBox, &QDialogButtonBox::rejected, this, &SignatureSummaryDialog::reject );
connect( sigPropBtn, &QPushButton::clicked, this, &SignatureSummaryDialog::showSignatureProperties );
auto mainLayout = new QVBoxLayout( this );
mainLayout->addWidget( sigStatusLabel );
mainLayout->addWidget( btnBox );
setLayout( mainLayout );
}
void SignatureSummaryDialog::showSignatureProperties()
{
reject();
SignaturePropertiesDialog sigPropDlg( m_sigInfo, this );
sigPropDlg.exec();
}
#include "moc_signaturewidgets.cpp"
diff --git a/ui/signaturewidgets.h b/ui/signaturewidgets.h
index 995eb76f6..4a18c6461 100644
--- a/ui/signaturewidgets.h
+++ b/ui/signaturewidgets.h
@@ -1,75 +1,75 @@
/***************************************************************************
* Copyright (C) 2018 by Chinmoy Ranjan Pradhan *
* *
* This program 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. *
***************************************************************************/
#ifndef OKULAR_SIGNATUREWIDGETS_H
#define OKULAR_SIGNATUREWIDGETS_H
#include
#include
#include
-#include "core/signatureutils.h"
+#include "core/signatureinfo.h"
class QTextEdit;
namespace Okular {
class SignatureInfo;
}
class SignaturePropertiesModel : public QAbstractTableModel
{
Q_OBJECT
public:
explicit SignaturePropertiesModel( const Okular::SignatureInfo sigInfo, QObject * parent = nullptr );
enum {
PropertyValueRole = Qt::UserRole
};
int columnCount( const QModelIndex &parent = QModelIndex() ) const override;
int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
QVariant headerData( int section, Qt::Orientation orientation, int role ) const override;
private:
QVector< QPair > m_sigProperties;
};
class SignaturePropertiesDialog : public QDialog
{
Q_OBJECT
public:
SignaturePropertiesDialog( const Okular::SignatureInfo &sigInfo, QWidget *parent );
private Q_SLOTS:
void updateText( const QModelIndex &index );
private:
SignaturePropertiesModel *m_sigPropModel;
QTextEdit *m_sigPropText;
Okular::SignatureInfo m_sigInfo;
};
class SignatureSummaryDialog : public QDialog
{
Q_OBJECT
public:
SignatureSummaryDialog( const Okular::SignatureInfo &sigInfo, QWidget *parent );
private Q_SLOTS:
void showSignatureProperties();
private:
Okular::SignatureInfo m_sigInfo;
};
#endif