diff -Nru kf5-messagelib-16.04.3/.arcconfig kf5-messagelib-16.12.3/.arcconfig --- kf5-messagelib-16.04.3/.arcconfig 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/.arcconfig 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,3 @@ +{ + "phabricator.uri": "https://phabricator.kde.org/project/profile/34/" +} diff -Nru kf5-messagelib-16.04.3/cmake/modules/FindGpgme.cmake kf5-messagelib-16.12.3/cmake/modules/FindGpgme.cmake --- kf5-messagelib-16.04.3/cmake/modules/FindGpgme.cmake 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/cmake/modules/FindGpgme.cmake 1970-01-01 00:00:00.000000000 +0000 @@ -1,391 +0,0 @@ -# - Try to find the gpgme library -# -# Algorithm: -# - Windows: -# On Windows, there's three gpgme variants: gpgme{,-glib,-qt}. -# - The variant used determines the event loop integration possible: -# - gpgme: no event loop integration possible, only synchronous operations supported -# - gpgme-glib: glib event loop integration possible, only asynchronous operations supported -# - gpgme-qt: qt event loop integration possible, only asynchronous operations supported -# - GPGME_{VANILLA,GLIB,QT}_{FOUND,LIBRARIES} will be set for each of the above -# - GPGME_INCLUDES is the same for all of the above -# - GPGME_FOUND is set if any of the above was found -# - *nix: -# There's also three variants: gpgme{,-pthread,-pth}. -# - The variant used determines the multithreaded use possible: -# - gpgme: no multithreading support available -# - gpgme-pthread: multithreading available using POSIX threads -# - gpgme-pth: multithreading available using GNU PTH (cooperative multithreading) -# - GPGME_{VANILLA,PTH,PTHREAD}_{FOUND,LIBRARIES} will be set for each of the above -# - GPGME_INCLUDES is the same for all of the above -# - GPGME_FOUND is set if any of the above was found -# -# GPGME_LIBRARY_DIR - the directory where the libraries are located - -# -# THIS IS ALMOST A 1:1 COPY OF FindAssuan.cmake in kdepim. -# Any changes here likely apply there, too. -# - -# do away with crappy condition repetition on else/endfoo -set( CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS_gpgme_saved ${CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS} ) -set( CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true ) - -#if this is built-in, please replace, if it isn't, export into a MacroToBool.cmake of it's own -macro( macro_bool_to_bool FOUND_VAR ) - foreach( _current_VAR ${ARGN} ) - if ( ${FOUND_VAR} ) - set( ${_current_VAR} TRUE ) - else() - set( ${_current_VAR} FALSE ) - endif() - endforeach() -endmacro() - -#HACK: local copy... -MACRO(MACRO_BOOL_TO_01 FOUND_VAR ) - FOREACH (_current_VAR ${ARGN}) - IF(${FOUND_VAR}) - SET(${_current_VAR} 1) - ELSE(${FOUND_VAR}) - SET(${_current_VAR} 0) - ENDIF(${FOUND_VAR}) - ENDFOREACH(_current_VAR) -ENDMACRO(MACRO_BOOL_TO_01) - - -if ( WIN32 ) - - # On Windows, we don't have a gpgme-config script, so we need to - # look for the stuff ourselves: - - # in cmake, AND and OR have the same precedence, there's no - # subexpressions, and expressions are evaluated short-circuit'ed - # IOW: CMake if() suxx. - # Starting with CMake 2.6.3 you can group if expressions with (), but we - # don't require 2.6.3 but 2.6.2, we can't use it. Alex - set( _seem_to_have_cached_gpgme false ) - if ( GPGME_INCLUDES ) - if ( GPGME_VANILLA_LIBRARIES OR GPGME_QT_LIBRARIES OR GPGME_GLIB_LIBRARIES ) - set( _seem_to_have_cached_gpgme true ) - endif() - endif() - - if ( _seem_to_have_cached_gpgme ) - - macro_bool_to_bool( GPGME_VANILLA_LIBRARIES GPGME_VANILLA_FOUND ) - macro_bool_to_bool( GPGME_GLIB_LIBRARIES GPGME_GLIB_FOUND ) - macro_bool_to_bool( GPGME_QT_LIBRARIES GPGME_QT_FOUND ) - # this would have been preferred: - #set( GPGME_*_FOUND macro_bool_to_bool(GPGME_*_LIBRARIES) ) - - if ( GPGME_VANILLA_FOUND OR GPGME_GLIB_FOUND OR GPGME_QT_FOUND ) - set( GPGME_FOUND true ) - else() - set( GPGME_FOUND false ) - endif() - - else() - - # is this needed, of just unreflected cut'n'paste? - # this isn't a KDE library, after all! - if( NOT KDEWIN_FOUND ) - find_package( KDEWIN REQUIRED ) - endif() - - set( GPGME_FOUND false ) - set( GPGME_VANILLA_FOUND false ) - set( GPGME_GLIB_FOUND false ) - set( GPGME_QT_FOUND false ) - - find_path( GPGME_INCLUDES gpgme.h - ${CMAKE_INCLUDE_PATH} - ${CMAKE_INSTALL_PREFIX}/include - ) - - find_library( _gpgme_vanilla_library NAMES gpgme libgpgme gpgme-11 libgpgme-11 - PATHS - ${CMAKE_LIBRARY_PATH} - ${CMAKE_INSTALL_PREFIX}/lib - ) - - find_library( _gpgme_glib_library NAMES gpgme-glib libgpgme-glib gpgme-glib-11 libgpgme-glib-11 - PATHS - ${CMAKE_LIBRARY_PATH} - ${CMAKE_INSTALL_PREFIX}/lib - ) - - find_library( _gpgme_qt_library NAMES gpgme-qt libgpgme-qt gpgme-qt-11 libgpgme-qt-11 - PATHS - ${CMAKE_LIBRARY_PATH} - ${CMAKE_INSTALL_PREFIX}/lib - ) - - find_library( _gpg_error_library NAMES gpg-error libgpg-error gpg-error-0 libgpg-error-0 - PATHS - ${CMAKE_LIBRARY_PATH} - ${CMAKE_INSTALL_PREFIX}/lib - ) - - set( GPGME_INCLUDES ${GPGME_INCLUDES} ) - - if ( _gpgme_vanilla_library AND _gpg_error_library ) - set( GPGME_VANILLA_LIBRARIES ${_gpgme_vanilla_library} ${_gpg_error_library} ) - set( GPGME_VANILLA_FOUND true ) - set( GPGME_FOUND true ) - endif() - - if ( _gpgme_glib_library AND _gpg_error_library ) - set( GPGME_GLIB_LIBRARIES ${_gpgme_glib_library} ${_gpg_error_library} ) - set( GPGME_GLIB_FOUND true ) - set( GPGME_FOUND true ) - endif() - - if ( _gpgme_qt_library AND _gpg_error_library ) - set( GPGME_QT_LIBRARIES ${_gpgme_qt_library} ${_gpg_error_library} ) - set( GPGME_QT_FOUND true ) - set( GPGME_FOUND true ) - endif() - - endif() - - # these are Unix-only: - set( GPGME_PTHREAD_FOUND false ) - set( GPGME_PTH_FOUND false ) - set( HAVE_GPGME_PTHREAD 0 ) - set( HAVE_GPGME_PTH 0 ) - - macro_bool_to_01( GPGME_FOUND HAVE_GPGME ) - macro_bool_to_01( GPGME_VANILLA_FOUND HAVE_GPGME_VANILLA ) - macro_bool_to_01( GPGME_GLIB_FOUND HAVE_GPGME_GLIB ) - macro_bool_to_01( GPGME_QT_FOUND HAVE_GPGME_QT ) - -else() # not WIN32 - - # On *nix, we have the gpgme-config script which can tell us all we - # need to know: - - # see WIN32 case for an explanation of what this does: - set( _seem_to_have_cached_gpgme false ) - if ( GPGME_INCLUDES ) - if ( GPGME_VANILLA_LIBRARIES OR GPGME_PTHREAD_LIBRARIES OR GPGME_PTH_LIBRARIES ) - set( _seem_to_have_cached_gpgme true ) - endif() - endif() - - if ( _seem_to_have_cached_gpgme ) - - macro_bool_to_bool( GPGME_VANILLA_LIBRARIES GPGME_VANILLA_FOUND ) - macro_bool_to_bool( GPGME_PTHREAD_LIBRARIES GPGME_PTHREAD_FOUND ) - macro_bool_to_bool( GPGME_PTH_LIBRARIES GPGME_PTH_FOUND ) - - if ( GPGME_VANILLA_FOUND OR GPGME_PTHREAD_FOUND OR GPGME_PTH_FOUND ) - set( GPGME_FOUND true ) - else() - set( GPGME_FOUND false ) - endif() - - else() - - set( GPGME_FOUND false ) - set( GPGME_VANILLA_FOUND false ) - set( GPGME_PTHREAD_FOUND false ) - set( GPGME_PTH_FOUND false ) - - find_program( _GPGMECONFIG_EXECUTABLE NAMES gpgme-config ) - - # if gpgme-config has been found - if ( _GPGMECONFIG_EXECUTABLE ) - - message( STATUS "Found gpgme-config at ${_GPGMECONFIG_EXECUTABLE}" ) - - exec_program( ${_GPGMECONFIG_EXECUTABLE} ARGS --version OUTPUT_VARIABLE GPGME_VERSION ) - - set( _GPGME_MIN_VERSION "1.1.7" ) - - if ( ${GPGME_VERSION} VERSION_LESS ${_GPGME_MIN_VERSION} ) - - message( STATUS "The installed version of gpgme is too old: ${GPGME_VERSION} (required: >= ${_GPGME_MIN_VERSION})" ) - - else() - - message( STATUS "Found gpgme v${GPGME_VERSION}, checking for flavours..." ) - - exec_program( ${_GPGMECONFIG_EXECUTABLE} ARGS --libs OUTPUT_VARIABLE _gpgme_config_vanilla_libs RETURN_VALUE _ret ) - if ( _ret ) - set( _gpgme_config_vanilla_libs ) - endif() - - exec_program( ${_GPGMECONFIG_EXECUTABLE} ARGS --thread=pthread --libs OUTPUT_VARIABLE _gpgme_config_pthread_libs RETURN_VALUE _ret ) - if ( _ret ) - set( _gpgme_config_pthread_libs ) - endif() - - exec_program( ${_GPGMECONFIG_EXECUTABLE} ARGS --thread=pth --libs OUTPUT_VARIABLE _gpgme_config_pth_libs RETURN_VALUE _ret ) - if ( _ret ) - set( _gpgme_config_pth_libs ) - endif() - - # append -lgpg-error to the list of libraries, if necessary - foreach ( _flavour vanilla pthread pth ) - if ( _gpgme_config_${_flavour}_libs AND NOT _gpgme_config_${_flavour}_libs MATCHES "lgpg-error" ) - set( _gpgme_config_${_flavour}_libs "${_gpgme_config_${_flavour}_libs} -lgpg-error" ) - endif() - endforeach() - - if ( _gpgme_config_vanilla_libs OR _gpgme_config_pthread_libs OR _gpgme_config_pth_libs ) - - exec_program( ${_GPGMECONFIG_EXECUTABLE} ARGS --cflags OUTPUT_VARIABLE _GPGME_CFLAGS ) - - if ( _GPGME_CFLAGS ) - string( REGEX REPLACE "(\r?\n)+$" " " _GPGME_CFLAGS "${_GPGME_CFLAGS}" ) - string( REGEX REPLACE " *-I" ";" GPGME_INCLUDES "${_GPGME_CFLAGS}" ) - endif() - - foreach ( _flavour vanilla pthread pth ) - if ( _gpgme_config_${_flavour}_libs ) - - set( _gpgme_library_dirs ) - set( _gpgme_library_names ) - string( TOUPPER "${_flavour}" _FLAVOUR ) - - string( REGEX REPLACE " +" ";" _gpgme_config_${_flavour}_libs "${_gpgme_config_${_flavour}_libs}" ) - - foreach( _flag ${_gpgme_config_${_flavour}_libs} ) - if ( "${_flag}" MATCHES "^-L" ) - string( REGEX REPLACE "^-L" "" _dir "${_flag}" ) - file( TO_CMAKE_PATH "${_dir}" _dir ) - set( _gpgme_library_dirs ${_gpgme_library_dirs} "${_dir}" ) - elseif( "${_flag}" MATCHES "^-l" ) - string( REGEX REPLACE "^-l" "" _name "${_flag}" ) - set( _gpgme_library_names ${_gpgme_library_names} "${_name}" ) - endif() - endforeach() - - set( GPGME_${_FLAVOUR}_FOUND true ) - - foreach( _name ${_gpgme_library_names} ) - set( _gpgme_${_name}_lib ) - - # if -L options were given, look only there - if ( _gpgme_library_dirs ) - find_library( _gpgme_${_name}_lib NAMES ${_name} PATHS ${_gpgme_library_dirs} NO_DEFAULT_PATH ) - endif() - - # if not found there, look in system directories - if ( NOT _gpgme_${_name}_lib ) - find_library( _gpgme_${_name}_lib NAMES ${_name} ) - endif() - - # if still not found, then the whole flavour isn't found - if ( NOT _gpgme_${_name}_lib ) - if ( GPGME_${_FLAVOUR}_FOUND ) - set( GPGME_${_FLAVOUR}_FOUND false ) - set( _not_found_reason "dependant library ${_name} wasn't found" ) - endif() - endif() - - set( GPGME_${_FLAVOUR}_LIBRARIES ${GPGME_${_FLAVOUR}_LIBRARIES} "${_gpgme_${_name}_lib}" ) - endforeach() - - #check_c_library_exists_explicit( gpgme gpgme_check_version "${_GPGME_CFLAGS}" "${GPGME_LIBRARIES}" GPGME_FOUND ) - if ( GPGME_${_FLAVOUR}_FOUND ) - message( STATUS " Found flavour '${_flavour}', checking whether it's usable...yes" ) - else() - message( STATUS " Found flavour '${_flavour}', checking whether it's usable...no" ) - message( STATUS " (${_not_found_reason})" ) - endif() - endif() - - endforeach( _flavour ) - - # ensure that they are cached - # This comment above doesn't make sense, the four following lines seem to do nothing. Alex - set( GPGME_INCLUDES ${GPGME_INCLUDES} ) - set( GPGME_VANILLA_LIBRARIES ${GPGME_VANILLA_LIBRARIES} ) - set( GPGME_PTHREAD_LIBRARIES ${GPGME_PTHREAD_LIBRARIES} ) - set( GPGME_PTH_LIBRARIES ${GPGME_PTH_LIBRARIES} ) - - if ( GPGME_VANILLA_FOUND OR GPGME_PTHREAD_FOUND OR GPGME_PTH_FOUND ) - set( GPGME_FOUND true ) - else() - set( GPGME_FOUND false ) - endif() - - endif() - - endif() - - endif() - - endif() - - # these are Windows-only: - set( GPGME_GLIB_FOUND false ) - set( GPGME_QT_FOUND false ) - set( HAVE_GPGME_GLIB 0 ) - set( HAVE_GPGME_QT 0 ) - - macro_bool_to_01( GPGME_FOUND HAVE_GPGME ) - macro_bool_to_01( GPGME_VANILLA_FOUND HAVE_GPGME_VANILLA ) - macro_bool_to_01( GPGME_PTHREAD_FOUND HAVE_GPGME_PTHREAD ) - macro_bool_to_01( GPGME_PTH_FOUND HAVE_GPGME_PTH ) - -endif() # WIN32 | Unix - - -set( _gpgme_flavours "" ) - -if ( GPGME_VANILLA_FOUND ) - set( _gpgme_flavours "${_gpgme_flavours} vanilla" ) -endif() - -if ( GPGME_GLIB_FOUND ) - set( _gpgme_flavours "${_gpgme_flavours} Glib" ) -endif() - -if ( GPGME_QT_FOUND ) - set( _gpgme_flavours "${_gpgme_flavours} Qt" ) -endif() - -if ( GPGME_PTHREAD_FOUND ) - set( _gpgme_flavours "${_gpgme_flavours} pthread" ) -endif() - -if ( GPGME_PTH_FOUND ) - set( _gpgme_flavours "${_gpgme_flavours} pth" ) -endif() - -# determine the library in one of the found flavours, can be reused e.g. by FindQgpgme.cmake, Alex -foreach(_currentFlavour vanilla glib qt pth pthread) - if(NOT GPGME_LIBRARY_DIR) - get_filename_component(GPGME_LIBRARY_DIR "${_gpgme_${_currentFlavour}_lib}" PATH) - endif() -endforeach() - -if ( NOT Gpgme_FIND_QUIETLY ) - - if ( GPGME_FOUND ) - message( STATUS "Usable gpgme flavours found: ${_gpgme_flavours}" ) - else() - message( STATUS "No usable gpgme flavours found." ) - endif() - -endif() - -if ( Gpgme_FIND_REQUIRED AND NOT GPGME_FOUND ) - message( FATAL_ERROR "Did not find GPGME" ) -endif() - - -if ( WIN32 ) - set( _gpgme_homepage "http://www.gpg4win.org" ) -else() - set( _gpgme_homepage "http://www.gnupg.org/related_software/gpgme" ) -endif() - -set_package_properties(Gpgme PROPERTIES - DESCRIPTION "The GnuPG Made Easy (GPGME) library)" - URL ${_gpgme_homepage}) - -set( CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS_gpgme_saved ) diff -Nru kf5-messagelib-16.04.3/CMakeLists.txt kf5-messagelib-16.12.3/CMakeLists.txt --- kf5-messagelib-16.04.3/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -2,7 +2,42 @@ project(Messagelib) -find_package(ECM 5.19.0 CONFIG REQUIRED) +option(MIMETREEPARSER_ONLY_BUILD "Build only mimetreeparser" FALSE) +option(KDEPIM_ENTERPRISE_BUILD "Enable features specific to the enterprise branch, which are normally disabled. Also, it disables many components not needed for Kontact such as the Kolab client." FALSE) + +set(KF5_VERSION "5.28.0") + +set(PIM_VERSION "5.4.3") + +set(MESSAGELIB_LIB_VERSION ${PIM_VERSION}) +set(AKONADIMIME_LIB_VERSION "5.4.3") + +set(QT_REQUIRED_VERSION "5.6.0") + +set(AKONADI_VERSION "5.4.3") +set(AKONADINOTES_LIB_VERSION "5.4.3") +set(GRANTLEETHEME_LIB_VERSION "5.4.3") +set(GRAVATAR_LIB_VERSION "5.4.3") +set(IDENTITYMANAGEMENT_LIB_VERSION "5.4.3") +set(KCONTACTS_LIB_VERSION "5.4.3") +set(KDEPIM_APPS_LIB_VERSION "5.4.3") +set(KLDAP_LIB_VERSION "5.4.3") +set(KMAILTRANSPORT_LIB_VERSION "5.4.3") +set(KMBOX_LIB_VERSION "5.4.3") +set(KMIME_LIB_VERSION "5.4.3") +set(KPIMTEXTEDIT_LIB_VERSION "5.4.3") +set(LIBKDEPIM_LIB_VERSION "5.4.3") +set(LIBKLEO_LIB_VERSION "5.4.3") +set(PIMCOMMON_LIB_VERSION "5.4.3") + +set(GPGME_LIB_VERSION "1.7.1") + +if (${MIMETREEPARSER_ONLY_BUILD}) + set(KF5_VERSION "5.26.0") + set(KMIME_LIB_VERSION "5.1.40") +endif() + +find_package(ECM ${KF5_VERSION} CONFIG REQUIRED) set(CMAKE_MODULE_PATH ${Messagelib_SOURCE_DIR}/cmake/modules ${ECM_MODULE_PATH}) set(LIBRARY_NAMELINK) include(GenerateExportHeader) @@ -10,7 +45,6 @@ include(ECMGenerateHeaders) include(ECMGeneratePriFile) include(ECMPackageConfigHelpers) -include(ECMSetupVersion) include(FeatureSummary) include(KDEInstallDirs) include(KDECMakeSettings) @@ -18,76 +52,62 @@ include(ECMQtDeclareLoggingCategory) include(ECMAddTests) -set(MESSAGELIB_LIB_VERSION "5.2.3") - -set(KF5_VERSION "5.19.0") -set(KDEPIMLIBS_LIB_VERSION "5.2.0") +find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED Gui Test) -set(QT_REQUIRED_VERSION "5.4.0") -set(KMIME_LIB_VERSION "5.2.0") -set(KLDAP_LIB_VERSION "5.2.0") -set(KPIMTEXTEDIT_LIB_VERSION "5.2.0") -set(KMAILTRANSPORT_LIB_VERSION "5.2.0") -set(IDENTITYMANAGEMENT_LIB_VERSION "5.2.0") -set(KCONTACTS_LIB_VERSION "5.2.0") -set(KMBOX_LIB_VERSION "5.2.0") -set(AKONADINOTES_LIB_VERSION "5.2.0") -set(KPIMTEXTEDIT_LIB_VERSION "5.2.0") -set(KDEPIM_APPS_LIB_VERSION "5.2.0") -set(LIBKDEPIM_LIB_VERSION "5.2.0") - -set(AKONADI_VERSION "5.2.0") - -find_package(KF5Akonadi ${AKONADI_VERSION} CONFIG REQUIRED) -find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED Widgets Test UiTools Network WebKitWidgets) +find_package(KF5Codecs ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5I18n ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5Mime ${KMIME_LIB_VERSION} CONFIG REQUIRED) -find_package(KF5AkonadiMime ${KDEPIMLIBS_LIB_VERSION} CONFIG REQUIRED) -find_package(KF5SendLater ${KDEPIM_APPS_LIB_VERSION} CONFIG REQUIRED) -find_package(KF5FollowupReminder ${KDEPIM_APPS_LIB_VERSION} CONFIG REQUIRED) -find_package(KF5Libkdepim ${LIBKDEPIM_LIB_VERSION} CONFIG REQUIRED) -find_package(KF5Archive ${KF5_VERSION} CONFIG REQUIRED) -find_package(Grantlee5 "5.0" CONFIG REQUIRED) -find_package(KF5Ldap ${KLDAP_LIB_VERSION} CONFIG REQUIRED) -find_package(KF5PimTextEdit ${KPIMTEXTEDIT_LIB_VERSION} CONFIG REQUIRED) -find_package(KF5MailTransport ${KMAILTRANSPORT_LIB_VERSION} CONFIG REQUIRED) -find_package(KF5IdentityManagement ${IDENTITYMANAGEMENT_LIB_VERSION} CONFIG REQUIRED) -find_package(KF5WebKit ${KF5_VERSION} CONFIG REQUIRED) -find_package(KF5IconThemes ${KF5_VERSION} CONFIG REQUIRED) -find_package(KF5Completion ${KF5_VERSION} CONFIG REQUIRED) -find_package(KF5Codecs ${KF5_VERSION} CONFIG REQUIRED) -find_package(KF5Config ${KF5_VERSION} CONFIG REQUIRED) -find_package(KF5XmlGui ${KF5_VERSION} CONFIG REQUIRED) -find_package(KF5AkonadiSearch "5.0.42" CONFIG REQUIRED) -set_package_properties(KF5AkonadiSearch PROPERTIES DESCRIPTION "The Akonadi Search libraries" URL "http://www.kde.org" TYPE REQUIRED PURPOSE "Provides search capabilities in KMail and Akonadi") - -find_package(KF5ItemViews ${KF5_VERSION} CONFIG REQUIRED) -find_package(KF5Contacts ${KCONTACTS_LIB_VERSION} CONFIG REQUIRED) -find_package(KF5Mbox ${KMBOX_LIB_VERSION} CONFIG REQUIRED) -find_package(KF5AkonadiNotes ${AKONADINOTES_LIB_VERSION} CONFIG REQUIRED) - -set(GRAVATAR_LIB_VERSION "5.2.0") -set(GRANTLEETHEME_LIB_VERSION "5.2.0") -set(KDEPIM_APPS_LIBS_LIB_VERSION "5.2.0") -set(LIBKLEO_LIB_VERSION "5.2.0") -set(PIMCOMMON_LIB_VERSION "5.2.0") -find_package(Gpgme REQUIRED) -find_package(KF5KaddressbookGrantlee ${KDEPIM_APPS_LIBS_LIB_VERSION} CONFIG REQUIRED) -find_package(KF5GrantleeTheme ${GRANTLEETHEME_LIB_VERSION} CONFIG REQUIRED) -find_package(KF5Gravatar ${GRAVATAR_LIB_VERSION} CONFIG REQUIRED) -find_package(KF5Libkleo ${LIBKLEO_LIB_VERSION} CONFIG REQUIRED) -find_package(KF5PimCommon ${PIMCOMMON_LIB_VERSION} CONFIG REQUIRED) +find_package(QGpgme ${GPGME_LIB_VERSION} CONFIG REQUIRED) -option(KDEPIM_ENTERPRISE_BUILD "Enable features specific to the enterprise branch, which are normally disabled. Also, it disables many components not needed for Kontact such as the Kolab client." FALSE) +if (${MIMETREEPARSER_ONLY_BUILD}) + if ( ${QGpgme_VERSION} VERSION_LESS "1.7.2" ) + find_package(KF5Libkleo ${LIBKLEO_LIB_VERSION} CONFIG REQUIRED) + endif() +else() + find_package(KF5Libkleo ${LIBKLEO_LIB_VERSION} CONFIG REQUIRED) +endif() -option(QTWEBENGINE_EXPERIMENTAL_OPTION "Enable support for qtwebengine. False by default." FALSE) +if (NOT ${MIMETREEPARSER_ONLY_BUILD}) + find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED Widgets Network PrintSupport WebEngine WebEngineWidgets WebKitWidgets) + find_package(KF5Archive ${KF5_VERSION} CONFIG REQUIRED) + find_package(KF5Completion ${KF5_VERSION} CONFIG REQUIRED) + find_package(KF5Config ${KF5_VERSION} CONFIG REQUIRED) + find_package(KF5ConfigWidgets ${KF5_VERSION} CONFIG REQUIRED) + find_package(KF5IconThemes ${KF5_VERSION} CONFIG REQUIRED) + find_package(KF5ItemViews ${KF5_VERSION} CONFIG REQUIRED) + find_package(KF5JobWidgets ${KF5_VERSION} CONFIG REQUIRED) + find_package(KF5KIO ${KF5_VERSION} CONFIG REQUIRED) + find_package(KF5Service ${KF5_VERSION} CONFIG REQUIRED) + find_package(KF5Sonnet ${KF5_VERSION} CONFIG REQUIRED) + find_package(KF5TextWidgets ${KF5_VERSION} CONFIG REQUIRED) + find_package(KF5WidgetsAddons ${KF5_VERSION} CONFIG REQUIRED) + find_package(KF5WindowSystem ${KF5_VERSION} CONFIG REQUIRED) + find_package(KF5XmlGui ${KF5_VERSION} CONFIG REQUIRED) + find_package(KF5SyntaxHighlighting ${KF5_VERSION} CONFIG REQUIRED) + + find_package(Grantlee5 "5.1" CONFIG REQUIRED) + + find_package(KF5Akonadi ${AKONADI_VERSION} CONFIG REQUIRED) + find_package(KF5AkonadiMime ${AKONADIMIME_LIB_VERSION} CONFIG REQUIRED) + find_package(KF5AkonadiNotes ${AKONADINOTES_LIB_VERSION} CONFIG REQUIRED) + find_package(KF5Contacts ${KCONTACTS_LIB_VERSION} CONFIG REQUIRED) + find_package(KF5FollowupReminder ${KDEPIM_APPS_LIB_VERSION} CONFIG REQUIRED) + find_package(KF5GrantleeTheme ${GRANTLEETHEME_LIB_VERSION} CONFIG REQUIRED) + find_package(KF5Gravatar ${GRAVATAR_LIB_VERSION} CONFIG REQUIRED) + find_package(KF5IdentityManagement ${IDENTITYMANAGEMENT_LIB_VERSION} CONFIG REQUIRED) + find_package(KF5KaddressbookGrantlee ${KDEPIM_APPS_LIB_VERSION} CONFIG REQUIRED) + find_package(KF5Ldap ${KLDAP_LIB_VERSION} CONFIG REQUIRED) + find_package(KF5Libkdepim ${LIBKDEPIM_LIB_VERSION} CONFIG REQUIRED) + find_package(KF5MailTransport ${KMAILTRANSPORT_LIB_VERSION} CONFIG REQUIRED) + find_package(KF5Mbox ${KMBOX_LIB_VERSION} CONFIG REQUIRED) + find_package(KF5PimCommon ${PIMCOMMON_LIB_VERSION} CONFIG REQUIRED) + find_package(KF5PimTextEdit ${KPIMTEXTEDIT_LIB_VERSION} CONFIG REQUIRED) + find_package(KF5SendLater ${KDEPIM_APPS_LIB_VERSION} CONFIG REQUIRED) -if (QTWEBENGINE_EXPERIMENTAL_OPTION) - set(QT_REQUIRED_MINIMUM_WEBENGINE_VERSION "5.6") - find_package(Qt5 ${QT_REQUIRED_MINIMUM_WEBENGINE_VERSION} CONFIG REQUIRED WebEngine WebEngineWidgets) + find_package(KF5AkonadiSearch "5.4.3" CONFIG REQUIRED) + set_package_properties(KF5AkonadiSearch PROPERTIES DESCRIPTION "The Akonadi Search libraries" URL "http://www.kde.org" TYPE REQUIRED PURPOSE "Provides search capabilities in KMail and Akonadi") endif() - # Support for the GIT revision number in messagecomposer-version.h if(EXISTS "${Messagelib_SOURCE_DIR}/.git") find_package(Git) @@ -101,15 +121,21 @@ execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --oneline --format=%ci WORKING_DIRECTORY ${Messagelib_SOURCE_DIR} OUTPUT_VARIABLE messagelib_git_last_change) - string(REGEX REPLACE " [0-9:+ ]*\n" "" messagelib_git_last_change "${messagelib_git_last_change}") + string(REGEX REPLACE " [-0-9:+ ]*\n" "" messagelib_git_last_change "${messagelib_git_last_change}") endif() -endif() +endif () -add_subdirectory(messageviewer) -add_subdirectory(templateparser) -add_subdirectory(messagecomposer) -add_subdirectory(messagecore) -add_subdirectory(messagelist) +add_definitions(-DQT_NO_URL_CAST_FROM_STRING) + +add_subdirectory(mimetreeparser) +if (NOT ${MIMETREEPARSER_ONLY_BUILD}) + add_subdirectory(messageviewer) + add_subdirectory(templateparser) + add_subdirectory(messagecomposer) + add_subdirectory(messagecore) + add_subdirectory(messagelist) + add_subdirectory(webengineviewer) +endif() -install( FILES messagelib.categories DESTINATION ${KDE_INSTALL_CONFDIR} ) +install( FILES messagelib.renamecategories messagelib.categories DESTINATION ${KDE_INSTALL_CONFDIR} ) feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) diff -Nru kf5-messagelib-16.04.3/COPYING kf5-messagelib-16.12.3/COPYING --- kf5-messagelib-16.04.3/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/COPYING 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,345 @@ +NOTE! The GPL below is copyrighted by the Free Software Foundation, but +the instance of code that it refers to (the kde programs) are copyrighted +by the authors who actually wrote it. + +--------------------------------------------------------------------------- + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff -Nru kf5-messagelib-16.04.3/COPYING.LIB kf5-messagelib-16.12.3/COPYING.LIB --- kf5-messagelib-16.04.3/COPYING.LIB 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/COPYING.LIB 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,508 @@ +NOTE! The LGPL below is copyrighted by the Free Software Foundation, but +the instance of code that it refers to (the kde libraries) are copyrighted +by the authors who actually wrote it. + +--------------------------------------------------------------------------- + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff -Nru kf5-messagelib-16.04.3/debian/changelog kf5-messagelib-16.12.3/debian/changelog --- kf5-messagelib-16.04.3/debian/changelog 2016-09-30 04:32:13.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/changelog 2017-05-01 19:27:51.000000000 +0000 @@ -1,3 +1,46 @@ +kf5-messagelib (4:16.12.3-0ubuntu1) artful; urgency=medium + + [ José Manuel Santamaría Lema ] + * Update Vcs-Git fields to use https:// instead of git:// + * Pass '-fno-keep-inline-functions' to gcc in the acc test in order to + avoid possible spurious test failures. + * Handle ABI breaks: + libkf5webengineviewer5 -> libkf5webengineviewer5abi1 + libkf5messageviewer5 -> libkf5messageviewer5abi1 + libkf5messagelist5 -> libkf5messagelist5abi1 + libkf5messagecore5 -> libkf5messagecore5abi1 + libkf5messagecomposer5 -> libkf5messagecomposer5abi1 + * Update symbols files for new binary packages: + - libkf5mimetreeparser5 + * Add libkf5messageviewer-plugins package + * Update -dev packages unsing the acc test, also add a couple of files + to libkf5messagecomposer-dev.acc.in so the acc test won't fail. + * Add kubuntu_disable_gpgagent_tests.diff + * Replace oxygen5-icon-theme autopkgtest depend with breeze-icon- + theme. + * Add kubuntu_disable_failing_tests.diff + * New upstream release (16.12.3) + + [ Rik Mills ] + * New build depend on libkf5syntaxhighlighting-dev + * Update install files + * Multi-archify & update descriptions + * Lintian overrides on source-is-missing webengineviewer + * Update gpgme build depends + * New upstream release (16.12.0) + * Update QtWebEngine and QtWebChannel dependency dev package names to + match debian packaging + * New upstream release (16.12.1) + + [ Clive Johnston ] + * New build depend on qtbase5-private-dev, thanks to Raymond at + KDE Neon for pointing this out. + + [ Darin Miller ] + * New upstream release (16.12.2) + + -- José Manuel Santamaría Lema Mon, 01 May 2017 20:27:51 +0100 + kf5-messagelib (4:16.04.3-0ubuntu1) yakkety; urgency=medium ** SNAPSHOT build @755b204350bffafa7b03a314a3b7e616126ec9c7 ** @@ -24,7 +67,14 @@ * Refreshing symbols and removing MISSING [ Rik Mills ] + * Build deps on libqt5webchannel-dev & libqt5webengine5-dev + * Add library packages for libkf5webengineviewer and libkf5mimetreeparser + and generate symbols + * Refresh existing symbols * Fix spelling error reported by lintian * Multi-archify libkf5templateparser5 + * New build depend on qtpositioning5-dev + * Fix & remove merge markers -- José Manuel Santamaría Lema Fri, 30 Sep 2016 06:32:13 +0200 + diff -Nru kf5-messagelib-16.04.3/debian/control kf5-messagelib-16.12.3/debian/control --- kf5-messagelib-16.04.3/debian/control 2016-09-30 04:32:13.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/control 2017-05-01 19:27:51.000000000 +0000 @@ -5,48 +5,55 @@ Uploaders: Maximiliano Curia Build-Depends: cmake (>= 2.8.12~), debhelper (>= 9), - extra-cmake-modules (>= 5.24.0~), + extra-cmake-modules (>= 5.31.0~), git, - libgpgme11-dev, + libgpgme-dev, + libgpgmepp-dev (>= 1.7.1~), libgrantlee5-dev (>= 5.0~), - libkf5akonadi-dev (>= 4:16.04.3~), - libkf5akonadimime-dev (>= 4:16.04.3~), - libkf5akonadinotes-dev (>= 4:16.04.3~), - libkf5akonadisearch-dev (>= 4:16.04.3~), - libkf5archive-dev (>= 5.24.0~), - libkf5codecs-dev (>= 5.24.0~), - libkf5completion-dev (>= 5.24.0~), - libkf5config-dev (>= 5.24.0~), - libkf5contacts-dev (>= 4:16.04.3~), - libkf5followupreminder-dev (>= 4:16.04.3~), - libkf5grantleetheme-dev (>= 16.04.3~), - libkf5gravatar-dev (>= 4:16.04.3~), - libkf5i18n-dev (>= 5.24.0~), - libkf5iconthemes-dev (>= 5.24.0~), - libkf5identitymanagement-dev (>= 16.04.3~), - libkf5itemviews-dev (>= 5.24.0~), - libkf5kaddressbookgrantlee-dev (>= 4:16.04.3~), - libkf5ldap-dev (>= 16.04.3~), - libkf5libkdepim-dev (>= 4:16.04.3~), - libkf5libkleo-dev (>= 4:16.04.3~), - libkf5mailtransport-dev (>= 16.04.3~), - libkf5mbox-dev (>= 16.04.3~), - libkf5mime-dev (>= 16.04.3~), - libkf5newstuff-dev (>= 5.24.0~), - libkf5pimcommon-dev (>= 4:16.04.3~), - libkf5pimtextedit-dev (>= 16.04.3~), - libkf5sendlater-dev (>= 4:16.04.3~), - libkf5webkit-dev (>= 5.24.0~), - libkf5windowsystem-dev (>= 5.24.0~), - libkf5xmlgui-dev (>= 5.24.0~), + libkf5akonadi-dev (>= 4:16.12.3~), + libkf5akonadimime-dev (>= 4:16.12.3~), + libkf5akonadinotes-dev (>= 4:16.12.3~), + libkf5akonadisearch-dev (>= 4:16.12.3~), + libkf5archive-dev (>= 5.31.0~), + libkf5codecs-dev (>= 5.31.0~), + libkf5completion-dev (>= 5.31.0~), + libkf5config-dev (>= 5.31.0~), + libkf5contacts-dev (>= 4:16.12.3~), + libkf5followupreminder-dev (>= 4:16.12.3~), + libkf5grantleetheme-dev (>= 16.12.3~), + libkf5gravatar-dev (>= 4:16.12.3~), + libkf5i18n-dev (>= 5.31.0~), + libkf5iconthemes-dev (>= 5.31.0~), + libkf5identitymanagement-dev (>= 16.12.3~), + libkf5itemviews-dev (>= 5.31.0~), + libkf5kaddressbookgrantlee-dev (>= 4:16.12.3~), + libkf5ldap-dev (>= 16.12.3~), + libkf5libkdepim-dev (>= 4:16.12.3~), + libkf5libkleo-dev (>= 4:16.12.3~), + libkf5mailtransport-dev (>= 16.12.3~), + libkf5mbox-dev (>= 16.12.3~), + libkf5mime-dev (>= 16.12.3~), + libkf5newstuff-dev (>= 5.31.0~), + libkf5pimcommon-dev (>= 4:16.12.3~), + libkf5pimtextedit-dev (>= 16.12.3~), + libkf5sendlater-dev (>= 4:16.12.3~), + libkf5syntaxhighlighting-dev (>= 5.31.0~), + libkf5webkit-dev (>= 5.31.0~), + libkf5windowsystem-dev (>= 5.31.0~), + libkf5xmlgui-dev (>= 5.31.0~), + libqt5webchannel5-dev (>= 5.6.1~), + libqt5webenginewidgets5, libqt5webkit5-dev (>= 5.4.0~), pkg-kde-tools (>= 0.12), qtbase5-dev (>= 5.6.1~), - qttools5-dev (>= 5.6.1~) + qtbase5-private-dev (>= 5.6.1~), + qtpositioning5-dev (>= 5.6.1~), + qttools5-dev (>= 5.6.1~), + qtwebengine5-dev (>= 5.6.1~) Standards-Version: 3.9.8 Homepage: http://pim.kde.org/ Vcs-Browser: https://code.launchpad.net/~kubuntu-packagers/kubuntu-packaging/+git/messagelib -Vcs-Git: git://git.launchpad.net/~kubuntu-packagers/kubuntu-packaging/+git/messagelib +Vcs-Git: https://git.launchpad.net/~kubuntu-packagers/kubuntu-packaging/+git/messagelib Package: kf5-messagelib-data Architecture: all @@ -59,7 +66,9 @@ . This package is part of KDE PIM module. -Package: libkf5messagecomposer5 +Package: libkf5messagecomposer5abi1 +X-Debian-ABI: 1 +X-CMake-Target: KF5MessageComposer Architecture: any Multi-Arch: same Depends: kf5-messagelib-data (= ${source:Version}), @@ -75,9 +84,15 @@ Section: libdevel Architecture: any Multi-Arch: same -Depends: libkf5identitymanagement-dev (>= 16.04.3~), - libkf5libkleo-dev (>= 4:16.04.3~), - libkf5messagecomposer5 (= ${binary:Version}), +Depends: libkf5akonadi-dev (>= 4:16.12.3~), + libkf5akonadimime-dev (>= 4:16.12.3~), + libkf5followupreminder-dev (>= 4:16.12.3~), + libkf5identitymanagement-dev (>= 16.12.3~), + libkf5libkdepim-dev (>= 4:16.12.3~), + libkf5libkleo-dev (>= 4:16.12.3~), + libkf5messagecomposer5abi1 (= ${binary:Version}), + libkf5mime-dev (>= 16.12.3~), + libkf5pimcommon-dev (>= 4:16.12.3~), ${misc:Depends}, ${shlibs:Depends} Description: KDE PIM messaging library, composer devel files @@ -86,7 +101,9 @@ . This package is part of KDE PIM module. -Package: libkf5messagecore5 +Package: libkf5messagecore5abi1 +X-Debian-ABI: 1 +X-CMake-Target: KF5MessageCore Architecture: any Multi-Arch: same Depends: kf5-messagelib-data (= ${source:Version}), @@ -102,7 +119,7 @@ Section: libdevel Architecture: any Multi-Arch: same -Depends: libkf5messagecore5 (= ${binary:Version}), +Depends: libkf5messagecore5abi1 (= ${binary:Version}), ${misc:Depends}, ${shlibs:Depends} Description: KDE PIM messaging library, core devel files @@ -111,7 +128,9 @@ . This package is part of KDE PIM module. -Package: libkf5messagelist5 +Package: libkf5messagelist5abi1 +X-Debian-ABI: 1 +X-CMake-Target: KF5MessageList Architecture: any Multi-Arch: same Depends: kf5-messagelib-data (= ${source:Version}), @@ -129,7 +148,7 @@ Section: libdevel Architecture: any Multi-Arch: same -Depends: libkf5messagelist5 (= ${binary:Version}), +Depends: libkf5messagelist5abi1 (= ${binary:Version}), ${misc:Depends}, ${shlibs:Depends} Description: KDE PIM messaging library, message list devel files @@ -139,7 +158,22 @@ . This package is part of KDE PIM module. -Package: libkf5messageviewer5 +Package: libkf5messageviewer-plugins +Architecture: any +Multi-Arch: same +Depends: ${misc:Depends}, + ${shlibs:Depends} +Breaks: kdepim-addons (<< 16.12.0~) +Replaces: kdepim-addons (<< 16.12.0~) +Description: KDE PIM messaging library, message viewer library + This package contains the message viewer library which implements feature-rich + and highly configurable widget for viewing e-mail messages. + . + This package is part of the KDE PIM module. + +Package: libkf5messageviewer5abi1 +X-Debian-ABI: 1 +X-CMake-Target: KF5MessageViewer Architecture: any Multi-Arch: same Depends: kf5-messagelib-data (= ${source:Version}), @@ -157,7 +191,7 @@ Section: libdevel Architecture: any Multi-Arch: same -Depends: libkf5messageviewer5 (= ${binary:Version}), +Depends: libkf5messageviewer5abi1 (= ${binary:Version}), ${misc:Depends}, ${shlibs:Depends} Description: KDE PIM messaging library, message viewer devel files @@ -194,3 +228,52 @@ forwarded messages. . This package is part of KDE PIM module. + +Package: libkf5mimetreeparser5 +Architecture: any +Multi-Arch: same +Depends: kf5-messagelib-data (= ${source:Version}), + ${misc:Depends}, + ${shlibs:Depends} +Description: KDE PIM Mime Tree parser library + This library implements a parser for the mime tree used by KMail. + . + This package is part of the KDE PIM module. + +Package: libkf5mimetreeparser-dev +Section: libdevel +Architecture: any +Multi-Arch: same +Depends: libkf5mimetreeparser5 (= ${binary:Version}), + ${misc:Depends}, + ${shlibs:Depends} +Description: KDE PIM Mime Tree parser library devel files + This library implements a parser for the mime tree used by KMail. + . + This package is part of the KDE PIM module. + +Package: libkf5webengineviewer5abi1 +X-Debian-ABI: 1 +X-CMake-Target: KF5WebEngineViewer +Architecture: any +Multi-Arch: same +Depends: kf5-messagelib-data (= ${source:Version}), + ${misc:Depends}, + ${shlibs:Depends} +Description: WebEngineViewer library + This library implements a WebEngineViewer. + . + This package is part of the KDE PIM module. + +Package: libkf5webengineviewer-dev +Section: libdevel +Architecture: any +Multi-Arch: same +Depends: libkf5webengineviewer5abi1 (= ${binary:Version}), + qtwebengine5-dev, + ${misc:Depends}, + ${shlibs:Depends} +Description: KDE's Qt Web Engine Viewer devel files + This library implements view on Qt Web Engine used by KDE PIM. + . + This package is part of the KDE PIM module. diff -Nru kf5-messagelib-16.04.3/debian/kf5-messagelib-data.install kf5-messagelib-16.12.3/debian/kf5-messagelib-data.install --- kf5-messagelib-16.04.3/debian/kf5-messagelib-data.install 2016-09-30 04:32:13.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/kf5-messagelib-data.install 2017-05-01 19:27:51.000000000 +0000 @@ -1,4 +1,5 @@ etc/xdg/messagelib.categories +etc/xdg/messagelib.renamecategories etc/xdg/messageviewer_header_themes.knsrc usr/share/config.kcfg/customtemplates_kfg.kcfg usr/share/config.kcfg/templatesconfiguration_kfg.kcfg diff -Nru kf5-messagelib-16.04.3/debian/libkf5messagecomposer5abi1.install kf5-messagelib-16.12.3/debian/libkf5messagecomposer5abi1.install --- kf5-messagelib-16.04.3/debian/libkf5messagecomposer5abi1.install 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messagecomposer5abi1.install 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,2 @@ +usr/lib/*/libKF5MessageComposer.so.5.* +usr/lib/*/libKF5MessageComposer.so.5abi1 diff -Nru kf5-messagelib-16.04.3/debian/libkf5messagecomposer5abi1.symbols kf5-messagelib-16.12.3/debian/libkf5messagecomposer5abi1.symbols --- kf5-messagelib-16.04.3/debian/libkf5messagecomposer5abi1.symbols 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messagecomposer5abi1.symbols 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,1211 @@ +# SymbolsHelper-Confirmed: 4:16.12.2 amd64 armhf i386 +libKF5MessageComposer.so.5abi1 libkf5messagecomposer5abi1 #MINVER# + ABI_5_1@ABI_5_1 4:16.12.2 + _ZN13MessageHelper10initHeaderERK14QSharedPointerIN5KMime7MessageEEPKN19KIdentityManagement15IdentityManagerEj@ABI_5_1 4:16.12.2 + _ZN13MessageHelper16extractAddrSpecsERK14QSharedPointerIN5KMime7MessageEERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10ActionTypeC1EP7QActionNS0_4TypeE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10ActionTypeC1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10ActionTypeC2EP7QActionNS0_4TypeE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10ActionTypeC2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10EncryptJob10setContentEPN5KMime7ContentE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10EncryptJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10EncryptJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10EncryptJob13setRecipientsERK11QStringList@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10EncryptJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10EncryptJob17setEncryptionKeysERKSt6vectorIN5GpgME3KeyESaIS3_EE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10EncryptJob22setCryptoMessageFormatEN4Kleo19CryptoMessageFormatE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10EncryptJob7processEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10EncryptJobC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10EncryptJobC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10EncryptJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10EncryptJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10EncryptJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10GlobalPart11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10GlobalPart11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10GlobalPart11setCharsetsERK5QListI10QByteArrayE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10GlobalPart13setGuiEnabledEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10GlobalPart14set8BitAllowedEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10GlobalPart15setMDNRequestedEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10GlobalPart16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10GlobalPart21setParentWidgetForGuiEP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10GlobalPart25setFallbackCharsetEnabledEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10GlobalPartC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10GlobalPartC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10GlobalPartD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10GlobalPartD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer10GlobalPartD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MainTextJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MainTextJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MainTextJob11setTextPartEPNS_8TextPartE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MainTextJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MainTextJob7doStartEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MainTextJob7processEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MainTextJobC1EPNS_8TextPartEP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MainTextJobC2EPNS_8TextPartEP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MainTextJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MainTextJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MainTextJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MessagePart11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MessagePart11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MessagePart16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MessagePartC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MessagePartC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MessagePartD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MessagePartD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer11MessagePartD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12ImageScaling11resizeImageEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12ImageScaling11setMimetypeERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12ImageScaling15generateNewNameEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12ImageScaling17loadImageFromDataERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12ImageScaling7setNameERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12ImageScalingC1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12ImageScalingC2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12ImageScalingD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12ImageScalingD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12MultipartJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12MultipartJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12MultipartJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12MultipartJob19setMultipartSubtypeERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12MultipartJob7processEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12MultipartJobC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12MultipartJobC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12MultipartJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12MultipartJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12MultipartJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12PluginEditor11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12PluginEditor11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12PluginEditor16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12PluginEditor8setOrderEi@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12PluginEditorC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12PluginEditorC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12PluginEditorD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12PluginEditorD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer12PluginEditorD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AkonadiSender11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AkonadiSender11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AkonadiSender12doSendQueuedEi@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AkonadiSender14queueJobResultEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AkonadiSender16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AkonadiSender18sendOrQueueMessageERK14QSharedPointerIN5KMime7MessageEENS_13MessageSender10SendMethodE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AkonadiSender6doSendERK14QSharedPointerIN5KMime7MessageEEs@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AkonadiSenderC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AkonadiSenderC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AkonadiSenderD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AkonadiSenderD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AkonadiSenderD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AttachmentJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AttachmentJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AttachmentJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AttachmentJob17setAttachmentPartE14QSharedPointerIN11MessageCore14AttachmentPartEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AttachmentJob7doStartEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AttachmentJob7processEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AttachmentJobC1E14QSharedPointerIN11MessageCore14AttachmentPartEEP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AttachmentJobC2E14QSharedPointerIN11MessageCore14AttachmentPartEEP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AttachmentJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AttachmentJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13AttachmentJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13SinglepartJob11contentTypeEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13SinglepartJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13SinglepartJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13SinglepartJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13SinglepartJob18contentDescriptionEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13SinglepartJob18contentDispositionEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13SinglepartJob23contentTransferEncodingEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13SinglepartJob7processEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13SinglepartJob7setDataERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13SinglepartJob9contentIDEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13SinglepartJobC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13SinglepartJobC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13SinglepartJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13SinglepartJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer13SinglepartJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14ContentJobBase10slotResultEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14ContentJobBase11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14ContentJobBase11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14ContentJobBase12appendSubjobEPS0_@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14ContentJobBase15setExtraContentEPN5KMime7ContentE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14ContentJobBase16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14ContentJobBase5startEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14ContentJobBase7doStartEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14ContentJobBase9addSubjobEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14ContentJobBaseC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14ContentJobBaseC1ERNS_21ContentJobBasePrivateEP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14ContentJobBaseC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14ContentJobBaseC2ERNS_21ContentJobBasePrivateEP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14ContentJobBaseD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14ContentJobBaseD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14ContentJobBaseD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory11createReplyEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory11setTemplateERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory12MDNRequestedERK14QSharedPointerIN5KMime7MessageEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory12applyCharsetE14QSharedPointerIN5KMime7MessageEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory12createResendEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory12identityUoidERK14QSharedPointerIN5KMime7MessageEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory12setSelectionERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory13createForwardEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory14createRedirectERK7QStringS3_S3_iS3_i@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory16setReplyStrategyENS_13ReplyStrategyE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory17setFolderIdentityEx@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory18MDNReturnPathEmptyERK14QSharedPointerIN5KMime7MessageEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory18setIdentityManagerEPN19KIdentityManagement15IdentityManagerE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory19MDNMDNUnknownOptionERK14QSharedPointerIN5KMime7MessageEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory21createAttachedForwardERK7QVectorIN7Akonadi4ItemEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory21createDeliveryReceiptEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory22putRepliesInSameFolderEx@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory22replaceHeadersInStringERK14QSharedPointerIN5KMime7MessageEERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory23createForwardDigestMIMEERK7QVectorIN7Akonadi4ItemEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory23setMailingListAddressesERK7QVectorIN5KMime5Types7MailboxEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory27MDNReturnPathNotInRecieptToERK14QSharedPointerIN5KMime7MessageEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory28MDNConfirmMultipleRecipientsERK14QSharedPointerIN5KMime7MessageEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory30createForwardAttachmentMessageERK14QSharedPointerIN5KMime7MessageEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory8setQuoteEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory9createMDNEN5KMime3MDN10ActionModeENS2_15DispositionTypeENS2_11SendingModeEiRK7QVectorINS2_19DispositionModifierEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactory9getRefStrERK14QSharedPointerIN5KMime7MessageEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactoryC1ERK14QSharedPointerIN5KMime7MessageEExRKN7Akonadi10CollectionE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactoryC2ERK14QSharedPointerIN5KMime7MessageEExRKN7Akonadi10CollectionE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactoryD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactoryD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14MessageFactoryD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14SignEncryptJob10setContentEPN5KMime7ContentE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14SignEncryptJob11origContentEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14SignEncryptJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14SignEncryptJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14SignEncryptJob13setRecipientsERK11QStringList@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14SignEncryptJob14setSigningKeysERSt6vectorIN5GpgME3KeyESaIS3_EE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14SignEncryptJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14SignEncryptJob17setEncryptionKeysERKSt6vectorIN5GpgME3KeyESaIS3_EE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14SignEncryptJob22setCryptoMessageFormatEN4Kleo19CryptoMessageFormatE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14SignEncryptJob7processEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14SignEncryptJobC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14SignEncryptJobC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14SignEncryptJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14SignEncryptJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14SignEncryptJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14TransparentJob10setContentEPN5KMime7ContentE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14TransparentJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14TransparentJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14TransparentJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14TransparentJob7processEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14TransparentJobC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14TransparentJobC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14TransparentJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14TransparentJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer14TransparentJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel11setModifiedEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel11signEnabledEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel13addAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel14encryptEnabledEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel14setSignEnabledEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel15setSignSelectedEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel16removeAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel16updateAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel17attachmentRemovedE14QSharedPointerIN11MessageCore14AttachmentPartEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel17replaceAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEES4_@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel17setEncryptEnabledEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel18autoDisplayEnabledEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel18setEncryptSelectedEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel19attachUrlsRequestedERK5QListI4QUrlE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel20attachItemsRequesterERK7QVectorIN7Akonadi4ItemEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel21setAutoDisplayEnabledEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel27attachmentCompressRequestedE14QSharedPointerIN11MessageCore14AttachmentPartEEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModel7setDataERK11QModelIndexRK8QVarianti@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModelC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModelC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModelD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModelD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15AttachmentModelD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG11analyzeLineERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG11eventFilterEP7QObjectP6QEvent@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG11fixTabOrderEP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG11iconClickedEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG12addRecipientEPS0_RK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG12countChangedEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG12typeModifiedEPS0_@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG13activeChangedEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG13clearModifiedEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG14dataFromFieldsEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG14fieldsFromDataEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG14setColumnWidthEi@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG16setRecipientTypeENS_9Recipient4TypeE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG16slotAddRecipientERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG16slotTypeModifiedEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG17setCompletionModeEN11KCompletion14CompletionModeE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG19slotEditingFinishedEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG20setEnableIndexSearchEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG22setEnableAkonadiSearchEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG22setRecentAddressConfigEP7KConfig@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG5clearEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG7setDataERK14QSharedPointerIN4KPIM19MultiplyingLineDataEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG7setIconERK5QIconRK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNG8activateEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNGC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer15RecipientLineNGC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16AliasesExpandJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16AliasesExpandJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16AliasesExpandJob15finishExpansionEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16AliasesExpandJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16AliasesExpandJob25slotNicknameExpansionDoneEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16AliasesExpandJob33slotDistributionListExpansionDoneEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16AliasesExpandJob5startEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16AliasesExpandJobC1ERK7QStringS3_P7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16AliasesExpandJobC2ERK7QStringS3_P7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16AliasesExpandJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16AliasesExpandJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16AliasesExpandJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerLineEdit11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerLineEdit11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerLineEdit13keyPressEventEP9QKeyEvent@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerLineEdit16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerLineEdit7focusUpEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerLineEdit9focusDownEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerLineEditC1EbP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerLineEditC2EbP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerLineEditD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerLineEditD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerLineEditD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase10enableHtmlEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase10setMessageERK14QSharedPointerIN5KMime7MessageEEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase10setReplyToERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase10setSubjectERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase11disableHtmlENS0_12ConfirmationE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase11saveMessageERK14QSharedPointerIN5KMime7MessageEENS_13MessageSender6SaveInE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase11setCharsetsERK5QListI10QByteArrayE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase11setFccComboEPN7Akonadi18CollectionComboBoxE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase12fillInfoPartEPNS_8InfoPartENS0_18RecipientExpansionE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase12initAutoSaveEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase12queueMessageERK14QSharedPointerIN5KMime7MessageEEPNS_8ComposerE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase13addAttachmentERK4QUrlRK7QStringb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase13addAttachmentERK7QStringS3_S3_RK10QByteArrayS6_@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase13clearFollowUpEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase13collectImagesEPN5KMime7ContentE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase13identityComboEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase13setDictionaryEPN6Sonnet18DictionaryComboBoxE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase14cleanEmailListERK11QStringList@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase14fillGlobalPartEPNS_10GlobalPartE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase14updateAutoSaveEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase14updateTemplateERK14QSharedPointerIN5KMime7MessageEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase15attachmentModelEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase15autoSaveMessageEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase15cleanupAutoSaveEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase15identityChangedERKN19KIdentityManagement8IdentityES4_b@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase15identityManagerEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase15readyForSendingEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase15setCustomHeaderERK4QMapI10QByteArray7QStringE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase15setFollowUpDateERK5QDate@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase15setMDNRequestedEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase15slotQueueResultEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase15slotSaveMessageEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase16recipientsEditorEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase16saveMailSettingsEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase16sentSuccessfullyEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase16setCryptoOptionsEbbN4Kleo19CryptoMessageFormatEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase16setIdentityComboEPN19KIdentityManagement13IdentityComboE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase16setSendLaterInfoEPN9SendLater13SendLaterInfoE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase16updateRecipientsERKN19KIdentityManagement8IdentityES4_NS_9Recipient4TypeE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase17addAttachmentPartEPN5KMime7ContentE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase17setTransportComboEPN13MailTransport17TransportComboBoxE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase18setAttachmentModelEPNS_15AttachmentModelE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase18setIdentityManagerEPN19KIdentityManagement15IdentityManagerE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase19addFollowupReminderERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase19fillQueueJobHeadersEPN13MailTransport15MessageQueueJobE14QSharedPointerIN5KMime7MessageEEPKNS_8InfoPartE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase19saveRecentAddressesERK14QSharedPointerIN5KMime7MessageEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase19setAutoSaveFileNameERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase19setAutoSaveIntervalEi@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase19setRecipientsEditorEPNS_16RecipientsEditorE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase19signatureControllerEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase19writeAutoSaveToDiskERK14QSharedPointerIN5KMime7MessageEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase20attachmentControllerEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase20createSimpleComposerEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase20slotCreateItemResultEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase21hasMissingAttachmentsERK11QStringList@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase21setFollowUpCollectionERKN7Akonadi10CollectionE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase21setParentWidgetForGuiEP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase21slotSendComposeResultEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase22determineWhetherToSignEbPN4Kleo11KeyResolverEbRbS4_@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase22generateCryptoMessagesERb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase22setSignatureControllerEPNS_19SignatureControllerE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase23setAttachmentControllerEPNS_24AttachmentControllerBaseE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase24slotEmailAddressResolvedEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase25determineWhetherToEncryptEbPN4Kleo11KeyResolverEbbRbS4_@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase25slotAutoSaveComposeResultEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase26checkForMissingAttachmentsERK11QStringList@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase28markAllAttachmentsForSigningEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase28slotFccCollectionCheckResultEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase31inlineSigningEncryptionSelectedEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase31markAllAttachmentsForEncryptionEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase4sendENS_13MessageSender10SendMethodENS1_6SaveInEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase6failedERK7QStringNS0_10FailedTypeE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase6setFccERKN7Akonadi10CollectionE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase7setFromERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase8modifiedEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase9setEditorEPNS_18RichTextComposerNgE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBase9setUrgentEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBaseC1EP7QObjectP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBaseC2EP7QObjectP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBaseD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBaseD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16ComposerViewBaseD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditor11eventFilterEP7QObjectP6QEvent@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditor11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditor11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditor12addRecipientEPNS_15RecipientLineNGERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditor12addRecipientERK7QStringNS_9Recipient4TypeE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditor13slotLineAddedEPN4KPIM15MultiplyingLineE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditor15removeRecipientERK7QStringNS_9Recipient4TypeE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditor15slotLineDeletedEi@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditor16selectRecipientsEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditor16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditor18setRecipientStringERK7QVectorIN5KMime5Types7MailboxEENS_9Recipient4TypeE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditor18slotCalculateTotalEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditor19slotPickedRecipientERKNS_9RecipientERb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditor20saveDistributionListEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditor22setRecentAddressConfigEP7KConfig@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditorC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditorC1EPNS_20RecipientLineFactoryEP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditorC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditorC2EPNS_20RecipientLineFactoryEP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditorD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditorD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer16RecipientsEditorD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17InsertTextFileJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17InsertTextFileJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17InsertTextFileJob11setEncodingERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17InsertTextFileJob12slotFileDataEPN3KIO3JobERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17InsertTextFileJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17InsertTextFileJob18slotGetJobFinishedEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17InsertTextFileJob5startEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17InsertTextFileJobC1EP9QTextEditRK4QUrl@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17InsertTextFileJobC2EP9QTextEditRK4QUrl@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17InsertTextFileJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17InsertTextFileJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17InsertTextFileJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17RecipientLineEdit11leftPressedEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17RecipientLineEdit11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17RecipientLineEdit11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17RecipientLineEdit12rightPressedEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17RecipientLineEdit13keyPressEventEP9QKeyEvent@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17RecipientLineEdit16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17RecipientLineEdit8deleteMeEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17RecipientLineEditC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer17RecipientLineEditC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidget10loadConfigEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidget11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidget11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidget11writeConfigEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidget12initComboBoxEP9KComboBox@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidget14resetToDefaultEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidget14updateSettingsEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidget16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidget19slotComboboxChangedEi@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidget19slotHelpLinkClickedERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidget20initWriteImageFormatEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidget23slotSourceFilterClickedEi@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidget26slotRecipientFilterClickedEi@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidget30updateEmailsFilterTypeSettingsEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidget30updateFilterSourceTypeSettingsEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidget7changedEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidgetC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidgetC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidgetD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidgetD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18ImageScalingWidgetD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18RichTextComposerNg11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18RichTextComposerNg11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18RichTextComposerNg15insertSignatureERKN19KIdentityManagement9SignatureENS2_9PlacementE6QFlagsINS2_13AddedTextFlagEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18RichTextComposerNg16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18RichTextComposerNg17setAutocorrectionEPN9PimCommon14AutoCorrectionE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18RichTextComposerNg19forceAutoCorrectionEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18RichTextComposerNg20fillComposerTextPartEPNS_8TextPartE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18RichTextComposerNg21processAutoCorrectionEP9QKeyEvent@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18RichTextComposerNg25setAutocorrectionLanguageERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18RichTextComposerNgC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18RichTextComposerNgC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18RichTextComposerNgD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18RichTextComposerNgD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18RichTextComposerNgD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18SkeletonMessageJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18SkeletonMessageJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18SkeletonMessageJob11setInfoPartEPNS_8InfoPartE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18SkeletonMessageJob13setGlobalPartEPNS_10GlobalPartE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18SkeletonMessageJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18SkeletonMessageJob5startEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18SkeletonMessageJobC1EPNS_8InfoPartEPNS_10GlobalPartEP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18SkeletonMessageJobC2EPNS_8InfoPartEPNS_10GlobalPartEP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18SkeletonMessageJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18SkeletonMessageJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer18SkeletonMessageJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19PluginEditorManager11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19PluginEditorManager11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19PluginEditorManager16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19PluginEditorManager20pluginFromIdentifierERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19PluginEditorManager4selfEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19PluginEditorManagerC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19PluginEditorManagerC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19PluginEditorManagerD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19PluginEditorManagerD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19PluginEditorManagerD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureController10cleanSpaceEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureController10enableHtmlEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureController11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureController11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureController14applySignatureERKN19KIdentityManagement9SignatureE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureController14signatureAddedEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureController15appendSignatureEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureController15identityChangedEj@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureController16prependSignatureEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureController16setIdentityComboEPN19KIdentityManagement13IdentityComboE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureController16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureController21applyCurrentSignatureEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureController21insertSignatureHelperEN19KIdentityManagement9Signature9PlacementE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureController23insertSignatureAtCursorEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureController6resumeEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureController7suspendEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureController9setEditorEPNS_18RichTextComposerNgE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureControllerC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureControllerC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureControllerD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureControllerD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer19SignatureControllerD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer20RecipientLineFactory11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer20RecipientLineFactory11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer20RecipientLineFactory16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer20RecipientLineFactory17maximumRecipientsEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer20RecipientLineFactory7newLineEP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer20RecipientLineFactoryC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer20RecipientLineFactoryC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer21PluginEditorInterface11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer21PluginEditorInterface11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer21PluginEditorInterface13setActionTypeENS_10ActionTypeE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer21PluginEditorInterface16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer21PluginEditorInterface17setRichTextEditorEPN12KPIMTextEdit14RichTextEditorE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer21PluginEditorInterface18actionXmlExtensionENS_10ActionType4TypeE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer21PluginEditorInterface19emitPluginActivatedEPS0_@ABI_5_1 4:16.12.2 + _ZN15MessageComposer21PluginEditorInterfaceC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer21PluginEditorInterfaceC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer21PluginEditorInterfaceD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer21PluginEditorInterfaceD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer21PluginEditorInterfaceD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer22EmailAddressResolveJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer22EmailAddressResolveJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer22EmailAddressResolveJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer22EmailAddressResolveJob20setDefaultDomainNameERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer22EmailAddressResolveJob22slotAliasExpansionDoneEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer22EmailAddressResolveJob5setCcERK11QStringList@ABI_5_1 4:16.12.2 + _ZN15MessageComposer22EmailAddressResolveJob5setToERK11QStringList@ABI_5_1 4:16.12.2 + _ZN15MessageComposer22EmailAddressResolveJob5startEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer22EmailAddressResolveJob6setBccERK11QStringList@ABI_5_1 4:16.12.2 + _ZN15MessageComposer22EmailAddressResolveJob7setFromERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer22EmailAddressResolveJobC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer22EmailAddressResolveJobC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer22EmailAddressResolveJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer22EmailAddressResolveJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer22EmailAddressResolveJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer23MessageComposerSettings11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer23MessageComposerSettings11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer23MessageComposerSettings11requestSyncEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer23MessageComposerSettings11slotSyncNowEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer23MessageComposerSettings16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer23MessageComposerSettings4selfEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer23MessageComposerSettings5mSelfE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer23MessageComposerSettingsC1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer23MessageComposerSettingsC2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer23MessageComposerSettingsD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer23MessageComposerSettingsD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer23MessageComposerSettingsD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase11addOwnVcardEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase11attachFilesERK5QListI4QUrlERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase12fileAttachedEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase13addAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase13addAttachmentERK4QUrl@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase13createActionsEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase13slotPutResultEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase14actionsCreatedEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase14addAttachmentsERK5QListI4QUrlE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase14editAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEEN13MessageViewer13EditorWatcher14OpenWithOptionE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase14openAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase14setSignEnabledEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase14showAttachmentEPN5KMime7ContentERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase14viewAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase15attachDirectoryERK4QUrl@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase15exportPublicKeyERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase15showAttachVcardEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase15showContextMenuEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase16refreshSelectionEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase16saveAttachmentAsE14QSharedPointerIN11MessageCore14AttachmentPartEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase16setSelectedPartsERK5QListI14QSharedPointerIN11MessageCore14AttachmentPartEEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase17attachMyPublicKeyEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase17setAttachOwnVcardEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase17setEncryptEnabledEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase18compressAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase18editAttachmentWithE14QSharedPointerIN11MessageCore14AttachmentPartEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase18slotOpenWithActionEP7QAction@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase18slotOpenWithDialogEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase20addAttachmentUrlSyncERK4QUrl@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase20attachmentPropertiesE14QSharedPointerIN11MessageCore14AttachmentPartEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase21byteArrayToRemoteFileERK10QByteArrayRK4QUrlb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase21enableAttachPublicKeyEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase21selectedAllAttachmentEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase22setIdentityHasOwnVcardEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase23enableAttachMyPublicKeyEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase25showAttachPublicKeyDialogEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase27showAddAttachmentFileDialogEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase42showAddAttachmentCompressedDirectoryDialogEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBase8openWithERK28QExplicitlySharedDataPointerI8KServiceE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBaseC1EPNS_15AttachmentModelEP7QWidgetP17KActionCollection@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBaseC2EPNS_15AttachmentModelEP7QWidgetP17KActionCollection@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBaseD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBaseD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer24AttachmentControllerBaseD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer25FollowupReminderCreateJob10setSubjectERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer25FollowupReminderCreateJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer25FollowupReminderCreateJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer25FollowupReminderCreateJob12setMessageIdERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer25FollowupReminderCreateJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer25FollowupReminderCreateJob17setCollectionToDoERKN7Akonadi10CollectionE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer25FollowupReminderCreateJob17slotCreateNewTodoEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer25FollowupReminderCreateJob23setFollowUpReminderDateERK5QDate@ABI_5_1 4:16.12.2 + _ZN15MessageComposer25FollowupReminderCreateJob24setOriginalMessageItemIdEx@ABI_5_1 4:16.12.2 + _ZN15MessageComposer25FollowupReminderCreateJob25writeFollowupReminderInfoEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer25FollowupReminderCreateJob5setToERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer25FollowupReminderCreateJob5startEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer25FollowupReminderCreateJobC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer25FollowupReminderCreateJobC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer25FollowupReminderCreateJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer25FollowupReminderCreateJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer25FollowupReminderCreateJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26AttachmentFromPublicKeyJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26AttachmentFromPublicKeyJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26AttachmentFromPublicKeyJob14setFingerprintERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26AttachmentFromPublicKeyJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26AttachmentFromPublicKeyJob7doStartEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26AttachmentFromPublicKeyJobC1ERK7QStringP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26AttachmentFromPublicKeyJobC2ERK7QStringP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26AttachmentFromPublicKeyJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26AttachmentFromPublicKeyJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26AttachmentFromPublicKeyJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26RichTextComposerSignatures11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26RichTextComposerSignatures11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26RichTextComposerSignatures15cleanWhitespaceERKN19KIdentityManagement9SignatureE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26RichTextComposerSignatures16replaceSignatureERKN19KIdentityManagement9SignatureES4_@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26RichTextComposerSignatures16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26RichTextComposerSignaturesC1EPNS_18RichTextComposerNgEP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26RichTextComposerSignaturesC2EPNS_18RichTextComposerNgEP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26RichTextComposerSignaturesD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26RichTextComposerSignaturesD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer26RichTextComposerSignaturesD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27MessageComposerSettingsBase4selfEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27MessageComposerSettingsBaseC1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27MessageComposerSettingsBaseC2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27MessageComposerSettingsBaseD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27MessageComposerSettingsBaseD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27MessageComposerSettingsBaseD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27PluginEditorCheckBeforeSend11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27PluginEditorCheckBeforeSend11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27PluginEditorCheckBeforeSend12setIsEnabledEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27PluginEditorCheckBeforeSend13configChangedEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27PluginEditorCheckBeforeSend16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27PluginEditorCheckBeforeSend17emitConfigChangedEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27PluginEditorCheckBeforeSend19showConfigureDialogEP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27PluginEditorCheckBeforeSendC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27PluginEditorCheckBeforeSendC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27PluginEditorCheckBeforeSendD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27PluginEditorCheckBeforeSendD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer27PluginEditorCheckBeforeSendD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer32FollowUpReminderSelectDateDialog11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer32FollowUpReminderSelectDateDialog11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer32FollowUpReminderSelectDateDialog14updateOkButtonEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer32FollowUpReminderSelectDateDialog15slotDateChangedEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer32FollowUpReminderSelectDateDialog16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer32FollowUpReminderSelectDateDialog6acceptEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer32FollowUpReminderSelectDateDialogC1EP7QWidgetP18QAbstractItemModel@ABI_5_1 4:16.12.2 + _ZN15MessageComposer32FollowUpReminderSelectDateDialogC2EP7QWidgetP18QAbstractItemModel@ABI_5_1 4:16.12.2 + _ZN15MessageComposer32FollowUpReminderSelectDateDialogD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer32FollowUpReminderSelectDateDialogD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer32FollowUpReminderSelectDateDialogD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33AttachmentVcardFromAddressBookJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33AttachmentVcardFromAddressBookJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33AttachmentVcardFromAddressBookJob13addAttachmentERK10QByteArrayRK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33AttachmentVcardFromAddressBookJob14invalidContactEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33AttachmentVcardFromAddressBookJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33AttachmentVcardFromAddressBookJob21slotExpandGroupResultEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33AttachmentVcardFromAddressBookJob7doStartEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33AttachmentVcardFromAddressBookJobC1ERKN7Akonadi4ItemEP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33AttachmentVcardFromAddressBookJobC2ERKN7Akonadi4ItemEP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33AttachmentVcardFromAddressBookJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33AttachmentVcardFromAddressBookJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33AttachmentVcardFromAddressBookJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33PluginEditorCheckBeforeSendParams10setSubjectERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33PluginEditorCheckBeforeSendParams11setHtmlMailEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33PluginEditorCheckBeforeSendParams11setIdentityEj@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33PluginEditorCheckBeforeSendParams12setPlainTextERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33PluginEditorCheckBeforeSendParams14setCcAddressesERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33PluginEditorCheckBeforeSendParams14setToAddressesERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33PluginEditorCheckBeforeSendParams14setTransportIdEi@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33PluginEditorCheckBeforeSendParams15setBccAddressesERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33PluginEditorCheckBeforeSendParams16setDefaultDomainERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33PluginEditorCheckBeforeSendParams16setHasAttachmentEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33PluginEditorCheckBeforeSendParamsC1ERKS0_@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33PluginEditorCheckBeforeSendParamsC1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33PluginEditorCheckBeforeSendParamsC2ERKS0_@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33PluginEditorCheckBeforeSendParamsC2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33PluginEditorCheckBeforeSendParamsD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33PluginEditorCheckBeforeSendParamsD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer33PluginEditorCheckBeforeSendParamsaSERKS0_@ABI_5_1 4:16.12.2 + _ZN15MessageComposer34PluginEditorCheckBeforeSendManager11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer34PluginEditorCheckBeforeSendManager11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer34PluginEditorCheckBeforeSendManager16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer34PluginEditorCheckBeforeSendManager20pluginFromIdentifierERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer34PluginEditorCheckBeforeSendManager4selfEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer34PluginEditorCheckBeforeSendManagerC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer34PluginEditorCheckBeforeSendManagerC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer34PluginEditorCheckBeforeSendManagerD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer34PluginEditorCheckBeforeSendManagerD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer34PluginEditorCheckBeforeSendManagerD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer36PluginEditorCheckBeforeSendInterface11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer36PluginEditorCheckBeforeSendInterface11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer36PluginEditorCheckBeforeSendInterface12reloadConfigEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer36PluginEditorCheckBeforeSendInterface13setParametersERKNS_33PluginEditorCheckBeforeSendParamsE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer36PluginEditorCheckBeforeSendInterface15setParentWidgetEP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer36PluginEditorCheckBeforeSendInterface16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer36PluginEditorCheckBeforeSendInterfaceC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer36PluginEditorCheckBeforeSendInterfaceC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer36PluginEditorCheckBeforeSendInterfaceD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer36PluginEditorCheckBeforeSendInterfaceD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer36PluginEditorCheckBeforeSendInterfaceD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer42PluginEditorCheckBeforeSendConfigureWidget11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer42PluginEditorCheckBeforeSendConfigureWidget11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer42PluginEditorCheckBeforeSendConfigureWidget16configureChangedEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer42PluginEditorCheckBeforeSendConfigureWidget16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer42PluginEditorCheckBeforeSendConfigureWidgetC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer42PluginEditorCheckBeforeSendConfigureWidgetC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer42PluginEditorCheckBeforeSendConfigureWidgetD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer42PluginEditorCheckBeforeSendConfigureWidgetD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer42PluginEditorCheckBeforeSendConfigureWidgetD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer4Util13selectCharsetERK5QListI10QByteArrayERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer4Util17findTypeInMessageEPN5KMime7ContentERK10QByteArrayS6_@ABI_5_1 4:16.12.2 + _ZN15MessageComposer4Util18AttachmentKeywordsEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer4Util21cleanedUpHeaderStringERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer4Util25removeNotNecessaryHeadersERK14QSharedPointerIN5KMime7MessageEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer4Util26sendMailDispatcherIsOnlineEP7QWidget@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7JobBase10globalPartEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7JobBase11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7JobBase11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7JobBase16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7JobBaseC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7JobBaseC1ERNS_14JobBasePrivateEP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7JobBaseC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7JobBaseC2ERNS_14JobBasePrivateEP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7JobBaseD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7JobBaseD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7JobBaseD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7SignJob10setContentEPN5KMime7ContentE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7SignJob11origContentEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7SignJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7SignJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7SignJob14setSigningKeysERSt6vectorIN5GpgME3KeyESaIS3_EE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7SignJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7SignJob22setCryptoMessageFormatEN4Kleo19CryptoMessageFormatE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7SignJob7processEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7SignJobC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7SignJobC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7SignJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7SignJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer7SignJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8Composer10slotResultEP4KJob@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8Composer11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8Composer11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8Composer11setAutoSaveEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8Composer11setNoCryptoEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8Composer14setSigningKeysERSt6vectorIN5GpgME3KeyESaIS3_EE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8Composer16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8Composer17addAttachmentPartE14QSharedPointerIN11MessageCore14AttachmentPartEEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8Composer17setEncryptionKeysERK5QListI5QPairI11QStringListSt6vectorIN5GpgME3KeyESaIS6_EEEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8Composer17setSignAndEncryptEbb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8Composer18addAttachmentPartsERK5QListI14QSharedPointerIN11MessageCore14AttachmentPartEEEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8Composer20removeAttachmentPartE14QSharedPointerIN11MessageCore14AttachmentPartEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8Composer22setMessageCryptoFormatEN4Kleo19CryptoMessageFormatE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8Composer5startEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8ComposerC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8ComposerC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8ComposerD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8ComposerD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8ComposerD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPart10setReplyToERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPart10setSubjectERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPart11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPart11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPart12setInReplyToERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPart12setUserAgentERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPart13setReferencesERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPart14setTransportIdEi@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPart15setExtraHeadersERK7QVectorIPN5KMime7Headers4BaseEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPart16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPart5setCcERK11QStringList@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPart5setToERK11QStringList@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPart6setBccERK11QStringList@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPart6setFccERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPart7setFromERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPart9setUrgentEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPartC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPartC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPartD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPartD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8InfoPartD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8TextPart11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8TextPart11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8TextPart12setCleanHtmlERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8TextPart16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8TextPart17setCleanPlainTextERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8TextPart17setEmbeddedImagesERK5QListI14QSharedPointerIN12KPIMTextEdit13EmbeddedImageEEE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8TextPart17setWarnBadCharsetEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8TextPart19setWrappedPlainTextERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8TextPart22setWordWrappingEnabledEb@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8TextPartC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8TextPartC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8TextPartD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8TextPartD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer8TextPartD2Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer9Recipient13allTypeLabelsEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer9Recipient19setEncryptionActionEN4Kleo6ActionE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer9Recipient5clearEv@ABI_5_1 4:16.12.2 + _ZN15MessageComposer9Recipient6setKeyERKN5GpgME3KeyE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer9Recipient7setNameERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer9Recipient7setTypeENS0_4TypeE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer9Recipient8idToTypeEi@ABI_5_1 4:16.12.2 + _ZN15MessageComposer9Recipient8setEmailERK7QString@ABI_5_1 4:16.12.2 + _ZN15MessageComposer9Recipient8typeToIdENS0_4TypeE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer9Recipient9typeLabelENS0_4TypeE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer9RecipientC1ERK7QStringNS0_4TypeE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer9RecipientC2ERK7QStringNS0_4TypeE@ABI_5_1 4:16.12.2 + _ZN15MessageComposer9RecipientD0Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer9RecipientD1Ev@ABI_5_1 4:16.12.2 + _ZN15MessageComposer9RecipientD2Ev@ABI_5_1 4:16.12.2 + (optional=templinst)_ZN7Akonadi4Item14setPayloadImplI14QSharedPointerIN5KMime7MessageEEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicEvE4typeERKS9_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZN7Akonadi4Item14setPayloadImplI14QSharedPointerIN8KCalCore9IncidenceEEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicEvE4typeERKS9_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZN7Akonadi4Item14setPayloadImplIN9KContacts12ContactGroupEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicEvE4typeERKS7_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZN7Akonadi4Item14setPayloadImplIN9KContacts9AddresseeEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicEvE4typeERKS7_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZN7QObject7connectIM4KJobFvPS1_NS1_14QPrivateSignalEEMN15MessageComposer16ComposerViewBaseEFvS2_EEEN11QMetaObject10ConnectionEPKN9QtPrivate15FunctionPointerIT_E6ObjectESE_PKNSD_IT0_E6ObjectESJ_N2Qt14ConnectionTypeE@ABI_5_1 4:16.12.2 + (arch=armhf)_ZN9QHashData9hasShrunkEv@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK12KConfigGroup9readEntryI10QByteArrayEET_PKcRKS2_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK12KConfigGroup9readEntryI5QSizeEET_PKcRKS2_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK12KConfigGroup9readEntryIiEET_PKcRKS1_@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer10ActionType4typeEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer10ActionType6actionEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer10EncryptJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer10EncryptJob10recipientsEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer10EncryptJob14encryptionKeysEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer10GlobalPart10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer10GlobalPart12MDNRequestedEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer10GlobalPart12isGuiEnabledEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer10GlobalPart13is8BitAllowedEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer10GlobalPart18parentWidgetForGuiEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer10GlobalPart24isFallbackCharsetEnabledEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer10GlobalPart8charsetsEb@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer11MainTextJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer11MainTextJob8textPartEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer11MessagePart10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer12ImageScaling10imageArrayEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer12ImageScaling8mimetypeEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer12MultipartJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer12MultipartJob16multipartSubtypeEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer12PluginEditor10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer12PluginEditor5orderEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer13AkonadiSender10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer13AttachmentJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer13AttachmentJob14attachmentPartEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer13SinglepartJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer13SinglepartJob4dataEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer14ContentJobBase10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer14ContentJobBase12extraContentEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer14ContentJobBase7contentEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer14SignEncryptJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer14SignEncryptJob10recipientsEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer14SignEncryptJob14encryptionKeysEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer14TransparentJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel10headerDataEiN2Qt11OrientationEi@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel10isModifiedEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel11attachmentsEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel11columnCountERK11QModelIndex@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel13isSignEnabledEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel14isSignSelectedEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel16isEncryptEnabledEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel17isEncryptSelectedEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel20isAutoDisplayEnabledEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel20supportedDropActionsEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel4dataERK11QModelIndexi@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel5flagsERK11QModelIndex@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel5indexEiiRK11QModelIndex@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel6parentERK11QModelIndex@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel8mimeDataERK5QListI11QModelIndexE@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel8rowCountERK11QModelIndex@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15AttachmentModel9mimeTypesEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15RecipientLineNG10isModifiedEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15RecipientLineNG10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15RecipientLineNG13recipientTypeEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15RecipientLineNG15recipientsCountEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15RecipientLineNG17canDeleteLineEditEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15RecipientLineNG17enableIndexSearchEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15RecipientLineNG19enableAkonadiSearchEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15RecipientLineNG4dataEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15RecipientLineNG6tabOutEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15RecipientLineNG7isEmptyEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15RecipientLineNG7rawDataEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15RecipientLineNG8isActiveEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer15RecipientLineNG9recipientEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16AliasesExpandJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16AliasesExpandJob16emailAddressOnlyEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16AliasesExpandJob22emptyDistributionListsEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16AliasesExpandJob9addressesEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerLineEdit10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerViewBase10dictionaryEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerViewBase10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerViewBase11isComposingEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerViewBase12followUpDateEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerViewBase13sendLaterInfoEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerViewBase16autoSaveIntervalEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerViewBase17transportComboBoxEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerViewBase18followUpCollectionEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerViewBase20defaultSpecialTargetEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerViewBase2ccEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerViewBase2toEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerViewBase3bccEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerViewBase4fromEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerViewBase6editorEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerViewBase7replyToEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerViewBase7subjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16ComposerViewBase8fccComboEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16RecipientsEditor10activeLineEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16RecipientsEditor10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16RecipientsEditor10recipientsEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16RecipientsEditor15activeRecipientEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16RecipientsEditor15recipientStringENS_9Recipient4TypeE@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16RecipientsEditor19recipientStringListENS_9Recipient4TypeE@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer16RecipientsEditor6pickerEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer17InsertTextFileJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer17RecipientLineEdit10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer18ImageScalingWidget10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer18RichTextComposerNg10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer18RichTextComposerNg11toCleanHtmlEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer18RichTextComposerNg14autocorrectionEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer18RichTextComposerNg17composerSignatureEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer18SkeletonMessageJob10globalPartEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer18SkeletonMessageJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer18SkeletonMessageJob7messageEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer18SkeletonMessageJob8infoPartEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer19PluginEditorManager10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer19PluginEditorManager11pluginsListEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer19PluginEditorManager15configGroupNameEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer19PluginEditorManager15pluginsDataListEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer19PluginEditorManager22configPrefixSettingKeyEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer19SignatureController10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer20RecipientLineFactory10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer21PluginEditorInterface10actionTypeEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer21PluginEditorInterface10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer21PluginEditorInterface14richTextEditorEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer22EmailAddressResolveJob10expandedCcEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer22EmailAddressResolveJob10expandedToEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer22EmailAddressResolveJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer22EmailAddressResolveJob11expandedBccEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer22EmailAddressResolveJob12expandedFromEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer23MessageComposerSettings10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer24AttachmentControllerBase10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer24AttachmentControllerBase14attachOwnVcardEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer25FollowupReminderCreateJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer26AttachmentFromPublicKeyJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer26AttachmentFromPublicKeyJob11fingerprintEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer26RichTextComposerSignatures10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer27PluginEditorCheckBeforeSend10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer27PluginEditorCheckBeforeSend11descriptionEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer27PluginEditorCheckBeforeSend18hasConfigureDialogEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer27PluginEditorCheckBeforeSend9isEnabledEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer32FollowUpReminderSelectDateDialog10collectionEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer32FollowUpReminderSelectDateDialog10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer32FollowUpReminderSelectDateDialog12selectedDateEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer33AttachmentVcardFromAddressBookJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer33PluginEditorCheckBeforeSendParams10isHtmlMailEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer33PluginEditorCheckBeforeSendParams11ccAddressesEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer33PluginEditorCheckBeforeSendParams11toAddressesEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer33PluginEditorCheckBeforeSendParams11transportIdEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer33PluginEditorCheckBeforeSendParams12bccAddressesEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer33PluginEditorCheckBeforeSendParams13defaultDomainEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer33PluginEditorCheckBeforeSendParams13hasAttachmentEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer33PluginEditorCheckBeforeSendParams7subjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer33PluginEditorCheckBeforeSendParams8identityEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer33PluginEditorCheckBeforeSendParams9plainTextEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer33PluginEditorCheckBeforeSendParamseqERKS0_@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer34PluginEditorCheckBeforeSendManager10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer34PluginEditorCheckBeforeSendManager11pluginsListEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer34PluginEditorCheckBeforeSendManager15configGroupNameEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer34PluginEditorCheckBeforeSendManager15pluginsDataListEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer34PluginEditorCheckBeforeSendManager22configPrefixSettingKeyEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer36PluginEditorCheckBeforeSendInterface10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer36PluginEditorCheckBeforeSendInterface10parametersEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer36PluginEditorCheckBeforeSendInterface12parentWidgetEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer42PluginEditorCheckBeforeSendConfigureWidget10helpAnchorEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer42PluginEditorCheckBeforeSendConfigureWidget10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer7JobBase10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer7SignJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8Composer10globalPartEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8Composer10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8Composer14resultMessagesEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8Composer15attachmentPartsEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8Composer8autoSaveEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8Composer8finishedEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8Composer8infoPartEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8Composer8textPartEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8InfoPart10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8InfoPart10referencesEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8InfoPart11transportIdEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8InfoPart12extraHeadersEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8InfoPart2ccEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8InfoPart2toEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8InfoPart3bccEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8InfoPart3fccEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8InfoPart4fromEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8InfoPart6urgentEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8InfoPart7replyToEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8InfoPart7subjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8InfoPart9inReplyToEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8InfoPart9userAgentEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8TextPart10isHtmlUsedEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8TextPart10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8TextPart14cleanPlainTextEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8TextPart14embeddedImagesEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8TextPart14warnBadCharsetEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8TextPart16wrappedPlainTextEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8TextPart17hasEmbeddedImagesEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8TextPart21isWordWrappingEnabledEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer8TextPart9cleanHtmlEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer9Recipient16encryptionActionEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer9Recipient3keyEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer9Recipient4nameEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer9Recipient4typeEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer9Recipient5emailEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer9Recipient7isEmptyEv@ABI_5_1 4:16.12.2 + _ZNK15MessageComposer9Recipient9typeLabelEv@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK7Akonadi4Item11payloadImplIN9KContacts12ContactGroupEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicES7_E4typeEv@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK7Akonadi4Item11payloadImplIN9KContacts9AddresseeEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicES7_E4typeEv@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt11__copy_moveILb0ELb0ESt26random_access_iterator_tagE8__copy_mIPN5GpgME3KeyES5_EET0_T_S7_S6_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt15_Sp_counted_ptrIDnLN9__gnu_cxx12_Lock_policyE2EE10_M_disposeEv@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE10_M_destroyEv@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE10_M_releaseEv@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt20__copy_move_backwardILb1ELb0ESt26random_access_iterator_tagE13__copy_move_bIPN5GpgME3KeyES5_EET0_T_S7_S6_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIN4Kleo17KeyApprovalDialog4ItemESaIS2_EE19_M_emplace_back_auxIJRKS2_EEEvDpOT_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIN4Kleo17KeyApprovalDialog4ItemESaIS2_EED1Ev@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIN4Kleo17KeyApprovalDialog4ItemESaIS2_EED2Ev@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EE15_M_range_insertIN9__gnu_cxx17__normal_iteratorIPKS1_S3_EEEEvNS6_IPS1_S3_EET_SC_St20forward_iterator_tag@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EE15_M_range_insertIN9__gnu_cxx17__normal_iteratorIPS1_S3_EEEEvS8_T_S9_St20forward_iterator_tag@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EE19_M_emplace_back_auxIJRKS1_EEEvDpOT_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EE8_M_eraseEN9__gnu_cxx17__normal_iteratorIPS1_S3_EES7_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EEC1ERKS3_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EEC2ERKS3_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EED1Ev@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EED2Ev@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EEaSERKS3_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIN5GpgME6UserIDESaIS1_EE19_M_emplace_back_auxIJRKS1_EEEvDpOT_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIN5GpgME6UserIDESaIS1_EED1Ev@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIN5GpgME6UserIDESaIS1_EED2Ev@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt8_Rb_treeI10QByteArrayS0_St9_IdentityIS0_ESt4lessIS0_ESaIS0_EE16_M_insert_uniqueIS0_EESt4pairISt17_Rb_tree_iteratorIS0_EbEOT_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt8_Rb_treeI10QByteArrayS0_St9_IdentityIS0_ESt4lessIS0_ESaIS0_EE8_M_eraseEPSt13_Rb_tree_nodeIS0_E@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer10EncryptJobE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer10GlobalPartE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer11MainTextJobE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer11MessagePartE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer12MultipartJobE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer12PluginEditorE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer13AkonadiSenderE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer13AttachmentJobE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer13SinglepartJobE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer14ContentJobBaseE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer14MessageFactoryE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer14SignEncryptJobE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer14TransparentJobE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer15AttachmentModelE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer15RecipientLineNGE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer16AliasesExpandJobE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer16ComposerLineEditE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer16ComposerViewBaseE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer16RecipientsEditorE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer17InsertTextFileJobE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer17RecipientLineEditE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer18ImageScalingWidgetE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer18RichTextComposerNgE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer18SkeletonMessageJobE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer19PluginEditorManagerE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer19SignatureControllerE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer20RecipientLineFactoryE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer21PluginEditorInterfaceE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer22EmailAddressResolveJobE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer23MessageComposerSettingsE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer24AttachmentControllerBaseE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer25FollowupReminderCreateJobE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer26AttachmentFromPublicKeyJobE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer26RichTextComposerSignaturesE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer27MessageComposerSettingsBaseE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer27PluginEditorCheckBeforeSendE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer32FollowUpReminderSelectDateDialogE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer33AttachmentVcardFromAddressBookJobE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer34PluginEditorCheckBeforeSendManagerE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer36PluginEditorCheckBeforeSendInterfaceE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer42PluginEditorCheckBeforeSendConfigureWidgetE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer7JobBaseE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer7SignJobE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer8ComposerE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer8InfoPartE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer8TextPartE@ABI_5_1 4:16.12.2 + _ZTIN15MessageComposer9RecipientE@ABI_5_1 4:16.12.2 + _ZTIN4KPIM19MultiplyingLineDataE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer10EncryptJobE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer10GlobalPartE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer11MainTextJobE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer11MessagePartE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer12MultipartJobE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer12PluginEditorE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer13AkonadiSenderE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer13AttachmentJobE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer13SinglepartJobE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer14ContentJobBaseE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer14MessageFactoryE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer14SignEncryptJobE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer14TransparentJobE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer15AttachmentModelE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer15RecipientLineNGE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer16AliasesExpandJobE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer16ComposerLineEditE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer16ComposerViewBaseE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer16RecipientsEditorE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer17InsertTextFileJobE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer17RecipientLineEditE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer18ImageScalingWidgetE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer18RichTextComposerNgE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer18SkeletonMessageJobE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer19PluginEditorManagerE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer19SignatureControllerE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer20RecipientLineFactoryE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer21PluginEditorInterfaceE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer22EmailAddressResolveJobE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer23MessageComposerSettingsE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer24AttachmentControllerBaseE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer25FollowupReminderCreateJobE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer26AttachmentFromPublicKeyJobE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer26RichTextComposerSignaturesE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer27MessageComposerSettingsBaseE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer27PluginEditorCheckBeforeSendE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer32FollowUpReminderSelectDateDialogE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer33AttachmentVcardFromAddressBookJobE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer34PluginEditorCheckBeforeSendManagerE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer36PluginEditorCheckBeforeSendInterfaceE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer42PluginEditorCheckBeforeSendConfigureWidgetE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer7JobBaseE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer7SignJobE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer8ComposerE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer8InfoPartE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer8TextPartE@ABI_5_1 4:16.12.2 + _ZTSN15MessageComposer9RecipientE@ABI_5_1 4:16.12.2 + _ZTSN4KPIM19MultiplyingLineDataE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer10EncryptJobE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer10GlobalPartE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer11MainTextJobE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer11MessagePartE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer12MultipartJobE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer12PluginEditorE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer13AkonadiSenderE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer13AttachmentJobE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer13SinglepartJobE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer14ContentJobBaseE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer14MessageFactoryE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer14SignEncryptJobE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer14TransparentJobE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer15AttachmentModelE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer15RecipientLineNGE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer16AliasesExpandJobE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer16ComposerLineEditE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer16ComposerViewBaseE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer16RecipientsEditorE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer17InsertTextFileJobE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer17RecipientLineEditE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer18ImageScalingWidgetE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer18RichTextComposerNgE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer18SkeletonMessageJobE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer19PluginEditorManagerE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer19SignatureControllerE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer20RecipientLineFactoryE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer21PluginEditorInterfaceE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer22EmailAddressResolveJobE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer23MessageComposerSettingsE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer24AttachmentControllerBaseE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer25FollowupReminderCreateJobE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer26AttachmentFromPublicKeyJobE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer26RichTextComposerSignaturesE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer27MessageComposerSettingsBaseE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer27PluginEditorCheckBeforeSendE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer32FollowUpReminderSelectDateDialogE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer33AttachmentVcardFromAddressBookJobE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer34PluginEditorCheckBeforeSendManagerE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer36PluginEditorCheckBeforeSendInterfaceE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer42PluginEditorCheckBeforeSendConfigureWidgetE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer7JobBaseE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer7SignJobE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer8ComposerE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer8InfoPartE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer8TextPartE@ABI_5_1 4:16.12.2 + _ZTVN15MessageComposer9RecipientE@ABI_5_1 4:16.12.2 + _ZZZN15KMimeTypeTrader16preferredServiceERK7QStringS2_Ed_NKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase14setWriteFormatERK7QStringENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase15setMaximumWidthEiENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase15setMinimumWidthEiENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase16setMaximumHeightEiENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase16setMinimumHeightEiENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase17setKeepImageRatioEbENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase19setFilterSourceTypeEiENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase20setAskBeforeResizingEbENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase21setCustomMaximumWidthEiENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase21setCustomMinimumWidthEiENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase21setSkipImageLowerSizeEiENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase22setCustomMaximumHeightEiENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase22setCustomMinimumHeightEiENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase22setFilterRecipientTypeEiENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase22setFilterSourcePatternERK7QStringENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase22setRenameResizedImagesEbENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase22setResizeEmailsPatternERK7QStringENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase23setReduceImageToMaximumEbENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase24setEnlargeImageToMinimumEbENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase25setAutoResizeImageEnabledEbENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase26setResizeImagesWithFormatsEbENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase27setDoNotResizeEmailsPatternERK7QStringENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase28setSkipImageLowerSizeEnabledEbENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase29setRenameResizedImagesPatternERK7QStringENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN15MessageComposer27MessageComposerSettingsBase30setResizeImagesWithFormatsTypeERK7QStringENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::AkonadiSender::doSend(QSharedPointer const&, short)@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::AkonadiSender::doSendQueued(int)@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::AkonadiSender::~AkonadiSender()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::ComposerLineEdit::~ComposerLineEdit()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::EncryptJob::encryptionKeys() const@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::EncryptJob::recipients() const@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::EncryptJob::setEncryptionKeys(std::vector > const&)@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::EncryptJob::setRecipients(QStringList const&)@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::EncryptJob::~EncryptJob()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::FollowUpReminderSelectDateDialog::~FollowUpReminderSelectDateDialog()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::ImageScalingWidget::~ImageScalingWidget()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::PluginEditorCheckBeforeSendConfigureWidget::~PluginEditorCheckBeforeSendConfigureWidget()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::RecipientsEditor::~RecipientsEditor()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::RichTextComposerNg::~RichTextComposerNg()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::SignEncryptJob::encryptionKeys() const@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::SignEncryptJob::recipients() const@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::SignEncryptJob::setEncryptionKeys(std::vector > const&)@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::SignEncryptJob::setRecipients(QStringList const&)@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageComposer::SignEncryptJob::~SignEncryptJob()@ABI_5_1" 4:16.12.2 diff -Nru kf5-messagelib-16.04.3/debian/libkf5messagecomposer5.install kf5-messagelib-16.12.3/debian/libkf5messagecomposer5.install --- kf5-messagelib-16.04.3/debian/libkf5messagecomposer5.install 2016-09-30 04:32:13.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messagecomposer5.install 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -usr/lib/*/libKF5MessageComposer.so.5 -usr/lib/*/libKF5MessageComposer.so.5.* diff -Nru kf5-messagelib-16.04.3/debian/libkf5messagecomposer5.symbols kf5-messagelib-16.12.3/debian/libkf5messagecomposer5.symbols --- kf5-messagelib-16.04.3/debian/libkf5messagecomposer5.symbols 2016-09-30 04:32:13.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messagecomposer5.symbols 1970-01-01 00:00:00.000000000 +0000 @@ -1,1047 +0,0 @@ -# SymbolsHelper-Confirmed: 4:16.04.3 amd64 i386 -libKF5MessageComposer.so.5 libkf5messagecomposer5 #MINVER# - _ZN13MessageHelper10initHeaderERK14QSharedPointerIN5KMime7MessageEEPKN19KIdentityManagement15IdentityManagerEj@Base 4:15.12 - _ZN13MessageHelper16extractAddrSpecsERK14QSharedPointerIN5KMime7MessageEERK10QByteArray@Base 4:15.12 - _ZN15MessageComposer10ActionTypeC1EP7QActionNS0_4TypeE@Base 4:16.04.0 - _ZN15MessageComposer10ActionTypeC1Ev@Base 4:16.04.0 - _ZN15MessageComposer10ActionTypeC2EP7QActionNS0_4TypeE@Base 4:16.04.0 - _ZN15MessageComposer10ActionTypeC2Ev@Base 4:16.04.0 - _ZN15MessageComposer10EncryptJob10setContentEPN5KMime7ContentE@Base 4:15.12 - _ZN15MessageComposer10EncryptJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer10EncryptJob11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer10EncryptJob13setRecipientsERK11QStringList@Base 4:15.12 - _ZN15MessageComposer10EncryptJob16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer10EncryptJob17setEncryptionKeysERKSt6vectorIN5GpgME3KeyESaIS3_EE@Base 4:15.12 - _ZN15MessageComposer10EncryptJob22setCryptoMessageFormatEN4Kleo19CryptoMessageFormatE@Base 4:15.12 - _ZN15MessageComposer10EncryptJob7processEv@Base 4:15.12 - _ZN15MessageComposer10EncryptJobC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer10EncryptJobC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer10EncryptJobD0Ev@Base 4:15.12 - _ZN15MessageComposer10EncryptJobD1Ev@Base 4:15.12 - _ZN15MessageComposer10EncryptJobD2Ev@Base 4:15.12 - _ZN15MessageComposer10GlobalPart11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer10GlobalPart11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer10GlobalPart11setCharsetsERK5QListI10QByteArrayE@Base 4:15.12 - _ZN15MessageComposer10GlobalPart13setGuiEnabledEb@Base 4:15.12 - _ZN15MessageComposer10GlobalPart14set8BitAllowedEb@Base 4:15.12 - _ZN15MessageComposer10GlobalPart15setMDNRequestedEb@Base 4:15.12 - _ZN15MessageComposer10GlobalPart16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer10GlobalPart21setParentWidgetForGuiEP7QWidget@Base 4:15.12 - _ZN15MessageComposer10GlobalPart25setFallbackCharsetEnabledEb@Base 4:15.12 - _ZN15MessageComposer10GlobalPartC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer10GlobalPartC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer10GlobalPartD0Ev@Base 4:15.12 - _ZN15MessageComposer10GlobalPartD1Ev@Base 4:15.12 - _ZN15MessageComposer10GlobalPartD2Ev@Base 4:15.12 - _ZN15MessageComposer11MainTextJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer11MainTextJob11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer11MainTextJob11setTextPartEPNS_8TextPartE@Base 4:15.12 - _ZN15MessageComposer11MainTextJob16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer11MainTextJob7doStartEv@Base 4:15.12 - _ZN15MessageComposer11MainTextJob7processEv@Base 4:15.12 - _ZN15MessageComposer11MainTextJobC1EPNS_8TextPartEP7QObject@Base 4:15.12 - _ZN15MessageComposer11MainTextJobC2EPNS_8TextPartEP7QObject@Base 4:15.12 - _ZN15MessageComposer11MainTextJobD0Ev@Base 4:15.12 - _ZN15MessageComposer11MainTextJobD1Ev@Base 4:15.12 - _ZN15MessageComposer11MainTextJobD2Ev@Base 4:15.12 - _ZN15MessageComposer11MessagePart11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer11MessagePart11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer11MessagePart16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer11MessagePartC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer11MessagePartC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer11MessagePartD0Ev@Base 4:15.12 - _ZN15MessageComposer11MessagePartD1Ev@Base 4:15.12 - _ZN15MessageComposer11MessagePartD2Ev@Base 4:15.12 - _ZN15MessageComposer12ImageScaling11resizeImageEv@Base 4:15.12 - _ZN15MessageComposer12ImageScaling11setMimetypeERK10QByteArray@Base 4:15.12 - _ZN15MessageComposer12ImageScaling15generateNewNameEv@Base 4:15.12 - _ZN15MessageComposer12ImageScaling17loadImageFromDataERK10QByteArray@Base 4:15.12 - _ZN15MessageComposer12ImageScaling7setNameERK7QString@Base 4:15.12 - _ZN15MessageComposer12ImageScalingC1Ev@Base 4:15.12 - _ZN15MessageComposer12ImageScalingC2Ev@Base 4:15.12 - _ZN15MessageComposer12ImageScalingD1Ev@Base 4:15.12 - _ZN15MessageComposer12ImageScalingD2Ev@Base 4:15.12 - _ZN15MessageComposer12MultipartJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer12MultipartJob11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer12MultipartJob16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer12MultipartJob19setMultipartSubtypeERK10QByteArray@Base 4:15.12 - _ZN15MessageComposer12MultipartJob7processEv@Base 4:15.12 - _ZN15MessageComposer12MultipartJobC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer12MultipartJobC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer12MultipartJobD0Ev@Base 4:15.12 - _ZN15MessageComposer12MultipartJobD1Ev@Base 4:15.12 - _ZN15MessageComposer12MultipartJobD2Ev@Base 4:15.12 - _ZN15MessageComposer12PluginEditor11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.0 - _ZN15MessageComposer12PluginEditor11qt_metacastEPKc@Base 4:16.04.0 - _ZN15MessageComposer12PluginEditor16staticMetaObjectE@Base 4:16.04.0 - _ZN15MessageComposer12PluginEditor8setOrderEi@Base 4:16.04.0 - _ZN15MessageComposer12PluginEditorC1EP7QObject@Base 4:16.04.0 - _ZN15MessageComposer12PluginEditorC2EP7QObject@Base 4:16.04.0 - _ZN15MessageComposer12PluginEditorD0Ev@Base 4:16.04.0 - _ZN15MessageComposer12PluginEditorD1Ev@Base 4:16.04.0 - _ZN15MessageComposer12PluginEditorD2Ev@Base 4:16.04.0 - _ZN15MessageComposer13AkonadiSender11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer13AkonadiSender11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer13AkonadiSender12doSendQueuedEi@Base 4:15.12 - _ZN15MessageComposer13AkonadiSender14queueJobResultEP4KJob@Base 4:15.12 - _ZN15MessageComposer13AkonadiSender16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer13AkonadiSender18sendOrQueueMessageERK14QSharedPointerIN5KMime7MessageEENS_13MessageSender10SendMethodE@Base 4:15.12 - _ZN15MessageComposer13AkonadiSender6doSendERK14QSharedPointerIN5KMime7MessageEEs@Base 4:15.12 - _ZN15MessageComposer13AkonadiSenderC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer13AkonadiSenderC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer13AkonadiSenderD0Ev@Base 4:15.12 - _ZN15MessageComposer13AkonadiSenderD1Ev@Base 4:15.12 - _ZN15MessageComposer13AkonadiSenderD2Ev@Base 4:15.12 - _ZN15MessageComposer13AttachmentJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer13AttachmentJob11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer13AttachmentJob16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer13AttachmentJob17setAttachmentPartE14QSharedPointerIN11MessageCore14AttachmentPartEE@Base 4:15.12 - _ZN15MessageComposer13AttachmentJob7doStartEv@Base 4:15.12 - _ZN15MessageComposer13AttachmentJob7processEv@Base 4:15.12 - _ZN15MessageComposer13AttachmentJobC1E14QSharedPointerIN11MessageCore14AttachmentPartEEP7QObject@Base 4:15.12 - _ZN15MessageComposer13AttachmentJobC2E14QSharedPointerIN11MessageCore14AttachmentPartEEP7QObject@Base 4:15.12 - _ZN15MessageComposer13AttachmentJobD0Ev@Base 4:15.12 - _ZN15MessageComposer13AttachmentJobD1Ev@Base 4:15.12 - _ZN15MessageComposer13AttachmentJobD2Ev@Base 4:15.12 - _ZN15MessageComposer13SinglepartJob11contentTypeEv@Base 4:15.12 - _ZN15MessageComposer13SinglepartJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer13SinglepartJob11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer13SinglepartJob16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer13SinglepartJob18contentDescriptionEv@Base 4:15.12 - _ZN15MessageComposer13SinglepartJob18contentDispositionEv@Base 4:15.12 - _ZN15MessageComposer13SinglepartJob23contentTransferEncodingEv@Base 4:15.12 - _ZN15MessageComposer13SinglepartJob7processEv@Base 4:15.12 - _ZN15MessageComposer13SinglepartJob7setDataERK10QByteArray@Base 4:15.12 - _ZN15MessageComposer13SinglepartJob9contentIDEv@Base 4:15.12 - _ZN15MessageComposer13SinglepartJobC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer13SinglepartJobC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer13SinglepartJobD0Ev@Base 4:15.12 - _ZN15MessageComposer13SinglepartJobD1Ev@Base 4:15.12 - _ZN15MessageComposer13SinglepartJobD2Ev@Base 4:15.12 - _ZN15MessageComposer14ContentJobBase10slotResultEP4KJob@Base 4:15.12 - _ZN15MessageComposer14ContentJobBase11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer14ContentJobBase11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer14ContentJobBase12appendSubjobEPS0_@Base 4:15.12 - _ZN15MessageComposer14ContentJobBase15setExtraContentEPN5KMime7ContentE@Base 4:15.12 - _ZN15MessageComposer14ContentJobBase16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer14ContentJobBase5startEv@Base 4:15.12 - _ZN15MessageComposer14ContentJobBase7doStartEv@Base 4:15.12 - _ZN15MessageComposer14ContentJobBase9addSubjobEP4KJob@Base 4:15.12 - _ZN15MessageComposer14ContentJobBaseC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer14ContentJobBaseC1ERNS_21ContentJobBasePrivateEP7QObject@Base 4:15.12 - _ZN15MessageComposer14ContentJobBaseC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer14ContentJobBaseC2ERNS_21ContentJobBasePrivateEP7QObject@Base 4:15.12 - _ZN15MessageComposer14ContentJobBaseD0Ev@Base 4:15.12 - _ZN15MessageComposer14ContentJobBaseD1Ev@Base 4:15.12 - _ZN15MessageComposer14ContentJobBaseD2Ev@Base 4:15.12 - _ZN15MessageComposer14MessageFactory11createReplyEv@Base 4:15.12 - _ZN15MessageComposer14MessageFactory11setTemplateERK7QString@Base 4:15.12 - _ZN15MessageComposer14MessageFactory12MDNRequestedERK14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN15MessageComposer14MessageFactory12applyCharsetE14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN15MessageComposer14MessageFactory12createResendEv@Base 4:15.12 - _ZN15MessageComposer14MessageFactory12identityUoidERK14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN15MessageComposer14MessageFactory12setSelectionERK7QString@Base 4:15.12 - _ZN15MessageComposer14MessageFactory13createForwardEv@Base 4:15.12 - _ZN15MessageComposer14MessageFactory14createRedirectERK7QStringS3_S3_iS3_i@Base 4:15.12 - _ZN15MessageComposer14MessageFactory16setReplyStrategyENS_13ReplyStrategyE@Base 4:15.12 - _ZN15MessageComposer14MessageFactory17setFolderIdentityEx@Base 4:15.12 - _ZN15MessageComposer14MessageFactory18MDNReturnPathEmptyERK14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN15MessageComposer14MessageFactory18setIdentityManagerEPN19KIdentityManagement15IdentityManagerE@Base 4:15.12 - _ZN15MessageComposer14MessageFactory19MDNMDNUnknownOptionERK14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN15MessageComposer14MessageFactory21createAttachedForwardERK7QVectorIN7Akonadi4ItemEE@Base 4:15.12 - _ZN15MessageComposer14MessageFactory21createDeliveryReceiptEv@Base 4:15.12 - _ZN15MessageComposer14MessageFactory22putRepliesInSameFolderEx@Base 4:15.12 - _ZN15MessageComposer14MessageFactory22replaceHeadersInStringERK14QSharedPointerIN5KMime7MessageEERK7QString@Base 4:15.12 - _ZN15MessageComposer14MessageFactory23createForwardDigestMIMEERK7QVectorIN7Akonadi4ItemEE@Base 4:15.12 - _ZN15MessageComposer14MessageFactory23setMailingListAddressesERK7QVectorIN5KMime5Types7MailboxEE@Base 4:15.12 - _ZN15MessageComposer14MessageFactory27MDNReturnPathNotInRecieptToERK14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN15MessageComposer14MessageFactory28MDNConfirmMultipleRecipientsERK14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN15MessageComposer14MessageFactory30createForwardAttachmentMessageERK14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN15MessageComposer14MessageFactory8setQuoteEb@Base 4:15.12 - _ZN15MessageComposer14MessageFactory9createMDNEN5KMime3MDN10ActionModeENS2_15DispositionTypeENS2_11SendingModeEiRK7QVectorINS2_19DispositionModifierEE@Base 4:15.12 - _ZN15MessageComposer14MessageFactory9getRefStrERK14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN15MessageComposer14MessageFactoryC1ERK14QSharedPointerIN5KMime7MessageEExRKN7Akonadi10CollectionE@Base 4:15.12 - _ZN15MessageComposer14MessageFactoryC2ERK14QSharedPointerIN5KMime7MessageEExRKN7Akonadi10CollectionE@Base 4:15.12 - _ZN15MessageComposer14MessageFactoryD0Ev@Base 4:15.12 - _ZN15MessageComposer14MessageFactoryD1Ev@Base 4:15.12 - _ZN15MessageComposer14MessageFactoryD2Ev@Base 4:15.12 - _ZN15MessageComposer14SignEncryptJob10setContentEPN5KMime7ContentE@Base 4:15.12 - _ZN15MessageComposer14SignEncryptJob11origContentEv@Base 4:15.12 - _ZN15MessageComposer14SignEncryptJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer14SignEncryptJob11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer14SignEncryptJob13setRecipientsERK11QStringList@Base 4:15.12 - _ZN15MessageComposer14SignEncryptJob14setSigningKeysERSt6vectorIN5GpgME3KeyESaIS3_EE@Base 4:15.12 - _ZN15MessageComposer14SignEncryptJob16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer14SignEncryptJob17setEncryptionKeysERKSt6vectorIN5GpgME3KeyESaIS3_EE@Base 4:15.12 - _ZN15MessageComposer14SignEncryptJob22setCryptoMessageFormatEN4Kleo19CryptoMessageFormatE@Base 4:15.12 - _ZN15MessageComposer14SignEncryptJob7processEv@Base 4:15.12 - _ZN15MessageComposer14SignEncryptJobC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer14SignEncryptJobC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer14SignEncryptJobD0Ev@Base 4:15.12 - _ZN15MessageComposer14SignEncryptJobD1Ev@Base 4:15.12 - _ZN15MessageComposer14SignEncryptJobD2Ev@Base 4:15.12 - _ZN15MessageComposer14TransparentJob10setContentEPN5KMime7ContentE@Base 4:15.12 - _ZN15MessageComposer14TransparentJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer14TransparentJob11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer14TransparentJob16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer14TransparentJob7processEv@Base 4:15.12 - _ZN15MessageComposer14TransparentJobC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer14TransparentJobC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer14TransparentJobD0Ev@Base 4:15.12 - _ZN15MessageComposer14TransparentJobD1Ev@Base 4:15.12 - _ZN15MessageComposer14TransparentJobD2Ev@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel11setModifiedEb@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel11signEnabledEb@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel13addAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEE@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel14encryptEnabledEb@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel14setSignEnabledEb@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel15setSignSelectedEb@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel16removeAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEE@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel16updateAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEE@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel17attachmentRemovedE14QSharedPointerIN11MessageCore14AttachmentPartEE@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel17replaceAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEES4_@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel17setEncryptEnabledEb@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel18autoDisplayEnabledEb@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel18setEncryptSelectedEb@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel19attachUrlsRequestedERK5QListI4QUrlE@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel20attachItemsRequesterERK7QVectorIN7Akonadi4ItemEE@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel21setAutoDisplayEnabledEb@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel27attachmentCompressRequestedE14QSharedPointerIN11MessageCore14AttachmentPartEEb@Base 4:15.12 - _ZN15MessageComposer15AttachmentModel7setDataERK11QModelIndexRK8QVarianti@Base 4:15.12 - _ZN15MessageComposer15AttachmentModelC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer15AttachmentModelC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer15AttachmentModelD0Ev@Base 4:15.12 - _ZN15MessageComposer15AttachmentModelD1Ev@Base 4:15.12 - _ZN15MessageComposer15AttachmentModelD2Ev@Base 4:15.12 - _ZN15MessageComposer16AliasesExpandJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer16AliasesExpandJob11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer16AliasesExpandJob15finishExpansionEv@Base 4:15.12 - _ZN15MessageComposer16AliasesExpandJob16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer16AliasesExpandJob25slotNicknameExpansionDoneEP4KJob@Base 4:15.12 - _ZN15MessageComposer16AliasesExpandJob33slotDistributionListExpansionDoneEP4KJob@Base 4:15.12 - _ZN15MessageComposer16AliasesExpandJob5startEv@Base 4:15.12 - _ZN15MessageComposer16AliasesExpandJobC1ERK7QStringS3_P7QObject@Base 4:15.12 - _ZN15MessageComposer16AliasesExpandJobC2ERK7QStringS3_P7QObject@Base 4:15.12 - _ZN15MessageComposer16AliasesExpandJobD0Ev@Base 4:15.12 - _ZN15MessageComposer16AliasesExpandJobD1Ev@Base 4:15.12 - _ZN15MessageComposer16AliasesExpandJobD2Ev@Base 4:15.12 - _ZN15MessageComposer16ComposerLineEdit11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer16ComposerLineEdit11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer16ComposerLineEdit13keyPressEventEP9QKeyEvent@Base 4:15.12 - _ZN15MessageComposer16ComposerLineEdit16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer16ComposerLineEdit7focusUpEv@Base 4:15.12 - _ZN15MessageComposer16ComposerLineEdit9focusDownEv@Base 4:15.12 - _ZN15MessageComposer16ComposerLineEditC1EbP7QWidget@Base 4:15.12 - _ZN15MessageComposer16ComposerLineEditC2EbP7QWidget@Base 4:15.12 - _ZN15MessageComposer16ComposerLineEditD0Ev@Base 4:15.12 - _ZN15MessageComposer16ComposerLineEditD1Ev@Base 4:15.12 - _ZN15MessageComposer16ComposerLineEditD2Ev@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase10enableHtmlEv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase10setMessageERK14QSharedPointerIN5KMime7MessageEEb@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase10setReplyToERK7QString@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase10setSubjectERK7QString@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase11disableHtmlENS0_12ConfirmationE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase11saveMessageERK14QSharedPointerIN5KMime7MessageEENS_13MessageSender6SaveInE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase11setCharsetsERK5QListI10QByteArrayE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase11setFccComboEPN7Akonadi18CollectionComboBoxE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase12fillInfoPartEPNS_8InfoPartENS0_18RecipientExpansionE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase12initAutoSaveEv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase12queueMessageERK14QSharedPointerIN5KMime7MessageEEPNS_8ComposerE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase13addAttachmentERK4QUrlRK7QStringb@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase13addAttachmentERK7QStringS3_S3_RK10QByteArrayS6_@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase13clearFollowUpEv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase13collectImagesEPN5KMime7ContentE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase13identityComboEv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase13setDictionaryEPN6Sonnet18DictionaryComboBoxE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase14cleanEmailListERK11QStringList@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase14fillGlobalPartEPNS_10GlobalPartE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase14updateAutoSaveEv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase14updateTemplateERK14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase15attachmentModelEv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase15autoSaveMessageEv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase15cleanupAutoSaveEv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase15identityChangedERKN19KIdentityManagement8IdentityES4_b@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase15identityManagerEv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase15readyForSendingEv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase15setCustomHeaderERK4QMapI10QByteArray7QStringE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase15setFollowUpDateERK5QDate@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase15setMDNRequestedEb@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase15slotQueueResultEP4KJob@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase15slotSaveMessageEP4KJob@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase16recipientsEditorEv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase16saveMailSettingsEv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase16sentSuccessfullyEv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase16setCryptoOptionsEbbN4Kleo19CryptoMessageFormatEb@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase16setIdentityComboEPN19KIdentityManagement13IdentityComboE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase16setSendLaterInfoEPN9SendLater13SendLaterInfoE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase16updateRecipientsERKN19KIdentityManagement8IdentityES4_NS_9Recipient4TypeE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase17addAttachmentPartEPN5KMime7ContentE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase17setTransportComboEPN13MailTransport17TransportComboBoxE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase18setAttachmentModelEPNS_15AttachmentModelE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase18setIdentityManagerEPN19KIdentityManagement15IdentityManagerE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase19addFollowupReminderERK7QString@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase19fillQueueJobHeadersEPN13MailTransport15MessageQueueJobE14QSharedPointerIN5KMime7MessageEEPKNS_8InfoPartE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase19saveRecentAddressesERK14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase19setAutoSaveFileNameERK7QString@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase19setAutoSaveIntervalEi@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase19setRecipientsEditorEPNS_16RecipientsEditorE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase19signatureControllerEv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase19writeAutoSaveToDiskERK14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase20attachmentControllerEv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase20createSimpleComposerEv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase20slotCreateItemResultEP4KJob@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase21hasMissingAttachmentsERK11QStringList@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase21setFollowUpCollectionERKN7Akonadi10CollectionE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase21setParentWidgetForGuiEP7QWidget@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase21slotSendComposeResultEP4KJob@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase22determineWhetherToSignEbPN4Kleo11KeyResolverEbRbS4_@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase22generateCryptoMessagesERb@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase22setSignatureControllerEPNS_19SignatureControllerE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase23setAttachmentControllerEPNS_24AttachmentControllerBaseE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase24slotEmailAddressResolvedEP4KJob@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase25determineWhetherToEncryptEbPN4Kleo11KeyResolverEbbRbS4_@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase25slotAutoSaveComposeResultEP4KJob@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase26checkForMissingAttachmentsERK11QStringList@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase28markAllAttachmentsForSigningEb@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase28slotFccCollectionCheckResultEP4KJob@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase31inlineSigningEncryptionSelectedEv@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase31markAllAttachmentsForEncryptionEb@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase4sendENS_13MessageSender10SendMethodENS1_6SaveInEb@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase6failedERK7QStringNS0_10FailedTypeE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase6setFccERKN7Akonadi10CollectionE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase7setFromERK7QString@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase8modifiedEb@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase9setEditorEPNS_18RichTextComposerNgE@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBase9setUrgentEb@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBaseC1EP7QObjectP7QWidget@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBaseC2EP7QObjectP7QWidget@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBaseD0Ev@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBaseD1Ev@Base 4:15.12 - _ZN15MessageComposer16ComposerViewBaseD2Ev@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditor11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditor11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditor12addRecipientEPNS_15RecipientLineNGERK7QString@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditor12addRecipientERK7QStringNS_9Recipient4TypeE@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditor13slotLineAddedEPN4KPIM15MultiplyingLineE@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditor15removeRecipientERK7QStringNS_9Recipient4TypeE@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditor15slotLineDeletedEi@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditor16selectRecipientsEv@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditor16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditor18setRecipientStringERK7QVectorIN5KMime5Types7MailboxEENS_9Recipient4TypeE@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditor18slotCalculateTotalEv@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditor19slotPickedRecipientERKNS_9RecipientERb@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditor20saveDistributionListEv@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditor22setRecentAddressConfigEP7KConfig@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditorC1EP7QWidget@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditorC2EP7QWidget@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditorD0Ev@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditorD1Ev@Base 4:15.12 - _ZN15MessageComposer16RecipientsEditorD2Ev@Base 4:15.12 - _ZN15MessageComposer17InsertTextFileJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer17InsertTextFileJob11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer17InsertTextFileJob11setEncodingERK7QString@Base 4:15.12 - _ZN15MessageComposer17InsertTextFileJob12slotFileDataEPN3KIO3JobERK10QByteArray@Base 4:15.12 - _ZN15MessageComposer17InsertTextFileJob16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer17InsertTextFileJob18slotGetJobFinishedEP4KJob@Base 4:15.12 - _ZN15MessageComposer17InsertTextFileJob5startEv@Base 4:15.12 - _ZN15MessageComposer17InsertTextFileJobC1EP9QTextEditRK4QUrl@Base 4:15.12 - _ZN15MessageComposer17InsertTextFileJobC2EP9QTextEditRK4QUrl@Base 4:15.12 - _ZN15MessageComposer17InsertTextFileJobD0Ev@Base 4:15.12 - _ZN15MessageComposer17InsertTextFileJobD1Ev@Base 4:15.12 - _ZN15MessageComposer17InsertTextFileJobD2Ev@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidget10loadConfigEv@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidget11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidget11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidget11writeConfigEv@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidget12initComboBoxEP9KComboBox@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidget14resetToDefaultEv@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidget14updateSettingsEv@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidget16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidget19slotComboboxChangedEi@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidget19slotHelpLinkClickedERK7QString@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidget20initWriteImageFormatEv@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidget23slotSourceFilterClickedEi@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidget26slotRecipientFilterClickedEi@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidget30updateEmailsFilterTypeSettingsEv@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidget30updateFilterSourceTypeSettingsEv@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidget7changedEv@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidgetC1EP7QWidget@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidgetC2EP7QWidget@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidgetD0Ev@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidgetD1Ev@Base 4:15.12 - _ZN15MessageComposer18ImageScalingWidgetD2Ev@Base 4:15.12 - _ZN15MessageComposer18RichTextComposerNg11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer18RichTextComposerNg11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer18RichTextComposerNg15insertSignatureERKN19KIdentityManagement9SignatureENS2_9PlacementE6QFlagsINS2_13AddedTextFlagEE@Base 4:15.12 - _ZN15MessageComposer18RichTextComposerNg16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer18RichTextComposerNg17setAutocorrectionEPN9PimCommon14AutoCorrectionE@Base 4:15.12 - _ZN15MessageComposer18RichTextComposerNg20fillComposerTextPartEPNS_8TextPartE@Base 4:15.12 - _ZN15MessageComposer18RichTextComposerNg21processAutoCorrectionEP9QKeyEvent@Base 4:15.12 - _ZN15MessageComposer18RichTextComposerNg25setAutocorrectionLanguageERK7QString@Base 4:15.12 - _ZN15MessageComposer18RichTextComposerNgC1EP7QWidget@Base 4:15.12 - _ZN15MessageComposer18RichTextComposerNgC2EP7QWidget@Base 4:15.12 - _ZN15MessageComposer18RichTextComposerNgD0Ev@Base 4:15.12 - _ZN15MessageComposer18RichTextComposerNgD1Ev@Base 4:15.12 - _ZN15MessageComposer18RichTextComposerNgD2Ev@Base 4:15.12 - _ZN15MessageComposer18SkeletonMessageJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer18SkeletonMessageJob11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer18SkeletonMessageJob11setInfoPartEPNS_8InfoPartE@Base 4:15.12 - _ZN15MessageComposer18SkeletonMessageJob13setGlobalPartEPNS_10GlobalPartE@Base 4:15.12 - _ZN15MessageComposer18SkeletonMessageJob16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer18SkeletonMessageJob5startEv@Base 4:15.12 - _ZN15MessageComposer18SkeletonMessageJobC1EPNS_8InfoPartEPNS_10GlobalPartEP7QObject@Base 4:15.12 - _ZN15MessageComposer18SkeletonMessageJobC2EPNS_8InfoPartEPNS_10GlobalPartEP7QObject@Base 4:15.12 - _ZN15MessageComposer18SkeletonMessageJobD0Ev@Base 4:15.12 - _ZN15MessageComposer18SkeletonMessageJobD1Ev@Base 4:15.12 - _ZN15MessageComposer18SkeletonMessageJobD2Ev@Base 4:15.12 - _ZN15MessageComposer19PluginEditorManager11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.0 - _ZN15MessageComposer19PluginEditorManager11qt_metacastEPKc@Base 4:16.04.0 - _ZN15MessageComposer19PluginEditorManager16staticMetaObjectE@Base 4:16.04.0 - _ZN15MessageComposer19PluginEditorManager4selfEv@Base 4:16.04.0 - _ZN15MessageComposer19PluginEditorManagerC1EP7QObject@Base 4:16.04.0 - _ZN15MessageComposer19PluginEditorManagerC2EP7QObject@Base 4:16.04.0 - _ZN15MessageComposer19PluginEditorManagerD0Ev@Base 4:16.04.0 - _ZN15MessageComposer19PluginEditorManagerD1Ev@Base 4:16.04.0 - _ZN15MessageComposer19PluginEditorManagerD2Ev@Base 4:16.04.0 - _ZN15MessageComposer19SignatureController10cleanSpaceEv@Base 4:15.12 - _ZN15MessageComposer19SignatureController10enableHtmlEv@Base 4:15.12 - _ZN15MessageComposer19SignatureController11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer19SignatureController11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer19SignatureController14applySignatureERKN19KIdentityManagement9SignatureE@Base 4:15.12 - _ZN15MessageComposer19SignatureController14signatureAddedEv@Base 4:15.12 - _ZN15MessageComposer19SignatureController15appendSignatureEv@Base 4:15.12 - _ZN15MessageComposer19SignatureController15identityChangedEj@Base 4:15.12 - _ZN15MessageComposer19SignatureController16prependSignatureEv@Base 4:15.12 - _ZN15MessageComposer19SignatureController16setIdentityComboEPN19KIdentityManagement13IdentityComboE@Base 4:15.12 - _ZN15MessageComposer19SignatureController16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer19SignatureController21applyCurrentSignatureEv@Base 4:15.12 - _ZN15MessageComposer19SignatureController21insertSignatureHelperEN19KIdentityManagement9Signature9PlacementE@Base 4:15.12 - _ZN15MessageComposer19SignatureController23insertSignatureAtCursorEv@Base 4:15.12 - _ZN15MessageComposer19SignatureController6resumeEv@Base 4:15.12 - _ZN15MessageComposer19SignatureController7suspendEv@Base 4:15.12 - _ZN15MessageComposer19SignatureController9setEditorEPNS_18RichTextComposerNgE@Base 4:15.12 - _ZN15MessageComposer19SignatureControllerC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer19SignatureControllerC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer19SignatureControllerD0Ev@Base 4:15.12 - _ZN15MessageComposer19SignatureControllerD1Ev@Base 4:15.12 - _ZN15MessageComposer19SignatureControllerD2Ev@Base 4:15.12 - _ZN15MessageComposer20RecipientLineFactory11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer20RecipientLineFactory11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer20RecipientLineFactory16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer20RecipientLineFactory17maximumRecipientsEv@Base 4:15.12 - _ZN15MessageComposer20RecipientLineFactory7newLineEP7QWidget@Base 4:15.12 - _ZN15MessageComposer20RecipientLineFactoryC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer20RecipientLineFactoryC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer21PluginEditorInterface11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.0 - _ZN15MessageComposer21PluginEditorInterface11qt_metacastEPKc@Base 4:16.04.0 - _ZN15MessageComposer21PluginEditorInterface13setActionTypeERKNS_10ActionTypeE@Base 4:16.04.0 - _ZN15MessageComposer21PluginEditorInterface15setParentWidgetEP7QWidget@Base 4:16.04.0 - _ZN15MessageComposer21PluginEditorInterface16staticMetaObjectE@Base 4:16.04.0 - _ZN15MessageComposer21PluginEditorInterface17setRichTextEditorEPN12KPIMTextEdit14RichTextEditorE@Base 4:16.04.0 - _ZN15MessageComposer21PluginEditorInterface18actionXmlExtensionENS_10ActionType4TypeE@Base 4:16.04.0 - _ZN15MessageComposer21PluginEditorInterface19emitPluginActivatedEPS0_@Base 4:16.04.0 - _ZN15MessageComposer21PluginEditorInterface19showConfigureDialogEP7QWidget@Base 4:16.04.0 - _ZN15MessageComposer21PluginEditorInterfaceC1EP7QObject@Base 4:16.04.0 - _ZN15MessageComposer21PluginEditorInterfaceC2EP7QObject@Base 4:16.04.0 - _ZN15MessageComposer21PluginEditorInterfaceD0Ev@Base 4:16.04.0 - _ZN15MessageComposer21PluginEditorInterfaceD1Ev@Base 4:16.04.0 - _ZN15MessageComposer21PluginEditorInterfaceD2Ev@Base 4:16.04.0 - _ZN15MessageComposer22EmailAddressResolveJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer22EmailAddressResolveJob11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer22EmailAddressResolveJob16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer22EmailAddressResolveJob20setDefaultDomainNameERK7QString@Base 4:15.12 - _ZN15MessageComposer22EmailAddressResolveJob22slotAliasExpansionDoneEP4KJob@Base 4:15.12 - _ZN15MessageComposer22EmailAddressResolveJob5setCcERK11QStringList@Base 4:15.12 - _ZN15MessageComposer22EmailAddressResolveJob5setToERK11QStringList@Base 4:15.12 - _ZN15MessageComposer22EmailAddressResolveJob5startEv@Base 4:15.12 - _ZN15MessageComposer22EmailAddressResolveJob6setBccERK11QStringList@Base 4:15.12 - _ZN15MessageComposer22EmailAddressResolveJob7setFromERK7QString@Base 4:15.12 - _ZN15MessageComposer22EmailAddressResolveJobC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer22EmailAddressResolveJobC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer22EmailAddressResolveJobD0Ev@Base 4:15.12 - _ZN15MessageComposer22EmailAddressResolveJobD1Ev@Base 4:15.12 - _ZN15MessageComposer22EmailAddressResolveJobD2Ev@Base 4:15.12 - _ZN15MessageComposer23MessageComposerSettings11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer23MessageComposerSettings11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer23MessageComposerSettings11requestSyncEv@Base 4:15.12 - _ZN15MessageComposer23MessageComposerSettings11slotSyncNowEv@Base 4:15.12 - _ZN15MessageComposer23MessageComposerSettings16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer23MessageComposerSettings4selfEv@Base 4:15.12 - _ZN15MessageComposer23MessageComposerSettings5mSelfE@Base 4:15.12 - _ZN15MessageComposer23MessageComposerSettingsC1Ev@Base 4:15.12 - _ZN15MessageComposer23MessageComposerSettingsC2Ev@Base 4:15.12 - _ZN15MessageComposer23MessageComposerSettingsD0Ev@Base 4:15.12 - _ZN15MessageComposer23MessageComposerSettingsD1Ev@Base 4:15.12 - _ZN15MessageComposer23MessageComposerSettingsD2Ev@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase11addOwnVcardEb@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase11attachFilesERK5QListI4QUrlERK7QString@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase12fileAttachedEv@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase13addAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEE@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase13addAttachmentERK4QUrl@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase13createActionsEv@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase13slotPutResultEP4KJob@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase14actionsCreatedEv@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase14addAttachmentsERK5QListI4QUrlE@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase14editAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEEN13MessageViewer13EditorWatcher14OpenWithOptionE@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase14openAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEE@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase14setSignEnabledEb@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase14showAttachmentEPN5KMime7ContentERK10QByteArray@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase14viewAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEE@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase15attachDirectoryERK4QUrl@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase15exportPublicKeyERK7QString@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase15showAttachVcardEv@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase15showContextMenuEv@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase16refreshSelectionEv@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase16saveAttachmentAsE14QSharedPointerIN11MessageCore14AttachmentPartEE@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase16setSelectedPartsERK5QListI14QSharedPointerIN11MessageCore14AttachmentPartEEE@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase17attachMyPublicKeyEv@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase17setAttachOwnVcardEb@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase17setEncryptEnabledEb@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase18compressAttachmentE14QSharedPointerIN11MessageCore14AttachmentPartEEb@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase18editAttachmentWithE14QSharedPointerIN11MessageCore14AttachmentPartEE@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase18slotOpenWithActionEP7QAction@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase18slotOpenWithDialogEv@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase20addAttachmentUrlSyncERK4QUrl@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase20attachmentPropertiesE14QSharedPointerIN11MessageCore14AttachmentPartEE@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase21byteArrayToRemoteFileERK10QByteArrayRK4QUrlb@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase21enableAttachPublicKeyEb@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase21selectedAllAttachmentEv@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase22setIdentityHasOwnVcardEb@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase23enableAttachMyPublicKeyEb@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase25showAttachPublicKeyDialogEv@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase27showAddAttachmentFileDialogEv@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase42showAddAttachmentCompressedDirectoryDialogEv@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBase8openWithERK28QExplicitlySharedDataPointerI8KServiceE@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBaseC1EPNS_15AttachmentModelEP7QWidgetP17KActionCollection@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBaseC2EPNS_15AttachmentModelEP7QWidgetP17KActionCollection@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBaseD0Ev@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBaseD1Ev@Base 4:15.12 - _ZN15MessageComposer24AttachmentControllerBaseD2Ev@Base 4:15.12 - _ZN15MessageComposer25FollowupReminderCreateJob10setSubjectERK7QString@Base 4:15.12 - _ZN15MessageComposer25FollowupReminderCreateJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer25FollowupReminderCreateJob11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer25FollowupReminderCreateJob12setMessageIdERK7QString@Base 4:15.12 - _ZN15MessageComposer25FollowupReminderCreateJob16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer25FollowupReminderCreateJob17setCollectionToDoERKN7Akonadi10CollectionE@Base 4:15.12 - _ZN15MessageComposer25FollowupReminderCreateJob17slotCreateNewTodoEP4KJob@Base 4:15.12 - _ZN15MessageComposer25FollowupReminderCreateJob23setFollowUpReminderDateERK5QDate@Base 4:15.12 - _ZN15MessageComposer25FollowupReminderCreateJob24setOriginalMessageItemIdEx@Base 4:15.12 - _ZN15MessageComposer25FollowupReminderCreateJob25writeFollowupReminderInfoEv@Base 4:15.12 - _ZN15MessageComposer25FollowupReminderCreateJob5setToERK7QString@Base 4:15.12 - _ZN15MessageComposer25FollowupReminderCreateJob5startEv@Base 4:15.12 - _ZN15MessageComposer25FollowupReminderCreateJobC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer25FollowupReminderCreateJobC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer25FollowupReminderCreateJobD0Ev@Base 4:15.12 - _ZN15MessageComposer25FollowupReminderCreateJobD1Ev@Base 4:15.12 - _ZN15MessageComposer25FollowupReminderCreateJobD2Ev@Base 4:15.12 - _ZN15MessageComposer26AttachmentFromPublicKeyJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer26AttachmentFromPublicKeyJob11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer26AttachmentFromPublicKeyJob14setFingerprintERK7QString@Base 4:15.12 - _ZN15MessageComposer26AttachmentFromPublicKeyJob16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer26AttachmentFromPublicKeyJob7doStartEv@Base 4:15.12 - _ZN15MessageComposer26AttachmentFromPublicKeyJobC1ERK7QStringP7QObject@Base 4:15.12 - _ZN15MessageComposer26AttachmentFromPublicKeyJobC2ERK7QStringP7QObject@Base 4:15.12 - _ZN15MessageComposer26AttachmentFromPublicKeyJobD0Ev@Base 4:15.12 - _ZN15MessageComposer26AttachmentFromPublicKeyJobD1Ev@Base 4:15.12 - _ZN15MessageComposer26AttachmentFromPublicKeyJobD2Ev@Base 4:15.12 - _ZN15MessageComposer26RichTextComposerSignatures11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer26RichTextComposerSignatures11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer26RichTextComposerSignatures15cleanWhitespaceERKN19KIdentityManagement9SignatureE@Base 4:15.12 - _ZN15MessageComposer26RichTextComposerSignatures16replaceSignatureERKN19KIdentityManagement9SignatureES4_@Base 4:15.12 - _ZN15MessageComposer26RichTextComposerSignatures16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer26RichTextComposerSignaturesC1EPNS_18RichTextComposerNgEP7QObject@Base 4:15.12 - _ZN15MessageComposer26RichTextComposerSignaturesC2EPNS_18RichTextComposerNgEP7QObject@Base 4:15.12 - _ZN15MessageComposer26RichTextComposerSignaturesD0Ev@Base 4:15.12 - _ZN15MessageComposer26RichTextComposerSignaturesD1Ev@Base 4:15.12 - _ZN15MessageComposer26RichTextComposerSignaturesD2Ev@Base 4:15.12 - _ZN15MessageComposer27MessageComposerSettingsBase4selfEv@Base 4:15.12 - _ZN15MessageComposer27MessageComposerSettingsBaseC1Ev@Base 4:15.12 - _ZN15MessageComposer27MessageComposerSettingsBaseC2Ev@Base 4:15.12 - _ZN15MessageComposer27MessageComposerSettingsBaseD0Ev@Base 4:15.12 - _ZN15MessageComposer27MessageComposerSettingsBaseD1Ev@Base 4:15.12 - _ZN15MessageComposer27MessageComposerSettingsBaseD2Ev@Base 4:15.12 - _ZN15MessageComposer32FollowUpReminderSelectDateDialog11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer32FollowUpReminderSelectDateDialog11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer32FollowUpReminderSelectDateDialog14updateOkButtonEv@Base 4:15.12 - _ZN15MessageComposer32FollowUpReminderSelectDateDialog15slotDateChangedEv@Base 4:15.12 - _ZN15MessageComposer32FollowUpReminderSelectDateDialog16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer32FollowUpReminderSelectDateDialog6acceptEv@Base 4:15.12 - _ZN15MessageComposer32FollowUpReminderSelectDateDialogC1EP7QWidgetP18QAbstractItemModel@Base 4:15.12 - _ZN15MessageComposer32FollowUpReminderSelectDateDialogC2EP7QWidgetP18QAbstractItemModel@Base 4:15.12 - _ZN15MessageComposer32FollowUpReminderSelectDateDialogD0Ev@Base 4:15.12 - _ZN15MessageComposer32FollowUpReminderSelectDateDialogD1Ev@Base 4:15.12 - _ZN15MessageComposer32FollowUpReminderSelectDateDialogD2Ev@Base 4:15.12 - _ZN15MessageComposer33AttachmentVcardFromAddressBookJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer33AttachmentVcardFromAddressBookJob11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer33AttachmentVcardFromAddressBookJob13addAttachmentERK10QByteArrayRK7QString@Base 4:15.12 - _ZN15MessageComposer33AttachmentVcardFromAddressBookJob14invalidContactEv@Base 4:15.12 - _ZN15MessageComposer33AttachmentVcardFromAddressBookJob16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer33AttachmentVcardFromAddressBookJob21slotExpandGroupResultEP4KJob@Base 4:15.12 - _ZN15MessageComposer33AttachmentVcardFromAddressBookJob7doStartEv@Base 4:15.12 - _ZN15MessageComposer33AttachmentVcardFromAddressBookJobC1ERKN7Akonadi4ItemEP7QObject@Base 4:15.12 - _ZN15MessageComposer33AttachmentVcardFromAddressBookJobC2ERKN7Akonadi4ItemEP7QObject@Base 4:15.12 - _ZN15MessageComposer33AttachmentVcardFromAddressBookJobD0Ev@Base 4:15.12 - _ZN15MessageComposer33AttachmentVcardFromAddressBookJobD1Ev@Base 4:15.12 - _ZN15MessageComposer33AttachmentVcardFromAddressBookJobD2Ev@Base 4:15.12 - _ZN15MessageComposer4Util13selectCharsetERK5QListI10QByteArrayERK7QString@Base 4:15.12 - _ZN15MessageComposer4Util18AttachmentKeywordsEv@Base 4:15.12 - _ZN15MessageComposer4Util21cleanedUpHeaderStringERK7QString@Base 4:15.12 - _ZN15MessageComposer4Util25removeNotNecessaryHeadersERK14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN15MessageComposer4Util26sendMailDispatcherIsOnlineEP7QWidget@Base 4:15.12 - _ZN15MessageComposer7JobBase10globalPartEv@Base 4:15.12 - _ZN15MessageComposer7JobBase11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer7JobBase11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer7JobBase16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer7JobBaseC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer7JobBaseC1ERNS_14JobBasePrivateEP7QObject@Base 4:15.12 - _ZN15MessageComposer7JobBaseC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer7JobBaseC2ERNS_14JobBasePrivateEP7QObject@Base 4:15.12 - _ZN15MessageComposer7JobBaseD0Ev@Base 4:15.12 - _ZN15MessageComposer7JobBaseD1Ev@Base 4:15.12 - _ZN15MessageComposer7JobBaseD2Ev@Base 4:15.12 - _ZN15MessageComposer7SignJob10setContentEPN5KMime7ContentE@Base 4:15.12 - _ZN15MessageComposer7SignJob11origContentEv@Base 4:15.12 - _ZN15MessageComposer7SignJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer7SignJob11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer7SignJob14setSigningKeysERSt6vectorIN5GpgME3KeyESaIS3_EE@Base 4:15.12 - _ZN15MessageComposer7SignJob16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer7SignJob22setCryptoMessageFormatEN4Kleo19CryptoMessageFormatE@Base 4:15.12 - _ZN15MessageComposer7SignJob7processEv@Base 4:15.12 - _ZN15MessageComposer7SignJobC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer7SignJobC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer7SignJobD0Ev@Base 4:15.12 - _ZN15MessageComposer7SignJobD1Ev@Base 4:15.12 - _ZN15MessageComposer7SignJobD2Ev@Base 4:15.12 - _ZN15MessageComposer8Composer10slotResultEP4KJob@Base 4:15.12 - _ZN15MessageComposer8Composer11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer8Composer11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer8Composer11setAutoSaveEb@Base 4:15.12 - _ZN15MessageComposer8Composer11setNoCryptoEb@Base 4:15.12 - _ZN15MessageComposer8Composer14setSigningKeysERSt6vectorIN5GpgME3KeyESaIS3_EE@Base 4:15.12 - _ZN15MessageComposer8Composer16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer8Composer17addAttachmentPartE14QSharedPointerIN11MessageCore14AttachmentPartEEb@Base 4:15.12 - _ZN15MessageComposer8Composer17setEncryptionKeysERK5QListI5QPairI11QStringListSt6vectorIN5GpgME3KeyESaIS6_EEEE@Base 4:15.12 - _ZN15MessageComposer8Composer17setSignAndEncryptEbb@Base 4:15.12 - _ZN15MessageComposer8Composer18addAttachmentPartsERK5QListI14QSharedPointerIN11MessageCore14AttachmentPartEEEb@Base 4:15.12 - _ZN15MessageComposer8Composer20removeAttachmentPartE14QSharedPointerIN11MessageCore14AttachmentPartEE@Base 4:15.12 - _ZN15MessageComposer8Composer22setMessageCryptoFormatEN4Kleo19CryptoMessageFormatE@Base 4:15.12 - _ZN15MessageComposer8Composer5startEv@Base 4:15.12 - _ZN15MessageComposer8ComposerC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer8ComposerC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer8ComposerD0Ev@Base 4:15.12 - _ZN15MessageComposer8ComposerD1Ev@Base 4:15.12 - _ZN15MessageComposer8ComposerD2Ev@Base 4:15.12 - _ZN15MessageComposer8InfoPart10setReplyToERK7QString@Base 4:15.12 - _ZN15MessageComposer8InfoPart10setSubjectERK7QString@Base 4:15.12 - _ZN15MessageComposer8InfoPart11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer8InfoPart11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer8InfoPart12setInReplyToERK7QString@Base 4:15.12 - _ZN15MessageComposer8InfoPart12setUserAgentERK7QString@Base 4:15.12 - _ZN15MessageComposer8InfoPart13setReferencesERK7QString@Base 4:15.12 - _ZN15MessageComposer8InfoPart14setTransportIdEi@Base 4:15.12 - _ZN15MessageComposer8InfoPart15setExtraHeadersERK7QVectorIPN5KMime7Headers4BaseEE@Base 4:15.12 - _ZN15MessageComposer8InfoPart16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer8InfoPart5setCcERK11QStringList@Base 4:15.12 - _ZN15MessageComposer8InfoPart5setToERK11QStringList@Base 4:15.12 - _ZN15MessageComposer8InfoPart6setBccERK11QStringList@Base 4:15.12 - _ZN15MessageComposer8InfoPart6setFccERK7QString@Base 4:15.12 - _ZN15MessageComposer8InfoPart7setFromERK7QString@Base 4:15.12 - _ZN15MessageComposer8InfoPart9setUrgentEb@Base 4:15.12 - _ZN15MessageComposer8InfoPartC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer8InfoPartC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer8InfoPartD0Ev@Base 4:15.12 - _ZN15MessageComposer8InfoPartD1Ev@Base 4:15.12 - _ZN15MessageComposer8InfoPartD2Ev@Base 4:15.12 - _ZN15MessageComposer8TextPart11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN15MessageComposer8TextPart11qt_metacastEPKc@Base 4:15.12 - _ZN15MessageComposer8TextPart12setCleanHtmlERK7QString@Base 4:15.12 - _ZN15MessageComposer8TextPart16staticMetaObjectE@Base 4:15.12 - _ZN15MessageComposer8TextPart17setCleanPlainTextERK7QString@Base 4:15.12 - _ZN15MessageComposer8TextPart17setEmbeddedImagesERK5QListI14QSharedPointerIN12KPIMTextEdit13EmbeddedImageEEE@Base 4:15.12 - _ZN15MessageComposer8TextPart17setWarnBadCharsetEb@Base 4:15.12 - _ZN15MessageComposer8TextPart19setWrappedPlainTextERK7QString@Base 4:15.12 - _ZN15MessageComposer8TextPart22setWordWrappingEnabledEb@Base 4:15.12 - _ZN15MessageComposer8TextPartC1EP7QObject@Base 4:15.12 - _ZN15MessageComposer8TextPartC2EP7QObject@Base 4:15.12 - _ZN15MessageComposer8TextPartD0Ev@Base 4:15.12 - _ZN15MessageComposer8TextPartD1Ev@Base 4:15.12 - _ZN15MessageComposer8TextPartD2Ev@Base 4:15.12 - _ZN15MessageComposer9Recipient13allTypeLabelsEv@Base 4:15.12 - _ZN15MessageComposer9Recipient5clearEv@Base 4:15.12 - _ZN15MessageComposer9Recipient7setNameERK7QString@Base 4:15.12 - _ZN15MessageComposer9Recipient7setTypeENS0_4TypeE@Base 4:15.12 - _ZN15MessageComposer9Recipient8idToTypeEi@Base 4:15.12 - _ZN15MessageComposer9Recipient8setEmailERK7QString@Base 4:15.12 - _ZN15MessageComposer9Recipient8typeToIdENS0_4TypeE@Base 4:15.12 - _ZN15MessageComposer9Recipient9typeLabelENS0_4TypeE@Base 4:15.12 - _ZN15MessageComposer9RecipientC1ERK7QStringNS0_4TypeE@Base 4:15.12 - _ZN15MessageComposer9RecipientC2ERK7QStringNS0_4TypeE@Base 4:15.12 - _ZN15MessageComposer9RecipientD0Ev@Base 4:15.12 - _ZN15MessageComposer9RecipientD1Ev@Base 4:15.12 - _ZN15MessageComposer9RecipientD2Ev@Base 4:15.12 - (optional=templinst)_ZN7Akonadi4Item14setPayloadImplI14QSharedPointerIN5KMime7MessageEEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicEvE4typeERKS9_@Base 4:15.12 - (optional=templinst)_ZN7Akonadi4Item14setPayloadImplI14QSharedPointerIN8KCalCore9IncidenceEEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicEvE4typeERKS9_@Base 4:15.12 - (optional=templinst)_ZN7Akonadi4Item14setPayloadImplIN9KContacts12ContactGroupEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicEvE4typeERKS7_@Base 4:15.12 - (optional=templinst)_ZN7Akonadi4Item14setPayloadImplIN9KContacts9AddresseeEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicEvE4typeERKS7_@Base 4:15.12 - (optional=templinst)_ZN7QObject7connectIM4KJobFvPS1_NS1_14QPrivateSignalEEMN15MessageComposer16ComposerViewBaseEFvS2_EEEN11QMetaObject10ConnectionEPKN9QtPrivate15FunctionPointerIT_E6ObjectESE_PKNSD_IT0_E6ObjectESJ_N2Qt14ConnectionTypeE@Base 4:16.04.3 - _ZN9QHashData9hasShrunkEv@Base 4:16.04.3 - (optional=templinst|arch=!armhf)_ZNK12KConfigGroup9readEntryI10QByteArrayEET_PKcRKS2_@Base 4:15.12 - (optional=templinst)_ZNK12KConfigGroup9readEntryI5QSizeEET_PKcRKS2_@Base 4:15.12 - (optional=templinst)_ZNK12KConfigGroup9readEntryIiEET_PKcRKS1_@Base 4:15.12 - _ZNK15MessageComposer10ActionType4typeEv@Base 4:16.04.0 - _ZNK15MessageComposer10ActionType6actionEv@Base 4:16.04.0 - _ZNK15MessageComposer10EncryptJob10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer10EncryptJob10recipientsEv@Base 4:15.12 - _ZNK15MessageComposer10EncryptJob14encryptionKeysEv@Base 4:15.12 - _ZNK15MessageComposer10GlobalPart10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer10GlobalPart12MDNRequestedEv@Base 4:15.12 - _ZNK15MessageComposer10GlobalPart12isGuiEnabledEv@Base 4:15.12 - _ZNK15MessageComposer10GlobalPart13is8BitAllowedEv@Base 4:15.12 - _ZNK15MessageComposer10GlobalPart18parentWidgetForGuiEv@Base 4:15.12 - _ZNK15MessageComposer10GlobalPart24isFallbackCharsetEnabledEv@Base 4:15.12 - _ZNK15MessageComposer10GlobalPart8charsetsEb@Base 4:15.12 - _ZNK15MessageComposer11MainTextJob10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer11MainTextJob8textPartEv@Base 4:15.12 - _ZNK15MessageComposer11MessagePart10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer12ImageScaling10imageArrayEv@Base 4:15.12 - _ZNK15MessageComposer12ImageScaling8mimetypeEv@Base 4:15.12 - _ZNK15MessageComposer12MultipartJob10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer12MultipartJob16multipartSubtypeEv@Base 4:15.12 - _ZNK15MessageComposer12PluginEditor10metaObjectEv@Base 4:16.04.0 - _ZNK15MessageComposer12PluginEditor5orderEv@Base 4:16.04.0 - _ZNK15MessageComposer13AkonadiSender10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer13AttachmentJob10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer13AttachmentJob14attachmentPartEv@Base 4:15.12 - _ZNK15MessageComposer13SinglepartJob10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer13SinglepartJob4dataEv@Base 4:15.12 - _ZNK15MessageComposer14ContentJobBase10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer14ContentJobBase12extraContentEv@Base 4:15.12 - _ZNK15MessageComposer14ContentJobBase7contentEv@Base 4:15.12 - _ZNK15MessageComposer14SignEncryptJob10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer14SignEncryptJob10recipientsEv@Base 4:15.12 - _ZNK15MessageComposer14SignEncryptJob14encryptionKeysEv@Base 4:15.12 - _ZNK15MessageComposer14TransparentJob10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel10headerDataEiN2Qt11OrientationEi@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel10isModifiedEv@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel11attachmentsEv@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel11columnCountERK11QModelIndex@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel13isSignEnabledEv@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel14isSignSelectedEv@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel16isEncryptEnabledEv@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel17isEncryptSelectedEv@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel20isAutoDisplayEnabledEv@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel20supportedDropActionsEv@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel4dataERK11QModelIndexi@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel5flagsERK11QModelIndex@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel5indexEiiRK11QModelIndex@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel6parentERK11QModelIndex@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel8mimeDataERK5QListI11QModelIndexE@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel8rowCountERK11QModelIndex@Base 4:15.12 - _ZNK15MessageComposer15AttachmentModel9mimeTypesEv@Base 4:15.12 - _ZNK15MessageComposer16AliasesExpandJob10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer16AliasesExpandJob22emptyDistributionListsEv@Base 4:15.12 - _ZNK15MessageComposer16AliasesExpandJob9addressesEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerLineEdit10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerViewBase10dictionaryEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerViewBase10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerViewBase11isComposingEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerViewBase12followUpDateEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerViewBase13sendLaterInfoEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerViewBase16autoSaveIntervalEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerViewBase17transportComboBoxEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerViewBase18followUpCollectionEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerViewBase20defaultSpecialTargetEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerViewBase2ccEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerViewBase2toEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerViewBase3bccEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerViewBase4fromEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerViewBase6editorEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerViewBase7replyToEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerViewBase7subjectEv@Base 4:15.12 - _ZNK15MessageComposer16ComposerViewBase8fccComboEv@Base 4:15.12 - _ZNK15MessageComposer16RecipientsEditor10activeLineEv@Base 4:15.12 - _ZNK15MessageComposer16RecipientsEditor10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer16RecipientsEditor10recipientsEv@Base 4:15.12 - _ZNK15MessageComposer16RecipientsEditor15activeRecipientEv@Base 4:15.12 - _ZNK15MessageComposer16RecipientsEditor15recipientStringENS_9Recipient4TypeE@Base 4:15.12 - _ZNK15MessageComposer16RecipientsEditor19recipientStringListENS_9Recipient4TypeE@Base 4:15.12 - _ZNK15MessageComposer16RecipientsEditor6pickerEv@Base 4:15.12 - _ZNK15MessageComposer17InsertTextFileJob10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer18ImageScalingWidget10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer18RichTextComposerNg10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer18RichTextComposerNg11toCleanHtmlEv@Base 4:15.12 - _ZNK15MessageComposer18RichTextComposerNg14autocorrectionEv@Base 4:15.12 - _ZNK15MessageComposer18RichTextComposerNg17composerSignatureEv@Base 4:15.12 - _ZNK15MessageComposer18SkeletonMessageJob10globalPartEv@Base 4:15.12 - _ZNK15MessageComposer18SkeletonMessageJob10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer18SkeletonMessageJob7messageEv@Base 4:15.12 - _ZNK15MessageComposer18SkeletonMessageJob8infoPartEv@Base 4:15.12 - _ZNK15MessageComposer19PluginEditorManager10metaObjectEv@Base 4:16.04.0 - _ZNK15MessageComposer19PluginEditorManager11pluginsListEv@Base 4:16.04.0 - _ZNK15MessageComposer19SignatureController10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer20RecipientLineFactory10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer21PluginEditorInterface10actionTypeEv@Base 4:16.04.0 - _ZNK15MessageComposer21PluginEditorInterface10metaObjectEv@Base 4:16.04.0 - _ZNK15MessageComposer21PluginEditorInterface12parentWidgetEv@Base 4:16.04.0 - _ZNK15MessageComposer21PluginEditorInterface14richTextEditorEv@Base 4:16.04.0 - _ZNK15MessageComposer21PluginEditorInterface17hasToolBarSupportEv@Base 4:16.04.0 - _ZNK15MessageComposer21PluginEditorInterface18hasConfigureDialogEv@Base 4:16.04.0 - _ZNK15MessageComposer21PluginEditorInterface19hasPopupMenuSupportEv@Base 4:16.04.0 - _ZNK15MessageComposer22EmailAddressResolveJob10expandedCcEv@Base 4:15.12 - _ZNK15MessageComposer22EmailAddressResolveJob10expandedToEv@Base 4:15.12 - _ZNK15MessageComposer22EmailAddressResolveJob10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer22EmailAddressResolveJob11expandedBccEv@Base 4:15.12 - _ZNK15MessageComposer22EmailAddressResolveJob12expandedFromEv@Base 4:15.12 - _ZNK15MessageComposer23MessageComposerSettings10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer24AttachmentControllerBase10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer24AttachmentControllerBase14attachOwnVcardEv@Base 4:15.12 - _ZNK15MessageComposer25FollowupReminderCreateJob10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer26AttachmentFromPublicKeyJob10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer26AttachmentFromPublicKeyJob11fingerprintEv@Base 4:15.12 - _ZNK15MessageComposer26RichTextComposerSignatures10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer32FollowUpReminderSelectDateDialog10collectionEv@Base 4:15.12 - _ZNK15MessageComposer32FollowUpReminderSelectDateDialog10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer32FollowUpReminderSelectDateDialog12selectedDateEv@Base 4:15.12 - _ZNK15MessageComposer33AttachmentVcardFromAddressBookJob10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer7JobBase10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer7SignJob10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer8Composer10globalPartEv@Base 4:15.12 - _ZNK15MessageComposer8Composer10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer8Composer14resultMessagesEv@Base 4:15.12 - _ZNK15MessageComposer8Composer15attachmentPartsEv@Base 4:15.12 - _ZNK15MessageComposer8Composer8autoSaveEv@Base 4:15.12 - _ZNK15MessageComposer8Composer8finishedEv@Base 4:15.12 - _ZNK15MessageComposer8Composer8infoPartEv@Base 4:15.12 - _ZNK15MessageComposer8Composer8textPartEv@Base 4:15.12 - _ZNK15MessageComposer8InfoPart10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer8InfoPart10referencesEv@Base 4:15.12 - _ZNK15MessageComposer8InfoPart11transportIdEv@Base 4:15.12 - _ZNK15MessageComposer8InfoPart12extraHeadersEv@Base 4:15.12 - _ZNK15MessageComposer8InfoPart2ccEv@Base 4:15.12 - _ZNK15MessageComposer8InfoPart2toEv@Base 4:15.12 - _ZNK15MessageComposer8InfoPart3bccEv@Base 4:15.12 - _ZNK15MessageComposer8InfoPart3fccEv@Base 4:15.12 - _ZNK15MessageComposer8InfoPart4fromEv@Base 4:15.12 - _ZNK15MessageComposer8InfoPart6urgentEv@Base 4:15.12 - _ZNK15MessageComposer8InfoPart7replyToEv@Base 4:15.12 - _ZNK15MessageComposer8InfoPart7subjectEv@Base 4:15.12 - _ZNK15MessageComposer8InfoPart9inReplyToEv@Base 4:15.12 - _ZNK15MessageComposer8InfoPart9userAgentEv@Base 4:15.12 - _ZNK15MessageComposer8TextPart10isHtmlUsedEv@Base 4:15.12 - _ZNK15MessageComposer8TextPart10metaObjectEv@Base 4:15.12 - _ZNK15MessageComposer8TextPart14cleanPlainTextEv@Base 4:15.12 - _ZNK15MessageComposer8TextPart14embeddedImagesEv@Base 4:15.12 - _ZNK15MessageComposer8TextPart14warnBadCharsetEv@Base 4:15.12 - _ZNK15MessageComposer8TextPart16wrappedPlainTextEv@Base 4:15.12 - _ZNK15MessageComposer8TextPart17hasEmbeddedImagesEv@Base 4:15.12 - _ZNK15MessageComposer8TextPart21isWordWrappingEnabledEv@Base 4:15.12 - _ZNK15MessageComposer8TextPart9cleanHtmlEv@Base 4:15.12 - _ZNK15MessageComposer9Recipient4nameEv@Base 4:15.12 - _ZNK15MessageComposer9Recipient4typeEv@Base 4:15.12 - _ZNK15MessageComposer9Recipient5emailEv@Base 4:15.12 - _ZNK15MessageComposer9Recipient7isEmptyEv@Base 4:15.12 - _ZNK15MessageComposer9Recipient9typeLabelEv@Base 4:15.12 - (optional=templinst)_ZNK7Akonadi4Item11payloadImplIN9KContacts12ContactGroupEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicES7_E4typeEv@Base 4:15.12 - (optional=templinst)_ZNK7Akonadi4Item11payloadImplIN9KContacts9AddresseeEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicES7_E4typeEv@Base 4:15.12 - (optional=templinst)_ZNSt11__copy_moveILb0ELb0ESt26random_access_iterator_tagE8__copy_mIPN5GpgME3KeyES5_EET0_T_S7_S6_@Base 4:15.12 - (optional=templinst|arch=!armhf)_ZNSt12_Destroy_auxILb0EE9__destroyIPN5GpgME3KeyEEEvT_S5_@Base 4:15.12 - (optional=templinst|arch=armhf)_ZNSt20__uninitialized_copyILb0EE13__uninit_copyISt13move_iteratorIPN5GpgME3KeyEES5_EET0_T_S8_S7_@Base 4:16.04.0 - (optional=templinst)_ZNSt6vectorIN4Kleo17KeyApprovalDialog4ItemESaIS2_EE19_M_emplace_back_auxIJRKS2_EEEvDpOT_@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN4Kleo17KeyApprovalDialog4ItemESaIS2_EED1Ev@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN4Kleo17KeyApprovalDialog4ItemESaIS2_EED2Ev@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EE15_M_range_insertIN9__gnu_cxx17__normal_iteratorIPKS1_S3_EEEEvNS6_IPS1_S3_EET_SC_St20forward_iterator_tag@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EE15_M_range_insertIN9__gnu_cxx17__normal_iteratorIPS1_S3_EEEEvS8_T_S9_St20forward_iterator_tag@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EE19_M_emplace_back_auxIJRKS1_EEEvDpOT_@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EE8_M_eraseEN9__gnu_cxx17__normal_iteratorIPS1_S3_EES7_@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EE9push_backERKS1_@Base 4:16.04.0 - (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EEC1ERKS3_@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EEC2ERKS3_@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EED1Ev@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EED2Ev@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EEaSERKS3_@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME6UserIDESaIS1_EE19_M_emplace_back_auxIJRKS1_EEEvDpOT_@Base 4:15.12 - (optional=templinst|arch=!armhf|subst)_ZNSt6vectorIN5GpgME6UserIDESaIS1_EE7reserveE{size_t}@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME6UserIDESaIS1_EED1Ev@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME6UserIDESaIS1_EED2Ev@Base 4:15.12 - (optional=templinst)_ZNSt8_Rb_treeI10QByteArrayS0_St9_IdentityIS0_ESt4lessIS0_ESaIS0_EE16_M_insert_uniqueIS0_EESt4pairISt17_Rb_tree_iteratorIS0_EbEOT_@Base 4:15.12 - (optional=templinst)_ZNSt8_Rb_treeI10QByteArrayS0_St9_IdentityIS0_ESt4lessIS0_ESaIS0_EE8_M_eraseEPSt13_Rb_tree_nodeIS0_E@Base 4:15.12 - _ZTIN15MessageComposer10EncryptJobE@Base 4:15.12 - _ZTIN15MessageComposer10GlobalPartE@Base 4:15.12 - _ZTIN15MessageComposer11MainTextJobE@Base 4:15.12 - _ZTIN15MessageComposer11MessagePartE@Base 4:15.12 - _ZTIN15MessageComposer12MultipartJobE@Base 4:15.12 - _ZTIN15MessageComposer12PluginEditorE@Base 4:16.04.0 - _ZTIN15MessageComposer13AkonadiSenderE@Base 4:15.12 - _ZTIN15MessageComposer13AttachmentJobE@Base 4:15.12 - _ZTIN15MessageComposer13SinglepartJobE@Base 4:15.12 - _ZTIN15MessageComposer14ContentJobBaseE@Base 4:15.12 - _ZTIN15MessageComposer14MessageFactoryE@Base 4:15.12 - _ZTIN15MessageComposer14SignEncryptJobE@Base 4:15.12 - _ZTIN15MessageComposer14TransparentJobE@Base 4:15.12 - _ZTIN15MessageComposer15AttachmentModelE@Base 4:15.12 - _ZTIN15MessageComposer16AliasesExpandJobE@Base 4:15.12 - _ZTIN15MessageComposer16ComposerLineEditE@Base 4:15.12 - _ZTIN15MessageComposer16ComposerViewBaseE@Base 4:15.12 - _ZTIN15MessageComposer16RecipientsEditorE@Base 4:15.12 - _ZTIN15MessageComposer17InsertTextFileJobE@Base 4:15.12 - _ZTIN15MessageComposer18ImageScalingWidgetE@Base 4:15.12 - _ZTIN15MessageComposer18RichTextComposerNgE@Base 4:15.12 - _ZTIN15MessageComposer18SkeletonMessageJobE@Base 4:15.12 - _ZTIN15MessageComposer19PluginEditorManagerE@Base 4:16.04.0 - _ZTIN15MessageComposer19SignatureControllerE@Base 4:15.12 - _ZTIN15MessageComposer20RecipientLineFactoryE@Base 4:15.12 - _ZTIN15MessageComposer21PluginEditorInterfaceE@Base 4:16.04.0 - _ZTIN15MessageComposer22EmailAddressResolveJobE@Base 4:15.12 - _ZTIN15MessageComposer23MessageComposerSettingsE@Base 4:15.12 - _ZTIN15MessageComposer24AttachmentControllerBaseE@Base 4:15.12 - _ZTIN15MessageComposer25FollowupReminderCreateJobE@Base 4:15.12 - _ZTIN15MessageComposer26AttachmentFromPublicKeyJobE@Base 4:15.12 - _ZTIN15MessageComposer26RichTextComposerSignaturesE@Base 4:15.12 - _ZTIN15MessageComposer27MessageComposerSettingsBaseE@Base 4:15.12 - _ZTIN15MessageComposer32FollowUpReminderSelectDateDialogE@Base 4:15.12 - _ZTIN15MessageComposer33AttachmentVcardFromAddressBookJobE@Base 4:15.12 - _ZTIN15MessageComposer7JobBaseE@Base 4:15.12 - _ZTIN15MessageComposer7SignJobE@Base 4:15.12 - _ZTIN15MessageComposer8ComposerE@Base 4:15.12 - _ZTIN15MessageComposer8InfoPartE@Base 4:15.12 - _ZTIN15MessageComposer8TextPartE@Base 4:15.12 - _ZTIN15MessageComposer9RecipientE@Base 4:15.12 - _ZTIN4KPIM19MultiplyingLineDataE@Base 4:15.12 - _ZTSN15MessageComposer10EncryptJobE@Base 4:15.12 - _ZTSN15MessageComposer10GlobalPartE@Base 4:15.12 - _ZTSN15MessageComposer11MainTextJobE@Base 4:15.12 - _ZTSN15MessageComposer11MessagePartE@Base 4:15.12 - _ZTSN15MessageComposer12MultipartJobE@Base 4:15.12 - _ZTSN15MessageComposer12PluginEditorE@Base 4:16.04.0 - _ZTSN15MessageComposer13AkonadiSenderE@Base 4:15.12 - _ZTSN15MessageComposer13AttachmentJobE@Base 4:15.12 - _ZTSN15MessageComposer13SinglepartJobE@Base 4:15.12 - _ZTSN15MessageComposer14ContentJobBaseE@Base 4:15.12 - _ZTSN15MessageComposer14MessageFactoryE@Base 4:15.12 - _ZTSN15MessageComposer14SignEncryptJobE@Base 4:15.12 - _ZTSN15MessageComposer14TransparentJobE@Base 4:15.12 - _ZTSN15MessageComposer15AttachmentModelE@Base 4:15.12 - _ZTSN15MessageComposer16AliasesExpandJobE@Base 4:15.12 - _ZTSN15MessageComposer16ComposerLineEditE@Base 4:15.12 - _ZTSN15MessageComposer16ComposerViewBaseE@Base 4:15.12 - _ZTSN15MessageComposer16RecipientsEditorE@Base 4:15.12 - _ZTSN15MessageComposer17InsertTextFileJobE@Base 4:15.12 - _ZTSN15MessageComposer18ImageScalingWidgetE@Base 4:15.12 - _ZTSN15MessageComposer18RichTextComposerNgE@Base 4:15.12 - _ZTSN15MessageComposer18SkeletonMessageJobE@Base 4:15.12 - _ZTSN15MessageComposer19PluginEditorManagerE@Base 4:16.04.0 - _ZTSN15MessageComposer19SignatureControllerE@Base 4:15.12 - _ZTSN15MessageComposer20RecipientLineFactoryE@Base 4:15.12 - _ZTSN15MessageComposer21PluginEditorInterfaceE@Base 4:16.04.0 - _ZTSN15MessageComposer22EmailAddressResolveJobE@Base 4:15.12 - _ZTSN15MessageComposer23MessageComposerSettingsE@Base 4:15.12 - _ZTSN15MessageComposer24AttachmentControllerBaseE@Base 4:15.12 - _ZTSN15MessageComposer25FollowupReminderCreateJobE@Base 4:15.12 - _ZTSN15MessageComposer26AttachmentFromPublicKeyJobE@Base 4:15.12 - _ZTSN15MessageComposer26RichTextComposerSignaturesE@Base 4:15.12 - _ZTSN15MessageComposer27MessageComposerSettingsBaseE@Base 4:15.12 - _ZTSN15MessageComposer32FollowUpReminderSelectDateDialogE@Base 4:15.12 - _ZTSN15MessageComposer33AttachmentVcardFromAddressBookJobE@Base 4:15.12 - _ZTSN15MessageComposer7JobBaseE@Base 4:15.12 - _ZTSN15MessageComposer7SignJobE@Base 4:15.12 - _ZTSN15MessageComposer8ComposerE@Base 4:15.12 - _ZTSN15MessageComposer8InfoPartE@Base 4:15.12 - _ZTSN15MessageComposer8TextPartE@Base 4:15.12 - _ZTSN15MessageComposer9RecipientE@Base 4:15.12 - _ZTSN4KPIM19MultiplyingLineDataE@Base 4:15.12 - _ZTVN15MessageComposer10EncryptJobE@Base 4:15.12 - _ZTVN15MessageComposer10GlobalPartE@Base 4:15.12 - _ZTVN15MessageComposer11MainTextJobE@Base 4:15.12 - _ZTVN15MessageComposer11MessagePartE@Base 4:15.12 - _ZTVN15MessageComposer12MultipartJobE@Base 4:15.12 - _ZTVN15MessageComposer12PluginEditorE@Base 4:16.04.0 - _ZTVN15MessageComposer13AkonadiSenderE@Base 4:15.12 - _ZTVN15MessageComposer13AttachmentJobE@Base 4:15.12 - _ZTVN15MessageComposer13SinglepartJobE@Base 4:15.12 - _ZTVN15MessageComposer14ContentJobBaseE@Base 4:15.12 - _ZTVN15MessageComposer14MessageFactoryE@Base 4:15.12 - _ZTVN15MessageComposer14SignEncryptJobE@Base 4:15.12 - _ZTVN15MessageComposer14TransparentJobE@Base 4:15.12 - _ZTVN15MessageComposer15AttachmentModelE@Base 4:15.12 - _ZTVN15MessageComposer16AliasesExpandJobE@Base 4:15.12 - _ZTVN15MessageComposer16ComposerLineEditE@Base 4:15.12 - _ZTVN15MessageComposer16ComposerViewBaseE@Base 4:15.12 - _ZTVN15MessageComposer16RecipientsEditorE@Base 4:15.12 - _ZTVN15MessageComposer17InsertTextFileJobE@Base 4:15.12 - _ZTVN15MessageComposer18ImageScalingWidgetE@Base 4:15.12 - _ZTVN15MessageComposer18RichTextComposerNgE@Base 4:15.12 - _ZTVN15MessageComposer18SkeletonMessageJobE@Base 4:15.12 - _ZTVN15MessageComposer19PluginEditorManagerE@Base 4:16.04.0 - _ZTVN15MessageComposer19SignatureControllerE@Base 4:15.12 - _ZTVN15MessageComposer20RecipientLineFactoryE@Base 4:15.12 - _ZTVN15MessageComposer21PluginEditorInterfaceE@Base 4:16.04.0 - _ZTVN15MessageComposer22EmailAddressResolveJobE@Base 4:15.12 - _ZTVN15MessageComposer23MessageComposerSettingsE@Base 4:15.12 - _ZTVN15MessageComposer24AttachmentControllerBaseE@Base 4:15.12 - _ZTVN15MessageComposer25FollowupReminderCreateJobE@Base 4:15.12 - _ZTVN15MessageComposer26AttachmentFromPublicKeyJobE@Base 4:15.12 - _ZTVN15MessageComposer26RichTextComposerSignaturesE@Base 4:15.12 - _ZTVN15MessageComposer27MessageComposerSettingsBaseE@Base 4:15.12 - _ZTVN15MessageComposer32FollowUpReminderSelectDateDialogE@Base 4:15.12 - _ZTVN15MessageComposer33AttachmentVcardFromAddressBookJobE@Base 4:15.12 - _ZTVN15MessageComposer7JobBaseE@Base 4:15.12 - _ZTVN15MessageComposer7SignJobE@Base 4:15.12 - _ZTVN15MessageComposer8ComposerE@Base 4:15.12 - _ZTVN15MessageComposer8InfoPartE@Base 4:15.12 - _ZTVN15MessageComposer8TextPartE@Base 4:15.12 - _ZTVN15MessageComposer9RecipientE@Base 4:15.12 - _ZZZN15KMimeTypeTrader16preferredServiceERK7QStringS2_Ed_NKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase14setWriteFormatERK7QStringENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase15setMaximumWidthEiENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase15setMinimumWidthEiENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase16setMaximumHeightEiENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase16setMinimumHeightEiENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase17setKeepImageRatioEbENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase19setFilterSourceTypeEiENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase20setAskBeforeResizingEbENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase21setCustomMaximumWidthEiENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase21setCustomMinimumWidthEiENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase21setSkipImageLowerSizeEiENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase22setCustomMaximumHeightEiENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase22setCustomMinimumHeightEiENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase22setFilterRecipientTypeEiENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase22setFilterSourcePatternERK7QStringENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase22setRenameResizedImagesEbENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase22setResizeEmailsPatternERK7QStringENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase23setReduceImageToMaximumEbENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase24setEnlargeImageToMinimumEbENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase25setAutoResizeImageEnabledEbENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase26setResizeImagesWithFormatsEbENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase27setDoNotResizeEmailsPatternERK7QStringENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase28setSkipImageLowerSizeEnabledEbENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase29setRenameResizedImagesPatternERK7QStringENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN15MessageComposer27MessageComposerSettingsBase30setResizeImagesWithFormatsTypeERK7QStringENKUlvE_clEvE15qstring_literal@Base 4:15.12 - (c++)"non-virtual thunk to MessageComposer::AkonadiSender::doSend(QSharedPointer const&, short)@Base" 4:15.12 - (c++)"non-virtual thunk to MessageComposer::AkonadiSender::doSendQueued(int)@Base" 4:15.12 - (c++)"non-virtual thunk to MessageComposer::AkonadiSender::~AkonadiSender()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageComposer::ComposerLineEdit::~ComposerLineEdit()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageComposer::EncryptJob::encryptionKeys() const@Base" 4:15.12 - (c++)"non-virtual thunk to MessageComposer::EncryptJob::recipients() const@Base" 4:15.12 - (c++)"non-virtual thunk to MessageComposer::EncryptJob::setEncryptionKeys(std::vector > const&)@Base" 4:15.12 - (c++)"non-virtual thunk to MessageComposer::EncryptJob::setRecipients(QStringList const&)@Base" 4:15.12 - (c++)"non-virtual thunk to MessageComposer::EncryptJob::~EncryptJob()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageComposer::FollowUpReminderSelectDateDialog::~FollowUpReminderSelectDateDialog()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageComposer::ImageScalingWidget::~ImageScalingWidget()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageComposer::RecipientsEditor::~RecipientsEditor()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageComposer::RichTextComposerNg::~RichTextComposerNg()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageComposer::SignEncryptJob::encryptionKeys() const@Base" 4:15.12 - (c++)"non-virtual thunk to MessageComposer::SignEncryptJob::recipients() const@Base" 4:15.12 - (c++)"non-virtual thunk to MessageComposer::SignEncryptJob::setEncryptionKeys(std::vector > const&)@Base" 4:15.12 - (c++)"non-virtual thunk to MessageComposer::SignEncryptJob::setRecipients(QStringList const&)@Base" 4:15.12 - (c++)"non-virtual thunk to MessageComposer::SignEncryptJob::~SignEncryptJob()@Base" 4:15.12 diff -Nru kf5-messagelib-16.04.3/debian/libkf5messagecomposer-dev.acc.in kf5-messagelib-16.12.3/debian/libkf5messagecomposer-dev.acc.in --- kf5-messagelib-16.04.3/debian/libkf5messagecomposer-dev.acc.in 2016-09-30 04:32:13.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messagecomposer-dev.acc.in 2017-05-01 19:27:51.000000000 +0000 @@ -1,4 +1,4 @@ - + @@ -11,6 +11,11 @@ /usr/include/KF5/messagecomposer_version.h + + /usr/include/KF5/messagecomposer/encryptjob.h + /usr/include/KF5/MessageComposer/EncryptJob + + /usr/lib/@@DEB_HOST_MULTIARCH@@/libKF5MessageComposer.so @@ -18,6 +23,7 @@ -fPIC -std=c++11 + -fno-keep-inline-functions - + \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/debian/libkf5messagecore5abi1.install kf5-messagelib-16.12.3/debian/libkf5messagecore5abi1.install --- kf5-messagelib-16.04.3/debian/libkf5messagecore5abi1.install 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messagecore5abi1.install 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,2 @@ +usr/lib/*/libKF5MessageCore.so.5.* +usr/lib/*/libKF5MessageCore.so.5abi1 diff -Nru kf5-messagelib-16.04.3/debian/libkf5messagecore5abi1.symbols kf5-messagelib-16.12.3/debian/libkf5messagecore5abi1.symbols --- kf5-messagelib-16.04.3/debian/libkf5messagecore5abi1.symbols 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messagecore5abi1.symbols 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,263 @@ +# SymbolsHelper-Confirmed: 4:16.12.2 amd64 armhf i386 +libKF5MessageCore.so.5abi1 libkf5messagecore5abi1 #MINVER# + ABI_5_1@ABI_5_1 4:16.12.2 + _ZN11MessageCore10NodeHelper10firstChildEPKN5KMime7ContentE@ABI_5_1 4:16.12.2 + _ZN11MessageCore10NodeHelper11nextSiblingEPKN5KMime7ContentE@ABI_5_1 4:16.12.2 + _ZN11MessageCore10NodeHelper4nextEPN5KMime7ContentEb@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil10smartQuoteERK7QStringi@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil13cleanFileNameERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil14parseMailtoUrlERK4QUrl@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil14quoteHtmlCharsERK7QStringb@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil14stripSignatureERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil15setEncodingFileER4QUrlRK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil16asSendableStringERK14QSharedPointerIN5KMime7MessageEE@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil16stripOffPrefixesERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil17emailAddrAsAnchorEPN5KMime7Headers8Generics11AddressListENS0_7DisplayERK7QStringNS0_4LinkENS0_11AddressModeES9_i@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil17emailAddrAsAnchorEPN5KMime7Headers8Generics11MailboxListENS0_7DisplayERK7QStringNS0_4LinkENS0_11AddressModeES9_i@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil17emailAddrAsAnchorERK7QVectorIN5KMime5Types7MailboxEENS0_7DisplayERK7QStringNS0_4LinkENS0_11AddressModeESB_i@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil17formatQuotePrefixERK7QStringS3_@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil17generateMessageIdERK7QStringS3_@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil17splitAddressFieldERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil22addressIsInAddressListERK7QStringRK11QStringList@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil22headerAsSendableStringERK14QSharedPointerIN5KMime7MessageEE@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil25removePrivateHeaderFieldsERK14QSharedPointerIN5KMime7MessageEEb@ABI_5_1 4:16.12.2 + _ZN11MessageCore10StringUtil30guessEmailAddressFromLoginNameERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingList10readConfigERK12KConfigGroup@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingList10setHandlerENS0_7HandlerE@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingList11setHelpUrlsERK5QListI4QUrlE@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingList11setPostUrlsERK5QListI4QUrlE@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingList12setOwnerUrlsERK5QListI4QUrlE@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingList14setArchiveUrlsERK5QListI4QUrlE@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingList16setSubscribeUrlsERK5QListI4QUrlE@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingList17setArchivedAtUrlsERK5QListI4QUrlE@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingList18setUnsubscribeUrlsERK5QListI4QUrlE@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingList4nameERK14QSharedPointerIN5KMime7MessageEER10QByteArrayR7QString@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingList5setIdERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingList6detectERK14QSharedPointerIN5KMime7MessageEE@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingListC1ERKS0_@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingListC1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingListC2ERKS0_@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingListC2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingListD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingListD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore11MailingListaSERKS0_@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPart10setCharsetERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPart11setEncodingEN5KMime7Headers15contentEncodingE@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPart11setFileNameERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPart11setMimeTypeERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPart12setEncryptedEb@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPart13setCompressedEb@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPart14setDescriptionERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPart15setAutoEncodingEb@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPart6setUrlERK4QUrl@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPart7setDataERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPart7setNameERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPart9setInlineEb@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPart9setSignedEb@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPartC1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPartC2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPartD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPartD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore14AttachmentPartD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore14ImageCollector17collectImagesFromEPN5KMime7ContentE@ABI_5_1 4:16.12.2 + _ZN11MessageCore14ImageCollectorC1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore14ImageCollectorC2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore14ImageCollectorD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore14ImageCollectorD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore17AttachmentLoadJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageCore17AttachmentLoadJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageCore17AttachmentLoadJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageCore17AttachmentLoadJob17setAttachmentPartERK14QSharedPointerINS_14AttachmentPartEE@ABI_5_1 4:16.12.2 + _ZN11MessageCore17AttachmentLoadJob5startEv@ABI_5_1 4:16.12.2 + _ZN11MessageCore17AttachmentLoadJobC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN11MessageCore17AttachmentLoadJobC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN11MessageCore17AttachmentLoadJobD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore17AttachmentLoadJobD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore17AttachmentLoadJobD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore19AttachmentUpdateJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageCore19AttachmentUpdateJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageCore19AttachmentUpdateJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageCore19AttachmentUpdateJob5startEv@ABI_5_1 4:16.12.2 + _ZN11MessageCore19AttachmentUpdateJobC1ERK14QSharedPointerINS_14AttachmentPartEEP7QObject@ABI_5_1 4:16.12.2 + _ZN11MessageCore19AttachmentUpdateJobC2ERK14QSharedPointerINS_14AttachmentPartEEP7QObject@ABI_5_1 4:16.12.2 + _ZN11MessageCore19AttachmentUpdateJobD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore19AttachmentUpdateJobD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore19AttachmentUpdateJobD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore19MessageCoreSettings11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageCore19MessageCoreSettings11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageCore19MessageCoreSettings16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageCore19MessageCoreSettings4selfEv@ABI_5_1 4:16.12.2 + _ZN11MessageCore19MessageCoreSettings5mSelfE@ABI_5_1 4:16.12.2 + _ZN11MessageCore19MessageCoreSettingsC1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore19MessageCoreSettingsC2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore19MessageCoreSettingsD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore19MessageCoreSettingsD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore19MessageCoreSettingsD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore20AttachmentFromUrlJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageCore20AttachmentFromUrlJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageCore20AttachmentFromUrlJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageCore20AttachmentFromUrlJob7doStartEv@ABI_5_1 4:16.12.2 + _ZN11MessageCore20AttachmentFromUrlJobC1ERK4QUrlP7QObject@ABI_5_1 4:16.12.2 + _ZN11MessageCore20AttachmentFromUrlJobC2ERK4QUrlP7QObject@ABI_5_1 4:16.12.2 + _ZN11MessageCore20AttachmentFromUrlJobD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore20AttachmentFromUrlJobD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore20AttachmentFromUrlJobD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore21AttachmentCompressJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageCore21AttachmentCompressJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageCore21AttachmentCompressJob15setOriginalPartERK14QSharedPointerINS_14AttachmentPartEE@ABI_5_1 4:16.12.2 + _ZN11MessageCore21AttachmentCompressJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageCore21AttachmentCompressJob5startEv@ABI_5_1 4:16.12.2 + _ZN11MessageCore21AttachmentCompressJobC1ERK14QSharedPointerINS_14AttachmentPartEEP7QObject@ABI_5_1 4:16.12.2 + _ZN11MessageCore21AttachmentCompressJobC2ERK14QSharedPointerINS_14AttachmentPartEEP7QObject@ABI_5_1 4:16.12.2 + _ZN11MessageCore21AttachmentCompressJobD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore21AttachmentCompressJobD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore21AttachmentCompressJobD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore22AttachmentFromUrlUtils19createAttachmentJobERK4QUrlP7QObject@ABI_5_1 4:16.12.2 + _ZN11MessageCore23MessageCoreSettingsBase4selfEv@ABI_5_1 4:16.12.2 + _ZN11MessageCore23MessageCoreSettingsBaseC1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore23MessageCoreSettingsBaseC2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore23MessageCoreSettingsBaseD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore23MessageCoreSettingsBaseD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore23MessageCoreSettingsBaseD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore24AttachmentFromUrlBaseJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageCore24AttachmentFromUrlBaseJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageCore24AttachmentFromUrlBaseJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageCore24AttachmentFromUrlBaseJob21setMaximumAllowedSizeEx@ABI_5_1 4:16.12.2 + _ZN11MessageCore24AttachmentFromUrlBaseJob6setUrlERK4QUrl@ABI_5_1 4:16.12.2 + _ZN11MessageCore24AttachmentFromUrlBaseJobC1ERK4QUrlP7QObject@ABI_5_1 4:16.12.2 + _ZN11MessageCore24AttachmentFromUrlBaseJobC2ERK4QUrlP7QObject@ABI_5_1 4:16.12.2 + _ZN11MessageCore24AttachmentFromUrlBaseJobD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore24AttachmentFromUrlBaseJobD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore24AttachmentFromUrlBaseJobD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore26AttachmentPropertiesDialog11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageCore26AttachmentPropertiesDialog11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageCore26AttachmentPropertiesDialog14setSignEnabledEb@ABI_5_1 4:16.12.2 + _ZN11MessageCore26AttachmentPropertiesDialog16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageCore26AttachmentPropertiesDialog17setEncryptEnabledEb@ABI_5_1 4:16.12.2 + _ZN11MessageCore26AttachmentPropertiesDialog6acceptEv@ABI_5_1 4:16.12.2 + _ZN11MessageCore26AttachmentPropertiesDialog8slotHelpEv@ABI_5_1 4:16.12.2 + _ZN11MessageCore26AttachmentPropertiesDialogC1EPKN5KMime7ContentEP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageCore26AttachmentPropertiesDialogC1ERK14QSharedPointerINS_14AttachmentPartEEbP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageCore26AttachmentPropertiesDialogC2EPKN5KMime7ContentEP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageCore26AttachmentPropertiesDialogC2ERK14QSharedPointerINS_14AttachmentPartEEbP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageCore26AttachmentPropertiesDialogD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore26AttachmentPropertiesDialogD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore26AttachmentPropertiesDialogD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore28AttachmentFromMimeContentJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageCore28AttachmentFromMimeContentJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageCore28AttachmentFromMimeContentJob14setMimeContentEPKN5KMime7ContentE@ABI_5_1 4:16.12.2 + _ZN11MessageCore28AttachmentFromMimeContentJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageCore28AttachmentFromMimeContentJob7doStartEv@ABI_5_1 4:16.12.2 + _ZN11MessageCore28AttachmentFromMimeContentJobC1EPKN5KMime7ContentEP7QObject@ABI_5_1 4:16.12.2 + _ZN11MessageCore28AttachmentFromMimeContentJobC2EPKN5KMime7ContentEP7QObject@ABI_5_1 4:16.12.2 + _ZN11MessageCore28AttachmentFromMimeContentJobD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore28AttachmentFromMimeContentJobD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore28AttachmentFromMimeContentJobD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore4Util18addLinkInformationERK14QSharedPointerIN5KMime7MessageEExN7Akonadi13MessageStatusE@ABI_5_1 4:16.12.2 + _ZN11MessageCore4Util18getLinkInformationERK14QSharedPointerIN5KMime7MessageEER5QListIxERS7_IN7Akonadi13MessageStatusEE@ABI_5_1 4:16.12.2 + _ZN11MessageCore4Util19isStandaloneMessageERKN7Akonadi4ItemE@ABI_5_1 4:16.12.2 + _ZN11MessageCore4Util7messageERKN7Akonadi4ItemE@ABI_5_1 4:16.12.2 + _ZN11MessageCore5qHashERK14QSharedPointerINS_14AttachmentPartEE@ABI_5_1 4:16.12.2 + _ZN11MessageCore9ColorUtil12updateColorsEv@ABI_5_1 4:16.12.2 + _ZN11MessageCore9ColorUtil16initializeColorsEv@ABI_5_1 4:16.12.2 + _ZN11MessageCore9ColorUtil4selfEv@ABI_5_1 4:16.12.2 + _ZN11MessageCore9ColorUtilC1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageCore9ColorUtilC2Ev@ABI_5_1 4:16.12.2 + (optional=templinst)_ZN12KConfigGroup10writeEntryIiEEvPKcRKT_6QFlagsIN11KConfigBase15WriteConfigFlagEE@ABI_5_1 4:16.12.2 + _ZNK11MessageCore11MailingList11archiveUrlsEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore11MailingList11writeConfigER12KConfigGroup@ABI_5_1 4:16.12.2 + _ZNK11MessageCore11MailingList13subscribeUrlsEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore11MailingList14archivedAtUrlsEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore11MailingList15unsubscribeUrlsEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore11MailingList2idEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore11MailingList7handlerEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore11MailingList8featuresEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore11MailingList8helpUrlsEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore11MailingList8postUrlsEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore11MailingList9ownerUrlsEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore11MailingListeqERKS0_@ABI_5_1 4:16.12.2 + _ZNK11MessageCore14AttachmentPart11descriptionEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore14AttachmentPart11isEncryptedEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore14AttachmentPart12isCompressedEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore14AttachmentPart14isAutoEncodingEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore14AttachmentPart28isMessageOrMessageCollectionEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore14AttachmentPart3urlEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore14AttachmentPart4dataEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore14AttachmentPart4nameEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore14AttachmentPart4sizeEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore14AttachmentPart7charsetEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore14AttachmentPart8encodingEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore14AttachmentPart8fileNameEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore14AttachmentPart8isInlineEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore14AttachmentPart8isSignedEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore14AttachmentPart8mimeTypeEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore14ImageCollector6imagesEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore17AttachmentLoadJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore17AttachmentLoadJob14attachmentPartEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore19AttachmentUpdateJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore19AttachmentUpdateJob11updatedPartEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore19AttachmentUpdateJob12originalPartEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore19MessageCoreSettings10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore20AttachmentFromUrlJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore21AttachmentCompressJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore21AttachmentCompressJob12originalPartEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore21AttachmentCompressJob14compressedPartEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore21AttachmentCompressJob22isCompressedPartLargerEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore24AttachmentFromUrlBaseJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore24AttachmentFromUrlBaseJob18maximumAllowedSizeEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore24AttachmentFromUrlBaseJob3urlEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore26AttachmentPropertiesDialog10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore26AttachmentPropertiesDialog13isSignEnabledEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore26AttachmentPropertiesDialog14attachmentPartEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore26AttachmentPropertiesDialog16isEncryptEnabledEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore28AttachmentFromMimeContentJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore28AttachmentFromMimeContentJob11mimeContentEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore9ColorUtil21pgpEncryptedTextColorEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore9ColorUtil21pgpSignedBadTextColorEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore9ColorUtil24pgpEncryptedMessageColorEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore9ColorUtil24pgpSignedBadMessageColorEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore9ColorUtil25pgpSignedTrustedTextColorEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore9ColorUtil26misspelledDefaultTextColorEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore9ColorUtil27pgpSignedUntrustedTextColorEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore9ColorUtil27quoteLevel1DefaultTextColorEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore9ColorUtil27quoteLevel2DefaultTextColorEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore9ColorUtil27quoteLevel3DefaultTextColorEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore9ColorUtil28pgpSignedTrustedMessageColorEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore9ColorUtil30pgpSignedUntrustedMessageColorEv@ABI_5_1 4:16.12.2 + _ZNK11MessageCore9ColorUtil9linkColorEv@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK12KConfigGroup9readEntryIiEET_PKcRKS1_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK7Akonadi4Item10hasPayloadI14QSharedPointerIN5KMime7MessageEEEEbv@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK7Akonadi4Item11payloadImplI14QSharedPointerIN5KMime7MessageEEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicES9_E4typeEv@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK7Akonadi4Item14tryToCloneImplI14QSharedPointerIN5KMime7MessageEESt10shared_ptrIS4_EEENSt9enable_ifIXntsrSt7is_sameIT_T0_E5valueEbE4typeEPSA_PKi@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIPN5KMime7ContentESaIS2_EE19_M_emplace_back_auxIJRKS2_EEEvDpOT_@ABI_5_1 4:16.12.2 + _ZTIN11MessageCore14AttachmentPartE@ABI_5_1 4:16.12.2 + _ZTIN11MessageCore17AttachmentLoadJobE@ABI_5_1 4:16.12.2 + _ZTIN11MessageCore19AttachmentUpdateJobE@ABI_5_1 4:16.12.2 + _ZTIN11MessageCore19MessageCoreSettingsE@ABI_5_1 4:16.12.2 + _ZTIN11MessageCore20AttachmentFromUrlJobE@ABI_5_1 4:16.12.2 + _ZTIN11MessageCore21AttachmentCompressJobE@ABI_5_1 4:16.12.2 + _ZTIN11MessageCore23MessageCoreSettingsBaseE@ABI_5_1 4:16.12.2 + _ZTIN11MessageCore24AttachmentFromUrlBaseJobE@ABI_5_1 4:16.12.2 + _ZTIN11MessageCore26AttachmentPropertiesDialogE@ABI_5_1 4:16.12.2 + _ZTIN11MessageCore28AttachmentFromMimeContentJobE@ABI_5_1 4:16.12.2 + _ZTSN11MessageCore14AttachmentPartE@ABI_5_1 4:16.12.2 + _ZTSN11MessageCore17AttachmentLoadJobE@ABI_5_1 4:16.12.2 + _ZTSN11MessageCore19AttachmentUpdateJobE@ABI_5_1 4:16.12.2 + _ZTSN11MessageCore19MessageCoreSettingsE@ABI_5_1 4:16.12.2 + _ZTSN11MessageCore20AttachmentFromUrlJobE@ABI_5_1 4:16.12.2 + _ZTSN11MessageCore21AttachmentCompressJobE@ABI_5_1 4:16.12.2 + _ZTSN11MessageCore23MessageCoreSettingsBaseE@ABI_5_1 4:16.12.2 + _ZTSN11MessageCore24AttachmentFromUrlBaseJobE@ABI_5_1 4:16.12.2 + _ZTSN11MessageCore26AttachmentPropertiesDialogE@ABI_5_1 4:16.12.2 + _ZTSN11MessageCore28AttachmentFromMimeContentJobE@ABI_5_1 4:16.12.2 + _ZTVN11MessageCore14AttachmentPartE@ABI_5_1 4:16.12.2 + _ZTVN11MessageCore17AttachmentLoadJobE@ABI_5_1 4:16.12.2 + _ZTVN11MessageCore19AttachmentUpdateJobE@ABI_5_1 4:16.12.2 + _ZTVN11MessageCore19MessageCoreSettingsE@ABI_5_1 4:16.12.2 + _ZTVN11MessageCore20AttachmentFromUrlJobE@ABI_5_1 4:16.12.2 + _ZTVN11MessageCore21AttachmentCompressJobE@ABI_5_1 4:16.12.2 + _ZTVN11MessageCore23MessageCoreSettingsBaseE@ABI_5_1 4:16.12.2 + _ZTVN11MessageCore24AttachmentFromUrlBaseJobE@ABI_5_1 4:16.12.2 + _ZTVN11MessageCore26AttachmentPropertiesDialogE@ABI_5_1 4:16.12.2 + _ZTVN11MessageCore28AttachmentFromMimeContentJobE@ABI_5_1 4:16.12.2 + (c++)"non-virtual thunk to MessageCore::AttachmentPropertiesDialog::~AttachmentPropertiesDialog()@ABI_5_1" 4:16.12.2 diff -Nru kf5-messagelib-16.04.3/debian/libkf5messagecore5.install kf5-messagelib-16.12.3/debian/libkf5messagecore5.install --- kf5-messagelib-16.04.3/debian/libkf5messagecore5.install 2016-09-30 04:32:13.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messagecore5.install 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -usr/lib/*/libKF5MessageCore.so.5 -usr/lib/*/libKF5MessageCore.so.5.* diff -Nru kf5-messagelib-16.04.3/debian/libkf5messagecore5.symbols kf5-messagelib-16.12.3/debian/libkf5messagecore5.symbols --- kf5-messagelib-16.04.3/debian/libkf5messagecore5.symbols 2016-09-30 04:32:13.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messagecore5.symbols 1970-01-01 00:00:00.000000000 +0000 @@ -1,257 +0,0 @@ -# SymbolsHelper-Confirmed: 4:16.04.3 amd64 i386 -libKF5MessageCore.so.5 libkf5messagecore5 #MINVER# - _ZN11MessageCore10NodeHelper10firstChildEPKN5KMime7ContentE@Base 4:15.12 - _ZN11MessageCore10NodeHelper11nextSiblingEPKN5KMime7ContentE@Base 4:15.12 - _ZN11MessageCore10NodeHelper4nextEPN5KMime7ContentEb@Base 4:15.12 - _ZN11MessageCore10StringUtil10smartQuoteERK7QStringi@Base 4:15.12 - _ZN11MessageCore10StringUtil13cleanFileNameERK7QString@Base 4:15.12 - _ZN11MessageCore10StringUtil14parseMailtoUrlERK4QUrl@Base 4:15.12 - _ZN11MessageCore10StringUtil14quoteHtmlCharsERK7QStringb@Base 4:15.12 - _ZN11MessageCore10StringUtil14stripEmailAddrERK7QString@Base 4:15.12 - _ZN11MessageCore10StringUtil14stripSignatureERK7QString@Base 4:15.12 - _ZN11MessageCore10StringUtil15setEncodingFileER4QUrlRK7QString@Base 4:15.12 - _ZN11MessageCore10StringUtil16asSendableStringERK14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN11MessageCore10StringUtil16stripOffPrefixesERK7QString@Base 4:15.12 - _ZN11MessageCore10StringUtil17emailAddrAsAnchorEPN5KMime7Headers8Generics11AddressListENS0_7DisplayERK7QStringNS0_4LinkENS0_11AddressModeES9_i@Base 4:15.12 - _ZN11MessageCore10StringUtil17emailAddrAsAnchorEPN5KMime7Headers8Generics11MailboxListENS0_7DisplayERK7QStringNS0_4LinkENS0_11AddressModeES9_i@Base 4:15.12 - _ZN11MessageCore10StringUtil17emailAddrAsAnchorERK7QVectorIN5KMime5Types7MailboxEENS0_7DisplayERK7QStringNS0_4LinkENS0_11AddressModeESB_i@Base 4:15.12 - _ZN11MessageCore10StringUtil17formatQuotePrefixERK7QStringS3_@Base 4:15.12 - _ZN11MessageCore10StringUtil17generateMessageIdERK7QStringS3_@Base 4:15.12 - _ZN11MessageCore10StringUtil17splitAddressFieldERK10QByteArray@Base 4:15.12 - _ZN11MessageCore10StringUtil22addressIsInAddressListERK7QStringRK11QStringList@Base 4:15.12 - _ZN11MessageCore10StringUtil22headerAsSendableStringERK14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN11MessageCore10StringUtil25removePrivateHeaderFieldsERK14QSharedPointerIN5KMime7MessageEEb@Base 4:15.12 - _ZN11MessageCore10StringUtil30guessEmailAddressFromLoginNameERK7QString@Base 4:15.12 - _ZN11MessageCore11MailingList10readConfigERK12KConfigGroup@Base 4:15.12 - _ZN11MessageCore11MailingList10setHandlerENS0_7HandlerE@Base 4:15.12 - _ZN11MessageCore11MailingList11setHelpUrlsERK5QListI4QUrlE@Base 4:15.12 - _ZN11MessageCore11MailingList11setPostUrlsERK5QListI4QUrlE@Base 4:15.12 - _ZN11MessageCore11MailingList12setOwnerUrlsERK5QListI4QUrlE@Base 4:15.12 - _ZN11MessageCore11MailingList14setArchiveUrlsERK5QListI4QUrlE@Base 4:15.12 - _ZN11MessageCore11MailingList16setSubscribeUrlsERK5QListI4QUrlE@Base 4:15.12 - _ZN11MessageCore11MailingList17setArchivedAtUrlsERK5QListI4QUrlE@Base 4:15.12 - _ZN11MessageCore11MailingList18setUnsubscribeUrlsERK5QListI4QUrlE@Base 4:15.12 - _ZN11MessageCore11MailingList4nameERK14QSharedPointerIN5KMime7MessageEER10QByteArrayR7QString@Base 4:15.12 - _ZN11MessageCore11MailingList5setIdERK7QString@Base 4:15.12 - _ZN11MessageCore11MailingList6detectERK14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN11MessageCore11MailingListC1ERKS0_@Base 4:15.12 - _ZN11MessageCore11MailingListC1Ev@Base 4:15.12 - _ZN11MessageCore11MailingListC2ERKS0_@Base 4:15.12 - _ZN11MessageCore11MailingListC2Ev@Base 4:15.12 - _ZN11MessageCore11MailingListD1Ev@Base 4:15.12 - _ZN11MessageCore11MailingListD2Ev@Base 4:15.12 - _ZN11MessageCore11MailingListaSERKS0_@Base 4:15.12 - _ZN11MessageCore14AttachmentPart10setCharsetERK10QByteArray@Base 4:15.12 - _ZN11MessageCore14AttachmentPart11setEncodingEN5KMime7Headers15contentEncodingE@Base 4:15.12 - _ZN11MessageCore14AttachmentPart11setFileNameERK7QString@Base 4:15.12 - _ZN11MessageCore14AttachmentPart11setMimeTypeERK10QByteArray@Base 4:15.12 - _ZN11MessageCore14AttachmentPart12setEncryptedEb@Base 4:15.12 - _ZN11MessageCore14AttachmentPart13setCompressedEb@Base 4:15.12 - _ZN11MessageCore14AttachmentPart14setDescriptionERK7QString@Base 4:15.12 - _ZN11MessageCore14AttachmentPart15setAutoEncodingEb@Base 4:15.12 - _ZN11MessageCore14AttachmentPart6setUrlERK4QUrl@Base 4:15.12 - _ZN11MessageCore14AttachmentPart7setDataERK10QByteArray@Base 4:15.12 - _ZN11MessageCore14AttachmentPart7setNameERK7QString@Base 4:15.12 - _ZN11MessageCore14AttachmentPart9setInlineEb@Base 4:15.12 - _ZN11MessageCore14AttachmentPart9setSignedEb@Base 4:15.12 - _ZN11MessageCore14AttachmentPartC1Ev@Base 4:15.12 - _ZN11MessageCore14AttachmentPartC2Ev@Base 4:15.12 - _ZN11MessageCore14AttachmentPartD0Ev@Base 4:15.12 - _ZN11MessageCore14AttachmentPartD1Ev@Base 4:15.12 - _ZN11MessageCore14AttachmentPartD2Ev@Base 4:15.12 - _ZN11MessageCore14ImageCollector17collectImagesFromEPN5KMime7ContentE@Base 4:15.12 - _ZN11MessageCore14ImageCollectorC1Ev@Base 4:15.12 - _ZN11MessageCore14ImageCollectorC2Ev@Base 4:15.12 - _ZN11MessageCore14ImageCollectorD1Ev@Base 4:15.12 - _ZN11MessageCore14ImageCollectorD2Ev@Base 4:15.12 - _ZN11MessageCore17AttachmentLoadJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN11MessageCore17AttachmentLoadJob11qt_metacastEPKc@Base 4:15.12 - _ZN11MessageCore17AttachmentLoadJob16staticMetaObjectE@Base 4:15.12 - _ZN11MessageCore17AttachmentLoadJob17setAttachmentPartERK14QSharedPointerINS_14AttachmentPartEE@Base 4:15.12 - _ZN11MessageCore17AttachmentLoadJob5startEv@Base 4:15.12 - _ZN11MessageCore17AttachmentLoadJobC1EP7QObject@Base 4:15.12 - _ZN11MessageCore17AttachmentLoadJobC2EP7QObject@Base 4:15.12 - _ZN11MessageCore17AttachmentLoadJobD0Ev@Base 4:15.12 - _ZN11MessageCore17AttachmentLoadJobD1Ev@Base 4:15.12 - _ZN11MessageCore17AttachmentLoadJobD2Ev@Base 4:15.12 - _ZN11MessageCore19AttachmentUpdateJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN11MessageCore19AttachmentUpdateJob11qt_metacastEPKc@Base 4:15.12 - _ZN11MessageCore19AttachmentUpdateJob16staticMetaObjectE@Base 4:15.12 - _ZN11MessageCore19AttachmentUpdateJob5startEv@Base 4:15.12 - _ZN11MessageCore19AttachmentUpdateJobC1ERK14QSharedPointerINS_14AttachmentPartEEP7QObject@Base 4:15.12 - _ZN11MessageCore19AttachmentUpdateJobC2ERK14QSharedPointerINS_14AttachmentPartEEP7QObject@Base 4:15.12 - _ZN11MessageCore19AttachmentUpdateJobD0Ev@Base 4:15.12 - _ZN11MessageCore19AttachmentUpdateJobD1Ev@Base 4:15.12 - _ZN11MessageCore19AttachmentUpdateJobD2Ev@Base 4:15.12 - _ZN11MessageCore19MessageCoreSettings11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN11MessageCore19MessageCoreSettings11qt_metacastEPKc@Base 4:15.12 - _ZN11MessageCore19MessageCoreSettings16staticMetaObjectE@Base 4:15.12 - _ZN11MessageCore19MessageCoreSettings4selfEv@Base 4:15.12 - _ZN11MessageCore19MessageCoreSettings5mSelfE@Base 4:15.12 - _ZN11MessageCore19MessageCoreSettingsC1Ev@Base 4:15.12 - _ZN11MessageCore19MessageCoreSettingsC2Ev@Base 4:15.12 - _ZN11MessageCore19MessageCoreSettingsD0Ev@Base 4:15.12 - _ZN11MessageCore19MessageCoreSettingsD1Ev@Base 4:15.12 - _ZN11MessageCore19MessageCoreSettingsD2Ev@Base 4:15.12 - _ZN11MessageCore20AttachmentFromUrlJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN11MessageCore20AttachmentFromUrlJob11qt_metacastEPKc@Base 4:15.12 - _ZN11MessageCore20AttachmentFromUrlJob16staticMetaObjectE@Base 4:15.12 - _ZN11MessageCore20AttachmentFromUrlJob7doStartEv@Base 4:15.12 - _ZN11MessageCore20AttachmentFromUrlJobC1ERK4QUrlP7QObject@Base 4:15.12 - _ZN11MessageCore20AttachmentFromUrlJobC2ERK4QUrlP7QObject@Base 4:15.12 - _ZN11MessageCore20AttachmentFromUrlJobD0Ev@Base 4:15.12 - _ZN11MessageCore20AttachmentFromUrlJobD1Ev@Base 4:15.12 - _ZN11MessageCore20AttachmentFromUrlJobD2Ev@Base 4:15.12 - _ZN11MessageCore21AttachmentCompressJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN11MessageCore21AttachmentCompressJob11qt_metacastEPKc@Base 4:15.12 - _ZN11MessageCore21AttachmentCompressJob15setOriginalPartERK14QSharedPointerINS_14AttachmentPartEE@Base 4:15.12 - _ZN11MessageCore21AttachmentCompressJob16staticMetaObjectE@Base 4:15.12 - _ZN11MessageCore21AttachmentCompressJob5startEv@Base 4:15.12 - _ZN11MessageCore21AttachmentCompressJobC1ERK14QSharedPointerINS_14AttachmentPartEEP7QObject@Base 4:15.12 - _ZN11MessageCore21AttachmentCompressJobC2ERK14QSharedPointerINS_14AttachmentPartEEP7QObject@Base 4:15.12 - _ZN11MessageCore21AttachmentCompressJobD0Ev@Base 4:15.12 - _ZN11MessageCore21AttachmentCompressJobD1Ev@Base 4:15.12 - _ZN11MessageCore21AttachmentCompressJobD2Ev@Base 4:15.12 - _ZN11MessageCore22AttachmentFromUrlUtils19createAttachmentJobERK4QUrlP7QObject@Base 4:15.12 - _ZN11MessageCore23MessageCoreSettingsBase4selfEv@Base 4:15.12 - _ZN11MessageCore23MessageCoreSettingsBaseC1Ev@Base 4:15.12 - _ZN11MessageCore23MessageCoreSettingsBaseC2Ev@Base 4:15.12 - _ZN11MessageCore23MessageCoreSettingsBaseD0Ev@Base 4:15.12 - _ZN11MessageCore23MessageCoreSettingsBaseD1Ev@Base 4:15.12 - _ZN11MessageCore23MessageCoreSettingsBaseD2Ev@Base 4:15.12 - _ZN11MessageCore24AttachmentFromUrlBaseJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN11MessageCore24AttachmentFromUrlBaseJob11qt_metacastEPKc@Base 4:15.12 - _ZN11MessageCore24AttachmentFromUrlBaseJob16staticMetaObjectE@Base 4:15.12 - _ZN11MessageCore24AttachmentFromUrlBaseJob21setMaximumAllowedSizeEx@Base 4:15.12 - _ZN11MessageCore24AttachmentFromUrlBaseJob6setUrlERK4QUrl@Base 4:15.12 - _ZN11MessageCore24AttachmentFromUrlBaseJobC1ERK4QUrlP7QObject@Base 4:15.12 - _ZN11MessageCore24AttachmentFromUrlBaseJobC2ERK4QUrlP7QObject@Base 4:15.12 - _ZN11MessageCore24AttachmentFromUrlBaseJobD0Ev@Base 4:15.12 - _ZN11MessageCore24AttachmentFromUrlBaseJobD1Ev@Base 4:15.12 - _ZN11MessageCore24AttachmentFromUrlBaseJobD2Ev@Base 4:15.12 - _ZN11MessageCore26AttachmentPropertiesDialog11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN11MessageCore26AttachmentPropertiesDialog11qt_metacastEPKc@Base 4:15.12 - _ZN11MessageCore26AttachmentPropertiesDialog14setSignEnabledEb@Base 4:15.12 - _ZN11MessageCore26AttachmentPropertiesDialog16staticMetaObjectE@Base 4:15.12 - _ZN11MessageCore26AttachmentPropertiesDialog17setEncryptEnabledEb@Base 4:15.12 - _ZN11MessageCore26AttachmentPropertiesDialog6acceptEv@Base 4:15.12 - _ZN11MessageCore26AttachmentPropertiesDialog8slotHelpEv@Base 4:15.12 - _ZN11MessageCore26AttachmentPropertiesDialogC1EPKN5KMime7ContentEP7QWidget@Base 4:15.12 - _ZN11MessageCore26AttachmentPropertiesDialogC1ERK14QSharedPointerINS_14AttachmentPartEEbP7QWidget@Base 4:15.12 - _ZN11MessageCore26AttachmentPropertiesDialogC2EPKN5KMime7ContentEP7QWidget@Base 4:15.12 - _ZN11MessageCore26AttachmentPropertiesDialogC2ERK14QSharedPointerINS_14AttachmentPartEEbP7QWidget@Base 4:15.12 - _ZN11MessageCore26AttachmentPropertiesDialogD0Ev@Base 4:15.12 - _ZN11MessageCore26AttachmentPropertiesDialogD1Ev@Base 4:15.12 - _ZN11MessageCore26AttachmentPropertiesDialogD2Ev@Base 4:15.12 - _ZN11MessageCore28AttachmentFromMimeContentJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN11MessageCore28AttachmentFromMimeContentJob11qt_metacastEPKc@Base 4:15.12 - _ZN11MessageCore28AttachmentFromMimeContentJob14setMimeContentEPKN5KMime7ContentE@Base 4:15.12 - _ZN11MessageCore28AttachmentFromMimeContentJob16staticMetaObjectE@Base 4:15.12 - _ZN11MessageCore28AttachmentFromMimeContentJob7doStartEv@Base 4:15.12 - _ZN11MessageCore28AttachmentFromMimeContentJobC1EPKN5KMime7ContentEP7QObject@Base 4:15.12 - _ZN11MessageCore28AttachmentFromMimeContentJobC2EPKN5KMime7ContentEP7QObject@Base 4:15.12 - _ZN11MessageCore28AttachmentFromMimeContentJobD0Ev@Base 4:15.12 - _ZN11MessageCore28AttachmentFromMimeContentJobD1Ev@Base 4:15.12 - _ZN11MessageCore28AttachmentFromMimeContentJobD2Ev@Base 4:15.12 - _ZN11MessageCore4Util18addLinkInformationERK14QSharedPointerIN5KMime7MessageEExN7Akonadi13MessageStatusE@Base 4:15.12 - _ZN11MessageCore4Util18getLinkInformationERK14QSharedPointerIN5KMime7MessageEER5QListIxERS7_IN7Akonadi13MessageStatusEE@Base 4:15.12 - _ZN11MessageCore4Util19isStandaloneMessageERKN7Akonadi4ItemE@Base 4:15.12 - _ZN11MessageCore4Util21pgpEncryptedTextColorEv@Base 4:15.12 - _ZN11MessageCore4Util21pgpSignedBadTextColorEv@Base 4:15.12 - _ZN11MessageCore4Util24pgpEncryptedMessageColorEv@Base 4:15.12 - _ZN11MessageCore4Util24pgpSignedBadMessageColorEv@Base 4:15.12 - _ZN11MessageCore4Util25pgpSignedTrustedTextColorEv@Base 4:15.12 - _ZN11MessageCore4Util26misspelledDefaultTextColorEv@Base 4:15.12 - _ZN11MessageCore4Util27pgpSignedUntrustedTextColorEv@Base 4:15.12 - _ZN11MessageCore4Util27quoteLevel1DefaultTextColorEv@Base 4:15.12 - _ZN11MessageCore4Util27quoteLevel2DefaultTextColorEv@Base 4:15.12 - _ZN11MessageCore4Util27quoteLevel3DefaultTextColorEv@Base 4:15.12 - _ZN11MessageCore4Util28pgpSignedTrustedMessageColorEv@Base 4:15.12 - _ZN11MessageCore4Util30pgpSignedUntrustedMessageColorEv@Base 4:15.12 - _ZN11MessageCore4Util7messageERKN7Akonadi4ItemE@Base 4:15.12 - _ZN11MessageCore5qHashERK14QSharedPointerINS_14AttachmentPartEE@Base 4:15.12 - (optional=templinst)_ZN12KConfigGroup10writeEntryIiEEvPKcRKT_6QFlagsIN11KConfigBase15WriteConfigFlagEE@Base 4:15.12 - _ZNK11MessageCore11MailingList11archiveUrlsEv@Base 4:15.12 - _ZNK11MessageCore11MailingList11writeConfigER12KConfigGroup@Base 4:15.12 - _ZNK11MessageCore11MailingList13subscribeUrlsEv@Base 4:15.12 - _ZNK11MessageCore11MailingList14archivedAtUrlsEv@Base 4:15.12 - _ZNK11MessageCore11MailingList15unsubscribeUrlsEv@Base 4:15.12 - _ZNK11MessageCore11MailingList2idEv@Base 4:15.12 - _ZNK11MessageCore11MailingList7handlerEv@Base 4:15.12 - _ZNK11MessageCore11MailingList8featuresEv@Base 4:15.12 - _ZNK11MessageCore11MailingList8helpUrlsEv@Base 4:15.12 - _ZNK11MessageCore11MailingList8postUrlsEv@Base 4:15.12 - _ZNK11MessageCore11MailingList9ownerUrlsEv@Base 4:15.12 - _ZNK11MessageCore11MailingListeqERKS0_@Base 4:15.12 - _ZNK11MessageCore14AttachmentPart11descriptionEv@Base 4:15.12 - _ZNK11MessageCore14AttachmentPart11isEncryptedEv@Base 4:15.12 - _ZNK11MessageCore14AttachmentPart12isCompressedEv@Base 4:15.12 - _ZNK11MessageCore14AttachmentPart14isAutoEncodingEv@Base 4:15.12 - _ZNK11MessageCore14AttachmentPart28isMessageOrMessageCollectionEv@Base 4:15.12 - _ZNK11MessageCore14AttachmentPart3urlEv@Base 4:15.12 - _ZNK11MessageCore14AttachmentPart4dataEv@Base 4:15.12 - _ZNK11MessageCore14AttachmentPart4nameEv@Base 4:15.12 - _ZNK11MessageCore14AttachmentPart4sizeEv@Base 4:15.12 - _ZNK11MessageCore14AttachmentPart7charsetEv@Base 4:15.12 - _ZNK11MessageCore14AttachmentPart8encodingEv@Base 4:15.12 - _ZNK11MessageCore14AttachmentPart8fileNameEv@Base 4:15.12 - _ZNK11MessageCore14AttachmentPart8isInlineEv@Base 4:15.12 - _ZNK11MessageCore14AttachmentPart8isSignedEv@Base 4:15.12 - _ZNK11MessageCore14AttachmentPart8mimeTypeEv@Base 4:15.12 - _ZNK11MessageCore14ImageCollector6imagesEv@Base 4:15.12 - _ZNK11MessageCore17AttachmentLoadJob10metaObjectEv@Base 4:15.12 - _ZNK11MessageCore17AttachmentLoadJob14attachmentPartEv@Base 4:15.12 - _ZNK11MessageCore19AttachmentUpdateJob10metaObjectEv@Base 4:15.12 - _ZNK11MessageCore19AttachmentUpdateJob11updatedPartEv@Base 4:15.12 - _ZNK11MessageCore19AttachmentUpdateJob12originalPartEv@Base 4:15.12 - _ZNK11MessageCore19MessageCoreSettings10metaObjectEv@Base 4:15.12 - _ZNK11MessageCore20AttachmentFromUrlJob10metaObjectEv@Base 4:15.12 - _ZNK11MessageCore21AttachmentCompressJob10metaObjectEv@Base 4:15.12 - _ZNK11MessageCore21AttachmentCompressJob12originalPartEv@Base 4:15.12 - _ZNK11MessageCore21AttachmentCompressJob14compressedPartEv@Base 4:15.12 - _ZNK11MessageCore21AttachmentCompressJob22isCompressedPartLargerEv@Base 4:15.12 - _ZNK11MessageCore24AttachmentFromUrlBaseJob10metaObjectEv@Base 4:15.12 - _ZNK11MessageCore24AttachmentFromUrlBaseJob18maximumAllowedSizeEv@Base 4:15.12 - _ZNK11MessageCore24AttachmentFromUrlBaseJob3urlEv@Base 4:15.12 - _ZNK11MessageCore26AttachmentPropertiesDialog10metaObjectEv@Base 4:15.12 - _ZNK11MessageCore26AttachmentPropertiesDialog13isSignEnabledEv@Base 4:15.12 - _ZNK11MessageCore26AttachmentPropertiesDialog14attachmentPartEv@Base 4:15.12 - _ZNK11MessageCore26AttachmentPropertiesDialog16isEncryptEnabledEv@Base 4:15.12 - _ZNK11MessageCore28AttachmentFromMimeContentJob10metaObjectEv@Base 4:15.12 - _ZNK11MessageCore28AttachmentFromMimeContentJob11mimeContentEv@Base 4:15.12 - (optional=templinst)_ZNK12KConfigGroup9readEntryIiEET_PKcRKS1_@Base 4:15.12 - (optional=templinst)_ZNK7Akonadi4Item10hasPayloadI14QSharedPointerIN5KMime7MessageEEEEbv@Base 4:15.12 - (optional=templinst)_ZNK7Akonadi4Item11payloadImplI14QSharedPointerIN5KMime7MessageEEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicES9_E4typeEv@Base 4:15.12 - (optional=templinst)_ZNK7Akonadi4Item14tryToCloneImplI14QSharedPointerIN5KMime7MessageEESt10shared_ptrIS4_EEENSt9enable_ifIXntsrSt7is_sameIT_T0_E5valueEbE4typeEPSA_PKi@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIPN5KMime7ContentESaIS2_EE19_M_emplace_back_auxIJRKS2_EEEvDpOT_@Base 4:15.12 - _ZTIN11MessageCore14AttachmentPartE@Base 4:15.12 - _ZTIN11MessageCore17AttachmentLoadJobE@Base 4:15.12 - _ZTIN11MessageCore19AttachmentUpdateJobE@Base 4:15.12 - _ZTIN11MessageCore19MessageCoreSettingsE@Base 4:15.12 - _ZTIN11MessageCore20AttachmentFromUrlJobE@Base 4:15.12 - _ZTIN11MessageCore21AttachmentCompressJobE@Base 4:15.12 - _ZTIN11MessageCore23MessageCoreSettingsBaseE@Base 4:15.12 - _ZTIN11MessageCore24AttachmentFromUrlBaseJobE@Base 4:15.12 - _ZTIN11MessageCore26AttachmentPropertiesDialogE@Base 4:15.12 - _ZTIN11MessageCore28AttachmentFromMimeContentJobE@Base 4:15.12 - _ZTSN11MessageCore14AttachmentPartE@Base 4:15.12 - _ZTSN11MessageCore17AttachmentLoadJobE@Base 4:15.12 - _ZTSN11MessageCore19AttachmentUpdateJobE@Base 4:15.12 - _ZTSN11MessageCore19MessageCoreSettingsE@Base 4:15.12 - _ZTSN11MessageCore20AttachmentFromUrlJobE@Base 4:15.12 - _ZTSN11MessageCore21AttachmentCompressJobE@Base 4:15.12 - _ZTSN11MessageCore23MessageCoreSettingsBaseE@Base 4:15.12 - _ZTSN11MessageCore24AttachmentFromUrlBaseJobE@Base 4:15.12 - _ZTSN11MessageCore26AttachmentPropertiesDialogE@Base 4:15.12 - _ZTSN11MessageCore28AttachmentFromMimeContentJobE@Base 4:15.12 - _ZTVN11MessageCore14AttachmentPartE@Base 4:15.12 - _ZTVN11MessageCore17AttachmentLoadJobE@Base 4:15.12 - _ZTVN11MessageCore19AttachmentUpdateJobE@Base 4:15.12 - _ZTVN11MessageCore19MessageCoreSettingsE@Base 4:15.12 - _ZTVN11MessageCore20AttachmentFromUrlJobE@Base 4:15.12 - _ZTVN11MessageCore21AttachmentCompressJobE@Base 4:15.12 - _ZTVN11MessageCore23MessageCoreSettingsBaseE@Base 4:15.12 - _ZTVN11MessageCore24AttachmentFromUrlBaseJobE@Base 4:15.12 - _ZTVN11MessageCore26AttachmentPropertiesDialogE@Base 4:15.12 - _ZTVN11MessageCore28AttachmentFromMimeContentJobE@Base 4:15.12 - (c++)"non-virtual thunk to MessageCore::AttachmentPropertiesDialog::~AttachmentPropertiesDialog()@Base" 4:15.12 diff -Nru kf5-messagelib-16.04.3/debian/libkf5messagecore-dev.acc.in kf5-messagelib-16.12.3/debian/libkf5messagecore-dev.acc.in --- kf5-messagelib-16.04.3/debian/libkf5messagecore-dev.acc.in 2016-09-30 04:32:13.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messagecore-dev.acc.in 2017-05-01 19:27:51.000000000 +0000 @@ -1,4 +1,4 @@ - + @@ -18,6 +18,7 @@ -fPIC -std=c++11 + -fno-keep-inline-functions - + \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/debian/libkf5messagelist5abi1.install kf5-messagelib-16.12.3/debian/libkf5messagelist5abi1.install --- kf5-messagelib-16.04.3/debian/libkf5messagelist5abi1.install 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messagelist5abi1.install 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,2 @@ +usr/lib/*/libKF5MessageList.so.5.* +usr/lib/*/libKF5MessageList.so.5abi1 diff -Nru kf5-messagelib-16.04.3/debian/libkf5messagelist5abi1.symbols kf5-messagelib-16.12.3/debian/libkf5messagelist5abi1.symbols --- kf5-messagelib-16.04.3/debian/libkf5messagelist5abi1.symbols 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messagelist5abi1.symbols 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,535 @@ +# SymbolsHelper-Confirmed: 4:16.12.2 amd64 armhf i386 +libKF5MessageList.so.5abi1 libkf5messagelist5abi1 #MINVER# + ABI_5_1@ABI_5_1 4:16.12.2 + (arch=!armhf)_ZN11KIconEngineD0Ev@ABI_5_1 4:16.12.2 + (arch=!armhf)_ZN11KIconEngineD1Ev@ABI_5_1 4:16.12.2 + (arch=!armhf)_ZN11KIconEngineD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList12StorageModel11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageList12StorageModel11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageList12StorageModel14prepareForScanEv@ABI_5_1 4:16.12.2 + _ZN11MessageList12StorageModel16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageList12StorageModel17resetModelStorageEv@ABI_5_1 4:16.12.2 + _ZN11MessageList12StorageModel20setMessageItemStatusEPNS_4Core11MessageItemEiN7Akonadi13MessageStatusE@ABI_5_1 4:16.12.2 + _ZN11MessageList12StorageModelC1EP18QAbstractItemModelP19QItemSelectionModelP7QObject@ABI_5_1 4:16.12.2 + _ZN11MessageList12StorageModelC2EP18QAbstractItemModelP19QItemSelectionModelP7QObject@ABI_5_1 4:16.12.2 + _ZN11MessageList12StorageModelD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList12StorageModelD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList12StorageModelD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings11tagSelectedEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings14setTagSelectedERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings15messageListFontEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings15showQuickSearchEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings15tagSelectedItemEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings15todoMessageFontEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings16todoMessageColorEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings17unreadMessageFontEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings18setMessageListFontERK5QFont@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings18setShowQuickSearchEb@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings18setTodoMessageFontERK5QFont@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings18unreadMessageColorEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings19messageListFontItemEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings19setTodoMessageColorERK6QColor@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings19showQuickSearchItemEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings19todoMessageFontItemEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings20importantMessageFontEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings20setUnreadMessageFontERK5QFont@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings20todoMessageColorItemEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings21importantMessageColorEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings21messageToolTipEnabledEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings21setUnreadMessageColorERK6QColor@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings21unreadMessageFontItemEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings22unreadMessageColorItemEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings23setImportantMessageFontERK5QFont@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings24importantMessageFontItemEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings24setImportantMessageColorERK6QColor@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings24setMessageToolTipEnabledEb@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings25importantMessageColorItemEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings25messageToolTipEnabledItemEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings32quickSearchWarningDoNotShowAgainEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings35setQuickSearchWarningDoNotShowAgainEb@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings36quickSearchWarningDoNotShowAgainItemEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettings4selfEv@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettingsC1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettingsC2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettingsD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettingsD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList19MessageListSettingsD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem13subTreeToListER5QListIPS1_E@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem14accessibleTextEPKNS0_5ThemeEi@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem14editAnnotationEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem14setAkonadiItemERKN7Akonadi4ItemE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem14setGeneralFontERK5QFont@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem14topmostMessageEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem15setMessageIdMD5ERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem17setInReplyToIdMD5ERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem17setSignatureStateENS1_14SignatureStateE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem18invalidateTagCacheEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem18setEncryptionStateENS1_15EncryptionStateE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem18setReferencesIdMD5ERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem18setThreadingStatusENS1_15ThreadingStatusE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem18setToDoMessageFontERK5QFont@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem19setAboutToBeRemovedEb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem19setToDoMessageColorERK6QColor@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem20setSubjectIsPrefixedEb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem20setUnreadMessageFontERK5QFont@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem21setStrippedSubjectMD5ERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem21setUnreadMessageColorERK6QColor@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem22accessibleTextForFieldENS0_5Theme11ContentItem4TypeE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem23setImportantMessageFontERK5QFont@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem24setImportantMessageColorERK6QColor@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem25invalidateAnnotationCacheEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem3Tag11setPriorityEi@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem3Tag12setTextColorERK6QColor@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem3Tag18setBackgroundColorERK6QColor@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem3Tag7setFontERK5QFont@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem3TagC1ERK7QPixmapRK7QStringS8_@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem3TagC2ERK7QPixmapRK7QStringS8_@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem3TagD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItem3TagD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItemC1EPNS0_18MessageItemPrivateE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItemC1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItemC2EPNS0_18MessageItemPrivateE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItemC2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItemD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItemD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core11MessageItemD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLine11eventFilterEP7QObjectP6QEvent@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLine11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLine11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLine11resetFilterEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLine16focusQuickSearchERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLine16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLine18clearButtonClickedEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLine19searchOptionChangedEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLine20searchEditTextEditedERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLine20statusButtonsClickedEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLine22slotClearButtonClickedEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLine23slotFilterActionChangedERK5QListIN7Akonadi13MessageStatusEE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLine24slotSearchEditTextEditedERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLine24updateComboboxVisibilityEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLine27changeQuicksearchVisibilityEb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLine27setContainsOutboundMessagesEb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLineC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLineC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLineD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLineD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core15QuickSearchLineD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus13updateFiltersEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus16createMenuSearchEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus16updateLockActionEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus17clearFilterActionEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus17initializeActionsEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus18createFilterActionERK5QIconRK7QStringi@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus19clearFilterByActionEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus19filterActionChangedERK5QListIN7Akonadi13MessageStatusEE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus19searchOptionChangedEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus20createFilterByActionEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus21slotToggledLockActionEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus22updateFilterActionIconEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus23slotFilterActionClickedEP7QAction@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus23slotSearchOptionChangedEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus24clearFilterButtonClickedEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus27setContainsOutboundMessagesEb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus31changeSearchAgainstFromOrToTextEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus8showMenuEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatus9setLockedEb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatusC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatusC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatusD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatusD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core16SearchLineStatusD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core18QuickSearchWarning11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core18QuickSearchWarning11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core18QuickSearchWarning13setSearchTextERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core18QuickSearchWarning16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core18QuickSearchWarning19slotDoNotRememberItEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core18QuickSearchWarningC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core18QuickSearchWarningC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core18QuickSearchWarningD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core18QuickSearchWarningD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core18QuickSearchWarningD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core31SearchCollectionIndexingWarning11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core31SearchCollectionIndexingWarning11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core31SearchCollectionIndexingWarning13setCollectionERKN7Akonadi10CollectionE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core31SearchCollectionIndexingWarning16fetchCollectionsERK7QVectorIN7Akonadi10CollectionEEb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core31SearchCollectionIndexingWarning16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core31SearchCollectionIndexingWarning18queryIndexerStatusEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core31SearchCollectionIndexingWarning28queryCollectionFetchFinishedEP4KJob@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core31SearchCollectionIndexingWarning32queryRootCollectionFetchFinishedEP4KJob@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core31SearchCollectionIndexingWarningC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core31SearchCollectionIndexingWarningC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core31SearchCollectionIndexingWarningD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core31SearchCollectionIndexingWarningD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core31SearchCollectionIndexingWarningD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item10setMaxDateEl@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item10setSubjectERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item11deepestItemEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item11setReceiverERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item11setViewableEPNS0_5ModelEb@ABI_5_1 4:16.12.2 + (subst)_ZN11MessageList4Core4Item12initialSetupEl{size_t}RK7QStringS4_b@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item13setIndexGuessEi@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item13takeChildItemEPNS0_5ModelEPS1_@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item14itemAboveChildEPS1_@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item14itemBelowChildEPS1_@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item14topmostNonRootEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item15appendChildItemEPNS0_5ModelEPS1_@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item16recomputeMaxDateEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item17killAllChildItemsEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item18rawAppendChildItemEPS1_@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item19setSubjectAndStatusERK7QStringN7Akonadi13MessageStatusE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item21setParentCollectionIdEx@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item22setInitialExpandStatusENS1_19InitialExpandStatusE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item4dumpERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item7setDateEl@ABI_5_1 4:16.12.2 + (subst)_ZN11MessageList4Core4Item7setSizeE{size_t}@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item9itemAboveEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item9itemBelowEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item9setItemIdEx@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item9setParentEPS1_@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item9setSenderERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4Item9setStatusEN7Akonadi13MessageStatusE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4ItemC1ENS1_4TypeE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4ItemC1ENS1_4TypeEPNS0_11ItemPrivateE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4ItemC2ENS1_4TypeE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4ItemC2ENS1_4TypeEPNS0_11ItemPrivateE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4ItemD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4ItemD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Core4ItemD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane10readConfigEb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane11eventFilterEP7QObjectP6QEvent@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane11writeConfigEb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane12createNewTabEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane13statusMessageERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane15messageSelectedERKN7Akonadi4ItemE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane15setXmlGuiClientEP13KXMLGUIClient@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane16focusQuickSearchERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane16messageActivatedERKN7Akonadi4ItemE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane16selectionChangedEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane16setCurrentFolderERKN7Akonadi10CollectionEbNS_4Core16PreSelectionModeERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane17currentTabChangedEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane17resetModelStorageEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane17setPreferEmptyTabEb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane17updateTabIconTextERKN7Akonadi10CollectionERK7QStringRK5QIcon@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane17updateTagComboBoxEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane18createStorageModelEP18QAbstractItemModelP19QItemSelectionModelP7QObject@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane19deletePersistentSetEl@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane20focusNextMessageItemENS_4Core17MessageTypeFilterEbb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane20saveCurrentSelectionEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane20setAllGroupsExpandedEb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane20themeMenuAboutToShowEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane21restoreHeaderSettingsEi@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane21selectLastMessageItemENS_4Core17MessageTypeFilterEb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane21selectNextMessageItemENS_4Core17MessageTypeFilterENS1_26ExistingSelectionBehaviourEbb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane21setAllThreadsExpandedEb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane22selectFirstMessageItemENS_4Core17MessageTypeFilterEb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane24focusPreviousMessageItemENS_4Core17MessageTypeFilterEbb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane24selectFocusedMessageItemEb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane24setCurrentThreadExpandedEb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane24sortOrderMenuAboutToShowEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane25currentItemSelectionModelEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane25itemListFromPersistentSetEl@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane25populateStatusFilterComboEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane25reloadGlobalConfigurationEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane25selectPreviousMessageItemENS_4Core17MessageTypeFilterENS1_26ExistingSelectionBehaviourEbb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane26aggregationMenuAboutToShowEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane26messageStatusChangeRequestERKN7Akonadi4ItemERKNS1_13MessageStatusES7_@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane26setQuickSearchClickMessageERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane34markMessageItemsAsAboutToBeRemovedElb@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane9focusViewEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Pane9selectAllEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4PaneC1EbP18QAbstractItemModelP19QItemSelectionModelP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageList4PaneC2EbP18QAbstractItemModelP19QItemSelectionModelP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageList4PaneD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4PaneD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4PaneD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList4Util12deleteConfigERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageList4Util14contentSummaryERKN7Akonadi4ItemE@ABI_5_1 4:16.12.2 + _ZN11MessageList4Util23todoDefaultMessageColorEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Util25unreadDefaultMessageColorEv@ABI_5_1 4:16.12.2 + _ZN11MessageList4Util28importantDefaultMessageColorEv@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils13ThemeComboBox11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils13ThemeComboBox11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils13ThemeComboBox13selectDefaultEv@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils13ThemeComboBox16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils13ThemeComboBox22readStorageModelConfigEPNS_4Core12StorageModelERb@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils13ThemeComboBox22readStorageModelConfigERKN7Akonadi10CollectionERb@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils13ThemeComboBoxC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils13ThemeComboBoxC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils13ThemeComboBoxD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils13ThemeComboBoxD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils13ThemeComboBoxD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils17ThemeConfigButton11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils17ThemeConfigButton11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils17ThemeConfigButton16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils17ThemeConfigButton24configureDialogCompletedEv@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils17ThemeConfigButtonC1EP7QWidgetPKNS0_13ThemeComboBoxE@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils17ThemeConfigButtonC2EP7QWidgetPKNS0_13ThemeComboBoxE@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils17ThemeConfigButtonD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils17ThemeConfigButtonD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils17ThemeConfigButtonD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils19AggregationComboBox11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils19AggregationComboBox11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils19AggregationComboBox13selectDefaultEv@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils19AggregationComboBox16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils19AggregationComboBox22readStorageModelConfigEPNS_4Core12StorageModelERb@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils19AggregationComboBox22readStorageModelConfigERK7QStringRb@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils19AggregationComboBox22readStorageModelConfigERKN7Akonadi10CollectionERb@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils19AggregationComboBoxC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils19AggregationComboBoxC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils19AggregationComboBoxD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils19AggregationComboBoxD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils19AggregationComboBoxD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils23AggregationConfigButton11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils23AggregationConfigButton11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils23AggregationConfigButton16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils23AggregationConfigButton24configureDialogCompletedEv@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils23AggregationConfigButtonC1EP7QWidgetPKNS0_19AggregationComboBoxE@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils23AggregationConfigButtonC2EP7QWidgetPKNS0_19AggregationComboBoxE@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils23AggregationConfigButtonD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils23AggregationConfigButtonD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList5Utils23AggregationConfigButtonD2Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget13canAcceptDragEPK10QDropEvent@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget13viewDropEventEP10QDropEvent@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget14slotExpandItemEv@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget15messageSelectedERKN7Akonadi4ItemE@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget15setXmlGuiClientEP13KXMLGUIClient@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget15slotTagsFetchedEP4KJob@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget16focusQuickSearchERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget16messageActivatedERKN7Akonadi4ItemE@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget16selectionChangedEv@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget16slotCollapseItemEv@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget17viewDragMoveEventEP14QDragMoveEvent@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget18viewDragEnterEventEP15QDragEnterEvent@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget19deletePersistentSetEl@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget19fillMessageTagComboEv@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget19viewMessageSelectedEPNS_4Core11MessageItemE@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget20focusNextMessageItemENS_4Core17MessageTypeFilterEbb@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget20setAllGroupsExpandedEb@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget20viewMessageActivatedEPNS_4Core11MessageItemE@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget20viewSelectionChangedEv@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget20viewStartDragRequestEv@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget21selectLastMessageItemENS_4Core17MessageTypeFilterEb@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget21selectNextMessageItemENS_4Core17MessageTypeFilterENS1_26ExistingSelectionBehaviourEbb@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget21setAllThreadsExpandedEb@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget22selectFirstMessageItemENS_4Core17MessageTypeFilterEb@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget24focusPreviousMessageItemENS_4Core17MessageTypeFilterEbb@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget24selectFocusedMessageItemEb@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget24setCurrentThreadExpandedEb@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget25itemListFromPersistentSetEl@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget25selectPreviousMessageItemENS_4Core17MessageTypeFilterENS1_26ExistingSelectionBehaviourEbb@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget26messageStatusChangeRequestERKN7Akonadi4ItemERKNS1_13MessageStatusES7_@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget26setQuickSearchClickMessageERK7QString@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget30viewMessageStatusChangeRequestEPNS_4Core11MessageItemEN7Akonadi13MessageStatusES5_@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget34markMessageItemsAsAboutToBeRemovedElb@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget34viewGroupHeaderContextPopupRequestEPNS_4Core15GroupHeaderItemERK6QPoint@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget34viewMessageListContextPopupRequestERK5QListIPNS_4Core11MessageItemEERK6QPoint@ABI_5_1 4:16.12.2 + _ZN11MessageList6Widget9selectAllEv@ABI_5_1 4:16.12.2 + _ZN11MessageList6WidgetC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageList6WidgetC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN11MessageList6WidgetD0Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList6WidgetD1Ev@ABI_5_1 4:16.12.2 + _ZN11MessageList6WidgetD2Ev@ABI_5_1 4:16.12.2 + (optional=templinst)_ZN12KConfigGroup10writeEntryIiEEvPKcRKT_6QFlagsIN11KConfigBase15WriteConfigFlagEE@ABI_5_1 4:16.12.2 + _ZN9QHashData9hasShrunkEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel10itemForRowEi@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel11columnCountERK11QModelIndex@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel13messageForRowEi@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel16isOutBoundFolderERKN7Akonadi10CollectionE@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel20displayedCollectionsEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel21initializeMessageItemEPNS_4Core11MessageItemEib@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel21updateMessageItemDataEPNS_4Core11MessageItemEi@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel22parentCollectionForRowEi@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel24containsOutboundMessagesEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel26initialUnreadRowCountGuessEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel28fillMessageItemThreadingDataEPNS_4Core11MessageItemEiNS1_12StorageModel19ThreadingDataSubsetE@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel2idEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel4dataERK11QModelIndexi@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel5indexEiiRK11QModelIndex@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel6parentERK11QModelIndex@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel8mimeDataERK5QListIPNS_4Core11MessageItemEE@ABI_5_1 4:16.12.2 + _ZNK11MessageList12StorageModel8rowCountERK11QModelIndex@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem10annotationEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem11akonadiItemEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem12messageIdMD5Ev@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem13hasAnnotationEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem14inReplyToIdMD5Ev@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem14signatureStateEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem15backgroundColorEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem15encryptionStateEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem15referencesIdMD5Ev@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem15threadingStatusEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem16aboutToBeRemovedEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem17subjectIsPrefixedEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem18strippedSubjectMD5Ev@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem18tagListDescriptionEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem3Tag15backgroundColorEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem3Tag2idEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem3Tag4fontEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem3Tag4nameEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem3Tag6pixmapEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem3Tag8priorityEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem3Tag9textColorEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem4fontEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem7findTagERK7QString@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem7tagListEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem8uniqueIdEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core11MessageItem9textColorEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core15QuickSearchLine10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core15QuickSearchLine10searchEditEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core15QuickSearchLine13searchOptionsEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core15QuickSearchLine17tagFilterComboBoxEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core15QuickSearchLine24containsOutboundMessagesEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core15QuickSearchLine6statusEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core16SearchLineStatus10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core16SearchLineStatus13searchOptionsEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core16SearchLineStatus24containsOutboundMessagesEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core16SearchLineStatus6lockedEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core18QuickSearchWarning10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core31SearchCollectionIndexingWarning10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item10childItemsEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item10isViewableEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item11hasAncestorEPKS1_@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item11hasChildrenEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item11useReceiverEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item13displaySenderEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item13formattedDateEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item13formattedSizeEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item14childItemCountEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item14childItemStatsERNS1_14ChildItemStatsE@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item14firstChildItemEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item15displayReceiverEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item16formattedMaxDateEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item16indexOfChildItemEPS1_@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item16senderOrReceiverEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item17statusDescriptionEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item18parentCollectionIdEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item19initialExpandStatusEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item23displaySenderOrReceiverEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item4dateEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item4sizeEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item4typeEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item6itemIdEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item6parentEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item6senderEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item6statusEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item7maxDateEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item7subjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item8receiverEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Core4Item9childItemEi@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Pane10isThreadedEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Pane10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Pane11currentItemEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Pane14currentMessageEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Pane14currentOptionsEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Pane14selectionEmptyEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Pane17getSelectionStatsER7QVectorIN7Akonadi4ItemEES5_Pbb@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Pane18searchEditHasFocusEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Pane19currentFilterStatusEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Pane22selectionAsMessageListEb@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Pane24selectionAsListMessageIdEb@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Pane24selectionAsPersistentSetEb@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Pane25currentFilterSearchStringEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Pane26currentThreadAsMessageListEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Pane26selectionAsMessageItemListEb@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Pane28currentThreadAsPersistentSetEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList4Pane28selectionAsMessageItemListIdEb@ABI_5_1 4:16.12.2 + _ZNK11MessageList5Utils13ThemeComboBox10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList5Utils13ThemeComboBox12currentThemeEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList5Utils13ThemeComboBox18writeDefaultConfigEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList5Utils13ThemeComboBox23writeStorageModelConfigEPNS_4Core12StorageModelEb@ABI_5_1 4:16.12.2 + _ZNK11MessageList5Utils13ThemeComboBox23writeStorageModelConfigERK7QStringb@ABI_5_1 4:16.12.2 + _ZNK11MessageList5Utils17ThemeConfigButton10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList5Utils19AggregationComboBox10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList5Utils19AggregationComboBox18currentAggregationEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList5Utils19AggregationComboBox18writeDefaultConfigEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList5Utils19AggregationComboBox23writeStorageModelConfigEPNS_4Core12StorageModelEb@ABI_5_1 4:16.12.2 + _ZNK11MessageList5Utils19AggregationComboBox23writeStorageModelConfigERK7QStringb@ABI_5_1 4:16.12.2 + _ZNK11MessageList5Utils23AggregationConfigButton10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList6Widget10isThreadedEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList6Widget10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList6Widget11currentItemEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList6Widget14currentMessageEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList6Widget14currentOptionsEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList6Widget14selectionEmptyEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList6Widget17currentCollectionEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList6Widget17getSelectionStatsER7QVectorIN7Akonadi4ItemEES5_Pbb@ABI_5_1 4:16.12.2 + _ZNK11MessageList6Widget19currentFilterStatusEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList6Widget22selectionAsMessageListEb@ABI_5_1 4:16.12.2 + _ZNK11MessageList6Widget24selectionAsListMessageIdEb@ABI_5_1 4:16.12.2 + _ZNK11MessageList6Widget24selectionAsPersistentSetEb@ABI_5_1 4:16.12.2 + _ZNK11MessageList6Widget25currentFilterSearchStringEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList6Widget26currentThreadAsMessageListEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList6Widget26selectionAsMessageItemListEb@ABI_5_1 4:16.12.2 + _ZNK11MessageList6Widget28currentThreadAsPersistentSetEv@ABI_5_1 4:16.12.2 + _ZNK11MessageList6Widget28selectionAsMessageItemListIdEb@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK12KConfigGroup9readEntryI10QByteArrayEET_PKcRKS2_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK12KConfigGroup9readEntryIiEET_PKcRKS1_@ABI_5_1 4:16.12.2 + (optional=templinst|arch=amd64)_ZNK12KConfigGroup9readEntryIyEET_PKcRKS1_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK7Akonadi4Item11payloadImplI14QSharedPointerIN5KMime7MessageEEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicES9_E4typeEv@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK7Akonadi4Item14tryToCloneImplI14QSharedPointerIN5KMime7MessageEESt10shared_ptrIS4_EEENSt9enable_ifIXntsrSt7is_sameIT_T0_E5valueEbE4typeEPSA_PKi@ABI_5_1 4:16.12.2 + (arch=!armhf)_ZTI11KIconEngine@ABI_5_1 4:16.12.2 + _ZTIN11MessageList12StorageModelE@ABI_5_1 4:16.12.2 + _ZTIN11MessageList19MessageListSettingsE@ABI_5_1 4:16.12.2 + _ZTIN11MessageList4Core11MessageItemE@ABI_5_1 4:16.12.2 + _ZTIN11MessageList4Core15QuickSearchLineE@ABI_5_1 4:16.12.2 + _ZTIN11MessageList4Core16SearchLineStatusE@ABI_5_1 4:16.12.2 + _ZTIN11MessageList4Core18QuickSearchWarningE@ABI_5_1 4:16.12.2 + _ZTIN11MessageList4Core31SearchCollectionIndexingWarningE@ABI_5_1 4:16.12.2 + _ZTIN11MessageList4Core4ItemE@ABI_5_1 4:16.12.2 + _ZTIN11MessageList4PaneE@ABI_5_1 4:16.12.2 + _ZTIN11MessageList5Utils13ThemeComboBoxE@ABI_5_1 4:16.12.2 + _ZTIN11MessageList5Utils17ThemeConfigButtonE@ABI_5_1 4:16.12.2 + _ZTIN11MessageList5Utils19AggregationComboBoxE@ABI_5_1 4:16.12.2 + _ZTIN11MessageList5Utils23AggregationConfigButtonE@ABI_5_1 4:16.12.2 + _ZTIN11MessageList6WidgetE@ABI_5_1 4:16.12.2 + (arch=!armhf)_ZTS11KIconEngine@ABI_5_1 4:16.12.2 + _ZTSN11MessageList12StorageModelE@ABI_5_1 4:16.12.2 + _ZTSN11MessageList19MessageListSettingsE@ABI_5_1 4:16.12.2 + _ZTSN11MessageList4Core11MessageItemE@ABI_5_1 4:16.12.2 + _ZTSN11MessageList4Core15QuickSearchLineE@ABI_5_1 4:16.12.2 + _ZTSN11MessageList4Core16SearchLineStatusE@ABI_5_1 4:16.12.2 + _ZTSN11MessageList4Core18QuickSearchWarningE@ABI_5_1 4:16.12.2 + _ZTSN11MessageList4Core31SearchCollectionIndexingWarningE@ABI_5_1 4:16.12.2 + _ZTSN11MessageList4Core4ItemE@ABI_5_1 4:16.12.2 + _ZTSN11MessageList4PaneE@ABI_5_1 4:16.12.2 + _ZTSN11MessageList5Utils13ThemeComboBoxE@ABI_5_1 4:16.12.2 + _ZTSN11MessageList5Utils17ThemeConfigButtonE@ABI_5_1 4:16.12.2 + _ZTSN11MessageList5Utils19AggregationComboBoxE@ABI_5_1 4:16.12.2 + _ZTSN11MessageList5Utils23AggregationConfigButtonE@ABI_5_1 4:16.12.2 + _ZTSN11MessageList6WidgetE@ABI_5_1 4:16.12.2 + (arch=!armhf)_ZTV11KIconEngine@ABI_5_1 4:16.12.2 + _ZTVN11MessageList12StorageModelE@ABI_5_1 4:16.12.2 + _ZTVN11MessageList19MessageListSettingsE@ABI_5_1 4:16.12.2 + _ZTVN11MessageList4Core11MessageItemE@ABI_5_1 4:16.12.2 + _ZTVN11MessageList4Core15QuickSearchLineE@ABI_5_1 4:16.12.2 + _ZTVN11MessageList4Core16SearchLineStatusE@ABI_5_1 4:16.12.2 + _ZTVN11MessageList4Core18QuickSearchWarningE@ABI_5_1 4:16.12.2 + _ZTVN11MessageList4Core31SearchCollectionIndexingWarningE@ABI_5_1 4:16.12.2 + _ZTVN11MessageList4Core4ItemE@ABI_5_1 4:16.12.2 + _ZTVN11MessageList4PaneE@ABI_5_1 4:16.12.2 + _ZTVN11MessageList5Utils13ThemeComboBoxE@ABI_5_1 4:16.12.2 + _ZTVN11MessageList5Utils17ThemeConfigButtonE@ABI_5_1 4:16.12.2 + _ZTVN11MessageList5Utils19AggregationComboBoxE@ABI_5_1 4:16.12.2 + _ZTVN11MessageList5Utils23AggregationConfigButtonE@ABI_5_1 4:16.12.2 + _ZTVN11MessageList6WidgetE@ABI_5_1 4:16.12.2 + (c++)"non-virtual thunk to MessageList::Core::MessageItem::~MessageItem()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageList::Core::QuickSearchLine::~QuickSearchLine()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageList::Core::QuickSearchWarning::~QuickSearchWarning()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageList::Core::SearchCollectionIndexingWarning::~SearchCollectionIndexingWarning()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageList::Core::SearchLineStatus::~SearchLineStatus()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageList::Pane::~Pane()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageList::Utils::AggregationComboBox::~AggregationComboBox()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageList::Utils::AggregationConfigButton::~AggregationConfigButton()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageList::Utils::ThemeComboBox::~ThemeComboBox()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageList::Utils::ThemeConfigButton::~ThemeConfigButton()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageList::Widget::~Widget()@ABI_5_1" 4:16.12.2 diff -Nru kf5-messagelib-16.04.3/debian/libkf5messagelist5.install kf5-messagelib-16.12.3/debian/libkf5messagelist5.install --- kf5-messagelib-16.04.3/debian/libkf5messagelist5.install 2016-09-30 04:32:13.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messagelist5.install 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -usr/lib/*/libKF5MessageList.so.5 -usr/lib/*/libKF5MessageList.so.5.* diff -Nru kf5-messagelib-16.04.3/debian/libkf5messagelist5.symbols kf5-messagelib-16.12.3/debian/libkf5messagelist5.symbols --- kf5-messagelib-16.04.3/debian/libkf5messagelist5.symbols 2016-09-30 04:32:13.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messagelist5.symbols 1970-01-01 00:00:00.000000000 +0000 @@ -1,520 +0,0 @@ -# SymbolsHelper-Confirmed: 4:16.04.0 amd64 armhf i386 -libKF5MessageList.so.5 libkf5messagelist5 #MINVER# - (arch=!armhf)_ZN11KIconEngineD0Ev@Base 4:16.04.0 - (arch=!armhf)_ZN11KIconEngineD1Ev@Base 4:16.04.0 - (arch=!armhf)_ZN11KIconEngineD2Ev@Base 4:16.04.0 - _ZN11MessageList12StorageModel11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN11MessageList12StorageModel11qt_metacastEPKc@Base 4:15.12 - _ZN11MessageList12StorageModel14prepareForScanEv@Base 4:15.12 - _ZN11MessageList12StorageModel16staticMetaObjectE@Base 4:15.12 - _ZN11MessageList12StorageModel17resetModelStorageEv@Base 4:15.12 - _ZN11MessageList12StorageModel20setMessageItemStatusEPNS_4Core11MessageItemEiN7Akonadi13MessageStatusE@Base 4:15.12 - _ZN11MessageList12StorageModelC1EP18QAbstractItemModelP19QItemSelectionModelP7QObject@Base 4:15.12 - _ZN11MessageList12StorageModelC2EP18QAbstractItemModelP19QItemSelectionModelP7QObject@Base 4:15.12 - _ZN11MessageList12StorageModelD0Ev@Base 4:15.12 - _ZN11MessageList12StorageModelD1Ev@Base 4:15.12 - _ZN11MessageList12StorageModelD2Ev@Base 4:15.12 - _ZN11MessageList19MessageListSettings11tagSelectedEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings14setTagSelectedERK7QString@Base 4:15.12 - _ZN11MessageList19MessageListSettings15messageListFontEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings15showQuickSearchEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings15tagSelectedItemEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings15todoMessageFontEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings16todoMessageColorEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings17unreadMessageFontEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings18setMessageListFontERK5QFont@Base 4:15.12 - _ZN11MessageList19MessageListSettings18setShowQuickSearchEb@Base 4:15.12 - _ZN11MessageList19MessageListSettings18setTodoMessageFontERK5QFont@Base 4:15.12 - _ZN11MessageList19MessageListSettings18unreadMessageColorEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings19messageListFontItemEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings19setTodoMessageColorERK6QColor@Base 4:15.12 - _ZN11MessageList19MessageListSettings19showQuickSearchItemEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings19tabsHaveCloseButtonEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings19todoMessageFontItemEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings20importantMessageFontEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings20setUnreadMessageFontERK5QFont@Base 4:15.12 - _ZN11MessageList19MessageListSettings20todoMessageColorItemEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings21importantMessageColorEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings21messageToolTipEnabledEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings21setUnreadMessageColorERK6QColor@Base 4:15.12 - _ZN11MessageList19MessageListSettings21unreadMessageFontItemEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings22setTabsHaveCloseButtonEb@Base 4:15.12 - _ZN11MessageList19MessageListSettings22unreadMessageColorItemEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings23setImportantMessageFontERK5QFont@Base 4:15.12 - _ZN11MessageList19MessageListSettings23tabsHaveCloseButtonItemEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings24importantMessageFontItemEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings24setImportantMessageColorERK6QColor@Base 4:15.12 - _ZN11MessageList19MessageListSettings24setMessageToolTipEnabledEb@Base 4:15.12 - _ZN11MessageList19MessageListSettings25importantMessageColorItemEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings25messageToolTipEnabledItemEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings27autoHideTabBarWithSingleTabEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings30setAutoHideTabBarWithSingleTabEb@Base 4:15.12 - _ZN11MessageList19MessageListSettings31autoHideTabBarWithSingleTabItemEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings32quickSearchWarningDoNotShowAgainEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings35setQuickSearchWarningDoNotShowAgainEb@Base 4:15.12 - _ZN11MessageList19MessageListSettings36quickSearchWarningDoNotShowAgainItemEv@Base 4:15.12 - _ZN11MessageList19MessageListSettings4selfEv@Base 4:15.12 - _ZN11MessageList19MessageListSettingsC1Ev@Base 4:15.12 - _ZN11MessageList19MessageListSettingsC2Ev@Base 4:15.12 - _ZN11MessageList19MessageListSettingsD0Ev@Base 4:15.12 - _ZN11MessageList19MessageListSettingsD1Ev@Base 4:15.12 - _ZN11MessageList19MessageListSettingsD2Ev@Base 4:15.12 - _ZN11MessageList4Core11MessageItem13subTreeToListER5QListIPS1_E@Base 4:15.12 - _ZN11MessageList4Core11MessageItem14accessibleTextEPKNS0_5ThemeEi@Base 4:15.12 - _ZN11MessageList4Core11MessageItem14editAnnotationEv@Base 4:15.12 - _ZN11MessageList4Core11MessageItem14setAkonadiItemERKN7Akonadi4ItemE@Base 4:15.12 - _ZN11MessageList4Core11MessageItem14setGeneralFontERK5QFont@Base 4:15.12 - _ZN11MessageList4Core11MessageItem14topmostMessageEv@Base 4:15.12 - _ZN11MessageList4Core11MessageItem15setMessageIdMD5ERK10QByteArray@Base 4:15.12 - _ZN11MessageList4Core11MessageItem17setInReplyToIdMD5ERK10QByteArray@Base 4:15.12 - _ZN11MessageList4Core11MessageItem17setSignatureStateENS1_14SignatureStateE@Base 4:15.12 - _ZN11MessageList4Core11MessageItem18invalidateTagCacheEv@Base 4:15.12 - _ZN11MessageList4Core11MessageItem18setEncryptionStateENS1_15EncryptionStateE@Base 4:15.12 - _ZN11MessageList4Core11MessageItem18setReferencesIdMD5ERK10QByteArray@Base 4:15.12 - _ZN11MessageList4Core11MessageItem18setThreadingStatusENS1_15ThreadingStatusE@Base 4:15.12 - _ZN11MessageList4Core11MessageItem18setToDoMessageFontERK5QFont@Base 4:15.12 - _ZN11MessageList4Core11MessageItem19setAboutToBeRemovedEb@Base 4:15.12 - _ZN11MessageList4Core11MessageItem19setToDoMessageColorERK6QColor@Base 4:15.12 - _ZN11MessageList4Core11MessageItem20setSubjectIsPrefixedEb@Base 4:15.12 - _ZN11MessageList4Core11MessageItem20setUnreadMessageFontERK5QFont@Base 4:15.12 - _ZN11MessageList4Core11MessageItem21setStrippedSubjectMD5ERK10QByteArray@Base 4:15.12 - _ZN11MessageList4Core11MessageItem21setUnreadMessageColorERK6QColor@Base 4:15.12 - _ZN11MessageList4Core11MessageItem22accessibleTextForFieldENS0_5Theme11ContentItem4TypeE@Base 4:15.12 - _ZN11MessageList4Core11MessageItem23setImportantMessageFontERK5QFont@Base 4:15.12 - _ZN11MessageList4Core11MessageItem24setImportantMessageColorERK6QColor@Base 4:15.12 - _ZN11MessageList4Core11MessageItem25invalidateAnnotationCacheEv@Base 4:15.12 - _ZN11MessageList4Core11MessageItem3Tag11setPriorityEi@Base 4:15.12 - _ZN11MessageList4Core11MessageItem3Tag12setTextColorERK6QColor@Base 4:15.12 - _ZN11MessageList4Core11MessageItem3Tag18setBackgroundColorERK6QColor@Base 4:15.12 - _ZN11MessageList4Core11MessageItem3Tag7setFontERK5QFont@Base 4:15.12 - _ZN11MessageList4Core11MessageItem3TagC1ERK7QPixmapRK7QStringS8_@Base 4:15.12 - _ZN11MessageList4Core11MessageItem3TagC2ERK7QPixmapRK7QStringS8_@Base 4:15.12 - _ZN11MessageList4Core11MessageItem3TagD1Ev@Base 4:15.12 - _ZN11MessageList4Core11MessageItem3TagD2Ev@Base 4:15.12 - _ZN11MessageList4Core11MessageItemC1EPNS0_18MessageItemPrivateE@Base 4:15.12 - _ZN11MessageList4Core11MessageItemC1Ev@Base 4:15.12 - _ZN11MessageList4Core11MessageItemC2EPNS0_18MessageItemPrivateE@Base 4:15.12 - _ZN11MessageList4Core11MessageItemC2Ev@Base 4:15.12 - _ZN11MessageList4Core11MessageItemD0Ev@Base 4:15.12 - _ZN11MessageList4Core11MessageItemD1Ev@Base 4:15.12 - _ZN11MessageList4Core11MessageItemD2Ev@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLine11eventFilterEP7QObjectP6QEvent@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLine11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLine11qt_metacastEPKc@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLine11resetFilterEv@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLine16focusQuickSearchERK7QString@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLine16staticMetaObjectE@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLine18clearButtonClickedEv@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLine19searchOptionChangedEv@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLine20searchEditTextEditedERK7QString@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLine20statusButtonsClickedEv@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLine22slotClearButtonClickedEv@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLine23slotFilterActionChangedERK5QListIN7Akonadi13MessageStatusEE@Base 4:16.04.0 - _ZN11MessageList4Core15QuickSearchLine24slotSearchEditTextEditedERK7QString@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLine24updateComboboxVisibilityEv@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLine27changeQuicksearchVisibilityEb@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLine27setContainsOutboundMessagesEb@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLineC1EP7QWidget@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLineC2EP7QWidget@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLineD0Ev@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLineD1Ev@Base 4:15.12 - _ZN11MessageList4Core15QuickSearchLineD2Ev@Base 4:15.12 - _ZN11MessageList4Core16SearchLineStatus11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus11qt_metacastEPKc@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus13updateFiltersEv@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus16createMenuSearchEv@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus16staticMetaObjectE@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus16updateLockActionEv@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus17clearFilterActionEv@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus17initializeActionsEv@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus18createFilterActionERK5QIconRK7QStringi@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus19clearFilterByActionEv@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus19filterActionChangedERK5QListIN7Akonadi13MessageStatusEE@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus19searchOptionChangedEv@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus20createFilterByActionEv@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus21slotToggledLockActionEv@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus22updateFilterActionIconEv@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus23slotFilterActionClickedEP7QAction@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus23slotSearchOptionChangedEv@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus24clearFilterButtonClickedEv@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus27setContainsOutboundMessagesEb@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus31changeSearchAgainstFromOrToTextEv@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus8showMenuEv@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatus9setLockedEb@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatusC1EP7QWidget@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatusC2EP7QWidget@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatusD0Ev@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatusD1Ev@Base 4:16.04.0 - _ZN11MessageList4Core16SearchLineStatusD2Ev@Base 4:16.04.0 - _ZN11MessageList4Core18QuickSearchWarning11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN11MessageList4Core18QuickSearchWarning11qt_metacastEPKc@Base 4:15.12 - _ZN11MessageList4Core18QuickSearchWarning13setSearchTextERK7QString@Base 4:15.12 - _ZN11MessageList4Core18QuickSearchWarning16staticMetaObjectE@Base 4:15.12 - _ZN11MessageList4Core18QuickSearchWarning19slotDoNotRememberItEv@Base 4:15.12 - _ZN11MessageList4Core18QuickSearchWarningC1EP7QWidget@Base 4:15.12 - _ZN11MessageList4Core18QuickSearchWarningC2EP7QWidget@Base 4:15.12 - _ZN11MessageList4Core18QuickSearchWarningD0Ev@Base 4:15.12 - _ZN11MessageList4Core18QuickSearchWarningD1Ev@Base 4:15.12 - _ZN11MessageList4Core18QuickSearchWarningD2Ev@Base 4:15.12 - _ZN11MessageList4Core4Item10setMaxDateEl@Base 4:15.12 - _ZN11MessageList4Core4Item10setSubjectERK7QString@Base 4:15.12 - _ZN11MessageList4Core4Item11deepestItemEv@Base 4:15.12 - _ZN11MessageList4Core4Item11setReceiverERK7QString@Base 4:15.12 - _ZN11MessageList4Core4Item11setViewableEPNS0_5ModelEb@Base 4:15.12 - (subst)_ZN11MessageList4Core4Item12initialSetupEl{size_t}RK7QStringS4_b@Base 4:15.12 - _ZN11MessageList4Core4Item13setIndexGuessEi@Base 4:15.12 - _ZN11MessageList4Core4Item13takeChildItemEPNS0_5ModelEPS1_@Base 4:15.12 - _ZN11MessageList4Core4Item14itemAboveChildEPS1_@Base 4:15.12 - _ZN11MessageList4Core4Item14itemBelowChildEPS1_@Base 4:15.12 - _ZN11MessageList4Core4Item14topmostNonRootEv@Base 4:15.12 - _ZN11MessageList4Core4Item15appendChildItemEPNS0_5ModelEPS1_@Base 4:15.12 - _ZN11MessageList4Core4Item16recomputeMaxDateEv@Base 4:15.12 - _ZN11MessageList4Core4Item17killAllChildItemsEv@Base 4:15.12 - _ZN11MessageList4Core4Item18rawAppendChildItemEPS1_@Base 4:15.12 - _ZN11MessageList4Core4Item19setSubjectAndStatusERK7QStringN7Akonadi13MessageStatusE@Base 4:15.12 - _ZN11MessageList4Core4Item21setParentCollectionIdEx@Base 4:15.12 - _ZN11MessageList4Core4Item22setInitialExpandStatusENS1_19InitialExpandStatusE@Base 4:15.12 - _ZN11MessageList4Core4Item4dumpERK7QString@Base 4:15.12 - _ZN11MessageList4Core4Item7setDateEl@Base 4:15.12 - (subst)_ZN11MessageList4Core4Item7setSizeE{size_t}@Base 4:15.12 - _ZN11MessageList4Core4Item9itemAboveEv@Base 4:15.12 - _ZN11MessageList4Core4Item9itemBelowEv@Base 4:15.12 - _ZN11MessageList4Core4Item9setItemIdEx@Base 4:15.12 - _ZN11MessageList4Core4Item9setParentEPS1_@Base 4:15.12 - _ZN11MessageList4Core4Item9setSenderERK7QString@Base 4:15.12 - _ZN11MessageList4Core4Item9setStatusEN7Akonadi13MessageStatusE@Base 4:15.12 - _ZN11MessageList4Core4ItemC1ENS1_4TypeE@Base 4:15.12 - _ZN11MessageList4Core4ItemC1ENS1_4TypeEPNS0_11ItemPrivateE@Base 4:15.12 - _ZN11MessageList4Core4ItemC2ENS1_4TypeE@Base 4:15.12 - _ZN11MessageList4Core4ItemC2ENS1_4TypeEPNS0_11ItemPrivateE@Base 4:15.12 - _ZN11MessageList4Core4ItemD0Ev@Base 4:15.12 - _ZN11MessageList4Core4ItemD1Ev@Base 4:15.12 - _ZN11MessageList4Core4ItemD2Ev@Base 4:15.12 - _ZN11MessageList4Pane10readConfigEb@Base 4:15.12 - _ZN11MessageList4Pane11eventFilterEP7QObjectP6QEvent@Base 4:15.12 - _ZN11MessageList4Pane11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN11MessageList4Pane11qt_metacastEPKc@Base 4:15.12 - _ZN11MessageList4Pane11writeConfigEb@Base 4:15.12 - _ZN11MessageList4Pane12createNewTabEv@Base 4:15.12 - _ZN11MessageList4Pane13statusMessageERK7QString@Base 4:15.12 - _ZN11MessageList4Pane15messageSelectedERKN7Akonadi4ItemE@Base 4:15.12 - _ZN11MessageList4Pane15setXmlGuiClientEP13KXMLGUIClient@Base 4:15.12 - _ZN11MessageList4Pane16focusQuickSearchERK7QString@Base 4:15.12 - _ZN11MessageList4Pane16messageActivatedERKN7Akonadi4ItemE@Base 4:15.12 - _ZN11MessageList4Pane16selectionChangedEv@Base 4:15.12 - _ZN11MessageList4Pane16setCurrentFolderERKN7Akonadi10CollectionEbNS_4Core16PreSelectionModeERK7QString@Base 4:15.12 - _ZN11MessageList4Pane16staticMetaObjectE@Base 4:15.12 - _ZN11MessageList4Pane17currentTabChangedEv@Base 4:15.12 - _ZN11MessageList4Pane17resetModelStorageEv@Base 4:15.12 - _ZN11MessageList4Pane17setPreferEmptyTabEb@Base 4:15.12 - _ZN11MessageList4Pane17updateTabIconTextERKN7Akonadi10CollectionERK7QStringRK5QIcon@Base 4:15.12 - _ZN11MessageList4Pane17updateTagComboBoxEv@Base 4:15.12 - _ZN11MessageList4Pane18createStorageModelEP18QAbstractItemModelP19QItemSelectionModelP7QObject@Base 4:15.12 - _ZN11MessageList4Pane19deletePersistentSetEl@Base 4:15.12 - _ZN11MessageList4Pane20focusNextMessageItemENS_4Core17MessageTypeFilterEbb@Base 4:15.12 - _ZN11MessageList4Pane20saveCurrentSelectionEv@Base 4:15.12 - _ZN11MessageList4Pane20setAllGroupsExpandedEb@Base 4:15.12 - _ZN11MessageList4Pane20themeMenuAboutToShowEv@Base 4:15.12 - _ZN11MessageList4Pane21restoreHeaderSettingsEi@Base 4:15.12 - _ZN11MessageList4Pane21selectLastMessageItemENS_4Core17MessageTypeFilterEb@Base 4:15.12 - _ZN11MessageList4Pane21selectNextMessageItemENS_4Core17MessageTypeFilterENS1_26ExistingSelectionBehaviourEbb@Base 4:15.12 - _ZN11MessageList4Pane21setAllThreadsExpandedEb@Base 4:15.12 - _ZN11MessageList4Pane22selectFirstMessageItemENS_4Core17MessageTypeFilterEb@Base 4:15.12 - _ZN11MessageList4Pane24focusPreviousMessageItemENS_4Core17MessageTypeFilterEbb@Base 4:15.12 - _ZN11MessageList4Pane24selectFocusedMessageItemEb@Base 4:15.12 - _ZN11MessageList4Pane24setCurrentThreadExpandedEb@Base 4:15.12 - _ZN11MessageList4Pane24sortOrderMenuAboutToShowEv@Base 4:15.12 - _ZN11MessageList4Pane25currentItemSelectionModelEv@Base 4:15.12 - _ZN11MessageList4Pane25itemListFromPersistentSetEl@Base 4:15.12 - _ZN11MessageList4Pane25populateStatusFilterComboEv@Base 4:15.12 - _ZN11MessageList4Pane25reloadGlobalConfigurationEv@Base 4:15.12 - _ZN11MessageList4Pane25selectPreviousMessageItemENS_4Core17MessageTypeFilterENS1_26ExistingSelectionBehaviourEbb@Base 4:15.12 - _ZN11MessageList4Pane26aggregationMenuAboutToShowEv@Base 4:15.12 - _ZN11MessageList4Pane26messageStatusChangeRequestERKN7Akonadi4ItemERKNS1_13MessageStatusES7_@Base 4:15.12 - _ZN11MessageList4Pane26setQuickSearchClickMessageERK7QString@Base 4:15.12 - _ZN11MessageList4Pane34markMessageItemsAsAboutToBeRemovedElb@Base 4:15.12 - _ZN11MessageList4Pane9focusViewEv@Base 4:15.12 - _ZN11MessageList4Pane9selectAllEv@Base 4:15.12 - _ZN11MessageList4PaneC1EbP18QAbstractItemModelP19QItemSelectionModelP7QWidget@Base 4:15.12 - _ZN11MessageList4PaneC2EbP18QAbstractItemModelP19QItemSelectionModelP7QWidget@Base 4:15.12 - _ZN11MessageList4PaneD0Ev@Base 4:15.12 - _ZN11MessageList4PaneD1Ev@Base 4:15.12 - _ZN11MessageList4PaneD2Ev@Base 4:15.12 - _ZN11MessageList4Util12deleteConfigERK7QString@Base 4:15.12 - _ZN11MessageList4Util14contentSummaryERKN7Akonadi4ItemE@Base 4:15.12 - _ZN11MessageList4Util23todoDefaultMessageColorEv@Base 4:15.12 - _ZN11MessageList4Util25unreadDefaultMessageColorEv@Base 4:15.12 - _ZN11MessageList4Util28importantDefaultMessageColorEv@Base 4:15.12 - _ZN11MessageList5Utils13ThemeComboBox11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN11MessageList5Utils13ThemeComboBox11qt_metacastEPKc@Base 4:15.12 - _ZN11MessageList5Utils13ThemeComboBox13selectDefaultEv@Base 4:15.12 - _ZN11MessageList5Utils13ThemeComboBox16staticMetaObjectE@Base 4:15.12 - _ZN11MessageList5Utils13ThemeComboBox22readStorageModelConfigEPNS_4Core12StorageModelERb@Base 4:15.12 - _ZN11MessageList5Utils13ThemeComboBox22readStorageModelConfigERKN7Akonadi10CollectionERb@Base 4:15.12 - _ZN11MessageList5Utils13ThemeComboBoxC1EP7QWidget@Base 4:15.12 - _ZN11MessageList5Utils13ThemeComboBoxC2EP7QWidget@Base 4:15.12 - _ZN11MessageList5Utils13ThemeComboBoxD0Ev@Base 4:15.12 - _ZN11MessageList5Utils13ThemeComboBoxD1Ev@Base 4:15.12 - _ZN11MessageList5Utils13ThemeComboBoxD2Ev@Base 4:15.12 - _ZN11MessageList5Utils17ThemeConfigButton11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN11MessageList5Utils17ThemeConfigButton11qt_metacastEPKc@Base 4:15.12 - _ZN11MessageList5Utils17ThemeConfigButton16staticMetaObjectE@Base 4:15.12 - _ZN11MessageList5Utils17ThemeConfigButton24configureDialogCompletedEv@Base 4:15.12 - _ZN11MessageList5Utils17ThemeConfigButtonC1EP7QWidgetPKNS0_13ThemeComboBoxE@Base 4:15.12 - _ZN11MessageList5Utils17ThemeConfigButtonC2EP7QWidgetPKNS0_13ThemeComboBoxE@Base 4:15.12 - _ZN11MessageList5Utils17ThemeConfigButtonD0Ev@Base 4:15.12 - _ZN11MessageList5Utils17ThemeConfigButtonD1Ev@Base 4:15.12 - _ZN11MessageList5Utils17ThemeConfigButtonD2Ev@Base 4:15.12 - _ZN11MessageList5Utils19AggregationComboBox11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN11MessageList5Utils19AggregationComboBox11qt_metacastEPKc@Base 4:15.12 - _ZN11MessageList5Utils19AggregationComboBox13selectDefaultEv@Base 4:15.12 - _ZN11MessageList5Utils19AggregationComboBox16staticMetaObjectE@Base 4:15.12 - _ZN11MessageList5Utils19AggregationComboBox22readStorageModelConfigEPNS_4Core12StorageModelERb@Base 4:15.12 - _ZN11MessageList5Utils19AggregationComboBox22readStorageModelConfigERK7QStringRb@Base 4:15.12 - _ZN11MessageList5Utils19AggregationComboBox22readStorageModelConfigERKN7Akonadi10CollectionERb@Base 4:15.12 - _ZN11MessageList5Utils19AggregationComboBoxC1EP7QWidget@Base 4:15.12 - _ZN11MessageList5Utils19AggregationComboBoxC2EP7QWidget@Base 4:15.12 - _ZN11MessageList5Utils19AggregationComboBoxD0Ev@Base 4:15.12 - _ZN11MessageList5Utils19AggregationComboBoxD1Ev@Base 4:15.12 - _ZN11MessageList5Utils19AggregationComboBoxD2Ev@Base 4:15.12 - _ZN11MessageList5Utils23AggregationConfigButton11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN11MessageList5Utils23AggregationConfigButton11qt_metacastEPKc@Base 4:15.12 - _ZN11MessageList5Utils23AggregationConfigButton16staticMetaObjectE@Base 4:15.12 - _ZN11MessageList5Utils23AggregationConfigButton24configureDialogCompletedEv@Base 4:15.12 - _ZN11MessageList5Utils23AggregationConfigButtonC1EP7QWidgetPKNS0_19AggregationComboBoxE@Base 4:15.12 - _ZN11MessageList5Utils23AggregationConfigButtonC2EP7QWidgetPKNS0_19AggregationComboBoxE@Base 4:15.12 - _ZN11MessageList5Utils23AggregationConfigButtonD0Ev@Base 4:15.12 - _ZN11MessageList5Utils23AggregationConfigButtonD1Ev@Base 4:15.12 - _ZN11MessageList5Utils23AggregationConfigButtonD2Ev@Base 4:15.12 - _ZN11MessageList6Widget11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN11MessageList6Widget11qt_metacastEPKc@Base 4:15.12 - _ZN11MessageList6Widget13canAcceptDragEPK10QDropEvent@Base 4:15.12 - _ZN11MessageList6Widget13viewDropEventEP10QDropEvent@Base 4:15.12 - _ZN11MessageList6Widget14slotExpandItemEv@Base 4:15.12 - _ZN11MessageList6Widget15messageSelectedERKN7Akonadi4ItemE@Base 4:15.12 - _ZN11MessageList6Widget15setXmlGuiClientEP13KXMLGUIClient@Base 4:15.12 - _ZN11MessageList6Widget15slotTagsFetchedEP4KJob@Base 4:15.12 - _ZN11MessageList6Widget16focusQuickSearchERK7QString@Base 4:15.12 - _ZN11MessageList6Widget16messageActivatedERKN7Akonadi4ItemE@Base 4:15.12 - _ZN11MessageList6Widget16selectionChangedEv@Base 4:15.12 - _ZN11MessageList6Widget16slotCollapseItemEv@Base 4:15.12 - _ZN11MessageList6Widget16staticMetaObjectE@Base 4:15.12 - _ZN11MessageList6Widget17viewDragMoveEventEP14QDragMoveEvent@Base 4:15.12 - _ZN11MessageList6Widget18viewDragEnterEventEP15QDragEnterEvent@Base 4:15.12 - _ZN11MessageList6Widget19deletePersistentSetEl@Base 4:15.12 - _ZN11MessageList6Widget19fillMessageTagComboEv@Base 4:15.12 - _ZN11MessageList6Widget19viewMessageSelectedEPNS_4Core11MessageItemE@Base 4:15.12 - _ZN11MessageList6Widget20focusNextMessageItemENS_4Core17MessageTypeFilterEbb@Base 4:15.12 - _ZN11MessageList6Widget20setAllGroupsExpandedEb@Base 4:15.12 - _ZN11MessageList6Widget20viewMessageActivatedEPNS_4Core11MessageItemE@Base 4:15.12 - _ZN11MessageList6Widget20viewSelectionChangedEv@Base 4:15.12 - _ZN11MessageList6Widget20viewStartDragRequestEv@Base 4:15.12 - _ZN11MessageList6Widget21selectLastMessageItemENS_4Core17MessageTypeFilterEb@Base 4:15.12 - _ZN11MessageList6Widget21selectNextMessageItemENS_4Core17MessageTypeFilterENS1_26ExistingSelectionBehaviourEbb@Base 4:15.12 - _ZN11MessageList6Widget21setAllThreadsExpandedEb@Base 4:15.12 - _ZN11MessageList6Widget22selectFirstMessageItemENS_4Core17MessageTypeFilterEb@Base 4:15.12 - _ZN11MessageList6Widget24focusPreviousMessageItemENS_4Core17MessageTypeFilterEbb@Base 4:15.12 - _ZN11MessageList6Widget24selectFocusedMessageItemEb@Base 4:15.12 - _ZN11MessageList6Widget24setCurrentThreadExpandedEb@Base 4:15.12 - _ZN11MessageList6Widget25itemListFromPersistentSetEl@Base 4:15.12 - _ZN11MessageList6Widget25selectPreviousMessageItemENS_4Core17MessageTypeFilterENS1_26ExistingSelectionBehaviourEbb@Base 4:15.12 - _ZN11MessageList6Widget26messageStatusChangeRequestERKN7Akonadi4ItemERKNS1_13MessageStatusES7_@Base 4:15.12 - _ZN11MessageList6Widget26setQuickSearchClickMessageERK7QString@Base 4:15.12 - _ZN11MessageList6Widget30viewMessageStatusChangeRequestEPNS_4Core11MessageItemEN7Akonadi13MessageStatusES5_@Base 4:15.12 - _ZN11MessageList6Widget34markMessageItemsAsAboutToBeRemovedElb@Base 4:15.12 - _ZN11MessageList6Widget34viewGroupHeaderContextPopupRequestEPNS_4Core15GroupHeaderItemERK6QPoint@Base 4:15.12 - _ZN11MessageList6Widget34viewMessageListContextPopupRequestERK5QListIPNS_4Core11MessageItemEERK6QPoint@Base 4:15.12 - _ZN11MessageList6Widget9selectAllEv@Base 4:15.12 - _ZN11MessageList6WidgetC1EP7QWidget@Base 4:15.12 - _ZN11MessageList6WidgetC2EP7QWidget@Base 4:15.12 - _ZN11MessageList6WidgetD0Ev@Base 4:15.12 - _ZN11MessageList6WidgetD1Ev@Base 4:15.12 - _ZN11MessageList6WidgetD2Ev@Base 4:15.12 - (optional=templinst)_ZN12KConfigGroup10writeEntryIiEEvPKcRKT_6QFlagsIN11KConfigBase15WriteConfigFlagEE@Base 4:15.12 - _ZNK11MessageList12StorageModel10itemForRowEi@Base 4:15.12 - _ZNK11MessageList12StorageModel10metaObjectEv@Base 4:15.12 - _ZNK11MessageList12StorageModel11columnCountERK11QModelIndex@Base 4:15.12 - _ZNK11MessageList12StorageModel13messageForRowEi@Base 4:15.12 - _ZNK11MessageList12StorageModel16isOutBoundFolderERKN7Akonadi10CollectionE@Base 4:15.12 - _ZNK11MessageList12StorageModel20displayedCollectionsEv@Base 4:15.12 - _ZNK11MessageList12StorageModel21initializeMessageItemEPNS_4Core11MessageItemEib@Base 4:15.12 - _ZNK11MessageList12StorageModel21updateMessageItemDataEPNS_4Core11MessageItemEi@Base 4:15.12 - _ZNK11MessageList12StorageModel22parentCollectionForRowEi@Base 4:15.12 - _ZNK11MessageList12StorageModel24containsOutboundMessagesEv@Base 4:15.12 - _ZNK11MessageList12StorageModel26initialUnreadRowCountGuessEv@Base 4:15.12 - _ZNK11MessageList12StorageModel28fillMessageItemThreadingDataEPNS_4Core11MessageItemEiNS1_12StorageModel19ThreadingDataSubsetE@Base 4:15.12 - _ZNK11MessageList12StorageModel2idEv@Base 4:15.12 - _ZNK11MessageList12StorageModel4dataERK11QModelIndexi@Base 4:15.12 - _ZNK11MessageList12StorageModel5indexEiiRK11QModelIndex@Base 4:15.12 - _ZNK11MessageList12StorageModel6parentERK11QModelIndex@Base 4:15.12 - _ZNK11MessageList12StorageModel8mimeDataERK5QListIPNS_4Core11MessageItemEE@Base 4:15.12 - _ZNK11MessageList12StorageModel8rowCountERK11QModelIndex@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem10annotationEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem11akonadiItemEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem12messageIdMD5Ev@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem13hasAnnotationEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem14inReplyToIdMD5Ev@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem14signatureStateEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem15backgroundColorEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem15encryptionStateEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem15referencesIdMD5Ev@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem15threadingStatusEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem16aboutToBeRemovedEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem17subjectIsPrefixedEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem18strippedSubjectMD5Ev@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem18tagListDescriptionEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem3Tag15backgroundColorEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem3Tag2idEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem3Tag4fontEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem3Tag4nameEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem3Tag6pixmapEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem3Tag8priorityEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem3Tag9textColorEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem4fontEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem7findTagERK7QString@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem7tagListEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem8uniqueIdEv@Base 4:15.12 - _ZNK11MessageList4Core11MessageItem9textColorEv@Base 4:15.12 - _ZNK11MessageList4Core15QuickSearchLine10metaObjectEv@Base 4:15.12 - _ZNK11MessageList4Core15QuickSearchLine10searchEditEv@Base 4:15.12 - _ZNK11MessageList4Core15QuickSearchLine13searchOptionsEv@Base 4:15.12 - _ZNK11MessageList4Core15QuickSearchLine17tagFilterComboBoxEv@Base 4:15.12 - _ZNK11MessageList4Core15QuickSearchLine24containsOutboundMessagesEv@Base 4:15.12 - _ZNK11MessageList4Core15QuickSearchLine6statusEv@Base 4:15.12 - _ZNK11MessageList4Core16SearchLineStatus10metaObjectEv@Base 4:16.04.0 - _ZNK11MessageList4Core16SearchLineStatus13searchOptionsEv@Base 4:16.04.0 - _ZNK11MessageList4Core16SearchLineStatus24containsOutboundMessagesEv@Base 4:16.04.0 - _ZNK11MessageList4Core16SearchLineStatus6lockedEv@Base 4:16.04.0 - _ZNK11MessageList4Core18QuickSearchWarning10metaObjectEv@Base 4:15.12 - _ZNK11MessageList4Core4Item10childItemsEv@Base 4:15.12 - _ZNK11MessageList4Core4Item10isViewableEv@Base 4:15.12 - _ZNK11MessageList4Core4Item11hasAncestorEPKS1_@Base 4:15.12 - _ZNK11MessageList4Core4Item11hasChildrenEv@Base 4:15.12 - _ZNK11MessageList4Core4Item11useReceiverEv@Base 4:15.12 - _ZNK11MessageList4Core4Item13formattedDateEv@Base 4:15.12 - _ZNK11MessageList4Core4Item13formattedSizeEv@Base 4:15.12 - _ZNK11MessageList4Core4Item14childItemCountEv@Base 4:15.12 - _ZNK11MessageList4Core4Item14childItemStatsERNS1_14ChildItemStatsE@Base 4:15.12 - _ZNK11MessageList4Core4Item14firstChildItemEv@Base 4:15.12 - _ZNK11MessageList4Core4Item16formattedMaxDateEv@Base 4:15.12 - _ZNK11MessageList4Core4Item16indexOfChildItemEPS1_@Base 4:15.12 - _ZNK11MessageList4Core4Item16senderOrReceiverEv@Base 4:15.12 - _ZNK11MessageList4Core4Item17statusDescriptionEv@Base 4:15.12 - _ZNK11MessageList4Core4Item18parentCollectionIdEv@Base 4:15.12 - _ZNK11MessageList4Core4Item19initialExpandStatusEv@Base 4:15.12 - _ZNK11MessageList4Core4Item4dateEv@Base 4:15.12 - _ZNK11MessageList4Core4Item4sizeEv@Base 4:15.12 - _ZNK11MessageList4Core4Item4typeEv@Base 4:15.12 - _ZNK11MessageList4Core4Item6itemIdEv@Base 4:15.12 - _ZNK11MessageList4Core4Item6parentEv@Base 4:15.12 - _ZNK11MessageList4Core4Item6senderEv@Base 4:15.12 - _ZNK11MessageList4Core4Item6statusEv@Base 4:15.12 - _ZNK11MessageList4Core4Item7maxDateEv@Base 4:15.12 - _ZNK11MessageList4Core4Item7subjectEv@Base 4:15.12 - _ZNK11MessageList4Core4Item8receiverEv@Base 4:15.12 - _ZNK11MessageList4Core4Item9childItemEi@Base 4:15.12 - _ZNK11MessageList4Pane10isThreadedEv@Base 4:15.12 - _ZNK11MessageList4Pane10metaObjectEv@Base 4:15.12 - _ZNK11MessageList4Pane11currentItemEv@Base 4:15.12 - _ZNK11MessageList4Pane14currentMessageEv@Base 4:15.12 - _ZNK11MessageList4Pane14currentOptionsEv@Base 4:15.12 - _ZNK11MessageList4Pane14selectionEmptyEv@Base 4:15.12 - _ZNK11MessageList4Pane17getSelectionStatsER7QVectorIN7Akonadi4ItemEES5_Pbb@Base 4:15.12 - _ZNK11MessageList4Pane18searchEditHasFocusEv@Base 4:15.12 - _ZNK11MessageList4Pane19currentFilterStatusEv@Base 4:15.12 - _ZNK11MessageList4Pane22selectionAsMessageListEb@Base 4:15.12 - _ZNK11MessageList4Pane24selectionAsListMessageIdEb@Base 4:15.12 - _ZNK11MessageList4Pane24selectionAsPersistentSetEb@Base 4:15.12 - _ZNK11MessageList4Pane25currentFilterSearchStringEv@Base 4:15.12 - _ZNK11MessageList4Pane26currentThreadAsMessageListEv@Base 4:15.12 - _ZNK11MessageList4Pane26selectionAsMessageItemListEb@Base 4:15.12 - _ZNK11MessageList4Pane28currentThreadAsPersistentSetEv@Base 4:15.12 - _ZNK11MessageList4Pane28selectionAsMessageItemListIdEb@Base 4:15.12 - _ZNK11MessageList5Utils13ThemeComboBox10metaObjectEv@Base 4:15.12 - _ZNK11MessageList5Utils13ThemeComboBox12currentThemeEv@Base 4:15.12 - _ZNK11MessageList5Utils13ThemeComboBox18writeDefaultConfigEv@Base 4:15.12 - _ZNK11MessageList5Utils13ThemeComboBox23writeStorageModelConfigEPNS_4Core12StorageModelEb@Base 4:15.12 - _ZNK11MessageList5Utils13ThemeComboBox23writeStorageModelConfigERK7QStringb@Base 4:15.12 - _ZNK11MessageList5Utils13ThemeComboBox23writeStorageModelConfigERKN7Akonadi10CollectionEb@Base 4:15.12 - _ZNK11MessageList5Utils17ThemeConfigButton10metaObjectEv@Base 4:15.12 - _ZNK11MessageList5Utils19AggregationComboBox10metaObjectEv@Base 4:15.12 - _ZNK11MessageList5Utils19AggregationComboBox18currentAggregationEv@Base 4:15.12 - _ZNK11MessageList5Utils19AggregationComboBox18writeDefaultConfigEv@Base 4:15.12 - _ZNK11MessageList5Utils19AggregationComboBox23writeStorageModelConfigEPNS_4Core12StorageModelEb@Base 4:15.12 - _ZNK11MessageList5Utils19AggregationComboBox23writeStorageModelConfigERK7QStringb@Base 4:15.12 - _ZNK11MessageList5Utils19AggregationComboBox23writeStorageModelConfigERKN7Akonadi10CollectionEb@Base 4:15.12 - _ZNK11MessageList5Utils23AggregationConfigButton10metaObjectEv@Base 4:15.12 - _ZNK11MessageList6Widget10isThreadedEv@Base 4:15.12 - _ZNK11MessageList6Widget10metaObjectEv@Base 4:15.12 - _ZNK11MessageList6Widget11currentItemEv@Base 4:15.12 - _ZNK11MessageList6Widget14currentMessageEv@Base 4:15.12 - _ZNK11MessageList6Widget14currentOptionsEv@Base 4:15.12 - _ZNK11MessageList6Widget14selectionEmptyEv@Base 4:15.12 - _ZNK11MessageList6Widget17currentCollectionEv@Base 4:15.12 - _ZNK11MessageList6Widget17getSelectionStatsER7QVectorIN7Akonadi4ItemEES5_Pbb@Base 4:15.12 - _ZNK11MessageList6Widget19currentFilterStatusEv@Base 4:15.12 - _ZNK11MessageList6Widget22selectionAsMessageListEb@Base 4:15.12 - _ZNK11MessageList6Widget24selectionAsListMessageIdEb@Base 4:15.12 - _ZNK11MessageList6Widget24selectionAsPersistentSetEb@Base 4:15.12 - _ZNK11MessageList6Widget25currentFilterSearchStringEv@Base 4:15.12 - _ZNK11MessageList6Widget26currentThreadAsMessageListEv@Base 4:15.12 - _ZNK11MessageList6Widget26selectionAsMessageItemListEb@Base 4:15.12 - _ZNK11MessageList6Widget28currentThreadAsPersistentSetEv@Base 4:15.12 - _ZNK11MessageList6Widget28selectionAsMessageItemListIdEb@Base 4:15.12 - (optional=templinst|arch=!armhf)_ZNK12KConfigGroup9readEntryI10QByteArrayEET_PKcRKS2_@Base 4:15.12 - (optional=templinst)_ZNK12KConfigGroup9readEntryIiEET_PKcRKS1_@Base 4:15.12 - (optional=templinst|arch=amd64)_ZNK12KConfigGroup9readEntryIyEET_PKcRKS1_@Base 4:15.12 - (optional=templinst)_ZNK7Akonadi4Item11payloadImplI14QSharedPointerIN5KMime7MessageEEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicES9_E4typeEv@Base 4:15.12 - (optional=templinst)_ZNK7Akonadi4Item14tryToCloneImplI14QSharedPointerIN5KMime7MessageEESt10shared_ptrIS4_EEENSt9enable_ifIXntsrSt7is_sameIT_T0_E5valueEbE4typeEPSA_PKi@Base 4:15.12 - (arch=!armhf)_ZTI11KIconEngine@Base 4:16.04.0 - _ZTIN11MessageList12StorageModelE@Base 4:15.12 - _ZTIN11MessageList19MessageListSettingsE@Base 4:15.12 - _ZTIN11MessageList4Core11MessageItemE@Base 4:15.12 - _ZTIN11MessageList4Core15QuickSearchLineE@Base 4:15.12 - _ZTIN11MessageList4Core16SearchLineStatusE@Base 4:16.04.0 - _ZTIN11MessageList4Core18QuickSearchWarningE@Base 4:15.12 - _ZTIN11MessageList4Core4ItemE@Base 4:15.12 - _ZTIN11MessageList4PaneE@Base 4:15.12 - _ZTIN11MessageList5Utils13ThemeComboBoxE@Base 4:15.12 - _ZTIN11MessageList5Utils17ThemeConfigButtonE@Base 4:15.12 - _ZTIN11MessageList5Utils19AggregationComboBoxE@Base 4:15.12 - _ZTIN11MessageList5Utils23AggregationConfigButtonE@Base 4:15.12 - _ZTIN11MessageList6WidgetE@Base 4:15.12 - (arch=!armhf)_ZTS11KIconEngine@Base 4:16.04.0 - _ZTSN11MessageList12StorageModelE@Base 4:15.12 - _ZTSN11MessageList19MessageListSettingsE@Base 4:15.12 - _ZTSN11MessageList4Core11MessageItemE@Base 4:15.12 - _ZTSN11MessageList4Core15QuickSearchLineE@Base 4:15.12 - _ZTSN11MessageList4Core16SearchLineStatusE@Base 4:16.04.0 - _ZTSN11MessageList4Core18QuickSearchWarningE@Base 4:15.12 - _ZTSN11MessageList4Core4ItemE@Base 4:15.12 - _ZTSN11MessageList4PaneE@Base 4:15.12 - _ZTSN11MessageList5Utils13ThemeComboBoxE@Base 4:15.12 - _ZTSN11MessageList5Utils17ThemeConfigButtonE@Base 4:15.12 - _ZTSN11MessageList5Utils19AggregationComboBoxE@Base 4:15.12 - _ZTSN11MessageList5Utils23AggregationConfigButtonE@Base 4:15.12 - _ZTSN11MessageList6WidgetE@Base 4:15.12 - (arch=!armhf)_ZTV11KIconEngine@Base 4:16.04.0 - _ZTVN11MessageList12StorageModelE@Base 4:15.12 - _ZTVN11MessageList19MessageListSettingsE@Base 4:15.12 - _ZTVN11MessageList4Core11MessageItemE@Base 4:15.12 - _ZTVN11MessageList4Core15QuickSearchLineE@Base 4:15.12 - _ZTVN11MessageList4Core16SearchLineStatusE@Base 4:16.04.0 - _ZTVN11MessageList4Core18QuickSearchWarningE@Base 4:15.12 - _ZTVN11MessageList4Core4ItemE@Base 4:15.12 - _ZTVN11MessageList4PaneE@Base 4:15.12 - _ZTVN11MessageList5Utils13ThemeComboBoxE@Base 4:15.12 - _ZTVN11MessageList5Utils17ThemeConfigButtonE@Base 4:15.12 - _ZTVN11MessageList5Utils19AggregationComboBoxE@Base 4:15.12 - _ZTVN11MessageList5Utils23AggregationConfigButtonE@Base 4:15.12 - _ZTVN11MessageList6WidgetE@Base 4:15.12 - (c++)"non-virtual thunk to MessageList::Core::MessageItem::~MessageItem()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageList::Core::QuickSearchLine::~QuickSearchLine()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageList::Core::QuickSearchWarning::~QuickSearchWarning()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageList::Core::SearchLineStatus::~SearchLineStatus()@Base" 4:16.04.0 - (c++)"non-virtual thunk to MessageList::Pane::~Pane()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageList::Utils::AggregationComboBox::~AggregationComboBox()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageList::Utils::AggregationConfigButton::~AggregationConfigButton()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageList::Utils::ThemeComboBox::~ThemeComboBox()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageList::Utils::ThemeConfigButton::~ThemeConfigButton()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageList::Widget::~Widget()@Base" 4:15.12 diff -Nru kf5-messagelib-16.04.3/debian/libkf5messagelist-dev.acc.in kf5-messagelib-16.12.3/debian/libkf5messagelist-dev.acc.in --- kf5-messagelib-16.04.3/debian/libkf5messagelist-dev.acc.in 2016-09-30 04:32:13.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messagelist-dev.acc.in 2017-05-01 19:27:51.000000000 +0000 @@ -1,4 +1,4 @@ - + @@ -18,6 +18,7 @@ -fPIC -std=c++11 + -fno-keep-inline-functions - + \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/debian/libkf5messageviewer5abi1.install kf5-messagelib-16.12.3/debian/libkf5messageviewer5abi1.install --- kf5-messagelib-16.04.3/debian/libkf5messageviewer5abi1.install 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messageviewer5abi1.install 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,2 @@ +usr/lib/*/libKF5MessageViewer.so.5.* +usr/lib/*/libKF5MessageViewer.so.5abi1 diff -Nru kf5-messagelib-16.04.3/debian/libkf5messageviewer5abi1.lintian-overrides kf5-messagelib-16.12.3/debian/libkf5messageviewer5abi1.lintian-overrides --- kf5-messagelib-16.04.3/debian/libkf5messageviewer5abi1.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messageviewer5abi1.lintian-overrides 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1 @@ +libkf5messageviewer5abi1: symbols-declares-dependency-on-other-package libkf5messageviewer-plugins diff -Nru kf5-messagelib-16.04.3/debian/libkf5messageviewer5abi1.symbols kf5-messagelib-16.12.3/debian/libkf5messageviewer5abi1.symbols --- kf5-messagelib-16.04.3/debian/libkf5messageviewer5abi1.symbols 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messageviewer5abi1.symbols 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,881 @@ +# SymbolsHelper-Confirmed: 4:16.12.2 amd64 armhf i386 +libKF5MessageViewer.so.5abi1 libkf5messageviewer5abi1 #MINVER#, libkf5messageviewer-plugins + ABI_5_1@ABI_5_1 4:16.12.2 + (arch=armhf)_ZN10QByteArray7reserveEi@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11EmptySource10htmlWriterEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11EmptySource11setHtmlModeEN14MimeTreeParser4Util8HtmlModeERK5QListIS3_E@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11EmptySource12sourceObjectEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11EmptySource13overrideCodecEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11EmptySource16messagePartThemeE14QSharedPointerIN14MimeTreeParser9Interface11MessagePartEE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11EmptySource18attachmentStrategyEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11EmptySource18setAllowDecryptionEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11EmptySource19createMessageHeaderEPN5KMime7MessageE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11EmptySource24bodyPartFormatterFactoryEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11EmptySource9cssHelperEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11EmptySourceC1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11EmptySourceC2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11EmptySourceD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11EmptySourceD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11EmptySourceD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11HeaderStyle11setPrintingEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11HeaderStyle11setTopLevelEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11HeaderStyle12setVCardNameERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11HeaderStyle13setAllowAsyncEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11HeaderStyle13setNodeHelperEPN14MimeTreeParser10NodeHelperE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11HeaderStyle14setMessagePathERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11HeaderStyle15setSourceObjectEP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11HeaderStyle16setMessageStatusEN7Akonadi13MessageStatusE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11HeaderStyle17setCollectionNameERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11HeaderStyle17setHeaderStrategyEPKNS_14HeaderStrategyE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11HeaderStyle18setReadOnlyMessageEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11HeaderStyle8setThemeERKN13GrantleeTheme5ThemeE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11HeaderStyleC1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11HeaderStyleC2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11HeaderStyleD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11HeaderStyleD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer11HeaderStyleD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer12ViewerPlugin11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer12ViewerPlugin11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer12ViewerPlugin12setIsEnabledEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer12ViewerPlugin16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer12ViewerPlugin19showConfigureDialogEP7QWidget@ABI_5_1 4:16.12.2 + _ZN13MessageViewer12ViewerPluginC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer12ViewerPluginC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer12ViewerPluginD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer12ViewerPluginD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer12ViewerPluginD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13CSSHelperBase11setBodyFontERK5QFont@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13CSSHelperBase12setPrintFontERK5QFont@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13CSSHelperBase20recalculatePGPColorsEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13CSSHelperBaseC1EPK12QPaintDevice@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13CSSHelperBaseC2EPK12QPaintDevice@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13CSSHelperBaseD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13CSSHelperBaseD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13CSSHelperBaseD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13EditorWatcher11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13EditorWatcher11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13EditorWatcher12editorExitedEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13EditorWatcher12inotifyEventEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13EditorWatcher13checkEditDoneEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13EditorWatcher16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13EditorWatcher5startEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13EditorWatcher8editDoneEPS0_@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13EditorWatcherC1ERK4QUrlRK7QStringNS0_14OpenWithOptionEP7QObjectP7QWidget@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13EditorWatcherC2ERK4QUrlRK7QStringNS0_14OpenWithOptionEP7QObjectP7QWidget@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13EditorWatcherD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13EditorWatcherD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13EditorWatcherD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer13IconNameCache8instanceEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer14HeaderStrategy10stringListEPKPKci@ABI_5_1 4:16.12.2 + _ZN13MessageViewer14HeaderStrategyC1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer14HeaderStrategyC2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer14HeaderStrategyD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer14HeaderStrategyD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer14HeaderStrategyD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer15ConfigureWidget10readConfigEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer15ConfigureWidget11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer15ConfigureWidget11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer15ConfigureWidget11writeConfigEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer15ConfigureWidget15settingsChangedEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer15ConfigureWidget16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer15ConfigureWidget24readCurrentOverrideCodecEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer15ConfigureWidgetC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN13MessageViewer15ConfigureWidgetC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN13MessageViewer15ConfigureWidgetD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer15ConfigureWidgetD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer15ConfigureWidgetD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer15HeaderStyleUtil13addMailActionER5QHashI7QString8QVariantE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer15HeaderStyleUtilC1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer15HeaderStyleUtilC2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16PlainHeaderStyleC1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16PlainHeaderStyleC2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16PlainHeaderStyleD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16PlainHeaderStyleD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16PlainHeaderStyleD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16PrintingSettings11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16PrintingSettings11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16PrintingSettings16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16PrintingSettings22doResetToDefaultsOtherEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16PrintingSettings24doLoadFromGlobalSettingsEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16PrintingSettings4saveEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16PrintingSettings7changedEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16PrintingSettingsC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16PrintingSettingsC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16PrintingSettingsD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16PrintingSettingsD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16PrintingSettingsD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16ScamExpandUrlJob11expandedUrlERK4QUrl@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16ScamExpandUrlJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16ScamExpandUrlJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16ScamExpandUrlJob11urlExpandedERK7QStringS3_@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16ScamExpandUrlJob14expandUrlErrorEN13QNetworkReply12NetworkErrorE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16ScamExpandUrlJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16ScamExpandUrlJob18slotExpandFinishedEP13QNetworkReply@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16ScamExpandUrlJob9slotErrorEN13QNetworkReply12NetworkErrorE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16ScamExpandUrlJobC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16ScamExpandUrlJobC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16ScamExpandUrlJobD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16ScamExpandUrlJobD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer16ScamExpandUrlJobD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17HeaderStylePlugin11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17HeaderStylePlugin11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17HeaderStylePlugin12setIsEnabledEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17HeaderStylePlugin16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17HeaderStylePlugin19showConfigureDialogEP7QWidget@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17HeaderStylePluginC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17HeaderStylePluginC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17HeaderStylePluginD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17HeaderStylePluginD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17HeaderStylePluginD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEnginePage10initializeEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEnginePage11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEnginePage11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEnginePage16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEnginePage25setPrintElementBackgroundEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEnginePage30slotFeaturePermissionRequestedERK4QUrlN14QWebEnginePage7FeatureE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEnginePageC1EP17QWebEngineProfileP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEnginePageC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEnginePageC2EP17QWebEngineProfileP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEnginePageC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEnginePageD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEnginePageD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEnginePageD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView10scrollDownEi@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView11resizeEventEP12QResizeEvent@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView12scrollPageUpEi@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView14hideAccessKeysEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView14markAttachmentERK7QStringS3_@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView14scrollPageDownEi@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView14scrollToAnchorERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView14setLinkHoveredERK4QUrl@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView14showAccessKeysEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView15slotShowDetailsEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView15slotZoomChangedEd@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView16contextMenuEventEP17QContextMenuEvent@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView16slotLoadFinishedEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView16wheelZoomChangedEi@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView17forwardWheelEventEP11QWheelEvent@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView17initializeScriptsEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView17injectAttachmentsERKN5boost8functionIF7QStringvEEE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView17messageMayBeAScamEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView18isScrolledToBottomEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView18slotWebHitFinishedERKN15WebEngineViewer16WebHitTestResultE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView20forwardKeyPressEventEP9QKeyEvent@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView20handleScrollToAnchorERK8QVariant@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView21forwardMouseMoveEventEP11QMouseEvent@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView21runJavaScriptInWordIdERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView21setElementByIdVisibleERK7QStringb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView21toggleFullAddressListERK7QStringRKN5boost8functionIFS1_vEEE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView22formSubmittedForbiddenEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView22forwardKeyReleaseEventEP9QKeyEvent@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView22forwardMousePressEventEP11QMouseEvent@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView22pageIsScrolledToBottomEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView23removeAttachmentMarkingERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView23setAllowExternalContentEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView24forwardMouseReleaseEventEP11QMouseEvent@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView24handleIsScrolledToBottomERK8QVariant@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView24scrollToRelativePositionEd@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView25setPrintElementBackgroundEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView29saveMainFrameScreenshotInFileERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView31executeHideShowCcAddressScriptsEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView31executeHideShowToAddressScriptsEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView33executeHideShowAttachmentsScriptsEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView7openUrlERK4QUrl@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView8scrollUpEi@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView9popupMenuERKN15WebEngineViewer16WebHitTestResultE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView9scamCheckEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView9selectAllEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineView9setViewerEPNS_13ViewerPrivateE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineViewC1EP17KActionCollectionP7QWidget@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineViewC2EP17KActionCollectionP7QWidget@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineViewD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineViewD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17MailWebEngineViewD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17ScamCheckShortUrl10isShortUrlERK4QUrl@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17ScamCheckShortUrl11expandedUrlERK4QUrl@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17ScamCheckShortUrl11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17ScamCheckShortUrl11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17ScamCheckShortUrl16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17ScamCheckShortUrl18sSupportedServicesE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17ScamCheckShortUrl19loadLongUrlServicesEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17ScamCheckShortUrlC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17ScamCheckShortUrlC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17ScamCheckShortUrlD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17ScamCheckShortUrlD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer17ScamCheckShortUrlD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18InvitationSettings11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18InvitationSettings11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18InvitationSettings16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18InvitationSettings22doResetToDefaultsOtherEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18InvitationSettings24doLoadFromGlobalSettingsEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18InvitationSettings28slotLegacyBodyInvitesToggledEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18InvitationSettings4saveEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18InvitationSettings7changedEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18InvitationSettingsC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18InvitationSettingsC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18InvitationSettingsD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18InvitationSettingsD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18InvitationSettingsD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18RichHeaderStrategyC1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18RichHeaderStrategyC2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18RichHeaderStrategyD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18RichHeaderStrategyD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer18RichHeaderStrategyD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19GrantleeHeaderStyle17setShowMailActionEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19GrantleeHeaderStyleC1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19GrantleeHeaderStyleC2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19GrantleeHeaderStyleD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19GrantleeHeaderStyleD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19GrantleeHeaderStyleD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19MailWebEngineScript16replaceInnerHtmlERK7QStringS3_@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19MailWebEngineScript17injectAttachmentsERK7QStringS3_@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19MailWebEngineScript23manageShowHideCcAddressEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19MailWebEngineScript23manageShowHideToAddressEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19MailWebEngineScript25manageShowHideAttachmentsEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19MailWebEngineScript27createShowHideAddressScriptERK7QStringb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19ViewerPluginManager11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19ViewerPluginManager11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19ViewerPluginManager13setPluginNameERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19ViewerPluginManager16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19ViewerPluginManager18setServiceTypeNameERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19ViewerPluginManager20initializePluginListEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19ViewerPluginManager20pluginFromIdentifierERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19ViewerPluginManager4selfEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19ViewerPluginManagerC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19ViewerPluginManagerC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19ViewerPluginManagerD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19ViewerPluginManagerD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer19ViewerPluginManagerD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer20HeaderStyleInterface11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer20HeaderStyleInterface11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer20HeaderStyleInterface12styleChangedEPNS_17HeaderStylePluginE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer20HeaderStyleInterface12styleUpdatedEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer20HeaderStyleInterface15addActionToMenuEP11KActionMenuP12QActionGroup@ABI_5_1 4:16.12.2 + _ZN13MessageViewer20HeaderStyleInterface16slotStyleChangedEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer20HeaderStyleInterface16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer20HeaderStyleInterface17addHelpTextActionEP7QActionRK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer20HeaderStyleInterfaceC1EPNS_17HeaderStylePluginEP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer20HeaderStyleInterfaceC2EPNS_17HeaderStylePluginEP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer20HeaderStyleInterfaceD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer20HeaderStyleInterfaceD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer20HeaderStyleInterfaceD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21MessageViewerSettings11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21MessageViewerSettings11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21MessageViewerSettings11requestSyncEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21MessageViewerSettings11slotSyncNowEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21MessageViewerSettings16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21MessageViewerSettings4selfEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21MessageViewerSettings5mSelfE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21MessageViewerSettingsC1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21MessageViewerSettingsC2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21MessageViewerSettingsD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21MessageViewerSettingsD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21MessageViewerSettingsD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterface10setMessageERK14QSharedPointerIN5KMime7MessageEE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterface10showWidgetEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterface11closePluginEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterface11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterface11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterface12updateActionERKN7Akonadi4ItemE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterface14activatePluginEPS0_@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterface14setMessageItemERKN7Akonadi4ItemE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterface16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterface17addHelpTextActionEP7QActionRK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterface18slotActivatePluginEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterface6setUrlERK4QUrl@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterface7executeEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterface7setTextERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterfaceC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterfaceC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterfaceD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterfaceD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer21ViewerPluginInterfaceD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22HeaderStyleMenuManager10readConfigEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22HeaderStyleMenuManager11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22HeaderStyleMenuManager11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22HeaderStyleMenuManager12styleChangedEPNS_17HeaderStylePluginE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22HeaderStyleMenuManager12styleUpdatedEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22HeaderStyleMenuManager13setPluginNameERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22HeaderStyleMenuManager16slotStyleChangedEPNS_17HeaderStylePluginE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22HeaderStyleMenuManager16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22HeaderStyleMenuManagerC1EP17KActionCollectionP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22HeaderStyleMenuManagerC2EP17KActionCollectionP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22HeaderStyleMenuManagerD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22HeaderStyleMenuManagerD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22HeaderStyleMenuManagerD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22MarkMessageReadHandler11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22MarkMessageReadHandler11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22MarkMessageReadHandler16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22MarkMessageReadHandler7setItemERKN7Akonadi4ItemE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22MarkMessageReadHandlerC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22MarkMessageReadHandlerC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22MarkMessageReadHandlerD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22MarkMessageReadHandlerD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22MarkMessageReadHandlerD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22ScamDetectionWebEngine11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22ScamDetectionWebEngine11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22ScamDetectionWebEngine11showDetailsEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22ScamDetectionWebEngine14handleScanPageERK8QVariant@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22ScamDetectionWebEngine16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22ScamDetectionWebEngine17messageMayBeAScamEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22ScamDetectionWebEngine19resultScanDetectionEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22ScamDetectionWebEngine8scanPageEP14QWebEnginePage@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22ScamDetectionWebEngineC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22ScamDetectionWebEngineC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22ScamDetectionWebEngineD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22ScamDetectionWebEngineD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer22ScamDetectionWebEngineD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23GrantleeHeaderFormatterC1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23GrantleeHeaderFormatterC2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23GrantleeHeaderFormatterD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23GrantleeHeaderFormatterD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23GrantleeHeaderTestStyle15setAbsolutePathERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23GrantleeHeaderTestStyle15setMainFilenameERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23GrantleeHeaderTestStyle22setExtraDisplayHeadersERK11QStringList@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23GrantleeHeaderTestStyleC1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23GrantleeHeaderTestStyleC2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23GrantleeHeaderTestStyleD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23GrantleeHeaderTestStyleD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23GrantleeHeaderTestStyleD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23ViewerPluginToolManager10createViewEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23ViewerPluginToolManager11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23ViewerPluginToolManager11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23ViewerPluginToolManager13closeAllToolsEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23ViewerPluginToolManager13setPluginNameERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23ViewerPluginToolManager13updateActionsERKN7Akonadi4ItemE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23ViewerPluginToolManager14activatePluginEPNS_21ViewerPluginInterfaceE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23ViewerPluginToolManager16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23ViewerPluginToolManager18setServiceTypeNameERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23ViewerPluginToolManager19setActionCollectionEP17KActionCollection@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23ViewerPluginToolManager20initializePluginListEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23ViewerPluginToolManagerC1EP7QWidgetP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23ViewerPluginToolManagerC2EP7QWidgetP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23ViewerPluginToolManagerD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23ViewerPluginToolManagerD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer23ViewerPluginToolManagerD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24BodyPartFormatterFactory11loadPluginsEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24BodyPartFormatterFactoryC1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24BodyPartFormatterFactoryC2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24BodyPartFormatterFactoryD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24BodyPartFormatterFactoryD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24BodyPartFormatterFactoryD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24HeaderStylePluginManager11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24HeaderStylePluginManager11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24HeaderStylePluginManager16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24HeaderStylePluginManager20pluginFromIdentifierERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24HeaderStylePluginManager4selfEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24HeaderStylePluginManagerC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24HeaderStylePluginManagerC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24HeaderStylePluginManagerD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24HeaderStylePluginManagerD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24HeaderStylePluginManagerD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24ScamCheckShortUrlManager11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24ScamCheckShortUrlManager11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24ScamCheckShortUrlManager16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24ScamCheckShortUrlManager4selfEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24ScamCheckShortUrlManagerC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24ScamCheckShortUrlManagerC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24ScamCheckShortUrlManagerD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24ScamCheckShortUrlManagerD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer24ScamCheckShortUrlManagerD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer25MessageViewerSettingsBase4selfEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer25MessageViewerSettingsBaseC1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer25MessageViewerSettingsBaseC2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer25MessageViewerSettingsBaseD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer25MessageViewerSettingsBaseD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer25MessageViewerSettingsBaseD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26MessagePartRendererManager10loadByNameERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26MessagePartRendererManager11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26MessagePartRendererManager11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26MessagePartRendererManager13createContextEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26MessagePartRendererManager16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26MessagePartRendererManager18initializeRendererEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26MessagePartRendererManager4selfEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26MessagePartRendererManagerC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26MessagePartRendererManagerC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26MessagePartRendererManagerD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26MessagePartRendererManagerD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26MessagePartRendererManagerD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidget11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidget11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidget11showDetailsEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidget14addToWhiteListEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidget15slotShowDetailsERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidget15slotShowWarningEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidget16setUseInTestAppsEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidget16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidget17messageIsNotAScamEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidget18moveMessageToTrashEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidget18slotAddToWhiteListEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidget21slotMessageIsNotAScamEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidget24slotDisableScamDetectionEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidgetC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidgetC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidgetD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidgetD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26ScamDetectionWarningWidgetD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26SubmittedFormWarningWidget11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26SubmittedFormWarningWidget11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26SubmittedFormWarningWidget15slotShowWarningEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26SubmittedFormWarningWidget16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26SubmittedFormWarningWidgetC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26SubmittedFormWarningWidgetC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26SubmittedFormWarningWidgetD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26SubmittedFormWarningWidgetD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer26SubmittedFormWarningWidgetD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer29MessageDisplayFormatAttribute11deserializeERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN13MessageViewer29MessageDisplayFormatAttribute16setMessageFormatENS_6Viewer20DisplayFormatMessageE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer29MessageDisplayFormatAttribute16setRemoteContentEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer29MessageDisplayFormatAttributeC1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer29MessageDisplayFormatAttributeC2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer29MessageDisplayFormatAttributeD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer29MessageDisplayFormatAttributeD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer29MessageDisplayFormatAttributeD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer4Util14checkOverwriteERK4QUrlP7QWidget@ABI_5_1 4:16.12.2 + _ZN13MessageViewer4Util15createAppActionERK28QExplicitlySharedDataPointerI8KServiceEbP12QActionGroupP7QObject@ABI_5_1 4:16.12.2 + _ZN13MessageViewer4Util15saveAttachmentsERK7QVectorIPN5KMime7ContentEEP7QWidgetR4QUrl@ABI_5_1 4:16.12.2 + _ZN13MessageViewer4Util17saveMessageInMboxERK7QVectorIN7Akonadi4ItemEEP7QWidgetb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer4Util18iconPathForContentEPN5KMime7ContentEi@ABI_5_1 4:16.12.2 + _ZN13MessageViewer4Util19iconPathForMimetypeERK7QStringiS3_S3_@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace10UnCompressEPciii@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace3GenEPc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace4SameEPcii@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace6BigAddEh@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace6BigDivEhPh@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace6BigMulEh@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace6BigPopEPK4prob@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace7BigPushEP4prob@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace7BigReadEPc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace7CompAllEPc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace7GenFaceEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace7RevPushEPK4prob@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace7toImageERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace8AllBlackEPcii@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace8AllWhiteEPcii@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace8BigClearEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace8BigWriteEPc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace8CompressEPciii@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace8PopGreysEPcii@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace8ReadFaceEPc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace9PushGreysEPcii@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace9UnCompAllEPc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace9UnGenFaceEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace9WriteFaceEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFace9fromImageERK6QImage@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFaceC1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFaceC2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFaceD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFaceD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6KXFaceD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer10closeEventEP11QCloseEvent@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer10initializeEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer10mainWindowEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer10readConfigEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer10setMessageERK14QSharedPointerIN5KMime7MessageEEN14MimeTreeParser10UpdateModeE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer10showReaderEPN5KMime7ContentEbRK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer10slotZoomInEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer10urlClickedERKN7Akonadi4ItemERK4QUrl@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer11changeEventEP6QEvent@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer11itemRemovedEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer11resizeEventEP12QResizeEvent@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer11setPrintingEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer11showMessageERK14QSharedPointerIN5KMime7MessageEERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer11slotZoomOutEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer11writeConfigEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer12printMessageERKN7Akonadi4ItemE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer12printPreviewEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer12slotJumpDownEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer12slotScrollUpEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer13deleteMessageERKN7Akonadi4ItemE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer13deleteMessageEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer13runJavaScriptERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer13setPluginNameERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer13setZoomFactorEd@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer13slotZoomResetEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer14createFetchJobERKN7Akonadi4ItemE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer14replyMessageToERK14QSharedPointerIN5KMime7MessageEEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer14setMessageItemERKN7Akonadi4ItemEN14MimeTreeParser10UpdateModeE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer14setMessagePartEPN5KMime7ContentE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer14setMessagePathERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer14slotScrollDownEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer14slotScrollNextEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer15setUseFixedFontEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer15slotSaveMessageEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer15slotScrollPriorEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer16displayPopupMenuERKN7Akonadi4ItemERKN15WebEngineViewer16WebHitTestResultERK6QPoint@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer16printingFinishedEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer17displaySplashPageERK7QStringRK5QHashIS1_8QVariantERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer17executeMailActionENS0_10MailActionE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer17requestConfigSyncEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer18makeResourceOnlineENS0_18ResourceOnlineModeE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer18moveMessageToTrashEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer19printPreviewMessageERKN7Akonadi4ItemE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer19setOverrideEncodingERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer20enableMessageDisplayEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer20showStatusBarMessageERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer20slotAttachmentSaveAsEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer21setAttachmentStrategyEPKN14MimeTreeParser18AttachmentStrategyE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer21slotAttachmentSaveAllEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer21slotChangeDisplayMailENS0_20DisplayFormatMessageEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer21slotShowMessageSourceEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer22pageIsScrolledToBottomEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer22setHtmlLoadExtOverrideEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer22viewerPluginActionListE6QFlagsINS_21ViewerPluginInterface19SpecificFeatureTypeEE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer23addMessageLoadedHandlerEPNS_28AbstractMessageLoadedHandlerE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer24copySelectionToClipboardEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer25setPrintElementBackgroundEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer26removeMessageLoadedHandlerEPNS_28AbstractMessageLoadedHandlerE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer26setDecryptMessageOverwriteEb@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer29saveMainFrameScreenshotInFileERK7QString@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer30replaceMsgByUnencryptedVersionEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer30showOpenAttachmentFolderWidgetERK4QUrl@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer32setDisplayFormatMessageOverwriteENS0_20DisplayFormatMessageE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer5clearEN14MimeTreeParser10UpdateModeE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer5eventEP6QEvent@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer5printEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer6updateEN14MimeTreeParser10UpdateModeE@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer8atBottomEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer8slotFindEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer9popupMenuERKN7Akonadi4ItemERK4QUrlS7_RK6QPoint@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6Viewer9selectAllEv@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6ViewerC1EP7QWidgetS2_P17KActionCollection@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6ViewerC2EP7QWidgetS2_P17KActionCollection@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6ViewerD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6ViewerD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer6ViewerD2Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer9CSSHelperC1EPK12QPaintDevice@ABI_5_1 4:16.12.2 + _ZN13MessageViewer9CSSHelperC2EPK12QPaintDevice@ABI_5_1 4:16.12.2 + _ZN13MessageViewer9CSSHelperD0Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer9CSSHelperD1Ev@ABI_5_1 4:16.12.2 + _ZN13MessageViewer9CSSHelperD2Ev@ABI_5_1 4:16.12.2 + (optional=templinst|arch=!armhf)_ZN5KMime7Content6headerINS_7Headers7SubjectEEEPT_b@ABI_5_1 4:16.12.2 + (optional=templinst)_ZN7Akonadi4Item14setPayloadImplI14QSharedPointerIN5KMime7MessageEEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicEvE4typeERKS9_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK12KConfigGroup9readEntryI10QByteArrayEET_PKcRKS2_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK12KConfigGroup9readEntryI5QFontEET_PKcRKS2_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK12KConfigGroup9readEntryI5QSizeEET_PKcRKS2_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK12KConfigGroup9readEntryI6QColorEET_PKcRKS2_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK12KConfigGroup9readEntryIbEET_PKcRKS1_@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK12KConfigGroup9readEntryIiEET_PKcRKS1_@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11EmptySource10isPrintingEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11EmptySource10levelQuoteEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11EmptySource13preferredModeEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11EmptySource13showEmoticonsEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11EmptySource14autoImportKeysEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11EmptySource14decryptMessageEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11EmptySource16htmlLoadExternalEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11EmptySource20showExpandQuotesMarkEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11EmptySource20showSignatureDetailsEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11HeaderStyle10allowAsyncEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11HeaderStyle10isPrintingEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11HeaderStyle10isTopLevelEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11HeaderStyle10nodeHelperEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11HeaderStyle11messagePathEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11HeaderStyle12sourceObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11HeaderStyle13messageStatusEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11HeaderStyle14collectionNameEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11HeaderStyle14headerStrategyEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11HeaderStyle15readOnlyMessageEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11HeaderStyle22hasAttachmentQuickListEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11HeaderStyle5themeEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer11HeaderStyle9vCardNameEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer12ViewerPlugin10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer12ViewerPlugin18hasConfigureDialogEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer12ViewerPlugin9isEnabledEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13CSSHelperBase10quoteColorEi@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13CSSHelperBase12pgpWarnColorEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13CSSHelperBase12quoteFontTagEi@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13CSSHelperBase14cssDefinitionsEb@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13CSSHelperBase14quoteColorNameEi@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13CSSHelperBase16addEndBlockQuoteEi@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13CSSHelperBase16nonQuotedFontTagEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13CSSHelperBase18addStartBlockQuoteEi@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13CSSHelperBase18quoteCssDefinitionEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13CSSHelperBase19printCssDefinitionsEb@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13CSSHelperBase20commonCssDefinitionsEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13CSSHelperBase20screenCssDefinitionsEPKS0_b@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13CSSHelperBase8bodyFontEbb@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13CSSHelperBase8fontSizeEbb@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13CSSHelperBase8htmlHeadEb@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13EditorWatcher10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13EditorWatcher11fileChangedEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13EditorWatcher3urlEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13IconNameCache17iconPathFromLocalERK7QString@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13IconNameCache5EntryltERKS1_@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13IconNameCache8iconPathERK7QStringi@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer13IconNameCache8picsPathEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer14HeaderStrategy10showHeaderERK7QString@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer14HeaderStrategy13headersToHideEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer14HeaderStrategy16headersToDisplayEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer15ConfigureWidget10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer15HeaderStyleUtil10dateStringEPN5KMime7MessageEbNS0_25HeaderStyleUtilDateFormatE@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer15HeaderStyleUtil10mailActionENS_6Viewer10MailActionE@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer15HeaderStyleUtil10spamStatusEPN5KMime7MessageE@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer15HeaderStyleUtil11directionOfERK7QString@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer15HeaderStyleUtil12dateShortStrERK9QDateTime@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer15HeaderStyleUtil12imgToDataUrlERK6QImage@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer15HeaderStyleUtil12resentToListEPN5KMime7MessageE@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer15HeaderStyleUtil13drawSpamMeterENS_9SpamErrorEddRK7QStringS4_@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer15HeaderStyleUtil13subjectStringEPN5KMime7MessageE6QFlagsIN11KTextToHTML6OptionEE@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer15HeaderStyleUtil14resentFromListEPN5KMime7MessageE@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer15HeaderStyleUtil19updateXFaceSettingsE6QImageRNS0_13xfaceSettingsE@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer15HeaderStyleUtil22subjectDirectionStringEPN5KMime7MessageE@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer15HeaderStyleUtil5xfaceEPKNS_11HeaderStyleEPN5KMime7MessageE@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer15HeaderStyleUtil7dateStrERK9QDateTime@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer15HeaderStyleUtil9strToHtmlERK7QString6QFlagsIN11KTextToHTML6OptionEE@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer16PlainHeaderStyle4nameEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer16PlainHeaderStyle6formatEPN5KMime7MessageE@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer16PrintingSettings10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer16ScamExpandUrlJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer17HeaderStylePlugin10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer17HeaderStylePlugin14elidedTextSizeEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer17HeaderStylePlugin18hasConfigureDialogEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer17HeaderStylePlugin9alignmentEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer17HeaderStylePlugin9hasMarginEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer17HeaderStylePlugin9isEnabledEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer17MailWebEnginePage10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer17MailWebEngineView10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer17MailWebEngineView21interceptorUrlActionsERKN15WebEngineViewer16WebHitTestResultE@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer17ScamCheckShortUrl10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer18InvitationSettings10helpAnchorEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer18InvitationSettings10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer19GrantleeHeaderStyle14showMailActionEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer19GrantleeHeaderStyle22hasAttachmentQuickListEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer19GrantleeHeaderStyle4nameEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer19GrantleeHeaderStyle6formatEPN5KMime7MessageE@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer19ViewerPluginManager10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer19ViewerPluginManager10pluginNameEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer19ViewerPluginManager11pluginsListEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer19ViewerPluginManager15configGroupNameEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer19ViewerPluginManager15pluginsDataListEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer19ViewerPluginManager15serviceTypeNameEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer19ViewerPluginManager22configPrefixSettingKeyEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer20HeaderStyleInterface10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer20HeaderStyleInterface17headerStylePluginEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer20HeaderStyleInterface6actionEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer21MessageViewerSettings10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer21ViewerPluginInterface10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer21ViewerPluginInterface7actionsEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer22HeaderStyleMenuManager10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer22HeaderStyleMenuManager4menuEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer22MarkMessageReadHandler10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer22ScamDetectionWebEngine10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer23GrantleeHeaderFormatter6formatERK7QStringRK14QSharedPointerIN8Grantlee12TemplateImplEERK11QStringListbPKNS_11HeaderStyleEPN5KMime7MessageEb@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer23GrantleeHeaderFormatter6toHtmlERK11QStringListRK7QStringS6_PKNS_11HeaderStyleEPN5KMime7MessageEb@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer23GrantleeHeaderFormatter6toHtmlERKNS0_31GrantleeHeaderFormatterSettingsE@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer23GrantleeHeaderTestStyle22hasAttachmentQuickListEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer23GrantleeHeaderTestStyle4nameEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer23GrantleeHeaderTestStyle6formatEPN5KMime7MessageE@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer23ViewerPluginToolManager10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer23ViewerPluginToolManager10pluginNameEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer23ViewerPluginToolManager15serviceTypeNameEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer23ViewerPluginToolManager22viewerPluginActionListE6QFlagsINS_21ViewerPluginInterface19SpecificFeatureTypeEE@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer24HeaderStylePluginManager10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer24HeaderStylePluginManager11pluginsListEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer24HeaderStylePluginManager14pluginListNameEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer24HeaderStylePluginManager15configGroupNameEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer24HeaderStylePluginManager15pluginsDataListEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer24HeaderStylePluginManager22configPrefixSettingKeyEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer24ScamCheckShortUrlManager10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer24ScamCheckShortUrlManager17scamCheckShortUrlEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer26MessagePartRendererManager10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer26MessagePartRendererManager15iconCurrentSizeEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer26ScamDetectionWarningWidget10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer26SubmittedFormWarningWidget10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer29MessageDisplayFormatAttribute10serializedEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer29MessageDisplayFormatAttribute13messageFormatEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer29MessageDisplayFormatAttribute13remoteContentEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer29MessageDisplayFormatAttribute4typeEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer29MessageDisplayFormatAttribute5cloneEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer29MessageDisplayFormatAttributeeqERKS0_@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6KXFace10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer10copyActionEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer10urlClickedEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer11isFixedFontEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer11messageItemEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer11messagePathEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer12printingModeEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer12saveAsActionEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer12selectedTextEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer13copyURLActionEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer13urlOpenActionEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer15imageUrlClickedEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer15selectAllActionEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer15speakTextActionEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer16htmlLoadExternalEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer16messageTreeModelEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer16overrideEncodingEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer16viewSourceActionEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer17copyImageLocationEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer17headerStylePluginEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer18attachmentStrategyEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer19findInMessageActionEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer19htmlLoadExtOverrideEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer19mimePartTreeIsEmptyEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer19shareServiceUrlMenuEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer19toggleFixFontActionEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer21disableEmoticonActionEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer21interceptorUrlActionsERKN15WebEngineViewer16WebHitTestResultE@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer24toggleMimePartTreeActionEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer29displayFormatMessageOverwriteEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer30saveMessageDisplayFormatActionEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer31resetMessageDisplayFormatActionEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer7messageEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer8htmlMailEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer6Viewer9cssHelperEv@ABI_5_1 4:16.12.2 + _ZNK13MessageViewer9CSSHelper8htmlHeadEb@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK7Akonadi4Item10hasPayloadI14QSharedPointerIN5KMime7MessageEEEEbv@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK7Akonadi4Item11payloadImplI14QSharedPointerIN5KMime7MessageEEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicES9_E4typeEv@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK7Akonadi4Item14tryToCloneImplI14QSharedPointerIN5KMime7MessageEESt10shared_ptrIS4_EEENSt9enable_ifIXntsrSt7is_sameIT_T0_E5valueEbE4typeEPSA_PKi@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNK7Akonadi4Item7payloadI14QSharedPointerIN5KMime7MessageEEEET_v@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt15_Sp_counted_ptrIDnLN9__gnu_cxx12_Lock_policyE2EE10_M_disposeEv@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE10_M_destroyEv@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE10_M_releaseEv@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIN5GpgME6ImportESaIS1_EED1Ev@ABI_5_1 4:16.12.2 + (optional=templinst)_ZNSt6vectorIN5GpgME6ImportESaIS1_EED2Ev@ABI_5_1 4:16.12.2 + _ZTI11QSharedData@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer11EmptySourceE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer11HeaderStyleE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer12ViewerPluginE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer13CSSHelperBaseE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer13EditorWatcherE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer14HeaderStrategyE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer15ConfigureWidgetE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer16PlainHeaderStyleE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer16PrintingSettingsE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer16ScamExpandUrlJobE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer17HeaderStylePluginE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer17MailWebEnginePageE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer17MailWebEngineViewE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer17ScamCheckShortUrlE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer18InvitationSettingsE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer18RichHeaderStrategyE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer19GrantleeHeaderStyleE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer19ViewerPluginManagerE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer20HeaderStyleInterfaceE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer21MessageViewerSettingsE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer21ViewerPluginInterfaceE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer22HeaderStyleMenuManagerE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer22MarkMessageReadHandlerE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer22ScamDetectionWebEngineE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer23GrantleeHeaderTestStyleE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer23ViewerPluginToolManagerE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer24BodyPartFormatterFactoryE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer24HeaderStylePluginManagerE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer24ScamCheckShortUrlManagerE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer25MessageViewerSettingsBaseE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer26MessagePartRendererManagerE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer26ScamDetectionWarningWidgetE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer26SubmittedFormWarningWidgetE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer29MessageDisplayFormatAttributeE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer6KXFaceE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer6ViewerE@ABI_5_1 4:16.12.2 + _ZTIN13MessageViewer9CSSHelperE@ABI_5_1 4:16.12.2 + _ZTIN5boost16exception_detail10clone_baseE@ABI_5_1 4:16.12.2 + _ZTIN5boost9exceptionE@ABI_5_1 4:16.12.2 + _ZTS11QSharedData@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer11EmptySourceE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer11HeaderStyleE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer12ViewerPluginE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer13CSSHelperBaseE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer13EditorWatcherE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer14HeaderStrategyE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer15ConfigureWidgetE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer16PlainHeaderStyleE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer16PrintingSettingsE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer16ScamExpandUrlJobE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer17HeaderStylePluginE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer17MailWebEnginePageE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer17MailWebEngineViewE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer17ScamCheckShortUrlE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer18InvitationSettingsE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer18RichHeaderStrategyE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer19GrantleeHeaderStyleE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer19ViewerPluginManagerE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer20HeaderStyleInterfaceE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer21MessageViewerSettingsE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer21ViewerPluginInterfaceE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer22HeaderStyleMenuManagerE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer22MarkMessageReadHandlerE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer22ScamDetectionWebEngineE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer23GrantleeHeaderTestStyleE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer23ViewerPluginToolManagerE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer24BodyPartFormatterFactoryE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer24HeaderStylePluginManagerE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer24ScamCheckShortUrlManagerE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer25MessageViewerSettingsBaseE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer26MessagePartRendererManagerE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer26ScamDetectionWarningWidgetE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer26SubmittedFormWarningWidgetE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer29MessageDisplayFormatAttributeE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer6KXFaceE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer6ViewerE@ABI_5_1 4:16.12.2 + _ZTSN13MessageViewer9CSSHelperE@ABI_5_1 4:16.12.2 + _ZTSN5boost16exception_detail10clone_baseE@ABI_5_1 4:16.12.2 + _ZTSN5boost9exceptionE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer11EmptySourceE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer11HeaderStyleE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer12ViewerPluginE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer13CSSHelperBaseE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer13EditorWatcherE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer14HeaderStrategyE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer15ConfigureWidgetE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer16PlainHeaderStyleE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer16PrintingSettingsE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer16ScamExpandUrlJobE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer17HeaderStylePluginE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer17MailWebEnginePageE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer17MailWebEngineViewE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer17ScamCheckShortUrlE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer18InvitationSettingsE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer18RichHeaderStrategyE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer19GrantleeHeaderStyleE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer19ViewerPluginManagerE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer20HeaderStyleInterfaceE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer21MessageViewerSettingsE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer21ViewerPluginInterfaceE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer22HeaderStyleMenuManagerE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer22MarkMessageReadHandlerE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer22ScamDetectionWebEngineE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer23GrantleeHeaderTestStyleE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer23ViewerPluginToolManagerE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer24BodyPartFormatterFactoryE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer24HeaderStylePluginManagerE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer24ScamCheckShortUrlManagerE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer25MessageViewerSettingsBaseE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer26MessagePartRendererManagerE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer26ScamDetectionWarningWidgetE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer26SubmittedFormWarningWidgetE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer29MessageDisplayFormatAttributeE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer6KXFaceE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer6ViewerE@ABI_5_1 4:16.12.2 + _ZTVN13MessageViewer9CSSHelperE@ABI_5_1 4:16.12.2 + _ZTVN5boost16exception_detail10clone_baseE@ABI_5_1 4:16.12.2 + _ZTVN5boost9exceptionE@ABI_5_1 4:16.12.2 + _ZZZN11MessageCore23MessageCoreSettingsBase28setOverrideCharacterEncodingERK7QStringENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN13MessageViewer25MessageViewerSettingsBase15setMimeTreeModeEiENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN13MessageViewer25MessageViewerSettingsBase15setUseFixedFontEbENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN13MessageViewer25MessageViewerSettingsBase17setMimePaneHeightEiENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN13MessageViewer25MessageViewerSettingsBase20setMessagePaneHeightEiENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN13MessageViewer25MessageViewerSettingsBase21setAttachmentStrategyERK7QStringENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN13MessageViewer25MessageViewerSettingsBase23setScamDetectionEnabledEbENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN13MessageViewer25MessageViewerSettingsBase24setHeaderPluginStyleNameERK7QStringENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + _ZZZN13MessageViewer25MessageViewerSettingsBase25setScamDetectionWhiteListERK11QStringListENKUlvE_clEvE15qstring_literal@ABI_5_1 4:16.12.2 + (c++)"non-virtual thunk to MessageViewer::ConfigureWidget::~ConfigureWidget()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageViewer::InvitationSettings::~InvitationSettings()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageViewer::MailWebEngineView::~MailWebEngineView()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageViewer::MarkMessageReadHandler::setItem(Akonadi::Item const&)@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageViewer::MarkMessageReadHandler::~MarkMessageReadHandler()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageViewer::PrintingSettings::~PrintingSettings()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageViewer::ScamDetectionWarningWidget::~ScamDetectionWarningWidget()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageViewer::SubmittedFormWarningWidget::~SubmittedFormWarningWidget()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to MessageViewer::Viewer::~Viewer()@ABI_5_1" 4:16.12.2 diff -Nru kf5-messagelib-16.04.3/debian/libkf5messageviewer5.install kf5-messagelib-16.12.3/debian/libkf5messageviewer5.install --- kf5-messagelib-16.04.3/debian/libkf5messageviewer5.install 2016-09-30 04:32:13.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messageviewer5.install 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -usr/lib/*/libKF5MessageViewer.so.5 -usr/lib/*/libKF5MessageViewer.so.5.* diff -Nru kf5-messagelib-16.04.3/debian/libkf5messageviewer5.symbols kf5-messagelib-16.12.3/debian/libkf5messageviewer5.symbols --- kf5-messagelib-16.04.3/debian/libkf5messageviewer5.symbols 2016-09-30 04:32:13.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messageviewer5.symbols 1970-01-01 00:00:00.000000000 +0000 @@ -1,1297 +0,0 @@ -# SymbolsHelper-Confirmed: 4:16.04.3 amd64 i386 -libKF5MessageViewer.so.5 libkf5messageviewer5 #MINVER# - _ZN10QByteArray7reserveEi@Base 4:16.04.3 - _ZN13MessageViewer10NodeHelper11addTempFileERK7QString@Base 4:15.12 - _ZN13MessageViewer10NodeHelper11fixEncodingERK7QString@Base 4:15.12 - _ZN13MessageViewer10NodeHelper11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer10NodeHelper11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer10NodeHelper12cleanSubjectEPN5KMime7MessageE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper12cleanSubjectEPN5KMime7MessageERK11QStringListbRK7QString@Base 4:15.12 - _ZN13MessageViewer10NodeHelper12codecForNameERK10QByteArray@Base 4:15.12 - _ZN13MessageViewer10NodeHelper12fromAsStringEPN5KMime7ContentE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper12magicSetTypeEPN5KMime7ContentEb@Base 4:15.12 - _ZN13MessageViewer10NodeHelper12partMetaDataEPN5KMime7ContentE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper13createTempDirERK7QString@Base 4:15.12 - _ZN13MessageViewer10NodeHelper15encodingForNameERK7QString@Base 4:15.12 - _ZN13MessageViewer10NodeHelper15mergeExtraNodesEPN5KMime7ContentE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper15removeTempFilesEv@Base 4:15.12 - _ZN13MessageViewer10NodeHelper15replacePrefixesERK7QStringRK11QStringListbS3_@Base 4:15.12 - _ZN13MessageViewer10NodeHelper15setPartMetaDataEPN5KMime7ContentERKNS_12PartMetaDataE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper16setNodeProcessedEPN5KMime7ContentEb@Base 4:15.12 - _ZN13MessageViewer10NodeHelper16setOverrideCodecEPN5KMime7ContentEPK10QTextCodec@Base 4:15.12 - _ZN13MessageViewer10NodeHelper16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper17setSignatureStateEPN5KMime7ContentENS_19KMMsgSignatureStateE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper18attachExtraContentEPN5KMime7ContentES3_@Base 4:15.12 - _ZN13MessageViewer10NodeHelper18setBodyPartMementoEPN5KMime7ContentERK10QByteArrayPNS_9Interface15BodyPartMementoE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper18setEncryptionStateEPN5KMime7ContentENS_20KMMsgEncryptionStateE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper18setNodeUnprocessedEPN5KMime7ContentEb@Base 4:15.12 - _ZN13MessageViewer10NodeHelper18supportedEncodingsEb@Base 4:15.12 - _ZN13MessageViewer10NodeHelper18unencryptedMessageERK14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper19cleanFromExtraNodesEPN5KMime7ContentE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper19forceCleanTempFilesEv@Base 4:15.12 - _ZN13MessageViewer10NodeHelper19tempFileUrlFromNodeEPKN5KMime7ContentE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper19writeNodeToTempFileEPN5KMime7ContentE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper21attachmentDisplayInfoEPN5KMime7ContentE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper22setNodeDisplayedHiddenEPN5KMime7ContentEb@Base 4:15.12 - _ZN13MessageViewer10NodeHelper23isInEncapsulatedMessageEPN5KMime7ContentE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper23messageWithExtraContentEPN5KMime7ContentE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper24setNodeDisplayedEmbeddedEPN5KMime7ContentEb@Base 4:15.12 - _ZN13MessageViewer10NodeHelper25unencryptedMessage_helperEPN5KMime7ContentER10QByteArraybi@Base 4:15.12 - _ZN13MessageViewer10NodeHelper5clearEv@Base 4:15.12 - _ZN13MessageViewer10NodeHelper5codecEPN5KMime7ContentE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper6updateENS_10UpdateModeE@Base 4:16.04.0 - _ZN13MessageViewer10NodeHelper7charsetEPN5KMime7ContentE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper8fileNameEPKN5KMime7ContentE@Base 4:15.12 - _ZN13MessageViewer10NodeHelper8iconNameEPN5KMime7ContentEi@Base 4:15.12 - _ZN13MessageViewer10NodeHelperC1Ev@Base 4:15.12 - _ZN13MessageViewer10NodeHelperC2Ev@Base 4:15.12 - _ZN13MessageViewer10NodeHelperD0Ev@Base 4:15.12 - _ZN13MessageViewer10NodeHelperD1Ev@Base 4:15.12 - _ZN13MessageViewer10NodeHelperD2Ev@Base 4:15.12 - _ZN13MessageViewer11EmptySource10htmlWriterEv@Base 4:15.12 - _ZN13MessageViewer11EmptySource11setHtmlModeENS_4Util8HtmlModeE@Base 4:15.12 - _ZN13MessageViewer11EmptySource12sourceObjectEv@Base 4:15.12 - _ZN13MessageViewer11EmptySource13overrideCodecEv@Base 4:15.12 - _ZN13MessageViewer11EmptySource18attachmentStrategyEv@Base 4:15.12 - _ZN13MessageViewer11EmptySource18setAllowDecryptionEb@Base 4:15.12 - _ZN13MessageViewer11EmptySource19createMessageHeaderEPN5KMime7MessageE@Base 4:15.12 - _ZN13MessageViewer11EmptySource24bodyPartFormatterFactoryEv@Base 4:16.04.0 - _ZN13MessageViewer11EmptySource9cssHelperEv@Base 4:15.12 - _ZN13MessageViewer11EmptySourceC1Ev@Base 4:15.12 - _ZN13MessageViewer11EmptySourceC2Ev@Base 4:15.12 - _ZN13MessageViewer11EmptySourceD0Ev@Base 4:15.12 - _ZN13MessageViewer11EmptySourceD1Ev@Base 4:15.12 - _ZN13MessageViewer11EmptySourceD2Ev@Base 4:15.12 - _ZN13MessageViewer11FindBarBase10autoSearchERK7QString@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase10searchTextEbb@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase11hideFindBarEv@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase11optionsMenuEv@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase11qt_metacastEPKc@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase13setFoundMatchEb@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase14slotSearchTextEbb@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase15addToCompletionERK7QString@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase15clearSelectionsEv@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase15slotClearSearchEv@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase15updateHighLightEb@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase16staticMetaObjectE@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase17focusAndSetCursorEv@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase17updateSensitivityEb@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase22caseSensitivityChangedEb@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase23slotHighlightAllChangedEb@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase5eventEP6QEvent@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase7setTextERK7QString@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase8closeBarEv@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase8findNextEv@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBase8findPrevEv@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBaseC1EP7QWidget@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBaseC2EP7QWidget@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBaseD0Ev@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBaseD1Ev@Base 4:16.04.0 - _ZN13MessageViewer11FindBarBaseD2Ev@Base 4:16.04.0 - _ZN13MessageViewer11HeaderStyle11setPrintingEb@Base 4:15.12 - _ZN13MessageViewer11HeaderStyle11setTopLevelEb@Base 4:15.12 - _ZN13MessageViewer11HeaderStyle12setVCardNameERK7QString@Base 4:15.12 - _ZN13MessageViewer11HeaderStyle13setAllowAsyncEb@Base 4:15.12 - _ZN13MessageViewer11HeaderStyle13setNodeHelperEPNS_10NodeHelperE@Base 4:15.12 - _ZN13MessageViewer11HeaderStyle14setMessagePathERK7QString@Base 4:15.12 - _ZN13MessageViewer11HeaderStyle15setSourceObjectEP7QObject@Base 4:15.12 - _ZN13MessageViewer11HeaderStyle16setMessageStatusEN7Akonadi13MessageStatusE@Base 4:15.12 - _ZN13MessageViewer11HeaderStyle17setCollectionNameERK7QString@Base 4:16.04.0 - _ZN13MessageViewer11HeaderStyle17setHeaderStrategyEPKNS_14HeaderStrategyE@Base 4:15.12 - _ZN13MessageViewer11HeaderStyle18setReadOnlyMessageEb@Base 4:16.04.0 - _ZN13MessageViewer11HeaderStyle8setThemeERKN13GrantleeTheme5ThemeE@Base 4:15.12 - _ZN13MessageViewer11HeaderStyleC1Ev@Base 4:15.12 - _ZN13MessageViewer11HeaderStyleC2Ev@Base 4:15.12 - _ZN13MessageViewer11HeaderStyleD0Ev@Base 4:15.12 - _ZN13MessageViewer11HeaderStyleD1Ev@Base 4:15.12 - _ZN13MessageViewer11HeaderStyleD2Ev@Base 4:15.12 - _ZN13MessageViewer11MailWebView10scrollDownEi@Base 4:15.12 - _ZN13MessageViewer11MailWebView10wheelEventEP11QWheelEvent@Base 4:15.12 - _ZN13MessageViewer11MailWebView11linkHoveredERK7QStringS3_S3_@Base 4:15.12 - _ZN13MessageViewer11MailWebView11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer11MailWebView11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer11MailWebView11resizeEventEP12QResizeEvent@Base 4:16.04.0 - _ZN13MessageViewer11MailWebView12scrollPageUpEi@Base 4:15.12 - _ZN13MessageViewer11MailWebView13keyPressEventEP9QKeyEvent@Base 4:15.12 - _ZN13MessageViewer11MailWebView14clearSelectionEv@Base 4:15.12 - _ZN13MessageViewer11MailWebView14markAttachmentERK7QStringS3_@Base 4:15.12 - _ZN13MessageViewer11MailWebView14scrollPageDownEi@Base 4:15.12 - _ZN13MessageViewer11MailWebView14scrollToAnchorERK7QString@Base 4:15.12 - _ZN13MessageViewer11MailWebView15keyReleaseEventEP9QKeyEvent@Base 4:15.12 - _ZN13MessageViewer11MailWebView15slotShowDetailsEv@Base 4:15.12 - _ZN13MessageViewer11MailWebView15slotZoomChangedEd@Base 4:16.04.0 - _ZN13MessageViewer11MailWebView16replaceInnerHtmlERK7QStringRKN5boost8functionIFS1_vEEE@Base 4:15.12 - _ZN13MessageViewer11MailWebView16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer11MailWebView17injectAttachmentsERKN5boost8functionIF7QStringvEEE@Base 4:15.12 - _ZN13MessageViewer11MailWebView17messageMayBeAScamEv@Base 4:15.12 - _ZN13MessageViewer11MailWebView21setElementByIdVisibleERK7QStringb@Base 4:15.12 - _ZN13MessageViewer11MailWebView23removeAttachmentMarkingERK7QString@Base 4:15.12 - _ZN13MessageViewer11MailWebView23slotZoomTextOnlyChangedEb@Base 4:16.04.0 - _ZN13MessageViewer11MailWebView24openBlockableItemsDialogEv@Base 4:15.12 - _ZN13MessageViewer11MailWebView24scrollToRelativePositionEd@Base 4:15.12 - _ZN13MessageViewer11MailWebView29saveMainFrameScreenshotInFileERK7QString@Base 4:15.12 - _ZN13MessageViewer11MailWebView5eventEP6QEvent@Base 4:15.12 - _ZN13MessageViewer11MailWebView8scrollUpEi@Base 4:15.12 - _ZN13MessageViewer11MailWebView9popupMenuERK4QUrlS3_RK6QPoint@Base 4:15.12 - _ZN13MessageViewer11MailWebView9scamCheckEv@Base 4:15.12 - _ZN13MessageViewer11MailWebView9selectAllEv@Base 4:15.12 - _ZN13MessageViewer11MailWebViewC1EP17KActionCollectionP7QWidget@Base 4:15.12 - _ZN13MessageViewer11MailWebViewC2EP17KActionCollectionP7QWidget@Base 4:15.12 - _ZN13MessageViewer11MailWebViewD0Ev@Base 4:15.12 - _ZN13MessageViewer11MailWebViewD1Ev@Base 4:15.12 - _ZN13MessageViewer11MailWebViewD2Ev@Base 4:15.12 - _ZN13MessageViewer12ViewerPlugin11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer12ViewerPlugin11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer12ViewerPlugin16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer12ViewerPluginC1EP7QObject@Base 4:15.12 - _ZN13MessageViewer12ViewerPluginC2EP7QObject@Base 4:15.12 - _ZN13MessageViewer12ViewerPluginD0Ev@Base 4:15.12 - _ZN13MessageViewer12ViewerPluginD1Ev@Base 4:15.12 - _ZN13MessageViewer12ViewerPluginD2Ev@Base 4:15.12 - _ZN13MessageViewer13CSSHelperBase11setBodyFontERK5QFont@Base 4:15.12 - _ZN13MessageViewer13CSSHelperBase12setPrintFontERK5QFont@Base 4:15.12 - _ZN13MessageViewer13CSSHelperBase20recalculatePGPColorsEv@Base 4:15.12 - _ZN13MessageViewer13CSSHelperBaseC1EPK12QPaintDevice@Base 4:15.12 - _ZN13MessageViewer13CSSHelperBaseC2EPK12QPaintDevice@Base 4:15.12 - _ZN13MessageViewer13CSSHelperBaseD0Ev@Base 4:16.04.0 - _ZN13MessageViewer13CSSHelperBaseD1Ev@Base 4:16.04.0 - _ZN13MessageViewer13CSSHelperBaseD2Ev@Base 4:16.04.0 - _ZN13MessageViewer13CreateNoteJob11noteCreatedEP4KJob@Base 4:15.12 - _ZN13MessageViewer13CreateNoteJob11noteUpdatedEP4KJob@Base 4:15.12 - _ZN13MessageViewer13CreateNoteJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer13CreateNoteJob11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer13CreateNoteJob15relationCreatedEP4KJob@Base 4:15.12 - _ZN13MessageViewer13CreateNoteJob16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer13CreateNoteJob5startEv@Base 4:15.12 - _ZN13MessageViewer13CreateNoteJobC1ERK14QSharedPointerIN5KMime7MessageEERKN7Akonadi10CollectionERKNS7_4ItemEP7QObject@Base 4:15.12 - _ZN13MessageViewer13CreateNoteJobC2ERK14QSharedPointerIN5KMime7MessageEERKN7Akonadi10CollectionERKNS7_4ItemEP7QObject@Base 4:15.12 - _ZN13MessageViewer13CreateNoteJobD0Ev@Base 4:15.12 - _ZN13MessageViewer13CreateNoteJobD1Ev@Base 4:15.12 - _ZN13MessageViewer13CreateNoteJobD2Ev@Base 4:15.12 - _ZN13MessageViewer13CreateTodoJob10createTodoEv@Base 4:15.12 - _ZN13MessageViewer13CreateTodoJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer13CreateTodoJob11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer13CreateTodoJob11todoCreatedEP4KJob@Base 4:15.12 - _ZN13MessageViewer13CreateTodoJob13slotFetchDoneEP4KJob@Base 4:15.12 - _ZN13MessageViewer13CreateTodoJob15relationCreatedEP4KJob@Base 4:15.12 - _ZN13MessageViewer13CreateTodoJob16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer13CreateTodoJob5startEv@Base 4:15.12 - _ZN13MessageViewer13CreateTodoJobC1ERK14QSharedPointerIN8KCalCore4TodoEERKN7Akonadi10CollectionERKNS7_4ItemEP7QObject@Base 4:15.12 - _ZN13MessageViewer13CreateTodoJobC2ERK14QSharedPointerIN8KCalCore4TodoEERKN7Akonadi10CollectionERKNS7_4ItemEP7QObject@Base 4:15.12 - _ZN13MessageViewer13CreateTodoJobD0Ev@Base 4:15.12 - _ZN13MessageViewer13CreateTodoJobD1Ev@Base 4:15.12 - _ZN13MessageViewer13CreateTodoJobD2Ev@Base 4:15.12 - _ZN13MessageViewer13EditorWatcher11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer13EditorWatcher11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer13EditorWatcher12editorExitedEv@Base 4:15.12 - _ZN13MessageViewer13EditorWatcher12inotifyEventEv@Base 4:15.12 - _ZN13MessageViewer13EditorWatcher13checkEditDoneEv@Base 4:15.12 - _ZN13MessageViewer13EditorWatcher16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer13EditorWatcher5startEv@Base 4:15.12 - _ZN13MessageViewer13EditorWatcher8editDoneEPS0_@Base 4:15.12 - _ZN13MessageViewer13EditorWatcherC1ERK4QUrlRK7QStringNS0_14OpenWithOptionEP7QObjectP7QWidget@Base 4:15.12 - _ZN13MessageViewer13EditorWatcherC2ERK4QUrlRK7QStringNS0_14OpenWithOptionEP7QObjectP7QWidget@Base 4:15.12 - _ZN13MessageViewer13EditorWatcherD0Ev@Base 4:15.12 - _ZN13MessageViewer13EditorWatcherD1Ev@Base 4:15.12 - _ZN13MessageViewer13EditorWatcherD2Ev@Base 4:15.12 - _ZN13MessageViewer13IconNameCache8instanceEv@Base 4:16.04.0 - _ZN13MessageViewer13ProcessResult10setIsImageEb@Base 4:15.12 - _ZN13MessageViewer13ProcessResult21setNeverDisplayInlineEb@Base 4:15.12 - _ZN13MessageViewer13ProcessResult23setInlineSignatureStateENS_19KMMsgSignatureStateE@Base 4:15.12 - _ZN13MessageViewer13ProcessResult24setInlineEncryptionStateENS_20KMMsgEncryptionStateE@Base 4:15.12 - _ZN13MessageViewer13ScamDetection11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer13ScamDetection11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer13ScamDetection11showDetailsEv@Base 4:15.12 - _ZN13MessageViewer13ScamDetection16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer13ScamDetection17messageMayBeAScamEv@Base 4:15.12 - _ZN13MessageViewer13ScamDetection8scanPageEP9QWebFrame@Base 4:15.12 - _ZN13MessageViewer13ScamDetection9scanFrameERK11QWebElementR7QString@Base 4:15.12 - _ZN13MessageViewer13ScamDetectionC1EP7QObject@Base 4:15.12 - _ZN13MessageViewer13ScamDetectionC2EP7QObject@Base 4:15.12 - _ZN13MessageViewer13ScamDetectionD0Ev@Base 4:15.12 - _ZN13MessageViewer13ScamDetectionD1Ev@Base 4:15.12 - _ZN13MessageViewer13ScamDetectionD2Ev@Base 4:15.12 - _ZN13MessageViewer14AdBlockManager11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager11qt_metacastEPKc@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager12blockRequestERK15QNetworkRequest@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager12loadSettingsEv@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager12reloadConfigEv@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager12slotFinishedEP4KJob@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager13addCustomRuleERK7QStringb@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager14loadRuleStringERK7QString@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager16applyHidingRulesEP9QWebFrame@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager16applyHidingRulesEb@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager16isHidingElementsEv@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager16s_adBlockManagerE@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager16staticMetaObjectE@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager17reloadCurrentPageEv@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager18updateSubscriptionERK7QStringS3_S3_@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager22subscriptionFileExistsEi@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager23isAdblockEnabledForHostERK7QString@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager4selfEv@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager9isEnabledEv@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManager9loadRulesERK7QStringRK11QStringList@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManagerC1EP7QObject@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManagerC2EP7QObject@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManagerD0Ev@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManagerD1Ev@Base 4:16.04.0 - _ZN13MessageViewer14AdBlockManagerD2Ev@Base 4:16.04.0 - _ZN13MessageViewer14CreateEventJob11createEventEv@Base 4:15.12 - _ZN13MessageViewer14CreateEventJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer14CreateEventJob11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer14CreateEventJob12eventCreatedEP4KJob@Base 4:15.12 - _ZN13MessageViewer14CreateEventJob13slotFetchDoneEP4KJob@Base 4:15.12 - _ZN13MessageViewer14CreateEventJob15relationCreatedEP4KJob@Base 4:15.12 - _ZN13MessageViewer14CreateEventJob16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer14CreateEventJob5startEv@Base 4:15.12 - _ZN13MessageViewer14CreateEventJobC1ERK14QSharedPointerIN8KCalCore5EventEERKN7Akonadi10CollectionERKNS7_4ItemEP7QObject@Base 4:15.12 - _ZN13MessageViewer14CreateEventJobC2ERK14QSharedPointerIN8KCalCore5EventEERKN7Akonadi10CollectionERKNS7_4ItemEP7QObject@Base 4:15.12 - _ZN13MessageViewer14CreateEventJobD0Ev@Base 4:15.12 - _ZN13MessageViewer14CreateEventJobD1Ev@Base 4:15.12 - _ZN13MessageViewer14CreateEventJobD2Ev@Base 4:15.12 - _ZN13MessageViewer14FileHtmlWriter10openOrWarnEv@Base 4:15.12 - _ZN13MessageViewer14FileHtmlWriter3endEv@Base 4:15.12 - _ZN13MessageViewer14FileHtmlWriter5beginERK7QString@Base 4:15.12 - _ZN13MessageViewer14FileHtmlWriter5flushEv@Base 4:15.12 - _ZN13MessageViewer14FileHtmlWriter5queueERK7QString@Base 4:15.12 - _ZN13MessageViewer14FileHtmlWriter5resetEv@Base 4:15.12 - _ZN13MessageViewer14FileHtmlWriter5writeERK7QString@Base 4:15.12 - _ZN13MessageViewer14FileHtmlWriter9embedPartERK10QByteArrayRK7QString@Base 4:15.12 - _ZN13MessageViewer14FileHtmlWriter9extraHeadERK7QString@Base 4:15.12 - _ZN13MessageViewer14FileHtmlWriterC1ERK7QString@Base 4:15.12 - _ZN13MessageViewer14FileHtmlWriterC2ERK7QString@Base 4:15.12 - _ZN13MessageViewer14FileHtmlWriterD0Ev@Base 4:15.12 - _ZN13MessageViewer14FileHtmlWriterD1Ev@Base 4:15.12 - _ZN13MessageViewer14FileHtmlWriterD2Ev@Base 4:15.12 - _ZN13MessageViewer14FindBarWebView10searchTextEbb@Base 4:16.04.0 - _ZN13MessageViewer14FindBarWebView11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.0 - _ZN13MessageViewer14FindBarWebView11qt_metacastEPKc@Base 4:16.04.0 - _ZN13MessageViewer14FindBarWebView15clearSelectionsEv@Base 4:16.04.0 - _ZN13MessageViewer14FindBarWebView15updateHighLightEb@Base 4:16.04.0 - _ZN13MessageViewer14FindBarWebView16staticMetaObjectE@Base 4:16.04.0 - _ZN13MessageViewer14FindBarWebView17updateSensitivityEb@Base 4:16.04.0 - _ZN13MessageViewer14FindBarWebView29slotFindSelectionFirstChangedEb@Base 4:16.04.0 - _ZN13MessageViewer14FindBarWebViewC1EP8QWebViewP7QWidget@Base 4:16.04.0 - _ZN13MessageViewer14FindBarWebViewC2EP8QWebViewP7QWidget@Base 4:16.04.0 - _ZN13MessageViewer14FindBarWebViewD0Ev@Base 4:16.04.0 - _ZN13MessageViewer14FindBarWebViewD1Ev@Base 4:16.04.0 - _ZN13MessageViewer14FindBarWebViewD2Ev@Base 4:16.04.0 - _ZN13MessageViewer14HeaderStrategy10stringListEPKPKci@Base 4:15.12 - _ZN13MessageViewer14HeaderStrategyC1Ev@Base 4:15.12 - _ZN13MessageViewer14HeaderStrategyC2Ev@Base 4:15.12 - _ZN13MessageViewer14HeaderStrategyD0Ev@Base 4:15.12 - _ZN13MessageViewer14HeaderStrategyD1Ev@Base 4:15.12 - _ZN13MessageViewer14HeaderStrategyD2Ev@Base 4:15.12 - _ZN13MessageViewer14ZoomActionMenu10slotZoomInEv@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenu11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenu11qt_metacastEPKc@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenu11slotZoomOutEv@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenu11zoomChangedEd@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenu13setZoomFactorEd@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenu13slotZoomResetEv@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenu15setZoomTextOnlyEb@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenu16slotZoomTextOnlyEv@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenu16staticMetaObjectE@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenu17createZoomActionsEv@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenu19setActionCollectionEP17KActionCollection@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenu19zoomTextOnlyChangedEb@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenu22setWebViewerZoomFactorEd@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenuC1EP7QObject@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenuC2EP7QObject@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenuD0Ev@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenuD1Ev@Base 4:16.04.0 - _ZN13MessageViewer14ZoomActionMenuD2Ev@Base 4:16.04.0 - _ZN13MessageViewer15ConfigureWidget10readConfigEv@Base 4:15.12 - _ZN13MessageViewer15ConfigureWidget11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer15ConfigureWidget11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer15ConfigureWidget11writeConfigEv@Base 4:15.12 - _ZN13MessageViewer15ConfigureWidget15settingsChangedEv@Base 4:15.12 - _ZN13MessageViewer15ConfigureWidget16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer15ConfigureWidget24readCurrentOverrideCodecEv@Base 4:15.12 - _ZN13MessageViewer15ConfigureWidgetC1EP7QWidget@Base 4:15.12 - _ZN13MessageViewer15ConfigureWidgetC2EP7QWidget@Base 4:15.12 - _ZN13MessageViewer15ConfigureWidgetD0Ev@Base 4:15.12 - _ZN13MessageViewer15ConfigureWidgetD1Ev@Base 4:15.12 - _ZN13MessageViewer15ConfigureWidgetD2Ev@Base 4:15.12 - _ZN13MessageViewer15HeaderStyleUtil13addMailActionER5QHashI7QString8QVariantE@Base 4:16.04.0 - _ZN13MessageViewer15HeaderStyleUtilC1Ev@Base 4:16.04.0 - _ZN13MessageViewer15HeaderStyleUtilC2Ev@Base 4:16.04.0 - _ZN13MessageViewer15QueueHtmlWriter3endEv@Base 4:15.12 - _ZN13MessageViewer15QueueHtmlWriter5beginERK7QString@Base 4:15.12 - _ZN13MessageViewer15QueueHtmlWriter5flushEv@Base 4:15.12 - _ZN13MessageViewer15QueueHtmlWriter5queueERK7QString@Base 4:15.12 - _ZN13MessageViewer15QueueHtmlWriter5resetEv@Base 4:15.12 - _ZN13MessageViewer15QueueHtmlWriter5writeERK7QString@Base 4:15.12 - _ZN13MessageViewer15QueueHtmlWriter6replayEv@Base 4:15.12 - _ZN13MessageViewer15QueueHtmlWriter9embedPartERK10QByteArrayRK7QString@Base 4:15.12 - _ZN13MessageViewer15QueueHtmlWriter9extraHeadERK7QString@Base 4:15.12 - _ZN13MessageViewer15QueueHtmlWriterC1EPNS_10HtmlWriterE@Base 4:15.12 - _ZN13MessageViewer15QueueHtmlWriterC2EPNS_10HtmlWriterE@Base 4:15.12 - _ZN13MessageViewer15QueueHtmlWriterD0Ev@Base 4:15.12 - _ZN13MessageViewer15QueueHtmlWriterD1Ev@Base 4:15.12 - _ZN13MessageViewer15QueueHtmlWriterD2Ev@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser10quotedHTMLERK7QStringb@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser11findTypeNotEPN5KMime7ContentERK10QByteArrayS6_bb@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser11setPrintingEb@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser13okDecryptMIMEERN5KMime7ContentER10QByteArrayRbRSt6vectorIN5GpgME9SignatureESaIS9_EEbS6_S6_S6_RNS_12PartMetaDataE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser13setAllowAsyncEb@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser13writePartIconEPN5KMime7ContentEb@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser15copyContentFromEPKS0_@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser15defaultHandlingEPN5KMime7ContentERNS_13ProcessResultE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser15parseObjectTreeEPN5KMime7ContentE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser16extractNodeInfosEPN5KMime7ContentEb@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser16isMailmanMessageEPN5KMime7ContentE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser17setCryptoProtocolEPKN4Kleo13CryptoBackend8ProtocolE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser19sigStatusToMetaDataERKSt6vectorIN5GpgME9SignatureESaIS3_EEPKN4Kleo13CryptoBackend8ProtocolERNS_12PartMetaDataENS2_3KeyE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser21processMailmanSubtypeEPN5KMime7ContentERNS_13ProcessResultE@Base 4:16.04.0 - _ZN13MessageViewer16ObjectTreeParser22createAndParseTempNodeEPN5KMime7ContentEPKcS5_@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser22processTextHtmlSubtypeEPN5KMime7ContentERNS_13ProcessResultE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser22setShowOnlyOneMimePartEb@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser23parseObjectTreeInternalEPN5KMime7ContentE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser23processTextPlainSubtypeEPN5KMime7ContentERNS_13ProcessResultE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser28processMultiPartMixedSubtypeEPN5KMime7ContentERNS_13ProcessResultE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser28writeCertificateImportResultERKN5GpgME12ImportResultE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser29processMultiPartSignedSubtypeEPN5KMime7ContentERNS_13ProcessResultE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser32processMultiPartEncryptedSubtypeEPN5KMime7ContentERNS_13ProcessResultE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser34processApplicationPkcs7MimeSubtypeEPN5KMime7ContentERNS_13ProcessResultE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser34processMultiPartAlternativeSubtypeEPN5KMime7ContentERNS_13ProcessResultE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser4initEv@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser8findTypeEPN5KMime7ContentERK10QByteArrayS6_bb@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser8findTypeEPN5KMime7ContentERK10QByteArraybb@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParser8okVerifyERK10QByteArrayPKN4Kleo13CryptoBackend8ProtocolERNS_12PartMetaDataERS1_RSt6vectorIN5GpgME9SignatureESaISE_EES3_PN5KMime7ContentE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParserC1EPKS0_bPKNS_18AttachmentStrategyE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParserC1EPNS_18ObjectTreeSourceIfEPNS_10NodeHelperEPKN4Kleo13CryptoBackend8ProtocolEbPKNS_18AttachmentStrategyE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParserC1ERKS0_@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParserC2EPKS0_bPKNS_18AttachmentStrategyE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParserC2EPNS_18ObjectTreeSourceIfEPNS_10NodeHelperEPKN4Kleo13CryptoBackend8ProtocolEbPKNS_18AttachmentStrategyE@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParserC2ERKS0_@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParserD0Ev@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParserD1Ev@Base 4:15.12 - _ZN13MessageViewer16ObjectTreeParserD2Ev@Base 4:15.12 - _ZN13MessageViewer16PlainHeaderStyleC1Ev@Base 4:15.12 - _ZN13MessageViewer16PlainHeaderStyleC2Ev@Base 4:15.12 - _ZN13MessageViewer16PrintingSettings11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer16PrintingSettings11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer16PrintingSettings16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer16PrintingSettings22doResetToDefaultsOtherEv@Base 4:15.12 - _ZN13MessageViewer16PrintingSettings24doLoadFromGlobalSettingsEv@Base 4:15.12 - _ZN13MessageViewer16PrintingSettings4saveEv@Base 4:15.12 - _ZN13MessageViewer16PrintingSettings7changedEv@Base 4:15.12 - _ZN13MessageViewer16PrintingSettingsC1EP7QWidget@Base 4:15.12 - _ZN13MessageViewer16PrintingSettingsC2EP7QWidget@Base 4:15.12 - _ZN13MessageViewer16PrintingSettingsD0Ev@Base 4:15.12 - _ZN13MessageViewer16PrintingSettingsD1Ev@Base 4:15.12 - _ZN13MessageViewer16PrintingSettingsD2Ev@Base 4:15.12 - _ZN13MessageViewer16ScamExpandUrlJob11expandedUrlERK4QUrl@Base 4:16.04.0 - _ZN13MessageViewer16ScamExpandUrlJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.0 - _ZN13MessageViewer16ScamExpandUrlJob11qt_metacastEPKc@Base 4:16.04.0 - _ZN13MessageViewer16ScamExpandUrlJob11urlExpandedERK7QStringS3_@Base 4:16.04.0 - _ZN13MessageViewer16ScamExpandUrlJob14expandUrlErrorEN13QNetworkReply12NetworkErrorE@Base 4:16.04.0 - _ZN13MessageViewer16ScamExpandUrlJob16staticMetaObjectE@Base 4:16.04.0 - _ZN13MessageViewer16ScamExpandUrlJob18slotExpandFinishedEP13QNetworkReply@Base 4:16.04.0 - _ZN13MessageViewer16ScamExpandUrlJob9slotErrorEN13QNetworkReply12NetworkErrorE@Base 4:16.04.0 - _ZN13MessageViewer16ScamExpandUrlJobC1EP7QObject@Base 4:16.04.0 - _ZN13MessageViewer16ScamExpandUrlJobC2EP7QObject@Base 4:16.04.0 - _ZN13MessageViewer16ScamExpandUrlJobD0Ev@Base 4:16.04.0 - _ZN13MessageViewer16ScamExpandUrlJobD1Ev@Base 4:16.04.0 - _ZN13MessageViewer16ScamExpandUrlJobD2Ev@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKey10wheelEventEP11QWheelEvent@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKey11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKey11qt_metacastEPKc@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKey11resizeEventEP12QResizeEvent@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKey13keyPressEventEP9QKeyEvent@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKey14hideAccessKeysEv@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKey14showAccessKeysEv@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKey15keyReleaseEventEP9QKeyEvent@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKey16staticMetaObjectE@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKey17checkForAccessKeyEP9QKeyEvent@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKey18makeAccessKeyLabelE5QCharRK11QWebElement@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKey19setActionCollectionEP17KActionCollection@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKey7openUrlERK4QUrl@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKeyC1EP8QWebViewP7QObject@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKeyC2EP8QWebViewP7QObject@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKeyD0Ev@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKeyD1Ev@Base 4:16.04.0 - _ZN13MessageViewer16WebViewAccessKeyD2Ev@Base 4:16.04.0 - _ZN13MessageViewer17HeaderStylePlugin11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer17HeaderStylePlugin11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer17HeaderStylePlugin16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer17HeaderStylePluginC1EP7QObject@Base 4:15.12 - _ZN13MessageViewer17HeaderStylePluginC2EP7QObject@Base 4:15.12 - _ZN13MessageViewer17HeaderStylePluginD0Ev@Base 4:15.12 - _ZN13MessageViewer17HeaderStylePluginD1Ev@Base 4:15.12 - _ZN13MessageViewer17HeaderStylePluginD2Ev@Base 4:15.12 - _ZN13MessageViewer17ScamCheckShortUrl10isShortUrlERK4QUrl@Base 4:15.12 - _ZN13MessageViewer17ScamCheckShortUrl11expandedUrlERK4QUrl@Base 4:15.12 - _ZN13MessageViewer17ScamCheckShortUrl11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer17ScamCheckShortUrl11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer17ScamCheckShortUrl16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer17ScamCheckShortUrl18sSupportedServicesE@Base 4:15.12 - _ZN13MessageViewer17ScamCheckShortUrl19loadLongUrlServicesEv@Base 4:15.12 - _ZN13MessageViewer17ScamCheckShortUrlC1EP7QObject@Base 4:15.12 - _ZN13MessageViewer17ScamCheckShortUrlC2EP7QObject@Base 4:15.12 - _ZN13MessageViewer17ScamCheckShortUrlD0Ev@Base 4:15.12 - _ZN13MessageViewer17ScamCheckShortUrlD1Ev@Base 4:15.12 - _ZN13MessageViewer17ScamCheckShortUrlD2Ev@Base 4:15.12 - _ZN13MessageViewer18AttachmentStrategy10headerOnlyEv@Base 4:15.12 - _ZN13MessageViewer18AttachmentStrategy5smartEv@Base 4:15.12 - _ZN13MessageViewer18AttachmentStrategy6createENS0_4TypeE@Base 4:15.12 - _ZN13MessageViewer18AttachmentStrategy6createERK7QString@Base 4:15.12 - _ZN13MessageViewer18AttachmentStrategy6hiddenEv@Base 4:15.12 - _ZN13MessageViewer18AttachmentStrategy6iconicEv@Base 4:15.12 - _ZN13MessageViewer18AttachmentStrategy7inlinedEv@Base 4:15.12 - _ZN13MessageViewer18AttachmentStrategyC1Ev@Base 4:15.12 - _ZN13MessageViewer18AttachmentStrategyC2Ev@Base 4:15.12 - _ZN13MessageViewer18AttachmentStrategyD0Ev@Base 4:15.12 - _ZN13MessageViewer18AttachmentStrategyD1Ev@Base 4:15.12 - _ZN13MessageViewer18AttachmentStrategyD2Ev@Base 4:15.12 - _ZN13MessageViewer18InvitationSettings11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer18InvitationSettings11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer18InvitationSettings16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer18InvitationSettings22doResetToDefaultsOtherEv@Base 4:15.12 - _ZN13MessageViewer18InvitationSettings24doLoadFromGlobalSettingsEv@Base 4:15.12 - _ZN13MessageViewer18InvitationSettings28slotLegacyBodyInvitesToggledEb@Base 4:15.12 - _ZN13MessageViewer18InvitationSettings4saveEv@Base 4:15.12 - _ZN13MessageViewer18InvitationSettings7changedEv@Base 4:15.12 - _ZN13MessageViewer18InvitationSettingsC1EP7QWidget@Base 4:15.12 - _ZN13MessageViewer18InvitationSettingsC2EP7QWidget@Base 4:15.12 - _ZN13MessageViewer18InvitationSettingsD0Ev@Base 4:15.12 - _ZN13MessageViewer18InvitationSettingsD1Ev@Base 4:15.12 - _ZN13MessageViewer18InvitationSettingsD2Ev@Base 4:15.12 - _ZN13MessageViewer18RichHeaderStrategyC1Ev@Base 4:15.12 - _ZN13MessageViewer18RichHeaderStrategyC2Ev@Base 4:15.12 - _ZN13MessageViewer18RichHeaderStrategyD0Ev@Base 4:15.12 - _ZN13MessageViewer18RichHeaderStrategyD1Ev@Base 4:15.12 - _ZN13MessageViewer18RichHeaderStrategyD2Ev@Base 4:15.12 - _ZN13MessageViewer19GrantleeHeaderStyleC1Ev@Base 4:15.12 - _ZN13MessageViewer19GrantleeHeaderStyleC2Ev@Base 4:15.12 - _ZN13MessageViewer19GrantleeHeaderStyleD0Ev@Base 4:15.12 - _ZN13MessageViewer19GrantleeHeaderStyleD1Ev@Base 4:15.12 - _ZN13MessageViewer19GrantleeHeaderStyleD2Ev@Base 4:15.12 - _ZN13MessageViewer19ViewerPluginManager11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer19ViewerPluginManager11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer19ViewerPluginManager13setPluginNameERK7QString@Base 4:16.04.0 - _ZN13MessageViewer19ViewerPluginManager16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer19ViewerPluginManager18setServiceTypeNameERK7QString@Base 4:16.04.0 - _ZN13MessageViewer19ViewerPluginManager20initializePluginListEv@Base 4:16.04.0 - _ZN13MessageViewer19ViewerPluginManager4selfEv@Base 4:15.12 - _ZN13MessageViewer19ViewerPluginManagerC1EP7QObject@Base 4:15.12 - _ZN13MessageViewer19ViewerPluginManagerC2EP7QObject@Base 4:15.12 - _ZN13MessageViewer19ViewerPluginManagerD0Ev@Base 4:15.12 - _ZN13MessageViewer19ViewerPluginManagerD1Ev@Base 4:15.12 - _ZN13MessageViewer19ViewerPluginManagerD2Ev@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget10hasChangedEv@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget10insertRuleEv@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget10removeRuleEv@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget12slotShowListEv@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget13slotAddFilterEv@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget14slotDeleteListERK7QString@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget14slotEditFilterEv@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget14updateCheckBoxEv@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget15addManualFilterERK7QStringRK11QStringList@Base 4:16.04.0 - _ZN13MessageViewer20AdBlockSettingWidget16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget17slotExportFiltersEv@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget17slotImportFiltersEv@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget17slotUpdateButtonsEv@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget21slotInfoLinkActivatedERK7QString@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget22doResetToDefaultsOtherEv@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget22slotRemoveSubscriptionEv@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget23showAutomaticFilterListEP15QListWidgetItem@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget23slotUpdateManualButtonsEv@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget24doLoadFromGlobalSettingsEv@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget25slotAutomaticFilterDoubleEP15QListWidgetItem@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget35slotManualFilterLineEditTextChangedERK7QString@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget4saveEv@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidget7changedEb@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidgetC1EP7QWidget@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidgetC2EP7QWidget@Base 4:15.12 - _ZN13MessageViewer20AdBlockSettingWidgetD0Ev@Base 4:16.04.0 - _ZN13MessageViewer20AdBlockSettingWidgetD1Ev@Base 4:16.04.0 - _ZN13MessageViewer20AdBlockSettingWidgetD2Ev@Base 4:16.04.0 - _ZN13MessageViewer20HeaderStyleInterface11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer20HeaderStyleInterface11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer20HeaderStyleInterface12styleChangedEPNS_17HeaderStylePluginE@Base 4:15.12 - _ZN13MessageViewer20HeaderStyleInterface12styleUpdatedEv@Base 4:15.12 - _ZN13MessageViewer20HeaderStyleInterface15addActionToMenuEP11KActionMenuP12QActionGroup@Base 4:15.12 - _ZN13MessageViewer20HeaderStyleInterface16slotStyleChangedEv@Base 4:15.12 - _ZN13MessageViewer20HeaderStyleInterface16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer20HeaderStyleInterface17addHelpTextActionEP7QActionRK7QString@Base 4:15.12 - _ZN13MessageViewer20HeaderStyleInterfaceC1EPNS_17HeaderStylePluginEP7QObject@Base 4:15.12 - _ZN13MessageViewer20HeaderStyleInterfaceC2EPNS_17HeaderStylePluginEP7QObject@Base 4:15.12 - _ZN13MessageViewer20HeaderStyleInterfaceD0Ev@Base 4:15.12 - _ZN13MessageViewer20HeaderStyleInterfaceD1Ev@Base 4:15.12 - _ZN13MessageViewer20HeaderStyleInterfaceD2Ev@Base 4:15.12 - _ZN13MessageViewer21MessageViewerSettings11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer21MessageViewerSettings11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer21MessageViewerSettings11requestSyncEv@Base 4:15.12 - _ZN13MessageViewer21MessageViewerSettings11slotSyncNowEv@Base 4:15.12 - _ZN13MessageViewer21MessageViewerSettings16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer21MessageViewerSettings4selfEv@Base 4:15.12 - _ZN13MessageViewer21MessageViewerSettings5mSelfE@Base 4:15.12 - _ZN13MessageViewer21MessageViewerSettingsC1Ev@Base 4:15.12 - _ZN13MessageViewer21MessageViewerSettingsC2Ev@Base 4:15.12 - _ZN13MessageViewer21MessageViewerSettingsD0Ev@Base 4:15.12 - _ZN13MessageViewer21MessageViewerSettingsD1Ev@Base 4:15.12 - _ZN13MessageViewer21MessageViewerSettingsD2Ev@Base 4:15.12 - _ZN13MessageViewer21ViewerPluginInterface10setMessageERK14QSharedPointerIN5KMime7MessageEE@Base 4:15.12 - _ZN13MessageViewer21ViewerPluginInterface10showWidgetEv@Base 4:16.04.0 - _ZN13MessageViewer21ViewerPluginInterface11closePluginEv@Base 4:15.12 - _ZN13MessageViewer21ViewerPluginInterface11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer21ViewerPluginInterface11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer21ViewerPluginInterface12updateActionERKN7Akonadi4ItemE@Base 4:15.12 - _ZN13MessageViewer21ViewerPluginInterface14activatePluginEPS0_@Base 4:15.12 - _ZN13MessageViewer21ViewerPluginInterface14setMessageItemERKN7Akonadi4ItemE@Base 4:15.12 - _ZN13MessageViewer21ViewerPluginInterface16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer21ViewerPluginInterface17addHelpTextActionEP7QActionRK7QString@Base 4:15.12 - _ZN13MessageViewer21ViewerPluginInterface18slotActivatePluginEv@Base 4:15.12 - _ZN13MessageViewer21ViewerPluginInterface6setUrlERK4QUrl@Base 4:16.04.0 - _ZN13MessageViewer21ViewerPluginInterface7executeEv@Base 4:16.04.0 - _ZN13MessageViewer21ViewerPluginInterface7setTextERK7QString@Base 4:15.12 - _ZN13MessageViewer21ViewerPluginInterfaceC1EP7QObject@Base 4:15.12 - _ZN13MessageViewer21ViewerPluginInterfaceC2EP7QObject@Base 4:15.12 - _ZN13MessageViewer21ViewerPluginInterfaceD0Ev@Base 4:15.12 - _ZN13MessageViewer21ViewerPluginInterfaceD1Ev@Base 4:15.12 - _ZN13MessageViewer21ViewerPluginInterfaceD2Ev@Base 4:15.12 - _ZN13MessageViewer22HeaderStyleMenuManager10readConfigEv@Base 4:15.12 - _ZN13MessageViewer22HeaderStyleMenuManager11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer22HeaderStyleMenuManager11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer22HeaderStyleMenuManager12styleChangedEPNS_17HeaderStylePluginE@Base 4:15.12 - _ZN13MessageViewer22HeaderStyleMenuManager12styleUpdatedEv@Base 4:15.12 - _ZN13MessageViewer22HeaderStyleMenuManager13setPluginNameERK7QString@Base 4:15.12 - _ZN13MessageViewer22HeaderStyleMenuManager16slotStyleChangedEPNS_17HeaderStylePluginE@Base 4:15.12 - _ZN13MessageViewer22HeaderStyleMenuManager16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer22HeaderStyleMenuManagerC1EP17KActionCollectionP7QObject@Base 4:15.12 - _ZN13MessageViewer22HeaderStyleMenuManagerC2EP17KActionCollectionP7QObject@Base 4:15.12 - _ZN13MessageViewer22HeaderStyleMenuManagerD0Ev@Base 4:15.12 - _ZN13MessageViewer22HeaderStyleMenuManagerD1Ev@Base 4:15.12 - _ZN13MessageViewer22HeaderStyleMenuManagerD2Ev@Base 4:15.12 - _ZN13MessageViewer22MarkMessageReadHandler11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer22MarkMessageReadHandler11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer22MarkMessageReadHandler16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer22MarkMessageReadHandler7setItemERKN7Akonadi4ItemE@Base 4:15.12 - _ZN13MessageViewer22MarkMessageReadHandlerC1EP7QObject@Base 4:15.12 - _ZN13MessageViewer22MarkMessageReadHandlerC2EP7QObject@Base 4:15.12 - _ZN13MessageViewer22MarkMessageReadHandlerD0Ev@Base 4:15.12 - _ZN13MessageViewer22MarkMessageReadHandlerD1Ev@Base 4:15.12 - _ZN13MessageViewer22MarkMessageReadHandlerD2Ev@Base 4:15.12 - _ZN13MessageViewer23GrantleeHeaderFormatterC1Ev@Base 4:15.12 - _ZN13MessageViewer23GrantleeHeaderFormatterC2Ev@Base 4:15.12 - _ZN13MessageViewer23GrantleeHeaderFormatterD1Ev@Base 4:15.12 - _ZN13MessageViewer23GrantleeHeaderFormatterD2Ev@Base 4:15.12 - _ZN13MessageViewer23GrantleeHeaderTestStyle15setAbsolutePathERK7QString@Base 4:15.12 - _ZN13MessageViewer23GrantleeHeaderTestStyle15setMainFilenameERK7QString@Base 4:15.12 - _ZN13MessageViewer23GrantleeHeaderTestStyle22setExtraDisplayHeadersERK11QStringList@Base 4:15.12 - _ZN13MessageViewer23GrantleeHeaderTestStyleC1Ev@Base 4:15.12 - _ZN13MessageViewer23GrantleeHeaderTestStyleC2Ev@Base 4:15.12 - _ZN13MessageViewer23GrantleeHeaderTestStyleD0Ev@Base 4:15.12 - _ZN13MessageViewer23GrantleeHeaderTestStyleD1Ev@Base 4:15.12 - _ZN13MessageViewer23GrantleeHeaderTestStyleD2Ev@Base 4:15.12 - _ZN13MessageViewer23ViewerPluginToolManager10createViewEv@Base 4:15.12 - _ZN13MessageViewer23ViewerPluginToolManager11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer23ViewerPluginToolManager11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer23ViewerPluginToolManager13closeAllToolsEv@Base 4:15.12 - _ZN13MessageViewer23ViewerPluginToolManager13setPluginNameERK7QString@Base 4:16.04.0 - _ZN13MessageViewer23ViewerPluginToolManager13updateActionsERKN7Akonadi4ItemE@Base 4:15.12 - _ZN13MessageViewer23ViewerPluginToolManager14activatePluginEPNS_21ViewerPluginInterfaceE@Base 4:15.12 - _ZN13MessageViewer23ViewerPluginToolManager16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer23ViewerPluginToolManager18setServiceTypeNameERK7QString@Base 4:16.04.0 - _ZN13MessageViewer23ViewerPluginToolManager19setActionCollectionEP17KActionCollection@Base 4:15.12 - _ZN13MessageViewer23ViewerPluginToolManager20initializePluginListEv@Base 4:16.04.0 - _ZN13MessageViewer23ViewerPluginToolManagerC1EP7QWidgetP7QObject@Base 4:15.12 - _ZN13MessageViewer23ViewerPluginToolManagerC2EP7QWidgetP7QObject@Base 4:15.12 - _ZN13MessageViewer23ViewerPluginToolManagerD0Ev@Base 4:15.12 - _ZN13MessageViewer23ViewerPluginToolManagerD1Ev@Base 4:15.12 - _ZN13MessageViewer23ViewerPluginToolManagerD2Ev@Base 4:15.12 - _ZN13MessageViewer24BodyPartFormatterFactory11loadPluginsEv@Base 4:16.04.0 - _ZN13MessageViewer24BodyPartFormatterFactoryC1Ev@Base 4:16.04.0 - _ZN13MessageViewer24BodyPartFormatterFactoryC2Ev@Base 4:16.04.0 - _ZN13MessageViewer24BodyPartFormatterFactoryD0Ev@Base 4:16.04.0 - _ZN13MessageViewer24BodyPartFormatterFactoryD1Ev@Base 4:16.04.0 - _ZN13MessageViewer24BodyPartFormatterFactoryD2Ev@Base 4:16.04.0 - _ZN13MessageViewer24HeaderStylePluginManager11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer24HeaderStylePluginManager11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer24HeaderStylePluginManager16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer24HeaderStylePluginManager4selfEv@Base 4:15.12 - _ZN13MessageViewer24HeaderStylePluginManagerC1EP7QObject@Base 4:15.12 - _ZN13MessageViewer24HeaderStylePluginManagerC2EP7QObject@Base 4:15.12 - _ZN13MessageViewer24HeaderStylePluginManagerD0Ev@Base 4:15.12 - _ZN13MessageViewer24HeaderStylePluginManagerD1Ev@Base 4:15.12 - _ZN13MessageViewer24HeaderStylePluginManagerD2Ev@Base 4:15.12 - _ZN13MessageViewer24ScamCheckShortUrlManager11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.0 - _ZN13MessageViewer24ScamCheckShortUrlManager11qt_metacastEPKc@Base 4:16.04.0 - _ZN13MessageViewer24ScamCheckShortUrlManager16staticMetaObjectE@Base 4:16.04.0 - _ZN13MessageViewer24ScamCheckShortUrlManager4selfEv@Base 4:16.04.0 - _ZN13MessageViewer24ScamCheckShortUrlManagerC1EP7QObject@Base 4:16.04.0 - _ZN13MessageViewer24ScamCheckShortUrlManagerC2EP7QObject@Base 4:16.04.0 - _ZN13MessageViewer24ScamCheckShortUrlManagerD0Ev@Base 4:16.04.0 - _ZN13MessageViewer24ScamCheckShortUrlManagerD1Ev@Base 4:16.04.0 - _ZN13MessageViewer24ScamCheckShortUrlManagerD2Ev@Base 4:16.04.0 - _ZN13MessageViewer25MessageViewerSettingsBase4selfEv@Base 4:15.12 - _ZN13MessageViewer25MessageViewerSettingsBaseC1Ev@Base 4:15.12 - _ZN13MessageViewer25MessageViewerSettingsBaseC2Ev@Base 4:15.12 - _ZN13MessageViewer25MessageViewerSettingsBaseD0Ev@Base 4:15.12 - _ZN13MessageViewer25MessageViewerSettingsBaseD1Ev@Base 4:15.12 - _ZN13MessageViewer25MessageViewerSettingsBaseD2Ev@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidget11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidget11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidget11showDetailsEv@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidget14addToWhiteListEv@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidget15slotShowDetailsERK7QString@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidget15slotShowWarningEv@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidget16setUseInTestAppsEb@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidget16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidget17messageIsNotAScamEv@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidget18moveMessageToTrashEv@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidget18slotAddToWhiteListEv@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidget21slotMessageIsNotAScamEv@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidget24slotDisableScamDetectionEv@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidgetC1EP7QWidget@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidgetC2EP7QWidget@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidgetD0Ev@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidgetD1Ev@Base 4:15.12 - _ZN13MessageViewer26ScamDetectionWarningWidgetD2Ev@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsDialog10readConfigEv@Base 4:16.04.0 - _ZN13MessageViewer27AdBlockBlockableItemsDialog11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.0 - _ZN13MessageViewer27AdBlockBlockableItemsDialog11qt_metacastEPKc@Base 4:16.04.0 - _ZN13MessageViewer27AdBlockBlockableItemsDialog11saveFiltersEv@Base 4:16.04.0 - _ZN13MessageViewer27AdBlockBlockableItemsDialog11setWebFrameEP9QWebFrame@Base 4:16.04.0 - _ZN13MessageViewer27AdBlockBlockableItemsDialog11writeConfigEv@Base 4:16.04.0 - _ZN13MessageViewer27AdBlockBlockableItemsDialog16staticMetaObjectE@Base 4:16.04.0 - _ZN13MessageViewer27AdBlockBlockableItemsDialogC1EP7QWidget@Base 4:16.04.0 - _ZN13MessageViewer27AdBlockBlockableItemsDialogC2EP7QWidget@Base 4:16.04.0 - _ZN13MessageViewer27AdBlockBlockableItemsDialogD0Ev@Base 4:16.04.0 - _ZN13MessageViewer27AdBlockBlockableItemsDialogD1Ev@Base 4:16.04.0 - _ZN13MessageViewer27AdBlockBlockableItemsDialogD2Ev@Base 4:16.04.0 - _ZN13MessageViewer27AdBlockBlockableItemsWidget11elementTypeENS0_11TypeElementE@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidget11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidget11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidget11saveFiltersEv@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidget11setWebFrameEP9QWebFrame@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidget12slotCopyItemEv@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidget12slotOpenItemEv@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidget13slotBlockItemEv@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidget16slotRemoveFilterEv@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidget16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidget17elementTypeToI18nENS0_11TypeElementE@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidget18slotCopyFilterItemEv@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidget22searchBlockableElementEP9QWebFrame@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidget26customContextMenuRequestedERK6QPoint@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidget8adaptSrcER7QStringRKS1_@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidgetC1EP7QWidget@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidgetC2EP7QWidget@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidgetD0Ev@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidgetD1Ev@Base 4:15.12 - _ZN13MessageViewer27AdBlockBlockableItemsWidgetD2Ev@Base 4:15.12 - _ZN13MessageViewer28BodyPartFormatterBaseFactory11loadPluginsEv@Base 4:16.04.0 - _ZN13MessageViewer28BodyPartFormatterBaseFactory6insertEPKcS2_PKNS_9Interface17BodyPartFormatterE@Base 4:16.04.0 - _ZN13MessageViewer28BodyPartFormatterBaseFactoryC1Ev@Base 4:16.04.0 - _ZN13MessageViewer28BodyPartFormatterBaseFactoryC2Ev@Base 4:16.04.0 - _ZN13MessageViewer28BodyPartFormatterBaseFactoryD0Ev@Base 4:16.04.0 - _ZN13MessageViewer28BodyPartFormatterBaseFactoryD1Ev@Base 4:16.04.0 - _ZN13MessageViewer28BodyPartFormatterBaseFactoryD2Ev@Base 4:16.04.0 - _ZN13MessageViewer29MessageDisplayFormatAttribute11deserializeERK10QByteArray@Base 4:15.12 - _ZN13MessageViewer29MessageDisplayFormatAttribute16setMessageFormatENS_6Viewer20DisplayFormatMessageE@Base 4:15.12 - _ZN13MessageViewer29MessageDisplayFormatAttribute16setRemoteContentEb@Base 4:15.12 - _ZN13MessageViewer29MessageDisplayFormatAttributeC1Ev@Base 4:15.12 - _ZN13MessageViewer29MessageDisplayFormatAttributeC2Ev@Base 4:15.12 - _ZN13MessageViewer29MessageDisplayFormatAttributeD0Ev@Base 4:15.12 - _ZN13MessageViewer29MessageDisplayFormatAttributeD1Ev@Base 4:15.12 - _ZN13MessageViewer29MessageDisplayFormatAttributeD2Ev@Base 4:15.12 - _ZN13MessageViewer31AdBlockAutomaticRulesListWidget10createItemERK7QString@Base 4:16.04.0 - _ZN13MessageViewer31AdBlockAutomaticRulesListWidget10updateItemEP15QListWidgetItem@Base 4:16.04.0 - _ZN13MessageViewer31AdBlockAutomaticRulesListWidget11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.0 - _ZN13MessageViewer31AdBlockAutomaticRulesListWidget11qt_metacastEPKc@Base 4:16.04.0 - _ZN13MessageViewer31AdBlockAutomaticRulesListWidget15slotItemChangedEP15QListWidgetItem@Base 4:16.04.0 - _ZN13MessageViewer31AdBlockAutomaticRulesListWidget16setDisabledRulesERK11QStringList@Base 4:16.04.0 - _ZN13MessageViewer31AdBlockAutomaticRulesListWidget16staticMetaObjectE@Base 4:16.04.0 - _ZN13MessageViewer31AdBlockAutomaticRulesListWidget8setRulesERK7QString@Base 4:16.04.0 - _ZN13MessageViewer31AdBlockAutomaticRulesListWidgetC1EP7QWidget@Base 4:16.04.0 - _ZN13MessageViewer31AdBlockAutomaticRulesListWidgetC2EP7QWidget@Base 4:16.04.0 - _ZN13MessageViewer31AdBlockAutomaticRulesListWidgetD0Ev@Base 4:16.04.0 - _ZN13MessageViewer31AdBlockAutomaticRulesListWidgetD1Ev@Base 4:16.04.0 - _ZN13MessageViewer31AdBlockAutomaticRulesListWidgetD2Ev@Base 4:16.04.0 - _ZN13MessageViewer4Util14checkOverwriteERK4QUrlP7QWidget@Base 4:15.12 - _ZN13MessageViewer4Util15createAppActionERK28QExplicitlySharedDataPointerI8KServiceEbP12QActionGroupP7QObject@Base 4:15.12 - _ZN13MessageViewer4Util15saveAttachmentsERK7QVectorIPN5KMime7ContentEEP7QWidgetR4QUrl@Base 4:15.12 - _ZN13MessageViewer4Util17saveMessageInMboxERK7QVectorIN7Akonadi4ItemEEP7QWidgetb@Base 4:15.12 - _ZN13MessageViewer4Util19fileNameForMimetypeERK7QStringiS3_S3_@Base 4:15.12 - _ZN13MessageViewer6KXFace10UnCompressEPciii@Base 4:15.12 - _ZN13MessageViewer6KXFace11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer6KXFace11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer6KXFace16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer6KXFace3GenEPc@Base 4:15.12 - _ZN13MessageViewer6KXFace4SameEPcii@Base 4:15.12 - _ZN13MessageViewer6KXFace6BigAddEh@Base 4:15.12 - _ZN13MessageViewer6KXFace6BigDivEhPh@Base 4:15.12 - _ZN13MessageViewer6KXFace6BigMulEh@Base 4:15.12 - _ZN13MessageViewer6KXFace6BigPopEPK4prob@Base 4:15.12 - _ZN13MessageViewer6KXFace7BigPushEP4prob@Base 4:15.12 - _ZN13MessageViewer6KXFace7BigReadEPc@Base 4:15.12 - _ZN13MessageViewer6KXFace7CompAllEPc@Base 4:15.12 - _ZN13MessageViewer6KXFace7GenFaceEv@Base 4:15.12 - _ZN13MessageViewer6KXFace7RevPushEPK4prob@Base 4:15.12 - _ZN13MessageViewer6KXFace7toImageERK7QString@Base 4:15.12 - _ZN13MessageViewer6KXFace8AllBlackEPcii@Base 4:15.12 - _ZN13MessageViewer6KXFace8AllWhiteEPcii@Base 4:15.12 - _ZN13MessageViewer6KXFace8BigClearEv@Base 4:15.12 - _ZN13MessageViewer6KXFace8BigWriteEPc@Base 4:15.12 - _ZN13MessageViewer6KXFace8CompressEPciii@Base 4:15.12 - _ZN13MessageViewer6KXFace8PopGreysEPcii@Base 4:15.12 - _ZN13MessageViewer6KXFace8ReadFaceEPc@Base 4:15.12 - _ZN13MessageViewer6KXFace9PushGreysEPcii@Base 4:15.12 - _ZN13MessageViewer6KXFace9UnCompAllEPc@Base 4:15.12 - _ZN13MessageViewer6KXFace9UnGenFaceEv@Base 4:15.12 - _ZN13MessageViewer6KXFace9WriteFaceEv@Base 4:15.12 - _ZN13MessageViewer6KXFace9fromImageERK6QImage@Base 4:15.12 - _ZN13MessageViewer6KXFaceC1Ev@Base 4:15.12 - _ZN13MessageViewer6KXFaceC2Ev@Base 4:15.12 - _ZN13MessageViewer6KXFaceD0Ev@Base 4:15.12 - _ZN13MessageViewer6KXFaceD1Ev@Base 4:15.12 - _ZN13MessageViewer6KXFaceD2Ev@Base 4:15.12 - _ZN13MessageViewer6Viewer10closeEventEP11QCloseEvent@Base 4:15.12 - _ZN13MessageViewer6Viewer10initializeEv@Base 4:15.12 - _ZN13MessageViewer6Viewer10mainWindowEv@Base 4:15.12 - _ZN13MessageViewer6Viewer10readConfigEv@Base 4:15.12 - _ZN13MessageViewer6Viewer10setAppNameERK7QString@Base 4:15.12 - _ZN13MessageViewer6Viewer10setMessageERK14QSharedPointerIN5KMime7MessageEENS_10UpdateModeE@Base 4:16.04.0 - _ZN13MessageViewer6Viewer10showReaderEPN5KMime7ContentEbRK7QString@Base 4:15.12 - _ZN13MessageViewer6Viewer10slotZoomInEv@Base 4:15.12 - _ZN13MessageViewer6Viewer10urlClickedERKN7Akonadi4ItemERK4QUrl@Base 4:15.12 - _ZN13MessageViewer6Viewer11changeEventEP6QEvent@Base 4:15.12 - _ZN13MessageViewer6Viewer11itemRemovedEv@Base 4:15.12 - _ZN13MessageViewer6Viewer11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:15.12 - _ZN13MessageViewer6Viewer11qt_metacastEPKc@Base 4:15.12 - _ZN13MessageViewer6Viewer11resizeEventEP12QResizeEvent@Base 4:15.12 - _ZN13MessageViewer6Viewer11setPrintingEb@Base 4:15.12 - _ZN13MessageViewer6Viewer11showMessageERK14QSharedPointerIN5KMime7MessageEERK7QString@Base 4:15.12 - _ZN13MessageViewer6Viewer11slotZoomOutEv@Base 4:15.12 - _ZN13MessageViewer6Viewer11writeConfigEb@Base 4:15.12 - _ZN13MessageViewer6Viewer12configWidgetEv@Base 4:15.12 - _ZN13MessageViewer6Viewer12printMessageERKN7Akonadi4ItemE@Base 4:15.12 - _ZN13MessageViewer6Viewer12printPreviewEv@Base 4:15.12 - _ZN13MessageViewer6Viewer12slotJumpDownEv@Base 4:15.12 - _ZN13MessageViewer6Viewer12slotScrollUpEv@Base 4:15.12 - _ZN13MessageViewer6Viewer13deleteMessageERKN7Akonadi4ItemE@Base 4:15.12 - _ZN13MessageViewer6Viewer13deleteMessageEv@Base 4:15.12 - _ZN13MessageViewer6Viewer13setPluginNameERK7QString@Base 4:15.12 - _ZN13MessageViewer6Viewer13setZoomFactorEd@Base 4:15.12 - _ZN13MessageViewer6Viewer13slotZoomResetEv@Base 4:15.12 - _ZN13MessageViewer6Viewer14clearSelectionEv@Base 4:15.12 - _ZN13MessageViewer6Viewer14createFetchJobERKN7Akonadi4ItemE@Base 4:15.12 - _ZN13MessageViewer6Viewer14setMessageItemERKN7Akonadi4ItemENS_10UpdateModeE@Base 4:16.04.0 - _ZN13MessageViewer6Viewer14setMessagePartEPN5KMime7ContentE@Base 4:15.12 - _ZN13MessageViewer6Viewer14setMessagePathERK7QString@Base 4:15.12 - _ZN13MessageViewer6Viewer14slotScrollDownEv@Base 4:15.12 - _ZN13MessageViewer6Viewer14slotScrollNextEv@Base 4:15.12 - _ZN13MessageViewer6Viewer15setUseFixedFontEb@Base 4:15.12 - _ZN13MessageViewer6Viewer15setZoomTextOnlyEb@Base 4:15.12 - _ZN13MessageViewer6Viewer15slotSaveMessageEv@Base 4:15.12 - _ZN13MessageViewer6Viewer15slotScrollPriorEv@Base 4:15.12 - _ZN13MessageViewer6Viewer16staticMetaObjectE@Base 4:15.12 - _ZN13MessageViewer6Viewer17displaySplashPageERK7QStringRK5QHashIS1_8QVariantE@Base 4:15.12 - _ZN13MessageViewer6Viewer17executeMailActionENS0_10MailActionE@Base 4:16.04.0 - _ZN13MessageViewer6Viewer17requestConfigSyncEv@Base 4:15.12 - _ZN13MessageViewer6Viewer17setExternalWindowEb@Base 4:15.12 - _ZN13MessageViewer6Viewer18makeResourceOnlineENS0_18ResourceOnlineModeE@Base 4:15.12 - _ZN13MessageViewer6Viewer18moveMessageToTrashEv@Base 4:15.12 - _ZN13MessageViewer6Viewer19printPreviewMessageERKN7Akonadi4ItemE@Base 4:15.12 - _ZN13MessageViewer6Viewer19setOverrideEncodingERK7QString@Base 4:15.12 - _ZN13MessageViewer6Viewer20enableMessageDisplayEv@Base 4:15.12 - _ZN13MessageViewer6Viewer20showStatusBarMessageERK7QString@Base 4:15.12 - _ZN13MessageViewer6Viewer20slotAttachmentSaveAsEv@Base 4:15.12 - _ZN13MessageViewer6Viewer21setAttachmentStrategyEPKNS_18AttachmentStrategyE@Base 4:15.12 - _ZN13MessageViewer6Viewer21slotAttachmentSaveAllEv@Base 4:15.12 - _ZN13MessageViewer6Viewer21slotChangeDisplayMailENS0_20DisplayFormatMessageEb@Base 4:15.12 - _ZN13MessageViewer6Viewer21slotShowMessageSourceEv@Base 4:15.12 - _ZN13MessageViewer6Viewer22setHtmlLoadExtOverrideEb@Base 4:15.12 - _ZN13MessageViewer6Viewer22viewerPluginActionListE6QFlagsINS_21ViewerPluginInterface19SpecificFeatureTypeEE@Base 4:15.12 - _ZN13MessageViewer6Viewer23addMessageLoadedHandlerEPNS_28AbstractMessageLoadedHandlerE@Base 4:15.12 - _ZN13MessageViewer6Viewer24copySelectionToClipboardEv@Base 4:15.12 - _ZN13MessageViewer6Viewer26removeMessageLoadedHandlerEPNS_28AbstractMessageLoadedHandlerE@Base 4:15.12 - _ZN13MessageViewer6Viewer26setDecryptMessageOverwriteEb@Base 4:15.12 - _ZN13MessageViewer6Viewer29saveMainFrameScreenshotInFileERK7QString@Base 4:15.12 - _ZN13MessageViewer6Viewer30replaceMsgByUnencryptedVersionEv@Base 4:15.12 - _ZN13MessageViewer6Viewer30showOpenAttachmentFolderWidgetERK4QUrl@Base 4:15.12 - _ZN13MessageViewer6Viewer32setDisplayFormatMessageOverwriteENS0_20DisplayFormatMessageE@Base 4:15.12 - _ZN13MessageViewer6Viewer5clearENS_10UpdateModeE@Base 4:16.04.0 - _ZN13MessageViewer6Viewer5eventEP6QEvent@Base 4:15.12 - _ZN13MessageViewer6Viewer5printEv@Base 4:15.12 - _ZN13MessageViewer6Viewer6updateENS_10UpdateModeE@Base 4:16.04.0 - _ZN13MessageViewer6Viewer8slotFindEv@Base 4:15.12 - _ZN13MessageViewer6Viewer9popupMenuERKN7Akonadi4ItemERK4QUrlS7_RK6QPoint@Base 4:15.12 - _ZN13MessageViewer6Viewer9selectAllEv@Base 4:15.12 - _ZN13MessageViewer6ViewerC1EP7QWidgetS2_P17KActionCollection6QFlagsIN2Qt10WindowTypeEE@Base 4:15.12 - _ZN13MessageViewer6ViewerC2EP7QWidgetS2_P17KActionCollection6QFlagsIN2Qt10WindowTypeEE@Base 4:15.12 - _ZN13MessageViewer6ViewerD0Ev@Base 4:15.12 - _ZN13MessageViewer6ViewerD1Ev@Base 4:15.12 - _ZN13MessageViewer6ViewerD2Ev@Base 4:15.12 - _ZN13MessageViewer7WebPage11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.0 - _ZN13MessageViewer7WebPage11qt_metacastEPKc@Base 4:16.04.0 - _ZN13MessageViewer7WebPage13setDoNotTrackEb@Base 4:16.04.0 - _ZN13MessageViewer7WebPage16staticMetaObjectE@Base 4:16.04.0 - _ZN13MessageViewer7WebPage23acceptNavigationRequestEP9QWebFrameRK15QNetworkRequestN8QWebPage14NavigationTypeE@Base 4:16.04.0 - _ZN13MessageViewer7WebPageC1EP7QWidget@Base 4:16.04.0 - _ZN13MessageViewer7WebPageC2EP7QWidget@Base 4:16.04.0 - _ZN13MessageViewer7WebPageD0Ev@Base 4:16.04.0 - _ZN13MessageViewer7WebPageD1Ev@Base 4:16.04.0 - _ZN13MessageViewer7WebPageD2Ev@Base 4:16.04.0 - _ZN13MessageViewer9CSSHelperC1EPK12QPaintDevice@Base 4:15.12 - _ZN13MessageViewer9CSSHelperC2EPK12QPaintDevice@Base 4:15.12 - _ZN13MessageViewer9CSSHelperD0Ev@Base 4:16.04.0 - _ZN13MessageViewer9CSSHelperD1Ev@Base 4:16.04.0 - _ZN13MessageViewer9CSSHelperD2Ev@Base 4:16.04.0 - _ZN13MessageViewer9Interface11MessagePart10htmlWriterEv@Base 4:16.04.0 - _ZN13MessageViewer9Interface11MessagePart4htmlEb@Base 4:16.04.0 - _ZN13MessageViewer9Interface11MessagePartC1ERKNS0_8BodyPartE@Base 4:16.04.0 - _ZN13MessageViewer9Interface11MessagePartC1Ev@Base 4:16.04.0 - _ZN13MessageViewer9Interface11MessagePartC2ERKNS0_8BodyPartE@Base 4:16.04.0 - _ZN13MessageViewer9Interface11MessagePartC2Ev@Base 4:16.04.0 - _ZN13MessageViewer9Interface11MessagePartD0Ev@Base 4:16.04.0 - _ZN13MessageViewer9Interface11MessagePartD1Ev@Base 4:16.04.0 - _ZN13MessageViewer9Interface11MessagePartD2Ev@Base 4:16.04.0 - (optional=templinst|arch=amd64 i386)_ZN5KMime7Content6headerINS_7Headers7SubjectEEEPT_b@Base 4:15.12 - (optional=templinst)_ZN7Akonadi4Item14setPayloadImplI14QSharedPointerIN5KMime7MessageEEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicEvE4typeERKS9_@Base 4:15.12 - (optional=templinst)_ZN7Akonadi4Item14setPayloadImplI14QSharedPointerIN8KCalCore9IncidenceEEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicEvE4typeERKS9_@Base 4:15.12 - (optional=templinst)_ZNK12KConfigGroup9readEntryI10QByteArrayEET_PKcRKS2_@Base 4:15.12 - (optional=templinst)_ZNK12KConfigGroup9readEntryI5QFontEET_PKcRKS2_@Base 4:15.12 - (optional=templinst)_ZNK12KConfigGroup9readEntryI5QSizeEET_PKcRKS2_@Base 4:15.12 - (optional=templinst)_ZNK12KConfigGroup9readEntryI6QColorEET_PKcRKS2_@Base 4:15.12 - (optional=templinst)_ZNK12KConfigGroup9readEntryIbEET_PKcRKS1_@Base 4:15.12 - (optional=templinst)_ZNK12KConfigGroup9readEntryIiEET_PKcRKS1_@Base 4:15.12 - _ZNK13MessageViewer10NodeHelper10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer10NodeHelper13extraContentsEPN5KMime7ContentE@Base 4:15.12 - _ZNK13MessageViewer10NodeHelper13nodeProcessedEPN5KMime7ContentE@Base 4:15.12 - _ZNK13MessageViewer10NodeHelper14signatureStateEPN5KMime7ContentE@Base 4:15.12 - _ZNK13MessageViewer10NodeHelper15bodyPartMementoEPN5KMime7ContentERK10QByteArray@Base 4:15.12 - _ZNK13MessageViewer10NodeHelper15encryptionStateEPN5KMime7ContentE@Base 4:15.12 - _ZNK13MessageViewer10NodeHelper15persistentIndexEPKN5KMime7ContentE@Base 4:15.12 - _ZNK13MessageViewer10NodeHelper16contentFromIndexEPN5KMime7ContentERK7QString@Base 4:15.12 - _ZNK13MessageViewer10NodeHelper21isNodeDisplayedHiddenEPN5KMime7ContentE@Base 4:15.12 - _ZNK13MessageViewer10NodeHelper21overallSignatureStateEPN5KMime7ContentE@Base 4:15.12 - _ZNK13MessageViewer10NodeHelper22overallEncryptionStateEPN5KMime7ContentE@Base 4:15.12 - _ZNK13MessageViewer10NodeHelper23decryptedNodeForContentEPN5KMime7ContentE@Base 4:15.12 - _ZNK13MessageViewer10NodeHelper23isNodeDisplayedEmbeddedEPN5KMime7ContentE@Base 4:15.12 - _ZNK13MessageViewer10NodeHelper26attachmentsOfExtraContentsEv@Base 4:15.12 - _ZNK13MessageViewer10NodeHelper6asHREFEPKN5KMime7ContentERK7QString@Base 4:15.12 - _ZNK13MessageViewer10NodeHelper8fromHREFERK14QSharedPointerIN5KMime7MessageEERK4QUrl@Base 4:15.12 - _ZNK13MessageViewer11EmptySource10levelQuoteEv@Base 4:16.04.0 - _ZNK13MessageViewer11EmptySource13showEmoticonsEv@Base 4:16.04.0 - _ZNK13MessageViewer11EmptySource14autoImportKeysEv@Base 4:16.04.0 - _ZNK13MessageViewer11EmptySource14decryptMessageEv@Base 4:16.04.0 - _ZNK13MessageViewer11EmptySource16htmlLoadExternalEv@Base 4:16.04.0 - _ZNK13MessageViewer11EmptySource20showExpandQuotesMarkEv@Base 4:16.04.0 - _ZNK13MessageViewer11EmptySource20showSignatureDetailsEv@Base 4:16.04.0 - _ZNK13MessageViewer11EmptySource8htmlMailEv@Base 4:16.04.0 - _ZNK13MessageViewer11FindBarBase10metaObjectEv@Base 4:16.04.0 - _ZNK13MessageViewer11FindBarBase4textEv@Base 4:16.04.0 - _ZNK13MessageViewer11HeaderStyle10allowAsyncEv@Base 4:15.12 - _ZNK13MessageViewer11HeaderStyle10isPrintingEv@Base 4:15.12 - _ZNK13MessageViewer11HeaderStyle10isTopLevelEv@Base 4:15.12 - _ZNK13MessageViewer11HeaderStyle10nodeHelperEv@Base 4:15.12 - _ZNK13MessageViewer11HeaderStyle11messagePathEv@Base 4:15.12 - _ZNK13MessageViewer11HeaderStyle12sourceObjectEv@Base 4:15.12 - _ZNK13MessageViewer11HeaderStyle13messageStatusEv@Base 4:15.12 - _ZNK13MessageViewer11HeaderStyle14collectionNameEv@Base 4:16.04.0 - _ZNK13MessageViewer11HeaderStyle14headerStrategyEv@Base 4:15.12 - _ZNK13MessageViewer11HeaderStyle15readOnlyMessageEv@Base 4:16.04.0 - _ZNK13MessageViewer11HeaderStyle22hasAttachmentQuickListEv@Base 4:15.12 - _ZNK13MessageViewer11HeaderStyle5themeEv@Base 4:15.12 - _ZNK13MessageViewer11HeaderStyle9vCardNameEv@Base 4:15.12 - _ZNK13MessageViewer11MailWebView10htmlSourceEv@Base 4:15.12 - _ZNK13MessageViewer11MailWebView10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer11MailWebView16linkOrImageUrlAtERK6QPoint@Base 4:15.12 - _ZNK13MessageViewer11MailWebView16relativePositionEv@Base 4:15.12 - _ZNK13MessageViewer11MailWebView18isScrolledToBottomEv@Base 4:15.12 - _ZNK13MessageViewer11MailWebView20hasVerticalScrollBarEv@Base 4:15.12 - _ZNK13MessageViewer11MailWebView26isAttachmentInjectionPointERK6QPoint@Base 4:15.12 - _ZNK13MessageViewer12ViewerPlugin10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer13CSSHelperBase10quoteColorEi@Base 4:16.04.0 - _ZNK13MessageViewer13CSSHelperBase12pgpWarnColorEv@Base 4:15.12 - _ZNK13MessageViewer13CSSHelperBase12quoteFontTagEi@Base 4:15.12 - _ZNK13MessageViewer13CSSHelperBase14cssDefinitionsEb@Base 4:15.12 - _ZNK13MessageViewer13CSSHelperBase14quoteColorNameEi@Base 4:16.04.0 - _ZNK13MessageViewer13CSSHelperBase16addEndBlockQuoteEi@Base 4:16.04.0 - _ZNK13MessageViewer13CSSHelperBase16nonQuotedFontTagEv@Base 4:15.12 - _ZNK13MessageViewer13CSSHelperBase18addStartBlockQuoteEi@Base 4:16.04.0 - _ZNK13MessageViewer13CSSHelperBase18quoteCssDefinitionEv@Base 4:16.04.0 - _ZNK13MessageViewer13CSSHelperBase19printCssDefinitionsEb@Base 4:15.12 - _ZNK13MessageViewer13CSSHelperBase20commonCssDefinitionsEv@Base 4:15.12 - _ZNK13MessageViewer13CSSHelperBase20screenCssDefinitionsEPKS0_b@Base 4:15.12 - _ZNK13MessageViewer13CSSHelperBase8bodyFontEbb@Base 4:15.12 - _ZNK13MessageViewer13CSSHelperBase8fontSizeEbb@Base 4:15.12 - _ZNK13MessageViewer13CSSHelperBase8htmlHeadEb@Base 4:15.12 - _ZNK13MessageViewer13CreateNoteJob10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer13CreateTodoJob10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer13EditorWatcher10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer13EditorWatcher11fileChangedEv@Base 4:15.12 - _ZNK13MessageViewer13EditorWatcher3urlEv@Base 4:15.12 - _ZNK13MessageViewer13IconNameCache5EntryltERKS1_@Base 4:16.04.0 - _ZNK13MessageViewer13IconNameCache8iconPathERK7QStringi@Base 4:16.04.0 - _ZNK13MessageViewer13ProcessResult18neverDisplayInlineEv@Base 4:15.12 - _ZNK13MessageViewer13ProcessResult20inlineSignatureStateEv@Base 4:15.12 - _ZNK13MessageViewer13ProcessResult21inlineEncryptionStateEv@Base 4:15.12 - _ZNK13MessageViewer13ProcessResult24adjustCryptoStatesOfNodeEPN5KMime7ContentE@Base 4:15.12 - _ZNK13MessageViewer13ProcessResult7isImageEv@Base 4:15.12 - _ZNK13MessageViewer13ScamDetection10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer13ScamDetection17scamCheckShortUrlEv@Base 4:15.12 - _ZNK13MessageViewer14AdBlockManager10metaObjectEv@Base 4:16.04.0 - _ZNK13MessageViewer14CreateEventJob10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer14FindBarWebView10metaObjectEv@Base 4:16.04.0 - _ZNK13MessageViewer14HeaderStrategy10showHeaderERK7QString@Base 4:15.12 - _ZNK13MessageViewer14HeaderStrategy13headersToHideEv@Base 4:15.12 - _ZNK13MessageViewer14HeaderStrategy16headersToDisplayEv@Base 4:15.12 - _ZNK13MessageViewer14ZoomActionMenu10metaObjectEv@Base 4:16.04.0 - _ZNK13MessageViewer14ZoomActionMenu10zoomFactorEv@Base 4:16.04.0 - _ZNK13MessageViewer14ZoomActionMenu12zoomInActionEv@Base 4:16.04.0 - _ZNK13MessageViewer14ZoomActionMenu12zoomTextOnlyEv@Base 4:16.04.0 - _ZNK13MessageViewer14ZoomActionMenu13zoomOutActionEv@Base 4:16.04.0 - _ZNK13MessageViewer14ZoomActionMenu15zoomResetActionEv@Base 4:16.04.0 - _ZNK13MessageViewer14ZoomActionMenu18zoomTextOnlyActionEv@Base 4:16.04.0 - _ZNK13MessageViewer15ConfigureWidget10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer15HeaderStyleUtil10dateStringEPN5KMime7MessageEbNS0_25HeaderStyleUtilDateFormatE@Base 4:16.04.0 - _ZNK13MessageViewer15HeaderStyleUtil10mailActionENS_6Viewer10MailActionE@Base 4:16.04.0 - _ZNK13MessageViewer15HeaderStyleUtil10spamStatusEPN5KMime7MessageE@Base 4:16.04.0 - _ZNK13MessageViewer15HeaderStyleUtil11directionOfERK7QString@Base 4:16.04.0 - _ZNK13MessageViewer15HeaderStyleUtil12dateShortStrERK9QDateTime@Base 4:16.04.0 - _ZNK13MessageViewer15HeaderStyleUtil12imgToDataUrlERK6QImage@Base 4:16.04.0 - _ZNK13MessageViewer15HeaderStyleUtil12resentToListEPN5KMime7MessageE@Base 4:16.04.0 - _ZNK13MessageViewer15HeaderStyleUtil13drawSpamMeterENS_9SpamErrorEddRK7QStringS4_@Base 4:16.04.0 - _ZNK13MessageViewer15HeaderStyleUtil13subjectStringEPN5KMime7MessageE6QFlagsIN11KTextToHTML6OptionEE@Base 4:16.04.0 - _ZNK13MessageViewer15HeaderStyleUtil14resentFromListEPN5KMime7MessageE@Base 4:16.04.0 - _ZNK13MessageViewer15HeaderStyleUtil19updateXFaceSettingsE6QImageRNS0_13xfaceSettingsE@Base 4:16.04.0 - _ZNK13MessageViewer15HeaderStyleUtil22subjectDirectionStringEPN5KMime7MessageE@Base 4:16.04.0 - _ZNK13MessageViewer15HeaderStyleUtil5xfaceEPKNS_11HeaderStyleEPN5KMime7MessageE@Base 4:16.04.0 - _ZNK13MessageViewer15HeaderStyleUtil7dateStrERK9QDateTime@Base 4:16.04.0 - _ZNK13MessageViewer15HeaderStyleUtil9strToHtmlERK7QString6QFlagsIN11KTextToHTML6OptionEE@Base 4:16.04.0 - _ZNK13MessageViewer16ObjectTreeParser10allowAsyncEv@Base 4:15.12 - _ZNK13MessageViewer16ObjectTreeParser10htmlWriterEv@Base 4:15.12 - _ZNK13MessageViewer16ObjectTreeParser10nodeHelperEv@Base 4:15.12 - _ZNK13MessageViewer16ObjectTreeParser11htmlContentEv@Base 4:15.12 - _ZNK13MessageViewer16ObjectTreeParser14cryptoProtocolEv@Base 4:15.12 - _ZNK13MessageViewer16ObjectTreeParser16plainTextContentEv@Base 4:15.12 - _ZNK13MessageViewer16ObjectTreeParser18attachmentStrategyEv@Base 4:15.12 - _ZNK13MessageViewer16ObjectTreeParser18htmlContentCharsetEv@Base 4:15.12 - _ZNK13MessageViewer16ObjectTreeParser18looksLikeParaBreakERK7QStringj@Base 4:15.12 - _ZNK13MessageViewer16ObjectTreeParser19hasPendingAsyncJobsEv@Base 4:15.12 - _ZNK13MessageViewer16ObjectTreeParser19showOnlyOneMimePartEv@Base 4:15.12 - _ZNK13MessageViewer16ObjectTreeParser23plainTextContentCharsetEv@Base 4:15.12 - _ZNK13MessageViewer16ObjectTreeParser8codecForEPN5KMime7ContentE@Base 4:15.12 - _ZNK13MessageViewer16ObjectTreeParser8printingEv@Base 4:16.04.0 - _ZNK13MessageViewer16ObjectTreeParser9cssHelperEv@Base 4:15.12 - _ZNK13MessageViewer16PlainHeaderStyle23formatAllMessageHeadersEPN5KMime7MessageE@Base 4:15.12 - _ZNK13MessageViewer16PlainHeaderStyle4nameEv@Base 4:15.12 - _ZNK13MessageViewer16PlainHeaderStyle6formatEPN5KMime7MessageE@Base 4:15.12 - _ZNK13MessageViewer16PrintingSettings10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer16ScamExpandUrlJob10metaObjectEv@Base 4:16.04.0 - _ZNK13MessageViewer16WebViewAccessKey10metaObjectEv@Base 4:16.04.0 - _ZNK13MessageViewer17HeaderStylePlugin10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer17HeaderStylePlugin14elidedTextSizeEv@Base 4:15.12 - _ZNK13MessageViewer17HeaderStylePlugin9alignmentEv@Base 4:15.12 - _ZNK13MessageViewer17HeaderStylePlugin9hasMarginEv@Base 4:15.12 - _ZNK13MessageViewer17ScamCheckShortUrl10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer18AttachmentStrategy30requiresAttachmentListInHeaderEv@Base 4:15.12 - _ZNK13MessageViewer18InvitationSettings10helpAnchorEv@Base 4:15.12 - _ZNK13MessageViewer18InvitationSettings10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer19GrantleeHeaderStyle22hasAttachmentQuickListEv@Base 4:15.12 - _ZNK13MessageViewer19GrantleeHeaderStyle4nameEv@Base 4:15.12 - _ZNK13MessageViewer19GrantleeHeaderStyle6formatEPN5KMime7MessageE@Base 4:15.12 - _ZNK13MessageViewer19ViewerPluginManager10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer19ViewerPluginManager10pluginNameEv@Base 4:16.04.0 - _ZNK13MessageViewer19ViewerPluginManager11pluginsListEv@Base 4:15.12 - _ZNK13MessageViewer19ViewerPluginManager15serviceTypeNameEv@Base 4:16.04.0 - _ZNK13MessageViewer20AdBlockSettingWidget10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer20AdBlockSettingWidget7changedEv@Base 4:15.12 - _ZNK13MessageViewer20HeaderStyleInterface10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer20HeaderStyleInterface17headerStylePluginEv@Base 4:15.12 - _ZNK13MessageViewer20HeaderStyleInterface6actionEv@Base 4:15.12 - _ZNK13MessageViewer21MessageViewerSettings10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer21ViewerPluginInterface10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer21ViewerPluginInterface6actionEv@Base 4:15.12 - _ZNK13MessageViewer22HeaderStyleMenuManager10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer22HeaderStyleMenuManager4menuEv@Base 4:15.12 - _ZNK13MessageViewer22MarkMessageReadHandler10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer23GrantleeHeaderFormatter6formatERK7QStringRK14QSharedPointerIN8Grantlee12TemplateImplEERK11QStringListbPKNS_11HeaderStyleEPN5KMime7MessageE@Base 4:15.12 - _ZNK13MessageViewer23GrantleeHeaderFormatter6toHtmlERK11QStringListRK7QStringS6_PKNS_11HeaderStyleEPN5KMime7MessageEb@Base 4:15.12 - _ZNK13MessageViewer23GrantleeHeaderFormatter6toHtmlERKN13GrantleeTheme5ThemeEbPKNS_11HeaderStyleEPN5KMime7MessageE@Base 4:15.12 - _ZNK13MessageViewer23GrantleeHeaderTestStyle22hasAttachmentQuickListEv@Base 4:15.12 - _ZNK13MessageViewer23GrantleeHeaderTestStyle4nameEv@Base 4:15.12 - _ZNK13MessageViewer23GrantleeHeaderTestStyle6formatEPN5KMime7MessageE@Base 4:15.12 - _ZNK13MessageViewer23ViewerPluginToolManager10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer23ViewerPluginToolManager10pluginNameEv@Base 4:16.04.0 - _ZNK13MessageViewer23ViewerPluginToolManager15serviceTypeNameEv@Base 4:16.04.0 - _ZNK13MessageViewer23ViewerPluginToolManager22viewerPluginActionListE6QFlagsINS_21ViewerPluginInterface19SpecificFeatureTypeEE@Base 4:15.12 - _ZNK13MessageViewer24HeaderStylePluginManager10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer24HeaderStylePluginManager11pluginsListEv@Base 4:15.12 - _ZNK13MessageViewer24HeaderStylePluginManager14pluginListNameEv@Base 4:15.12 - _ZNK13MessageViewer24ScamCheckShortUrlManager10metaObjectEv@Base 4:16.04.0 - _ZNK13MessageViewer24ScamCheckShortUrlManager17scamCheckShortUrlEv@Base 4:16.04.0 - _ZNK13MessageViewer26ScamDetectionWarningWidget10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer27AdBlockBlockableItemsDialog10metaObjectEv@Base 4:16.04.0 - _ZNK13MessageViewer27AdBlockBlockableItemsWidget10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer28BodyPartFormatterBaseFactory15subtypeRegistryEPKc@Base 4:16.04.0 - _ZNK13MessageViewer28BodyPartFormatterBaseFactory17createForIteratorEPKcS2_@Base 4:16.04.0 - _ZNK13MessageViewer28BodyPartFormatterBaseFactory9createForEPKcS2_@Base 4:16.04.0 - _ZNK13MessageViewer28BodyPartFormatterBaseFactory9createForERK10QByteArrayS3_@Base 4:16.04.0 - _ZNK13MessageViewer28BodyPartFormatterBaseFactory9createForERK7QStringS3_@Base 4:16.04.0 - _ZNK13MessageViewer29MessageDisplayFormatAttribute10serializedEv@Base 4:15.12 - _ZNK13MessageViewer29MessageDisplayFormatAttribute13messageFormatEv@Base 4:15.12 - _ZNK13MessageViewer29MessageDisplayFormatAttribute13remoteContentEv@Base 4:15.12 - _ZNK13MessageViewer29MessageDisplayFormatAttribute4typeEv@Base 4:15.12 - _ZNK13MessageViewer29MessageDisplayFormatAttribute5cloneEv@Base 4:15.12 - _ZNK13MessageViewer29MessageDisplayFormatAttributeeqERKS0_@Base 4:15.12 - _ZNK13MessageViewer31AdBlockAutomaticRulesListWidget10metaObjectEv@Base 4:16.04.0 - _ZNK13MessageViewer31AdBlockAutomaticRulesListWidget13disabledRulesEv@Base 4:16.04.0 - _ZNK13MessageViewer6KXFace10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer10blockImageEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer10copyActionEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer10metaObjectEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer10urlClickedEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer11isFixedFontEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer11messageItemEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer11messagePathEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer12saveAsActionEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer12selectedTextEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer12zoomTextOnlyEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer13copyURLActionEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer13urlOpenActionEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer14adblockEnabledEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer15imageUrlClickedEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer15selectAllActionEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer15speakTextActionEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer16htmlLoadExternalEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer16messageTreeModelEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer16overrideEncodingEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer16viewSourceActionEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer17copyImageLocationEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer17headerStylePluginEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer18attachmentStrategyEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer18openBlockableItemsEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer19findInMessageActionEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer19htmlLoadExtOverrideEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer19mimePartTreeIsEmptyEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer19shareServiceUrlMenuEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer19toggleFixFontActionEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer24toggleMimePartTreeActionEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer29displayFormatMessageOverwriteEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer30saveMessageDisplayFormatActionEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer31resetMessageDisplayFormatActionEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer7messageEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer8atBottomEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer8htmlMailEv@Base 4:15.12 - _ZNK13MessageViewer6Viewer9cssHelperEv@Base 4:15.12 - _ZNK13MessageViewer7WebPage10loadingUrlEv@Base 4:16.04.0 - _ZNK13MessageViewer7WebPage10metaObjectEv@Base 4:16.04.0 - _ZNK13MessageViewer9CSSHelper8htmlHeadEb@Base 4:15.12 - _ZNK13MessageViewer9Interface11MessagePart4textEv@Base 4:16.04.0 - _ZNK13MessageViewer9Interface17BodyPartFormatter7processERNS0_8BodyPartE@Base 4:16.04.0 - (optional=templinst)_ZNK7Akonadi4Item10hasPayloadI14QSharedPointerIN5KMime7MessageEEEEbv@Base 4:15.12 - (optional=templinst)_ZNK7Akonadi4Item11payloadImplI14QSharedPointerIN5KMime7MessageEEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicES9_E4typeEv@Base 4:15.12 - (optional=templinst)_ZNK7Akonadi4Item14hasPayloadImplI14QSharedPointerIN5KMime7MessageEEEENSt9enable_ifIXntsrNS_8Internal12PayloadTraitIT_EE13isPolymorphicEbE4typeEv@Base 4:15.12 - (optional=templinst)_ZNK7Akonadi4Item14tryToCloneImplI14QSharedPointerIN5KMime7MessageEESt10shared_ptrIS4_EEENSt9enable_ifIXntsrSt7is_sameIT_T0_E5valueEbE4typeEPSA_PKi@Base 4:15.12 - (optional=templinst)_ZNK7Akonadi4Item7payloadI14QSharedPointerIN5KMime7MessageEEEET_v@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EED1Ev@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME3KeyESaIS1_EED2Ev@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME6ImportESaIS1_EED1Ev@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME6ImportESaIS1_EED2Ev@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME9SignatureESaIS1_EED1Ev@Base 4:15.12 - (optional=templinst)_ZNSt6vectorIN5GpgME9SignatureESaIS1_EED2Ev@Base 4:15.12 - _ZTIN13MessageViewer10NodeHelperE@Base 4:15.12 - _ZTIN13MessageViewer11EmptySourceE@Base 4:15.12 - _ZTIN13MessageViewer11FindBarBaseE@Base 4:16.04.0 - _ZTIN13MessageViewer11HeaderStyleE@Base 4:15.12 - _ZTIN13MessageViewer11MailWebViewE@Base 4:15.12 - _ZTIN13MessageViewer12ViewerPluginE@Base 4:15.12 - _ZTIN13MessageViewer13CSSHelperBaseE@Base 4:16.04.0 - _ZTIN13MessageViewer13CreateNoteJobE@Base 4:15.12 - _ZTIN13MessageViewer13CreateTodoJobE@Base 4:15.12 - _ZTIN13MessageViewer13EditorWatcherE@Base 4:15.12 - _ZTIN13MessageViewer13ScamDetectionE@Base 4:15.12 - _ZTIN13MessageViewer14AdBlockManagerE@Base 4:16.04.0 - _ZTIN13MessageViewer14CreateEventJobE@Base 4:15.12 - _ZTIN13MessageViewer14FileHtmlWriterE@Base 4:15.12 - _ZTIN13MessageViewer14FindBarWebViewE@Base 4:16.04.0 - _ZTIN13MessageViewer14HeaderStrategyE@Base 4:15.12 - _ZTIN13MessageViewer14ZoomActionMenuE@Base 4:16.04.0 - _ZTIN13MessageViewer15ConfigureWidgetE@Base 4:15.12 - _ZTIN13MessageViewer15QueueHtmlWriterE@Base 4:15.12 - _ZTIN13MessageViewer16ObjectTreeParserE@Base 4:15.12 - _ZTIN13MessageViewer16PlainHeaderStyleE@Base 4:15.12 - _ZTIN13MessageViewer16PrintingSettingsE@Base 4:15.12 - _ZTIN13MessageViewer16ScamExpandUrlJobE@Base 4:16.04.0 - _ZTIN13MessageViewer16WebViewAccessKeyE@Base 4:16.04.0 - _ZTIN13MessageViewer17HeaderStylePluginE@Base 4:15.12 - _ZTIN13MessageViewer17ScamCheckShortUrlE@Base 4:15.12 - _ZTIN13MessageViewer18AttachmentStrategyE@Base 4:15.12 - _ZTIN13MessageViewer18InvitationSettingsE@Base 4:15.12 - _ZTIN13MessageViewer18ObjectTreeSourceIfE@Base 4:15.12 - _ZTIN13MessageViewer18RichHeaderStrategyE@Base 4:15.12 - _ZTIN13MessageViewer19GrantleeHeaderStyleE@Base 4:15.12 - _ZTIN13MessageViewer19ViewerPluginManagerE@Base 4:15.12 - _ZTIN13MessageViewer20AdBlockSettingWidgetE@Base 4:15.12 - _ZTIN13MessageViewer20HeaderStyleInterfaceE@Base 4:15.12 - _ZTIN13MessageViewer21MessageViewerSettingsE@Base 4:15.12 - _ZTIN13MessageViewer21ViewerPluginInterfaceE@Base 4:15.12 - _ZTIN13MessageViewer22HeaderStyleMenuManagerE@Base 4:15.12 - _ZTIN13MessageViewer22MarkMessageReadHandlerE@Base 4:15.12 - _ZTIN13MessageViewer23GrantleeHeaderTestStyleE@Base 4:15.12 - _ZTIN13MessageViewer23ViewerPluginToolManagerE@Base 4:15.12 - _ZTIN13MessageViewer24BodyPartFormatterFactoryE@Base 4:16.04.0 - _ZTIN13MessageViewer24HeaderStylePluginManagerE@Base 4:15.12 - _ZTIN13MessageViewer24ScamCheckShortUrlManagerE@Base 4:16.04.0 - _ZTIN13MessageViewer25MessageViewerSettingsBaseE@Base 4:15.12 - _ZTIN13MessageViewer26ScamDetectionWarningWidgetE@Base 4:15.12 - _ZTIN13MessageViewer27AdBlockBlockableItemsDialogE@Base 4:16.04.0 - _ZTIN13MessageViewer27AdBlockBlockableItemsWidgetE@Base 4:15.12 - _ZTIN13MessageViewer28BodyPartFormatterBaseFactoryE@Base 4:16.04.0 - _ZTIN13MessageViewer29MessageDisplayFormatAttributeE@Base 4:15.12 - _ZTIN13MessageViewer31AdBlockAutomaticRulesListWidgetE@Base 4:16.04.0 - _ZTIN13MessageViewer6KXFaceE@Base 4:15.12 - _ZTIN13MessageViewer6ViewerE@Base 4:15.12 - _ZTIN13MessageViewer7WebPageE@Base 4:16.04.0 - _ZTIN13MessageViewer9CSSHelperE@Base 4:16.04.0 - _ZTIN13MessageViewer9Interface11MessagePartE@Base 4:16.04.0 - _ZTIN13MessageViewer9Interface17BodyPartFormatterE@Base 4:16.04.0 - _ZTIN5boost16exception_detail10clone_baseE@Base 4:15.12 - _ZTIN5boost9exceptionE@Base 4:15.12 - _ZTSN13MessageViewer10NodeHelperE@Base 4:15.12 - _ZTSN13MessageViewer11EmptySourceE@Base 4:15.12 - _ZTSN13MessageViewer11FindBarBaseE@Base 4:16.04.0 - _ZTSN13MessageViewer11HeaderStyleE@Base 4:15.12 - _ZTSN13MessageViewer11MailWebViewE@Base 4:15.12 - _ZTSN13MessageViewer12ViewerPluginE@Base 4:15.12 - _ZTSN13MessageViewer13CSSHelperBaseE@Base 4:16.04.0 - _ZTSN13MessageViewer13CreateNoteJobE@Base 4:15.12 - _ZTSN13MessageViewer13CreateTodoJobE@Base 4:15.12 - _ZTSN13MessageViewer13EditorWatcherE@Base 4:15.12 - _ZTSN13MessageViewer13ScamDetectionE@Base 4:15.12 - _ZTSN13MessageViewer14AdBlockManagerE@Base 4:16.04.0 - _ZTSN13MessageViewer14CreateEventJobE@Base 4:15.12 - _ZTSN13MessageViewer14FileHtmlWriterE@Base 4:15.12 - _ZTSN13MessageViewer14FindBarWebViewE@Base 4:16.04.0 - _ZTSN13MessageViewer14HeaderStrategyE@Base 4:15.12 - _ZTSN13MessageViewer14ZoomActionMenuE@Base 4:16.04.0 - _ZTSN13MessageViewer15ConfigureWidgetE@Base 4:15.12 - _ZTSN13MessageViewer15QueueHtmlWriterE@Base 4:15.12 - _ZTSN13MessageViewer16ObjectTreeParserE@Base 4:15.12 - _ZTSN13MessageViewer16PlainHeaderStyleE@Base 4:15.12 - _ZTSN13MessageViewer16PrintingSettingsE@Base 4:15.12 - _ZTSN13MessageViewer16ScamExpandUrlJobE@Base 4:16.04.0 - _ZTSN13MessageViewer16WebViewAccessKeyE@Base 4:16.04.0 - _ZTSN13MessageViewer17HeaderStylePluginE@Base 4:15.12 - _ZTSN13MessageViewer17ScamCheckShortUrlE@Base 4:15.12 - _ZTSN13MessageViewer18AttachmentStrategyE@Base 4:15.12 - _ZTSN13MessageViewer18InvitationSettingsE@Base 4:15.12 - _ZTSN13MessageViewer18ObjectTreeSourceIfE@Base 4:15.12 - _ZTSN13MessageViewer18RichHeaderStrategyE@Base 4:15.12 - _ZTSN13MessageViewer19GrantleeHeaderStyleE@Base 4:15.12 - _ZTSN13MessageViewer19ViewerPluginManagerE@Base 4:15.12 - _ZTSN13MessageViewer20AdBlockSettingWidgetE@Base 4:15.12 - _ZTSN13MessageViewer20HeaderStyleInterfaceE@Base 4:15.12 - _ZTSN13MessageViewer21MessageViewerSettingsE@Base 4:15.12 - _ZTSN13MessageViewer21ViewerPluginInterfaceE@Base 4:15.12 - _ZTSN13MessageViewer22HeaderStyleMenuManagerE@Base 4:15.12 - _ZTSN13MessageViewer22MarkMessageReadHandlerE@Base 4:15.12 - _ZTSN13MessageViewer23GrantleeHeaderTestStyleE@Base 4:15.12 - _ZTSN13MessageViewer23ViewerPluginToolManagerE@Base 4:15.12 - _ZTSN13MessageViewer24BodyPartFormatterFactoryE@Base 4:16.04.0 - _ZTSN13MessageViewer24HeaderStylePluginManagerE@Base 4:15.12 - _ZTSN13MessageViewer24ScamCheckShortUrlManagerE@Base 4:16.04.0 - _ZTSN13MessageViewer25MessageViewerSettingsBaseE@Base 4:15.12 - _ZTSN13MessageViewer26ScamDetectionWarningWidgetE@Base 4:15.12 - _ZTSN13MessageViewer27AdBlockBlockableItemsDialogE@Base 4:16.04.0 - _ZTSN13MessageViewer27AdBlockBlockableItemsWidgetE@Base 4:15.12 - _ZTSN13MessageViewer28BodyPartFormatterBaseFactoryE@Base 4:16.04.0 - _ZTSN13MessageViewer29MessageDisplayFormatAttributeE@Base 4:15.12 - _ZTSN13MessageViewer31AdBlockAutomaticRulesListWidgetE@Base 4:16.04.0 - _ZTSN13MessageViewer6KXFaceE@Base 4:15.12 - _ZTSN13MessageViewer6ViewerE@Base 4:15.12 - _ZTSN13MessageViewer7WebPageE@Base 4:16.04.0 - _ZTSN13MessageViewer9CSSHelperE@Base 4:16.04.0 - _ZTSN13MessageViewer9Interface11MessagePartE@Base 4:16.04.0 - _ZTSN13MessageViewer9Interface17BodyPartFormatterE@Base 4:16.04.0 - _ZTSN5boost16exception_detail10clone_baseE@Base 4:15.12 - _ZTSN5boost9exceptionE@Base 4:15.12 - _ZTVN13MessageViewer10NodeHelperE@Base 4:15.12 - _ZTVN13MessageViewer11EmptySourceE@Base 4:15.12 - _ZTVN13MessageViewer11FindBarBaseE@Base 4:16.04.0 - _ZTVN13MessageViewer11HeaderStyleE@Base 4:15.12 - _ZTVN13MessageViewer11MailWebViewE@Base 4:15.12 - _ZTVN13MessageViewer12ViewerPluginE@Base 4:15.12 - _ZTVN13MessageViewer13CSSHelperBaseE@Base 4:16.04.0 - _ZTVN13MessageViewer13CreateNoteJobE@Base 4:15.12 - _ZTVN13MessageViewer13CreateTodoJobE@Base 4:15.12 - _ZTVN13MessageViewer13EditorWatcherE@Base 4:15.12 - _ZTVN13MessageViewer13ScamDetectionE@Base 4:15.12 - _ZTVN13MessageViewer14AdBlockManagerE@Base 4:16.04.0 - _ZTVN13MessageViewer14CreateEventJobE@Base 4:15.12 - _ZTVN13MessageViewer14FileHtmlWriterE@Base 4:15.12 - _ZTVN13MessageViewer14FindBarWebViewE@Base 4:16.04.0 - _ZTVN13MessageViewer14HeaderStrategyE@Base 4:15.12 - _ZTVN13MessageViewer14ZoomActionMenuE@Base 4:16.04.0 - _ZTVN13MessageViewer15ConfigureWidgetE@Base 4:15.12 - _ZTVN13MessageViewer15QueueHtmlWriterE@Base 4:15.12 - _ZTVN13MessageViewer16ObjectTreeParserE@Base 4:15.12 - _ZTVN13MessageViewer16PlainHeaderStyleE@Base 4:15.12 - _ZTVN13MessageViewer16PrintingSettingsE@Base 4:15.12 - _ZTVN13MessageViewer16ScamExpandUrlJobE@Base 4:16.04.0 - _ZTVN13MessageViewer16WebViewAccessKeyE@Base 4:16.04.0 - _ZTVN13MessageViewer17HeaderStylePluginE@Base 4:15.12 - _ZTVN13MessageViewer17ScamCheckShortUrlE@Base 4:15.12 - _ZTVN13MessageViewer18AttachmentStrategyE@Base 4:15.12 - _ZTVN13MessageViewer18InvitationSettingsE@Base 4:15.12 - _ZTVN13MessageViewer18RichHeaderStrategyE@Base 4:15.12 - _ZTVN13MessageViewer19GrantleeHeaderStyleE@Base 4:15.12 - _ZTVN13MessageViewer19ViewerPluginManagerE@Base 4:15.12 - _ZTVN13MessageViewer20AdBlockSettingWidgetE@Base 4:15.12 - _ZTVN13MessageViewer20HeaderStyleInterfaceE@Base 4:15.12 - _ZTVN13MessageViewer21MessageViewerSettingsE@Base 4:15.12 - _ZTVN13MessageViewer21ViewerPluginInterfaceE@Base 4:15.12 - _ZTVN13MessageViewer22HeaderStyleMenuManagerE@Base 4:15.12 - _ZTVN13MessageViewer22MarkMessageReadHandlerE@Base 4:15.12 - _ZTVN13MessageViewer23GrantleeHeaderTestStyleE@Base 4:15.12 - _ZTVN13MessageViewer23ViewerPluginToolManagerE@Base 4:15.12 - _ZTVN13MessageViewer24BodyPartFormatterFactoryE@Base 4:16.04.0 - _ZTVN13MessageViewer24HeaderStylePluginManagerE@Base 4:15.12 - _ZTVN13MessageViewer24ScamCheckShortUrlManagerE@Base 4:16.04.0 - _ZTVN13MessageViewer25MessageViewerSettingsBaseE@Base 4:15.12 - _ZTVN13MessageViewer26ScamDetectionWarningWidgetE@Base 4:15.12 - _ZTVN13MessageViewer27AdBlockBlockableItemsDialogE@Base 4:16.04.0 - _ZTVN13MessageViewer27AdBlockBlockableItemsWidgetE@Base 4:15.12 - _ZTVN13MessageViewer28BodyPartFormatterBaseFactoryE@Base 4:16.04.0 - _ZTVN13MessageViewer29MessageDisplayFormatAttributeE@Base 4:15.12 - _ZTVN13MessageViewer31AdBlockAutomaticRulesListWidgetE@Base 4:16.04.0 - _ZTVN13MessageViewer6KXFaceE@Base 4:15.12 - _ZTVN13MessageViewer6ViewerE@Base 4:15.12 - _ZTVN13MessageViewer7WebPageE@Base 4:16.04.0 - _ZTVN13MessageViewer9CSSHelperE@Base 4:16.04.0 - _ZTVN13MessageViewer9Interface11MessagePartE@Base 4:16.04.0 - _ZTVN13MessageViewer9Interface17BodyPartFormatterE@Base 4:16.04.0 - _ZTVN5boost16exception_detail10clone_baseE@Base 4:15.12 - _ZTVN5boost9exceptionE@Base 4:15.12 - _ZZZN11MessageCore23MessageCoreSettingsBase28setOverrideCharacterEncodingERK7QStringENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN13MessageViewer25MessageViewerSettingsBase15setMimeTreeModeEiENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN13MessageViewer25MessageViewerSettingsBase15setUseFixedFontEbENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN13MessageViewer25MessageViewerSettingsBase15setZoomTextOnlyEbENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN13MessageViewer25MessageViewerSettingsBase17setMimePaneHeightEiENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN13MessageViewer25MessageViewerSettingsBase20setMessagePaneHeightEiENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN13MessageViewer25MessageViewerSettingsBase21setAttachmentStrategyERK7QStringENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN13MessageViewer25MessageViewerSettingsBase23setScamDetectionEnabledEbENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN13MessageViewer25MessageViewerSettingsBase24setHeaderPluginStyleNameERK7QStringENKUlvE_clEvE15qstring_literal@Base 4:15.12 - _ZZZN13MessageViewer25MessageViewerSettingsBase25setScamDetectionWhiteListERK11QStringListENKUlvE_clEvE15qstring_literal@Base 4:15.12 - (c++)"non-virtual thunk to MessageViewer::AdBlockAutomaticRulesListWidget::~AdBlockAutomaticRulesListWidget()@Base" 4:16.04.0 - (c++)"non-virtual thunk to MessageViewer::AdBlockBlockableItemsDialog::~AdBlockBlockableItemsDialog()@Base" 4:16.04.0 - (c++)"non-virtual thunk to MessageViewer::AdBlockBlockableItemsWidget::~AdBlockBlockableItemsWidget()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageViewer::AdBlockSettingWidget::~AdBlockSettingWidget()@Base" 4:16.04.0 - (c++)"non-virtual thunk to MessageViewer::ConfigureWidget::~ConfigureWidget()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageViewer::FindBarBase::~FindBarBase()@Base" 4:16.04.0 - (c++)"non-virtual thunk to MessageViewer::FindBarWebView::~FindBarWebView()@Base" 4:16.04.0 - (c++)"non-virtual thunk to MessageViewer::InvitationSettings::~InvitationSettings()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageViewer::MailWebView::~MailWebView()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageViewer::MarkMessageReadHandler::setItem(Akonadi::Item const&)@Base" 4:15.12 - (c++)"non-virtual thunk to MessageViewer::MarkMessageReadHandler::~MarkMessageReadHandler()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageViewer::PrintingSettings::~PrintingSettings()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageViewer::ScamDetectionWarningWidget::~ScamDetectionWarningWidget()@Base" 4:15.12 - (c++)"non-virtual thunk to MessageViewer::Viewer::~Viewer()@Base" 4:15.12 diff -Nru kf5-messagelib-16.04.3/debian/libkf5messageviewer-dev.acc.in kf5-messagelib-16.12.3/debian/libkf5messageviewer-dev.acc.in --- kf5-messagelib-16.04.3/debian/libkf5messageviewer-dev.acc.in 2016-09-30 04:32:13.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messageviewer-dev.acc.in 2017-05-01 19:27:51.000000000 +0000 @@ -1,4 +1,4 @@ - + @@ -18,6 +18,7 @@ -fPIC -std=c++11 + -fno-keep-inline-functions - + \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/debian/libkf5messageviewer-plugins.install kf5-messagelib-16.12.3/debian/libkf5messageviewer-plugins.install --- kf5-messagelib-16.04.3/debian/libkf5messageviewer-plugins.install 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5messageviewer-plugins.install 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1 @@ +usr/lib/*/qt5/plugins/messageviewer/messageviewer_defaultgrantleeheaderstyleplugin.so diff -Nru kf5-messagelib-16.04.3/debian/libkf5mimetreeparser5.install kf5-messagelib-16.12.3/debian/libkf5mimetreeparser5.install --- kf5-messagelib-16.04.3/debian/libkf5mimetreeparser5.install 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5mimetreeparser5.install 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,2 @@ +usr/lib/*/libKF5MimeTreeParser.so.5 +usr/lib/*/libKF5MimeTreeParser.so.5.* diff -Nru kf5-messagelib-16.04.3/debian/libkf5mimetreeparser5.symbols kf5-messagelib-16.12.3/debian/libkf5mimetreeparser5.symbols --- kf5-messagelib-16.04.3/debian/libkf5mimetreeparser5.symbols 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5mimetreeparser5.symbols 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,487 @@ +# SymbolsHelper-Confirmed: 4:16.12.2 amd64 armhf i386 +libKF5MimeTreeParser.so.5 libkf5mimetreeparser5 #MINVER# + _ZN10QByteArray7reserveEi@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10HtmlWriterD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10HtmlWriterD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10HtmlWriterD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper11addTempFileERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper11fixEncodingERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper11qt_metacastEPKc@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper12cleanSubjectEPN5KMime7MessageE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper12cleanSubjectEPN5KMime7MessageERK11QStringListbRK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper12codecForNameERK10QByteArray@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper12fromAsStringEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper12magicSetTypeEPN5KMime7ContentEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper12partMetaDataEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper13createTempDirERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper15encodingForNameERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper15mergeExtraNodesEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper15removeTempFilesEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper15replacePrefixesERK7QStringRK11QStringListbS3_@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper15setPartMetaDataEPN5KMime7ContentERKNS_12PartMetaDataE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper16setNodeProcessedEPN5KMime7ContentEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper16setOverrideCodecEPN5KMime7ContentEPK10QTextCodec@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper16staticMetaObjectE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper17setSignatureStateEPKN5KMime7ContentENS_19KMMsgSignatureStateE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper18attachExtraContentEPN5KMime7ContentES3_@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper18setBodyPartMementoEPN5KMime7ContentERK10QByteArrayPNS_9Interface15BodyPartMementoE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper18setEncryptionStateEPKN5KMime7ContentENS_20KMMsgEncryptionStateE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper18setNodeUnprocessedEPN5KMime7ContentEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper18supportedEncodingsEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper18unencryptedMessageERK14QSharedPointerIN5KMime7MessageEE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper19cleanFromExtraNodesEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper19forceCleanTempFilesEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper19tempFileUrlFromNodeEPKN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper19writeNodeToTempFileEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper22setNodeDisplayedHiddenEPN5KMime7ContentEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper23isInEncapsulatedMessageEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper23messageWithExtraContentEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper24setNodeDisplayedEmbeddedEPN5KMime7ContentEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper25unencryptedMessage_helperEPN5KMime7ContentER10QByteArraybi@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper5clearEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper5codecEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper6updateENS_10UpdateModeE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper7charsetEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelper8fileNameEPKN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelperC1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelperC2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelperD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelperD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser10NodeHelperD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser11MessagePart11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser11MessagePart11qt_metacastEPKc@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser11MessagePart12partMetaDataEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser11MessagePart13appendSubPartERK14QSharedPointerINS_9Interface11MessagePartEE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser11MessagePart13parseInternalEPN5KMime7ContentEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser11MessagePart16staticMetaObjectE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser11MessagePart17setAttachmentFlagEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser11MessagePart7setTextERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser11MessagePart9setIsRootEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser11MessagePartC1EPNS_16ObjectTreeParserERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser11MessagePartC2EPNS_16ObjectTreeParserERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser11MessagePartD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser11MessagePartD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser11MessagePartD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser13ProcessResult10setIsImageEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser13ProcessResult21setNeverDisplayInlineEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser13ProcessResult23setInlineSignatureStateENS_19KMMsgSignatureStateE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser13ProcessResult24setInlineEncryptionStateENS_20KMMsgEncryptionStateE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser14FileHtmlWriter10openOrWarnEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser14FileHtmlWriter3endEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser14FileHtmlWriter5beginERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser14FileHtmlWriter5flushEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser14FileHtmlWriter5queueERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser14FileHtmlWriter5resetEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser14FileHtmlWriter5writeERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser14FileHtmlWriter9embedPartERK10QByteArrayRK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser14FileHtmlWriter9extraHeadERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser14FileHtmlWriterC1ERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser14FileHtmlWriterC2ERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser14FileHtmlWriterD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser14FileHtmlWriterD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser14FileHtmlWriterD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15CertMessagePart11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15CertMessagePart11qt_metacastEPKc@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15CertMessagePart16staticMetaObjectE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15CertMessagePartC1EPNS_16ObjectTreeParserEPN5KMime7ContentEPKN6QGpgME8ProtocolEb@Base 4:16.12.2 + _ZN14MimeTreeParser15CertMessagePartC2EPNS_16ObjectTreeParserEPN5KMime7ContentEPKN6QGpgME8ProtocolEb@Base 4:16.12.2 + _ZN14MimeTreeParser15CertMessagePartD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15CertMessagePartD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15CertMessagePartD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15HtmlMessagePart11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15HtmlMessagePart11qt_metacastEPKc@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15HtmlMessagePart16staticMetaObjectE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15HtmlMessagePartC1EPNS_16ObjectTreeParserEPN5KMime7ContentEPNS_9Interface16ObjectTreeSourceE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15HtmlMessagePartC2EPNS_16ObjectTreeParserEPN5KMime7ContentEPNS_9Interface16ObjectTreeSourceE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15HtmlMessagePartD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15HtmlMessagePartD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15HtmlMessagePartD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15MessagePartList11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15MessagePartList11qt_metacastEPKc@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15MessagePartList16staticMetaObjectE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15MessagePartListC1EPNS_16ObjectTreeParserE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15MessagePartListC2EPNS_16ObjectTreeParserE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15MessagePartListD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15MessagePartListD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15MessagePartListD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15MimeMessagePart11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15MimeMessagePart11qt_metacastEPKc@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15MimeMessagePart16staticMetaObjectE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15MimeMessagePartC1EPNS_16ObjectTreeParserEPN5KMime7ContentEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15MimeMessagePartC2EPNS_16ObjectTreeParserEPN5KMime7ContentEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15MimeMessagePartD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15MimeMessagePartD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15MimeMessagePartD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15QueueHtmlWriter3endEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15QueueHtmlWriter5beginERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15QueueHtmlWriter5flushEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15QueueHtmlWriter5queueERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15QueueHtmlWriter5resetEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15QueueHtmlWriter5writeERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15QueueHtmlWriter6replayEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15QueueHtmlWriter7setBaseEPNS_10HtmlWriterE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15QueueHtmlWriter9embedPartERK10QByteArrayRK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15QueueHtmlWriter9extraHeadERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15QueueHtmlWriterC1EPNS_10HtmlWriterE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15QueueHtmlWriterC2EPNS_10HtmlWriterE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15QueueHtmlWriterD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15QueueHtmlWriterD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15QueueHtmlWriterD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15TextMessagePart11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15TextMessagePart11qt_metacastEPKc@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15TextMessagePart12parseContentEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15TextMessagePart16staticMetaObjectE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15TextMessagePartC1EPNS_16ObjectTreeParserEPN5KMime7ContentEbbb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15TextMessagePartC2EPNS_16ObjectTreeParserEPN5KMime7ContentEbbb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15TextMessagePartD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15TextMessagePartD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser15TextMessagePartD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParser11processTypeEPN5KMime7ContentERNS_13ProcessResultERK10QByteArrayS8_R14QSharedPointerINS_9Interface11MessagePartEEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParser13setAllowAsyncEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParser15copyContentFromEPKS0_@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParser15defaultHandlingEPN5KMime7ContentERNS_13ProcessResultEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParser15parseObjectTreeEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParser16extractNodeInfosEPN5KMime7ContentEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParser19setPlainTextContentERK7QString@Base 4:16.12.2 + _ZN14MimeTreeParser16ObjectTreeParser22setShowOnlyOneMimePartEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParser23parseObjectTreeInternalEPN5KMime7ContentEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParser4initEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParserC1EPKS0_bPKNS_18AttachmentStrategyE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParserC1EPNS_9Interface16ObjectTreeSourceEPNS_10NodeHelperEbPKNS_18AttachmentStrategyE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParserC1ERKS0_@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParserC2EPKS0_bPKNS_18AttachmentStrategyE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParserC2EPNS_9Interface16ObjectTreeSourceEPNS_10NodeHelperEbPKNS_18AttachmentStrategyE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParserC2ERKS0_@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParserD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParserD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16ObjectTreeParserD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16PartNodeBodyPart17setDefaultDisplayENS_9Interface8BodyPart7DisplayE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16PartNodeBodyPart18setBodyPartMementoEPNS_9Interface15BodyPartMementoE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser16PartNodeBodyPartC1EPNS_16ObjectTreeParserEPNS_13ProcessResultEPN5KMime7ContentES7_PNS_10NodeHelperE@Base 4:16.12.2 + _ZN14MimeTreeParser16PartNodeBodyPartC2EPNS_16ObjectTreeParserEPNS_13ProcessResultEPN5KMime7ContentES7_PNS_10NodeHelperE@Base 4:16.12.2 + _ZN14MimeTreeParser17SignedMessagePart11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser17SignedMessagePart11qt_metacastEPKc@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser17SignedMessagePart11setIsSignedEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser17SignedMessagePart16staticMetaObjectE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser17SignedMessagePart17startVerificationERK10QByteArrayPK10QTextCodec@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser17SignedMessagePart19sigStatusToMetaDataEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser17SignedMessagePart21setVerificationResultEPKNS_21CryptoBodyPartMementoEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser17SignedMessagePart25startVerificationDetachedERK10QByteArrayPN5KMime7ContentES3_@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser17SignedMessagePart8okVerifyERK10QByteArrayS3_PN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser17SignedMessagePartC1EPNS_16ObjectTreeParserERK7QStringPKN6QGpgME8ProtocolES5_PN5KMime7ContentE@Base 4:16.12.2 + _ZN14MimeTreeParser17SignedMessagePartC2EPNS_16ObjectTreeParserERK7QStringPKN6QGpgME8ProtocolES5_PN5KMime7ContentE@Base 4:16.12.2 + _ZN14MimeTreeParser17SignedMessagePartD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser17SignedMessagePartD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser17SignedMessagePartD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser18AttachmentStrategy10headerOnlyEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser18AttachmentStrategy5smartEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser18AttachmentStrategy6createENS0_4TypeE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser18AttachmentStrategy6createERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser18AttachmentStrategy6hiddenEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser18AttachmentStrategy6iconicEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser18AttachmentStrategy7inlinedEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser18AttachmentStrategyC1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser18AttachmentStrategyC2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser18AttachmentStrategyD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser18AttachmentStrategyD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser18AttachmentStrategyD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser20EncryptedMessagePart11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser20EncryptedMessagePart11qt_metacastEPKc@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser20EncryptedMessagePart13okDecryptMIMEERN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser20EncryptedMessagePart14setIsEncryptedEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser20EncryptedMessagePart15startDecryptionEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser20EncryptedMessagePart15startDecryptionERK10QByteArrayPK10QTextCodec@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser20EncryptedMessagePart16staticMetaObjectE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser20EncryptedMessagePart17setDecryptMessageEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser20EncryptedMessagePartC1EPNS_16ObjectTreeParserERK7QStringPKN6QGpgME8ProtocolES5_PN5KMime7ContentE@Base 4:16.12.2 + _ZN14MimeTreeParser20EncryptedMessagePartC2EPNS_16ObjectTreeParserERK7QStringPKN6QGpgME8ProtocolES5_PN5KMime7ContentE@Base 4:16.12.2 + _ZN14MimeTreeParser20EncryptedMessagePartD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser20EncryptedMessagePartD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser20EncryptedMessagePartD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser21AttachmentMessagePart10setIsImageEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser21AttachmentMessagePart11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser21AttachmentMessagePart11qt_metacastEPKc@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser21AttachmentMessagePart16staticMetaObjectE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser21AttachmentMessagePart21setNeverDisplayInlineEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser21AttachmentMessagePartC1EPNS_16ObjectTreeParserEPN5KMime7ContentEbbb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser21AttachmentMessagePartC2EPNS_16ObjectTreeParserEPN5KMime7ContentEbbb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser21AttachmentMessagePartD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser21AttachmentMessagePartD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser21AttachmentMessagePartD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser22AlternativeMessagePart11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser22AlternativeMessagePart11qt_metacastEPKc@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser22AlternativeMessagePart14availableModesEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser22AlternativeMessagePart16staticMetaObjectE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser22AlternativeMessagePartC1EPNS_16ObjectTreeParserEPN5KMime7ContentENS_4Util8HtmlModeE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser22AlternativeMessagePartC2EPNS_16ObjectTreeParserEPN5KMime7ContentENS_4Util8HtmlModeE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser22AlternativeMessagePartD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser22AlternativeMessagePartD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser22AlternativeMessagePartD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28AttachmentTemporaryFilesDirs10addTempDirERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28AttachmentTemporaryFilesDirs11addTempFileERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28AttachmentTemporaryFilesDirs11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28AttachmentTemporaryFilesDirs11qt_metacastEPKc@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28AttachmentTemporaryFilesDirs15removeTempFilesEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28AttachmentTemporaryFilesDirs16staticMetaObjectE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28AttachmentTemporaryFilesDirs19forceCleanTempFilesEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28AttachmentTemporaryFilesDirs19slotRemoveTempFilesEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28AttachmentTemporaryFilesDirs21setDelayRemoveAllInMsEi@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28AttachmentTemporaryFilesDirsC1EP7QObject@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28AttachmentTemporaryFilesDirsC2EP7QObject@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28AttachmentTemporaryFilesDirsD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28AttachmentTemporaryFilesDirsD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28AttachmentTemporaryFilesDirsD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28BodyPartFormatterBaseFactory11loadPluginsEv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28BodyPartFormatterBaseFactory6insertEPKcS2_PKNS_9Interface17BodyPartFormatterE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28BodyPartFormatterBaseFactoryC1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28BodyPartFormatterBaseFactoryC2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28BodyPartFormatterBaseFactoryD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28BodyPartFormatterBaseFactoryD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser28BodyPartFormatterBaseFactoryD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser29EncapsulatedRfc822MessagePart11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser29EncapsulatedRfc822MessagePart11qt_metacastEPKc@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser29EncapsulatedRfc822MessagePart16staticMetaObjectE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser29EncapsulatedRfc822MessagePartC1EPNS_16ObjectTreeParserEPN5KMime7ContentERK14QSharedPointerINS3_7MessageEE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser29EncapsulatedRfc822MessagePartC2EPNS_16ObjectTreeParserEPN5KMime7ContentERK14QSharedPointerINS3_7MessageEE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser29EncapsulatedRfc822MessagePartD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser29EncapsulatedRfc822MessagePartD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser29EncapsulatedRfc822MessagePartD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser4Util15labelForContentEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser4Util17isTypeBlacklistedEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser4Util18iconNameForContentEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser4Util19iconNameForMimetypeERK7QStringS3_S3_@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser4Util8mimetypeERK7QString@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface10HtmlWriterD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface10HtmlWriterD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface10HtmlWriterD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface11MessagePart11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface11MessagePart11qt_metacastEPKc@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface11MessagePart13setParentPartEPS1_@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface11MessagePart16staticMetaObjectE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface11MessagePart4htmlEb@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface11MessagePartC1ERKNS0_8BodyPartE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface11MessagePartC1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface11MessagePartC2ERKNS0_8BodyPartE@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface11MessagePartC2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface11MessagePartD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface11MessagePartD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface11MessagePartD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface15BodyPartMementoD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface15BodyPartMementoD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface15BodyPartMementoD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface16ObjectTreeSourceD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface16ObjectTreeSourceD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface16ObjectTreeSourceD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface19MessagePartRendererD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface19MessagePartRendererD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface19MessagePartRendererD2Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface8BodyPartD0Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface8BodyPartD1Ev@Base 4:16.04.3+git20160803 + _ZN14MimeTreeParser9Interface8BodyPartD2Ev@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser10NodeHelper10metaObjectEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser10NodeHelper13extraContentsEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser10NodeHelper13nodeProcessedEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser10NodeHelper14signatureStateEPKN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser10NodeHelper15bodyPartMementoEPN5KMime7ContentERK10QByteArray@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser10NodeHelper15encryptionStateEPKN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser10NodeHelper15persistentIndexEPKN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser10NodeHelper16contentFromIndexEPN5KMime7ContentERK7QString@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser10NodeHelper21isNodeDisplayedHiddenEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser10NodeHelper21overallSignatureStateEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser10NodeHelper22overallEncryptionStateEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser10NodeHelper23decryptedNodeForContentEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser10NodeHelper23isNodeDisplayedEmbeddedEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser10NodeHelper26attachmentsOfExtraContentsEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser10NodeHelper6asHREFEPKN5KMime7ContentERK7QString@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser10NodeHelper8fromHREFERK14QSharedPointerIN5KMime7MessageEERK4QUrl@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser11MessagePart10htmlWriterEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser11MessagePart10metaObjectEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser11MessagePart11hasSubPartsEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser11MessagePart12isAttachmentEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser11MessagePart13setHtmlWriterEPNS_10HtmlWriterE@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser11MessagePart14attachmentNodeEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser11MessagePart15copyContentFromEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser11MessagePart18renderInternalTextEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser11MessagePart3fixEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser11MessagePart4textEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser11MessagePart6isHtmlEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser11MessagePart6isRootEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser11MessagePart6sourceEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser11MessagePart8isHiddenEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser11MessagePart8subPartsEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser13ProcessResult18neverDisplayInlineEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser13ProcessResult20inlineSignatureStateEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser13ProcessResult21inlineEncryptionStateEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser13ProcessResult24adjustCryptoStatesOfNodeEPKN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser13ProcessResult7isImageEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15CertMessagePart10metaObjectEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15CertMessagePart4textEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15HtmlMessagePart10metaObjectEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15HtmlMessagePart3fixEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15HtmlMessagePart4textEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15HtmlMessagePart6isHtmlEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15MessagePartList10metaObjectEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15MessagePartList11htmlContentEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15MessagePartList16plaintextContentEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15MessagePartList4textEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15MimeMessagePart10metaObjectEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15MimeMessagePart11htmlContentEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15MimeMessagePart16plaintextContentEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15MimeMessagePart4textEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15TextMessagePart10metaObjectEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15TextMessagePart13showTextFrameEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15TextMessagePart14decryptMessageEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15TextMessagePart14signatureStateEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15TextMessagePart15encryptionStateEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15TextMessagePart8isHiddenEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser15TextMessagePart8showLinkEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16ObjectTreeParser10allowAsyncEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16ObjectTreeParser10htmlWriterEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16ObjectTreeParser10nodeHelperEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16ObjectTreeParser10parsedPartEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16ObjectTreeParser11htmlContentEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16ObjectTreeParser16plainTextContentEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16ObjectTreeParser18attachmentStrategyEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16ObjectTreeParser18htmlContentCharsetEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16ObjectTreeParser19hasPendingAsyncJobsEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16ObjectTreeParser19showOnlyOneMimePartEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16ObjectTreeParser23plainTextContentCharsetEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16ObjectTreeParser8codecForEPN5KMime7ContentE@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16PartNodeBodyPart14defaultDisplayEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16PartNodeBodyPart15hasCompleteBodyEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16PartNodeBodyPart18contentDescriptionEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16PartNodeBodyPart20contentTypeParameterEPKc@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16PartNodeBodyPart27contentDispositionParameterEPKc@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16PartNodeBodyPart6asTextEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16PartNodeBodyPart6sourceEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16PartNodeBodyPart7mementoEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16PartNodeBodyPart8asBinaryEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser16PartNodeBodyPart8makeLinkERK7QString@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser17SignedMessagePart10metaObjectEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser17SignedMessagePart11htmlContentEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser17SignedMessagePart16plaintextContentEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser17SignedMessagePart8isSignedEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser18AttachmentStrategy30requiresAttachmentListInHeaderEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser20EncryptedMessagePart10metaObjectEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser20EncryptedMessagePart11htmlContentEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser20EncryptedMessagePart11isEncryptedEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser20EncryptedMessagePart13isDecryptableEv@Base 4:16.12.2 + _ZNK14MimeTreeParser20EncryptedMessagePart14decryptMessageEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser20EncryptedMessagePart15passphraseErrorEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser20EncryptedMessagePart16plaintextContentEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser20EncryptedMessagePart4textEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser21AttachmentMessagePart10metaObjectEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser21AttachmentMessagePart18neverDisplayInlineEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser21AttachmentMessagePart6asIconEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser21AttachmentMessagePart7isImageEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser21AttachmentMessagePart8isHiddenEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser22AlternativeMessagePart10metaObjectEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser22AlternativeMessagePart11htmlContentEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser22AlternativeMessagePart13preferredModeEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser22AlternativeMessagePart15copyContentFromEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser22AlternativeMessagePart16plaintextContentEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser22AlternativeMessagePart3fixEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser22AlternativeMessagePart4textEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser22AlternativeMessagePart6isHtmlEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser28AttachmentTemporaryFilesDirs10metaObjectEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser28AttachmentTemporaryFilesDirs13temporaryDirsEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser28AttachmentTemporaryFilesDirs14temporaryFilesEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser28BodyPartFormatterBaseFactory15subtypeRegistryEPKc@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser28BodyPartFormatterBaseFactory17createForIteratorEPKcS2_@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser29EncapsulatedRfc822MessagePart10metaObjectEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser29EncapsulatedRfc822MessagePart15copyContentFromEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser29EncapsulatedRfc822MessagePart3fixEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser29EncapsulatedRfc822MessagePart4textEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser9Interface11MessagePart10htmlWriterEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser9Interface11MessagePart10metaObjectEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser9Interface11MessagePart10parentPartEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser9Interface11MessagePart11htmlContentEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser9Interface11MessagePart13setHtmlWriterEPNS_10HtmlWriterE@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser9Interface11MessagePart16plaintextContentEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser9Interface11MessagePart4textEv@Base 4:16.04.3+git20160803 + _ZNK14MimeTreeParser9Interface17BodyPartFormatter7processERNS0_8BodyPartE@Base 4:16.04.3+git20160803 + (optional=templinst)_ZNSt15_Sp_counted_ptrIDnLN9__gnu_cxx12_Lock_policyE2EE10_M_disposeEv@Base 4:16.12.2 + (optional=templinst)_ZNSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE10_M_destroyEv@Base 4:16.12.2 + (optional=templinst)_ZNSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE10_M_releaseEv@Base 4:16.12.2 + _ZTIN14MimeTreeParser10HtmlWriterE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser10NodeHelperE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser11MessagePartE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser14FileHtmlWriterE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser15CertMessagePartE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser15HtmlMessagePartE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser15MessagePartListE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser15MimeMessagePartE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser15QueueHtmlWriterE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser15TextMessagePartE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser16ObjectTreeParserE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser16PartNodeBodyPartE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser17SignedMessagePartE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser18AttachmentStrategyE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser20EncryptedMessagePartE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser21AttachmentMessagePartE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser22AlternativeMessagePartE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser28AttachmentTemporaryFilesDirsE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser28BodyPartFormatterBaseFactoryE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser29EncapsulatedRfc822MessagePartE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser9Interface10HtmlWriterE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser9Interface11MessagePartE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser9Interface15BodyPartMementoE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser9Interface16ObjectTreeSourceE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser9Interface17BodyPartFormatterE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser9Interface19MessagePartRendererE@Base 4:16.04.3+git20160803 + _ZTIN14MimeTreeParser9Interface8BodyPartE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser10HtmlWriterE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser10NodeHelperE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser11MessagePartE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser14FileHtmlWriterE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser15CertMessagePartE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser15HtmlMessagePartE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser15MessagePartListE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser15MimeMessagePartE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser15QueueHtmlWriterE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser15TextMessagePartE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser16ObjectTreeParserE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser16PartNodeBodyPartE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser17SignedMessagePartE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser18AttachmentStrategyE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser20EncryptedMessagePartE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser21AttachmentMessagePartE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser22AlternativeMessagePartE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser28AttachmentTemporaryFilesDirsE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser28BodyPartFormatterBaseFactoryE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser29EncapsulatedRfc822MessagePartE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser9Interface10HtmlWriterE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser9Interface11MessagePartE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser9Interface15BodyPartMementoE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser9Interface16ObjectTreeSourceE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser9Interface17BodyPartFormatterE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser9Interface19MessagePartRendererE@Base 4:16.04.3+git20160803 + _ZTSN14MimeTreeParser9Interface8BodyPartE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser10HtmlWriterE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser10NodeHelperE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser11MessagePartE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser14FileHtmlWriterE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser15CertMessagePartE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser15HtmlMessagePartE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser15MessagePartListE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser15MimeMessagePartE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser15QueueHtmlWriterE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser15TextMessagePartE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser16ObjectTreeParserE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser16PartNodeBodyPartE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser17SignedMessagePartE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser18AttachmentStrategyE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser20EncryptedMessagePartE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser21AttachmentMessagePartE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser22AlternativeMessagePartE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser28AttachmentTemporaryFilesDirsE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser28BodyPartFormatterBaseFactoryE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser29EncapsulatedRfc822MessagePartE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser9Interface10HtmlWriterE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser9Interface11MessagePartE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser9Interface15BodyPartMementoE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser9Interface16ObjectTreeSourceE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser9Interface17BodyPartFormatterE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser9Interface19MessagePartRendererE@Base 4:16.04.3+git20160803 + _ZTVN14MimeTreeParser9Interface8BodyPartE@Base 4:16.04.3+git20160803 diff -Nru kf5-messagelib-16.04.3/debian/libkf5mimetreeparser-dev.install kf5-messagelib-16.12.3/debian/libkf5mimetreeparser-dev.install --- kf5-messagelib-16.04.3/debian/libkf5mimetreeparser-dev.install 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5mimetreeparser-dev.install 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,6 @@ +usr/include/KF5/MimeTreeParser/ +usr/include/KF5/mimetreeparser/ +usr/include/KF5/mimetreeparser_version.h +usr/lib/*/cmake/KF5MimeTreeParser/ +usr/lib/*/libKF5MimeTreeParser.so +usr/lib/*/qt5/mkspecs/modules/qt_MimeTreeParser.pri diff -Nru kf5-messagelib-16.04.3/debian/libkf5templateparser-dev.acc.in kf5-messagelib-16.12.3/debian/libkf5templateparser-dev.acc.in --- kf5-messagelib-16.04.3/debian/libkf5templateparser-dev.acc.in 2016-09-30 04:32:13.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5templateparser-dev.acc.in 2017-05-01 19:27:51.000000000 +0000 @@ -1,4 +1,4 @@ - + @@ -18,6 +18,7 @@ -fPIC -std=c++11 + -fno-keep-inline-functions - + \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/debian/libkf5webengineviewer5abi1.install kf5-messagelib-16.12.3/debian/libkf5webengineviewer5abi1.install --- kf5-messagelib-16.04.3/debian/libkf5webengineviewer5abi1.install 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5webengineviewer5abi1.install 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,2 @@ +usr/lib/*/libKF5WebEngineViewer.so.5.* +usr/lib/*/libKF5WebEngineViewer.so.5abi1 diff -Nru kf5-messagelib-16.04.3/debian/libkf5webengineviewer5abi1.symbols kf5-messagelib-16.12.3/debian/libkf5webengineviewer5abi1.symbols --- kf5-messagelib-16.04.3/debian/libkf5webengineviewer5abi1.symbols 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5webengineviewer5abi1.symbols 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,489 @@ +# SymbolsHelper-Confirmed: 4:16.12.2 amd64 armhf i386 +libKF5WebEngineViewer.so.5abi1 libkf5webengineviewer5abi1 #MINVER# + ABI_5_1@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer10WebHitTest11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer10WebHitTest11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer10WebHitTest13handleHitTestERK8QVariant@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer10WebHitTest16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer10WebHitTest8finishedERKNS_16WebHitTestResultE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer10WebHitTestC1EP14QWebEnginePageRK6QPointP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer10WebHitTestC2EP14QWebEnginePageRK6QPointP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer10WebHitTestD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer10WebHitTestD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer10WebHitTestD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase10autoSearchERK7QString@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase10searchTextEbb@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase11hideFindBarEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase11optionsMenuEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase13setFoundMatchEb@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase14slotSearchTextEbb@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase15addToCompletionERK7QString@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase15clearSelectionsEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase15slotClearSearchEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase15updateHighLightEb@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase17focusAndSetCursorEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase17updateSensitivityEb@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase22caseSensitivityChangedEb@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase23slotHighlightAllChangedEb@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase5eventEP6QEvent@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase7setTextERK7QString@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase8closeBarEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase8findNextEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBase8findPrevEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBaseC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBaseC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBaseD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBaseD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer11FindBarBaseD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEnginePage10urlClickedERK4QUrl@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEnginePage11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEnginePage11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEnginePage14hitTestContentERK6QPoint@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEnginePage16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEnginePage18showConsoleMessageERK7QString@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEnginePage23acceptNavigationRequestERK4QUrlN14QWebEnginePage14NavigationTypeEb@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEnginePage24javaScriptConsoleMessageEN14QWebEnginePage29JavaScriptConsoleMessageLevelERK7QStringiS5_@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEnginePage4initEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEnginePage8saveHtmlEP22QWebEngineDownloadItem@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEnginePageC1EP17QWebEngineProfileP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEnginePageC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEnginePageC2EP17QWebEngineProfileP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEnginePageC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEnginePageD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEnginePageD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEnginePageD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineView11eventFilterEP7QObjectP6QEvent@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineView11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineView11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineView12createWindowEN14QWebEnginePage13WebWindowTypeE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineView16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineView17forwardWheelEventEP11QWheelEvent@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineView20forwardKeyPressEventEP9QKeyEvent@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineView20saveRelativePositionEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineView21clearRelativePositionEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineView21forwardMouseMoveEventEP11QMouseEvent@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineView22forwardKeyReleaseEventEP9QKeyEvent@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineView22forwardMousePressEventEP11QMouseEvent@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineView22initializeJQueryScriptEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineView24forwardMouseReleaseEventEP11QMouseEvent@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineView9addScriptERK7QStringS3_N16QWebEngineScript14InjectionPointE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineViewC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineViewC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineViewD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineViewD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer13WebEngineViewD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer14ZoomActionMenu10slotZoomInEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer14ZoomActionMenu11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer14ZoomActionMenu11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer14ZoomActionMenu11slotZoomOutEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer14ZoomActionMenu11zoomChangedEd@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer14ZoomActionMenu13setZoomFactorEd@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer14ZoomActionMenu13slotZoomResetEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer14ZoomActionMenu16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer14ZoomActionMenu17createZoomActionsEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer14ZoomActionMenu19setActionCollectionEP17KActionCollection@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer14ZoomActionMenu22setWebViewerZoomFactorEd@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer14ZoomActionMenuC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer14ZoomActionMenuC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer14ZoomActionMenuD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer14ZoomActionMenuD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer14ZoomActionMenuD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer15WebEngineScript10scrollDownEi@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer15WebEngineScript13findAllImagesEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer15WebEngineScript14findAllAnchorsEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer15WebEngineScript14findAllScriptsEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer15WebEngineScript16scrollPercentageEi@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer15WebEngineScript16scrollToPositionERK6QPoint@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer15WebEngineScript17setStyleToElementERK7QStringS3_@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer15WebEngineScript18isScrolledToBottomEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer15WebEngineScript20removeStyleToElementERK7QString@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer15WebEngineScript21searchElementPositionERK7QString@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer15WebEngineScript21setElementByIdVisibleERK7QStringb@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer15WebEngineScript22findAllAnchorsAndFormsEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer15WebEngineScript24scrollToRelativePositionEd@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer15WebEngineScript8scrollUpEi@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer16WebHitTestResultC1ERK6QPointRK4QUrlRK8QVariant@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer16WebHitTestResultC1ERKS0_@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer16WebHitTestResultC1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer16WebHitTestResultC2ERK6QPointRK4QUrlRK8QVariant@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer16WebHitTestResultC2ERKS0_@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer16WebHitTestResultC2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer16WebHitTestResultD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer16WebHitTestResultD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer16WebHitTestResultaSERKS0_@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJob13setSearchHashERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJob13slotSslErrorsEP13QNetworkReplyRK5QListI9QSslErrorE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJob16setDatabaseStateERK7QString@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJob17setUseCompactJsonEb@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJob20slotCheckUrlFinishedEP13QNetworkReply@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJob5parseERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJob5startEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJob6resultENS0_9UrlStatusERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJob9debugJsonERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJob9slotErrorEN13QNetworkReply12NetworkErrorE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJobC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJobC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer17SearchFullHashJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18InterceptorManager11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18InterceptorManager11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18InterceptorManager14addInterceptorEPNS_36NetworkPluginUrlInterceptorInterfaceE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18InterceptorManager16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18InterceptorManagerC1EP14QWebEngineViewP17KActionCollectionP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18InterceptorManagerC2EP14QWebEngineViewP17KActionCollectionP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18InterceptorManagerD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18InterceptorManagerD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18InterceptorManagerD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18WebEngineAccessKey10wheelEventEP11QWheelEvent@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18WebEngineAccessKey11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18WebEngineAccessKey11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18WebEngineAccessKey11resizeEventEP12QResizeEvent@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18WebEngineAccessKey13keyPressEventEP9QKeyEvent@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18WebEngineAccessKey14hideAccessKeysEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18WebEngineAccessKey14showAccessKeysEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18WebEngineAccessKey15keyReleaseEventEP9QKeyEvent@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18WebEngineAccessKey16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18WebEngineAccessKey19setActionCollectionEP17KActionCollection@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18WebEngineAccessKey21handleSearchAccessKeyERK8QVariant@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18WebEngineAccessKey7openUrlERK4QUrl@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18WebEngineAccessKeyC1EP14QWebEngineViewP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18WebEngineAccessKeyC2EP14QWebEngineViewP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18WebEngineAccessKeyD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18WebEngineAccessKeyD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer18WebEngineAccessKeyD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer19CheckPhishingUrlJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer19CheckPhishingUrlJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer19CheckPhishingUrlJob13slotSslErrorsEP13QNetworkReplyRK5QListI9QSslErrorE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer19CheckPhishingUrlJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer19CheckPhishingUrlJob17setUseCompactJsonEb@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer19CheckPhishingUrlJob20slotCheckUrlFinishedEP13QNetworkReply@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer19CheckPhishingUrlJob5parseERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer19CheckPhishingUrlJob5startEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer19CheckPhishingUrlJob6resultENS0_9UrlStatusERK4QUrl@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer19CheckPhishingUrlJob6setUrlERK4QUrl@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer19CheckPhishingUrlJob9debugJsonERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer19CheckPhishingUrlJob9slotErrorEN13QNetworkReply12NetworkErrorE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer19CheckPhishingUrlJobC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer19CheckPhishingUrlJobC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer19CheckPhishingUrlJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer19CheckPhishingUrlJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer19CheckPhishingUrlJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20FindBarWebEngineView10searchTextEbb@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20FindBarWebEngineView11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20FindBarWebEngineView11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20FindBarWebEngineView15clearSelectionsEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20FindBarWebEngineView16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20FindBarWebEngineView17updateSensitivityEb@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20FindBarWebEngineViewC1EP14QWebEngineViewP7QWidget@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20FindBarWebEngineViewC2EP14QWebEngineViewP7QWidget@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20FindBarWebEngineViewD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20FindBarWebEngineViewD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20FindBarWebEngineViewD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager10createHashERK4QUrl@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager10initializeEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager10readConfigEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager10saveConfigEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager12malwareFoundERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager13checkDataBaseEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager16checkUrlFinishedERK4QUrlNS0_9UrlStatusE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager17slotCheckDataBaseEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager18fullUpdateDataBaseERKNS_18UpdateDataBaseInfoE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager18initializeDataBaseEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager19setDownloadProgressEb@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager20addElementToDataBaseERK7QVectorINS_8AdditionEE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager20downloadFullDataBaseEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager21partialUpdateDataBaseERKNS_18UpdateDataBaseInfoE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager23downloadPartialDataBaseEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager24closeDataBaseAndDeleteItEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager25removeElementFromDataBaseERK7QVectorINS_7RemovalEE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager28slotDownloadDataBaseFinishedERKNS_18UpdateDataBaseInfoENS_28CreatePhishingUrlDataBaseJob22DataBaseDownloadResultE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager4selfEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManager8checkUrlERK4QUrl@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManagerC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManagerC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManagerD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManagerD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer20LocalDataBaseManagerD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21CheckPhishingUrlCache10clearCacheEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21CheckPhishingUrlCache11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21CheckPhishingUrlCache11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21CheckPhishingUrlCache16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21CheckPhishingUrlCache20setCheckingUrlResultERK4QUrlb@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21CheckPhishingUrlCache4selfEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21CheckPhishingUrlCache9urlStatusERK4QUrl@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21CheckPhishingUrlCacheC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21CheckPhishingUrlCacheC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21CheckPhishingUrlCacheD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21CheckPhishingUrlCacheD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21CheckPhishingUrlCacheD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21NetworkUrlInterceptor11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21NetworkUrlInterceptor11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21NetworkUrlInterceptor14addInterceptorEPNS_36NetworkPluginUrlInterceptorInterfaceE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21NetworkUrlInterceptor16interceptRequestER24QWebEngineUrlRequestInfo@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21NetworkUrlInterceptor16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21NetworkUrlInterceptorC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21NetworkUrlInterceptorC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21NetworkUrlInterceptorD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21NetworkUrlInterceptorD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21NetworkUrlInterceptorD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21WebEngineManageScript11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21WebEngineManageScript11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21WebEngineManageScript16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21WebEngineManageScript9addScriptEP17QWebEngineProfileRK7QStringS5_N16QWebEngineScript14InjectionPointE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21WebEngineManageScriptC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21WebEngineManageScriptC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21WebEngineManageScriptD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21WebEngineManageScriptD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer21WebEngineManageScriptD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer24WebEnginePrintMessageBox11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer24WebEnginePrintMessageBox11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer24WebEnginePrintMessageBox13openInBrowserEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer24WebEnginePrintMessageBox16openPrintPreviewEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer24WebEnginePrintMessageBox16slotPrintPreviewEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer24WebEnginePrintMessageBox16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer24WebEnginePrintMessageBox17slotOpenInBrowserEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer24WebEnginePrintMessageBoxC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer24WebEnginePrintMessageBoxC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer24WebEnginePrintMessageBoxD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer24WebEnginePrintMessageBoxD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer24WebEnginePrintMessageBoxD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer26WebEngineExportHtmlPageJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer26WebEngineExportHtmlPageJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer26WebEngineExportHtmlPageJob13setEngineViewEP14QWebEngineView@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer26WebEngineExportHtmlPageJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer26WebEngineExportHtmlPageJob18slotSaveHtmlToPageERK7QString@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer26WebEngineExportHtmlPageJob5startEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer26WebEngineExportHtmlPageJob6failedEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer26WebEngineExportHtmlPageJob7successERK7QString@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer26WebEngineExportHtmlPageJobC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer26WebEngineExportHtmlPageJobC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer26WebEngineExportHtmlPageJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer26WebEngineExportHtmlPageJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer26WebEngineExportHtmlPageJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer27NetworkPluginUrlInterceptor11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer27NetworkPluginUrlInterceptor11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer27NetworkPluginUrlInterceptor12setIsEnabledEb@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer27NetworkPluginUrlInterceptor16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer27NetworkPluginUrlInterceptor19showConfigureDialogEP7QWidget@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer27NetworkPluginUrlInterceptorC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer27NetworkPluginUrlInterceptorC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer27NetworkPluginUrlInterceptorD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer27NetworkPluginUrlInterceptorD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer27NetworkPluginUrlInterceptorD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJob11parseResultERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJob13parseRemovalsERK5QListI8QVariantE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJob13slotSslErrorsEP13QNetworkReplyRK5QListI9QSslErrorE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJob14parseAdditionsERK5QListI8QVariantE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJob15debugJsonResultERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJob16setDataBaseStateERK7QString@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJob17setUseCompactJsonEb@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJob25setDataBaseDownloadNeededENS0_20DataBaseDownloadTypeE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJob28slotDownloadDataBaseFinishedEP13QNetworkReply@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJob5startEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJob8finishedERKNS_18UpdateDataBaseInfoENS0_22DataBaseDownloadResultE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJob9debugJsonERK10QByteArray@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJob9slotErrorEN13QNetworkReply12NetworkErrorE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJobC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJobC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28CreatePhishingUrlDataBaseJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28NetworkUrlInterceptorManager11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28NetworkUrlInterceptorManager11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28NetworkUrlInterceptorManager16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28NetworkUrlInterceptorManagerC1EP14QWebEngineViewP17KActionCollectionP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28NetworkUrlInterceptorManagerC2EP14QWebEngineViewP17KActionCollectionP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28NetworkUrlInterceptorManagerD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28NetworkUrlInterceptorManagerD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer28NetworkUrlInterceptorManagerD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer34NetworkUrlInterceptorPluginManager11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer34NetworkUrlInterceptorPluginManager11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer34NetworkUrlInterceptorPluginManager16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer34NetworkUrlInterceptorPluginManager20pluginFromIdentifierERK7QString@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer34NetworkUrlInterceptorPluginManager4selfEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer34NetworkUrlInterceptorPluginManagerC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer34NetworkUrlInterceptorPluginManagerC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer34NetworkUrlInterceptorPluginManagerD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer34NetworkUrlInterceptorPluginManagerD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer34NetworkUrlInterceptorPluginManagerD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36CheckPhishingUrlFromLocalDataBaseJob11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36CheckPhishingUrlFromLocalDataBaseJob11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36CheckPhishingUrlFromLocalDataBaseJob16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36CheckPhishingUrlFromLocalDataBaseJob18setCheckPhisingUrlERK4QUrl@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36CheckPhishingUrlFromLocalDataBaseJob20slotCheckUrlFinishedERK4QUrlNS_20LocalDataBaseManager9UrlStatusE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36CheckPhishingUrlFromLocalDataBaseJob5startEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36CheckPhishingUrlFromLocalDataBaseJob8finishedERK4QUrlNS0_9UrlStatusE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36CheckPhishingUrlFromLocalDataBaseJobC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36CheckPhishingUrlFromLocalDataBaseJobC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36CheckPhishingUrlFromLocalDataBaseJobD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36CheckPhishingUrlFromLocalDataBaseJobD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36CheckPhishingUrlFromLocalDataBaseJobD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36NetworkPluginUrlInterceptorInterface11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36NetworkPluginUrlInterceptorInterface11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36NetworkPluginUrlInterceptorInterface13createActionsEP17KActionCollection@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36NetworkPluginUrlInterceptorInterface16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36NetworkPluginUrlInterceptorInterfaceC1EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36NetworkPluginUrlInterceptorInterfaceC2EP7QObject@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36NetworkPluginUrlInterceptorInterfaceD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36NetworkPluginUrlInterceptorInterfaceD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer36NetworkPluginUrlInterceptorInterfaceD2Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer42NetworkPluginUrlInterceptorConfigureWidget11qt_metacallEN11QMetaObject4CallEiPPv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer42NetworkPluginUrlInterceptorConfigureWidget11qt_metacastEPKc@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer42NetworkPluginUrlInterceptorConfigureWidget16configureChangedEv@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer42NetworkPluginUrlInterceptorConfigureWidget16staticMetaObjectE@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer42NetworkPluginUrlInterceptorConfigureWidgetC1EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer42NetworkPluginUrlInterceptorConfigureWidgetC2EP7QWidget@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer42NetworkPluginUrlInterceptorConfigureWidgetD0Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer42NetworkPluginUrlInterceptorConfigureWidgetD1Ev@ABI_5_1 4:16.12.2 + _ZN15WebEngineViewer42NetworkPluginUrlInterceptorConfigureWidgetD2Ev@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer10WebHitTest10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer11FindBarBase10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer11FindBarBase4textEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer13WebEnginePage10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer13WebEngineView10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer13WebEngineView16relativePositionEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer13WebEngineView22webEngineManagerScriptEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer14ZoomActionMenu10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer14ZoomActionMenu10zoomFactorEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer14ZoomActionMenu12zoomInActionEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer14ZoomActionMenu13zoomOutActionEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer14ZoomActionMenu15zoomResetActionEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer16WebHitTestResult10mediaMutedEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer16WebHitTestResult11mediaPausedEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer16WebHitTestResult12boundingRectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer16WebHitTestResult13alternateTextEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer16WebHitTestResult17isContentEditableEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer16WebHitTestResult17isContentSelectedEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer16WebHitTestResult3posEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer16WebHitTestResult6isNullEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer16WebHitTestResult7linkUrlEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer16WebHitTestResult7pageUrlEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer16WebHitTestResult7tagNameEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer16WebHitTestResult8imageUrlEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer16WebHitTestResult8mediaUrlEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer16WebHitTestResult9linkTitleEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer17SearchFullHashJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer17SearchFullHashJob11jsonRequestEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer17SearchFullHashJob8canStartEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer18InterceptorManager10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer18InterceptorManager21interceptorUrlActionsERKNS_16WebHitTestResultE@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer18WebEngineAccessKey10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer19CheckPhishingUrlJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer19CheckPhishingUrlJob11jsonRequestEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer19CheckPhishingUrlJob8canStartEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer20FindBarWebEngineView10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer20LocalDataBaseManager10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer21CheckPhishingUrlCache10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer21NetworkUrlInterceptor10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer21WebEngineManageScript10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer24WebEnginePrintMessageBox10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer26WebEngineExportHtmlPageJob10engineViewEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer26WebEngineExportHtmlPageJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer27NetworkPluginUrlInterceptor10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer27NetworkPluginUrlInterceptor18hasConfigureDialogEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer27NetworkPluginUrlInterceptor9isEnabledEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer28CreatePhishingUrlDataBaseJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer28CreatePhishingUrlDataBaseJob11jsonRequestEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer28NetworkUrlInterceptorManager10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer28NetworkUrlInterceptorManager13interfaceListEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer28NetworkUrlInterceptorManager21interceptorUrlActionsERKNS_16WebHitTestResultE@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer34NetworkUrlInterceptorPluginManager10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer34NetworkUrlInterceptorPluginManager11pluginsListEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer34NetworkUrlInterceptorPluginManager15configGroupNameEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer34NetworkUrlInterceptorPluginManager15pluginsDataListEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer34NetworkUrlInterceptorPluginManager22configPrefixSettingKeyEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer36CheckPhishingUrlFromLocalDataBaseJob10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer36CheckPhishingUrlFromLocalDataBaseJob8canStartEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer36NetworkPluginUrlInterceptorInterface10metaObjectEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer36NetworkPluginUrlInterceptorInterface21interceptorUrlActionsERKNS_16WebHitTestResultE@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer42NetworkPluginUrlInterceptorConfigureWidget10helpAnchorEv@ABI_5_1 4:16.12.2 + _ZNK15WebEngineViewer42NetworkPluginUrlInterceptorConfigureWidget10metaObjectEv@ABI_5_1 4:16.12.2 + _ZTI11QSharedData@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer10WebHitTestE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer11FindBarBaseE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer13WebEnginePageE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer13WebEngineViewE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer14ZoomActionMenuE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer17SearchFullHashJobE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer18InterceptorManagerE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer18WebEngineAccessKeyE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer19CheckPhishingUrlJobE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer20FindBarWebEngineViewE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer20LocalDataBaseManagerE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer21CheckPhishingUrlCacheE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer21NetworkUrlInterceptorE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer21WebEngineManageScriptE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer24WebEnginePrintMessageBoxE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer26WebEngineExportHtmlPageJobE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer27NetworkPluginUrlInterceptorE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer28CreatePhishingUrlDataBaseJobE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer28NetworkUrlInterceptorManagerE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer34NetworkUrlInterceptorPluginManagerE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer36CheckPhishingUrlFromLocalDataBaseJobE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer36NetworkPluginUrlInterceptorInterfaceE@ABI_5_1 4:16.12.2 + _ZTIN15WebEngineViewer42NetworkPluginUrlInterceptorConfigureWidgetE@ABI_5_1 4:16.12.2 + _ZTS11QSharedData@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer10WebHitTestE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer11FindBarBaseE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer13WebEnginePageE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer13WebEngineViewE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer14ZoomActionMenuE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer17SearchFullHashJobE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer18InterceptorManagerE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer18WebEngineAccessKeyE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer19CheckPhishingUrlJobE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer20FindBarWebEngineViewE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer20LocalDataBaseManagerE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer21CheckPhishingUrlCacheE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer21NetworkUrlInterceptorE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer21WebEngineManageScriptE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer24WebEnginePrintMessageBoxE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer26WebEngineExportHtmlPageJobE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer27NetworkPluginUrlInterceptorE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer28CreatePhishingUrlDataBaseJobE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer28NetworkUrlInterceptorManagerE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer34NetworkUrlInterceptorPluginManagerE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer36CheckPhishingUrlFromLocalDataBaseJobE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer36NetworkPluginUrlInterceptorInterfaceE@ABI_5_1 4:16.12.2 + _ZTSN15WebEngineViewer42NetworkPluginUrlInterceptorConfigureWidgetE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer10WebHitTestE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer11FindBarBaseE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer13WebEnginePageE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer13WebEngineViewE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer14ZoomActionMenuE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer17SearchFullHashJobE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer18InterceptorManagerE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer18WebEngineAccessKeyE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer19CheckPhishingUrlJobE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer20FindBarWebEngineViewE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer20LocalDataBaseManagerE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer21CheckPhishingUrlCacheE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer21NetworkUrlInterceptorE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer21WebEngineManageScriptE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer24WebEnginePrintMessageBoxE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer26WebEngineExportHtmlPageJobE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer27NetworkPluginUrlInterceptorE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer28CreatePhishingUrlDataBaseJobE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer28NetworkUrlInterceptorManagerE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer34NetworkUrlInterceptorPluginManagerE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer36CheckPhishingUrlFromLocalDataBaseJobE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer36NetworkPluginUrlInterceptorInterfaceE@ABI_5_1 4:16.12.2 + _ZTVN15WebEngineViewer42NetworkPluginUrlInterceptorConfigureWidgetE@ABI_5_1 4:16.12.2 + (c++)"non-virtual thunk to WebEngineViewer::FindBarBase::~FindBarBase()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to WebEngineViewer::FindBarWebEngineView::~FindBarWebEngineView()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to WebEngineViewer::NetworkPluginUrlInterceptorConfigureWidget::~NetworkPluginUrlInterceptorConfigureWidget()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to WebEngineViewer::WebEnginePrintMessageBox::~WebEnginePrintMessageBox()@ABI_5_1" 4:16.12.2 + (c++)"non-virtual thunk to WebEngineViewer::WebEngineView::~WebEngineView()@ABI_5_1" 4:16.12.2 diff -Nru kf5-messagelib-16.04.3/debian/libkf5webengineviewer-dev.install kf5-messagelib-16.12.3/debian/libkf5webengineviewer-dev.install --- kf5-messagelib-16.04.3/debian/libkf5webengineviewer-dev.install 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/libkf5webengineviewer-dev.install 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,6 @@ +usr/include/KF5/WebEngineViewer/ +usr/include/KF5/webengineviewer/ +usr/include/KF5/webengineviewer_version.h +usr/lib/*/cmake/KF5WebEngineViewer/ +usr/lib/*/libKF5WebEngineViewer.so +usr/lib/*/qt5/mkspecs/modules/qt_WebEngineViewer.pri diff -Nru kf5-messagelib-16.04.3/debian/patches/enable_debianabimanager.diff kf5-messagelib-16.12.3/debian/patches/enable_debianabimanager.diff --- kf5-messagelib-16.04.3/debian/patches/enable_debianabimanager.diff 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/patches/enable_debianabimanager.diff 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,8 @@ +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -139,3 +139,5 @@ endif() + + install( FILES messagelib.renamecategories messagelib.categories DESTINATION ${KDE_INSTALL_CONFDIR} ) + feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) ++ ++include(/usr/share/pkg-kde-tools/cmake/DebianABIManager.cmake) diff -Nru kf5-messagelib-16.04.3/debian/patches/kubuntu_disable_failing_tests.diff kf5-messagelib-16.12.3/debian/patches/kubuntu_disable_failing_tests.diff --- kf5-messagelib-16.04.3/debian/patches/kubuntu_disable_failing_tests.diff 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/patches/kubuntu_disable_failing_tests.diff 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,32 @@ +Author: José Manuel Santamaría Lema +Description: Disable some tests which are either unreliable/broken or we just + didn't figure out how to execute them in a proper environment. +--- a/messagecomposer/autotests/CMakeLists.txt ++++ b/messagecomposer/autotests/CMakeLists.txt +@@ -39,7 +39,7 @@ endmacro() + + # Utility stuff. + add_messagecomposer_test( utiltest.cpp ) +-add_messagecomposer_test( messagefactorytest.cpp ) ++#add_messagecomposer_test( messagefactorytest.cpp ) + add_messagecomposer_test( plugineditorcheckbeforesendparamstest.cpp ) + + # Non-content jobs. +@@ -51,7 +51,7 @@ add_messagecomposer_test( multipartjobte + + # More complex content jobs. + add_messagecomposer_test( attachmentjobtest.cpp ) +-add_messagecomposer_test( maintextjobtest.cpp ) ++#add_messagecomposer_test( maintextjobtest.cpp ) + + # Composer. + add_messagecomposer_test( composertest.cpp ) +@@ -71,6 +71,6 @@ add_messagecomposer_test( recipientsedit + set(KDEPIMLIBS_RUN_ISOLATED_TESTS TRUE) + set(KDEPIMLIBS_RUN_SQLITE_ISOLATED_TESTS TRUE) + +-add_akonadi_isolated_test_advanced( followupreminderselectdatedialogtest.cpp "../src/followupreminder/followupreminderselectdatedialog.cpp" "KF5::CalendarCore;KF5::AkonadiCore;KF5::AkonadiWidgets;KF5::MessageComposer") ++#add_akonadi_isolated_test_advanced( followupreminderselectdatedialogtest.cpp "../src/followupreminder/followupreminderselectdatedialog.cpp" "KF5::CalendarCore;KF5::AkonadiCore;KF5::AkonadiWidgets;KF5::MessageComposer") + +-add_akonadi_isolated_test_advanced( attachmentvcardfromaddressbookjobtest.cpp "../src/job/attachmentvcardfromaddressbookjob.cpp" "KF5::CalendarCore;KF5::AkonadiCore;KF5::AkonadiWidgets;KF5::MessageComposer") ++#add_akonadi_isolated_test_advanced( attachmentvcardfromaddressbookjobtest.cpp "../src/job/attachmentvcardfromaddressbookjob.cpp" "KF5::CalendarCore;KF5::AkonadiCore;KF5::AkonadiWidgets;KF5::MessageComposer") diff -Nru kf5-messagelib-16.04.3/debian/patches/kubuntu_disable_gpgagent_tests.diff kf5-messagelib-16.12.3/debian/patches/kubuntu_disable_gpgagent_tests.diff --- kf5-messagelib-16.04.3/debian/patches/kubuntu_disable_gpgagent_tests.diff 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/patches/kubuntu_disable_gpgagent_tests.diff 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,66 @@ +Author: José Manuel Santamaría Lema +Description: Disable temporarily the tests needing the gpg agent while + upstream deals properly with this problem: + https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=847206 + Note that fixing these tests wouldn't be as simple as setting the GNUPGHOME in + debian/tests/testsuite, see upstream cmake/modules/* files in this package. +--- a/messagecomposer/autotests/CMakeLists.txt ++++ b/messagecomposer/autotests/CMakeLists.txt +@@ -55,7 +55,7 @@ add_messagecomposer_test( maintextjobtes + + # Composer. + add_messagecomposer_test( composertest.cpp ) +-add_messagecomposer_cryptotest( cryptocomposertest.cpp ) ++#add_messagecomposer_cryptotest( cryptocomposertest.cpp ) + add_messagecomposer_test( infoparttest.cpp ) + add_messagecomposer_test( textparttest.cpp ) + add_messagecomposer_test( globalparttest.cpp ) +@@ -64,9 +64,9 @@ add_messagecomposer_test( composerviewba + add_messagecomposer_test( recipientseditortest.cpp ) + + # Crypto +-add_messagecomposer_cryptotest( signjobtest.cpp ) +-add_messagecomposer_cryptotest( encryptjobtest.cpp ) +-add_messagecomposer_cryptotest( signencrypttest.cpp ) ++# add_messagecomposer_cryptotest( signjobtest.cpp ) ++# add_messagecomposer_cryptotest( encryptjobtest.cpp ) ++# add_messagecomposer_cryptotest( signencrypttest.cpp ) + + set(KDEPIMLIBS_RUN_ISOLATED_TESTS TRUE) + set(KDEPIMLIBS_RUN_SQLITE_ISOLATED_TESTS TRUE) +--- a/mimetreeparser/autotests/CMakeLists.txt ++++ b/mimetreeparser/autotests/CMakeLists.txt +@@ -36,6 +36,6 @@ macro(add_mimetreeparser_crypto_unittest + add_gpg_crypto_test(${_name} mimetreeparser-${_name}) + endmacro () + +-add_mimetreeparser_crypto_unittest(attachmenttest.cpp) ++#add_mimetreeparser_crypto_unittest(attachmenttest.cpp) + add_mimetreeparser_unittest(nodehelpertest.cpp) + add_mimetreeparser_class_unittest( cryptohelpertest.cpp "../src/viewer/cryptohelper.cpp") +--- a/messageviewer/src/messagepartthemes/default/autotests/CMakeLists.txt ++++ b/messageviewer/src/messagepartthemes/default/autotests/CMakeLists.txt +@@ -18,9 +18,9 @@ macro(add_messageviewer_crypto_unittest + add_gpg_crypto_test(${_name} messageviewer-messageparttheme-${_name}) + endmacro () + +-add_messageviewer_crypto_unittest(objecttreeparsertest.cpp) +-add_messageviewer_crypto_unittest(rendertest.cpp) +-add_messageviewer_crypto_unittest(unencryptedmessagetest.cpp) ++#add_messageviewer_crypto_unittest(objecttreeparsertest.cpp) ++#add_messageviewer_crypto_unittest(rendertest.cpp) ++#add_messageviewer_crypto_unittest(unencryptedmessagetest.cpp) + + ecm_add_test(quotehtmltest.cpp setupenv.cpp ../defaultrenderer.cpp ../htmlblock.cpp ../converthtmltoplaintext.cpp ../../../messageviewer_debug.cpp + TEST_NAME quotehtmltest +--- a/templateparser/autotests/CMakeLists.txt ++++ b/templateparser/autotests/CMakeLists.txt +@@ -28,6 +28,6 @@ macro(add_templateparser_unittest _sourc + add_gpg_crypto_test(${_name} templateparser-${_name}) + endmacro() + +-add_templateparser_unittest(templateparsertest.cpp) +-add_templateparser_unittest(customtemplatesmenutest.cpp) ++#add_templateparser_unittest(templateparsertest.cpp) ++#add_templateparser_unittest(customtemplatesmenutest.cpp) + diff -Nru kf5-messagelib-16.04.3/debian/patches/series kf5-messagelib-16.12.3/debian/patches/series --- kf5-messagelib-16.04.3/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/patches/series 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,3 @@ +enable_debianabimanager.diff +kubuntu_disable_gpgagent_tests.diff +kubuntu_disable_failing_tests.diff diff -Nru kf5-messagelib-16.04.3/debian/source.lintian-overrides kf5-messagelib-16.12.3/debian/source.lintian-overrides --- kf5-messagelib-16.04.3/debian/source.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/source.lintian-overrides 2017-05-01 19:27:51.000000000 +0000 @@ -0,0 +1,3 @@ +kf5-messagelib source: source-is-missing webengineviewer/src/data/jquery.min.js +kf5-messagelib source: source-is-missing webengineviewer/src/data/jquery-ui.js +kf5-messagelib source: source-is-missing webengineviewer/src/data/jquery-ui.js line length is 516 characters (>512) diff -Nru kf5-messagelib-16.04.3/debian/tests/control kf5-messagelib-16.12.3/debian/tests/control --- kf5-messagelib-16.04.3/debian/tests/control 2016-09-30 04:32:13.000000000 +0000 +++ kf5-messagelib-16.12.3/debian/tests/control 2017-05-01 19:27:51.000000000 +0000 @@ -1,7 +1,7 @@ Tests: testsuite Depends: @, @builddeps@, build-essential, xvfb, xauth, dbus-x11, libgl1-mesa-dri, gnupg-agent, akonadi-server, - akonadi-backend-sqlite, oxygen5-icon-theme, openbox, + akonadi-backend-sqlite, breeze-icon-theme, openbox, libkf5akonadi-dev-bin, libkf5akonadisearch-bin, kinit Restrictions: build-needed diff -Nru kf5-messagelib-16.04.3/.gitignore kf5-messagelib-16.12.3/.gitignore --- kf5-messagelib-16.04.3/.gitignore 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/.gitignore 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,3 @@ +# Ignore the following files +/build/ +CMakeLists.txt.user* diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/attachmentjobtest.cpp kf5-messagelib-16.12.3/messagecomposer/autotests/attachmentjobtest.cpp --- kf5-messagelib-16.04.3/messagecomposer/autotests/attachmentjobtest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/attachmentjobtest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -42,9 +42,9 @@ void AttachmentJobTest::testAttachment() { - const QString name = QString::fromLatin1("name"); - const QString fileName = QString::fromLatin1("filename"); - const QString description = QString::fromLatin1("long long long description..."); + const QString name = QStringLiteral("name"); + const QString fileName = QStringLiteral("filename"); + const QString description = QStringLiteral("long long long description..."); const QByteArray mimeType("x-some/x-type"); const QByteArray data("la la la"); diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/CMakeLists.txt kf5-messagelib-16.12.3/messagecomposer/autotests/CMakeLists.txt --- kf5-messagelib-16.04.3/messagecomposer/autotests/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -16,7 +16,6 @@ set( _test cryptofunctions.cpp setupenv.cpp ${_source} ) get_filename_component( _name ${_source} NAME_WE ) add_executable( ${_name} ${_test} ) - ecm_mark_as_test(messagecomposer-${_name}) target_link_libraries( ${_name} KF5::Mime @@ -28,19 +27,20 @@ KF5::PimTextEdit KF5::AkonadiCore Qt5::Test - KF5::QGpgme + QGpgme KF5::IconThemes KF5::Completion KF5::MailTransport KF5::Ldap ) - add_gpg_crypto_test(${_name} ${_name}) + add_gpg_crypto_test(${_name} messagecomposer-${_name}) endmacro() # Utility stuff. add_messagecomposer_test( utiltest.cpp ) add_messagecomposer_test( messagefactorytest.cpp ) +add_messagecomposer_test( plugineditorcheckbeforesendparamstest.cpp ) # Non-content jobs. add_messagecomposer_test( skeletonmessagejobtest.cpp ) @@ -53,8 +53,6 @@ add_messagecomposer_test( attachmentjobtest.cpp ) add_messagecomposer_test( maintextjobtest.cpp ) -add_messagecomposer_test( attachmentvcardfromaddressbookjobtest.cpp ) - # Composer. add_messagecomposer_test( composertest.cpp ) add_messagecomposer_cryptotest( cryptocomposertest.cpp ) @@ -63,6 +61,8 @@ add_messagecomposer_test( globalparttest.cpp ) add_messagecomposer_test( composerviewbasetest.cpp ) +add_messagecomposer_test( recipientseditortest.cpp ) + # Crypto add_messagecomposer_cryptotest( signjobtest.cpp ) add_messagecomposer_cryptotest( encryptjobtest.cpp ) @@ -73,3 +73,4 @@ add_akonadi_isolated_test_advanced( followupreminderselectdatedialogtest.cpp "../src/followupreminder/followupreminderselectdatedialog.cpp" "KF5::CalendarCore;KF5::AkonadiCore;KF5::AkonadiWidgets;KF5::MessageComposer") +add_akonadi_isolated_test_advanced( attachmentvcardfromaddressbookjobtest.cpp "../src/job/attachmentvcardfromaddressbookjob.cpp" "KF5::CalendarCore;KF5::AkonadiCore;KF5::AkonadiWidgets;KF5::MessageComposer") diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/composertest.cpp kf5-messagelib-16.12.3/messagecomposer/autotests/composertest.cpp --- kf5-messagelib-16.04.3/messagecomposer/autotests/composertest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/composertest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -50,8 +50,7 @@ QVERIFY(composer->exec()); QCOMPARE(composer->resultMessages().size(), 1); - KMime::Message::Ptr message = composer->resultMessages().first(); - qDebug() << message->encodedContent(); + KMime::Message::Ptr message = composer->resultMessages().constFirst(); delete composer; composer = Q_NULLPTR; @@ -120,8 +119,7 @@ QVERIFY(composer->exec()); QCOMPARE(composer->resultMessages().size(), 1); - const KMime::Message::Ptr message = composer->resultMessages().first(); - qDebug() << message->encodedContent(); + const KMime::Message::Ptr message = composer->resultMessages().constFirst(); message->assemble(); message->parse(); QCOMPARE(message->bcc(false)->displayNames().size(), 1); @@ -129,11 +127,11 @@ QCOMPARE(message->cc(false)->displayNames().size(), 1); QCOMPARE(message->from(false)->displayNames().size(), 1); QCOMPARE(message->replyTo(false)->displayNames().size(), 1); - QCOMPARE(message->from()->displayNames().first().toUtf8(), fromDisplayName.toUtf8()); - QCOMPARE(message->to()->displayNames().first().toUtf8(), toDisplayName.toUtf8()); - QCOMPARE(message->cc()->displayNames().first().toUtf8(), ccDisplayName.toUtf8()); - QCOMPARE(message->bcc()->displayNames().first().toUtf8(), bccDisplayName.toUtf8()); - QCOMPARE(message->replyTo()->displayNames().first().toUtf8(), replyToDisplayName.toUtf8()); + QCOMPARE(message->from()->displayNames().constFirst(), fromDisplayName); + QCOMPARE(message->to()->displayNames().constFirst(), toDisplayName); + QCOMPARE(message->cc()->displayNames().constFirst(), ccDisplayName); + QCOMPARE(message->bcc()->displayNames().constFirst(), bccDisplayName); + QCOMPARE(message->replyTo()->displayNames().constFirst(), replyToDisplayName); delete composer; composer = Q_NULLPTR; } diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/cryptocomposertest.cpp kf5-messagelib-16.12.3/messagecomposer/autotests/cryptocomposertest.cpp --- kf5-messagelib-16.04.3/messagecomposer/autotests/cryptocomposertest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/cryptocomposertest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -40,6 +40,7 @@ #include #include #include +#include "MessageComposer/Util" #include #include using namespace MessageComposer; @@ -48,7 +49,7 @@ #include #include -#include +#include using MessageCore::AttachmentPart; @@ -156,14 +157,14 @@ TestCSSHelper testCSSHelper; MessageComposer::Test::TestObjectTreeSource testSource(&testWriter, &testCSSHelper); testSource.setAllowDecryption(true); - MessageViewer::NodeHelper *nh = new MessageViewer::NodeHelper; - MessageViewer::ObjectTreeParser otp(&testSource, nh); - MessageViewer::ProcessResult pResult(nh); + MimeTreeParser::NodeHelper *nh = new MimeTreeParser::NodeHelper; + MimeTreeParser::ObjectTreeParser otp(&testSource, nh); + MimeTreeParser::ProcessResult pResult(nh); otp.parseObjectTree(message.data()); KMime::Message::Ptr unencrypted = nh->unencryptedMessage(message); - KMime::Content *testAttachment = MessageViewer::ObjectTreeParser::findType(unencrypted.data(), "x-some", "x-type", true, true); + KMime::Content *testAttachment = Util::findTypeInMessage(unencrypted.data(), "x-some", "x-type"); QCOMPARE(testAttachment->body(), QString::fromLatin1("abc").toUtf8()); QCOMPARE(testAttachment->contentDisposition()->filename(), QString::fromLatin1("anattachment.txt")); @@ -203,7 +204,7 @@ KMime::Message::Ptr message = composer->resultMessages().first(); delete composer; - composer = 0; + composer = Q_NULLPTR; // setup a viewer ComposerViewBase view(this, 0); @@ -269,7 +270,7 @@ KMime::Message::Ptr message = composer->resultMessages().first(); delete composer; - composer = 0; + composer = Q_NULLPTR; // setup a viewer ComposerViewBase view(this, 0); @@ -556,7 +557,7 @@ { std::vector keys = MessageComposer::Test::getKeys(); - qDebug() << "got num of keys:" << keys.size(); + //qDebug() << "got num of keys:" << keys.size(); QStringList recipients; recipients << QString::fromLocal8Bit("you@you.you"); diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/cryptofunctions.cpp kf5-messagelib-16.12.3/messagecomposer/autotests/cryptofunctions.cpp --- kf5-messagelib-16.04.3/messagecomposer/autotests/cryptofunctions.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/cryptofunctions.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -23,15 +23,15 @@ #include "testhtmlwriter.h" #include "testcsshelper.h" +#include "MessageComposer/Util" + #include -#include -#include -#include -#include +#include +#include -#include -#include #include +#include +#include #include @@ -41,6 +41,8 @@ #include #include +using namespace MessageComposer; + void ComposerTestUtil::verify(bool sign, bool encrypt, KMime::Content *content, QByteArray origContent, Kleo::CryptoMessageFormat f, KMime::Headers::contentEncoding encoding) { if (sign && encrypt) { @@ -63,32 +65,32 @@ TestHtmlWriter testWriter; TestCSSHelper testCSSHelper; MessageComposer::Test::TestObjectTreeSource testSource(&testWriter, &testCSSHelper); - MessageViewer::NodeHelper *nh = new MessageViewer::NodeHelper; - MessageViewer::ObjectTreeParser otp(&testSource, nh); - MessageViewer::ProcessResult pResult(nh); + MimeTreeParser::NodeHelper *nh = new MimeTreeParser::NodeHelper; + MimeTreeParser::ObjectTreeParser otp(&testSource, nh); + MimeTreeParser::ProcessResult pResult(nh); // ensure the signed part exists and is parseable if (f & Kleo::OpenPGPMIMEFormat) { // process the result.. otp.parseObjectTree(resultMessage); - KMime::Content *signedPart = MessageViewer::ObjectTreeParser::findType(resultMessage, "application", "pgp-signature", true, true); + KMime::Content *signedPart = Util::findTypeInMessage(resultMessage, "application", "pgp-signature"); Q_ASSERT(signedPart); QCOMPARE(signedPart->contentTransferEncoding()->encoding(), KMime::Headers::CE7Bit); Q_UNUSED(signedPart); - //Q_ASSERT( nh->signatureState( resultMessage ) == MessageViewer::KMMsgFullySigned ); + //Q_ASSERT( nh->signatureState( resultMessage ) == MimeTreeParser::KMMsgFullySigned ); QCOMPARE(MessageCore::NodeHelper::firstChild(resultMessage)->contentTransferEncoding()->encoding(), encoding); } else if (f & Kleo::InlineOpenPGPFormat) { // process the result.. otp.parseObjectTree(resultMessage); - QCOMPARE(nh->signatureState(resultMessage), MessageViewer::KMMsgFullySigned); + QCOMPARE(nh->signatureState(resultMessage), MimeTreeParser::KMMsgFullySigned); QCOMPARE(resultMessage->contentTransferEncoding()->encoding(), encoding); } else if (f & Kleo::AnySMIME) { if (f & Kleo::SMIMEFormat) { - KMime::Content *signedPart = MessageViewer::ObjectTreeParser::findType(resultMessage, "application", "pkcs7-signature", true, true); + KMime::Content *signedPart = Util::findTypeInMessage(resultMessage, "application", "pkcs7-signature"); Q_ASSERT(signedPart); QCOMPARE(signedPart->contentTransferEncoding()->encoding(), KMime::Headers::CEbase64); QCOMPARE(signedPart->contentType()->mimeType(), QByteArray("application/pkcs7-signature")); @@ -104,7 +106,7 @@ QCOMPARE(resultMessage->contentType()->parameter(QString::fromLatin1("micalg")), QString::fromLatin1("sha1")); } else if (f & Kleo::SMIMEOpaqueFormat) { - KMime::Content *signedPart = MessageViewer::ObjectTreeParser::findType(resultMessage, "application", "pkcs7-mime", true, true); + KMime::Content *signedPart = Util::findTypeInMessage(resultMessage, "application", "pkcs7-mime"); Q_ASSERT(signedPart); QCOMPARE(signedPart->contentTransferEncoding()->encoding(), KMime::Headers::CEbase64); QCOMPARE(signedPart->contentType()->mimeType(), QByteArray("application/pkcs7-mime")); @@ -117,7 +119,7 @@ // process the result.. otp.parseObjectTree(resultMessage); - //Q_ASSERT( nh->signatureState( resultMessage ) == MessageViewer::KMMsgFullySigned ); + //Q_ASSERT( nh->signatureState( resultMessage ) == MimeTreeParser::KMMsgFullySigned ); } // make sure the good sig is of what we think it is @@ -138,19 +140,18 @@ TestCSSHelper testCSSHelper; MessageComposer::Test::TestObjectTreeSource testSource(&testWriter, &testCSSHelper); testSource.setAllowDecryption(true); - MessageViewer::NodeHelper *nh = new MessageViewer::NodeHelper; - MessageViewer::ObjectTreeParser otp(&testSource, nh); - MessageViewer::ProcessResult pResult(nh); + MimeTreeParser::NodeHelper *nh = new MimeTreeParser::NodeHelper; + MimeTreeParser::ObjectTreeParser otp(&testSource, nh); if (f & Kleo::OpenPGPMIMEFormat) { // ensure the enc part exists and is parseable - KMime::Content *encPart = MessageViewer::ObjectTreeParser::findType(resultMessage.data(), "application", "pgp-encrypted", true, true); + KMime::Content *encPart = Util::findTypeInMessage(resultMessage.data(), "application", "pgp-encrypted"); Q_ASSERT(encPart); Q_UNUSED(encPart); // process the result.. otp.parseObjectTree(resultMessage.data()); - QCOMPARE(nh->encryptionState(resultMessage.data()), MessageViewer::KMMsgFullyEncrypted); + QCOMPARE(nh->encryptionState(resultMessage.data()), MimeTreeParser::KMMsgFullyEncrypted); } else if (f & Kleo::InlineOpenPGPFormat) { if (withAttachment) { @@ -160,13 +161,12 @@ resultMessage->parse(); } - otp.processTextPlainSubtype(resultMessage.data(), pResult); - - QCOMPARE(pResult.inlineEncryptionState(), MessageViewer::KMMsgFullyEncrypted); + otp.parseObjectTree(resultMessage.data()); + QCOMPARE(nh->encryptionState(resultMessage.data()), MimeTreeParser::KMMsgFullyEncrypted); } else if (f & Kleo::AnySMIME) { // ensure the enc part exists and is parseable - KMime::Content *encPart = MessageViewer::ObjectTreeParser::findType(resultMessage.data(), "application", "pkcs7-mime", true, true); + KMime::Content *encPart = Util::findTypeInMessage(resultMessage.data(), "application", "pkcs7-mime"); Q_ASSERT(encPart); QCOMPARE(encPart->contentType()->mimeType(), QByteArray("application/pkcs7-mime")); @@ -177,7 +177,7 @@ Q_UNUSED(encPart); otp.parseObjectTree(resultMessage.data()); - QCOMPARE(nh->encryptionState(resultMessage.data()), MessageViewer::KMMsgFullyEncrypted); + QCOMPARE(nh->encryptionState(resultMessage.data()), MimeTreeParser::KMMsgFullyEncrypted); } QCOMPARE(otp.plainTextContent().trimmed(), QString::fromUtf8(encrContent).trimmed()); @@ -197,29 +197,27 @@ TestCSSHelper testCSSHelper; MessageComposer::Test::TestObjectTreeSource testSource(&testWriter, &testCSSHelper); testSource.setAllowDecryption(true); - MessageViewer::NodeHelper *nh = new MessageViewer::NodeHelper; - MessageViewer::ObjectTreeParser otp(&testSource, nh); - MessageViewer::ProcessResult pResult(nh); + MimeTreeParser::NodeHelper *nh = new MimeTreeParser::NodeHelper; + MimeTreeParser::ObjectTreeParser otp(&testSource, nh); if (f & Kleo::OpenPGPMIMEFormat) { // ensure the enc part exists and is parseable - KMime::Content *encPart = MessageViewer::ObjectTreeParser::findType(resultMessage.data(), "application", "pgp-encrypted", true, true); + KMime::Content *encPart = Util::findTypeInMessage(resultMessage.data(), "application", "pgp-encrypted"); Q_ASSERT(encPart); Q_UNUSED(encPart); otp.parseObjectTree(resultMessage.data()); - QCOMPARE(nh->encryptionState(resultMessage.data()), MessageViewer::KMMsgFullyEncrypted); + QCOMPARE(nh->encryptionState(resultMessage.data()), MimeTreeParser::KMMsgFullyEncrypted); QList< KMime::Content * > extra = nh->extraContents(resultMessage.data()); - qDebug() << "size:" << extra.size(); QCOMPARE(extra.size(), 1); - QCOMPARE(nh->signatureState(extra[ 0 ]), MessageViewer::KMMsgFullySigned); + QCOMPARE(nh->signatureState(extra[ 0 ]), MimeTreeParser::KMMsgFullySigned); } else if (f & Kleo::InlineOpenPGPFormat) { - otp.processTextPlainSubtype(resultMessage.data(), pResult); + otp.parseObjectTree(resultMessage.data()); - QCOMPARE(pResult.inlineEncryptionState(), MessageViewer::KMMsgFullyEncrypted); - QCOMPARE(pResult.inlineSignatureState(), MessageViewer::KMMsgFullySigned); + QCOMPARE(nh->encryptionState(resultMessage.data()), MimeTreeParser::KMMsgFullyEncrypted); + QCOMPARE(nh->signatureState(resultMessage.data()), MimeTreeParser::KMMsgFullySigned); } else if (f & Kleo::AnySMIME) { - KMime::Content *encPart = MessageViewer::ObjectTreeParser::findType(resultMessage.data(), "application", "pkcs7-mime", true, true); + KMime::Content *encPart = Util::findTypeInMessage(resultMessage.data(), "application", "pkcs7-mime"); Q_ASSERT(encPart); QCOMPARE(encPart->contentType()->mimeType(), QByteArray("application/pkcs7-mime")); QCOMPARE(encPart->contentType()->name(), QString::fromLatin1("smime.p7m")); @@ -229,12 +227,11 @@ Q_UNUSED(encPart); otp.parseObjectTree(resultMessage.data()); - QCOMPARE(nh->encryptionState(resultMessage.data()), MessageViewer::KMMsgFullyEncrypted); + QCOMPARE(nh->encryptionState(resultMessage.data()), MimeTreeParser::KMMsgFullyEncrypted); QList< KMime::Content * > extra = nh->extraContents(resultMessage.data()); - qDebug() << "size:" << extra.size(); QCOMPARE(extra.size(), 1); - QCOMPARE(nh->signatureState(extra[ 0 ]), MessageViewer::KMMsgFullySigned); + QCOMPARE(nh->signatureState(extra[ 0 ]), MimeTreeParser::KMMsgFullySigned); } QCOMPARE(otp.plainTextContent().trimmed(), QString::fromUtf8(origContent).trimmed()); Q_UNUSED(origContent); diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/data/list_message.mbox kf5-messagelib-16.12.3/messagecomposer/autotests/data/list_message.mbox --- kf5-messagelib-16.04.3/messagecomposer/autotests/data/list_message.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/data/list_message.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,11 @@ +From: Sudhendu Kumar +To: I Dont Know +Cc: Yes I Know +Subject: Plain Message Test +List-Post: +Date: Tue, 16 Aug 2011 17:03:52 +0530 +MIME-Version: 1.0 +Content-Type: multipart/alternative; boundary="nextPart7970347.4U2bZv7Mgu" +Content-Transfer-Encoding: 7Bit + +This is a mail from ML diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/data/replyall_with_identity_message_and_identity_in_cc.mbox kf5-messagelib-16.12.3/messagecomposer/autotests/data/replyall_with_identity_message_and_identity_in_cc.mbox --- kf5-messagelib-16.04.3/messagecomposer/autotests/data/replyall_with_identity_message_and_identity_in_cc.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/data/replyall_with_identity_message_and_identity_in_cc.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,11 @@ +From: Bla +To: blo , bli +Cc: blu , bly , Bla +Sender: Bla1 +Subject: Plain Message Test +Date: Tue, 16 Aug 2011 17:03:52 +0530 +MIME-Version: 1.0 +Content-Type: multipart/alternative; boundary="nextPart7970347.4U2bZv7Mgu" +Content-Transfer-Encoding: 7Bit + +This is a mail for testing replyall and sender diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/data/replyall_with_identity_message.mbox kf5-messagelib-16.12.3/messagecomposer/autotests/data/replyall_with_identity_message.mbox --- kf5-messagelib-16.04.3/messagecomposer/autotests/data/replyall_with_identity_message.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/data/replyall_with_identity_message.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,11 @@ +From: Bla +To: blo , bli +Cc: blu , bly +Sender: Bla1 +Subject: Plain Message Test +Date: Tue, 16 Aug 2011 17:03:52 +0530 +MIME-Version: 1.0 +Content-Type: multipart/alternative; boundary="nextPart7970347.4U2bZv7Mgu" +Content-Transfer-Encoding: 7Bit + +This is a mail for testing replyall and sender diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/data/replyall_without_identity_message.mbox kf5-messagelib-16.12.3/messagecomposer/autotests/data/replyall_without_identity_message.mbox --- kf5-messagelib-16.04.3/messagecomposer/autotests/data/replyall_without_identity_message.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/data/replyall_without_identity_message.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,11 @@ +From: Bla +To: blo , bli +Cc: blu , bly +Sender: Bla1 +Subject: Plain Message Test +Date: Tue, 16 Aug 2011 17:03:52 +0530 +MIME-Version: 1.0 +Content-Type: multipart/alternative; boundary="nextPart7970347.4U2bZv7Mgu" +Content-Transfer-Encoding: 7Bit + +This is a mail for testing replyall and sender diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/encryptjobtest.cpp kf5-messagelib-16.12.3/messagecomposer/autotests/encryptjobtest.cpp --- kf5-messagelib-16.04.3/messagecomposer/autotests/encryptjobtest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/encryptjobtest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -28,8 +28,6 @@ #include #include -#include -#include #include #include @@ -38,9 +36,9 @@ #include #include -#include +#include #include -#include +#include #include #include diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/followupreminderselectdatedialogtest.cpp kf5-messagelib-16.12.3/messagecomposer/autotests/followupreminderselectdatedialogtest.cpp --- kf5-messagelib-16.04.3/messagecomposer/autotests/followupreminderselectdatedialogtest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/followupreminderselectdatedialogtest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "followupreminderselectdatedialogtest.h" diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/followupreminderselectdatedialogtest.h kf5-messagelib-16.12.3/messagecomposer/autotests/followupreminderselectdatedialogtest.h --- kf5-messagelib-16.04.3/messagecomposer/autotests/followupreminderselectdatedialogtest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/followupreminderselectdatedialogtest.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef FOLLOWUPREMINDERSELECTDATEDIALOGTEST_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/globalparttest.cpp kf5-messagelib-16.12.3/messagecomposer/autotests/globalparttest.cpp --- kf5-messagelib-16.04.3/messagecomposer/autotests/globalparttest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/globalparttest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "globalparttest.h" diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/globalparttest.h kf5-messagelib-16.12.3/messagecomposer/autotests/globalparttest.h --- kf5-messagelib-16.04.3/messagecomposer/autotests/globalparttest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/globalparttest.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef GLOBALPARTTEST_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/infoparttest.cpp kf5-messagelib-16.12.3/messagecomposer/autotests/infoparttest.cpp --- kf5-messagelib-16.04.3/messagecomposer/autotests/infoparttest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/infoparttest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "infoparttest.h" diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/infoparttest.h kf5-messagelib-16.12.3/messagecomposer/autotests/infoparttest.h --- kf5-messagelib-16.04.3/messagecomposer/autotests/infoparttest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/infoparttest.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef INFOPARTTEST_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/messagefactorytest.cpp kf5-messagelib-16.12.3/messagecomposer/autotests/messagefactorytest.cpp --- kf5-messagelib-16.04.3/messagecomposer/autotests/messagefactorytest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/messagefactorytest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -29,16 +29,17 @@ #include "MessageComposer/MessageFactory" #include "MessageComposer/GlobalPart" #include "MessageComposer/MessageComposerSettings" +#include "MessageComposer/Util" #include "MessageComposer/InfoPart" #include "MessageComposer/TextPart" #include "testhtmlwriter.h" #include "testcsshelper.h" -#include #include -#include +#include +#include #include "qtest_messagecomposer.h" #include @@ -53,7 +54,14 @@ #include "globalsettings_templateparser.h" using namespace MessageComposer; -using namespace MessageComposer; + +#ifndef Q_OS_WIN +void initLocale() +{ + setenv("LC_ALL", "en_US.utf-8", 1); +} +Q_CONSTRUCTOR_FUNCTION(initLocale) +#endif namespace { @@ -99,10 +107,12 @@ //qDebug( "result ( a@%d b@%d ):\n%s\n--end", ai, bi, result.constData() ); } - for (int i = ai; i < al.size(); ++i) { + const int sizeal(al.size()); + for (int i = ai; i < sizeal; ++i) { result += "- " + al[i] + '\n'; } - for (int i = bi; i < bl.size(); ++i) { + const int sizebl(bl.size()); + for (int i = bi; i < sizebl; ++i) { result += "+ " + bl[i] + '\n'; } return result; @@ -116,25 +126,217 @@ QTEST_MAIN(MessageFactoryTest) +void MessageFactoryTest::cleanupTestCase() +{ + delete mIdentMan; + mIdentMan = Q_NULLPTR; + QDir dir(QDir::homePath() + QStringLiteral("/.qttest/")); + dir.removeRecursively(); +} + void MessageFactoryTest::initTestCase() { - // Force fake XDG dirs and KDEHOME so that KIdentityManagement does not + // Force fake XDG dirs so that KIdentityManagement does not // read actual user data when running tests locally QStandardPaths::setTestModeEnabled(true); - qputenv("KDEHOME", "~/.qttest/kde"); + mIdentMan = new KIdentityManagement::IdentityManager; + + KIdentityManagement::Identity &ident = mIdentMan->modifyIdentityForUoid(mIdentMan->identityForUoidOrDefault(0).uoid()); + ident.setFullName(QStringLiteral("another")); + ident.setPrimaryEmailAddress(QStringLiteral("another@another.com")); + + mIdentMan->newFromScratch(QStringLiteral("test1")); + mIdentMan->newFromScratch(QStringLiteral("test2")); + mIdentMan->newFromScratch(QStringLiteral("test3")); + mIdentMan->setAsDefault(ident.uoid()); + mIdentMan->commit(); +} + +KMime::Message::Ptr MessageFactoryTest::loadMessage(const QString &filename) +{ + QFile mailFile(filename); + if (!mailFile.open(QIODevice::ReadOnly)) { + return {}; + } + const QByteArray mailData = KMime::CRLFtoLF(mailFile.readAll()); + if (mailData.isEmpty()) { + return {}; + } + KMime::Message::Ptr origMsg(new KMime::Message); + origMsg->setContent(mailData); + origMsg->parse(); + return origMsg; +} + +void MessageFactoryTest::testCreateReplyToAllWithUseSenderAndIdentityInCC() +{ + const QString filename(QStringLiteral(MAIL_DATA_DIR) + QStringLiteral("/replyall_with_identity_message_and_identity_in_cc.mbox")); + KMime::Message::Ptr msg = loadMessage(filename); + KIdentityManagement::Identity &i1 = mIdentMan->modifyIdentityForName(QStringLiteral("test1")); + i1.setFullName(QStringLiteral("foo1")); + i1.setPrimaryEmailAddress(QStringLiteral("identity1@bla.com")); + KIdentityManagement::Identity &i2 = mIdentMan->modifyIdentityForName(QStringLiteral("test2")); + i2.setFullName(QStringLiteral("foo2")); + i2.setPrimaryEmailAddress(QStringLiteral("identity2@bla.com")); + mIdentMan->commit(); + + MessageFactory factory(msg, 0); + factory.setReplyStrategy(ReplyAll); + factory.setIdentityManager(mIdentMan); + + MessageFactory::MessageReply reply = factory.createReply(); + reply.replyAll = true; + //qDebug() << reply.msg->body(); + + QDateTime date = msg->date()->dateTime(); + QString datetime = QLocale::system().toString(date.date(), QLocale::LongFormat); + datetime += QLatin1String(" ") + QLocale::system().toString(date.time(), QLocale::LongFormat); + QString replyStr = QStringLiteral("> This is a mail for testing replyall and sender"); + QCOMPARE(reply.msg->subject()->asUnicodeString(), QLatin1String("Re: Plain Message Test")); + QCOMPARE_OR_DIFF(reply.msg->body(), replyStr.toLatin1()); + + QString dateStr = reply.msg->date()->asUnicodeString(); + QString ba = QString::fromLatin1("From: another \n" + "Date: %1\n" + "Cc: blo , bli , blu , bly , Bla \n" + "To: Bla \n" + "Subject: Re: Plain Message Test\n" + "Content-Type: text/plain; charset=\"US-ASCII\"\n" + "Content-Transfer-Encoding: 8Bit\nMIME-Version: 1.0\n" + "X-KMail-Link-Message: 0\n" + "X-KMail-Link-Type: reply\n\n" + "%2") + .arg(dateStr).arg(replyStr); + QCOMPARE_OR_DIFF(reply.msg->encodedContent(), ba.toLatin1()); +} + +void MessageFactoryTest::testCreateReplyToAllWithUseSender() +{ + const QString filename(QStringLiteral(MAIL_DATA_DIR) + QStringLiteral("/replyall_with_identity_message.mbox")); + KMime::Message::Ptr msg = loadMessage(filename); + KIdentityManagement::Identity &i1 = mIdentMan->modifyIdentityForName(QStringLiteral("test1")); + i1.setFullName(QStringLiteral("foo1")); + i1.setPrimaryEmailAddress(QStringLiteral("identity1@bla.com")); + KIdentityManagement::Identity &i2 = mIdentMan->modifyIdentityForName(QStringLiteral("test2")); + i2.setFullName(QStringLiteral("foo2")); + i2.setPrimaryEmailAddress(QStringLiteral("identity2@bla.com")); + mIdentMan->commit(); + + MessageFactory factory(msg, 0); + factory.setReplyStrategy(ReplyAll); + factory.setIdentityManager(mIdentMan); + + MessageFactory::MessageReply reply = factory.createReply(); + reply.replyAll = true; + //qDebug() << reply.msg->body(); + + QDateTime date = msg->date()->dateTime(); + QString datetime = QLocale::system().toString(date.date(), QLocale::LongFormat); + datetime += QLatin1String(" ") + QLocale::system().toString(date.time(), QLocale::LongFormat); + QString replyStr = QStringLiteral("> This is a mail for testing replyall and sender"); + QCOMPARE(reply.msg->subject()->asUnicodeString(), QLatin1String("Re: Plain Message Test")); + QCOMPARE_OR_DIFF(reply.msg->body(), replyStr.toLatin1()); + + QString dateStr = reply.msg->date()->asUnicodeString(); + QString ba = QString::fromLatin1("From: another \n" + "Date: %1\n" + "Cc: blo , bli , blu , bly \n" + "To: Bla \n" + "Subject: Re: Plain Message Test\n" + "Content-Type: text/plain; charset=\"US-ASCII\"\n" + "Content-Transfer-Encoding: 8Bit\nMIME-Version: 1.0\n" + "X-KMail-Link-Message: 0\n" + "X-KMail-Link-Type: reply\n\n" + "%2") + .arg(dateStr).arg(replyStr); + QCOMPARE_OR_DIFF(reply.msg->encodedContent(), ba.toLatin1()); +} + +void MessageFactoryTest::testCreateReplyToAllWithUseSenderByNoSameIdentities() +{ + const QString filename(QStringLiteral(MAIL_DATA_DIR) + QStringLiteral("/replyall_without_identity_message.mbox")); + KMime::Message::Ptr msg = loadMessage(filename); + KIdentityManagement::Identity &i1 = mIdentMan->modifyIdentityForName(QStringLiteral("test1")); + i1.setFullName(QStringLiteral("foo1")); + i1.setPrimaryEmailAddress(QStringLiteral("identity1@bla.com")); + KIdentityManagement::Identity &i2 = mIdentMan->modifyIdentityForName(QStringLiteral("test2")); + i2.setFullName(QStringLiteral("foo2")); + i2.setPrimaryEmailAddress(QStringLiteral("identity2@bla.com")); + mIdentMan->commit(); + + MessageFactory factory(msg, 0); + factory.setReplyStrategy(ReplyAll); + factory.setIdentityManager(mIdentMan); + + MessageFactory::MessageReply reply = factory.createReply(); + reply.replyAll = true; + //qDebug() << reply.msg->body(); + + QDateTime date = msg->date()->dateTime(); + QString datetime = QLocale::system().toString(date.date(), QLocale::LongFormat); + datetime += QLatin1String(" ") + QLocale::system().toString(date.time(), QLocale::LongFormat); + QString replyStr = QStringLiteral("> This is a mail for testing replyall and sender"); + QCOMPARE(reply.msg->subject()->asUnicodeString(), QLatin1String("Re: Plain Message Test")); + QCOMPARE_OR_DIFF(reply.msg->body(), replyStr.toLatin1()); + + QString dateStr = reply.msg->date()->asUnicodeString(); + QString ba = QString::fromLatin1("From: another \n" + "Date: %1\n" + "Cc: blo , bli , blu , bly \n" + "To: Bla \n" + "Subject: Re: Plain Message Test\n" + "Content-Type: text/plain; charset=\"US-ASCII\"\n" + "Content-Transfer-Encoding: 8Bit\nMIME-Version: 1.0\n" + "X-KMail-Link-Message: 0\n" + "X-KMail-Link-Type: reply\n\n" + "%2") + .arg(dateStr).arg(replyStr); + QCOMPARE_OR_DIFF(reply.msg->encodedContent(), ba.toLatin1()); } -void MessageFactoryTest::testCreateReply() +void MessageFactoryTest::testCreateReplyToList() +{ + const QString filename(QStringLiteral(MAIL_DATA_DIR) + QStringLiteral("/list_message.mbox")); + KMime::Message::Ptr msg = loadMessage(filename); + + MessageFactory factory(msg, 0); + factory.setIdentityManager(mIdentMan); + factory.setReplyStrategy(ReplyList); + + MessageFactory::MessageReply reply = factory.createReply(); + reply.replyAll = true; + + QDateTime date = msg->date()->dateTime(); + QString datetime = QLocale::system().toString(date.date(), QLocale::LongFormat); + datetime += QLatin1String(" ") + QLocale::system().toString(date.time(), QLocale::LongFormat); + QString replyStr = QString::fromLatin1(QByteArray("> This is a mail from ML")); + QCOMPARE(reply.msg->subject()->asUnicodeString(), QLatin1String("Re: Plain Message Test")); + QCOMPARE_OR_DIFF(reply.msg->body(), replyStr.toLatin1()); + QString dateStr = reply.msg->date()->asUnicodeString(); + QString ba = QString::fromLatin1("From: another \n" + "Date: %1\n" + "To: list@list.org\n" + "Subject: Re: Plain Message Test\n" + "Content-Type: text/plain; charset=\"US-ASCII\"\n" + "Content-Transfer-Encoding: 8Bit\nMIME-Version: 1.0\n" + "X-KMail-Link-Message: 0\n" + "X-KMail-Link-Type: reply\n\n" + "%2") + .arg(dateStr).arg(replyStr); + QCOMPARE_OR_DIFF(reply.msg->encodedContent(), ba.toLatin1()); +} + +void MessageFactoryTest::testCreateReplyToAuthor() { KMime::Message::Ptr msg = createPlainTestMessage(); - KIdentityManagement::IdentityManager *identMan = new KIdentityManagement::IdentityManager; MessageFactory factory(msg, 0); - factory.setIdentityManager(identMan); + factory.setIdentityManager(mIdentMan); + factory.setReplyStrategy(ReplyAuthor); MessageFactory::MessageReply reply = factory.createReply(); reply.replyAll = true; - qDebug() << reply.msg->body(); + //qDebug() << reply.msg->body(); QDateTime date = msg->date()->dateTime(); QString datetime = QLocale::system().toString(date.date(), QLocale::LongFormat); @@ -142,43 +344,124 @@ QString replyStr = QString::fromLatin1(QByteArray(QByteArray("On ") + datetime.toLatin1() + QByteArray(" you wrote:\n> All happy families are alike; each unhappy family is unhappy in its own way.\n\n"))); QCOMPARE(reply.msg->subject()->asUnicodeString(), QLatin1String("Re: Test Email Subject")); QCOMPARE_OR_DIFF(reply.msg->body(), replyStr.toLatin1()); + QString replyTo = reply.msg->inReplyTo()->asUnicodeString(); + QString reference = reply.msg->references()->asUnicodeString(); + QString dateStr = reply.msg->date()->asUnicodeString(); + QString ba = QString::fromLatin1("From: another \n" + "Date: %1\n" + "X-KMail-Transport: 0\n" + "To: me@me.me\n" + "References: %3\n" + "In-Reply-To: %2\n" + "Subject: Re: Test Email Subject\n" + "X-KMail-CursorPos: 134\n" + "Content-Type: text/plain; charset=\"US-ASCII\"\n" + "Content-Transfer-Encoding: 8Bit\nMIME-Version: 1.0\n" + "X-KMail-Link-Message: 0\n" + "X-KMail-Link-Type: reply\n\n" + "%4") + .arg(dateStr).arg(replyTo).arg(reference).arg(replyStr); + QCOMPARE_OR_DIFF(reply.msg->encodedContent(), ba.toLatin1()); +} + +void MessageFactoryTest::testCreateReplyAllWithMultiEmails() +{ + KMime::Message::Ptr msg = createPlainTestMessageWithMultiEmails(); + + MessageFactory factory(msg, 0); + factory.setIdentityManager(mIdentMan); + factory.setReplyStrategy(ReplyAll); + + MessageFactory::MessageReply reply = factory.createReply(); + reply.replyAll = true; + //qDebug() << reply.msg->body(); + + QDateTime date = msg->date()->dateTime(); + QString datetime = QLocale::system().toString(date.date(), QLocale::LongFormat); + datetime += QLatin1String(" ") + QLocale::system().toString(date.time(), QLocale::LongFormat); + QString replyStr = QString::fromLatin1(QByteArray(QByteArray("On ") + datetime.toLatin1() + QByteArray(" you wrote:\n> All happy families are alike; each unhappy family is unhappy in its own way.\n\n"))); + QCOMPARE(reply.msg->subject()->asUnicodeString(), QLatin1String("Re: Test Email Subject")); + QString userAgent = reply.msg->userAgent()->asUnicodeString(); + QString replyTo = reply.msg->inReplyTo()->asUnicodeString(); + QString reference = reply.msg->references()->asUnicodeString(); + QString dateStr = reply.msg->date()->asUnicodeString(); + QString ba = QString::fromLatin1("From: another \n" + "Date: %1\n" + "X-KMail-Transport: 0\n" + "Cc: you@you.you, you2@you.you, cc@cc.cc, cc2@cc.cc\n" + "To: me@me.me\n" + "References: %3\n" + "In-Reply-To: %2\n" + "Subject: Re: Test Email Subject\nContent-Type: text/plain; charset=\"US-ASCII\"\n" + "Content-Transfer-Encoding: 8Bit\nMIME-Version: 1.0\n" + "X-KMail-Link-Message: 0\n" + "X-KMail-Link-Type: reply\n\n> All happy families are alike; each unhappy family is unhappy in its own way.") + .arg(dateStr).arg(replyTo).arg(reference); + QCOMPARE_OR_DIFF(reply.msg->encodedContent(), ba.toLatin1()); +} + +void MessageFactoryTest::testCreateReplyAll() +{ + KMime::Message::Ptr msg = createPlainTestMessage(); + MessageFactory factory(msg, 0); + factory.setIdentityManager(mIdentMan); + + MessageFactory::MessageReply reply = factory.createReply(); + reply.replyAll = true; + //qDebug() << reply.msg->body(); + + QDateTime date = msg->date()->dateTime(); + QString datetime = QLocale::system().toString(date.date(), QLocale::LongFormat); + datetime += QLatin1String(" ") + QLocale::system().toString(date.time(), QLocale::LongFormat); + QString replyStr = QString::fromLatin1(QByteArray(QByteArray("On ") + datetime.toLatin1() + QByteArray(" you wrote:\n> All happy families are alike; each unhappy family is unhappy in its own way.\n\n"))); + QCOMPARE(reply.msg->subject()->asUnicodeString(), QLatin1String("Re: Test Email Subject")); + QCOMPARE_OR_DIFF(reply.msg->body(), replyStr.toLatin1()); } void MessageFactoryTest::testCreateReplyHtml() { KMime::Message::Ptr msg = loadMessageFromFile(QStringLiteral("html_utf8_encoded.mbox")); - KIdentityManagement::IdentityManager *identMan = new KIdentityManagement::IdentityManager; - qDebug() << "html message:" << msg->encodedContent(); + //qDebug() << "html message:" << msg->encodedContent(); MessageFactory factory(msg, 0); - factory.setIdentityManager(identMan); + factory.setIdentityManager(mIdentMan); + TemplateParser::TemplateParserSettings::self()->setReplyUsingHtml(true); MessageFactory::MessageReply reply = factory.createReply(); reply.replyAll = true; - qDebug() << "html reply" << reply.msg->encodedContent(); + //qDebug() << "html reply" << reply.msg->encodedContent(); QDateTime date = msg->date()->dateTime(); QString datetime = QLocale::system().toString(date.date(), QLocale::LongFormat); datetime += QLatin1String(" ") + QLocale::system().toString(date.time(), QLocale::LongFormat); - QString replyStr = QString::fromLatin1(QByteArray(QByteArray("On ") + datetime.toLatin1() + QByteArray(" you wrote:\n> encoded?\n"))); - QSKIP("This test has been failing for a long time, please someone fix it", SkipSingle); - QCOMPARE(reply.msg->contentType()->mimeType(), QStringLiteral("multipart/alternative")); + QString replyStr = QString::fromLatin1(QByteArray(QByteArray("On ") + datetime.toLatin1() + QByteArray(" you wrote:\n> encoded?\n\n"))); + QCOMPARE(reply.msg->contentType()->mimeType(), QByteArrayLiteral("multipart/alternative")); QCOMPARE(reply.msg->subject()->asUnicodeString(), QLatin1String("Re: reply to please")); + QCOMPARE(reply.msg->contents().count(), 2); QCOMPARE_OR_DIFF(reply.msg->contents().at(0)->body(), replyStr.toLatin1()); + TemplateParser::TemplateParserSettings::self()->setReplyUsingHtml(false); + reply = factory.createReply(); + reply.replyAll = true; + datetime = QLocale::system().toString(date.date(), QLocale::LongFormat); + datetime += QLatin1String(" ") + QLocale::system().toString(date.time(), QLocale::LongFormat); + QCOMPARE(reply.msg->contentType()->mimeType(), QByteArrayLiteral("text/plain")); + QCOMPARE(reply.msg->subject()->asUnicodeString(), QLatin1String("Re: reply to please")); + QCOMPARE(reply.msg->contents().count(), 0); + TemplateParser::TemplateParserSettings::self()->setReplyUsingHtml(true); } void MessageFactoryTest::testCreateReplyUTF16Base64() { KMime::Message::Ptr msg = loadMessageFromFile(QStringLiteral("plain_utf16.mbox")); - KIdentityManagement::IdentityManager *identMan = new KIdentityManagement::IdentityManager; + TemplateParser::TemplateParserSettings::self()->setReplyUsingHtml(true); // qDebug() << "plain base64 msg message:" << msg->encodedContent(); MessageFactory factory(msg, 0); - factory.setIdentityManager(identMan); + factory.setIdentityManager(mIdentMan); MessageFactory::MessageReply reply = factory.createReply(); reply.replyAll = true; @@ -187,25 +470,58 @@ QDateTime date = msg->date()->dateTime(); QString datetime = QLocale::system().toString(date.date(), QLocale::LongFormat); datetime += QLatin1String(" ") + QLocale::system().toString(date.time(), QLocale::LongFormat); - QString replyStr = QString::fromLatin1(QByteArray(QByteArray("On ") + datetime.toLatin1() + QByteArray(" you wrote:\n> quote me please.\n"))); - QSKIP("This test has been failing for a long time, please someone fix it", SkipSingle); - QCOMPARE(reply.msg->contentType()->mimeType(), QStringLiteral("multipart/alternative")); + QString replyStr = QString::fromLatin1(QByteArray(QByteArray("On ") + datetime.toLatin1() + QByteArray(" you wrote:\n> quote me please.\n\n"))); + QCOMPARE(reply.msg->contentType()->mimeType(), QByteArrayLiteral("multipart/alternative")); QCOMPARE(reply.msg->subject()->asUnicodeString(), QLatin1String("Re: asking for reply")); QCOMPARE_OR_DIFF(reply.msg->contents().at(0)->body(), replyStr.toLatin1()); +} + +void MessageFactoryTest::testCreateForwardMultiEmails() +{ + KMime::Message::Ptr msg = createPlainTestMessageWithMultiEmails(); + + MessageFactory factory(msg, 0); + factory.setIdentityManager(mIdentMan); + + KMime::Message::Ptr fw = factory.createForward(); + QDateTime date = msg->date()->dateTime(); + QString datetime = QLocale::system().toString(date.date(), QLocale::LongFormat); + datetime += QLatin1String(", ") + QLocale::system().toString(date.time(), QLocale::LongFormat); + + QString fwdMsg = QString::fromLatin1( + "From: another \n" + "Date: %2\n" + "X-KMail-Transport: 0\n" + "MIME-Version: 1.0\n" + "Subject: Fwd: Test Email Subject\n" + "Content-Type: text/plain; charset=\"US-ASCII\"\n" + "Content-Transfer-Encoding: 8Bit\n" + "X-KMail-Link-Message: 0\n" + "X-KMail-Link-Type: forward\n" + "\n" + "---------- Forwarded Message ----------\n" + "\n" + "Subject: Test Email Subject\n" + "Date: %1\n" + "From: me@me.me\n" + "To: you@you.you, you2@you.you\n" + "CC: cc@cc.cc, cc2@cc.cc\n" + "\n" + "All happy families are alike; each unhappy family is unhappy in its own way.\n" + "-----------------------------------------"); + fwdMsg = fwdMsg.arg(datetime).arg(fw->date()->asUnicodeString()); +// qDebug() << "got:" << fw->encodedContent() << "against" << fwdMsg.toLatin1(); + QCOMPARE(fw->subject()->asUnicodeString(), QStringLiteral("Fwd: Test Email Subject")); + QCOMPARE_OR_DIFF(fw->encodedContent(), fwdMsg.toLatin1()); } void MessageFactoryTest::testCreateForward() { KMime::Message::Ptr msg = createPlainTestMessage(); - KIdentityManagement::IdentityManager *identMan = new KIdentityManagement::IdentityManager; - KIdentityManagement::Identity &ident = identMan->modifyIdentityForUoid(identMan->identityForUoidOrDefault(0).uoid()); - ident.setFullName(QStringLiteral("another")); - ident.setPrimaryEmailAddress(QStringLiteral("another@another.com")); - identMan->commit(); MessageFactory factory(msg, 0); - factory.setIdentityManager(identMan); + factory.setIdentityManager(mIdentMan); KMime::Message::Ptr fw = factory.createForward(); @@ -216,7 +532,6 @@ QString fwdMsg = QString::fromLatin1( "From: another \n" "Date: %2\n" - "User-Agent: %3\n" "X-KMail-Transport: 0\n" "MIME-Version: 1.0\n" "Subject: Fwd: Test Email Subject\n" @@ -235,24 +550,131 @@ "\n" "All happy families are alike; each unhappy family is unhappy in its own way.\n" "-----------------------------------------"); - fwdMsg = fwdMsg.arg(datetime).arg(fw->date()->asUnicodeString()).arg(fw->userAgent()->asUnicodeString()); + fwdMsg = fwdMsg.arg(datetime).arg(fw->date()->asUnicodeString()); // qDebug() << "got:" << fw->encodedContent() << "against" << fwdMsg.toLatin1(); QCOMPARE(fw->subject()->asUnicodeString(), QStringLiteral("Fwd: Test Email Subject")); QCOMPARE_OR_DIFF(fw->encodedContent(), fwdMsg.toLatin1()); } +void MessageFactoryTest::testCreateRedirectToAndCCAndBCC() +{ + KMime::Message::Ptr msg = createPlainTestMessage(); + + MessageFactory factory(msg, 0); + factory.setIdentityManager(mIdentMan); + + QString redirectTo = QStringLiteral("redir@redir.com"); + QString redirectCc = QStringLiteral("redircc@redircc.com, redircc2@redircc.com"); + QString redirectBcc = QStringLiteral("redirbcc@redirbcc.com, redirbcc2@redirbcc.com"); + KMime::Message::Ptr rdir = factory.createRedirect(redirectTo, redirectCc, redirectBcc); + + QDateTime date = rdir->date()->dateTime(); + QString datetime = QLocale::system().toString(date.date(), QLocale::LongFormat); + datetime = rdir->date()->asUnicodeString(); + +// qDebug() << rdir->encodedContent(); + + QString msgId = MessageCore::StringUtil::generateMessageId(msg->sender()->asUnicodeString(), QString()); + + QRegExp rx(QString::fromLatin1("Resent-Message-ID: ([^\n]*)")); + rx.indexIn(QString::fromLatin1(rdir->head())); + + QRegExp rxmessageid(QString::fromLatin1("Message-ID: ([^\n]+)")); + rxmessageid.indexIn(QString::fromLatin1(rdir->head())); + //qWarning() << "messageid:" << rxmessageid.cap(1) << "(" << rdir->head() << ")"; + QString baseline = QString::fromLatin1("From: me@me.me\n" + "Cc: cc@cc.cc\n" + "Bcc: bcc@bcc.bcc\n" + "Subject: Test Email Subject\n" + "Date: %1\n" + "X-KMail-Transport: 0\n" + "Message-ID: %2\n" + "Disposition-Notification-To: me@me.me\n" + "MIME-Version: 1.0\n" + "Content-Transfer-Encoding: 7Bit\n" + "Content-Type: text/plain; charset=\"us-ascii\"\n" + "Resent-Message-ID: %3\n" + "Resent-Date: %4\n" + "Resent-From: %5\n" + "To: you@you.you\n" + "Resent-To: redir@redir.com\n" + "Resent-Cc: redircc@redircc.com, redircc2@redircc.com\n" + "Resent-Bcc: redirbcc@redirbcc.com, redirbcc2@redirbcc.com\n" + "X-KMail-Redirect-From: me@me.me (by way of another )\n" + "\n" + "All happy families are alike; each unhappy family is unhappy in its own way."); + baseline = baseline.arg(datetime).arg(rxmessageid.cap(1)).arg(rx.cap(1)).arg(datetime).arg(QStringLiteral("another ")); + +// qDebug() << baseline.toLatin1(); +// qDebug() << "instead:" << rdir->encodedContent(); + +// QString fwdStr = QString::fromLatin1( "On " + datetime.toLatin1() + " you wrote:\n> All happy families are alike; each unhappy family is unhappy in its own way.\n" ); + QCOMPARE(rdir->subject()->asUnicodeString(), QStringLiteral("Test Email Subject")); + QCOMPARE_OR_DIFF(rdir->encodedContent(), baseline.toLatin1()); +} + +void MessageFactoryTest::testCreateRedirectToAndCC() +{ + KMime::Message::Ptr msg = createPlainTestMessage(); + + MessageFactory factory(msg, 0); + factory.setIdentityManager(mIdentMan); + + QString redirectTo = QStringLiteral("redir@redir.com"); + QString redirectCc = QStringLiteral("redircc@redircc.com, redircc2@redircc.com"); + KMime::Message::Ptr rdir = factory.createRedirect(redirectTo, redirectCc); + + QDateTime date = rdir->date()->dateTime(); + QString datetime = QLocale::system().toString(date.date(), QLocale::LongFormat); + datetime = rdir->date()->asUnicodeString(); + +// qDebug() << rdir->encodedContent(); + + QString msgId = MessageCore::StringUtil::generateMessageId(msg->sender()->asUnicodeString(), QString()); + + QRegExp rx(QString::fromLatin1("Resent-Message-ID: ([^\n]*)")); + rx.indexIn(QString::fromLatin1(rdir->head())); + + QRegExp rxmessageid(QString::fromLatin1("Message-ID: ([^\n]+)")); + rxmessageid.indexIn(QString::fromLatin1(rdir->head())); + //qWarning() << "messageid:" << rxmessageid.cap(1) << "(" << rdir->head() << ")"; + QString baseline = QString::fromLatin1("From: me@me.me\n" + "Cc: cc@cc.cc\n" + "Bcc: bcc@bcc.bcc\n" + "Subject: Test Email Subject\n" + "Date: %1\n" + "X-KMail-Transport: 0\n" + "Message-ID: %2\n" + "Disposition-Notification-To: me@me.me\n" + "MIME-Version: 1.0\n" + "Content-Transfer-Encoding: 7Bit\n" + "Content-Type: text/plain; charset=\"us-ascii\"\n" + "Resent-Message-ID: %3\n" + "Resent-Date: %4\n" + "Resent-From: %5\n" + "To: you@you.you\n" + "Resent-To: redir@redir.com\n" + "Resent-Cc: redircc@redircc.com, redircc2@redircc.com\n" + "X-KMail-Redirect-From: me@me.me (by way of another )\n" + "\n" + "All happy families are alike; each unhappy family is unhappy in its own way."); + baseline = baseline.arg(datetime).arg(rxmessageid.cap(1)).arg(rx.cap(1)).arg(datetime).arg(QStringLiteral("another ")); + +// qDebug() << baseline.toLatin1(); +// qDebug() << "instead:" << rdir->encodedContent(); + +// QString fwdStr = QString::fromLatin1( "On " + datetime.toLatin1() + " you wrote:\n> All happy families are alike; each unhappy family is unhappy in its own way.\n" ); + QCOMPARE(rdir->subject()->asUnicodeString(), QStringLiteral("Test Email Subject")); + QCOMPARE_OR_DIFF(rdir->encodedContent(), baseline.toLatin1()); +} + void MessageFactoryTest::testCreateRedirect() { KMime::Message::Ptr msg = createPlainTestMessage(); - KIdentityManagement::IdentityManager *identMan = new KIdentityManagement::IdentityManager; - KIdentityManagement::Identity &ident = identMan->modifyIdentityForUoid(identMan->identityForUoidOrDefault(0).uoid()); - ident.setFullName(QStringLiteral("another")); - ident.setPrimaryEmailAddress(QStringLiteral("another@another.com")); - identMan->commit(); MessageFactory factory(msg, 0); - factory.setIdentityManager(identMan); + factory.setIdentityManager(mIdentMan); QString redirectTo = QStringLiteral("redir@redir.com"); KMime::Message::Ptr rdir = factory.createRedirect(redirectTo); @@ -270,7 +692,7 @@ QRegExp rxmessageid(QString::fromLatin1("Message-ID: ([^\n]+)")); rxmessageid.indexIn(QString::fromLatin1(rdir->head())); - qWarning() << "messageid:" << rxmessageid.cap(1) << "(" << rdir->head() << ")"; + //qWarning() << "messageid:" << rxmessageid.cap(1) << "(" << rdir->head() << ")"; QString baseline = QString::fromLatin1("From: me@me.me\n" "Cc: cc@cc.cc\n" "Bcc: bcc@bcc.bcc\n" @@ -303,14 +725,9 @@ void MessageFactoryTest::testCreateResend() { KMime::Message::Ptr msg = createPlainTestMessage(); - KIdentityManagement::IdentityManager *identMan = new KIdentityManagement::IdentityManager; - KIdentityManagement::Identity &ident = identMan->modifyIdentityForUoid(identMan->identityForUoidOrDefault(0).uoid()); - ident.setFullName(QStringLiteral("another")); - ident.setPrimaryEmailAddress(QStringLiteral("another@another.com")); - identMan->commit(); MessageFactory factory(msg, 0); - factory.setIdentityManager(identMan); + factory.setIdentityManager(mIdentMan); KMime::Message::Ptr rdir = factory.createResend(); @@ -344,8 +761,8 @@ "All happy families are alike; each unhappy family is unhappy in its own way."); baseline = baseline.arg(msg->to()->asUnicodeString()).arg(datetime).arg(rxmessageid.cap(1)); - qDebug() << baseline.toLatin1(); - qDebug() << "instead:" << rdir->encodedContent(); + //qDebug() << baseline.toLatin1(); + //qDebug() << "instead:" << rdir->encodedContent(); // QString fwdStr = QString::fromLatin1( "On " + datetime.toLatin1() + " you wrote:\n> All happy families are alike; each unhappy family is unhappy in its own way.\n" ); QCOMPARE(rdir->subject()->asUnicodeString(), QStringLiteral("Test Email Subject")); @@ -355,36 +772,32 @@ void MessageFactoryTest::testCreateMDN() { KMime::Message::Ptr msg = createPlainTestMessage(); - KIdentityManagement::IdentityManager *identMan = new KIdentityManagement::IdentityManager; MessageFactory factory(msg, 0); - factory.setIdentityManager(identMan); + factory.setIdentityManager(mIdentMan); KMime::Message::Ptr mdn = factory.createMDN(KMime::MDN::AutomaticAction, KMime::MDN::Displayed, KMime::MDN::SentAutomatically); QVERIFY(mdn.data()); - qDebug() << "mdn" << mdn->encodedContent(); + //qDebug() << "mdn" << mdn->encodedContent(); /* // parse the result and make sure it is valid in various ways TestHtmlWriter testWriter; TestCSSHelper testCSSHelper; TestObjectTreeSource testSource( &testWriter, &testCSSHelper ); - MessageViewer::NodeHelper* nh = new MessageViewer::NodeHelper; - MessageViewer::ObjectTreeParser otp( &testSource, nh, 0, false, true, 0 ); - MessageViewer::ProcessResult pResult( nh ); */ - -// qDebug() << MessageCore::NodeHelper::firstChild( mdn->mainBodyPart() )->encodedContent(); -// qDebug() << MessageCore::NodeHelper::next( MessageViewer::ObjectTreeParser::findType( mdn.data(), "multipart", "report", true, true ) )->body(); + MimeTreeParser::NodeHelper* nh = new MimeTreeParser::NodeHelper; + MimeTreeParser::ObjectTreeParser otp( &testSource, nh, 0, false, true, 0 ); + MimeTreeParser::ProcessResult pResult( nh ); */ QString mdnContent = QString::fromLatin1("The message sent on %1 to %2 with subject \"%3\" has been displayed. " "This is no guarantee that the message has been read or understood."); mdnContent = mdnContent.arg(KMime::DateFormatter::formatDate(KMime::DateFormatter::Localized, msg->date()->dateTime().toTime_t())) .arg(msg->to()->asUnicodeString()).arg(msg->subject()->asUnicodeString()); - qDebug() << "comparing with:" << mdnContent; + //qDebug() << "comparing with:" << mdnContent; - QCOMPARE_OR_DIFF(MessageCore::NodeHelper::next(MessageViewer::ObjectTreeParser::findType(mdn.data(), "multipart", "report", true, true))->body(), + QCOMPARE_OR_DIFF(Util::findTypeInMessage(mdn.data(), "multipart", "report")->contents().at(0)->body(), mdnContent.toLatin1()); } @@ -409,6 +822,27 @@ return message; } +KMime::Message::Ptr MessageFactoryTest::createPlainTestMessageWithMultiEmails() +{ + Composer *composer = new Composer; + composer->globalPart()->setFallbackCharsetEnabled(true); + composer->infoPart()->setFrom(QString::fromLatin1("me@me.me")); + composer->infoPart()->setTo(QStringList() << QStringLiteral("you@you.you") << QStringLiteral("you2@you.you")); + composer->infoPart()->setCc(QStringList() << QStringLiteral("cc@cc.cc") << QStringLiteral("cc2@cc.cc")); + composer->infoPart()->setBcc(QStringList() << QStringLiteral("bcc@bcc.bcc") << QStringLiteral("bcc2@bcc.bcc")); + composer->textPart()->setWrappedPlainText(QString::fromLatin1("All happy families are alike; each unhappy family is unhappy in its own way.")); + composer->infoPart()->setSubject(QStringLiteral("Test Email Subject")); + composer->globalPart()->setMDNRequested(true); + composer->exec(); + + KMime::Message::Ptr message = KMime::Message::Ptr(composer->resultMessages().first()); + delete composer; + + MessageComposerSettings::self()->setPreferredCharsets(QStringList() << QStringLiteral("us-ascii") << QStringLiteral("iso-8859-1") << QStringLiteral("utf-8")); + + return message; +} + KMime::Message::Ptr MessageFactoryTest::loadMessageFromFile(QString filename) { QFile file(QLatin1String(QByteArray(MAIL_DATA_DIR "/" + filename.toLatin1()))); @@ -432,15 +866,21 @@ QDir dir(QStringLiteral(MAIL_DATA_DIR)); foreach (const QString &file, dir.entryList(QStringList(QLatin1String("plain_message.mbox")), QDir::Files | QDir::Readable | QDir::NoSymLinks)) { - QTest::newRow(file.toLatin1()) << QString(dir.path() + QLatin1Char('/') + file) << 0 << "" << - "> This *is* the *message* text *from* Sudhendu Kumar\n" - "> \n" - "> --\n" - "> Thanks & Regards\n" - "> Sudhendu Kumar"; - QTest::newRow(file.toLatin1()) << QString(dir.path() + QLatin1Char('/') + file) << 1 << "" << "" - "
This is the message text from Sudhendu Kumar<dontspamme@yoohoo.com>
" - "
--
Thanks & Regards
Sudhendu Kumar
\n

"; + QTest::newRow(file.toLatin1().constData()) << QString(dir.path() + QLatin1Char('/') + file) << 0 << "" << + "> This *is* the *message* text *from* Sudhendu Kumar\n" + "> \n" + "> --\n" + "> Thanks & Regards\n" + "> Sudhendu Kumar"; + QTest::newRow(file.toLatin1().constData()) << QString(dir.path() + QLatin1Char('/') + file) << 1 << "" << "" + "
This is the message text from Sudhendu Kumar<dontspamme@yoohoo.com>
" + "
--
Thanks & Regards
Sudhendu Kumar
\n

"; + + QTest::newRow(file.toLatin1().constData()) << QString(dir.path() + QLatin1Char('/') + file) << 0 << "This *is* the *message* text *from*" << + "> This *is* the *message* text *from*"; + + QTest::newRow(file.toLatin1().constData()) << QString(dir.path() + QLatin1Char('/') + file) << 1 << "This *is* the *message* text *from*" << + "
This *is* the *message* text *from*

"; } } @@ -451,18 +891,10 @@ QFETCH(QString, selection); QFETCH(QString, expected); - QFile mailFile(mailFileName); - QVERIFY(mailFile.open(QIODevice::ReadOnly)); - const QByteArray mailData = KMime::CRLFtoLF(mailFile.readAll()); - QVERIFY(!mailData.isEmpty()); - KMime::Message::Ptr origMsg(new KMime::Message); - origMsg->setContent(mailData); - origMsg->parse(); - - KIdentityManagement::IdentityManager *identMan = new KIdentityManagement::IdentityManager; + KMime::Message::Ptr origMsg = loadMessage(mailFileName); MessageFactory factory(origMsg, 0); - factory.setIdentityManager(identMan); + factory.setIdentityManager(mIdentMan); factory.setSelection(selection); factory.setQuote(true); factory.setReplyStrategy(ReplyAll); @@ -474,8 +906,7 @@ MessageFactory::MessageReply reply = factory.createReply(); reply.replyAll = true; - QSKIP("This tests has been failing for a long time, please someone fix it", SkipSingle); - QCOMPARE(reply.msg->contentType()->mimeType(), QStringLiteral("multipart/alternative")); + QCOMPARE(reply.msg->contentType()->mimeType(), QByteArrayLiteral("multipart/alternative")); QCOMPARE(reply.msg->subject()->asUnicodeString(), QLatin1String("Re: Plain Message Test")); QCOMPARE(reply.msg->contents().at(contentAt)->encodedBody().data(), expected.toLatin1().data()); } diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/messagefactorytest.h kf5-messagelib-16.12.3/messagecomposer/autotests/messagefactorytest.h --- kf5-messagelib-16.04.3/messagecomposer/autotests/messagefactorytest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/messagefactorytest.h 2017-03-06 12:30:37.000000000 +0000 @@ -23,28 +23,45 @@ #include #include - +namespace KIdentityManagement +{ +class IdentityManager; +} class MessageFactoryTest : public QObject { Q_OBJECT private Q_SLOTS: void initTestCase(); - void testCreateReply(); + void testCreateReplyAll(); void testCreateReplyHtml(); void testCreateReplyUTF16Base64(); void testCreateForward(); void testCreateRedirect(); void testCreateResend(); void testCreateMDN(); + void testCreateRedirectToAndCC(); + void testCreateRedirectToAndCCAndBCC(); + + //MultiPart + void test_multipartAlternative_data(); + void test_multipartAlternative(); + void testCreateForwardMultiEmails(); + void testCreateReplyToAuthor(); + void testCreateReplyAllWithMultiEmails(); + void testCreateReplyToList(); + void testCreateReplyToAllWithUseSender(); + void testCreateReplyToAllWithUseSenderByNoSameIdentities(); + void testCreateReplyToAllWithUseSenderAndIdentityInCC(); + + void cleanupTestCase(); private: KMime::Message::Ptr createPlainTestMessage(); KMime::Message::Ptr loadMessageFromFile(QString filename); - -private Q_SLOTS: - void test_multipartAlternative_data(); - void test_multipartAlternative(); + KMime::Message::Ptr createPlainTestMessageWithMultiEmails(); + KMime::Message::Ptr loadMessage(const QString &filename); + KIdentityManagement::IdentityManager *mIdentMan; }; #endif diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/plugineditorcheckbeforesendparamstest.cpp kf5-messagelib-16.12.3/messagecomposer/autotests/plugineditorcheckbeforesendparamstest.cpp --- kf5-messagelib-16.04.3/messagecomposer/autotests/plugineditorcheckbeforesendparamstest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/plugineditorcheckbeforesendparamstest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,123 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "plugineditorcheckbeforesendparamstest.h" +#include +#include + +PluginEditorCheckBeforeSendParamsTest::PluginEditorCheckBeforeSendParamsTest(QObject *parent) + : QObject(parent) +{ + +} + +PluginEditorCheckBeforeSendParamsTest::~PluginEditorCheckBeforeSendParamsTest() +{ + +} + +void PluginEditorCheckBeforeSendParamsTest::shouldHaveDefaultValues() +{ + MessageComposer::PluginEditorCheckBeforeSendParams params; + QVERIFY(params.subject().isEmpty()); + QVERIFY(params.plainText().isEmpty()); + QCOMPARE(params.identity(), (uint) - 1); + QCOMPARE(params.transportId(), -1); + QVERIFY(!params.isHtmlMail()); + QVERIFY(params.bccAddresses().isEmpty()); + QVERIFY(params.ccAddresses().isEmpty()); + QVERIFY(params.toAddresses().isEmpty()); + QVERIFY(params.defaultDomain().isEmpty()); + QVERIFY(!params.hasAttachment()); +} + +void PluginEditorCheckBeforeSendParamsTest::shouldBeEqual() +{ + MessageComposer::PluginEditorCheckBeforeSendParams params1; + const QString subject(QStringLiteral("foo")); + const QString plainText(QStringLiteral("bla")); + const QString defaultDomain(QStringLiteral("bli")); + bool isHmlMail = true; + bool hasAttachment = true; + int transportId = 5; + QString to(QStringLiteral("to")); + QString cc(QStringLiteral("cc")); + QString bcc(QStringLiteral("bcc")); + params1.setSubject(subject); + params1.setHtmlMail(isHmlMail); + params1.setPlainText(plainText); + params1.setDefaultDomain(defaultDomain); + params1.setHasAttachment(hasAttachment); + params1.setTransportId(transportId); + params1.setBccAddresses(bcc); + params1.setCcAddresses(cc); + params1.setToAddresses(to); + + MessageComposer::PluginEditorCheckBeforeSendParams params2 = params1; + QVERIFY(params2 == params1); + QCOMPARE(params2.isHtmlMail(), isHmlMail); + QCOMPARE(params2.subject(), subject); + QCOMPARE(params2.plainText(), plainText); + QCOMPARE(params2.defaultDomain(), defaultDomain); + QCOMPARE(params2.hasAttachment(), hasAttachment); + QCOMPARE(params2.transportId(), transportId); + QCOMPARE(params2.bccAddresses(), bcc); + QCOMPARE(params2.ccAddresses(), cc); + QCOMPARE(params2.toAddresses(), to); +} + +void PluginEditorCheckBeforeSendParamsTest::shouldAssignValue() +{ + MessageComposer::PluginEditorCheckBeforeSendParams params1; + const QString subject(QStringLiteral("foo")); + const QString plainText(QStringLiteral("bla")); + const QString defaultDomain(QStringLiteral("bli")); + bool isHmlMail = true; + bool hasAttachment = true; + uint identity = 5; + int transportId = 6; + QString to(QStringLiteral("to")); + QString cc(QStringLiteral("cc")); + QString bcc(QStringLiteral("bcc")); + + params1.setSubject(subject); + params1.setHtmlMail(isHmlMail); + params1.setPlainText(plainText); + params1.setIdentity(identity); + params1.setDefaultDomain(defaultDomain); + params1.setHasAttachment(hasAttachment); + params1.setTransportId(transportId); + params1.setBccAddresses(bcc); + params1.setCcAddresses(cc); + params1.setToAddresses(to); + + QCOMPARE(params1.isHtmlMail(), isHmlMail); + QCOMPARE(params1.subject(), subject); + QCOMPARE(params1.identity(), identity); + QCOMPARE(params1.plainText(), plainText); + QCOMPARE(params1.defaultDomain(), defaultDomain); + QCOMPARE(params1.hasAttachment(), hasAttachment); + QCOMPARE(params1.transportId(), transportId); + QCOMPARE(params1.bccAddresses(), bcc); + QCOMPARE(params1.ccAddresses(), cc); + QCOMPARE(params1.toAddresses(), to); + +} + +QTEST_MAIN(PluginEditorCheckBeforeSendParamsTest) diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/plugineditorcheckbeforesendparamstest.h kf5-messagelib-16.12.3/messagecomposer/autotests/plugineditorcheckbeforesendparamstest.h --- kf5-messagelib-16.04.3/messagecomposer/autotests/plugineditorcheckbeforesendparamstest.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/plugineditorcheckbeforesendparamstest.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,38 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef PLUGINEDITORCHECKBEFORESENDPARAMSTEST_H +#define PLUGINEDITORCHECKBEFORESENDPARAMSTEST_H + +#include + +class PluginEditorCheckBeforeSendParamsTest : public QObject +{ + Q_OBJECT +public: + explicit PluginEditorCheckBeforeSendParamsTest(QObject *parent = Q_NULLPTR); + ~PluginEditorCheckBeforeSendParamsTest(); + +private Q_SLOTS: + void shouldHaveDefaultValues(); + void shouldBeEqual(); + void shouldAssignValue(); +}; + +#endif // PLUGINEDITORCHECKBEFORESENDPARAMSTEST_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/recipientseditortest.cpp kf5-messagelib-16.12.3/messagecomposer/autotests/recipientseditortest.cpp --- kf5-messagelib-16.04.3/messagecomposer/autotests/recipientseditortest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/recipientseditortest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,128 @@ +/* + Copyright (C) 2016 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include +#include + +#include "recipient/recipientseditor.h" +#include "recipient/recipientline.h" + +#include +#include +#include + +class RecipientsLineTestFactory : public MessageComposer::RecipientLineFactory +{ + Q_OBJECT + +public: + explicit RecipientsLineTestFactory(QObject *parent = Q_NULLPTR) + : MessageComposer::RecipientLineFactory(parent) + { + } + + KPIM::MultiplyingLine *newLine(QWidget *parent) Q_DECL_OVERRIDE { + auto line = qobject_cast( + MessageComposer::RecipientLineFactory::newLine(parent)); + line->setEnableAkonadiSearch(false); + line->setEnableIndexSearch(false); + return line; + } +}; + +class RecipientsEditorTest : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void test_addLineOnCommaPress(); + void test_splitStringInputToLines(); + void test_splitPastedListToLines(); +}; + +void RecipientsEditorTest::test_addLineOnCommaPress() +{ + MessageComposer::RecipientsEditor editor(new RecipientsLineTestFactory()); + editor.show(); + QTest::qWaitForWindowActive(&editor); + + QCOMPARE(editor.recipients().size(), 0); + + auto lineEdit = editor.lines().first()->findChild(); + lineEdit->setFocus(); + + // Simulate typing email address + QTest::keyClicks(lineEdit, QStringLiteral("\"Vratil, Daniel\" "), Qt::NoModifier, 10); + + QCOMPARE(editor.recipients().size(), 1); + QCOMPARE(editor.recipients().first()->email(), QStringLiteral("\"Vratil, Daniel\" ")); + + QTest::keyClick(lineEdit, Qt::Key_Comma, Qt::NoModifier, 0); + + lineEdit = editor.lines().at(1)->findChild(); + QVERIFY(lineEdit->hasFocus()); + + QTest::keyClicks(lineEdit, QStringLiteral("test@example.test"), Qt::NoModifier, 10); + QCOMPARE(editor.recipients().size(), 2); + QCOMPARE(editor.recipients().at(1)->email(), QStringLiteral("test@example.test")); + QCOMPARE(editor.recipients().at(1)->type(), editor.recipients().at(0)->type()); +} + +void RecipientsEditorTest::test_splitStringInputToLines() +{ + MessageComposer::RecipientsEditor editor(new RecipientsLineTestFactory()); + + QCOMPARE(editor.recipients().size(), 0); + + const auto mboxes = KMime::Types::Mailbox::listFromUnicodeString(QStringLiteral("test@example.com, \"Vrátil, Daniel\" ")); + editor.setRecipientString(mboxes, MessageComposer::Recipient::To); + + QCOMPARE(editor.recipients().size(), 2); + QCOMPARE(editor.recipients().at(0)->email(), QStringLiteral("test@example.com")); + QCOMPARE(editor.recipients().at(1)->email(), QStringLiteral("\"Vrátil, Daniel\" ")); +} + +void RecipientsEditorTest::test_splitPastedListToLines() +{ + MessageComposer::RecipientsEditor editor(new RecipientsLineTestFactory()); + + QCOMPARE(editor.recipients().size(), 0); + + const auto clipboard = QApplication::clipboard(); + const QString oldText = clipboard->text(); + + clipboard->setText(QStringLiteral("test@example.com, \"Vrátil, Daniel\" ")); + + auto lineEdit = editor.lines().at(0)->findChild(); + // paste() is protected in KPIM::AddresseeLineEdit + QMetaObject::invokeMethod(lineEdit, "paste"); + + // This will still fail the test, but will allow us to reset the clipboard + [&editor]() { + QCOMPARE(editor.recipients().size(), 2); + QCOMPARE(editor.recipients().at(0)->email(), QStringLiteral("test@example.com")); + QCOMPARE(editor.recipients().at(1)->email(), QStringLiteral("\"Vrátil, Daniel\" ")); + }(); + + clipboard->setText(oldText); +} + +QTEST_MAIN(RecipientsEditorTest) + +#include "recipientseditortest.moc" diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/setupenv.cpp kf5-messagelib-16.12.3/messagecomposer/autotests/setupenv.cpp --- kf5-messagelib-16.04.3/messagecomposer/autotests/setupenv.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/setupenv.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -20,9 +20,9 @@ #include "setupenv.h" -#include +#include +#include #include -#include #include #include @@ -31,27 +31,19 @@ void MessageComposer::Test::setupEnv() { setenv("LC_ALL", "C", 1); - setenv("KDEHOME", QFile::encodeName(QDir::homePath() + QString::fromLatin1("/.qttest")), 1); - - QStringList reasons; - Kleo::CryptoBackendFactory::instance()->scanForBackends(&reasons); - if (!reasons.isEmpty()) { - Q_FOREACH (const QString &reason, reasons) { - qWarning() << reason; - } - } + setenv("KDEHOME", QFile::encodeName(QDir::homePath() + QString::fromLatin1("/.qttest")).constData(), 1); } std::vector< GpgME::Key, std::allocator< GpgME::Key > > MessageComposer::Test::getKeys(bool smime) { - Kleo::KeyListJob *job = 0; + QGpgME::KeyListJob *job = 0; if (smime) { - const Kleo::CryptoBackend::Protocol *const backend = Kleo::CryptoBackendFactory::instance()->smime(); + const QGpgME::Protocol *const backend = QGpgME::smime(); Q_ASSERT(backend); job = backend->keyListJob(false); } else { - const Kleo::CryptoBackend::Protocol *const backend = Kleo::CryptoBackendFactory::instance()->openpgp(); + const QGpgME::Protocol *const backend = QGpgME::openpgp(); Q_ASSERT(backend); job = backend->keyListJob(false); } @@ -65,6 +57,8 @@ } Q_ASSERT(!res.error()); + + /* qDebug() << "got private keys:" << keys.size(); for (std::vector< GpgME::Key >::iterator i = keys.begin(); i != keys.end(); ++i) { @@ -74,6 +68,7 @@ qDebug() << "userIDs:" << i->userID(k).email(); } } + */ return keys; } diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/setupenv.h kf5-messagelib-16.12.3/messagecomposer/autotests/setupenv.h --- kf5-messagelib-16.04.3/messagecomposer/autotests/setupenv.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/setupenv.h 2017-03-06 12:30:37.000000000 +0000 @@ -23,6 +23,7 @@ #include #include +#include namespace MessageComposer { @@ -50,23 +51,21 @@ class TestObjectTreeSource : public MessageViewer::EmptySource { public: - TestObjectTreeSource(MessageViewer::HtmlWriter *writer, + TestObjectTreeSource(MimeTreeParser::HtmlWriter *writer, MessageViewer::CSSHelperBase *cssHelper) : mWriter(writer), mCSSHelper(cssHelper) { } - virtual MessageViewer::HtmlWriter *htmlWriter() - { + MimeTreeParser::HtmlWriter *htmlWriter() Q_DECL_OVERRIDE { return mWriter; } - virtual MessageViewer::CSSHelperBase *cssHelper() - { + MessageViewer::CSSHelperBase *cssHelper() Q_DECL_OVERRIDE { return mCSSHelper; } private: - MessageViewer::HtmlWriter *mWriter; + MimeTreeParser::HtmlWriter *mWriter; MessageViewer::CSSHelperBase *mCSSHelper; }; diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/signencrypttest.cpp kf5-messagelib-16.12.3/messagecomposer/autotests/signencrypttest.cpp --- kf5-messagelib-16.04.3/messagecomposer/autotests/signencrypttest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/signencrypttest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -30,8 +30,6 @@ #include #include -#include -#include #include #include @@ -41,7 +39,7 @@ #include #include -#include +#include #include #include diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/signjobtest.cpp kf5-messagelib-16.12.3/messagecomposer/autotests/signjobtest.cpp --- kf5-messagelib-16.04.3/messagecomposer/autotests/signjobtest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/signjobtest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -28,8 +28,6 @@ #include #include -#include -#include #include #include @@ -159,7 +157,55 @@ ComposerTestUtil::verify(true, false, result, data.toUtf8(), Kleo::OpenPGPMIMEFormat, cte); +} + +void SignJobTest::testMixedContent() +{ + std::vector< GpgME::Key > keys = MessageComposer::Test::getKeys(); + + QString data = QString::fromUtf8("=2D Magic foo\nFrom test\n\n-- quaak\nOhno"); + + MessageComposer::Composer *composer = new MessageComposer::Composer; + MessageComposer::SignJob* sJob = new MessageComposer::SignJob(composer); + + QVERIFY(composer); + QVERIFY(sJob); + + KMime::Content* content = new KMime::Content; + content->contentType()->setMimeType(QByteArray("multipart/mixed")); + content->contentType()->setBoundary( KMime::multiPartBoundary() ); + KMime::Content* subcontent = new KMime::Content; + subcontent->contentType()->setMimeType(QByteArray("text/plain")); + subcontent->setBody( data.toUtf8() ); + KMime::Content* attachment = new KMime::Content; + attachment->contentType()->setMimeType(QByteArray("text/plain")); + QByteArray attachmentData("an attachment"); + attachment->setBody(attachmentData); + + content->addContent(subcontent); + content->addContent(attachment); + content->assemble(); + sJob->setContent(content); + sJob->setCryptoMessageFormat(Kleo::OpenPGPMIMEFormat); + sJob->setSigningKeys(keys); + + VERIFYEXEC(sJob); + + KMime::Content *result = sJob->content(); + result->assemble(); + qDebug() << result->encodedContent(); + + KMime::Content* firstChild = MessageCore::NodeHelper::firstChild(result); + QCOMPARE(result->contents().count(), 2); + QCOMPARE(firstChild->contents().count(), 2); + QCOMPARE(firstChild->body(), QByteArray()); + QCOMPARE(firstChild->contentType()->mimeType(), QByteArray("multipart/mixed")); + QCOMPARE(firstChild->contents()[0]->body(), data.toUtf8()); + QCOMPARE(firstChild->contents()[1]->body(), attachmentData); + + ComposerTestUtil::verify(true, false, result, data.toUtf8(), + Kleo::OpenPGPMIMEFormat, KMime::Headers::CE7Bit); } void SignJobTest::checkSignJob(MessageComposer::SignJob *sJob) diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/signjobtest.h kf5-messagelib-16.12.3/messagecomposer/autotests/signjobtest.h --- kf5-messagelib-16.04.3/messagecomposer/autotests/signjobtest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/signjobtest.h 2017-03-06 12:30:37.000000000 +0000 @@ -43,6 +43,7 @@ void testContentChained(); void testHeaders(); void testRecommentationRFC3156(); + void testMixedContent(); private: void checkSignJob(MessageComposer::SignJob *sJob); diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/testhtmlwriter.h kf5-messagelib-16.12.3/messagecomposer/autotests/testhtmlwriter.h --- kf5-messagelib-16.04.3/messagecomposer/autotests/testhtmlwriter.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/testhtmlwriter.h 2017-03-06 12:30:37.000000000 +0000 @@ -21,11 +21,11 @@ #ifndef TEST_HTML_WRITER_H #define TEST_HTML_WRITER_H -#include +#include // Objecttreeparser needs a valid html writer othewise it doesn't parse // inline messages, so give it one to chew on. -class TestHtmlWriter : public MessageViewer::HtmlWriter +class TestHtmlWriter : public MimeTreeParser::HtmlWriter { public: explicit TestHtmlWriter() {} diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/textparttest.cpp kf5-messagelib-16.12.3/messagecomposer/autotests/textparttest.cpp --- kf5-messagelib-16.04.3/messagecomposer/autotests/textparttest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/textparttest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "textparttest.h" @@ -38,4 +40,4 @@ QVERIFY(!textpart.isHtmlUsed()); } -QTEST_MAIN(TextPartTest) +QTEST_APPLESS_MAIN(TextPartTest) diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/textparttest.h kf5-messagelib-16.12.3/messagecomposer/autotests/textparttest.h --- kf5-messagelib-16.04.3/messagecomposer/autotests/textparttest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/textparttest.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef TEXTPARTTEST_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/config-mysql-fs.xml kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/config-mysql-fs.xml --- kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/config-mysql-fs.xml 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/config-mysql-fs.xml 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,10 @@ + + xdgconfig-mysql.fs + xdglocal + akonadi_knut_resource + akonadi_knut_resource + akonadi_knut_resource + true + mysql + akonadi_test_searchplugin + diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/config-postgresql-fs.xml kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/config-postgresql-fs.xml --- kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/config-postgresql-fs.xml 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/config-postgresql-fs.xml 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,10 @@ + + xdgconfig-postgresql.fs + xdglocal + akonadi_knut_resource + akonadi_knut_resource + akonadi_knut_resource + true + postgresql + akonadi_test_searchplugin + diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/config-sqlite-db.xml kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/config-sqlite-db.xml --- kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/config-sqlite-db.xml 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/config-sqlite-db.xml 2017-03-06 12:30:37.000000000 +0000 @@ -1,7 +1,10 @@ - kdehome xdgconfig-sqlite.db xdglocal + akonadi_knut_resource + akonadi_knut_resource + akonadi_knut_resource true sqlite + akonadi_test_searchplugin diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/config.xml kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/config.xml --- kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/config.xml 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/config.xml 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,8 @@ + + xdgconfig + xdglocal + akonadi_knut_resource + akonadi_knut_resource + akonadi_knut_resource + true + diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/kdehome/share/config/akonadi-firstrunrc kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/kdehome/share/config/akonadi-firstrunrc --- kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/kdehome/share/config/akonadi-firstrunrc 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/kdehome/share/config/akonadi-firstrunrc 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -[ProcessedDefaults] -defaultaddressbook=done -defaultcalendar=done -defaultnotebook=done diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/kdehome/share/config/kdebugrc kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/kdehome/share/config/kdebugrc --- kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/kdehome/share/config/kdebugrc 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/kdehome/share/config/kdebugrc 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ -DisableAll=false - -[0] -AbortFatal=true -ErrorFilename[$e]=kdebug.dbg -ErrorOutput=2 -FatalFilename[$e]=kdebug.dbg -FatalOutput=2 -InfoFilename[$e]=kdebug.dbg -InfoOutput=2 -WarnFilename[$e]=kdebug.dbg -WarnOutput=2 - -[264] -AbortFatal=true -ErrorFilename[$e]=kdebug.dbg -ErrorOutput=4 -FatalFilename[$e]=kdebug.dbg -FatalOutput=4 -InfoFilename[$e]=kdebug.dbg -WarnFilename[$e]=kdebug.dbg -WarnOutput=4 - -[5250] -InfoOutput=2 - -[7009] -AbortFatal=true -ErrorFilename[$e]=kdebug.dbg -ErrorOutput=4 -FatalFilename[$e]=kdebug.dbg -FatalOutput=4 -InfoFilename[$e]=kdebug.dbg -InfoOutput=4 -WarnFilename[$e]=kdebug.dbg -WarnOutput=4 - -[7011] -AbortFatal=true -ErrorFilename[$e]=kdebug.dbg -ErrorOutput=4 -FatalFilename[$e]=kdebug.dbg -FatalOutput=4 -InfoFilename[$e]=kdebug.dbg -InfoOutput=4 -WarnFilename[$e]=kdebug.dbg -WarnOutput=4 - -[7012] -AbortFatal=true -ErrorFilename[$e]=kdebug.dbg -ErrorOutput=4 -FatalFilename[$e]=kdebug.dbg -FatalOutput=4 -InfoFilename[$e]=kdebug.dbg -InfoOutput=4 -WarnFilename[$e]=kdebug.dbg -WarnOutput=4 - -[7014] -AbortFatal=true -ErrorFilename[$e]=kdebug.dbg -ErrorOutput=0 -FatalFilename[$e]=kdebug.dbg -FatalOutput=0 -InfoFilename[$e]=kdebug.dbg -InfoOutput=0 -WarnFilename[$e]=kdebug.dbg -WarnOutput=0 - -[7021] -AbortFatal=true -ErrorFilename[$e]=kdebug.dbg -ErrorOutput=4 -FatalFilename[$e]=kdebug.dbg -FatalOutput=4 -InfoFilename[$e]=kdebug.dbg -InfoOutput=4 -WarnFilename[$e]=kdebug.dbg -WarnOutput=4 diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/kdehome/share/config/kdedrc kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/kdehome/share/config/kdedrc --- kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/kdehome/share/config/kdedrc 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/kdehome/share/config/kdedrc 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -[General] -CheckSycoca=false -CheckFileStamps=false diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdgconfig/akonadi-firstrunrc kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdgconfig/akonadi-firstrunrc --- kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdgconfig/akonadi-firstrunrc 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdgconfig/akonadi-firstrunrc 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4 @@ +[ProcessedDefaults] +defaultaddressbook=done +defaultcalendar=done +defaultnotebook=done diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_0rc kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_0rc --- kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_0rc 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_0rc 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4 @@ +[General] +DataFile[$e]=$XDG_DATA_HOME/testdata-res1.xml +FileWatchingEnabled=false + diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_1rc kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_1rc --- kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_1rc 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_1rc 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,3 @@ +[General] +DataFile[$e]=$XDG_DATA_HOME/testdata-res2.xml +FileWatchingEnabled=false diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_2rc kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_2rc --- kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_2rc 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_2rc 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,3 @@ +[General] +DataFile[$e]=$XDG_DATA_HOME/testdata-res3.xml +FileWatchingEnabled=false diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdgconfig-mysql.fs/akonadi/akonadiserverrc kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdgconfig-mysql.fs/akonadi/akonadiserverrc --- kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdgconfig-mysql.fs/akonadi/akonadiserverrc 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdgconfig-mysql.fs/akonadi/akonadiserverrc 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,6 @@ +[%General] +SizeThreshold=0 +ExternalPayload=true + +[Search] +Manager=Dummy diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdgconfig-postgresql.fs/akonadi/akonadiserverrc kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdgconfig-postgresql.fs/akonadi/akonadiserverrc --- kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdgconfig-postgresql.fs/akonadi/akonadiserverrc 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdgconfig-postgresql.fs/akonadi/akonadiserverrc 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,10 @@ +[%General] +Driver=QPSQL +SizeThreshold=0 +ExternalPayload=true + +[Search] +Manager=Dummy + +[QPSQL] +StartServer=true diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdglocal/testdata-res1.xml kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdglocal/testdata-res1.xml --- kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdglocal/testdata-res1.xml 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdglocal/testdata-res1.xml 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,78 @@ + + + + + + + + + + + testmailbody + From: <test@user.tst> + \SEEN + \FLAGGED + \DRAFT + + + testmailbody1 + From: <test1@user.tst> + \FLAGGED + tagrid + + + testmailbody2 + From: <test2@user.tst> + + + testmailbody3 + From: <test3@user.tst> + + + testmailbody4 + From: <test4@user.tst> + + + testmailbody5 + From: <test5@user.tst> + + + testmailbody6 + From: <test6@user.tst> + + + testmailbody7 + From: <test7@user.tst> + + + testmailbody8 + From: <test8@user.tst> + + + testmailbody9 + From: <test9@user.tst> + + + testmailbody10 + From: <test10@user.tst> + + + testmailbody11 + From: <test11@user.tst> + + + testmailbody12 + From: <test12@user.tst> + + + testmailbody13 + From: <test13@user.tst> + + + testmailbody14 + From: <test14@user.tst> + + + + + diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdglocal/testdata-res2.xml kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdglocal/testdata-res2.xml --- kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdglocal/testdata-res2.xml 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdglocal/testdata-res2.xml 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,6 @@ + + + + + + diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdglocal/testdata-res3.xml kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdglocal/testdata-res3.xml --- kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdglocal/testdata-res3.xml 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdglocal/testdata-res3.xml 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4 @@ + + + + diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdglocal/testdata.xml kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdglocal/testdata.xml --- kf5-messagelib-16.04.3/messagecomposer/autotests/unittestenv/xdglocal/testdata.xml 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/unittestenv/xdglocal/testdata.xml 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,82 @@ + + + + + + + + + + + testmailbody + From: <test@user.tst> + \SEEN + \FLAGGED + \DRAFT + + + testmailbody1 + From: <test1@user.tst> + \FLAGGED + + + testmailbody2 + From: <test2@user.tst> + + + testmailbody3 + From: <test3@user.tst> + + + testmailbody4 + From: <test4@user.tst> + + + testmailbody5 + From: <test5@user.tst> + + + testmailbody6 + From: <test6@user.tst> + + + testmailbody7 + From: <test7@user.tst> + + + testmailbody8 + From: <test8@user.tst> + + + testmailbody9 + From: <test9@user.tst> + + + testmailbody10 + From: <test10@user.tst> + + + testmailbody11 + From: <test11@user.tst> + + + testmailbody12 + From: <test12@user.tst> + + + testmailbody13 + From: <test13@user.tst> + + + testmailbody14 + From: <test14@user.tst> + + + + + + + + + + diff -Nru kf5-messagelib-16.04.3/messagecomposer/autotests/utiltest.cpp kf5-messagelib-16.12.3/messagecomposer/autotests/utiltest.cpp --- kf5-messagelib-16.04.3/messagecomposer/autotests/utiltest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/autotests/utiltest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -24,7 +24,7 @@ #include using namespace MessageComposer; -QTEST_MAIN(UtilTest) +QTEST_APPLESS_MAIN(UtilTest) void UtilTest::testSelectCharset() { diff -Nru kf5-messagelib-16.04.3/messagecomposer/CMakeLists.txt kf5-messagelib-16.12.3/messagecomposer/CMakeLists.txt --- kf5-messagelib-16.04.3/messagecomposer/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -1,7 +1,5 @@ project(messagecomposer) -remove_definitions( -DQT_NO_CAST_FROM_BYTEARRAY ) -add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0) ecm_setup_version(${MESSAGELIB_LIB_VERSION} VARIABLE_PREFIX MESSAGECOMPOSER VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/messagecomposer_version.h" @@ -42,4 +40,3 @@ add_subdirectory(autotests) add_subdirectory(tests) endif() - diff -Nru kf5-messagelib-16.04.3/messagecomposer/KF5MessageComposerConfig.cmake.in kf5-messagelib-16.12.3/messagecomposer/KF5MessageComposerConfig.cmake.in --- kf5-messagelib-16.04.3/messagecomposer/KF5MessageComposerConfig.cmake.in 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/KF5MessageComposerConfig.cmake.in 2017-03-06 12:30:37.000000000 +0000 @@ -3,9 +3,9 @@ find_dependency(KF5Mime "@KMIME_LIB_VERSION@") find_dependency(KF5MessageCore "@MESSAGELIB_LIB_VERSION@") find_dependency(KF5PimCommon "@PIMCOMMON_LIB_VERSION@") -find_dependency(KF5Akonadi "@KDEPIMLIBS_LIB_VERSION@") +find_dependency(KF5Akonadi "@AKONADI_VERSION@") find_dependency(KF5IdentityManagement "@IDENTITYMANAGEMENT_LIB_VERSION@") -find_dependency(KF5AkonadiMime "@KDEPIMLIBS_LIB_VERSION@") +find_dependency(KF5AkonadiMime "@AKONADIMIME_LIB_VERSION@") find_dependency(KF5Libkleo "@LIBKLEO_LIB_VERSION@") include("${CMAKE_CURRENT_LIST_DIR}/KF5MessageComposerTargets.cmake") diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/attachment/attachmentcontrollerbase.cpp kf5-messagelib-16.12.3/messagecomposer/src/attachment/attachmentcontrollerbase.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/attachment/attachmentcontrollerbase.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/attachment/attachmentcontrollerbase.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -22,17 +22,19 @@ #include "attachmentcontrollerbase.h" -#include "MessageComposer/AttachmentModel" +#include #include "MessageComposer/AttachmentJob" #include "MessageComposer/AttachmentFromPublicKeyJob" #include "MessageComposer/AttachmentVcardFromAddressBookJob" #include "MessageComposer/Composer" - #include "MessageComposer/GlobalPart" -#include "MessageViewer/EditorWatcher" -#include "messageviewer/nodehelper.h" -#include "MessageViewer/MessageViewerUtil" -#include "MessageCore/StringUtil" + +#include +#include + +#include + +#include #include #include @@ -56,7 +58,7 @@ #include #include -#include +#include #include #include @@ -388,7 +390,7 @@ void AttachmentControllerBase::exportPublicKey(const QString &fingerprint) { - if (fingerprint.isEmpty() || !Kleo::CryptoBackendFactory::instance()->openpgp()) { + if (fingerprint.isEmpty() || !QGpgME::openpgp()) { qCWarning(MESSAGECOMPOSER_LOG) << "Tried to export key with empty fingerprint, or no OpenPGP."; return; } @@ -909,7 +911,7 @@ d->wParent, i18nc("@title:window", "Attach File")); if (!result.URLs.isEmpty()) { - const QString encoding = MessageViewer::NodeHelper::fixEncoding(result.encoding); + const QString encoding = MimeTreeParser::NodeHelper::fixEncoding(result.encoding); const int numberOfFiles(result.URLs.count()); for (int i = 0; i < numberOfFiles; ++i) { const QUrl url = result.URLs.at(i); @@ -976,7 +978,7 @@ KeySelectionDialog::PublicKeys | KeySelectionDialog::OpenPGPKeys, false /* no multi selection */, false /* no remember choice box */, - d->wParent, "attach public key selection dialog"); + d->wParent); if (dialog->exec() == QDialog::Accepted && dialog) { exportPublicKey(dialog->fingerprint()); diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/attachment/attachmentcontrollerbase.h kf5-messagelib-16.12.3/messagecomposer/src/attachment/attachmentcontrollerbase.h --- kf5-messagelib-16.04.3/messagecomposer/src/attachment/attachmentcontrollerbase.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/attachment/attachmentcontrollerbase.h 2017-03-06 12:30:37.000000000 +0000 @@ -28,11 +28,11 @@ #include #include -#include +#include #include #include #include "messagecomposer_export.h" -#include "MessageViewer/EditorWatcher" + class KActionCollection; class QAction; diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/attachment/attachmentmodel.cpp kf5-messagelib-16.12.3/messagecomposer/src/attachment/attachmentmodel.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/attachment/attachmentmodel.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/attachment/attachmentmodel.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -178,7 +178,7 @@ QUrl url; url.setScheme(QStringLiteral("file")); url.setPath(fileName); - qCDebug(MESSAGECOMPOSER_LOG) <<" temporary file " << url; + qCDebug(MESSAGECOMPOSER_LOG) << " temporary file " << url; urls.append(url); } diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/CMakeLists.txt kf5-messagelib-16.12.3/messagecomposer/src/CMakeLists.txt --- kf5-messagelib-16.04.3/messagecomposer/src/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -9,6 +9,7 @@ if(BUILD_TESTING) add_subdirectory( imagescaling/autotests ) add_subdirectory( imagescaling/tests ) + add_subdirectory( composer-ng/autotests ) endif() @@ -95,6 +96,14 @@ plugineditor/plugineditorinterface.cpp ) +set(messagecomposer_plugineditorcheckbeforesend_SRCS + plugineditorcheckbeforesend/plugineditorcheckbeforesend.cpp + plugineditorcheckbeforesend/plugineditorcheckbeforesendinterface.cpp + plugineditorcheckbeforesend/plugineditorcheckbeforesendmanager.cpp + plugineditorcheckbeforesend/plugineditorcheckbeforesendconfigurewidget.cpp + plugineditorcheckbeforesend/plugineditorcheckbeforesendparams.cpp + ) + set( messagecomposer_src ${messagecomposer_plugineditor_SRCS} ${messagecomposer_richtextcomposerng_SRCS} @@ -107,6 +116,7 @@ ${messagecomposer_helper_src} ${messagecomposer_sender_src} ${messagecomposer_followupreminder_SRCS} + ${messagecomposer_plugineditorcheckbeforesend_SRCS} utils/util.cpp settings/messagecomposersettings.cpp ) @@ -114,7 +124,7 @@ ki18n_wrap_ui(messagecomposer_src imagescaling/ui/imagescalingwidget.ui ) -ecm_qt_declare_logging_category(messagecomposer_src HEADER messagecomposer_debug.h IDENTIFIER MESSAGECOMPOSER_LOG CATEGORY_NAME log_messagecomposer) +ecm_qt_declare_logging_category(messagecomposer_src HEADER messagecomposer_debug.h IDENTIFIER MESSAGECOMPOSER_LOG CATEGORY_NAME org.kde.pim.messagecomposer) if(KDEPIM_ENTERPRISE_BUILD) @@ -186,6 +196,19 @@ RELATIVE plugineditor ) +ecm_generate_headers(MessageComposer_Camelplugineditorcheckbeforesend_HEADERS + HEADER_NAMES + PluginEditorCheckBeforeSend + PluginEditorCheckBeforeSendInterface + PluginEditorCheckBeforeSendManager + PluginEditorCheckBeforeSendConfigureWidget + PluginEditorCheckBeforeSendParams + REQUIRED_HEADERS MessageComposer_plugineditorcheckbeforesend_HEADERS + PREFIX MessageComposer + RELATIVE plugineditorcheckbeforesend + ) + + ecm_generate_headers(MessageComposer_Camelcaseattachement_HEADERS HEADER_NAMES AttachmentModel @@ -315,6 +338,7 @@ install(FILES + ${MessageComposer_Camelplugineditorcheckbeforesend_HEADERS} ${MessageComposer_Camelcasecomposer_HEADERS} ${MessageComposer_Camelcasecomposerng_HEADERS} ${MessageComposer_Camelcasesender_HEADERS} @@ -350,6 +374,7 @@ ${MessageComposer_attachement_HEADERS} ${MessageComposer_job_HEADERS} ${MessageComposer_plugineditor_HEADERS} + ${MessageComposer_plugineditorcheckbeforesend_HEADERS} DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/messagecomposer COMPONENT Devel diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/composer/composer.cpp kf5-messagelib-16.12.3/messagecomposer/src/composer/composer.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/composer/composer.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/composer/composer.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -69,7 +69,7 @@ void composeStep2(); QList createEncryptJobs(ContentJobBase *contentJob, bool sign); void contentJobFinished(KJob *job); // slot - void composeWithLateAttachments(KMime::Message *headers, KMime::Content *content, AttachmentPart::List parts, std::vector keys, QStringList recipients); + void composeWithLateAttachments(KMime::Message *headers, KMime::Content *content, const AttachmentPart::List &parts, const std::vector &keys, const QStringList &recipients); void attachmentsFinished(KJob *job); // slot void composeFinalStep(KMime::Content *headers, KMime::Content *content); @@ -337,14 +337,14 @@ headers->setHeader(skeletonMessage->messageID()); KMime::Headers::Generic *realTo = new KMime::Headers::Generic("X-KMail-EncBccRecipients"); - realTo->fromUnicodeString(eJob->recipients().join(QStringLiteral("%")), "utf-8"); + realTo->fromUnicodeString(eJob->recipients().join(QLatin1Char('%')), "utf-8"); qCDebug(MESSAGECOMPOSER_LOG) << "got one of multiple messages sending to:" << realTo->asUnicodeString(); qCDebug(MESSAGECOMPOSER_LOG) << "sending to recipients:" << recipients; headers->setHeader(realTo); headers->assemble(); } else { // just use the saved headers from before - if (encData.size() > 0) { + if (!encData.isEmpty()) { qCDebug(MESSAGECOMPOSER_LOG) << "setting enc data:" << encData[ 0 ].first << "with num keys:" << encData[ 0 ].second.size(); keys = encData[ 0 ].second; recipients = encData[ 0 ].first; @@ -362,7 +362,7 @@ } -void ComposerPrivate::composeWithLateAttachments(KMime::Message *headers, KMime::Content *content, AttachmentPart::List parts, std::vector keys, QStringList recipients) +void ComposerPrivate::composeWithLateAttachments(KMime::Message *headers, KMime::Content *content, const AttachmentPart::List &parts, const std::vector &keys, const QStringList &recipients) { Q_Q(Composer); diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/composer/composerlineedit.cpp kf5-messagelib-16.12.3/messagecomposer/src/composer/composerlineedit.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/composer/composerlineedit.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/composer/composerlineedit.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -35,9 +35,6 @@ setRecentAddressConfig(MessageComposerSettings::self()->config()); loadContacts(); setEnableBalooSearch(MessageComposerSettings::showBalooSearchInComposer()); - connect(this, &ComposerLineEdit::editingFinished, this, &ComposerLineEdit::slotEditingFinished); - connect(this, &ComposerLineEdit::textCompleted, this, &ComposerLineEdit::slotEditingFinished); - } ComposerLineEdit::~ComposerLineEdit() diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/composer/composerviewbase.cpp kf5-messagelib-16.12.3/messagecomposer/src/composer/composerviewbase.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/composer/composerviewbase.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/composer/composerviewbase.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -46,7 +46,7 @@ #include "settings/messagecomposersettings.h" #include -#include +#include #ifndef QT_NO_CURSOR #include #endif @@ -154,20 +154,20 @@ m_recipientsEditor->setFocusBottom(); // If we are loading from a draft, load unexpanded aliases as well - if (m_msg->hasHeader("X-KMail-UnExpanded-To")) { - const QStringList spl = m_msg->headerByType("X-KMail-UnExpanded-To")->asUnicodeString().split(QStringLiteral(",")); + if (auto hrd = m_msg->headerByType("X-KMail-UnExpanded-To")) { + const QStringList spl = hrd->asUnicodeString().split(QStringLiteral(",")); foreach (const QString &addr, spl) { m_recipientsEditor->addRecipient(addr, MessageComposer::Recipient::To); } } - if (m_msg->hasHeader("X-KMail-UnExpanded-CC")) { - const QStringList spl = m_msg->headerByType("X-KMail-UnExpanded-CC")->asUnicodeString().split(QStringLiteral(",")); + if (auto hrd = m_msg->headerByType("X-KMail-UnExpanded-CC")) { + const QStringList spl = hrd->asUnicodeString().split(QStringLiteral(",")); foreach (const QString &addr, spl) { m_recipientsEditor->addRecipient(addr, MessageComposer::Recipient::Cc); } } - if (m_msg->hasHeader("X-KMail-UnExpanded-BCC")) { - const QStringList spl = m_msg->headerByType("X-KMail-UnExpanded-BCC")->asUnicodeString().split(QStringLiteral(",")); + if (auto hrd = m_msg->headerByType("X-KMail-UnExpanded-BCC")) { + const QStringList spl = hrd->asUnicodeString().split(QStringLiteral(",")); foreach (const QString &addr, spl) { m_recipientsEditor->addRecipient(addr, MessageComposer::Recipient::Bcc); } @@ -181,7 +181,7 @@ msgContent->setContent(m_msg->encodedContent()); msgContent->parse(); MessageViewer::EmptySource emptySource; - MessageViewer::ObjectTreeParser otp(&emptySource); //All default are ok + MimeTreeParser::ObjectTreeParser otp(&emptySource); //All default are ok emptySource.setAllowDecryption(allowDecryption); otp.parseObjectTree(msgContent); @@ -206,12 +206,15 @@ } // Set the HTML text and collect HTML images - if (!otp.htmlContent().isEmpty()) { - m_editor->setHtml(otp.htmlContent()); + QString htmlContent = otp.htmlContent(); + if (htmlContent.isEmpty()) { + m_editor->setPlainText(otp.plainTextContent()); + } else { + //Bug 372085
is replaced in qtextedit by ... => break url + htmlContent.replace(QRegularExpression(QStringLiteral("")), QStringLiteral("
")); + m_editor->setHtml(htmlContent); Q_EMIT enableHtml(); collectImages(m_msg.data()); - } else { - m_editor->setPlainText(otp.plainTextContent()); } if (auto hdr = m_msg->headerByType("X-KMail-CursorPos")) { @@ -229,7 +232,7 @@ msgContent->setContent(msg->encodedContent()); msgContent->parse(); MessageViewer::EmptySource emptySource; - MessageViewer::ObjectTreeParser otp(&emptySource); //All default are ok + MimeTreeParser::ObjectTreeParser otp(&emptySource); //All default are ok otp.parseObjectTree(msgContent); // Set the HTML text and collect HTML images if (!otp.htmlContent().isEmpty()) { @@ -594,11 +597,12 @@ QList< MessageComposer::Composer * > MessageComposer::ComposerViewBase::generateCryptoMessages(bool &wasCanceled) { + const KIdentityManagement::Identity &id = m_identMan->identityForUoidOrDefault(m_identityCombo->currentIdentity()); qCDebug(MESSAGECOMPOSER_LOG) << "filling crypto info"; Kleo::KeyResolver *keyResolver = new Kleo::KeyResolver(encryptToSelf(), showKeyApprovalDialog(), - MessageComposer::MessageComposerSettings::self()->pgpAutoEncrypt(), + id.pgpAutoEncrypt(), m_cryptoMessageFormat, encryptKeyNearExpiryWarningThresholdInDays(), signingKeyNearExpiryWarningThresholdInDays(), @@ -607,8 +611,6 @@ encryptChainCertNearExpiryWarningThresholdInDays(), signingChainCertNearExpiryWarningThresholdInDays()); - const KIdentityManagement::Identity &id = m_identMan->identityForUoidOrDefault(m_identityCombo->currentIdentity()); - QStringList encryptToSelfKeys; QStringList signKeys; @@ -948,7 +950,7 @@ QMapIterator customHeader(m_customHeader); while (customHeader.hasNext()) { customHeader.next(); - auto header = new KMime::Headers::Generic(customHeader.key()); + auto header = new KMime::Headers::Generic(customHeader.key().constData()); header->fromUnicodeString(customHeader.value(), "utf-8"); message->setHeader(header); } @@ -997,8 +999,7 @@ } // if this header is not empty, it contains the real recipient of the message, either the primary or one of the // secondary recipients. so we set that to the transport job, while leaving the message itself alone. - if (message->hasHeader("X-KMail-EncBccRecipients")) { - KMime::Headers::Base *realTo = message->headerByType("X-KMail-EncBccRecipients"); + if (KMime::Headers::Base *realTo = message->headerByType("X-KMail-EncBccRecipients")) { qjob->addressAttribute().setTo(cleanEmailList(encodeIdn(realTo->asUnicodeString().split(QLatin1Char('%'))))); message->removeHeader("X-KMail-EncBccRecipients"); message->assemble(); @@ -1066,13 +1067,13 @@ } else { if (!m_autoSaveTimer) { m_autoSaveTimer = new QTimer(this); - if (m_parentWidget) + if (m_parentWidget) { connect(m_autoSaveTimer, SIGNAL(timeout()), m_parentWidget, SLOT(autoSaveMessage())); - else + } else { connect(m_autoSaveTimer, &QTimer::timeout, this, &ComposerViewBase::autoSaveMessage); - + } } m_autoSaveTimer->start(m_autoSaveInterval); } @@ -1650,7 +1651,7 @@ //----------------------------------------------------------------------------- void MessageComposer::ComposerViewBase::collectImages(KMime::Content *root) { - if (KMime::Content *n = MessageViewer::ObjectTreeParser::findType(root, "multipart/alternative", true, true)) { + if (KMime::Content *n = Util::findTypeInMessage(root, "multipart", "alternative")) { KMime::Content *parentnode = n->parent(); if (parentnode && parentnode->contentType()->isMultipart() && diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/composer/keyresolver.cpp kf5-messagelib-16.12.3/messagecomposer/src/composer/keyresolver.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/composer/keyresolver.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/composer/keyresolver.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -43,18 +43,16 @@ #include "utils/kleo_util.h" #include -#include "Libkleo/KeySelectionDialog" -#include "Libkleo/CryptoBackendFactory" -#include "Libkleo/KeyListJob" -#include "Libkleo/Dn" +#include +#include + +#include +#include #include #include -#include #include -#include -#include #include #include "messagecomposer_debug.h" #include @@ -116,11 +114,6 @@ return Kleo::KeyResolver::Item(oldItem.address, newItem.keys, newItem.pref, oldItem.signPref, oldItem.format); } -static inline bool ByKeyID(const GpgME::Key &left, const GpgME::Key &right) -{ - return qstrcmp(left.keyID(), right.keyID()) < 0; -} - static inline bool WithRespectToKeyID(const GpgME::Key &left, const GpgME::Key &right) { return qstrcmp(left.keyID(), right.keyID()) == 0; @@ -374,15 +367,15 @@ if (!fishies.empty()) { // certificates can't have marginal trust msg += i18n("\nThe following keys are only marginally trusted: \n"); - msg += keysAsStrings(fishies).join(QStringLiteral(",")); + msg += keysAsStrings(fishies).join(QLatin1Char(',')); } if (!ickies.empty()) { msg += i18n("\nThe following keys or certificates have unknown trust level: \n"); - msg += keysAsStrings(ickies).join(QStringLiteral(",")); + msg += keysAsStrings(ickies).join(QLatin1Char(',')); } if (!rewookies.empty()) { msg += i18n("\nThe following keys or certificates are revoked: \n"); - msg += keysAsStrings(rewookies).join(QStringLiteral(",")); + msg += keysAsStrings(rewookies).join(QLatin1Char(',')); } if (KMessageBox::warningContinueCancel(Q_NULLPTR, msg, i18n("Not Fully Trusted Encryption Keys"), @@ -1869,8 +1862,8 @@ qCDebug(MESSAGECOMPOSER_LOG) << "( \"" << patterns.join(QStringLiteral("\", \"")) << "\"," << secret << ")"; std::vector result; if (mCryptoMessageFormats & (InlineOpenPGPFormat | OpenPGPMIMEFormat)) - if (const Kleo::CryptoBackend::Protocol *p = Kleo::CryptoBackendFactory::instance()->openpgp()) { - std::unique_ptr job(p->keyListJob(false, false, true)); // use validating keylisting + if (const QGpgME::Protocol *p = QGpgME::openpgp()) { + std::unique_ptr job(p->keyListJob(false, false, true)); // use validating keylisting if (job.get()) { std::vector keys; job->exec(patterns, secret, keys); @@ -1878,8 +1871,8 @@ } } if (mCryptoMessageFormats & (SMIMEFormat | SMIMEOpaqueFormat)) - if (const Kleo::CryptoBackend::Protocol *p = Kleo::CryptoBackendFactory::instance()->smime()) { - std::unique_ptr job(p->keyListJob(false, false, true)); // use validating keylisting + if (const QGpgME::Protocol *p = QGpgME::smime()) { + std::unique_ptr job(p->keyListJob(false, false, true)); // use validating keylisting if (job.get()) { std::vector keys; job->exec(patterns, secret, keys); diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/composer/keyresolver.h kf5-messagelib-16.12.3/messagecomposer/src/composer/keyresolver.h --- kf5-messagelib-16.04.3/messagecomposer/src/composer/keyresolver.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/composer/keyresolver.h 2017-03-06 12:30:37.000000000 +0000 @@ -38,8 +38,8 @@ #define __KLEO_KEYRESOLVER_H__ #include "messagecomposer_export.h" -#include "Libkleo/KeyApprovalDialog" -#include "Libkleo/Enum" +#include +#include #include diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/composer/signaturecontroller.cpp kf5-messagelib-16.12.3/messagecomposer/src/composer/signaturecontroller.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/composer/signaturecontroller.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/composer/signaturecontroller.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -155,8 +155,6 @@ addedText |= KIdentityManagement::Signature::AddSeparator; } d->m_editor->insertSignature(signature, placement, addedText); - //d->m_editor->insertSignature(signature, KIdentityManagement::Signature::AtCursor, KIdentityManagement::Signature::AddNothing); - //signature.insertIntoTextEdit(placement, addedText, d->m_editor); if ((placement == KIdentityManagement::Signature::Start) || (placement == KIdentityManagement::Signature::End)) { Q_EMIT signatureAdded(); } @@ -175,14 +173,9 @@ } if (MessageComposer::MessageComposerSettings::self()->prependSignature()) { d->m_editor->insertSignature(signature, KIdentityManagement::Signature::Start, addedText); - } - //signature.insertIntoTextEdit(KIdentityManagement::Signature::Start, - // addedText, d->m_editor); - else { + } else { d->m_editor->insertSignature(signature, KIdentityManagement::Signature::End, addedText); } - //signature.insertIntoTextEdit(KIdentityManagement::Signature::End, - // addedText, d->m_editor); } } diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/autotests/CMakeLists.txt kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/autotests/CMakeLists.txt --- kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/autotests/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/autotests/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,10 @@ +add_definitions( -DSIGNATURE_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data" ) + +macro(add_composerng_autocorrect_unittest _source) + ecm_add_test(${_source} + NAME_PREFIX "messagecomposer-composerng-" + LINK_LIBRARIES Qt5::Test KF5::MessageComposer KF5::XmlGui + ) +endmacro() + +add_composerng_autocorrect_unittest(richtextcomposerngtest.cpp) diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/autotests/data/signature1.txt kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/autotests/data/signature1.txt --- kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/autotests/data/signature1.txt 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/autotests/data/signature1.txt 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,3 @@ +Signature bla bla +Blo bli +foo diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/autotests/data/signature2.txt kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/autotests/data/signature2.txt --- kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/autotests/data/signature2.txt 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/autotests/data/signature2.txt 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,5 @@ +-------------------- +Signature bla bla +Blo bli +foo +-------------------- diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/autotests/richtextcomposerngtest.cpp kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/autotests/richtextcomposerngtest.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/autotests/richtextcomposerngtest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/autotests/richtextcomposerngtest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,535 @@ +/* + Copyright (C) 2016 Montel Laurent + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "richtextcomposerngtest.h" +#include "../richtextcomposerng.h" +#include "../richtextcomposersignatures.h" + +#include +#include + +#include +#include + +RichTextComposerNgTest::RichTextComposerNgTest(QObject *parent) + : QObject(parent) +{ + +} + +RichTextComposerNgTest::~RichTextComposerNgTest() +{ + +} + +void RichTextComposerNgTest::shouldHaveDefaultValue() +{ + MessageComposer::RichTextComposerNg richtextComposerNg; + QVERIFY(richtextComposerNg.composerSignature()); + QVERIFY(!richtextComposerNg.autocorrection()); + QVERIFY(richtextComposerNg.composerControler()); + QVERIFY(richtextComposerNg.composerControler()->composerImages()); +} + +void RichTextComposerNgTest::shouldForceAutoCorrection_data() +{ + QTest::addColumn("original"); + QTest::addColumn("expected"); + //FIXME first char ! + QTest::newRow("test1") << QStringLiteral("boo bla bli. foo faa") << QStringLiteral("boo bla bli. Foo faa"); + QTest::newRow("test2") << QStringLiteral("boo bla bli.\nfoo faa") << QStringLiteral("boo bla bli.\nFoo faa"); + QTest::newRow("test3") << QStringLiteral("\nboo bla bli.\nfoo faa") << QStringLiteral("\nBoo bla bli.\nFoo faa"); + +} + +void RichTextComposerNgTest::shouldForceAutoCorrection() +{ + QFETCH(QString, original); + QFETCH(QString, expected); + + MessageComposer::RichTextComposerNg richtextComposerNg; + + richtextComposerNg.setPlainText(original); + PimCommon::AutoCorrection autocorrection; + autocorrection.setEnabledAutoCorrection(true); + autocorrection.setUppercaseFirstCharOfSentence(true); + richtextComposerNg.setAutocorrection(&autocorrection); + richtextComposerNg.forceAutoCorrection(false); + + QCOMPARE(richtextComposerNg.toPlainText(), expected); +} + +void RichTextComposerNgTest::shouldForceAutoCorrectionWithSelection_data() +{ + QTest::addColumn("original"); + QTest::addColumn("expected"); + QTest::addColumn("selectionStart"); + QTest::addColumn("selectionEnd"); + QTest::newRow("noselection") << QStringLiteral("\nboo bla bli.\nfoo faa") << QStringLiteral("\nBoo bla bli.\nFoo faa") << 0 << 0; + QTest::newRow("noselection2") << QStringLiteral("\nboo bla bli.\nfoo faa") << QStringLiteral("\nBoo bla bli.\nFoo faa") << 1 << 1; + QTest::newRow("fullselection") << QStringLiteral("\nboo bla bli.\nfoo faa") << QStringLiteral("\nBoo bla bli.\nFoo faa") << 0 << 21; + QTest::newRow("selection1") << QStringLiteral("\nboo bla bli.\nfoo faa") << QStringLiteral("\nBoo bla bli.\nfoo faa") << 0 << 10; + QTest::newRow("selection2") << QStringLiteral("\nboo bla bli.\nfoo faa") << QStringLiteral("\nboo bla bli.\nfoo faa") << 5 << 10; + QTest::newRow("twouppercase") << QStringLiteral("\nBOo bla bli.\nfoo FAa") << QStringLiteral("\nBoo bla bli.\nFoo Faa") << 0 << 21; +} + +void RichTextComposerNgTest::shouldForceAutoCorrectionWithSelection() +{ + QFETCH(QString, original); + QFETCH(QString, expected); + QFETCH(int, selectionStart); + QFETCH(int, selectionEnd); + + MessageComposer::RichTextComposerNg richtextComposerNg; + + richtextComposerNg.setPlainText(original); + QTextCursor cur = richtextComposerNg.textCursor(); + cur.setPosition(selectionStart); + cur.setPosition(selectionEnd, QTextCursor::KeepAnchor); + richtextComposerNg.setTextCursor(cur); + PimCommon::AutoCorrection autocorrection; + autocorrection.setEnabledAutoCorrection(true); + autocorrection.setUppercaseFirstCharOfSentence(true); + autocorrection.setFixTwoUppercaseChars(true); + richtextComposerNg.setAutocorrection(&autocorrection); + richtextComposerNg.forceAutoCorrection(true); + + QCOMPARE(richtextComposerNg.toPlainText(), expected); +} + +void RichTextComposerNgTest::shouldNotChangeSignatureWhenOriginalAndNewSignatureAreSame() +{ + MessageComposer::RichTextComposerNg richtextComposerNg; + KIdentityManagement::Signature oldSignature; + + const bool replaceSignature = richtextComposerNg.composerSignature()->replaceSignature(oldSignature, oldSignature); + QVERIFY(!replaceSignature); +} +Q_DECLARE_METATYPE(KIdentityManagement::Signature::Placement) +Q_DECLARE_METATYPE(KIdentityManagement::Signature::AddedTextFlag) +Q_DECLARE_METATYPE(KIdentityManagement::Signature::Type) + +void RichTextComposerNgTest::shouldAddSignature_data() +{ + QTest::addColumn("original"); + QTest::addColumn("expected"); + QTest::addColumn("signatureplacement"); + QTest::addColumn("signatureaddtext"); + QTest::newRow("startandaddseparator") << QStringLiteral("foo bla, bli\nbb") << QStringLiteral("-- \nSignaturefoo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddSeparator; + + QTest::newRow("startandnewline") << QStringLiteral("foo bla, bli\nbb") << QStringLiteral("\n\nSignature\nfoo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddNewLines; + + QTest::newRow("startandnothing") << QStringLiteral("foo bla, bli\nbb") << QStringLiteral("Signaturefoo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddNothing; + + QTest::newRow("endandaddseparator") << QStringLiteral("foo bla, bli\nbb") << QStringLiteral("foo bla, bli\nbb-- \nSignature") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddSeparator; + + QTest::newRow("endandnewline") << QStringLiteral("foo bla, bli\nbb") << QStringLiteral("foo bla, bli\nbb\nSignature") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddNewLines; + + QTest::newRow("endandnothing") << QStringLiteral("foo bla, bli\nbb") << QStringLiteral("foo bla, bli\nbbSignature") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddNothing; + + //TODO test "Add Cursor" +} + +void RichTextComposerNgTest::shouldAddSignature() +{ + QFETCH(QString, original); + QFETCH(QString, expected); + QFETCH(KIdentityManagement::Signature::Placement, signatureplacement); + QFETCH(KIdentityManagement::Signature::AddedTextFlag, signatureaddtext); + MessageComposer::RichTextComposerNg richtextComposerNg; + richtextComposerNg.setPlainText(original); + + KIdentityManagement::Signature newSignature(QStringLiteral("Signature")); + newSignature.setEnabledSignature(true); + richtextComposerNg.insertSignature(newSignature, signatureplacement, signatureaddtext); + QCOMPARE(richtextComposerNg.toPlainText(), expected); +} + +void RichTextComposerNgTest::shouldAddSpecificSignature_data() +{ + QTest::addColumn("original"); + QTest::addColumn("expected"); + QTest::addColumn("signatureplacement"); + QTest::addColumn("signatureaddtext"); + QTest::addColumn("enablesignature"); + QTest::addColumn("signaturehtml"); + QTest::newRow("startandaddseparatordisablenonhtml") << QStringLiteral("foo bla, bli\nbb") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddSeparator + << false << false; + + QTest::newRow("startandaddseparatordisablehtml") << QStringLiteral("foo bla, bli\nbb") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddSeparator + << false << true; + + QTest::newRow("startandaddseparatorenablehtml") << QStringLiteral("foo bla, bli\nbb") << QStringLiteral("-- \nSignaturefoo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddSeparator + << true << true; +} + +void RichTextComposerNgTest::shouldAddSpecificSignature() +{ + QFETCH(QString, original); + QFETCH(QString, expected); + QFETCH(KIdentityManagement::Signature::Placement, signatureplacement); + QFETCH(KIdentityManagement::Signature::AddedTextFlag, signatureaddtext); + QFETCH(bool, enablesignature); + QFETCH(bool, signaturehtml); + MessageComposer::RichTextComposerNg richtextComposerNg; + richtextComposerNg.createActions(new KActionCollection(this)); + richtextComposerNg.setPlainText(original); + + KIdentityManagement::Signature newSignature(QStringLiteral("Signature")); + newSignature.setEnabledSignature(enablesignature); + newSignature.setInlinedHtml(signaturehtml); + richtextComposerNg.insertSignature(newSignature, signatureplacement, signatureaddtext); + //qDebug() << " clean html "<("signatureText"); + QTest::addColumn("bodytext"); + QTest::addColumn("signatureplacement"); + QTest::addColumn("signatureaddtext"); + + //Add Separator AtEnd + QTest::newRow("newlinebody") << QStringLiteral("Signature") << QStringLiteral("\n") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddSeparator; + QTest::newRow("emptybody") << QStringLiteral("Signature") << QString() + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddSeparator; + QTest::newRow("spacebody") << QStringLiteral("Signature") << QStringLiteral(" ") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddSeparator; + QTest::newRow("simple") << QStringLiteral("Signature") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddSeparator; + QTest::newRow("withnewline") << QStringLiteral("Signature\nnew line") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddSeparator; + QTest::newRow("withnewlineatbegin") << QStringLiteral("\nSignature\nnew line") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddSeparator; + QTest::newRow("withnewlineatbeginandend") << QStringLiteral("\nSignature\nnew line\n") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddSeparator; + + //Add separator AtStart + QTest::newRow("newlinebody-2") << QStringLiteral("Signature") << QStringLiteral("\n") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddSeparator; + QTest::newRow("emptybody-2") << QStringLiteral("Signature") << QString() + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddSeparator; + QTest::newRow("spacebody-2") << QStringLiteral("Signature") << QStringLiteral(" ") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddSeparator; + QTest::newRow("simple-2") << QStringLiteral("Signature") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddSeparator; + QTest::newRow("withnewline-2") << QStringLiteral("Signature\nnew line") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddSeparator; + QTest::newRow("withnewlineatbegin-2") << QStringLiteral("\nSignature\nnew line") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddSeparator; + QTest::newRow("withnewlineatbeginandend-2") << QStringLiteral("\nSignature\nnew line\n") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddSeparator; + + //Add nothing End + //FIXME + //QTest::newRow("newlinebody-3") << QStringLiteral("Signature") << QStringLiteral("\n") + // << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddNothing; + QTest::newRow("emptybody-3") << QStringLiteral("Signature") << QString() + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddNothing; + QTest::newRow("spacebody-3") << QStringLiteral("Signature") << QStringLiteral(" ") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddNothing; + QTest::newRow("simple-3") << QStringLiteral("Signature") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddNothing; + QTest::newRow("withnewline-3") << QStringLiteral("Signature\nnew line") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddNothing; + QTest::newRow("withnewlineatbegin-3") << QStringLiteral("\nSignature\nnew line") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddNothing; + QTest::newRow("withnewlineatbeginandend-3") << QStringLiteral("\nSignature\nnew line\n") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddNothing; + + //Add nothing Start + QTest::newRow("newlinebody-4") << QStringLiteral("Signature") << QStringLiteral("\n") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddNothing; + QTest::newRow("emptybody-4") << QStringLiteral("Signature") << QString() + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddNothing; + QTest::newRow("spacebody-4") << QStringLiteral("Signature") << QStringLiteral(" ") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddNothing; + QTest::newRow("simple-4") << QStringLiteral("Signature") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddNothing; + QTest::newRow("withnewline-4") << QStringLiteral("Signature\nnew line") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddNothing; + QTest::newRow("withnewlineatbegin-4") << QStringLiteral("\nSignature\nnew line") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddNothing; + QTest::newRow("withnewlineatbeginandend-4") << QStringLiteral("\nSignature\nnew line\n") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddNothing; + + //Add newline End + QTest::newRow("emptybody-5") << QStringLiteral("Signature") << QString() + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddNewLines; + QTest::newRow("newlinebody-5") << QStringLiteral("Signature") << QStringLiteral("\n") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddNewLines; + QTest::newRow("spacebody-5") << QStringLiteral("Signature") << QStringLiteral(" ") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddNewLines; + QTest::newRow("simple-5") << QStringLiteral("Signature") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddNewLines; + QTest::newRow("withnewline-5") << QStringLiteral("Signature\nnew line") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddNewLines; + QTest::newRow("withnewlineatbegin-5") << QStringLiteral("\nSignature\nnew line") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddNewLines; + QTest::newRow("withnewlineatbeginandend-5") << QStringLiteral("\nSignature\nnew line\n") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddNewLines; +#if 0 //Need to fix it. + //Add newline start + QTest::newRow("emptybody-6") << QStringLiteral("Signature") << QString() + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddNewLines; + QTest::newRow("newlinebody-6") << QStringLiteral("Signature") << QStringLiteral("\n") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddNewLines; + QTest::newRow("spacebody-6") << QStringLiteral("Signature") << QStringLiteral(" ") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddNewLines; + QTest::newRow("simple-6") << QStringLiteral("Signature") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddNewLines; + QTest::newRow("withnewline-6") << QStringLiteral("Signature\nnew line") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddNewLines; + QTest::newRow("withnewlineatbegin-6") << QStringLiteral("\nSignature\nnew line") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddNewLines; + QTest::newRow("withnewlineatbeginandend6") << QStringLiteral("\nSignature\nnew line\n") << QStringLiteral("foo bla, bli\nbb") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddNewLines; +#endif +} + +void RichTextComposerNgTest::shouldReplaceSignature() +{ + QFETCH(QString, signatureText); + QFETCH(QString, bodytext); + QFETCH(KIdentityManagement::Signature::Placement, signatureplacement); + QFETCH(KIdentityManagement::Signature::AddedTextFlag, signatureaddtext); + + MessageComposer::RichTextComposerNg richtextComposerNg; + richtextComposerNg.createActions(new KActionCollection(this)); + const QString original(bodytext); + richtextComposerNg.setPlainText(original); + + KIdentityManagement::Signature newSignature(signatureText); + newSignature.setEnabledSignature(true); + newSignature.setInlinedHtml(false); + + QString addText; + switch (signatureaddtext) { + case KIdentityManagement::Signature::AddNothing: + break; + case KIdentityManagement::Signature::AddSeparator: + addText = QStringLiteral("-- \n"); + break; + case KIdentityManagement::Signature::AddNewLines: + addText = QStringLiteral("\n"); + break; + } + + QString expected; + switch (signatureplacement) { + case KIdentityManagement::Signature::Start: + expected = addText + signatureText + bodytext; + break; + case KIdentityManagement::Signature::End: + expected = bodytext + addText + signatureText; + break; + case KIdentityManagement::Signature::AtCursor: + break; + } + richtextComposerNg.insertSignature(newSignature, signatureplacement, signatureaddtext); + QCOMPARE(richtextComposerNg.toPlainText(), expected); + + KIdentityManagement::Signature emptySignature; + + bool replaceSignature = richtextComposerNg.composerSignature()->replaceSignature(newSignature, emptySignature); + QVERIFY(replaceSignature); + QCOMPARE(richtextComposerNg.toPlainText(), original); + + replaceSignature = richtextComposerNg.composerSignature()->replaceSignature(emptySignature, newSignature); + QVERIFY(!replaceSignature); + //When signature is empty we can't replace it.=> we need to insertSignature + + //=> insertSignature(signature, KIdentityManagement::Signature::End, addedText); + richtextComposerNg.insertSignature(newSignature, signatureplacement, signatureaddtext); + QCOMPARE(richtextComposerNg.toPlainText(), expected); +} + +void RichTextComposerNgTest::shouldLoadSignatureFromFile_data() +{ + QTest::addColumn("signatureFile"); + QTest::addColumn("bodytext"); + QTest::addColumn("signatureplacement"); + QTest::addColumn("signatureaddtext"); + + QTest::newRow("signature1") << QStringLiteral("signature1.txt") << QStringLiteral("\n") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddSeparator; + + QTest::newRow("signature2") << QStringLiteral("signature2.txt") << QStringLiteral("\n") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddSeparator; +} + +void RichTextComposerNgTest::shouldLoadSignatureFromFile() +{ + QFETCH(QString, signatureFile); + QFETCH(QString, bodytext); + QFETCH(KIdentityManagement::Signature::Placement, signatureplacement); + QFETCH(KIdentityManagement::Signature::AddedTextFlag, signatureaddtext); + + MessageComposer::RichTextComposerNg richtextComposerNg; + richtextComposerNg.createActions(new KActionCollection(this)); + const QString original(bodytext); + richtextComposerNg.setPlainText(original); + + KIdentityManagement::Signature newSignature(QLatin1String(SIGNATURE_DATA_DIR) + QLatin1Char('/') + signatureFile, false); + newSignature.setEnabledSignature(true); + newSignature.setInlinedHtml(false); + + QString addText; + switch (signatureaddtext) { + case KIdentityManagement::Signature::AddNothing: + break; + case KIdentityManagement::Signature::AddSeparator: + addText = QStringLiteral("-- \n"); + break; + case KIdentityManagement::Signature::AddNewLines: + addText = QStringLiteral("\n"); + break; + } + + QString expected; + QString signatureText = newSignature.toPlainText(); + QVERIFY(!signatureText.isEmpty()); + switch (signatureplacement) { + case KIdentityManagement::Signature::Start: + expected = addText + signatureText + bodytext; + break; + case KIdentityManagement::Signature::End: + expected = bodytext + addText + signatureText; + break; + case KIdentityManagement::Signature::AtCursor: + break; + } + + richtextComposerNg.insertSignature(newSignature, signatureplacement, signatureaddtext); + QCOMPARE(richtextComposerNg.toPlainText(), expected); + + KIdentityManagement::Signature emptySignature; + + bool replaceSignature = richtextComposerNg.composerSignature()->replaceSignature(newSignature, emptySignature); + QVERIFY(replaceSignature); + QCOMPARE(richtextComposerNg.toPlainText(), original); + + replaceSignature = richtextComposerNg.composerSignature()->replaceSignature(emptySignature, newSignature); + QVERIFY(!replaceSignature); + //When signature is empty we can't replace it.=> we need to insertSignature + + //=> insertSignature(signature, KIdentityManagement::Signature::End, addedText); + richtextComposerNg.insertSignature(newSignature, signatureplacement, signatureaddtext); + QCOMPARE(richtextComposerNg.toPlainText(), expected); +} + +void RichTextComposerNgTest::shouldLoadSignatureFromCommand_data() +{ + QTest::addColumn("command"); + QTest::addColumn("bodytext"); + QTest::addColumn("signatureplacement"); + QTest::addColumn("signatureaddtext"); + + QTest::newRow("command1") << QStringLiteral("echo \"foo\"") << QStringLiteral("\n") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddSeparator; + QTest::newRow("command2") << QStringLiteral("echo \"foo\"") << QStringLiteral("foo ddd \n") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddSeparator; + QTest::newRow("command3") << QStringLiteral("echo \"foo\"") << QString() + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddSeparator; + QTest::newRow("command4") << QStringLiteral("echo \"foo\nsss\"") << QString() + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddSeparator; + QTest::newRow("command5") << QStringLiteral("echo \"foo\nsss\n\"") << QStringLiteral("foo ddd \n") + << KIdentityManagement::Signature::End << KIdentityManagement::Signature::AddSeparator; + + //Start + QTest::newRow("command6") << QStringLiteral("echo \"foo\nsss\n\"") << QStringLiteral("foo ddd \n") + << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddSeparator; + + //Failed + //QTest::newRow("command7") << QStringLiteral("echo \"foo\nsss\n\"") << QStringLiteral("foo ddd \n") + // << KIdentityManagement::Signature::Start << KIdentityManagement::Signature::AddNewLines; +} + +void RichTextComposerNgTest::shouldLoadSignatureFromCommand() +{ + QFETCH(QString, command); + QFETCH(QString, bodytext); + QFETCH(KIdentityManagement::Signature::Placement, signatureplacement); + QFETCH(KIdentityManagement::Signature::AddedTextFlag, signatureaddtext); + + MessageComposer::RichTextComposerNg richtextComposerNg; + richtextComposerNg.createActions(new KActionCollection(this)); + const QString original(bodytext); + richtextComposerNg.setPlainText(original); + + KIdentityManagement::Signature newSignature(command, true); + newSignature.setEnabledSignature(true); + newSignature.setInlinedHtml(false); + + QString addText; + switch (signatureaddtext) { + case KIdentityManagement::Signature::AddNothing: + break; + case KIdentityManagement::Signature::AddSeparator: + addText = QStringLiteral("-- \n"); + break; + case KIdentityManagement::Signature::AddNewLines: + addText = QStringLiteral("\n"); + break; + } + + QString expected; + QString signatureText = newSignature.toPlainText(); + QVERIFY(!signatureText.isEmpty()); + switch (signatureplacement) { + case KIdentityManagement::Signature::Start: + expected = addText + signatureText + bodytext; + break; + case KIdentityManagement::Signature::End: + expected = bodytext + addText + signatureText; + break; + case KIdentityManagement::Signature::AtCursor: + break; + } + + richtextComposerNg.insertSignature(newSignature, signatureplacement, signatureaddtext); + QCOMPARE(richtextComposerNg.toPlainText(), expected); + + KIdentityManagement::Signature emptySignature; + + bool replaceSignature = richtextComposerNg.composerSignature()->replaceSignature(newSignature, emptySignature); + QVERIFY(replaceSignature); + QCOMPARE(richtextComposerNg.toPlainText(), original); + + replaceSignature = richtextComposerNg.composerSignature()->replaceSignature(emptySignature, newSignature); + QVERIFY(!replaceSignature); + //When signature is empty we can't replace it.=> we need to insertSignature + + //=> insertSignature(signature, KIdentityManagement::Signature::End, addedText); + richtextComposerNg.insertSignature(newSignature, signatureplacement, signatureaddtext); + QCOMPARE(richtextComposerNg.toPlainText(), expected); +} + +QTEST_MAIN(RichTextComposerNgTest) diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/autotests/richtextcomposerngtest.h kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/autotests/richtextcomposerngtest.h --- kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/autotests/richtextcomposerngtest.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/autotests/richtextcomposerngtest.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,58 @@ +/* + Copyright (C) 2016 Montel Laurent + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef RICHTEXTCOMPOSERNGTEST_H +#define RICHTEXTCOMPOSERNGTEST_H + +#include + +class RichTextComposerNgTest : public QObject +{ + Q_OBJECT +public: + explicit RichTextComposerNgTest(QObject *parent = Q_NULLPTR); + ~RichTextComposerNgTest(); +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldForceAutoCorrection_data(); + void shouldForceAutoCorrection(); + + void shouldForceAutoCorrectionWithSelection_data(); + void shouldForceAutoCorrectionWithSelection(); + + void shouldNotChangeSignatureWhenOriginalAndNewSignatureAreSame(); + + void shouldAddSignature_data(); + void shouldAddSignature(); + + void shouldAddSpecificSignature_data(); + void shouldAddSpecificSignature(); + + void shouldReplaceSignature_data(); + void shouldReplaceSignature(); + + void shouldLoadSignatureFromFile_data(); + void shouldLoadSignatureFromFile(); + + void shouldLoadSignatureFromCommand_data(); + void shouldLoadSignatureFromCommand(); + +}; + +#endif // RICHTEXTCOMPOSERNGTEST_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/richtextcomposerng.cpp kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/richtextcomposerng.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/richtextcomposerng.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/richtextcomposerng.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "richtextcomposerng.h" @@ -98,7 +100,8 @@ const bool addSpace = d->autoCorrection->autocorrect(richText, *document(), position); QTextCursor cur = textCursor(); cur.setPosition(position); - if (overwriteMode() && e->key() == Qt::Key_Space) { + const bool spacePressed = (e->key() == Qt::Key_Space); + if (overwriteMode() && spacePressed) { if (addSpace) { const QChar insertChar = QLatin1Char(' '); if (!cur.atBlockEnd()) { @@ -112,7 +115,7 @@ setTextCursor(cur); } } else { - const bool spacePressed = (e->key() == Qt::Key_Space); + const QChar insertChar = spacePressed ? QLatin1Char(' ') : QLatin1Char('\n'); if (richText && !isSpecial(initialTextFormat)) { if ((spacePressed && addSpace) || !spacePressed) { @@ -340,7 +343,7 @@ { if (signature.isEnabledSignature()) { QString signatureStr; - if (placement & KIdentityManagement::Signature::AddSeparator) { + if (addedText & KIdentityManagement::Signature::AddSeparator) { signatureStr = signature.withSeparator(); } else { signatureStr = signature.rawText(); @@ -357,7 +360,6 @@ composerControler()->composerImages()->loadImage(image->image, image->name, image->name); } } - } } @@ -365,3 +367,48 @@ { return d->toCleanHtml(); } + +void RichTextComposerNg::forceAutoCorrection(bool selectedText) +{ + if (document()->isEmpty()) { + return; + } + if (d->autoCorrection && d->autoCorrection->isEnabledAutoCorrection()) { + const bool richText = (textMode() == RichTextComposer::Rich); + const int initialPosition = textCursor().position(); + QTextCursor cur = textCursor(); + cur.beginEditBlock(); + if (selectedText && cur.hasSelection()) { + const int positionStart = qMin(cur.selectionEnd(), cur.selectionStart()); + const int positionEnd = qMax(cur.selectionEnd(), cur.selectionStart()); + cur.setPosition(positionStart); + int cursorPosition = positionStart; + while (cursorPosition < positionEnd) { + if (isLineQuoted(cur.block().text())) { + cur.movePosition(QTextCursor::NextBlock); + } else { + cur.movePosition(QTextCursor::NextWord); + } + cursorPosition = cur.position(); + d->autoCorrection->autocorrect(richText, *document(), cursorPosition); + } + } else { + cur.movePosition(QTextCursor::Start); + while (!cur.atEnd()) { + if (isLineQuoted(cur.block().text())) { + cur.movePosition(QTextCursor::NextBlock); + } else { + cur.movePosition(QTextCursor::NextWord); + } + int cursorPosition = cur.position(); + d->autoCorrection->autocorrect(richText, *document(), cursorPosition); + } + } + cur.endEditBlock(); + if (cur.position() != initialPosition) { + cur.setPosition(initialPosition); + setTextCursor(cur); + } + + } +} diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/richtextcomposerng.h kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/richtextcomposerng.h --- kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/richtextcomposerng.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/richtextcomposerng.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef RICHTEXTCOMPOSERNG_H @@ -49,6 +51,7 @@ void insertSignature(const KIdentityManagement::Signature &signature, KIdentityManagement::Signature::Placement placement, KIdentityManagement::Signature::AddedText addedText); QString toCleanHtml() const; + void forceAutoCorrection(bool selectedText = false) Q_DECL_OVERRIDE; private: bool processAutoCorrection(QKeyEvent *event) Q_DECL_OVERRIDE; RichTextComposerNgPrivate *const d; diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/richtextcomposersignatures.cpp kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/richtextcomposersignatures.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/richtextcomposersignatures.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/richtextcomposersignatures.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "richtextcomposerng.h" @@ -20,6 +22,7 @@ #include #include +#include "messagecomposer_debug.h" using namespace MessageComposer; class Q_DECL_HIDDEN RichTextComposerSignatures::RichTextComposerSignaturesPrivate @@ -148,11 +151,13 @@ const KIdentityManagement::Signature &newSig) { bool found = false; + if (oldSig == newSig) { + return false; + } QString oldSigText = oldSig.toPlainText(); if (oldSigText.isEmpty()) { return false; } - QTextCursor cursor(d->richTextComposer->document()); cursor.beginEditBlock(); int currentSearchPosition = 0; @@ -176,8 +181,13 @@ if (newSig.rawText().isEmpty() && text.mid(currentMatch - 4, 4) == QLatin1String("-- \n")) { cursor.movePosition(QTextCursor::PreviousCharacter, - QTextCursor::MoveAnchor, 5); - additionalMove = 5; + QTextCursor::MoveAnchor, 4); + additionalMove = 4; + } else if (newSig.rawText().isEmpty() && + text.mid(currentMatch - 1, 1) == QLatin1String("\n")) { + cursor.movePosition(QTextCursor::PreviousCharacter, + QTextCursor::MoveAnchor, 1); + additionalMove = 1; } cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, oldSigText.length() + additionalMove); @@ -190,7 +200,6 @@ cursor.removeSelectedText(); d->richTextComposer->setTextCursor(cursor); d->richTextComposer->insertSignature(newSig, KIdentityManagement::Signature::AtCursor, KIdentityManagement::Signature::AddNothing); - //newSig.insertIntoTextEdit(KIdentityManagement::Signature::AtCursor, KIdentityManagement::Signature::AddNothing, this); found = true; currentSearchPosition += newSig.toPlainText().length(); diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/richtextcomposersignatures.h kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/richtextcomposersignatures.h --- kf5-messagelib-16.04.3/messagecomposer/src/composer-ng/richtextcomposersignatures.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/composer-ng/richtextcomposersignatures.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef RICHTEXTCOMPOSERSIGNATURES_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/followupreminder/followupremindercreatejob.cpp kf5-messagelib-16.12.3/messagecomposer/src/followupreminder/followupremindercreatejob.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/followupreminder/followupremindercreatejob.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/followupreminder/followupremindercreatejob.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "followupremindercreatejob.h" @@ -87,7 +89,7 @@ if (d->mInfo->isValid()) { if (d->mCollection.isValid()) { KCalCore::Todo::Ptr todo(new KCalCore::Todo); - todo->setSummary(i18n("Wait answer from \"%1\" send to \"%2\"").arg(d->mInfo->subject()).arg(d->mInfo->to())); + todo->setSummary(i18n("Wait answer from \"%1\" send to \"%2\"").arg(d->mInfo->subject(), d->mInfo->to())); Akonadi::Item newTodoItem; newTodoItem.setMimeType(KCalCore::Todo::todoMimeType()); newTodoItem.setPayload(todo); diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/followupreminder/followupremindercreatejob.h kf5-messagelib-16.12.3/messagecomposer/src/followupreminder/followupremindercreatejob.h --- kf5-messagelib-16.04.3/messagecomposer/src/followupreminder/followupremindercreatejob.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/followupreminder/followupremindercreatejob.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef FOLLOWUPREMINDERCREATEJOB_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/followupreminder/followupreminderselectdatedialog.cpp kf5-messagelib-16.12.3/messagecomposer/src/followupreminder/followupreminderselectdatedialog.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/followupreminder/followupreminderselectdatedialog.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/followupreminder/followupreminderselectdatedialog.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "followupreminderselectdatedialog.h" @@ -56,16 +58,15 @@ d(new MessageComposer::FollowUpReminderSelectDateDialogPrivate) { setWindowTitle(i18n("Select Date")); - QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - QVBoxLayout *topLayout = new QVBoxLayout; - setLayout(topLayout); + QVBoxLayout *topLayout = new QVBoxLayout(this); + + QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); d->mOkButton = buttonBox->button(QDialogButtonBox::Ok); d->mOkButton->setObjectName(QStringLiteral("ok_button")); d->mOkButton->setDefault(true); d->mOkButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, &QDialogButtonBox::accepted, this, &FollowUpReminderSelectDateDialog::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &FollowUpReminderSelectDateDialog::reject); - d->mOkButton->setDefault(true); setModal(true); QWidget *mainWidget = new QWidget(this); @@ -82,7 +83,6 @@ d->mDateComboBox->setObjectName(QStringLiteral("datecombobox")); QDate currentDate = QDate::currentDate(); - currentDate = currentDate.addDays(1); d->mDateComboBox->setDate(currentDate); formLayout->addRow(i18n("Date:"), d->mDateComboBox); diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/followupreminder/followupreminderselectdatedialog.h kf5-messagelib-16.12.3/messagecomposer/src/followupreminder/followupreminderselectdatedialog.h --- kf5-messagelib-16.04.3/messagecomposer/src/followupreminder/followupreminderselectdatedialog.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/followupreminder/followupreminderselectdatedialog.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef FOLLOWUPREMINDERSELECTDATEDIALOG_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/helper/messagefactory.cpp kf5-messagelib-16.12.3/messagecomposer/src/helper/messagefactory.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/helper/messagefactory.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/helper/messagefactory.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -94,28 +94,26 @@ MessageFactory::MessageReply MessageFactory::createReply() { KMime::Message::Ptr msg(new KMime::Message); - QString mailingListStr; - QByteArray refStr, headerName; + QByteArray refStr; bool replyAll = true; KMime::Types::Mailbox::List toList; KMime::Types::Mailbox::List replyToList; const uint originalIdentity = identityUoid(m_origMsg); MessageHelper::initFromMessage(msg, m_origMsg, m_identityManager, originalIdentity); - MessageCore::MailingList::name(m_origMsg, headerName, mailingListStr); replyToList = m_origMsg->replyTo()->mailboxes(); msg->contentType()->setCharset("utf-8"); - if (m_origMsg->headerByType("List-Post") && - m_origMsg->headerByType("List-Post")->asUnicodeString().contains(QStringLiteral("mailto:"), Qt::CaseInsensitive)) { - - const QString listPost = m_origMsg->headerByType("List-Post")->asUnicodeString(); - QRegExp rx(QStringLiteral("]+)@([^>]+)>"), Qt::CaseInsensitive); - if (rx.indexIn(listPost, 0) != -1) { // matched - KMime::Types::Mailbox mailbox; - mailbox.fromUnicodeString(rx.cap(1) + QLatin1Char('@') + rx.cap(2)); - m_mailingListAddresses << mailbox; + if (auto hdr = m_origMsg->headerByType("List-Post")) { + const QString hdrListPost = hdr->asUnicodeString(); + if (hdrListPost.contains(QStringLiteral("mailto:"), Qt::CaseInsensitive)) { + QRegExp rx(QStringLiteral("]+)@([^>]+)>"), Qt::CaseInsensitive); + if (rx.indexIn(hdrListPost, 0) != -1) { // matched + KMime::Types::Mailbox mailbox; + mailbox.fromUnicodeString(rx.cap(1) + QLatin1Char('@') + rx.cap(2)); + m_mailingListAddresses << mailbox; + } } } @@ -178,6 +176,10 @@ KMime::Types::Mailbox::List recipients; KMime::Types::Mailbox::List ccRecipients; + QString sender; + if (auto hrd = m_origMsg->sender(false)) { + sender = hrd->asUnicodeString(); + } // add addresses from the Reply-To header to the list of recipients if (!replyToList.isEmpty()) { recipients = replyToList; @@ -191,7 +193,7 @@ } } } - + bool stripMyAddresses = true; if (!m_mailingListAddresses.isEmpty()) { // this is a mailing list message if (recipients.isEmpty() && !m_origMsg->from()->asUnicodeString().isEmpty()) { @@ -204,17 +206,28 @@ // if it is a mailing list, add the posting address recipients.prepend(m_mailingListAddresses[ 0 ]); } else { - // this is a normal message - if (recipients.isEmpty() && !m_origMsg->from()->asUnicodeString().isEmpty()) { - // in case of replying to a normal message only then add the From - // address to the list of recipients if there was no Reply-to address - recipients += m_origMsg->from()->mailboxes(); - qCDebug(MESSAGECOMPOSER_LOG) << "Added" << m_origMsg->from()->asUnicodeString() << "to the list of recipients"; + const QString fromAddress = m_origMsg->from()->asUnicodeString(); + if (!fromAddress.isEmpty()) { + if (!sender.isEmpty() && m_identityManager->thatIsMe(fromAddress)) { + // strip all my addresses from the list of recipients + toList = recipients; + toList += m_origMsg->from()->mailboxes(); + stripMyAddresses = false; + } else { + // this is a normal message + if (recipients.isEmpty()) { + // in case of replying to a normal message only then add the From + // address to the list of recipients if there was no Reply-to address + recipients += m_origMsg->from()->mailboxes(); + qCDebug(MESSAGECOMPOSER_LOG) << "Added" << m_origMsg->from()->asUnicodeString() << "to the list of recipients"; + } + } } } - - // strip all my addresses from the list of recipients - toList = stripMyAddressesFromAddressList(recipients, m_identityManager); + if (stripMyAddresses) { + // strip all my addresses from the list of recipients + toList = stripMyAddressesFromAddressList(recipients, m_identityManager); + } // merge To header and CC header into a list of CC recipients if (!m_origMsg->cc()->asUnicodeString().isEmpty() || !m_origMsg->to()->asUnicodeString().isEmpty()) { @@ -237,7 +250,9 @@ if (!ccRecipients.isEmpty()) { // strip all my addresses from the list of CC recipients - ccRecipients = stripMyAddressesFromAddressList(ccRecipients, m_identityManager); + if (stripMyAddresses) { + ccRecipients = stripMyAddressesFromAddressList(ccRecipients, m_identityManager); + } // in case of a reply to self, toList might be empty. if that's the case // then propagate a cc recipient to To: (if there is any). @@ -298,7 +313,6 @@ if (!refStr.isEmpty()) { msg->references()->fromUnicodeString(QString::fromLocal8Bit(refStr), "utf-8"); } - //In-Reply-To = original msg-id msg->inReplyTo()->from7BitString(m_origMsg->messageID()->as7BitString(false)); @@ -310,9 +324,11 @@ parser.setIdentityManager(m_identityManager); parser.setCharsets(MessageComposerSettings::self()->preferredCharsets()); parser.setWordWrap(MessageComposerSettings::wordWrap(), MessageComposerSettings::lineWrapWidth()); +#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 1) if (MessageComposer::MessageComposerSettings::quoteSelectionOnly()) { parser.setSelection(m_selection); } +#endif parser.setAllowDecryption(true); if (!m_template.isEmpty()) { parser.process(m_template, m_origMsg); @@ -320,7 +336,6 @@ parser.process(m_origMsg, m_collection); } } - applyCharset(msg); MessageCore::Util::addLinkInformation(msg, m_id, Akonadi::MessageStatus::statusReplied()); @@ -330,11 +345,12 @@ msg->setHeader(header); } - if (m_origMsg->hasHeader("X-KMail-EncryptActionEnabled") && - m_origMsg->headerByType("X-KMail-EncryptActionEnabled")->as7BitString(false).contains("true")) { - auto header = new KMime::Headers::Generic("X-KMail-EncryptActionEnabled"); - header->fromUnicodeString(QStringLiteral("true"), "utf-8"); - msg->setHeader(header); + if (auto hrd = m_origMsg->headerByType("X-KMail-EncryptActionEnabled")) { + if (hrd->as7BitString(false).contains("true")) { + auto header = new KMime::Headers::Generic("X-KMail-EncryptActionEnabled"); + header->fromUnicodeString(QStringLiteral("true"), "utf-8"); + msg->setHeader(header); + } } msg->assemble(); @@ -399,6 +415,7 @@ TemplateParser::TemplateParser parser(msg, TemplateParser::TemplateParser::Forward); parser.setIdentityManager(m_identityManager); parser.setCharsets(MessageComposerSettings::self()->preferredCharsets()); + parser.setSelection(m_selection); if (!m_template.isEmpty()) { parser.process(m_template, m_origMsg); } else { @@ -470,12 +487,6 @@ msgPart->setBody(fwdMsg->encodedContent()); msgPart->assemble(); -#if 0 - // THIS HAS TO BE AFTER setCte()!!!! - msgPart->setCharset(""); -#else - qCDebug(MESSAGECOMPOSER_LOG) << "AKONADI PORT: Disabled code in " << Q_FUNC_INFO; -#endif MessageCore::Util::addLinkInformation(fwdMsg, 0, Akonadi::MessageStatus::statusForwarded()); return msgPart; } @@ -511,9 +522,11 @@ uint id = identity; if (identity == -1) { - const QString strId = msg->headerByType("X-KMail-Identity") ? msg->headerByType("X-KMail-Identity")->asUnicodeString().trimmed() : QString::fromLocal8Bit(""); - if (!strId.isEmpty()) { - id = strId.toUInt(); + if (auto hrd = msg->headerByType("X-KMail-Identity")) { + const QString strId = hrd->asUnicodeString().trimmed(); + if (!strId.isEmpty()) { + id = strId.toUInt(); + } } } const KIdentityManagement::Identity &ident = @@ -521,14 +534,11 @@ // X-KMail-Redirect-From: content const QString strByWayOf = QString::fromLocal8Bit("%1 (by way of %2 <%3>)") - .arg(m_origMsg->from()->asUnicodeString()) - .arg(ident.fullName()) - .arg(ident.primaryEmailAddress()); + .arg(m_origMsg->from()->asUnicodeString(), ident.fullName(), ident.primaryEmailAddress()); // Resent-From: content const QString strFrom = QString::fromLocal8Bit("%1 <%2>") - .arg(ident.fullName()) - .arg(ident.primaryEmailAddress()); + .arg(ident.fullName(), ident.primaryEmailAddress()); // format the current date to be used in Resent-Date: // FIXME: generate datetime the same way as KMime, otherwise we get inconsistency @@ -616,22 +626,22 @@ KMime::Message::Ptr MessageFactory::createDeliveryReceipt() { - QString str, receiptTo; - KMime::Message::Ptr receipt; - - receiptTo = m_origMsg->headerByType("Disposition-Notification-To") ? m_origMsg->headerByType("Disposition-Notification-To")->asUnicodeString() : QStringLiteral(""); + QString receiptTo; + if (auto hrd = m_origMsg->headerByType("Disposition-Notification-To")) { + receiptTo = hrd->asUnicodeString(); + } if (receiptTo.trimmed().isEmpty()) { return KMime::Message::Ptr(); } receiptTo.remove(QChar::fromLatin1('\n')); - receipt = KMime::Message::Ptr(new KMime::Message); + KMime::Message::Ptr receipt = KMime::Message::Ptr(new KMime::Message); const uint originalIdentity = identityUoid(m_origMsg); MessageHelper::initFromMessage(receipt, m_origMsg, m_identityManager, originalIdentity); receipt->to()->fromUnicodeString(receiptTo, QStringLiteral("utf-8").toLatin1()); receipt->subject()->fromUnicodeString(i18n("Receipt: ") + m_origMsg->subject()->asUnicodeString(), "utf-8"); - str = QStringLiteral("Your message was successfully delivered."); + QString str = QStringLiteral("Your message was successfully delivered."); str += QLatin1String("\n\n---------- Message header follows ----------\n"); str += QString::fromLatin1(m_origMsg->head()); str += QLatin1String("--------------------------------------------\n"); @@ -651,7 +661,10 @@ const QVector &m) { // extract where to send to: - QString receiptTo = m_origMsg->headerByType("Disposition-Notification-To") ? m_origMsg->headerByType("Disposition-Notification-To")->asUnicodeString() : QStringLiteral(""); + QString receiptTo; + if (auto hrd = m_origMsg->headerByType("Disposition-Notification-To")) { + receiptTo = hrd->asUnicodeString(); + } if (receiptTo.trimmed().isEmpty()) { return KMime::Message::Ptr(new KMime::Message); } @@ -689,12 +702,15 @@ // message/disposition-notification part: KMime::Content *secondMsgPart = new KMime::Content(m_origMsg.data()); secondMsgPart->contentType()->setMimeType("message/disposition-notification"); - //secondMsgPart.setCharset( "us-ascii" ); secondMsgPart->contentTransferEncoding()->setEncoding(KMime::Headers::CE7Bit); + QByteArray originalRecipient = ""; + if (auto hrd = m_origMsg->headerByType("Original-Recipient")) { + originalRecipient = hrd->as7BitString(false); + } secondMsgPart->setBody(KMime::MDN::dispositionNotificationBodyContent( finalRecipient, - m_origMsg->headerByType("Original-Recipient") ? m_origMsg->headerByType("Original-Recipient")->as7BitString(false) : "", + originalRecipient, m_origMsg->messageID()->as7BitString(false), /* Message-ID */ d, a, s, m, special)); receipt->addContent(secondMsgPart); @@ -756,8 +772,10 @@ int id = 0; foreach (const Akonadi::Item &item, items) { KMime::Message::Ptr fMsg = MessageCore::Util::message(item); - if (id == 0 && fMsg->hasHeader("X-KMail-Identity")) { - id = fMsg->headerByType("X-KMail-Identity")->asUnicodeString().toInt(); + if (id == 0) { + if (auto hrd = fMsg->headerByType("X-KMail-Identity")) { + id = hrd->asUnicodeString().toInt(); + } } MessageCore::StringUtil::removePrivateHeaderFields(fMsg); @@ -828,7 +846,10 @@ bool MessageFactory::MDNRequested(const KMime::Message::Ptr &msg) { // extract where to send to: - QString receiptTo = msg->headerByType("Disposition-Notification-To") ? msg->headerByType("Disposition-Notification-To")->asUnicodeString() : QStringLiteral(""); + QString receiptTo; + if (auto hrd = msg->headerByType("Disposition-Notification-To")) { + receiptTo = hrd->asUnicodeString(); + } if (receiptTo.trimmed().isEmpty()) { return false; } @@ -839,7 +860,10 @@ bool MessageFactory::MDNConfirmMultipleRecipients(const KMime::Message::Ptr &msg) { // extract where to send to: - QString receiptTo = msg->headerByType("Disposition-Notification-To") ? msg->headerByType("Disposition-Notification-To")->asUnicodeString() : QStringLiteral(""); + QString receiptTo; + if (auto hrd = msg->headerByType("Disposition-Notification-To")) { + receiptTo = hrd->asUnicodeString(); + } if (receiptTo.trimmed().isEmpty()) { return false; } @@ -857,7 +881,10 @@ bool MessageFactory::MDNReturnPathEmpty(const KMime::Message::Ptr &msg) { // extract where to send to: - QString receiptTo = msg->headerByType("Disposition-Notification-To") ? msg->headerByType("Disposition-Notification-To")->asUnicodeString() : QStringLiteral(""); + QString receiptTo; + if (auto hrd = msg->headerByType("Disposition-Notification-To")) { + receiptTo = hrd->asUnicodeString(); + } if (receiptTo.trimmed().isEmpty()) { return false; } @@ -878,7 +905,10 @@ bool MessageFactory::MDNReturnPathNotInRecieptTo(const KMime::Message::Ptr &msg) { // extract where to send to: - QString receiptTo = msg->headerByType("Disposition-Notification-To") ? msg->headerByType("Disposition-Notification-To")->asUnicodeString() : QStringLiteral(""); + QString receiptTo; + if (auto hrd = msg->headerByType("Disposition-Notification-To")) { + receiptTo = hrd->asUnicodeString(); + } if (receiptTo.trimmed().isEmpty()) { return false; } @@ -905,7 +935,10 @@ // not understand the meaning of the parameter, it MUST NOT generate // an MDN with any disposition type other than "failed" in response // to the request. - QString notificationOptions = msg->headerByType("Disposition-Notification-Options") ? msg->headerByType("Disposition-Notification-Options")->asUnicodeString() : QStringLiteral(""); + QString notificationOptions; + if (auto hrd = msg->headerByType("Disposition-Notification-Options")) { + notificationOptions = hrd->asUnicodeString(); + } if (notificationOptions.contains(QStringLiteral("required"), Qt::CaseSensitive)) { // ### hacky; should parse... // There is a required option that we don't understand. We need to @@ -955,7 +988,11 @@ idx = 0; while ((idx = rx.indexIn(result, idx)) != -1) { - QString replacement = msg->headerByType(rx.cap(1).toLatin1()) ? msg->headerByType(rx.cap(1).toLatin1())->asUnicodeString() : QStringLiteral(""); + const QByteArray ba = rx.cap(1).toLatin1(); + QString replacement; + if (auto hrd = msg->headerByType(ba.constData())) { + replacement = hrd->asUnicodeString(); + } result.replace(idx, rx.matchedLength(), replacement); idx += replacement.length(); } diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/helper/messagehelper.cpp kf5-messagelib-16.12.3/messagecomposer/src/helper/messagehelper.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/helper/messagehelper.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/helper/messagehelper.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -46,9 +46,6 @@ message->removeHeader(); message->date()->setDateTime(QDateTime::currentDateTime()); - const QStringList extraInfo = QStringList() << QString::fromLocal8Bit(MESSAGELIB_GIT_REVISION_STRING) << QString::fromLocal8Bit(MESSAGELIB_GIT_LAST_CHANGE); - - message->userAgent()->fromUnicodeString(KProtocolManager::userAgentForApplication(QString::fromLocal8Bit("KMail"), QString::fromLocal8Bit(MESSAGELIB_GIT_REVISION_STRING), extraInfo), QLatin1String("utf-8").latin1()); // This will allow to change Content-Type: message->contentType()->setMimeType("text/plain"); } @@ -167,17 +164,15 @@ KMime::Types::AddrSpecList extractAddrSpecs(const KMime::Message::Ptr &msg, const QByteArray &header) { KMime::Types::AddrSpecList result; - if (!msg->headerByType(header)) { - return result; - } - - KMime::Types::AddressList al = - MessageCore::StringUtil::splitAddressField(msg->headerByType(header)->asUnicodeString().toUtf8()); - KMime::Types::AddressList::const_iterator alend(al.constEnd()); - for (KMime::Types::AddressList::const_iterator ait = al.constBegin(); ait != alend; ++ait) { - KMime::Types::MailboxList::const_iterator mitEnd((*ait).mailboxList.constEnd()); - for (KMime::Types::MailboxList::const_iterator mit = (*ait).mailboxList.constBegin(); mit != mitEnd; ++mit) { - result.push_back((*mit).addrSpec()); + if (auto hrd = msg->headerByType(header.constData())) { + KMime::Types::AddressList al = + MessageCore::StringUtil::splitAddressField(hrd->asUnicodeString().toUtf8()); + KMime::Types::AddressList::const_iterator alend(al.constEnd()); + for (KMime::Types::AddressList::const_iterator ait = al.constBegin(); ait != alend; ++ait) { + KMime::Types::MailboxList::const_iterator mitEnd((*ait).mailboxList.constEnd()); + for (KMime::Types::MailboxList::const_iterator mit = (*ait).mailboxList.constBegin(); mit != mitEnd; ++mit) { + result.push_back((*mit).addrSpec()); + } } } return result; diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/autotests/imagescalingtest.cpp kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/autotests/imagescalingtest.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/autotests/imagescalingtest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/autotests/imagescalingtest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "imagescalingtest.h" @@ -107,8 +109,6 @@ MessageComposer::MessageComposerSettings::self()->save(); MessageComposer::ImageScaling scaling; scaling.setMimetype(initialmimetype); - qDebug() << " scaling.mimetype()" << scaling.mimetype(); - qDebug() << " scaling.mimetype()" << newmimetype; QCOMPARE(scaling.mimetype(), newmimetype); } diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/autotests/imagescalingtest.h kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/autotests/imagescalingtest.h --- kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/autotests/imagescalingtest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/autotests/imagescalingtest.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef IMAGESCALINGTEST_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/imagescaling.cpp kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/imagescaling.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/imagescaling.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/imagescaling.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,19 +1,22 @@ /* - Copyright (c) 2012-2016 Montel Laurent + Copyright (C) 2012-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + #include "imagescaling.h" #include "settings/messagecomposersettings.h" @@ -64,7 +67,7 @@ int maximumWidth = MessageComposer::MessageComposerSettings::self()->maximumWidth(); if (maximumWidth == -1) { - maximumWidth = MessageComposer::MessageComposerSettings::self()->customMaximumWidth(); + maximumWidth = MessageComposer::MessageComposerSettings::self()->customMaximumWidth(); } int maximumHeight = MessageComposer::MessageComposerSettings::self()->maximumHeight(); if (maximumHeight == -1) { @@ -88,7 +91,7 @@ int minimumWidth = MessageComposer::MessageComposerSettings::self()->minimumWidth(); if (minimumWidth == -1) { - minimumWidth = MessageComposer::MessageComposerSettings::self()->customMinimumWidth(); + minimumWidth = MessageComposer::MessageComposerSettings::self()->customMinimumWidth(); } int minimumHeight = MessageComposer::MessageComposerSettings::self()->minimumHeight(); @@ -108,16 +111,16 @@ QByteArray format; if (d->mMimeType == "image/jpeg") { - format = "JPG"; + format = QByteArrayLiteral("JPG"); } else if (d->mMimeType == "image/png") { - format = "PNG"; + format = QByteArrayLiteral("PNG"); } else { format = MessageComposer::MessageComposerSettings::self()->writeFormat().toLocal8Bit(); if (format.isEmpty()) { - format = "PNG"; + format = QByteArrayLiteral("PNG"); } } - const bool result = d->mImage.save(&d->mBuffer, format); + const bool result = d->mImage.save(&d->mBuffer, format.constData()); d->mBuffer.close(); return result; } else { diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/imagescaling.h kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/imagescaling.h --- kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/imagescaling.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/imagescaling.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,19 +1,22 @@ /* - Copyright (c) 2012-2016 Montel Laurent + Copyright (C) 2012-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + #ifndef IMAGESCALING_H #define IMAGESCALING_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/imagescalingselectformat.cpp kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/imagescalingselectformat.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/imagescalingselectformat.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/imagescalingselectformat.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2013-2016 Montel Laurent + Copyright (C) 2013-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "imagescalingselectformat.h" @@ -33,16 +35,14 @@ : QDialog(parent) { setWindowTitle(i18nc("@title:window", "Select Image Format")); - QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - QVBoxLayout *mainLayout = new QVBoxLayout; - setLayout(mainLayout); + QVBoxLayout *mainLayout = new QVBoxLayout(this); + QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); - okButton->setDefault(true); - mListWidget = new QListWidget; + mListWidget = new QListWidget(this); mainLayout->addWidget(mListWidget); mainLayout->addWidget(buttonBox); diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/imagescalingselectformat.h kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/imagescalingselectformat.h --- kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/imagescalingselectformat.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/imagescalingselectformat.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,19 +1,23 @@ + /* - Copyright (c) 2013-2016 Montel Laurent + Copyright (C) 2013-2016 Montel Laurent + + 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. - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + #ifndef IMAGESCALINGSELECTFORMAT_H #define IMAGESCALINGSELECTFORMAT_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/imagescalingutils.cpp kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/imagescalingutils.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/imagescalingutils.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/imagescalingutils.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2013-2016 Montel Laurent + Copyright (C) 2013-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "imagescalingutils.h" diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/imagescalingutils.h kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/imagescalingutils.h --- kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/imagescalingutils.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/imagescalingutils.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2013-2016 Montel Laurent + Copyright (C) 2013-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef AUTORESIZEIMAGEUTIL_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/imagescalingwidget.cpp kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/imagescalingwidget.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/imagescalingwidget.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/imagescalingwidget.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2012-2016 Montel Laurent + Copyright (C) 2012-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "imagescalingwidget.h" diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/imagescalingwidget.h kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/imagescalingwidget.h --- kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/imagescalingwidget.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/imagescalingwidget.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2012-2016 Montel Laurent + Copyright (C) 2012-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef IMAGESCALINGWIDGET_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/tests/CMakeLists.txt kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/tests/CMakeLists.txt --- kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/tests/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/tests/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -1,9 +1,9 @@ set(imagescaling_gui_SRCS imagescaling_gui.cpp) add_executable(imagescaling_gui ${imagescaling_gui_SRCS}) target_link_libraries(imagescaling_gui - Qt5::WebKitWidgets KF5::KIOCore KF5::MessageComposer + KF5::I18n ) diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/tests/imagescaling_gui.cpp kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/tests/imagescaling_gui.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/tests/imagescaling_gui.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/tests/imagescaling_gui.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2013-2016 Montel Laurent + Copyright (C) 2013-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "imagescaling_gui.h" @@ -29,9 +31,8 @@ ImageScalingTestWidget::ImageScalingTestWidget(QWidget *parent) : QWidget(parent) { - QHBoxLayout *lay = new QHBoxLayout; - lay->addWidget(new MessageComposer::ImageScalingWidget); - setLayout(lay); + QHBoxLayout *lay = new QHBoxLayout(this); + lay->addWidget(new MessageComposer::ImageScalingWidget(this)); } ImageScalingTestWidget::~ImageScalingTestWidget() diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/tests/imagescaling_gui.h kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/tests/imagescaling_gui.h --- kf5-messagelib-16.04.3/messagecomposer/src/imagescaling/tests/imagescaling_gui.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/imagescaling/tests/imagescaling_gui.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2013-2016 Montel Laurent + Copyright (C) 2013-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef TEST_IMAGESCALING_GUI_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/job/aliasesexpandjob.cpp kf5-messagelib-16.12.3/messagecomposer/src/job/aliasesexpandjob.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/job/aliasesexpandjob.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/job/aliasesexpandjob.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -150,14 +150,20 @@ // take prefetched expand distribution list results const DistributionListExpansionResult result = mDistListExpansionResults.value(recipient); + QString displayName, addrSpec, comment; if (result.isEmpty) { + KEmailAddress::splitAddress(receiver, displayName, addrSpec, comment); + mEmailAddressOnly.append(addrSpec); mEmailAddresses += receiver; mEmptyDistributionLists << receiver; continue; } if (!result.addresses.isEmpty()) { + KEmailAddress::splitAddress(result.addresses, displayName, addrSpec, comment); + mEmailAddressOnly.append(addrSpec); + mEmailAddresses += result.addresses; continue; } @@ -166,11 +172,13 @@ const QString recipientValue = mNicknameExpansionResults.value(recipient); if (!recipientValue.isEmpty()) { mEmailAddresses += recipientValue; + KEmailAddress::splitAddress(recipientValue, displayName, addrSpec, comment); + mEmailAddressOnly.append(addrSpec); + continue; } // check whether the address is missing the domain part - QString displayName, addrSpec, comment; KEmailAddress::splitAddress(receiver, displayName, addrSpec, comment); if (!addrSpec.contains(QLatin1Char('@'))) { if (!mDefaultDomain.isEmpty()) @@ -182,7 +190,13 @@ } else { mEmailAddresses += receiver; } + mEmailAddressOnly.append(addrSpec); } emitResult(); } + +QStringList AliasesExpandJob::emailAddressOnly() const +{ + return mEmailAddressOnly; +} diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/job/aliasesexpandjob.h kf5-messagelib-16.12.3/messagecomposer/src/job/aliasesexpandjob.h --- kf5-messagelib-16.04.3/messagecomposer/src/job/aliasesexpandjob.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/job/aliasesexpandjob.h 2017-03-06 12:30:37.000000000 +0000 @@ -73,6 +73,8 @@ */ QStringList emptyDistributionLists() const; + QStringList emailAddressOnly() const; + private Q_SLOTS: void slotDistributionListExpansionDone(KJob *); void slotNicknameExpansionDone(KJob *); @@ -80,6 +82,8 @@ private: void finishExpansion(); + QStringList mEmailAddressOnly; + QStringList mRecipients; QString mDefaultDomain; diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/job/attachmentfrompublickeyjob.cpp kf5-messagelib-16.12.3/messagecomposer/src/job/attachmentfrompublickeyjob.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/job/attachmentfrompublickeyjob.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/job/attachmentfrompublickeyjob.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -26,8 +26,9 @@ #include #include -#include -#include +#include +#include + #include using namespace MessageComposer; @@ -105,7 +106,7 @@ void AttachmentFromPublicKeyJob::doStart() { - Kleo::ExportJob *job = Kleo::CryptoBackendFactory::instance()->openpgp()->publicKeyExportJob(true); + QGpgME::ExportJob *job = QGpgME::openpgp()->publicKeyExportJob(true); Q_ASSERT(job); QObject::connect(job, SIGNAL(result(GpgME::Error,QByteArray)), this, SLOT(exportResult(GpgME::Error,QByteArray))); diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/job/attachmentvcardfromaddressbookjob.cpp kf5-messagelib-16.12.3/messagecomposer/src/job/attachmentvcardfromaddressbookjob.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/job/attachmentvcardfromaddressbookjob.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/job/attachmentvcardfromaddressbookjob.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -27,7 +27,7 @@ class MessageComposer::AttachmentVcardFromAddressBookJobPrivate { public: - AttachmentVcardFromAddressBookJobPrivate(Akonadi::Item item) + AttachmentVcardFromAddressBookJobPrivate(const Akonadi::Item &item) : mItem(item) { diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/job/encryptjob.cpp kf5-messagelib-16.12.3/messagecomposer/src/job/encryptjob.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/job/encryptjob.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/job/encryptjob.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -21,12 +21,13 @@ #include "job/encryptjob.h" #include "contentjobbase_p.h" -#include "Libkleo/CryptoBackendFactory" -#include "Libkleo/CryptoBackend" -#include "Libkleo/EncryptJob" -#include "Libkleo/Enum" #include "utils/util.h" +#include + +#include +#include + #include "messagecomposer_debug.h" #include @@ -155,11 +156,11 @@ //d->resultContent = new KMime::Content; - const Kleo::CryptoBackend::Protocol *proto = Q_NULLPTR; + const QGpgME::Protocol *proto = Q_NULLPTR; if (d->format & Kleo::AnyOpenPGP) { - proto = Kleo::CryptoBackendFactory::instance()->openpgp(); + proto = QGpgME::openpgp(); } else if (d->format & Kleo::AnySMIME) { - proto = Kleo::CryptoBackendFactory::instance()->smime(); + proto = QGpgME::smime(); } else { qCDebug(MESSAGECOMPOSER_LOG) << "HELP! Encrypt job but have protocol to encrypt with."; return; @@ -168,7 +169,7 @@ Q_ASSERT(proto); qCDebug(MESSAGECOMPOSER_LOG) << "got backend, starting job"; - Kleo::EncryptJob *seJob = proto->encryptJob(!d->binaryHint(d->format), d->format == Kleo::InlineOpenPGPFormat); + QGpgME::EncryptJob *seJob = proto->encryptJob(!d->binaryHint(d->format), d->format == Kleo::InlineOpenPGPFormat); // for now just do the main recipients QByteArray encryptedBody; diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/job/encryptjob.h kf5-messagelib-16.12.3/messagecomposer/src/job/encryptjob.h --- kf5-messagelib-16.04.3/messagecomposer/src/job/encryptjob.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/job/encryptjob.h 2017-03-06 12:30:37.000000000 +0000 @@ -25,7 +25,8 @@ #include "contentjobbase.h" #include "part/infopart.h" #include "messagecomposer_export.h" -#include "Libkleo/Enum" + +#include #include #include diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/job/savecontactpreferencejob.cpp kf5-messagelib-16.12.3/messagecomposer/src/job/savecontactpreferencejob.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/job/savecontactpreferencejob.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/job/savecontactpreferencejob.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "savecontactpreferencejob.h" @@ -107,8 +109,8 @@ contact.insertCustom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("CRYPTOENCRYPTPREF"), QLatin1String(Kleo::encryptionPreferenceToString(pref.encryptionPreference))); contact.insertCustom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("CRYPTOSIGNPREF"), QLatin1String(Kleo::signingPreferenceToString(pref.signingPreference))); contact.insertCustom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("CRYPTOPROTOPREF"), QLatin1String(cryptoMessageFormatToString(pref.cryptoMessageFormat))); - contact.insertCustom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("OPENPGPFP"), pref.pgpKeyFingerprints.join(QStringLiteral(","))); - contact.insertCustom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("SMIMEFP"), pref.smimeCertFingerprints.join(QStringLiteral(","))); + contact.insertCustom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("OPENPGPFP"), pref.pgpKeyFingerprints.join(QLatin1Char(','))); + contact.insertCustom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("SMIMEFP"), pref.smimeCertFingerprints.join(QLatin1Char(','))); } void SaveContactPreferenceJob::slotModifyCreateItem(KJob *job) diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/job/savecontactpreferencejob.h kf5-messagelib-16.12.3/messagecomposer/src/job/savecontactpreferencejob.h --- kf5-messagelib-16.04.3/messagecomposer/src/job/savecontactpreferencejob.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/job/savecontactpreferencejob.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Montel Laurent - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef SAVECONTACTPREFERENCEJOB_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/job/signencryptjob.cpp kf5-messagelib-16.12.3/messagecomposer/src/job/signencryptjob.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/job/signencryptjob.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/job/signencryptjob.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -21,12 +21,12 @@ #include "job/signencryptjob.h" #include "contentjobbase_p.h" -#include "Libkleo/CryptoBackendFactory" -#include "Libkleo/CryptoBackend" -#include "Libkleo/Enum" -#include "Libkleo/SignEncryptJob" #include "utils/util.h" +#include +#include +#include + #include "messagecomposer_debug.h" #include #include @@ -157,19 +157,19 @@ d->content = d->subjobContents.first(); } - const Kleo::CryptoBackend::Protocol *proto = Q_NULLPTR; + const QGpgME::Protocol *proto = Q_NULLPTR; if (d->format & Kleo::AnyOpenPGP) { - proto = Kleo::CryptoBackendFactory::instance()->openpgp(); + proto = QGpgME::openpgp(); } else if (d->format & Kleo::AnySMIME) { - proto = Kleo::CryptoBackendFactory::instance()->smime(); + proto = QGpgME::smime(); } else { return; } - + Q_ASSERT(proto); //d->resultContent = new KMime::Content; qCDebug(MESSAGECOMPOSER_LOG) << "creating signencrypt from:" << proto->name() << proto->displayName(); - std::unique_ptr job(proto->signEncryptJob(!d->binaryHint(d->format), d->format == Kleo::InlineOpenPGPFormat)); + std::unique_ptr job(proto->signEncryptJob(!d->binaryHint(d->format), d->format == Kleo::InlineOpenPGPFormat)); QByteArray encBody; d->content->assemble(); diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/job/signencryptjob.h kf5-messagelib-16.12.3/messagecomposer/src/job/signencryptjob.h --- kf5-messagelib-16.04.3/messagecomposer/src/job/signencryptjob.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/job/signencryptjob.h 2017-03-06 12:30:37.000000000 +0000 @@ -25,7 +25,8 @@ #include "contentjobbase.h" #include "part/infopart.h" #include "messagecomposer_export.h" -#include "Libkleo/Enum" + +#include #include #include diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/job/signjob.cpp kf5-messagelib-16.12.3/messagecomposer/src/job/signjob.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/job/signjob.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/job/signjob.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -21,12 +21,12 @@ #include "job/signjob.h" #include "contentjobbase_p.h" -#include "Libkleo/CryptoBackendFactory" -#include "Libkleo/CryptoBackend" -#include "Libkleo/Enum" -#include "Libkleo/SignJob" #include "utils/util.h" +#include +#include +#include + #include "messagecomposer_debug.h" #include #include @@ -140,17 +140,17 @@ //d->resultContent = new KMime::Content; - const Kleo::CryptoBackend::Protocol *proto = Q_NULLPTR; + const QGpgME::Protocol *proto = Q_NULLPTR; if (d->format & Kleo::AnyOpenPGP) { - proto = Kleo::CryptoBackendFactory::instance()->openpgp(); + proto = QGpgME::openpgp(); } else if (d->format & Kleo::AnySMIME) { - proto = Kleo::CryptoBackendFactory::instance()->smime(); + proto = QGpgME::smime(); } Q_ASSERT(proto); qCDebug(MESSAGECOMPOSER_LOG) << "creating signJob from:" << proto->name() << proto->displayName(); - std::unique_ptr job(proto->signJob(!d->binaryHint(d->format), d->format == Kleo::InlineOpenPGPFormat)); + std::unique_ptr job(proto->signJob(!d->binaryHint(d->format), d->format == Kleo::InlineOpenPGPFormat)); // for now just do the main recipients QByteArray signature; @@ -168,8 +168,9 @@ // Note: If any line begins with the string "From ", it is strongly // suggested that either the Quoted-Printable or Base64 MIME encoding // be applied. - if (d->content->contentTransferEncoding()->encoding() == KMime::Headers::CEquPr || - d->content->contentTransferEncoding()->encoding() == KMime::Headers::CE7Bit) { + const auto encoding = d->content->contentTransferEncoding()->encoding(); + if ((encoding == KMime::Headers::CEquPr || encoding == KMime::Headers::CE7Bit) + && !d->content->contentType(false)) { QByteArray body = d->content->encodedBody(); bool changed = false; QList search; diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/job/signjob.h kf5-messagelib-16.12.3/messagecomposer/src/job/signjob.h --- kf5-messagelib-16.04.3/messagecomposer/src/job/signjob.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/job/signjob.h 2017-03-06 12:30:37.000000000 +0000 @@ -24,7 +24,7 @@ #include "contentjobbase.h" #include "part/infopart.h" #include "messagecomposer_export.h" -#include "Libkleo/Enum" +#include #include #include diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/job/skeletonmessagejob.cpp kf5-messagelib-16.12.3/messagecomposer/src/job/skeletonmessagejob.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/job/skeletonmessagejob.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/job/skeletonmessagejob.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -71,18 +71,23 @@ KMime::Headers::From *from = new KMime::Headers::From; KMime::Types::Mailbox address; address.fromUnicodeString(KEmailAddress::normalizeAddressesAndEncodeIdn(infoPart->from())); - from->addAddress(address); + from->fromUnicodeString(QString::fromLatin1(address.as7BitString("utf-8")), "utf-8"); message->setHeader(from); } // To: { KMime::Headers::To *to = new KMime::Headers::To; + QByteArray sTo; foreach (const QString &a, infoPart->to()) { KMime::Types::Mailbox address; address.fromUnicodeString(KEmailAddress::normalizeAddressesAndEncodeIdn(a)); - to->addAddress(address); + if (!sTo.isEmpty()) { + sTo.append(","); + } + sTo.append(address.as7BitString("utf-8")); } + to->fromUnicodeString(QString::fromLatin1(sTo), "utf-8"); message->setHeader(to); } @@ -91,29 +96,39 @@ KMime::Headers::ReplyTo *replyTo = new KMime::Headers::ReplyTo; KMime::Types::Mailbox address; address.fromUnicodeString(KEmailAddress::normalizeAddressesAndEncodeIdn(infoPart->replyTo())); - replyTo->addAddress(address); + replyTo->fromUnicodeString(QString::fromLatin1(address.as7BitString("utf-8")), "utf-8"); message->setHeader(replyTo); } // Cc: { KMime::Headers::Cc *cc = new KMime::Headers::Cc; + QByteArray sCc; foreach (const QString &a, infoPart->cc()) { KMime::Types::Mailbox address; address.fromUnicodeString(KEmailAddress::normalizeAddressesAndEncodeIdn(a)); - cc->addAddress(address); + if (!sCc.isEmpty()) { + sCc.append(","); + } + sCc.append(address.as7BitString("utf-8")); } + cc->fromUnicodeString(QString::fromLatin1(sCc), "utf-8"); message->setHeader(cc); } // Bcc: { KMime::Headers::Bcc *bcc = new KMime::Headers::Bcc; + QByteArray sBcc; foreach (const QString &a, infoPart->bcc()) { KMime::Types::Mailbox address; address.fromUnicodeString(KEmailAddress::normalizeAddressesAndEncodeIdn(a)); - bcc->addAddress(address); + if (!sBcc.isEmpty()) { + sBcc.append(","); + } + sBcc.append(address.as7BitString("utf-8")); } + bcc->fromUnicodeString(QString::fromLatin1(sBcc), "utf-8"); message->setHeader(bcc); } @@ -179,15 +194,6 @@ } } - // User-Agent - if (!infoPart->userAgent().isEmpty()) { - QStringList extraInfo; - extraInfo << QLatin1String(MESSAGELIB_GIT_REVISION_STRING) << QLatin1String(MESSAGELIB_GIT_LAST_CHANGE); - KMime::Headers::UserAgent *ua = new KMime::Headers::UserAgent; - ua->fromUnicodeString(KProtocolManager::userAgentForApplication(infoPart->userAgent(), QStringLiteral(MESSAGELIB_LIB_VERSION), extraInfo), "utf-8"); - message->setHeader(ua); - } - // Urgent header if (infoPart->urgent()) { KMime::Headers::Generic *urg1 = new KMime::Headers::Generic("X-PRIORITY"); diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/plugineditor/plugineditor.cpp kf5-messagelib-16.12.3/messagecomposer/src/plugineditor/plugineditor.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/plugineditor/plugineditor.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/plugineditor/plugineditor.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "plugineditor.h" @@ -31,7 +33,7 @@ }; PluginEditor::PluginEditor(QObject *parent) - : QObject(parent), + : PimCommon::AbstractGenericPlugin(parent), d(new PluginEditorPrivate) { diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/plugineditor/plugineditor.h kf5-messagelib-16.12.3/messagecomposer/src/plugineditor/plugineditor.h --- kf5-messagelib-16.04.3/messagecomposer/src/plugineditor/plugineditor.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/plugineditor/plugineditor.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,40 +1,39 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef PLUGINEDITOR_H #define PLUGINEDITOR_H #include #include "messagecomposer_export.h" - -class KActionCollection; +#include namespace MessageComposer { -class PluginEditorInterface; class PluginEditorPrivate; -class MESSAGECOMPOSER_EXPORT PluginEditor : public QObject +class MESSAGECOMPOSER_EXPORT PluginEditor : public PimCommon::AbstractGenericPlugin { Q_OBJECT public: explicit PluginEditor(QObject *parent = Q_NULLPTR); ~PluginEditor(); void setOrder(int order); - - virtual PluginEditorInterface *createInterface(KActionCollection *ac, QObject *parent = Q_NULLPTR) = 0; int order() const; + private: PluginEditorPrivate *const d; }; diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/plugineditor/plugineditorinterface.cpp kf5-messagelib-16.12.3/messagecomposer/src/plugineditor/plugineditorinterface.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/plugineditor/plugineditorinterface.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/plugineditor/plugineditorinterface.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "plugineditorinterface.h" @@ -47,17 +49,19 @@ public: PluginEditorInterfacePrivate() : mParentWidget(Q_NULLPTR), - mRichTextEditor(Q_NULLPTR) + mRichTextEditor(Q_NULLPTR), + plugin(Q_NULLPTR) { } ActionType mActionType; QWidget *mParentWidget; KPIMTextEdit::RichTextEditor *mRichTextEditor; + PluginEditor *plugin; }; PluginEditorInterface::PluginEditorInterface(QObject *parent) - : QObject(parent), + : PimCommon::AbstractGenericPluginInterface(parent), d(new MessageComposer::PluginEditorInterfacePrivate) { @@ -68,7 +72,7 @@ delete d; } -void PluginEditorInterface::setActionType(const ActionType &type) +void PluginEditorInterface::setActionType(ActionType type) { d->mActionType = type; } @@ -78,16 +82,6 @@ return d->mActionType; } -void PluginEditorInterface::setParentWidget(QWidget *parent) -{ - d->mParentWidget = parent; -} - -QWidget *PluginEditorInterface::parentWidget() const -{ - return d->mParentWidget; -} - KPIMTextEdit::RichTextEditor *PluginEditorInterface::richTextEditor() const { return d->mRichTextEditor; @@ -98,26 +92,6 @@ d->mRichTextEditor = richTextEditor; } -bool PluginEditorInterface::hasPopupMenuSupport() const -{ - return false; -} - -bool PluginEditorInterface::hasConfigureDialog() const -{ - return false; -} - -bool MessageComposer::PluginEditorInterface::hasToolBarSupport() const -{ - return false; -} - -void PluginEditorInterface::showConfigureDialog(QWidget *parentWidget) -{ - Q_UNUSED(parentWidget); -} - QString PluginEditorInterface::actionXmlExtension(ActionType::Type type) { switch (type) { diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/plugineditor/plugineditorinterface.h kf5-messagelib-16.12.3/messagecomposer/src/plugineditor/plugineditorinterface.h --- kf5-messagelib-16.04.3/messagecomposer/src/plugineditor/plugineditorinterface.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/plugineditor/plugineditorinterface.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,27 +1,29 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef PLUGINEDITORINTERFACE_H #define PLUGINEDITORINTERFACE_H #include +#include #include "messagecomposer_export.h" class QAction; -class KActionCollection; namespace KPIMTextEdit { @@ -54,30 +56,20 @@ }; class PluginEditorInterfacePrivate; -class MESSAGECOMPOSER_EXPORT PluginEditorInterface : public QObject +class PluginEditor; +class MESSAGECOMPOSER_EXPORT PluginEditorInterface : public PimCommon::AbstractGenericPluginInterface { Q_OBJECT public: explicit PluginEditorInterface(QObject *parent = Q_NULLPTR); ~PluginEditorInterface(); - void setActionType(const ActionType &type); + void setActionType(ActionType type); ActionType actionType() const; - virtual void createAction(KActionCollection *ac) = 0; - virtual void exec() = 0; - - void setParentWidget(QWidget *parent); - QWidget *parentWidget() const; - KPIMTextEdit::RichTextEditor *richTextEditor() const; void setRichTextEditor(KPIMTextEdit::RichTextEditor *richTextEditor); - virtual bool hasPopupMenuSupport() const; - virtual bool hasConfigureDialog() const; - virtual bool hasToolBarSupport() const; - virtual void showConfigureDialog(QWidget *parentWidget = Q_NULLPTR); - static QString actionXmlExtension(ActionType::Type type); Q_SIGNALS: void emitPluginActivated(MessageComposer::PluginEditorInterface *interface); diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/plugineditor/plugineditormanager.cpp kf5-messagelib-16.12.3/messagecomposer/src/plugineditor/plugineditormanager.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/plugineditor/plugineditormanager.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/plugineditor/plugineditormanager.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,26 +1,29 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "plugineditor.h" +#include "messagecomposer_debug.h" #include "plugineditormanager.h" +#include #include #include -#include #include #include #include @@ -46,15 +49,17 @@ public: PluginEditorInfo() : order(0), - plugin(Q_NULLPTR) + plugin(Q_NULLPTR), + isEnabled(true) { } - QString saveName() const; - - KPluginMetaData metaData; + QString metaDataFileNameBaseName; + QString metaDataFileName; + PimCommon::PluginUtilData pluginData; int order; PluginEditor *plugin; + bool isEnabled; }; Q_GLOBAL_STATIC(PluginEditorManagerInstancePrivate, sInstance) @@ -77,8 +82,15 @@ } void loadPlugin(PluginEditorInfo *item); QVector pluginsList() const; + QVector pluginDataList() const; bool initializePlugins(); + + QString configGroupName() const; + QString configPrefixSettingKey() const; + PluginEditor *pluginFromIdentifier(const QString &id); +private: QVector mPluginList; + QVector mPluginDataList; PluginEditorManager *q; }; @@ -88,26 +100,38 @@ return md.serviceTypes().contains(QStringLiteral("KMailEditor/Plugin")); }); + const QPair pair = PimCommon::PluginUtil::loadPluginSetting(configGroupName(), configPrefixSettingKey()); + QVectorIterator i(plugins); i.toBack(); QSet unique; while (i.hasPrevious()) { PluginEditorInfo info; - info.metaData = i.previous(); - const QVariant p = info.metaData.rawData().value(QStringLiteral("X-KDE-KMailEditor-Order")).toVariant(); + const KPluginMetaData data = i.previous(); + + //1) get plugin data => name/description etc. + info.pluginData = PimCommon::PluginUtil::createPluginMetaData(data); + //2) look at if plugin is activated + const bool isPluginActivated = PimCommon::PluginUtil::isPluginActivated(pair.first, pair.second, info.pluginData.mEnableByDefault, info.pluginData.mIdentifier); + info.isEnabled = isPluginActivated; + info.metaDataFileNameBaseName = QFileInfo(data.fileName()).baseName(); + info.metaDataFileName = data.fileName(); + const QVariant p = data.rawData().value(QStringLiteral("X-KDE-KMailEditor-Order")).toVariant(); int order = -1; if (p.isValid()) { order = p.toInt(); } info.order = order; - if (pluginVersion() == info.metaData.version()) { + if (pluginVersion() == data.version()) { // only load plugins once, even if found multiple times! - if (unique.contains(info.saveName())) { + if (unique.contains(info.metaDataFileNameBaseName)) { continue; } info.plugin = Q_NULLPTR; mPluginList.push_back(info); - unique.insert(info.saveName()); + unique.insert(info.metaDataFileNameBaseName); + } else { + qCWarning(MESSAGECOMPOSER_LOG) << "Plugin " << data.name() << " doesn't have correction plugin version. It will not be loaded."; } } QVector::iterator end(mPluginList.end()); @@ -119,8 +143,14 @@ void PluginEditorManagerPrivate::loadPlugin(PluginEditorInfo *item) { - item->plugin = KPluginLoader(item->metaData.fileName()).factory()->create(q, QVariantList() << item->saveName()); - item->plugin->setOrder(item->order); + KPluginLoader pluginLoader(item->metaDataFileName); + if (pluginLoader.factory()) { + item->plugin = pluginLoader.factory()->create(q, QVariantList() << item->metaDataFileNameBaseName); + item->plugin->setIsEnabled(item->isEnabled); + item->pluginData.mHasConfigureDialog = item->plugin->hasConfigureDialog(); + item->plugin->setOrder(item->order); + mPluginDataList.append(item->pluginData); + } } QVector PluginEditorManagerPrivate::pluginsList() const @@ -135,6 +165,32 @@ return lst; } +QVector PluginEditorManagerPrivate::pluginDataList() const +{ + return mPluginDataList; +} + +QString PluginEditorManagerPrivate::configGroupName() const +{ + return QStringLiteral("KMailPluginEditor"); +} + +QString PluginEditorManagerPrivate::configPrefixSettingKey() const +{ + return QStringLiteral("KMailEditorPlugin"); +} + +PluginEditor *PluginEditorManagerPrivate::pluginFromIdentifier(const QString &id) +{ + QVector::ConstIterator end(mPluginList.constEnd()); + for (QVector::ConstIterator it = mPluginList.constBegin(); it != end; ++it) { + if ((*it).pluginData.mIdentifier == id) { + return (*it).plugin; + } + } + return {}; +} + PluginEditorManager::PluginEditorManager(QObject *parent) : QObject(parent), d(new MessageComposer::PluginEditorManagerPrivate(this)) @@ -151,12 +207,28 @@ return sInstance->pluginManager; } -QString PluginEditorInfo::saveName() const +QVector PluginEditorManager::pluginsList() const { - return QFileInfo(metaData.fileName()).baseName(); + return d->pluginsList(); } -QVector PluginEditorManager::pluginsList() const +QVector PluginEditorManager::pluginsDataList() const { - return d->pluginsList(); + return d->pluginDataList(); } + +QString PluginEditorManager::configGroupName() const +{ + return d->configGroupName(); +} + +QString PluginEditorManager::configPrefixSettingKey() const +{ + return d->configPrefixSettingKey(); +} + +PluginEditor *PluginEditorManager::pluginFromIdentifier(const QString &id) +{ + return d->pluginFromIdentifier(id); +} + diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/plugineditor/plugineditormanager.h kf5-messagelib-16.12.3/messagecomposer/src/plugineditor/plugineditormanager.h --- kf5-messagelib-16.04.3/messagecomposer/src/plugineditor/plugineditormanager.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/plugineditor/plugineditormanager.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef PLUGINEDITORMANAGER_H @@ -20,6 +22,7 @@ #include #include "messagecomposer_export.h" +#include namespace MessageComposer { class PluginEditorManagerPrivate; @@ -28,6 +31,7 @@ { Q_OBJECT public: + explicit PluginEditorManager(QObject *parent = Q_NULLPTR); ~PluginEditorManager(); @@ -35,6 +39,11 @@ QVector pluginsList() const; + QVector pluginsDataList() const; + + QString configGroupName() const; + QString configPrefixSettingKey() const; + PluginEditor *pluginFromIdentifier(const QString &id); private: PluginEditorManagerPrivate *const d; }; diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendconfigurewidget.cpp kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendconfigurewidget.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendconfigurewidget.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendconfigurewidget.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,38 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "plugineditorcheckbeforesendconfigurewidget.h" + +using namespace MessageComposer; + +PluginEditorCheckBeforeSendConfigureWidget::PluginEditorCheckBeforeSendConfigureWidget(QWidget *parent) + : QWidget(parent) +{ + +} + +PluginEditorCheckBeforeSendConfigureWidget::~PluginEditorCheckBeforeSendConfigureWidget() +{ + +} + +QString PluginEditorCheckBeforeSendConfigureWidget::helpAnchor() const +{ + return QString(); +} diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendconfigurewidget.h kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendconfigurewidget.h --- kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendconfigurewidget.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendconfigurewidget.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,43 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef PLUGINEDITORCHECKBEFORESENDCONFIGUREWIDGET_H +#define PLUGINEDITORCHECKBEFORESENDCONFIGUREWIDGET_H + +#include "messagecomposer_export.h" +#include + +namespace MessageComposer +{ +class MESSAGECOMPOSER_EXPORT PluginEditorCheckBeforeSendConfigureWidget : public QWidget +{ + Q_OBJECT +public: + explicit PluginEditorCheckBeforeSendConfigureWidget(QWidget *parent = Q_NULLPTR); + ~PluginEditorCheckBeforeSendConfigureWidget(); + + virtual void loadSettings() = 0; + virtual void saveSettings() = 0; + virtual void resetSettings() = 0; + virtual QString helpAnchor() const; +Q_SIGNALS: + void configureChanged(); +}; +} +#endif // PLUGINEDITORCHECKBEFORESENDCONFIGUREWIDGET_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesend.cpp kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesend.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesend.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesend.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,75 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "plugineditorcheckbeforesend.h" + +using namespace MessageComposer; + +class MessageComposer::PluginEditorCheckBeforeSendPrivate +{ +public: + PluginEditorCheckBeforeSendPrivate() + : mIsEnabled(false) + { + + } + bool mIsEnabled; +}; + +PluginEditorCheckBeforeSend::PluginEditorCheckBeforeSend(QObject *parent) + : QObject(parent), + d(new MessageComposer::PluginEditorCheckBeforeSendPrivate) +{ + +} + +PluginEditorCheckBeforeSend::~PluginEditorCheckBeforeSend() +{ + delete d; +} + +bool PluginEditorCheckBeforeSend::hasConfigureDialog() const +{ + return false; +} + +void PluginEditorCheckBeforeSend::showConfigureDialog(QWidget *parent) +{ + Q_UNUSED(parent); +} + +void PluginEditorCheckBeforeSend::emitConfigChanged() +{ + Q_EMIT configChanged(); +} + +QString PluginEditorCheckBeforeSend::description() const +{ + return {}; +} + +void PluginEditorCheckBeforeSend::setIsEnabled(bool enabled) +{ + d->mIsEnabled = enabled; +} + +bool PluginEditorCheckBeforeSend::isEnabled() const +{ + return d->mIsEnabled; +} diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesend.h kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesend.h --- kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesend.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesend.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,58 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef PLUGINEDITORCHECKBEFORESEND_H +#define PLUGINEDITORCHECKBEFORESEND_H + +#include +#include "messagecomposer_export.h" + +namespace MessageComposer +{ +class PluginEditorCheckBeforeSendPrivate; +class PluginEditorCheckBeforeSendInterface; + +class MESSAGECOMPOSER_EXPORT PluginEditorCheckBeforeSend : public QObject +{ + Q_OBJECT +public: + explicit PluginEditorCheckBeforeSend(QObject *parent = Q_NULLPTR); + ~PluginEditorCheckBeforeSend(); + + virtual PluginEditorCheckBeforeSendInterface *createInterface(QObject *parent) = 0; + + virtual bool hasConfigureDialog() const; + + virtual void showConfigureDialog(QWidget *parent = Q_NULLPTR); + + void emitConfigChanged(); + + virtual QString description() const; + + void setIsEnabled(bool enabled); + bool isEnabled() const; + +Q_SIGNALS: + void configChanged(); + +private: + PluginEditorCheckBeforeSendPrivate *const d; +}; +} +#endif // PLUGINEDITORCHECKBEFORESEND_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendinterface.cpp kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendinterface.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendinterface.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendinterface.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,71 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "plugineditorcheckbeforesendinterface.h" + +using namespace MessageComposer; + +class MessageComposer::PluginEditorCheckBeforeSendInterfacePrivate +{ +public: + PluginEditorCheckBeforeSendInterfacePrivate() + : mParentWidget(Q_NULLPTR) + { + + } + MessageComposer::PluginEditorCheckBeforeSendParams parameters; + QWidget *mParentWidget; +}; + +PluginEditorCheckBeforeSendInterface::PluginEditorCheckBeforeSendInterface(QObject *parent) + : QObject(parent), + d(new MessageComposer::PluginEditorCheckBeforeSendInterfacePrivate) +{ + +} + +PluginEditorCheckBeforeSendInterface::~PluginEditorCheckBeforeSendInterface() +{ + delete d; +} + +void PluginEditorCheckBeforeSendInterface::setParentWidget(QWidget *parent) +{ + d->mParentWidget = parent; +} + +QWidget *PluginEditorCheckBeforeSendInterface::parentWidget() const +{ + return d->mParentWidget; +} + +void PluginEditorCheckBeforeSendInterface::setParameters(const MessageComposer::PluginEditorCheckBeforeSendParams ¶ms) +{ + d->parameters = params; +} + +MessageComposer::PluginEditorCheckBeforeSendParams PluginEditorCheckBeforeSendInterface::parameters() const +{ + return d->parameters; +} + +void PluginEditorCheckBeforeSendInterface::reloadConfig() +{ + //Reimplement it +} diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendinterface.h kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendinterface.h --- kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendinterface.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendinterface.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,54 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef PLUGINEDITORCHECKBEFORESENDINTERFACE_H +#define PLUGINEDITORCHECKBEFORESENDINTERFACE_H + +#include +#include "messagecomposer_export.h" +#include "plugineditorcheckbeforesendparams.h" + +namespace MessageComposer +{ +class PluginEditorCheckBeforeSendInterfacePrivate; +class PluginEditorCheckBeforeSendParams; +class MESSAGECOMPOSER_EXPORT PluginEditorCheckBeforeSendInterface : public QObject +{ + Q_OBJECT +public: + explicit PluginEditorCheckBeforeSendInterface(QObject *parent = Q_NULLPTR); + ~PluginEditorCheckBeforeSendInterface(); + + virtual bool exec(const MessageComposer::PluginEditorCheckBeforeSendParams ¶ms) = 0; + + void setParentWidget(QWidget *parent); + QWidget *parentWidget() const; + + void setParameters(const MessageComposer::PluginEditorCheckBeforeSendParams ¶ms); + MessageComposer::PluginEditorCheckBeforeSendParams parameters() const; + +public Q_SLOTS: + virtual void reloadConfig(); + +private: + PluginEditorCheckBeforeSendInterfacePrivate *const d; +}; +} + +#endif // PLUGINEDITORCHECKBEFORESENDINTERFACE_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendmanager.cpp kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendmanager.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendmanager.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendmanager.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,222 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "plugineditorcheckbeforesendmanager.h" +#include "plugineditorcheckbeforesend.h" +#include "messagecomposer_debug.h" +#include +#include +#include +#include +#include + +using namespace MessageComposer; + +class PluginEditorCheckBeforeSendManagerInstancePrivate +{ +public: + PluginEditorCheckBeforeSendManagerInstancePrivate() + : pluginManager(new PluginEditorCheckBeforeSendManager) + { + } + + ~PluginEditorCheckBeforeSendManagerInstancePrivate() + { + delete pluginManager; + } + PluginEditorCheckBeforeSendManager *pluginManager; +}; + +class PluginEditorCheckBeforeSendInfo +{ +public: + PluginEditorCheckBeforeSendInfo() + : plugin(Q_NULLPTR), + isEnabled(true) + { + + } + QString metaDataFileNameBaseName; + QString metaDataFileName; + PimCommon::PluginUtilData pluginData; + PluginEditorCheckBeforeSend *plugin; + bool isEnabled; +}; + +Q_GLOBAL_STATIC(PluginEditorCheckBeforeSendManagerInstancePrivate, sInstance) + +namespace +{ +QString pluginVersion() +{ + return QStringLiteral("1.0"); +} +} + +class MessageComposer::PluginEditorCheckBeforeSendManagerPrivate +{ +public: + PluginEditorCheckBeforeSendManagerPrivate(PluginEditorCheckBeforeSendManager *qq) + : q(qq) + { + initializePlugins(); + } + void loadPlugin(PluginEditorCheckBeforeSendInfo *item); + QVector pluginsList() const; + bool initializePlugins(); + QVector mPluginList; + QString configPrefixSettingKey() const; + QString configGroupName() const; + QVector pluginsDataList() const; + PluginEditorCheckBeforeSend *pluginFromIdentifier(const QString &id); +private: + QVector mPluginDataList; + PluginEditorCheckBeforeSendManager *q; +}; + +QString PluginEditorCheckBeforeSendManagerPrivate::configGroupName() const +{ + return QStringLiteral("KMailPluginCheckBefore"); +} + +QString PluginEditorCheckBeforeSendManagerPrivate::configPrefixSettingKey() const +{ + return QStringLiteral("PluginCheckBefore"); +} + +QVector PluginEditorCheckBeforeSendManagerPrivate::pluginsDataList() const +{ + return mPluginDataList; +} + +bool PluginEditorCheckBeforeSendManagerPrivate::initializePlugins() +{ + const QVector plugins = KPluginLoader::findPlugins(QStringLiteral("kmail"), [](const KPluginMetaData & md) { + return md.serviceTypes().contains(QStringLiteral("KMailEditor/PluginCheckBeforeSend")); + }); + + const QPair pair = PimCommon::PluginUtil::loadPluginSetting(configGroupName(), configPrefixSettingKey()); + + QVectorIterator i(plugins); + i.toBack(); + QSet unique; + while (i.hasPrevious()) { + PluginEditorCheckBeforeSendInfo info; + const KPluginMetaData data = i.previous(); + + //1) get plugin data => name/description etc. + info.pluginData = PimCommon::PluginUtil::createPluginMetaData(data); + //2) look at if plugin is activated + const bool isPluginActivated = PimCommon::PluginUtil::isPluginActivated(pair.first, pair.second, info.pluginData.mEnableByDefault, info.pluginData.mIdentifier); + info.isEnabled = isPluginActivated; + info.metaDataFileNameBaseName = QFileInfo(data.fileName()).baseName(); + info.metaDataFileName = data.fileName(); + if (pluginVersion() == data.version()) { + // only load plugins once, even if found multiple times! + if (unique.contains(info.metaDataFileNameBaseName)) { + continue; + } + info.plugin = Q_NULLPTR; + mPluginList.push_back(info); + unique.insert(info.metaDataFileNameBaseName); + } else { + qCWarning(MESSAGECOMPOSER_LOG) << "Plugin " << data.name() << " doesn't have correction plugin version. It will not be loaded."; + } + } + QVector::iterator end(mPluginList.end()); + for (QVector::iterator it = mPluginList.begin(); it != end; ++it) { + loadPlugin(&(*it)); + } + return true; +} + +void PluginEditorCheckBeforeSendManagerPrivate::loadPlugin(PluginEditorCheckBeforeSendInfo *item) +{ + KPluginLoader pluginLoader(item->metaDataFileName); + if (pluginLoader.factory()) { + item->plugin = pluginLoader.factory()->create(q, QVariantList() << item->metaDataFileNameBaseName); + item->plugin->setIsEnabled(item->isEnabled); + item->pluginData.mHasConfigureDialog = item->plugin->hasConfigureDialog(); + mPluginDataList.append(item->pluginData); + } +} + +QVector PluginEditorCheckBeforeSendManagerPrivate::pluginsList() const +{ + QVector lst; + QVector::ConstIterator end(mPluginList.constEnd()); + for (QVector::ConstIterator it = mPluginList.constBegin(); it != end; ++it) { + if ((*it).plugin) { + lst << (*it).plugin; + } + } + return lst; +} + +PluginEditorCheckBeforeSend *PluginEditorCheckBeforeSendManagerPrivate::pluginFromIdentifier(const QString &id) +{ + QVector::ConstIterator end(mPluginList.constEnd()); + for (QVector::ConstIterator it = mPluginList.constBegin(); it != end; ++it) { + if ((*it).pluginData.mIdentifier == id) { + return (*it).plugin; + } + } + return {}; +} + +PluginEditorCheckBeforeSendManager::PluginEditorCheckBeforeSendManager(QObject *parent) + : QObject(parent), + d(new MessageComposer::PluginEditorCheckBeforeSendManagerPrivate(this)) +{ +} + +PluginEditorCheckBeforeSendManager::~PluginEditorCheckBeforeSendManager() +{ + delete d; +} + +PluginEditorCheckBeforeSendManager *PluginEditorCheckBeforeSendManager::self() +{ + return sInstance->pluginManager; +} + +QVector PluginEditorCheckBeforeSendManager::pluginsList() const +{ + return d->pluginsList(); +} + +QString PluginEditorCheckBeforeSendManager::configGroupName() const +{ + return d->configGroupName(); +} + +QString PluginEditorCheckBeforeSendManager::configPrefixSettingKey() const +{ + return d->configPrefixSettingKey(); +} + +QVector PluginEditorCheckBeforeSendManager::pluginsDataList() const +{ + return d->pluginsDataList(); +} + +PluginEditorCheckBeforeSend *PluginEditorCheckBeforeSendManager::pluginFromIdentifier(const QString &id) +{ + return d->pluginFromIdentifier(id); +} diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendmanager.h kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendmanager.h --- kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendmanager.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendmanager.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,49 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef PLUGINEDITORCHECKBEFORESENDMANAGER_H +#define PLUGINEDITORCHECKBEFORESENDMANAGER_H + +#include +#include "messagecomposer_export.h" +#include +namespace MessageComposer +{ +class PluginEditorCheckBeforeSendManagerPrivate; +class PluginEditorCheckBeforeSend; +class MESSAGECOMPOSER_EXPORT PluginEditorCheckBeforeSendManager : public QObject +{ + Q_OBJECT +public: + explicit PluginEditorCheckBeforeSendManager(QObject *parent = Q_NULLPTR); + ~PluginEditorCheckBeforeSendManager(); + + static PluginEditorCheckBeforeSendManager *self(); + + QVector pluginsList() const; + + QString configGroupName() const; + QString configPrefixSettingKey() const; + QVector pluginsDataList() const; + PluginEditorCheckBeforeSend *pluginFromIdentifier(const QString &id); +private: + PluginEditorCheckBeforeSendManagerPrivate *const d; +}; +} +#endif // PLUGINEDITORCHECKBEFORESENDMANAGER_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendparams.cpp kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendparams.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendparams.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendparams.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,195 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "plugineditorcheckbeforesendparams.h" + +#include + +using namespace MessageComposer; + +class MessageComposer::PluginEditorCheckBeforeSendParamsPrivate +{ +public: + PluginEditorCheckBeforeSendParamsPrivate() + : identity(-1), + transportId(-1), + isHtml(false), + hasAttachment(false) + { + + } + QString ccAddresses; + QString bccAddresses; + QString toAddresses; + QString plainText; + QString subject; + QString defaultDomain; + uint identity; + int transportId; + bool isHtml; + bool hasAttachment; +}; + +PluginEditorCheckBeforeSendParams::PluginEditorCheckBeforeSendParams() + : d(new MessageComposer::PluginEditorCheckBeforeSendParamsPrivate) +{ + +} + +PluginEditorCheckBeforeSendParams::PluginEditorCheckBeforeSendParams(const PluginEditorCheckBeforeSendParams &other) + : d(new MessageComposer::PluginEditorCheckBeforeSendParamsPrivate) +{ + (*this) = other; +} + +PluginEditorCheckBeforeSendParams::~PluginEditorCheckBeforeSendParams() +{ + delete d; +} + +PluginEditorCheckBeforeSendParams &PluginEditorCheckBeforeSendParams::operator=(const PluginEditorCheckBeforeSendParams &other) +{ + if (this != &other) { + d->subject = other.subject(); + d->identity = other.identity(); + d->isHtml = other.isHtmlMail(); + d->plainText = other.plainText(); + d->defaultDomain = other.defaultDomain(); + d->hasAttachment = other.hasAttachment(); + d->transportId = other.transportId(); + d->bccAddresses = other.bccAddresses(); + d->ccAddresses = other.ccAddresses(); + d->toAddresses = other.toAddresses(); + } + return *this; +} + +bool PluginEditorCheckBeforeSendParams::operator ==(const PluginEditorCheckBeforeSendParams &other) const +{ + return (d->subject == other.subject()) && + (d->identity == other.identity()) && + (d->isHtml == other.isHtmlMail()) && + (d->plainText == other.plainText()) && + (d->defaultDomain == other.defaultDomain()) && + (d->hasAttachment == other.hasAttachment()) && + (d->transportId == other.transportId()) && + (d->bccAddresses == other.bccAddresses()) && + (d->ccAddresses == other.ccAddresses()) && + (d->toAddresses == other.toAddresses()); +} + +void PluginEditorCheckBeforeSendParams::setSubject(const QString &subject) +{ + d->subject = subject; +} + +QString PluginEditorCheckBeforeSendParams::subject() const +{ + return d->subject; +} + +void PluginEditorCheckBeforeSendParams::setIdentity(uint currentIdentity) +{ + d->identity = currentIdentity; +} + +uint PluginEditorCheckBeforeSendParams::identity() const +{ + return d->identity; +} + +bool PluginEditorCheckBeforeSendParams::isHtmlMail() const +{ + return d->isHtml; +} + +void PluginEditorCheckBeforeSendParams::setHtmlMail(bool html) +{ + d->isHtml = html; +} + +void PluginEditorCheckBeforeSendParams::setPlainText(const QString &text) +{ + d->plainText = text; +} + +QString PluginEditorCheckBeforeSendParams::plainText() const +{ + return d->plainText; +} + +void PluginEditorCheckBeforeSendParams::setBccAddresses(const QString &lst) +{ + d->bccAddresses = lst; +} + +QString PluginEditorCheckBeforeSendParams::bccAddresses() const +{ + return d->bccAddresses; +} + +void PluginEditorCheckBeforeSendParams::setToAddresses(const QString &lst) +{ + d->toAddresses = lst; +} + +QString PluginEditorCheckBeforeSendParams::toAddresses() const +{ + return d->toAddresses; +} + +void PluginEditorCheckBeforeSendParams::setCcAddresses(const QString &lst) +{ + d->ccAddresses = lst; +} + +QString PluginEditorCheckBeforeSendParams::ccAddresses() const +{ + return d->ccAddresses; +} + +void PluginEditorCheckBeforeSendParams::setDefaultDomain(const QString &domain) +{ + d->defaultDomain = domain; +} + +QString PluginEditorCheckBeforeSendParams::defaultDomain() const +{ + return d->defaultDomain; +} + +bool PluginEditorCheckBeforeSendParams::hasAttachment() const +{ + return d->hasAttachment; +} + +void PluginEditorCheckBeforeSendParams::setHasAttachment(bool b) +{ + d->hasAttachment = b; +} + +int PluginEditorCheckBeforeSendParams::transportId() const +{ + return d->transportId; +} + +void PluginEditorCheckBeforeSendParams::setTransportId(int id) +{ + d->transportId = id; +} diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendparams.h kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendparams.h --- kf5-messagelib-16.04.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendparams.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/plugineditorcheckbeforesend/plugineditorcheckbeforesendparams.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,72 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef PLUGINEDITORCHECKBEFORESENDPARAMS_H +#define PLUGINEDITORCHECKBEFORESENDPARAMS_H + +#include "messagecomposer_export.h" +#include + +namespace MessageComposer +{ +class PluginEditorCheckBeforeSendParamsPrivate; +class MESSAGECOMPOSER_EXPORT PluginEditorCheckBeforeSendParams +{ +public: + PluginEditorCheckBeforeSendParams(); + PluginEditorCheckBeforeSendParams(const PluginEditorCheckBeforeSendParams &other); + ~PluginEditorCheckBeforeSendParams(); + + void setSubject(const QString &subject); + QString subject() const; + + void setIdentity(uint currentIdentity); + uint identity() const; + + bool isHtmlMail() const; + void setHtmlMail(bool html); + + void setPlainText(const QString &text); + QString plainText() const; + + void setBccAddresses(const QString &lst); + QString bccAddresses() const; + + void setToAddresses(const QString &lst); + QString toAddresses() const; + + void setCcAddresses(const QString &lst); + QString ccAddresses() const; + + void setDefaultDomain(const QString &domain); + QString defaultDomain() const; + + bool hasAttachment() const; + void setHasAttachment(bool b); + + int transportId() const; + void setTransportId(int id); + + PluginEditorCheckBeforeSendParams &operator =(const PluginEditorCheckBeforeSendParams &other); + bool operator ==(const PluginEditorCheckBeforeSendParams &other) const; +private: + PluginEditorCheckBeforeSendParamsPrivate *const d; +}; +} +#endif // PLUGINEDITORCHECKBEFORESENDPARAMS_H diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/recipient/distributionlistdialog.cpp kf5-messagelib-16.12.3/messagecomposer/src/recipient/distributionlistdialog.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/recipient/distributionlistdialog.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/recipient/distributionlistdialog.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -106,23 +106,25 @@ DistributionListDialog::DistributionListDialog(QWidget *parent) : QDialog(parent) { - QFrame *topFrame = new QFrame(this); setWindowTitle(i18nc("@title:window", "Save Distribution List")); - QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel); - QVBoxLayout *mainLayout = new QVBoxLayout; - setLayout(mainLayout); + QVBoxLayout *mainLayout = new QVBoxLayout(this); + QWidget *topFrame = new QWidget(this); mainLayout->addWidget(topFrame); + + QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel); mUser1Button = new QPushButton; buttonBox->addButton(mUser1Button, QDialogButtonBox::ActionRole); + mUser1Button->setText(i18nc("@action:button", "Save List")); + mUser1Button->setEnabled(false); + mUser1Button->setDefault(true); connect(buttonBox, &QDialogButtonBox::accepted, this, &DistributionListDialog::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &DistributionListDialog::reject); mainLayout->addWidget(buttonBox); - mUser1Button->setDefault(true); + setModal(false); - mUser1Button->setText(i18nc("@action:button", "Save List")); - mUser1Button->setEnabled(false); QBoxLayout *topLayout = new QVBoxLayout(topFrame); + topLayout->setMargin(0); QBoxLayout *titleLayout = new QHBoxLayout(); topLayout->addItem(titleLayout); diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/recipient/recipient.cpp kf5-messagelib-16.12.3/messagecomposer/src/recipient/recipient.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/recipient/recipient.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/recipient/recipient.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -34,13 +34,15 @@ public: RecipientPrivate(const QString &email, Recipient::Type type) : mEmail(email), + mEncryptionAction(Kleo::Impossible), mType(type) { - } QString mEmail; QString mName; + Kleo::Action mEncryptionAction; + GpgME::Key mKey; MessageComposer::Recipient::Type mType; }; @@ -134,3 +136,23 @@ types.append(typeLabel(Bcc)); return types; } + +GpgME::Key Recipient::key() const +{ + return d->mKey; +} + +void Recipient::setKey(const GpgME::Key &key) +{ + d->mKey = key; +} + +Kleo::Action MessageComposer::Recipient::encryptionAction() const +{ + return d->mEncryptionAction; +} + +void MessageComposer::Recipient::setEncryptionAction(const Kleo::Action action) +{ + d->mEncryptionAction = action; +} diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/recipient/recipient.h kf5-messagelib-16.12.3/messagecomposer/src/recipient/recipient.h --- kf5-messagelib-16.04.3/messagecomposer/src/recipient/recipient.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/recipient/recipient.h 2017-03-06 12:30:37.000000000 +0000 @@ -29,6 +29,9 @@ #include +#include +#include + #include #include namespace MessageComposer @@ -65,6 +68,12 @@ static QString typeLabel(Type type); static QStringList allTypeLabels(); + void setEncryptionAction(const Kleo::Action action); + Kleo::Action encryptionAction() const; + + void setKey(const GpgME::Key &key); + GpgME::Key key() const; + private: RecipientPrivate *const d; }; diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/recipient/recipientline.cpp kf5-messagelib-16.12.3/messagecomposer/src/recipient/recipientline.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/recipient/recipientline.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/recipient/recipientline.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -86,6 +86,7 @@ mEdit->setToolTip(i18n("Set the list of email addresses to receive this message")); mEdit->setClearButtonEnabled(true); topLayout->addWidget(mEdit); + mEdit->installEventFilter(this); connect(mEdit, &RecipientLineEdit::returnPressed, this, &RecipientLineNG::slotReturnPressed); connect(mEdit, &RecipientLineEdit::deleteMe, this, &RecipientLineNG::slotPropagateDeletion); @@ -94,6 +95,7 @@ connect(mEdit, &RecipientLineEdit::focusUp, this, &RecipientLineNG::slotFocusUp); connect(mEdit, &RecipientLineEdit::focusDown, this, &RecipientLineNG::slotFocusDown); connect(mEdit, &RecipientLineEdit::rightPressed, this, &RecipientLineNG::rightPressed); + connect(mEdit, &RecipientLineEdit::iconClicked, this, &RecipientLineNG::iconClicked); connect(mEdit, SIGNAL(leftPressed()), mCombo, SLOT(setFocus())); connect(mEdit, &RecipientLineEdit::editingFinished, this, &RecipientLineNG::slotEditingFinished); @@ -165,6 +167,10 @@ if (!mData) { return; } + QString displayName, addrSpec, comment; + if (KEmailAddress::splitAddress(mEdit->text(), displayName, addrSpec, comment) == KEmailAddress::AddressOk) { + mData->setName(displayName); + } mData->setEmail(mEdit->text()); mData->setType(Recipient::idToType(mCombo->currentIndex())); mModified = false; @@ -230,15 +236,9 @@ mEdit->clear(); } -void RecipientLineNG::moveCompletionPopup() +bool RecipientLineNG::canDeleteLineEdit() const { - if (mEdit->completionBox(false)) { - if (mEdit->completionBox()->isVisible()) { - // ### trigger moving, is there a nicer way to do that? - mEdit->completionBox()->hide(); - mEdit->completionBox()->show(); - } - } + return mEdit->canDeleteLineEdit(); } void RecipientLineNG::setCompletionMode(KCompletion::CompletionMode mode) @@ -267,3 +267,43 @@ return qSharedPointerDynamicCast(data()); } +void RecipientLineNG::setIcon(const QIcon &icon, const QString &tooltip) +{ + mEdit->setIcon(icon, tooltip); +} + +void RecipientLineNG::setEnableIndexSearch(bool enableIndexSearch) +{ + mEdit->setEnableBalooSearch(enableIndexSearch); +} + +bool RecipientLineNG::enableIndexSearch() const +{ + return mEdit->enableBalooSearch(); +} + +void RecipientLineNG::setEnableAkonadiSearch(bool enableAkonadiSearch) +{ + mEdit->setEnableAkonadiSearch(enableAkonadiSearch); +} + +bool RecipientLineNG::enableAkonadiSearch() const +{ + return mEdit->enableAkonadiSearch(); +} + +QString RecipientLineNG::rawData() const +{ + return mEdit->text(); +} + +bool RecipientLineNG::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == mEdit) { + if (event->type() == QEvent::FocusIn || event->type() == QEvent::FocusOut) { + Q_EMIT activeChanged(); + } + } + + return false; +} diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/recipient/recipientline.h kf5-messagelib-16.12.3/messagecomposer/src/recipient/recipientline.h --- kf5-messagelib-16.04.3/messagecomposer/src/recipient/recipientline.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/recipient/recipientline.h 2017-03-06 12:30:37.000000000 +0000 @@ -46,7 +46,7 @@ void keyPressEvent(QKeyEvent *ev) Q_DECL_OVERRIDE; }; -class RecipientLineEdit : public MessageComposer::ComposerLineEdit +class MESSAGECOMPOSER_EXPORT RecipientLineEdit : public MessageComposer::ComposerLineEdit { Q_OBJECT public: @@ -61,7 +61,7 @@ void keyPressEvent(QKeyEvent *ev) Q_DECL_OVERRIDE; }; -class RecipientLineNG : public KPIM::MultiplyingLine +class MESSAGECOMPOSER_EXPORT RecipientLineNG : public KPIM::MultiplyingLine { Q_OBJECT public: @@ -73,6 +73,7 @@ bool isEmpty() const Q_DECL_OVERRIDE; void clear() Q_DECL_OVERRIDE; + bool canDeleteLineEdit() const Q_DECL_OVERRIDE; bool isModified() const Q_DECL_OVERRIDE; void clearModified() Q_DECL_OVERRIDE; @@ -83,7 +84,6 @@ void fixTabOrder(QWidget *previous) Q_DECL_OVERRIDE; QWidget *tabOut() const Q_DECL_OVERRIDE; - void moveCompletionPopup() Q_DECL_OVERRIDE; void setCompletionMode(KCompletion::CompletionMode mode) Q_DECL_OVERRIDE; int setColumnWidth(int w) Q_DECL_OVERRIDE; @@ -95,21 +95,36 @@ Recipient::Type recipientType() const; QSharedPointer recipient() const; + void setIcon(const QIcon &icon, const QString &tooltip = QString()); + /** * Sets the config file used for storing recent addresses. */ void setRecentAddressConfig(KConfig *config); + void setEnableIndexSearch(bool enableIndexSearch); + bool enableIndexSearch() const; + + void setEnableAkonadiSearch(bool enableAkonadiSearch); + bool enableAkonadiSearch() const; + + QString rawData() const; + Q_SIGNALS: void typeModified(RecipientLineNG *); void addRecipient(RecipientLineNG *, const QString &); void countChanged(); + void iconClicked(); + void activeChanged(); protected Q_SLOTS: void slotEditingFinished(); void slotTypeModified(); void analyzeLine(const QString &); +protected: + bool eventFilter(QObject *watched, QEvent *event) Q_DECL_OVERRIDE; + private: void dataFromFields(); void fieldsFromData(); diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/recipient/recipientseditor.cpp kf5-messagelib-16.12.3/messagecomposer/src/recipient/recipientseditor.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/recipient/recipientseditor.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/recipient/recipientseditor.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -36,9 +36,11 @@ #include #include #include +#include #include -#include +#include +#include using namespace MessageComposer; using namespace KPIM; @@ -70,16 +72,23 @@ public: RecipientsEditorPrivate() : mRecentAddressConfig(Q_NULLPTR), - mSideWidget(Q_NULLPTR) + mSideWidget(Q_NULLPTR), + mSkipTotal(false) { } KConfig *mRecentAddressConfig; RecipientsEditorSideWidget *mSideWidget; + bool mSkipTotal; }; RecipientsEditor::RecipientsEditor(QWidget *parent) - : MultiplyingLineEditor(new RecipientLineFactory(Q_NULLPTR), parent), + : RecipientsEditor(new RecipientLineFactory(Q_NULLPTR), parent) +{ +} + +RecipientsEditor::RecipientsEditor(RecipientLineFactory *lineFactory, QWidget *parent) + : MultiplyingLineEditor(lineFactory, parent), d(new MessageComposer::RecipientsEditorPrivate) { factory()->setParent(this); // HACK: can't use 'this' above since it's not yet constructed at that point @@ -87,12 +96,15 @@ layout()->addWidget(d->mSideWidget); + // Install global event filter and listen for keypress events for RecipientLineEdits. + // Unfortunately we can't install ourselves directly as event filter for the edits, + // because the RecipientLineEdit has its own event filter installed into QApplication + // and so it would eat the event before it would reach us. + qApp->installEventFilter(this); + connect(d->mSideWidget, &RecipientsEditorSideWidget::pickedRecipient, this, &RecipientsEditor::slotPickedRecipient); connect(d->mSideWidget, &RecipientsEditorSideWidget::saveDistributionList, this, &RecipientsEditor::saveDistributionList); - // connect( mView, SIGNAL(focusRight()), - // d->mSideWidget, SLOT(setFocus()) ); - connect(this, &RecipientsEditor::lineAdded, this, &RecipientsEditor::slotLineAdded); connect(this, &RecipientsEditor::lineDeleted, this, &RecipientsEditor::slotLineDeleted); @@ -241,7 +253,7 @@ if (count > 0) { if (count == 1) { - RecipientLineNG *last_rec = qobject_cast< RecipientLineNG * >(lines().last()); + RecipientLineNG *last_rec = qobject_cast< RecipientLineNG * >(lines().first()); if (last_rec && last_rec->recipientType() == Recipient::Bcc) { rec->setRecipientType(Recipient::To); } else { @@ -256,8 +268,6 @@ line->fixTabOrder(lines().last()->tabOut()); } connect(rec, &RecipientLineNG::countChanged, this, &RecipientsEditor::slotCalculateTotal); - // connect( rec->mEdit, SIGNAL(textChanged(QString)), - // SLOT(slotCalculateTotal()) ); } void RecipientsEditor::slotLineDeleted(int pos) @@ -286,11 +296,38 @@ slotCalculateTotal(); } +bool RecipientsEditor::eventFilter(QObject *object, QEvent *event) +{ + if (event->type() == QEvent::KeyPress && qobject_cast(object)) { + auto ke = static_cast(event); + // Treats comma or semicolon as email separator, will automatically move focus + // to a new line, basically preventing user from inputting more than one + // email address per line, which breaks our opportunistic crypto in composer + if (ke->key() == Qt::Key_Comma || ( + ke->key() == Qt::Key_Semicolon && MessageComposerSettings::self()->allowSemicolonAsAddressSeparator())) { + auto line = qobject_cast(object->parent()); + const auto split = KEmailAddress::splitAddressList(line->rawData() + QLatin1String(", ")); + if (split.size() > 1) { + addRecipient(QString(), line->recipientType()); + setFocusBottom(); + return true; + } + } + } + + return false; +} + void RecipientsEditor::slotCalculateTotal() { int count = 0; int empty = 0; + // Prevent endless recursion when splitting recipient + if (d->mSkipTotal) { + return; + } + MultiplyingLine *line; foreach (line, lines()) { RecipientLineNG *rec = qobject_cast< RecipientLineNG * >(line); @@ -298,7 +335,21 @@ if (rec->isEmpty()) { ++empty; } else { - count += rec->recipientsCount(); + const int recipientsCount = rec->recipientsCount(); + if (recipientsCount > 1) { + // Ensure we always have only one recipient per line + d->mSkipTotal = true; + Recipient::Ptr recipient = rec->recipient(); + const auto split = KEmailAddress::splitAddressList(recipient->email()); + for (int i = 1 /* sic! */; i < split.count(); ++i) { + addRecipient(split[i], rec->recipientType()); + } + recipient->setEmail(split[0]); + rec->setData(recipient); + setFocusBottom(); // focus next empty entry + d->mSkipTotal = false; + } + count += recipientsCount; } } } diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/recipient/recipientseditor.h kf5-messagelib-16.12.3/messagecomposer/src/recipient/recipientseditor.h --- kf5-messagelib-16.04.3/messagecomposer/src/recipient/recipientseditor.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/recipient/recipientseditor.h 2017-03-06 12:30:37.000000000 +0000 @@ -56,6 +56,7 @@ Q_OBJECT public: explicit RecipientsEditor(QWidget *parent = Q_NULLPTR); + explicit RecipientsEditor(RecipientLineFactory *lineFactory, QWidget *parent = Q_NULLPTR); ~RecipientsEditor(); Recipient::List recipients() const; @@ -96,6 +97,7 @@ void addRecipient(RecipientLineNG *, const QString &); protected: + bool eventFilter(QObject *object, QEvent *event) Q_DECL_OVERRIDE; RecipientLineNG *activeLine() const Q_DECL_OVERRIDE; private: diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/recipient/recipientseditorsidewidget.cpp kf5-messagelib-16.12.3/messagecomposer/src/recipient/recipientseditorsidewidget.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/recipient/recipientseditorsidewidget.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/recipient/recipientseditorsidewidget.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -125,7 +125,7 @@ Recipient::List recipients = mEditor->recipients(); Recipient::List::ConstIterator it; Recipient::List::ConstIterator end(recipients.constEnd()); - for (it = recipients.constBegin(); it != recipients.constEnd(); ++it) { + for (it = recipients.constBegin(); it != end; ++it) { QString emailLine = QLatin1String("  ") + (*it)->email().toHtmlEscaped() + QLatin1String("
"); switch ((*it)->type()) { case Recipient::To: diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/recipient/recipientspicker.cpp kf5-messagelib-16.12.3/messagecomposer/src/recipient/recipientspicker.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/recipient/recipientspicker.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/recipient/recipientspicker.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -49,8 +49,7 @@ setObjectName(QStringLiteral("RecipientsPicker")); setWindowTitle(i18n("Select Recipient")); - QVBoxLayout *mainLayout = new QVBoxLayout; - setLayout(mainLayout); + QVBoxLayout *mainLayout = new QVBoxLayout(this); mView = new Akonadi::EmailAddressSelectionWidget(this); mainLayout->addWidget(mView); diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/sender/akonadisender.cpp kf5-messagelib-16.12.3/messagecomposer/src/sender/akonadisender.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/sender/akonadisender.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/sender/akonadisender.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -134,10 +134,10 @@ MessageQueueJob *qjob = new MessageQueueJob(this); if (message->hasHeader("X-KMail-FccDisabled")) { qjob->sentBehaviourAttribute().setSentBehaviour(MailTransport::SentBehaviourAttribute::Delete); - } else if (message->headerByType("X-KMail-Fcc")) { + } else if (auto hrd = message->headerByType("X-KMail-Fcc")) { qjob->sentBehaviourAttribute().setSentBehaviour( SentBehaviourAttribute::MoveToCollection); - const int sentCollectionId = message->headerByType("X-KMail-Fcc")->asUnicodeString().toInt(); + const int sentCollectionId = hrd->asUnicodeString().toInt(); qjob->sentBehaviourAttribute().setMoveToCollection( Akonadi::Collection(sentCollectionId)); } else { @@ -151,7 +151,9 @@ if (d->mCustomTransportId != -1) { transportId = d->mCustomTransportId; } else { - transportId = message->headerByType("X-KMail-Transport") ? message->headerByType("X-KMail-Transport")->asUnicodeString().toInt() : -1; + if (auto hrd = message->headerByType("X-KMail-Transport")) { + transportId = hrd->asUnicodeString().toInt(); + } } const Transport *transport = TransportManager::self()->transportById(transportId); if (!transport) { diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/settings/messagecomposer.kcfg.cmake kf5-messagelib-16.12.3/messagecomposer/src/settings/messagecomposer.kcfg.cmake --- kf5-messagelib-16.04.3/messagecomposer/src/settings/messagecomposer.kcfg.cmake 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/settings/messagecomposer.kcfg.cmake 2017-03-06 12:30:37.000000000 +0000 @@ -147,9 +147,6 @@ true - - false - diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/utils/util.cpp kf5-messagelib-16.12.3/messagecomposer/src/utils/util.cpp --- kf5-messagelib-16.04.3/messagecomposer/src/utils/util.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/utils/util.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -61,7 +61,7 @@ return ret; } -KMime::Content *MessageComposer::Util::composeHeadersAndBody(KMime::Content *orig, QByteArray encodedBody, Kleo::CryptoMessageFormat format, bool sign, QByteArray hashAlgo) +KMime::Content *MessageComposer::Util::composeHeadersAndBody(KMime::Content *orig, QByteArray encodedBody, Kleo::CryptoMessageFormat format, bool sign, const QByteArray &hashAlgo) { KMime::Content *result = new KMime::Content; @@ -133,7 +133,7 @@ } // set the correct top-level ContentType on the message -void MessageComposer::Util::makeToplevelContentType(KMime::Content *content, Kleo::CryptoMessageFormat format, bool sign, QByteArray hashAlgo) +void MessageComposer::Util::makeToplevelContentType(KMime::Content *content, Kleo::CryptoMessageFormat format, bool sign, const QByteArray &hashAlgo) { switch (format) { default: @@ -310,3 +310,29 @@ msg->removeHeader("X-KMail-EncryptActionEnabled"); msg->removeHeader("X-KMail-CryptoMessageFormat"); } + +KMime::Content *MessageComposer::Util::findTypeInMessage(KMime::Content *data, const QByteArray &mimeType, const QByteArray &subType) +{ + if (!data->contentType()->isEmpty()) { + if (mimeType.isEmpty() || subType.isEmpty()) { + return data; + } + if ((mimeType == data->contentType()->mediaType()) + && (subType == data->contentType()->subType())) { + return data; + } + } + + foreach (auto child, data->contents()) { + if ((!child->contentType()->isEmpty()) + && (mimeType == child->contentType()->mimeType()) + && (subType == child->contentType()->subType())) { + return child; + } + auto ret = findTypeInMessage(child, mimeType, subType); + if (ret) { + return ret; + } + } + return Q_NULLPTR; +} diff -Nru kf5-messagelib-16.04.3/messagecomposer/src/utils/util.h kf5-messagelib-16.12.3/messagecomposer/src/utils/util.h --- kf5-messagelib-16.04.3/messagecomposer/src/utils/util.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/src/utils/util.h 2017-03-06 12:30:37.000000000 +0000 @@ -47,12 +47,12 @@ * Sets the proper structural information such as content-type, cte, and charset on the encoded body content. Depending on the crypto options, * original content may be needed to determine some of the values */ -KMime::Content *composeHeadersAndBody(KMime::Content *orig, QByteArray encodedBody, Kleo::CryptoMessageFormat format, bool sign, QByteArray hashAlgo = "pgp-sha1"); +KMime::Content *composeHeadersAndBody(KMime::Content *orig, QByteArray encodedBody, Kleo::CryptoMessageFormat format, bool sign, const QByteArray &hashAlgo = "pgp-sha1"); /** * Sets the content-type for the top level of the mime content, based on the crypto format and if a signature is used. */ -void makeToplevelContentType(KMime::Content *content, Kleo::CryptoMessageFormat format, bool sign, QByteArray hashAlgo = "pgp-sha1"); +void makeToplevelContentType(KMime::Content *content, Kleo::CryptoMessageFormat format, bool sign, const QByteArray &hashAlgo = "pgp-sha1"); /** * Sets the nested content type of the content, for crypto operations. @@ -79,6 +79,11 @@ void addSendReplyForwardAction(const KMime::Message::Ptr &message, MailTransport::MessageQueueJob *qjob); MESSAGECOMPOSER_EXPORT bool sendMailDispatcherIsOnline(QWidget *parent = Q_NULLPTR); MESSAGECOMPOSER_EXPORT void removeNotNecessaryHeaders(const KMime::Message::Ptr &msg); + +/** + * find mimetype in message + */ +MESSAGECOMPOSER_EXPORT KMime::Content *findTypeInMessage(KMime::Content *data, const QByteArray &mimeType, const QByteArray &subType); } } diff -Nru kf5-messagelib-16.04.3/messagecomposer/tests/CMakeLists.txt kf5-messagelib-16.12.3/messagecomposer/tests/CMakeLists.txt --- kf5-messagelib-16.04.3/messagecomposer/tests/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecomposer/tests/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -2,7 +2,7 @@ set(recipienteditortest_SRCS recipientseditortest.cpp) add_executable(recipienteditortest ${recipienteditortest_SRCS}) -target_link_libraries(recipienteditortest KF5::KIOCore KF5::AkonadiContact KF5::MessageComposer KF5::Libkdepim KF5::Completion KF5::Ldap) +target_link_libraries(recipienteditortest KF5::KIOCore KF5::AkonadiContact KF5::MessageComposer KF5::Libkdepim KF5::Completion KF5::Ldap KF5::I18n) ########### recipientseditor test ############### @@ -10,5 +10,5 @@ set(composerlineedittest_SRCS testcomposerlineedit.cpp) add_executable(composerlineedittest ${composerlineedittest_SRCS}) ecm_mark_as_test(composerlineedittest) -target_link_libraries(composerlineedittest KF5::MessageComposer KF5::Libkdepim KF5::Completion KF5::Ldap) +target_link_libraries(composerlineedittest KF5::MessageComposer KF5::Libkdepim KF5::Completion KF5::Ldap KF5::I18n) diff -Nru kf5-messagelib-16.04.3/messagecore/autotests/attachmentpropertiesdialogtest.cpp kf5-messagelib-16.12.3/messagecore/autotests/attachmentpropertiesdialogtest.cpp --- kf5-messagelib-16.04.3/messagecore/autotests/attachmentpropertiesdialogtest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/autotests/attachmentpropertiesdialogtest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -23,7 +23,7 @@ #include #include "messagecore_debug.h" -#include +#include #include #include @@ -36,6 +36,12 @@ QTEST_MAIN(AttachmentPropertiesDialogTest) +AttachmentPropertiesDialogTest::AttachmentPropertiesDialogTest(QObject *parent) + : QObject(parent) +{ + +} + void AttachmentPropertiesDialogTest::testAttachmentPartReadWrite() { // Sample data. @@ -72,10 +78,10 @@ QLineEdit *descriptionEdit = dialog->findChild(QStringLiteral("description")); Q_ASSERT(descriptionEdit); QCOMPARE(descriptionEdit->text(), description); - KComboBox *mimeTypeCombo = dialog->findChild(QStringLiteral("mimeType")); + QComboBox *mimeTypeCombo = dialog->findChild(QStringLiteral("mimeType")); Q_ASSERT(mimeTypeCombo); QCOMPARE(mimeTypeCombo->currentText().toLatin1(), mimeType); - KComboBox *encodingCombo = dialog->findChild(QStringLiteral("encoding")); + QComboBox *encodingCombo = dialog->findChild(QStringLiteral("encoding")); Q_ASSERT(encodingCombo); QCOMPARE(encodingCombo->currentIndex(), int(encoding)); QCheckBox *autoDisplayCheck = dialog->findChild(QStringLiteral("autoDisplay")); @@ -92,7 +98,14 @@ // Make some changes in the dialog. nameEdit->setText(newName); descriptionEdit->setText(newDescription); - mimeTypeCombo->setCurrentItem(QString::fromLatin1(newMimeType), true); + const QString comboBoxMimeType = QString::fromLatin1(newMimeType); + int index = mimeTypeCombo->findText(comboBoxMimeType); + if (index == -1) { + mimeTypeCombo->insertItem(0, comboBoxMimeType); + mimeTypeCombo->setCurrentIndex(0); + } else { + mimeTypeCombo->setCurrentIndex(index); + } encodingCombo->setCurrentIndex(int(newEncoding)); autoDisplayCheck->setChecked(!autoDisplay); encryptCheck->setChecked(!encrypt); diff -Nru kf5-messagelib-16.04.3/messagecore/autotests/attachmentpropertiesdialogtest.h kf5-messagelib-16.12.3/messagecore/autotests/attachmentpropertiesdialogtest.h --- kf5-messagelib-16.04.3/messagecore/autotests/attachmentpropertiesdialogtest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/autotests/attachmentpropertiesdialogtest.h 2017-03-06 12:30:37.000000000 +0000 @@ -25,6 +25,8 @@ class AttachmentPropertiesDialogTest : public QObject { Q_OBJECT +public: + explicit AttachmentPropertiesDialogTest(QObject *parent = Q_NULLPTR); private Q_SLOTS: void testAttachmentPartReadWrite(); void testAttachmentPartReadOnly(); diff -Nru kf5-messagelib-16.04.3/messagecore/autotests/mailinglisttest.cpp kf5-messagelib-16.12.3/messagecore/autotests/mailinglisttest.cpp --- kf5-messagelib-16.04.3/messagecore/autotests/mailinglisttest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/autotests/mailinglisttest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -115,4 +115,4 @@ QCOMPARE(ml, restoreMl); } -QTEST_MAIN(MailingListTest) +QTEST_APPLESS_MAIN(MailingListTest) diff -Nru kf5-messagelib-16.04.3/messagecore/autotests/stringutiltest.cpp kf5-messagelib-16.12.3/messagecore/autotests/stringutiltest.cpp --- kf5-messagelib-16.04.3/messagecore/autotests/stringutiltest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/autotests/stringutiltest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -369,8 +369,9 @@ void StringUtilTest::test_parseMailtoUrlExtra() { - auto url = QUrl::fromEncoded("mailto:someone@example.com?subject=This%20is%20the%20subject&cc=someone_else@example.com&body=This%20is%20the%20body"); - auto data = StringUtil::parseMailtoUrl(url); + const QByteArray ba("mailto:someone@example.com?subject=This%20is%20the%20subject&cc=someone_else@example.com&body=This%20is%20the%20body"); + QUrl url = QUrl(QUrl::fromPercentEncoding(ba)); + QMap data = StringUtil::parseMailtoUrl(url); QCOMPARE(data.size(), 4); QCOMPARE(data.value(QLatin1String("to")), QLatin1String("someone@example.com")); QCOMPARE(data.value(QLatin1String("subject")), QLatin1String("This is the subject")); @@ -378,6 +379,28 @@ QCOMPARE(data.value(QLatin1String("body")), QLatin1String("This is the body")); } +void StringUtilTest::test_parseMailToBug366981() +{ + const QString ba(QStringLiteral("mailto:test@test.com?subject=test&body=line1%0D%0Aline2")); + QUrl urlDecoded(QUrl::fromPercentEncoding(ba.toUtf8())); + QMap data = StringUtil::parseMailtoUrl(urlDecoded); + QCOMPARE(data.size(), 3); + QCOMPARE(data.value(QLatin1String("to")), QLatin1String("test@test.com")); + QCOMPARE(data.value(QLatin1String("subject")), QLatin1String("test")); + QCOMPARE(data.value(QLatin1String("body")), QLatin1String("line1\r\nline2")); +} + +void StringUtilTest::test_parseMailToBug832795() +{ + const QString ba(QStringLiteral("mailto:832795@bugs.debian.org?In-Reply-To=%3C146974194340.26747.4814466130640572267.reportbug%40portux.lan.naturalnet.de%3E&subject=Re%3A%20kmail%3A%20unescaping%20mailto%3A%20links%20broken&body=On%20Thu%2C%2028%20Jul%202016References=%3C146974194340.26747.4814466130640572267.reportbug%40portux.lan.naturalnet.de%3Ebody=On%20Thu%2C%2028%20Jul%202016%2023%3A39%3A03%20%2B0200%20Dominik%20George%20%3Cnik%40naturalnet.de%3E%20wrote%3A%0A%3E%20Package%3A%20kmail%0A%3E%20Version%3A%204%3A16.04.3-1%0A")); + QUrl urlDecoded(QUrl::fromPercentEncoding(ba.toUtf8())); + QMap data = StringUtil::parseMailtoUrl(urlDecoded); + QCOMPARE(data.size(), 4); + QCOMPARE(data.value(QLatin1String("to")), QLatin1String("832795@bugs.debian.org")); + QCOMPARE(data.value(QLatin1String("subject")), QLatin1String("Re: kmail: unescaping mailto: links broken")); + QCOMPARE(data.value(QLatin1String("body")), QLatin1String("On Thu, 28 Jul 2016References=<146974194340.26747.4814466130640572267.reportbug@portux.lan.naturalnet.de>body=On Thu, 28 Jul 2016 23:39:03 +0200 Dominik George wrote:\n> Package: kmail\n> Version: 4:16.04.3-1\n")); +} + void StringUtilTest::test_stripOffMessagePrefix_data() { QTest::addColumn("subject"); diff -Nru kf5-messagelib-16.04.3/messagecore/autotests/stringutiltest.h kf5-messagelib-16.12.3/messagecore/autotests/stringutiltest.h --- kf5-messagelib-16.04.3/messagecore/autotests/stringutiltest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/autotests/stringutiltest.h 2017-03-06 12:30:37.000000000 +0000 @@ -26,6 +26,7 @@ Q_OBJECT private Q_SLOTS: + void test_parseMailToBug832795(); void test_SmartQuote_data(); void test_SmartQuote(); void test_signatureStripping(); @@ -37,6 +38,7 @@ void test_stripOffMessagePrefix(); void test_formatQuotePrefix_data(); void test_formatQuotePrefix(); + void test_parseMailToBug366981(); }; #endif diff -Nru kf5-messagelib-16.04.3/messagecore/src/attachment/attachmentfromurlutils.cpp kf5-messagelib-16.12.3/messagecore/src/attachment/attachmentfromurlutils.cpp --- kf5-messagelib-16.04.3/messagecore/src/attachment/attachmentfromurlutils.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/src/attachment/attachmentfromurlutils.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + This library 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This library 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 General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "attachmentfromfolderjob.h" diff -Nru kf5-messagelib-16.04.3/messagecore/src/attachment/attachmentfromurlutils.h kf5-messagelib-16.12.3/messagecore/src/attachment/attachmentfromurlutils.h --- kf5-messagelib-16.04.3/messagecore/src/attachment/attachmentfromurlutils.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/src/attachment/attachmentfromurlutils.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + This library 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This library 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 General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef ATTACHMENTFROMURLUTILS_H diff -Nru kf5-messagelib-16.04.3/messagecore/src/attachment/attachmentpropertiesdialog.cpp kf5-messagelib-16.12.3/messagecore/src/attachment/attachmentpropertiesdialog.cpp --- kf5-messagelib-16.04.3/messagecore/src/attachment/attachmentpropertiesdialog.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/src/attachment/attachmentpropertiesdialog.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -28,13 +28,13 @@ #include #include "messagecore_debug.h" #include +#include #include #include #include #include -#include #include #include #include @@ -260,10 +260,22 @@ mimeTypeChanged(QString::fromLatin1(mPart->mimeType())); uiReadOnly->size->setText(KFormat().formatByteSize(mPart->size())); uiReadOnly->name->setText(mPart->name().isEmpty() ? mPart->fileName() : mPart->name()); - uiReadOnly->description->setText(mPart->description()); + if (mPart->description().isEmpty()) { + uiReadOnly->description->hide(); + uiReadOnly->descriptionLabel->hide(); + } else { + uiReadOnly->description->setText(mPart->description()); + } uiReadOnly->encoding->setText(KMime::nameForEncoding(mPart->encoding())); } else { - ui->mimeType->setCurrentItem(QString::fromLatin1(mPart->mimeType()), true); + const QString mimeType = QString::fromLatin1(mPart->mimeType()); + const int index = ui->mimeType->findText(mimeType); + if (index == -1) { + ui->mimeType->insertItem(0, mimeType); + ui->mimeType->setCurrentIndex(0); + } else { + ui->mimeType->setCurrentIndex(index); + } ui->size->setText(KFormat().formatByteSize(mPart->size())); ui->name->setText(mPart->name().isEmpty() ? mPart->fileName() : mPart->name()); ui->description->setText(mPart->description()); @@ -384,7 +396,7 @@ void AttachmentPropertiesDialog::slotHelp() { - KHelpClient::invokeHelp(QStringLiteral("attachments"), QStringLiteral("kmail")); + PimCommon::Util::invokeHelp(QStringLiteral("kmail/the-composer-window.html"), QStringLiteral("attachments")); } #include "moc_attachmentpropertiesdialog.cpp" diff -Nru kf5-messagelib-16.04.3/messagecore/src/attachment/attachmentupdatejob.cpp kf5-messagelib-16.12.3/messagecore/src/attachment/attachmentupdatejob.cpp --- kf5-messagelib-16.04.3/messagecore/src/attachment/attachmentupdatejob.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/src/attachment/attachmentupdatejob.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,19 +1,22 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + This library 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This library 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 General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + #include "attachmentfromfolderjob.h" #include "MessageCore/AttachmentFromUrlBaseJob" #include "attachmentfromurljob.h" diff -Nru kf5-messagelib-16.04.3/messagecore/src/attachment/attachmentupdatejob.h kf5-messagelib-16.12.3/messagecore/src/attachment/attachmentupdatejob.h --- kf5-messagelib-16.04.3/messagecore/src/attachment/attachmentupdatejob.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/src/attachment/attachmentupdatejob.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + This library 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This library 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 General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef ATTACHMENTUPDATEJOB_H diff -Nru kf5-messagelib-16.04.3/messagecore/src/attachment/ui/attachmentpropertiesdialog_readonly.ui kf5-messagelib-16.12.3/messagecore/src/attachment/ui/attachmentpropertiesdialog_readonly.ui --- kf5-messagelib-16.04.3/messagecore/src/attachment/ui/attachmentpropertiesdialog_readonly.ui 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/src/attachment/ui/attachmentpropertiesdialog_readonly.ui 2017-03-06 12:30:37.000000000 +0000 @@ -11,26 +11,38 @@ + + 0 + + + 0 + + + 0 + + + 0 + - TextLabel + TextLabel - TextLabel + TextLabel - TextLabel + TextLabel @@ -111,7 +123,7 @@ - + 0 @@ -151,7 +163,7 @@ - TextLabel + TextLabel diff -Nru kf5-messagelib-16.04.3/messagecore/src/attachment/ui/attachmentpropertiesdialog.ui kf5-messagelib-16.12.3/messagecore/src/attachment/ui/attachmentpropertiesdialog.ui --- kf5-messagelib-16.04.3/messagecore/src/attachment/ui/attachmentpropertiesdialog.ui 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/src/attachment/ui/attachmentpropertiesdialog.ui 2017-03-06 12:30:37.000000000 +0000 @@ -11,6 +11,18 @@ + + 0 + + + 0 + + + 0 + + + 0 + @@ -37,7 +49,7 @@ - + 0 @@ -167,7 +179,7 @@ - + @@ -207,13 +219,6 @@ - - - KComboBox - QComboBox -
kcombobox.h
-
-
diff -Nru kf5-messagelib-16.04.3/messagecore/src/CMakeLists.txt kf5-messagelib-16.12.3/messagecore/src/CMakeLists.txt --- kf5-messagelib-16.04.3/messagecore/src/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/src/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -47,7 +47,7 @@ attachment/ui/attachmentpropertiesdialog_readonly.ui ) -ecm_qt_declare_logging_category(messagecore_LIB_SRCS HEADER messagecore_debug.h IDENTIFIER MESSAGECORE_LOG CATEGORY_NAME log_messagecore) +ecm_qt_declare_logging_category(messagecore_LIB_SRCS HEADER messagecore_debug.h IDENTIFIER MESSAGECORE_LOG CATEGORY_NAME org.kde.pim.messagecore) add_library(KF5MessageCore ${messagecore_LIB_SRCS}) generate_export_header(KF5MessageCore BASE_NAME messagecore) @@ -64,11 +64,11 @@ KF5::AkonadiMime KF5::Archive KF5::ConfigWidgets - KF5::Completion KF5::IconThemes Qt5::Network KF5::I18n KF5::IdentityManagement + KF5::PimCommon ) target_include_directories(KF5MessageCore INTERFACE "$") diff -Nru kf5-messagelib-16.04.3/messagecore/src/helpers/messagehelpers.cpp kf5-messagelib-16.12.3/messagecore/src/helpers/messagehelpers.cpp --- kf5-messagelib-16.04.3/messagecore/src/helpers/messagehelpers.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/src/helpers/messagehelpers.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -42,12 +42,18 @@ { Q_ASSERT(status.isReplied() || status.isForwarded() || status.isDeleted()); - QString message = msg->headerByType("X-KMail-Link-Message") ? msg->headerByType("X-KMail-Link-Message")->asUnicodeString() : QString(); + QString message; + if (auto hrd = msg->headerByType("X-KMail-Link-Message")) { + message = hrd->asUnicodeString(); + } if (!message.isEmpty()) { message += QChar::fromLatin1(','); } - QString type = msg->headerByType("X-KMail-Link-Type") ? msg->headerByType("X-KMail-Link-Type")->asUnicodeString() : QString(); + QString type; + if (auto hrd = msg->headerByType("X-KMail-Link-Type")) { + type = hrd->asUnicodeString(); + } if (!type.isEmpty()) { type += QChar::fromLatin1(','); } @@ -70,12 +76,14 @@ bool MessageCore::Util::getLinkInformation(const KMime::Message::Ptr &msg, QList &id, QList &status) { - if (!msg->headerByType("X-KMail-Link-Message") || !msg->headerByType("X-KMail-Link-Type")) { + auto hrdLinkMsg = msg->headerByType("X-KMail-Link-Message"); + auto hrdLinkType = msg->headerByType("X-KMail-Link-Type"); + if (!hrdLinkMsg || !hrdLinkType) { return false; } - const QStringList messages = msg->headerByType("X-KMail-Link-Message")->asUnicodeString().split(QLatin1Char(','), QString::SkipEmptyParts); - const QStringList types = msg->headerByType("X-KMail-Link-Type")->asUnicodeString().split(QLatin1Char(','), QString::SkipEmptyParts); + const QStringList messages = hrdLinkMsg->asUnicodeString().split(QLatin1Char(','), QString::SkipEmptyParts); + const QStringList types = hrdLinkType->asUnicodeString().split(QLatin1Char(','), QString::SkipEmptyParts); if (messages.isEmpty() || types.isEmpty()) { return false; diff -Nru kf5-messagelib-16.04.3/messagecore/src/messagecoreutil.cpp kf5-messagelib-16.12.3/messagecore/src/messagecoreutil.cpp --- kf5-messagelib-16.04.3/messagecore/src/messagecoreutil.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/src/messagecoreutil.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -21,6 +21,7 @@ #include #include +#include using namespace MessageCore; @@ -29,82 +30,110 @@ return qApp->palette().color(QPalette::Background).value() >= 128; } -QColor Util::misspelledDefaultTextColor() +Q_GLOBAL_STATIC(ColorUtil, s_self) + +ColorUtil *ColorUtil::self() { - return KColorScheme(QPalette::Active, KColorScheme::View).foreground(KColorScheme::NegativeText).color().lighter(); + return s_self; } -QColor Util::quoteLevel1DefaultTextColor() +ColorUtil::ColorUtil() { - auto base = KColorScheme(QPalette::Active, KColorScheme::View).foreground(KColorScheme::PositiveText).color(); - if (isLightTheme()) { - return base.darker(120); - } else { - return base.lighter(200); - } + initializeColors(); } -QColor Util::quoteLevel2DefaultTextColor() +void ColorUtil::updateColors() { - auto base = KColorScheme(QPalette::Active, KColorScheme::View).foreground(KColorScheme::PositiveText).color(); - if (isLightTheme()) { - return base.darker(150); - } else { - return base.lighter(170); - } + initializeColors(); } -QColor Util::quoteLevel3DefaultTextColor() +void ColorUtil::initializeColors() { - auto base = KColorScheme(QPalette::Active, KColorScheme::View).foreground(KColorScheme::PositiveText).color(); + KColorScheme scheme(QPalette::Active, KColorScheme::View); + mMisspelledDefaultTextColor = scheme.foreground(KColorScheme::NegativeText).color().lighter(); + auto base = scheme.foreground(KColorScheme::PositiveText).color(); if (isLightTheme()) { - return base.dark(200); + mQuoteLevel1DefaultTextColor = base.darker(120); + mQuoteLevel2DefaultTextColor = base.darker(150); + mQuoteLevel3DefaultTextColor = base.dark(200); } else { - return base.lighter(140); + mQuoteLevel1DefaultTextColor = base.lighter(200); + mQuoteLevel2DefaultTextColor = base.lighter(170); + mQuoteLevel3DefaultTextColor = base.lighter(140); } + + mPgpEncryptedMessageColor = QColor(0x00, 0x80, 0xFF); + mPgpEncryptedTextColor = QColor(0xFF, 0xFF, 0xFF); // white + mPgpSignedTrustedMessageColor = scheme.background(KColorScheme::PositiveBackground).color(); + mPgpSignedTrustedTextColor = scheme.foreground(KColorScheme::PositiveText).color(); + mPgpSignedUntrustedMessageColor = scheme.background(KColorScheme::NeutralBackground).color(); + mPgpSignedUntrustedTextColor = scheme.foreground(KColorScheme::NeutralText).color(); + mPgpSignedBadMessageColor = scheme.background(KColorScheme::NegativeBackground).color(); + mPgpSignedBadTextColor = scheme.foreground(KColorScheme::NegativeText).color(); + mLinkColor = scheme.foreground(KColorScheme::LinkText).color(); +} + +QColor ColorUtil::misspelledDefaultTextColor() const +{ + return mMisspelledDefaultTextColor; } -// The reason the encrypted message colors are hard-coded while the others not -// is that we simply don't have a KColorScheme role for that that would have a -// good analogy. The blue color however works nicely with both dark and light -// themes and has a good contrast -QColor Util::pgpEncryptedMessageColor() +QColor ColorUtil::quoteLevel1DefaultTextColor() const { - return QColor(0x00, 0x80, 0xFF); // light blue + return mQuoteLevel1DefaultTextColor; } -QColor Util::pgpEncryptedTextColor() +QColor ColorUtil::quoteLevel2DefaultTextColor() const { - return QColor(0xFF, 0xFF, 0xFF); // white + return mQuoteLevel2DefaultTextColor; } -QColor Util::pgpSignedTrustedMessageColor() +QColor ColorUtil::quoteLevel3DefaultTextColor() const { - return KColorScheme(QPalette::Active, KColorScheme::View).background(KColorScheme::PositiveBackground).color(); + return mQuoteLevel3DefaultTextColor; } -QColor Util::pgpSignedTrustedTextColor() +QColor ColorUtil::pgpSignedTrustedMessageColor() const { - return KColorScheme(QPalette::Active, KColorScheme::View).foreground(KColorScheme::PositiveText).color(); + return mPgpSignedTrustedMessageColor; } -QColor Util::pgpSignedUntrustedMessageColor() +QColor ColorUtil::pgpSignedTrustedTextColor() const { - return KColorScheme(QPalette::Active, KColorScheme::View).background(KColorScheme::NeutralBackground).color(); + return mPgpSignedTrustedTextColor; } -QColor Util::pgpSignedUntrustedTextColor() +QColor ColorUtil::pgpSignedUntrustedMessageColor() const { - return KColorScheme(QPalette::Active, KColorScheme::View).foreground(KColorScheme::NeutralText).color(); + return mPgpSignedUntrustedMessageColor; } -QColor Util::pgpSignedBadMessageColor() +QColor ColorUtil::pgpSignedUntrustedTextColor() const { - return KColorScheme(QPalette::Active, KColorScheme::View).background(KColorScheme::NegativeBackground).color(); + return mPgpSignedUntrustedTextColor; } -QColor Util::pgpSignedBadTextColor() +QColor ColorUtil::pgpSignedBadMessageColor() const { - return KColorScheme(QPalette::Active, KColorScheme::View).foreground(KColorScheme::NegativeText).color(); + return mPgpSignedBadMessageColor; } +QColor ColorUtil::pgpSignedBadTextColor() const +{ + return mPgpSignedBadTextColor; +} + +QColor ColorUtil::pgpEncryptedMessageColor() const +{ + return mPgpEncryptedMessageColor; +} + +QColor ColorUtil::pgpEncryptedTextColor() const +{ + return mPgpEncryptedTextColor; +} + +QColor ColorUtil::linkColor() const +{ + return mLinkColor; +} diff -Nru kf5-messagelib-16.04.3/messagecore/src/messagecoreutil.h kf5-messagelib-16.12.3/messagecore/src/messagecoreutil.h --- kf5-messagelib-16.04.3/messagecore/src/messagecoreutil.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/src/messagecoreutil.h 2017-03-06 12:30:37.000000000 +0000 @@ -26,25 +26,46 @@ namespace MessageCore { - -namespace Util +class MESSAGECORE_EXPORT ColorUtil { +public: + static ColorUtil *self(); -MESSAGECORE_EXPORT QColor misspelledDefaultTextColor(); -MESSAGECORE_EXPORT QColor quoteLevel1DefaultTextColor(); -MESSAGECORE_EXPORT QColor quoteLevel2DefaultTextColor(); -MESSAGECORE_EXPORT QColor quoteLevel3DefaultTextColor(); - -MESSAGECORE_EXPORT QColor pgpSignedTrustedMessageColor(); -MESSAGECORE_EXPORT QColor pgpSignedTrustedTextColor(); -MESSAGECORE_EXPORT QColor pgpSignedUntrustedMessageColor(); -MESSAGECORE_EXPORT QColor pgpSignedUntrustedTextColor(); -MESSAGECORE_EXPORT QColor pgpSignedBadMessageColor(); -MESSAGECORE_EXPORT QColor pgpSignedBadTextColor(); -MESSAGECORE_EXPORT QColor pgpEncryptedMessageColor(); -MESSAGECORE_EXPORT QColor pgpEncryptedTextColor(); + ColorUtil(); -} + void updateColors(); + + QColor misspelledDefaultTextColor() const; + QColor quoteLevel1DefaultTextColor() const; + QColor quoteLevel2DefaultTextColor() const; + QColor quoteLevel3DefaultTextColor() const; + QColor pgpSignedTrustedMessageColor() const; + QColor pgpSignedTrustedTextColor() const; + QColor pgpSignedUntrustedMessageColor() const; + QColor pgpSignedUntrustedTextColor() const; + QColor pgpSignedBadMessageColor() const; + QColor pgpSignedBadTextColor() const; + QColor pgpEncryptedMessageColor() const; + QColor pgpEncryptedTextColor() const; + QColor linkColor() const; + +private: + void initializeColors(); + QColor mMisspelledDefaultTextColor; + QColor mQuoteLevel1DefaultTextColor; + QColor mQuoteLevel2DefaultTextColor; + QColor mQuoteLevel3DefaultTextColor; + + QColor mPgpSignedTrustedMessageColor; + QColor mPgpSignedTrustedTextColor; + QColor mPgpSignedUntrustedMessageColor; + QColor mPgpSignedUntrustedTextColor; + QColor mPgpSignedBadMessageColor; + QColor mPgpSignedBadTextColor; + QColor mPgpEncryptedMessageColor; + QColor mPgpEncryptedTextColor; + QColor mLinkColor; +}; } #endif // MESSAGECORE_UTIL_H diff -Nru kf5-messagelib-16.04.3/messagecore/src/misc/mailinglist.cpp kf5-messagelib-16.12.3/messagecore/src/misc/mailinglist.cpp --- kf5-messagelib-16.04.3/messagecore/src/misc/mailinglist.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/src/misc/mailinglist.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -47,7 +47,10 @@ QByteArray &headerName, QString &headerValue) { - QString header = message->headerByType("X-BeenThere") ? message->headerByType("X-BeenThere")->asUnicodeString() : QString(); + QString header; + if (auto hrd = message->headerByType("X-BeenThere")) { + header = hrd->asUnicodeString(); + } if (header.isNull() || header.indexOf(QLatin1Char('@')) == -1) { return QString(); } @@ -64,7 +67,10 @@ QByteArray &headerName, QString &headerValue) { - QString header = message->headerByType("Delivered-To") ? message->headerByType("Delivered-To")->asUnicodeString() : QString(); + QString header; + if (auto hrd = message->headerByType("Delivered-To")) { + header = hrd->asUnicodeString(); + } if (header.isNull() || header.left(13) != QLatin1String("mailing list") || header.indexOf(QLatin1Char('@')) == -1) { @@ -82,7 +88,10 @@ QByteArray &headerName, QString &headerValue) { - QString header = message->headerByType("X-Mailing-List") ? message->headerByType("X-Mailing-List")->asUnicodeString() : QString(); + QString header; + if (auto hrd = message->headerByType("X-Mailing-List")) { + header = hrd->asUnicodeString(); + } if (header.isEmpty()) { return QString(); } @@ -107,7 +116,10 @@ QByteArray &headerName, QString &headerValue) { - QString header = message->headerByType("List-Id") ? message->headerByType("List-Id")->asUnicodeString() : QString(); + QString header; + if (auto hrd = message->headerByType("List-Id")) { + header = hrd->asUnicodeString(); + } if (header.isEmpty()) { return QString(); } @@ -134,7 +146,10 @@ QByteArray &headerName, QString &headerValue) { - QString header = message->headerByType("List-Post") ? message->headerByType("List-Post")->asUnicodeString() : QString(); + QString header; + if (auto hrd = message->headerByType("List-Post")) { + header = hrd->asUnicodeString(); + } if (header.isEmpty()) { return QString(); } @@ -157,7 +172,10 @@ QByteArray &headerName, QString &headerValue) { - QString header = message->headerByType("Mailing-List") ? message->headerByType("Mailing-List")->asUnicodeString() : QString(); + QString header; + if (auto hrd = message->headerByType("Mailing-List")) { + header = hrd->asUnicodeString(); + } if (header.isEmpty()) { return QString(); } @@ -179,7 +197,10 @@ QByteArray &headerName, QString &headerValue) { - QString header = message->headerByType("X-Loop") ? message->headerByType("X-Loop")->asUnicodeString() : QString(); + QString header; + if (auto hrd = message->headerByType("X-Loop")) { + header = hrd->asUnicodeString(); + } if (header.isEmpty()) { return QString(); } @@ -201,7 +222,10 @@ QByteArray &headerName, QString &headerValue) { - QString header = message->headerByType("X-ML-Name") ? message->headerByType("X-ML-Name")->asUnicodeString() : QString(); + QString header; + if (auto hrd = message->headerByType("X-ML-Name")) { + header = hrd->asUnicodeString(); + } if (header.isEmpty()) { return QString(); } @@ -289,36 +313,36 @@ { MailingList mailingList; - if (message->headerByType("List-Post")) { - mailingList.setPostUrls(QUrl::fromStringList(headerToAddress(message->headerByType("List-Post")->asUnicodeString()))); + if (auto hrd = message->headerByType("List-Post")) { + mailingList.setPostUrls(QUrl::fromStringList(headerToAddress(hrd->asUnicodeString()))); } - if (message->headerByType("List-Help")) { - mailingList.setHelpUrls(QUrl::fromStringList(headerToAddress(message->headerByType("List-Help")->asUnicodeString()))); + if (auto hrd = message->headerByType("List-Help")) { + mailingList.setHelpUrls(QUrl::fromStringList(headerToAddress(hrd->asUnicodeString()))); } - if (message->headerByType("List-Subscribe")) { - mailingList.setSubscribeUrls(QUrl::fromStringList(headerToAddress(message->headerByType("List-Subscribe")->asUnicodeString()))); + if (auto hrd = message->headerByType("List-Subscribe")) { + mailingList.setSubscribeUrls(QUrl::fromStringList(headerToAddress(hrd->asUnicodeString()))); } - if (message->headerByType("List-Unsubscribe")) { - mailingList.setUnsubscribeUrls(QUrl::fromStringList(headerToAddress(message->headerByType("List-Unsubscribe")->asUnicodeString()))); + if (auto hrd = message->headerByType("List-Unsubscribe")) { + mailingList.setUnsubscribeUrls(QUrl::fromStringList(headerToAddress(hrd->asUnicodeString()))); } - if (message->headerByType("List-Archive")) { - mailingList.setArchiveUrls(QUrl::fromStringList(headerToAddress(message->headerByType("List-Archive")->asUnicodeString()))); + if (auto hrd = message->headerByType("List-Archive")) { + mailingList.setArchiveUrls(QUrl::fromStringList(headerToAddress(hrd->asUnicodeString()))); } - if (message->headerByType("List-Owner")) { - mailingList.setOwnerUrls(QUrl::fromStringList(headerToAddress(message->headerByType("List-Owner")->asUnicodeString()))); + if (auto hrd = message->headerByType("List-Owner")) { + mailingList.setOwnerUrls(QUrl::fromStringList(headerToAddress(hrd->asUnicodeString()))); } - if (message->headerByType("Archived-At")) { - mailingList.setArchivedAtUrls(QUrl::fromStringList(headerToAddress(message->headerByType("Archived-At")->asUnicodeString()))); + if (auto hrd = message->headerByType("Archived-At")) { + mailingList.setArchivedAtUrls(QUrl::fromStringList(headerToAddress(hrd->asUnicodeString()))); } - if (message->headerByType("List-Id")) { - mailingList.setId(message->headerByType("List-Id")->asUnicodeString()); + if (auto hrd = message->headerByType("List-Id")) { + mailingList.setId(hrd->asUnicodeString()); } return mailingList; diff -Nru kf5-messagelib-16.04.3/messagecore/src/settings/messagecore.kcfg kf5-messagelib-16.12.3/messagecore/src/settings/messagecore.kcfg --- kf5-messagelib-16.04.3/messagecore/src/settings/messagecore.kcfg 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/src/settings/messagecore.kcfg 2017-03-06 12:30:37.000000000 +0000 @@ -32,19 +32,15 @@ - MessageCore::Util::quoteLevel3DefaultTextColor() + MessageCore::ColorUtil::self()->quoteLevel3DefaultTextColor() - MessageCore::Util::quoteLevel2DefaultTextColor() + MessageCore::ColorUtil::self()->quoteLevel2DefaultTextColor() - MessageCore::Util::quoteLevel1DefaultTextColor() - - - - MessageCore::Util::misspelledDefaultTextColor() + MessageCore::ColorUtil::self()->quoteLevel1DefaultTextColor()
diff -Nru kf5-messagelib-16.04.3/messagecore/src/utils/stringutil.cpp kf5-messagelib-16.12.3/messagecore/src/utils/stringutil.cpp --- kf5-messagelib-16.04.3/messagecore/src/utils/stringutil.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/src/utils/stringutil.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,4 +1,6 @@ -/* Copyright 2009 Thomas McGuire +/* + Copyright 2016 Laurent Montel + Copyright 2009 Thomas McGuire This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -182,7 +184,7 @@ return values; } QUrlQuery query(url); - Q_FOREACH (const auto &queryItem, query.queryItems()) { + Q_FOREACH (const auto &queryItem, query.queryItems(QUrl::FullyDecoded)) { values.insert(queryItem.first, queryItem.second); } @@ -293,153 +295,6 @@ return msgIdStr; } -QString stripEmailAddr(const QString &aStr) -{ - //qCDebug(MESSAGECORE_LOG) << "(" << aStr << ")"; - - if (aStr.isEmpty()) { - return QString(); - } - - QString result; - - // The following is a primitive parser for a mailbox-list (cf. RFC 2822). - // The purpose is to extract a displayable string from the mailboxes. - // Comments in the addr-spec are not handled. No error checking is done. - - QString name; - QString comment; - QString angleAddress; - enum { TopLevel, InComment, InAngleAddress } context = TopLevel; - bool inQuotedString = false; - int commentLevel = 0; - - QChar ch; - int strLength(aStr.length()); - for (int index = 0; index < strLength; ++index) { - ch = aStr[index]; - switch (context) { - case TopLevel : { - switch (ch.toLatin1()) { - case '"' : inQuotedString = !inQuotedString; - break; - case '(' : if (!inQuotedString) { - context = InComment; - commentLevel = 1; - } else { - name += ch; - } - break; - case '<' : if (!inQuotedString) { - context = InAngleAddress; - } else { - name += ch; - } - break; - case '\\' : // quoted character - ++index; // skip the '\' - if (index < aStr.length()) { - name += aStr[index]; - } - break; - case ',' : if (!inQuotedString) { - // next email address - if (!result.isEmpty()) { - result += QLatin1String(", "); - } - name = name.trimmed(); - comment = comment.trimmed(); - angleAddress = angleAddress.trimmed(); - if (angleAddress.isEmpty() && !comment.isEmpty()) { - // handle Outlook-style addresses like - // john.doe@invalid (John Doe) - result += comment; - } else if (!name.isEmpty()) { - result += name; - } else if (!comment.isEmpty()) { - result += comment; - } else if (!angleAddress.isEmpty()) { - result += angleAddress; - } - name.clear(); - comment.clear(); - angleAddress.clear(); - } else { - name += ch; - } - break; - default : name += ch; - } - break; - } - case InComment : { - switch (ch.toLatin1()) { - case '(' : ++commentLevel; - comment += ch; - break; - case ')' : --commentLevel; - if (commentLevel == 0) { - context = TopLevel; - comment += QLatin1Char(' '); // separate the text of several comments - } else { - comment += ch; - } - break; - case '\\' : // quoted character - ++index; // skip the '\' - if (index < aStr.length()) { - comment += aStr[index]; - } - break; - default : comment += ch; - } - break; - } - case InAngleAddress : { - switch (ch.toLatin1()) { - case '"' : inQuotedString = !inQuotedString; - angleAddress += ch; - break; - case '>' : if (!inQuotedString) { - context = TopLevel; - } else { - angleAddress += ch; - } - break; - case '\\' : // quoted character - ++index; // skip the '\' - if (index < aStr.length()) { - angleAddress += aStr[index]; - } - break; - default : angleAddress += ch; - } - break; - } - } // switch ( context ) - } - if (!result.isEmpty()) { - result += QLatin1String(", "); - } - name = name.trimmed(); - comment = comment.trimmed(); - angleAddress = angleAddress.trimmed(); - if (angleAddress.isEmpty() && !comment.isEmpty()) { - // handle Outlook-style addresses like - // john.doe@invalid (John Doe) - result += comment; - } else if (!name.isEmpty()) { - result += name; - } else if (!comment.isEmpty()) { - result += comment; - } else if (!angleAddress.isEmpty()) { - result += angleAddress; - } - - //qCDebug(MESSAGECORE_LOG) << "Returns \"" << result << "\""; - return result; -} - QString quoteHtmlChars(const QString &str, bool removeLineBreaks) { QString result; @@ -533,14 +388,16 @@ QString result; int numberAddresses = 0; bool expandableInserted = false; - KIdentityManagement::IdentityManager im(true); + KIdentityManagement::IdentityManager *im = KIdentityManagement::IdentityManager::self(); foreach (const KMime::Types::Mailbox &mailbox, mailboxList) { if (!mailbox.prettyAddress().isEmpty()) { numberAddresses++; if (expandable == ExpandableAddresses && !expandableInserted && numberAddresses > collapseNumber) { result = QLatin1String("") + result; - result += QLatin1String("..."); + const QString visibility = QStringLiteral(" style=\"display:none;\""); + + result += QLatin1String("..."); expandableInserted = true; } @@ -549,7 +406,7 @@ + QString::fromLatin1(QUrl::toPercentEncoding(KEmailAddress::encodeMailtoUrl(mailbox.prettyAddress(KMime::Types::Mailbox::QuoteWhenNecessary)).path())) + QLatin1String("\" ") + cssStyle + QLatin1Char('>'); } - const bool foundMe = (im.identities().count() == 1) && (im.identityForAddress(mailbox.prettyAddress()) != KIdentityManagement::Identity::null()); + const bool foundMe = (im->identities().count() == 1) && (im->identityForAddress(mailbox.prettyAddress()) != KIdentityManagement::Identity::null()); const QString i18nMe = i18nc("signal that this email is defined in my identity", "Me"); if (display == DisplayNameOnly) { if (!mailbox.name().isEmpty()) { // Fallback to the email address when the name is not set. @@ -677,14 +534,15 @@ for (int i = textParts.count() - 1; i >= 0; i--) { // Check if we have found the From line - if (textParts[i].endsWith(QLatin1Char(':'))) { - fromLine = oldIndent + textParts[i] + QLatin1Char('\n'); + const QString textPartElement(textParts[i]); + if (textPartElement.endsWith(QLatin1Char(':'))) { + fromLine = oldIndent + textPartElement + QLatin1Char('\n'); textParts.removeAt(i); break; } // Abort on first non-empty line - if (!textParts[i].trimmed().isEmpty()) { + if (!textPartElement.trimmed().isEmpty()) { break; } } diff -Nru kf5-messagelib-16.04.3/messagecore/src/utils/stringutil.h kf5-messagelib-16.12.3/messagecore/src/utils/stringutil.h --- kf5-messagelib-16.04.3/messagecore/src/utils/stringutil.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagecore/src/utils/stringutil.h 2017-03-06 12:30:37.000000000 +0000 @@ -78,12 +78,6 @@ MESSAGECORE_EXPORT QString generateMessageId(const QString &address, const QString &suffix); /** - * Returns a displayable string from the list of email @p addresses. - * Inefficient, use KMime::Headers::*::displayString() directly instead. - */ -MESSAGECORE_DEPRECATED_EXPORT QString stripEmailAddr(const QString &emailAddr); - -/** * Quotes the following characters which have a special meaning in HTML: * '<' '>' '&' '"'. Additionally '\\n' is converted to "
" if * @p removeLineBreaks is false. If @p removeLineBreaks is true, then diff -Nru kf5-messagelib-16.04.3/messagelib.categories kf5-messagelib-16.12.3/messagelib.categories --- kf5-messagelib-16.04.3/messagelib.categories 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelib.categories 2017-03-06 12:30:37.000000000 +0000 @@ -1,6 +1,8 @@ # messagelib -log_messagecomposer messagelib (messagecomposer) -log_messagecore messagelib (messagecore) -log_messagelist messagelib (messagelist) -log_messageviewer messagelib (messageviewer) -log_templateparser messagelib (templateparser) +org.kde.pim.messagecomposer messagelib (messagecomposer) +org.kde.pim.messagecore messagelib (messagecore) +org.kde.pim.messagelist messagelib (messagelist) +org.kde.pim.messageviewer messagelib (messageviewer) +org.kde.pim.templateparser messagelib (templateparser) +org.kde.pim.mimetreeparser messagelib (mimetreeparser) +org.kde.pim.webengineviewer messagelib (webengineviewer) diff -Nru kf5-messagelib-16.04.3/messagelib.renamecategories kf5-messagelib-16.12.3/messagelib.renamecategories --- kf5-messagelib-16.04.3/messagelib.renamecategories 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelib.renamecategories 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,7 @@ +# messagelib +log_messagecomposer org.kde.pim.messagecomposer +log_messagecore org.kde.pim.messagecore +log_messagelist org.kde.pim.messagelist +log_messageviewer org.kde.pim.messageviewer +log_templateparser org.kde.pim.templateparser +log_mimetreeparser org.kde.pim.mimetreeparser diff -Nru kf5-messagelib-16.04.3/messagelist/autotests/CMakeLists.txt kf5-messagelib-16.12.3/messagelist/autotests/CMakeLists.txt --- kf5-messagelib-16.04.3/messagelist/autotests/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/autotests/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -11,3 +11,4 @@ messagelist_unittest(itemsizetest.cpp) messagelist_unittest(quicksearchwarningtest.cpp) messagelist_unittest(searchlinestatustest.cpp) +messagelist_unittest(searchcollectionindexingwarningtest.cpp) diff -Nru kf5-messagelib-16.04.3/messagelist/autotests/searchcollectionindexingwarningtest.cpp kf5-messagelib-16.12.3/messagelist/autotests/searchcollectionindexingwarningtest.cpp --- kf5-messagelib-16.04.3/messagelist/autotests/searchcollectionindexingwarningtest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/autotests/searchcollectionindexingwarningtest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,43 @@ +/* + Copyright (c) 2016 Montel Laurent + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + +*/ + +#include "searchcollectionindexingwarningtest.h" +#include "../src/core/widgets/searchcollectionindexingwarning.h" +#include + +SearchCollectionIndexingWarningTest::SearchCollectionIndexingWarningTest(QObject *parent) + : QObject(parent) +{ + +} + +SearchCollectionIndexingWarningTest::~SearchCollectionIndexingWarningTest() +{ + +} + +void SearchCollectionIndexingWarningTest::shouldHaveDefaultValue() +{ + MessageList::Core::SearchCollectionIndexingWarning w; + QVERIFY(!w.isVisible()); + QVERIFY(w.wordWrap()); +} + +QTEST_MAIN(SearchCollectionIndexingWarningTest) diff -Nru kf5-messagelib-16.04.3/messagelist/autotests/searchcollectionindexingwarningtest.h kf5-messagelib-16.12.3/messagelist/autotests/searchcollectionindexingwarningtest.h --- kf5-messagelib-16.04.3/messagelist/autotests/searchcollectionindexingwarningtest.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/autotests/searchcollectionindexingwarningtest.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,36 @@ +/* + Copyright (c) 2016 Montel Laurent + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + +*/ + +#ifndef SEARCHCOLLECTIONINDEXINGWARNINGTEST_H +#define SEARCHCOLLECTIONINDEXINGWARNINGTEST_H + +#include + +class SearchCollectionIndexingWarningTest : public QObject +{ + Q_OBJECT +public: + explicit SearchCollectionIndexingWarningTest(QObject *parent = Q_NULLPTR); + ~SearchCollectionIndexingWarningTest(); +private Q_SLOTS: + void shouldHaveDefaultValue(); +}; + +#endif // SEARCHCOLLECTIONINDEXINGWARNINGTEST_H diff -Nru kf5-messagelib-16.04.3/messagelist/KF5MessageListConfig.cmake.in kf5-messagelib-16.12.3/messagelist/KF5MessageListConfig.cmake.in --- kf5-messagelib-16.04.3/messagelist/KF5MessageListConfig.cmake.in 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/KF5MessageListConfig.cmake.in 2017-03-06 12:30:37.000000000 +0000 @@ -1,8 +1,8 @@ @PACKAGE_INIT@ -find_dependency(KF5Akonadi "@KDEPIMLIBS_LIB_VERSION@") +find_dependency(KF5Akonadi "@AKONADI_VERSION@") find_dependency(KF5Mime "@KMIME_LIB_VERSION@") -find_dependency(KF5AkonadiMime "@KDEPIMLIBS_LIB_VERSION@") +find_dependency(KF5AkonadiMime "@AKONADIMIME_LIB_VERSION@") include("${CMAKE_CURRENT_LIST_DIR}/KF5MessageListTargets.cmake") diff -Nru kf5-messagelib-16.04.3/messagelist/src/CMakeLists.txt kf5-messagelib-16.12.3/messagelist/src/CMakeLists.txt --- kf5-messagelib-16.04.3/messagelist/src/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -23,6 +23,7 @@ core/optionset.cpp core/theme.cpp core/themedelegate.cpp + core/threadingcache.cpp core/storagemodelbase.cpp core/sortorder.cpp core/view.cpp @@ -30,6 +31,7 @@ core/widgets/quicksearchline.cpp core/widgets/quicksearchwarning.cpp core/widgets/searchlinestatus.cpp + core/widgets/searchcollectionindexingwarning.cpp utils/aggregationcombobox.cpp utils/aggregationconfigbutton.cpp @@ -47,7 +49,7 @@ widget.cpp messagelistutil.cpp ) -ecm_qt_declare_logging_category(libmessagelist_SRCS HEADER messagelist_debug.h IDENTIFIER MESSAGELIST_LOG CATEGORY_NAME log_messagelist) +ecm_qt_declare_logging_category(libmessagelist_SRCS HEADER messagelist_debug.h IDENTIFIER MESSAGELIST_LOG CATEGORY_NAME org.kde.pim.messagelist) kconfig_add_kcfg_files(libmessagelist_SRCS core/messagelistsettings.kcfgc @@ -74,6 +76,8 @@ KF5::XmlGui KF5::IconThemes KF5::Completion + KF5::I18n + KF5::TextWidgets ) set_target_properties(KF5MessageList PROPERTIES diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/delegate.h kf5-messagelib-16.12.3/messagelist/src/core/delegate.h --- kf5-messagelib-16.04.3/messagelist/src/core/delegate.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/delegate.h 2017-03-06 12:30:37.000000000 +0000 @@ -33,6 +33,7 @@ class Delegate : public ThemeDelegate { + Q_OBJECT public: explicit Delegate(View *pParent); ~Delegate(); diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/filter.h kf5-messagelib-16.12.3/messagelist/src/core/filter.h --- kf5-messagelib-16.04.3/messagelist/src/core/filter.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/filter.h 2017-03-06 12:30:37.000000000 +0000 @@ -122,7 +122,7 @@ private: bool containString(const QString &searchInString) const; - QList mStatus; ///< Messages must match theses status, if non 0 + QList mStatus; ///< Messages must match these statuses, if non 0 QString mSearchString; ///< Messages must match this search string, if not empty QString mTagId; ///< Messages must have this tag, if not empty. Contains a tag url. Akonadi::Collection mCurrentFolder; diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/item.cpp kf5-messagelib-16.12.3/messagelist/src/core/item.cpp --- kf5-messagelib-16.04.3/messagelist/src/core/item.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/item.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -30,6 +30,157 @@ using namespace MessageList::Core; +/** + * Returns a displayable string from the list of email @p addresses. + * Inefficient, use KMime::Headers::*::displayString() directly instead. + */ +QString stripEmailAddr(const QString &aStr) +{ + //qCDebug(MESSAGECORE_LOG) << "(" << aStr << ")"; + + if (aStr.isEmpty()) { + return QString(); + } + + QString result; + + // The following is a primitive parser for a mailbox-list (cf. RFC 2822). + // The purpose is to extract a displayable string from the mailboxes. + // Comments in the addr-spec are not handled. No error checking is done. + + QString name; + QString comment; + QString angleAddress; + enum { TopLevel, InComment, InAngleAddress } context = TopLevel; + bool inQuotedString = false; + int commentLevel = 0; + + QChar ch; + int strLength(aStr.length()); + for (int index = 0; index < strLength; ++index) { + ch = aStr[index]; + switch (context) { + case TopLevel : { + switch (ch.toLatin1()) { + case '"' : inQuotedString = !inQuotedString; + break; + case '(' : if (!inQuotedString) { + context = InComment; + commentLevel = 1; + } else { + name += ch; + } + break; + case '<' : if (!inQuotedString) { + context = InAngleAddress; + } else { + name += ch; + } + break; + case '\\' : // quoted character + ++index; // skip the '\' + if (index < aStr.length()) { + name += aStr[index]; + } + break; + case ',' : if (!inQuotedString) { + // next email address + if (!result.isEmpty()) { + result += QLatin1String(", "); + } + name = name.trimmed(); + comment = comment.trimmed(); + angleAddress = angleAddress.trimmed(); + if (angleAddress.isEmpty() && !comment.isEmpty()) { + // handle Outlook-style addresses like + // john.doe@invalid (John Doe) + result += comment; + } else if (!name.isEmpty()) { + result += name; + } else if (!comment.isEmpty()) { + result += comment; + } else if (!angleAddress.isEmpty()) { + result += angleAddress; + } + name.clear(); + comment.clear(); + angleAddress.clear(); + } else { + name += ch; + } + break; + default : name += ch; + } + break; + } + case InComment : { + switch (ch.toLatin1()) { + case '(' : ++commentLevel; + comment += ch; + break; + case ')' : --commentLevel; + if (commentLevel == 0) { + context = TopLevel; + comment += QLatin1Char(' '); // separate the text of several comments + } else { + comment += ch; + } + break; + case '\\' : // quoted character + ++index; // skip the '\' + if (index < aStr.length()) { + comment += aStr[index]; + } + break; + default : comment += ch; + } + break; + } + case InAngleAddress : { + switch (ch.toLatin1()) { + case '"' : inQuotedString = !inQuotedString; + angleAddress += ch; + break; + case '>' : if (!inQuotedString) { + context = TopLevel; + } else { + angleAddress += ch; + } + break; + case '\\' : // quoted character + ++index; // skip the '\' + if (index < aStr.length()) { + angleAddress += aStr[index]; + } + break; + default : angleAddress += ch; + } + break; + } + } // switch ( context ) + } + if (!result.isEmpty()) { + result += QLatin1String(", "); + } + name = name.trimmed(); + comment = comment.trimmed(); + angleAddress = angleAddress.trimmed(); + if (angleAddress.isEmpty() && !comment.isEmpty()) { + // handle Outlook-style addresses like + // john.doe@invalid (John Doe) + result += comment; + } else if (!name.isEmpty()) { + result += name; + } else if (!comment.isEmpty()) { + result += comment; + } else if (!angleAddress.isEmpty()) { + result += angleAddress; + } + + //qCDebug(MESSAGECORE_LOG) << "Returns \"" << result << "\""; + return result; +} + Item::Item(Type type) : d_ptr(new ItemPrivate(this)) { @@ -475,6 +626,11 @@ d_ptr->mSender = sender; } +QString Item::displaySender() const +{ + return stripEmailAddr(sender()); +} + const QString &Item::receiver() const { return d_ptr->mReceiver; @@ -485,11 +641,21 @@ d_ptr->mReceiver = receiver; } +QString Item::displayReceiver() const +{ + return stripEmailAddr(receiver()); +} + const QString &Item::senderOrReceiver() const { return d_ptr->mUseReceiver ? d_ptr->mReceiver : d_ptr->mSender; } +QString Item::displaySenderOrReceiver() const +{ + return stripEmailAddr(senderOrReceiver()); +} + bool Item::useReceiver() const { return d_ptr->mUseReceiver; diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/item.h kf5-messagelib-16.12.3/messagelist/src/core/item.h --- kf5-messagelib-16.04.3/messagelist/src/core/item.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/item.h 2017-03-06 12:30:37.000000000 +0000 @@ -317,6 +317,11 @@ void setSender(const QString &sender); /** + * Display sender. + */ + QString displaySender() const; + + /** * Returns the receiver associated to this item. */ const QString &receiver() const; @@ -327,11 +332,21 @@ void setReceiver(const QString &receiver); /** + * Display receiver. + */ + QString displayReceiver() const; + + /** * Returns the sender or the receiver, depending on the underlying StorageModel settings. */ const QString &senderOrReceiver() const; /** + * Display sender or receiver. + */ + QString displaySenderOrReceiver() const; + + /** * Returns whether sender or receiver is supposed to be displayed. */ bool useReceiver() const; diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/item_p.h kf5-messagelib-16.12.3/messagelist/src/core/item_p.h --- kf5-messagelib-16.04.3/messagelist/src/core/item_p.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/item_p.h 2017-03-06 12:30:37.000000000 +0000 @@ -353,8 +353,8 @@ public: static inline bool firstGreaterOrEqual(Item *first, Item *second) { - const int ret = MessageCore::StringUtil::stripEmailAddr(first->sender()).compare( - MessageCore::StringUtil::stripEmailAddr(second->sender()), Qt::CaseInsensitive); + const int ret = first->displaySender().compare( + second->displaySender(), Qt::CaseInsensitive); if (ret < 0) { return false; } @@ -375,8 +375,8 @@ public: static inline bool firstGreaterOrEqual(Item *first, Item *second) { - const int ret = MessageCore::StringUtil::stripEmailAddr(first->receiver()).compare( - MessageCore::StringUtil::stripEmailAddr(second->receiver()), Qt::CaseInsensitive); + const int ret = first->displayReceiver().compare( + second->displayReceiver(), Qt::CaseInsensitive); if (ret < 0) { return false; } @@ -397,8 +397,8 @@ public: static inline bool firstGreaterOrEqual(Item *first, Item *second) { - const int ret = MessageCore::StringUtil::stripEmailAddr(first->senderOrReceiver()).compare( - MessageCore::StringUtil::stripEmailAddr(second->senderOrReceiver()), Qt::CaseInsensitive); + const int ret = first->displaySenderOrReceiver().compare( + second->displaySenderOrReceiver(), Qt::CaseInsensitive); if (ret < 0) { return false; } diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/manager.cpp kf5-messagelib-16.12.3/messagelist/src/core/manager.cpp --- kf5-messagelib-16.04.3/messagelist/src/core/manager.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/manager.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -58,19 +58,19 @@ mDateFormatter = new KMime::DateFormatter(); - mPixmapMessageNew = new QPixmap(QIcon::fromTheme(QStringLiteral("mail-unread-new")).pixmap(64, 64)); - mPixmapMessageUnread = new QPixmap(QIcon::fromTheme(QStringLiteral("mail-unread")).pixmap(64, 64)); - mPixmapMessageRead = new QPixmap(QIcon::fromTheme(QStringLiteral("mail-read")).pixmap(64, 64)); + mPixmapMessageNew = new QPixmap(QIcon::fromTheme(QStringLiteral("mail-mark-unread-new")).pixmap(64, 64)); + mPixmapMessageUnread = new QPixmap(QIcon::fromTheme(QStringLiteral("mail-mark-unread")).pixmap(64, 64)); + mPixmapMessageRead = new QPixmap(QIcon::fromTheme(QStringLiteral("mail-mark-read")).pixmap(64, 64)); mPixmapMessageDeleted = new QPixmap(QIcon::fromTheme(QStringLiteral("mail-deleted")).pixmap(64, 64)); mPixmapMessageReplied = new QPixmap(QIcon::fromTheme(QStringLiteral("mail-replied")).pixmap(64, 64)); mPixmapMessageRepliedAndForwarded = new QPixmap(QIcon::fromTheme(QStringLiteral("mail-forwarded-replied")).pixmap(64, 64)); mPixmapMessageQueued = new QPixmap(QIcon::fromTheme(QStringLiteral("mail-queued")).pixmap(64, 64)); // mail-queue ? - mPixmapMessageActionItem = new QPixmap(QIcon::fromTheme(QStringLiteral("mail-task")).pixmap(64, 64)); + mPixmapMessageActionItem = new QPixmap(QIcon::fromTheme(QStringLiteral("mail-mark-task")).pixmap(64, 64)); mPixmapMessageSent = new QPixmap(QIcon::fromTheme(QStringLiteral("mail-sent")).pixmap(64, 64)); mPixmapMessageForwarded = new QPixmap(QIcon::fromTheme(QStringLiteral("mail-forwarded")).pixmap(64, 64)); mPixmapMessageImportant = new QPixmap(QIcon::fromTheme(QStringLiteral("emblem-important")).pixmap(64, 64)); // "flag" - mPixmapMessageWatched = new QPixmap(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("messagelist/pics/mail-thread-watch.png"))); - mPixmapMessageIgnored = new QPixmap(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("messagelist/pics/mail-thread-ignored.png"))); + mPixmapMessageWatched = new QPixmap(QIcon::fromTheme(QStringLiteral("messagelist/pics/mail-thread-watch.png")).pixmap(64, 64)); + mPixmapMessageIgnored = new QPixmap(QIcon::fromTheme(QStringLiteral("messagelist/pics/mail-thread-ignored.png")).pixmap(64, 64)); mPixmapMessageSpam = new QPixmap(QIcon::fromTheme(QStringLiteral("mail-mark-junk")).pixmap(64, 64)); mPixmapMessageHam = new QPixmap(QIcon::fromTheme(QStringLiteral("mail-mark-notjunk")).pixmap(64, 64)); mPixmapMessageFullySigned = new QPixmap(QIcon::fromTheme(QStringLiteral("mail-signed-verified")).pixmap(64, 64)); @@ -97,6 +97,7 @@ loadConfiguration(); connect(MessageListSettings::self(), &MessageListSettings::configChanged, this, &Manager::reloadGlobalConfiguration); + connect(MessageCore::MessageCoreSettings::self(), &MessageCore::MessageCoreSettings::configChanged, this, &Manager::reloadGlobalConfiguration); } Manager::~Manager() @@ -730,7 +731,7 @@ add_theme_simple_text_column(s, i18n("Most Recent Date"), Theme::ContentItem::MostRecentDate, false, SortOrder::SortMessagesByDateTimeOfMostRecent, false, true); add_theme_simple_text_column(s, i18nc("Size of a message", "Size"), Theme::ContentItem::Size, false, SortOrder::SortMessagesBySize, false, false); add_theme_simple_icon_column(s, i18nc("Attachement indication", "Attachment"), QStringLiteral("mail-attachment"), Theme::ContentItem::AttachmentStateIcon, false, SortOrder::SortMessagesByAttachmentStatus); - add_theme_simple_icon_column(s, i18n("Read/Unread"), QStringLiteral("mail-unread-new"), Theme::ContentItem::ReadStateIcon, false, SortOrder::SortMessagesByUnreadStatus); + add_theme_simple_icon_column(s, i18n("Read/Unread"), QStringLiteral("mail-mark-unread-new"), Theme::ContentItem::ReadStateIcon, false, SortOrder::SortMessagesByUnreadStatus); add_theme_simple_icon_column(s, i18n("Replied"), QStringLiteral("mail-replied"), Theme::ContentItem::RepliedStateIcon, false, SortOrder::NoMessageSorting); add_theme_simple_icon_column(s, i18nc("Message importance indication", "Important"), QStringLiteral("emblem-important"), Theme::ContentItem::ImportantStateIcon, false, SortOrder::SortMessagesByImportantStatus); add_theme_simple_icon_column(s, i18n("Action Item"), QStringLiteral("mail-task"), Theme::ContentItem::ActionItemStateIcon, false, SortOrder::SortMessagesByActionItemStatus); diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/messageitem.cpp kf5-messagelib-16.12.3/messagelist/src/core/messageitem.cpp --- kf5-messagelib-16.04.3/messagelist/src/core/messageitem.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/messageitem.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -38,7 +38,7 @@ Q_GLOBAL_STATIC(TagCache, s_tagCache) -class MessageItem::Tag::Private +class Q_DECL_HIDDEN MessageItem::Tag::Private { public: Private() diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/model.cpp kf5-messagelib-16.12.3/messagelist/src/core/model.cpp --- kf5-messagelib-16.04.3/messagelist/src/core/model.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/model.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -66,6 +66,9 @@ #include #include #include +#include + +#include namespace MessageList { @@ -308,8 +311,10 @@ d->mFillStepTimer.setSingleShot(true); d->mInvariantRowMapper = new ModelInvariantRowMapper(); d->mModelForItemFunctions = this; - connect(&d->mFillStepTimer, SIGNAL(timeout()), - SLOT(viewItemJobStep())); + connect(&d->mFillStepTimer, &QTimer::timeout, + this, [this]() { + d->viewItemJobStep(); + }); d->mCachedTodayLabel = i18n("Today"); d->mCachedYesterdayLabel = i18n("Yesterday"); @@ -323,8 +328,10 @@ d->mCachedWatchedOrIgnoredStatusBits = Akonadi::MessageStatus::statusIgnored().toQInt32() | Akonadi::MessageStatus::statusWatched().toQInt32(); - connect(_k_heartBeatTimer, SIGNAL(timeout()), - this, SLOT(checkIfDateChanged())); + connect(_k_heartBeatTimer(), &QTimer::timeout, + this, [this]() { + d->checkIfDateChanged(); + }); if (!_k_heartBeatTimer->isActive()) { // First model starts it _k_heartBeatTimer->start(60000); // 1 minute @@ -377,7 +384,9 @@ d->mFilter = filter; if (d->mFilter) { - connect(d->mFilter, SIGNAL(finished()), this, SLOT(slotApplyFilter())); + connect(d->mFilter, &Filter::finished, this, [this]() { + d->slotApplyFilter(); + }); } d->slotApplyFilter(); @@ -733,22 +742,13 @@ d->clear(); if (d->mStorageModel) { - disconnect(d->mStorageModel, SIGNAL(rowsInserted(QModelIndex,int,int)), - this, SLOT(slotStorageModelRowsInserted(QModelIndex,int,int))); - disconnect(d->mStorageModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), - this, SLOT(slotStorageModelRowsRemoved(QModelIndex,int,int))); - - disconnect(d->mStorageModel, SIGNAL(layoutChanged()), - this, SLOT(slotStorageModelLayoutChanged())); - disconnect(d->mStorageModel, SIGNAL(modelReset()), - this, SLOT(slotStorageModelLayoutChanged())); - - disconnect(d->mStorageModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), - this, SLOT(slotStorageModelDataChanged(QModelIndex,QModelIndex))); - disconnect(d->mStorageModel, SIGNAL(headerDataChanged(Qt::Orientation,int,int)), - this, SLOT(slotStorageModelHeaderDataChanged(Qt::Orientation,int,int))); + // Disconnect all signals from old storageModel + std::for_each(d->mStorageModelConnections.cbegin(), d->mStorageModelConnections.cend(), + [](const QMetaObject::Connection & c) -> bool { return QObject::disconnect(c); }); + d->mStorageModelConnections.clear(); } + const bool isReload = (d->mStorageModel == storageModel); d->mStorageModel = storageModel; if (!d->mStorageModel) { @@ -758,23 +758,66 @@ // Sometimes the folders need to be resurrected... d->mStorageModel->prepareForScan(); + // Save threading cache of the previous folder, but only if the cache was + // enabled and a different folder is being loaded - reload of the same folder + // means change in aggregation in which case we will have to re-build the + // cache so there's no point saving the current threading cache. + if (d->mThreadingCache.isEnabled() && !isReload) { + d->mThreadingCache.save(); + } else { + if (isReload) { + qCDebug(MESSAGELIST_LOG) << "Identical folder reloaded, not saving old threading cache"; + } else { + qCDebug(MESSAGELIST_LOG) << "Threading disabled in previous folder, not saving threading cache"; + } + } + // Load threading cache for the new folder, but only if threading is enabled, + // otherwise we would just be caching a flat list. + if (d->mAggregation->threading() != Aggregation::NoThreading) { + d->mThreadingCache.setEnabled(true); + d->mThreadingCache.load(d->mStorageModel->id(), d->mAggregation); + } else { + // No threading, no cache - don't even bother inserting entries into the + // cache or trying to look them up there + d->mThreadingCache.setEnabled(false); + qCDebug(MESSAGELIST_LOG) << "Threading disabled in folder" << d->mStorageModel->id() << ", not using threading cache"; + } + d->mPreSelectionMode = preSelectionMode; d->mStorageModelContainsOutboundMessages = d->mStorageModel->containsOutboundMessages(); - connect(d->mStorageModel, SIGNAL(rowsInserted(QModelIndex,int,int)), - this, SLOT(slotStorageModelRowsInserted(QModelIndex,int,int))); - connect(d->mStorageModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), - this, SLOT(slotStorageModelRowsRemoved(QModelIndex,int,int))); - - connect(d->mStorageModel, SIGNAL(layoutChanged()), - this, SLOT(slotStorageModelLayoutChanged())); - connect(d->mStorageModel, SIGNAL(modelReset()), - this, SLOT(slotStorageModelLayoutChanged())); - - connect(d->mStorageModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), - this, SLOT(slotStorageModelDataChanged(QModelIndex,QModelIndex))); - connect(d->mStorageModel, SIGNAL(headerDataChanged(Qt::Orientation,int,int)), - this, SLOT(slotStorageModelHeaderDataChanged(Qt::Orientation,int,int))); + d->mStorageModelConnections = { + connect(d->mStorageModel, &StorageModel::rowsInserted, + this, [this](const QModelIndex & parent, int first, int last) + { + d->slotStorageModelRowsInserted(parent, first, last); + }), + connect(d->mStorageModel, &StorageModel::rowsRemoved, + this, [this](const QModelIndex & parent, int first, int last) + { + d->slotStorageModelRowsRemoved(parent, first, last); + }), + connect(d->mStorageModel, &StorageModel::layoutChanged, + this, [this]() + { + d->slotStorageModelLayoutChanged(); + }), + connect(d->mStorageModel, &StorageModel::modelReset, + this, [this]() + { + d->slotStorageModelLayoutChanged(); + }), + connect(d->mStorageModel, &StorageModel::dataChanged, + this, [this](const QModelIndex & topLeft, const QModelIndex & bottomRight) + { + d->slotStorageModelDataChanged(topLeft, bottomRight); + }), + connect(d->mStorageModel, &StorageModel::headerDataChanged, + this, [this](Qt::Orientation orientation, int first, int last) + { + d->slotStorageModelHeaderDataChanged(orientation, first, last); + }) + }; if (d->mStorageModel->rowCount() == 0) { return; // folder empty: nothing to fill @@ -1296,7 +1339,11 @@ } else if (daysAgo == 1) { // Yesterday groupLabel = mCachedYesterdayLabel; } else if (daysAgo > 1 && daysAgo < daysInWeek) { // Within last seven days - groupLabel = QLocale::system().standaloneDayName(dDate.dayOfWeek()); + auto dayName = mCachedDayNameLabel.find(dDate.dayOfWeek()); // non-const call, but non-shared container + if (dayName == mCachedDayNameLabel.end()) { + dayName = mCachedDayNameLabel.insert(dDate.dayOfWeek(), QLocale::system().standaloneDayName(dDate.dayOfWeek())); + } + groupLabel = *dayName; } else if (mAggregation->grouping() == Aggregation::GroupByDate) { // GroupByDate seven days or more ago groupLabel = QLocale::system().toString(dDate, QLocale::ShortFormat); } else if (dDate.month() == mTodayDate.month() && // GroupByDateRange within this month @@ -1326,9 +1373,17 @@ groupLabel = mCachedUnknownLabel; } } else if (dDate.year() == mTodayDate.year()) { // GroupByDateRange within this year - groupLabel = QLocale::system().standaloneMonthName(dDate.month()); + auto monthName = mCachedMonthNameLabel.find(dDate.month()); // non-const call, but non-shared container + if (monthName == mCachedMonthNameLabel.end()) { + monthName = mCachedMonthNameLabel.insert(dDate.month(), QLocale::system().standaloneMonthName(dDate.month())); + } + groupLabel = *monthName; } else { // GroupByDateRange in previous years - groupLabel = i18nc("Message Aggregation Group Header: Month name and Year number", "%1 %2", QLocale::system().standaloneMonthName(dDate.month()), + auto monthName = mCachedMonthNameLabel.find(dDate.month()); // non-const call, but non-shared container + if (monthName == mCachedMonthNameLabel.end()) { + monthName = mCachedMonthNameLabel.insert(dDate.month(), QLocale::system().standaloneMonthName(dDate.month())); + } + groupLabel = i18nc("Message Aggregation Group Header: Month name and Year number", "%1 %2", *monthName, QLocale::system().toString(dDate, QLatin1Literal("yyyy"))); } break; @@ -1336,17 +1391,17 @@ case Aggregation::GroupBySenderOrReceiver: date = mi->date(); - groupLabel = MessageCore::StringUtil::stripEmailAddr(mi->senderOrReceiver()); + groupLabel = mi->displaySenderOrReceiver(); break; case Aggregation::GroupBySender: date = mi->date(); - groupLabel = MessageCore::StringUtil::stripEmailAddr(mi->sender()); + groupLabel = mi->displaySender(); break; case Aggregation::GroupByReceiver: date = mi->date(); - groupLabel = MessageCore::StringUtil::stripEmailAddr(mi->receiver()); + groupLabel = mi->displayReceiver(); break; case Aggregation::NoGrouping: @@ -1413,6 +1468,9 @@ attachMessageToParent(ghi, mi); } + + // Remember this message as a thread leader + mThreadingCache.updateParent(mi, Q_NULLPTR); } MessageItem *ModelPrivate::findMessageParent(MessageItem *mi) @@ -2016,7 +2074,7 @@ } // for(;;) } -void ModelPrivate::attachMessageToParent(Item *pParent, MessageItem *mi) +void ModelPrivate::attachMessageToParent(Item *pParent, MessageItem *mi, AttachOptions attachOptions) { Q_ASSERT(pParent); Q_ASSERT(mi); @@ -2096,6 +2154,9 @@ if (!mi->inReplyToIdMD5().isEmpty()) { mThreadingCacheMessageInReplyToIdMD5ToMessageItem.remove(mi->inReplyToIdMD5(), mi); } + if (attachOptions == StoreInCache && pParent->type() == Item::Message) { + mThreadingCache.updateParent(mi, static_cast(pParent)); + } break; case MessageItem::ImperfectParentFound: case MessageItem::ParentMissing: // may be: temporary or just fallback assignment @@ -2320,11 +2381,10 @@ // // When messages are added, mark it as dirty only (?) -ModelPrivate::ViewItemJobResult ModelPrivate::viewItemJobStepInternalForJobPass5(ViewItemJob *job, const QTime &tStart) +ModelPrivate::ViewItemJobResult ModelPrivate::viewItemJobStepInternalForJobPass5(ViewItemJob *job, const QElapsedTimer &elapsedTimer) { // In this pass we scan the group headers that are in mGroupHeadersThatNeedUpdate. // Empty groups get deleted while the other ones are re-sorted. - int elapsed; int curIndex = job->currentIndex(); @@ -2408,8 +2468,7 @@ // a subtree with a LOT of messages inside. If interactivity is favored // we should check the time really more often. if ((curIndex % mViewItemJobStepMessageCheckCount) == 0) { - elapsed = tStart.msecsTo(QTime::currentTime()); - if ((elapsed > mViewItemJobStepChunkTimeout) || (elapsed < 0)) { + if (elapsedTimer.elapsed() > mViewItemJobStepChunkTimeout) { if (it != mGroupHeadersThatNeedUpdate.end()) { job->setCurrentIndex(curIndex); return ViewItemJobInterrupted; @@ -2422,7 +2481,7 @@ return ViewItemJobCompleted; } -ModelPrivate::ViewItemJobResult ModelPrivate::viewItemJobStepInternalForJobPass4(ViewItemJob *job, const QTime &tStart) +ModelPrivate::ViewItemJobResult ModelPrivate::viewItemJobStepInternalForJobPass4(ViewItemJob *job, const QElapsedTimer &elapsedTimer) { // In this pass we scan mUnassignedMessageListForPass4 which now // contains both items with parents and items without parents. @@ -2432,8 +2491,6 @@ // We call this pass "Grouping" - int elapsed; - int curIndex = job->currentIndex(); int endIndex = job->endIndex(); @@ -2452,8 +2509,7 @@ // a subtree with a LOT of messages inside. If interactivity is favored // we should check the time really more often. if ((curIndex % mViewItemJobStepMessageCheckCount) == 0) { - elapsed = tStart.msecsTo(QTime::currentTime()); - if ((elapsed > mViewItemJobStepChunkTimeout) || (elapsed < 0)) { + if (elapsedTimer.elapsed() > mViewItemJobStepChunkTimeout) { if (curIndex <= endIndex) { job->setCurrentIndex(curIndex); return ViewItemJobInterrupted; @@ -2466,7 +2522,7 @@ return ViewItemJobCompleted; } -ModelPrivate::ViewItemJobResult ModelPrivate::viewItemJobStepInternalForJobPass3(ViewItemJob *job, const QTime &tStart) +ModelPrivate::ViewItemJobResult ModelPrivate::viewItemJobStepInternalForJobPass3(ViewItemJob *job, const QElapsedTimer &elapsedTimer) { // In this pass we scan the mUnassignedMessageListForPass3 and try to do construct the threads // by using subject based threading. If subject based threading is not in effect then @@ -2479,8 +2535,6 @@ // to traverse an array of N entries than to remove K>0 entries one by one and // to traverse the remaining N-K entries. - int elapsed; - int curIndex = job->currentIndex(); int endIndex = job->endIndex(); @@ -2536,8 +2590,7 @@ // a subtree with a LOT of messages inside. If interactivity is favored // we should check the time really more often. if ((curIndex % mViewItemJobStepMessageCheckCount) == 0) { - elapsed = tStart.msecsTo(QTime::currentTime()); - if ((elapsed > mViewItemJobStepChunkTimeout) || (elapsed < 0)) { + if (elapsedTimer.elapsed() > mViewItemJobStepChunkTimeout) { if (curIndex <= endIndex) { job->setCurrentIndex(curIndex); return ViewItemJobInterrupted; @@ -2550,7 +2603,7 @@ return ViewItemJobCompleted; } -ModelPrivate::ViewItemJobResult ModelPrivate::viewItemJobStepInternalForJobPass2(ViewItemJob *job, const QTime &tStart) +ModelPrivate::ViewItemJobResult ModelPrivate::viewItemJobStepInternalForJobPass2(ViewItemJob *job, const QElapsedTimer &elapsedTimer) { // In this pass we scan the mUnassignedMessageList and try to do construct the threads. // If some thread leader message got attacched to the viewable tree in Pass1Fill then @@ -2565,8 +2618,6 @@ // We call this pass "Threading" - int elapsed; - int curIndex = job->currentIndex(); int endIndex = job->endIndex(); @@ -2577,46 +2628,65 @@ // If it has no parent or it has a temporary one (mi->parent() && mi->threadingStatus() == MessageItem::ParentMissing) // then we attempt to (re-)thread it. Otherwise we just do nothing (the job has already been done by the previous steps). if ((!mi->parent()) || (mi->threadingStatus() == MessageItem::ParentMissing)) { - MessageItem *mparent = findMessageParent(mi); - + qint64 parentId; + MessageItem *mparent = mThreadingCache.parentForItem(mi, parentId); if (mparent) { - // parent found, either perfect or imperfect - if (mi->isViewable()) { - // mi was already viewable, we're just trying to re-parent it better... - attachMessageToParent(mparent, mi); - if (!mparent->isViewable()) { - // re-attach it immediately (so current item is not lost) - MessageItem *topmost = mparent->topmostMessage(); - Q_ASSERT(!topmost->parent()); // groups are always viewable! - topmost->setThreadingStatus(MessageItem::ParentMissing); - attachMessageToGroupHeader(topmost); - } + mi->setThreadingStatus(MessageItem::PerfectParentFound); + attachMessageToParent(mparent, mi, SkipCacheUpdate); + } else { + if (parentId > 0) { + // In second pass we have all available Items in mThreadingCache already. If + // mThreadingCache.parentForItem() returns null, but returns valid parentId then + // the Item was removed from Akonadi and our threading cache is out-of-date. + mThreadingCache.expireParent(mi); + mparent = findMessageParent(mi); + } else if (parentId < 0) { + mparent = findMessageParent(mi); } else { - // mi wasn't viewable yet.. no need to attach parent - attachMessageToParent(mparent, mi); + // parentId = 0: this message is a thread leader so don't + // bother resolving parent, it will be moved directly to + // Pass4 in the code below } - // and we're done for now - } else { - // so parent not found, (threadingStatus() is either MessageItem::ParentMissing or MessageItem::NonThreadable) - switch (mi->threadingStatus()) { - case MessageItem::ParentMissing: - if (mAggregation->threading() == Aggregation::PerfectReferencesAndSubject) { - // parent missing but still can be found in Pass3 - mUnassignedMessageListForPass3.append(mi); // this is ~O(1) + + if (mparent) { + // parent found, either perfect or imperfect + if (mi->isViewable()) { + // mi was already viewable, we're just trying to re-parent it better... + attachMessageToParent(mparent, mi); + if (!mparent->isViewable()) { + // re-attach it immediately (so current item is not lost) + MessageItem *topmost = mparent->topmostMessage(); + Q_ASSERT(!topmost->parent()); // groups are always viewable! + topmost->setThreadingStatus(MessageItem::ParentMissing); + attachMessageToGroupHeader(topmost); + } } else { - // We're not doing subject based threading: will never be threaded, go straight to Pass4 + // mi wasn't viewable yet.. no need to attach parent + attachMessageToParent(mparent, mi); + } + // and we're done for now + } else { + // so parent not found, (threadingStatus() is either MessageItem::ParentMissing or MessageItem::NonThreadable) + switch (mi->threadingStatus()) { + case MessageItem::ParentMissing: + if (mAggregation->threading() == Aggregation::PerfectReferencesAndSubject) { + // parent missing but still can be found in Pass3 + mUnassignedMessageListForPass3.append(mi); // this is ~O(1) + } else { + // We're not doing subject based threading: will never be threaded, go straight to Pass4 + mUnassignedMessageListForPass4.append(mi); // this is ~O(1) + } + break; + case MessageItem::NonThreadable: + // will never be threaded, go straight to Pass4 mUnassignedMessageListForPass4.append(mi); // this is ~O(1) + break; + default: + // a bug for sure + qCWarning(MESSAGELIST_LOG) << "ERROR: Invalid message threading status returned by findMessageParent()!"; + Q_ASSERT(false); + break; } - break; - case MessageItem::NonThreadable: - // will never be threaded, go straight to Pass4 - mUnassignedMessageListForPass4.append(mi); // this is ~O(1) - break; - default: - // a bug for sure - qCWarning(MESSAGELIST_LOG) << "ERROR: Invalid message threading status returned by findMessageParent()!"; - Q_ASSERT(false); - break; } } } else { @@ -2635,8 +2705,7 @@ // a subtree with a LOT of messages inside. If interactivity is favored // we should check the time really more often. if ((curIndex % mViewItemJobStepMessageCheckCount) == 0) { - elapsed = tStart.msecsTo(QTime::currentTime()); - if ((elapsed > mViewItemJobStepChunkTimeout) || (elapsed < 0)) { + if (elapsedTimer.elapsed() > mViewItemJobStepChunkTimeout) { if (curIndex <= endIndex) { job->setCurrentIndex(curIndex); return ViewItemJobInterrupted; @@ -2649,7 +2718,7 @@ return ViewItemJobCompleted; } -ModelPrivate::ViewItemJobResult ModelPrivate::viewItemJobStepInternalForJobPass1Fill(ViewItemJob *job, const QTime &tStart) +ModelPrivate::ViewItemJobResult ModelPrivate::viewItemJobStepInternalForJobPass1Fill(ViewItemJob *job, const QElapsedTimer &elapsedTimer) { // In this pass we scan the a contiguous region of the underlying storage (that is // assumed to be FLAT) and create the corresponding MessageItem objects. @@ -2660,8 +2729,6 @@ // We call this pass "Processing" - int elapsed; - // Should we use the receiver or the sender field for sorting ? bool bUseReceiver = mStorageModelContainsOutboundMessages; @@ -2737,146 +2804,165 @@ // Perfect/References threading cache mThreadingCacheMessageIdMD5ToMessageItem.insert(mi->messageIdMD5(), mi); - // Check if this item is a perfect parent for some imperfectly threaded - // message (that is actually attacched to it, but not necessairly to the - // viewable root). If it is, then remove the imperfect child from its - // current parent rebuild the hierarchy on the fly. - - bool needsImmediateReAttach = false; - - if (mThreadingCacheMessageInReplyToIdMD5ToMessageItem.count() > 0) { // unlikely - QList< MessageItem * > lImperfectlyThreaded = mThreadingCacheMessageInReplyToIdMD5ToMessageItem.values(mi->messageIdMD5()); - if (!lImperfectlyThreaded.isEmpty()) { - // must move all of the items in the perfect parent - QList< MessageItem * >::ConstIterator end(lImperfectlyThreaded.constEnd()); - for (QList< MessageItem * >::ConstIterator it = lImperfectlyThreaded.constBegin(); it != end; ++it) { - Q_ASSERT((*it)->parent()); - Q_ASSERT((*it)->parent() != mi); - - if (!(((*it)->threadingStatus() == MessageItem::ImperfectParentFound) || - ((*it)->threadingStatus() == MessageItem::ParentMissing))) { - qCritical() << "Got message " << (*it) << " with threading status" << (*it)->threadingStatus(); - Q_ASSERT_X(false, "ModelPrivate::viewItemJobStepInternalForJobPass1Fill", "Wrong threading status"); - } + // Register the current item into the threading cache + mThreadingCache.addItemToCache(mi); - // If the item was already attached to the view then - // re-attach it immediately. This will avoid a message - // being displayed for a short while in the view and then - // disappear until a perfect parent isn't found. - if ((*it)->isViewable()) { - needsImmediateReAttach = true; - } + // First of all look into the persistent cache + qint64 parentId; + Item *pParent = mThreadingCache.parentForItem(mi, parentId); + if (pParent) { + // We already have the parent MessageItem. Attach current message + // to it and mark it as perfect + mi->setThreadingStatus(MessageItem::PerfectParentFound); + attachMessageToParent(pParent, mi); + } else if (parentId > 0) { + // We don't have the parent MessageItem yet, but we do know the + // parent: delay for pass 2 when we will have the parent MessageItem + // for sure. + mi->setThreadingStatus(MessageItem::ParentMissing); + mUnassignedMessageListForPass2.append(mi); + } else if (parentId == 0) { + // Message is a thread leader, skip straight to Pass4 + mi->setThreadingStatus(MessageItem::NonThreadable); + mUnassignedMessageListForPass4.append(mi); + } else { + // Check if this item is a perfect parent for some imperfectly threaded + // message (that is actually attacched to it, but not necessairly to the + // viewable root). If it is, then remove the imperfect child from its + // current parent rebuild the hierarchy on the fly. + bool needsImmediateReAttach = false; + + if (mThreadingCacheMessageInReplyToIdMD5ToMessageItem.count() > 0) { // unlikely + QList< MessageItem * > lImperfectlyThreaded = mThreadingCacheMessageInReplyToIdMD5ToMessageItem.values(mi->messageIdMD5()); + if (!lImperfectlyThreaded.isEmpty()) { + // must move all of the items in the perfect parent + QList< MessageItem * >::ConstIterator end(lImperfectlyThreaded.constEnd()); + for (QList< MessageItem * >::ConstIterator it = lImperfectlyThreaded.constBegin(); it != end; ++it) { + Q_ASSERT((*it)->parent()); + Q_ASSERT((*it)->parent() != mi); + + if (!(((*it)->threadingStatus() == MessageItem::ImperfectParentFound) || + ((*it)->threadingStatus() == MessageItem::ParentMissing))) { + qCritical() << "Got message " << (*it) << " with threading status" << (*it)->threadingStatus(); + Q_ASSERT_X(false, "ModelPrivate::viewItemJobStepInternalForJobPass1Fill", "Wrong threading status"); + } + + // If the item was already attached to the view then + // re-attach it immediately. This will avoid a message + // being displayed for a short while in the view and then + // disappear until a perfect parent isn't found. + if ((*it)->isViewable()) { + needsImmediateReAttach = true; + } - (*it)->setThreadingStatus(MessageItem::PerfectParentFound); - attachMessageToParent(mi, *it); + (*it)->setThreadingStatus(MessageItem::PerfectParentFound); + attachMessageToParent(mi, *it); + } } } - } - // FIXME: Might look by "References" too, here... (?) + // FIXME: Might look by "References" too, here... (?) - // Attempt to do threading with anything we already have in caches until now - // Note that this is likely to work since thread-parent messages tend - // to come before thread-children messages in the folders (simply because of - // date of arrival). - - Item *pParent; - - // First of all try to find a "perfect parent", that is the message for that - // we have the ID in the "In-Reply-To" field. This is actually done by using - // MD5 caches of the message ids because of speed. Collisions are very unlikely. - - const QByteArray md5 = mi->inReplyToIdMD5(); - - if (!md5.isEmpty()) { - // Have an In-Reply-To field MD5. - // In well behaved mailing lists 70% of the threadable messages get a parent here :) - pParent = mThreadingCacheMessageIdMD5ToMessageItem.value(md5, Q_NULLPTR); - - if (pParent) { // very likely - // Take care of self-referencing (which is always possible) - // and circular In-Reply-To reference loops which are possible - // in case this item was found to be a perfect parent for some - // imperfectly threaded message just above. - if ( - (mi == pParent) || // self referencing message - ( - (mi->childItemCount() > 0) && // mi already has children, this is fast to determine - pParent->hasAncestor(mi) // pParent is in the mi's children tree - ) - ) { - // Bad, bad message.. it has In-Reply-To equal to Message-Id - // or it's in a circular In-Reply-To reference loop. - // Will wait for Pass2 with References-Id only - qCWarning(MESSAGELIST_LOG) << "Circular In-Reply-To reference loop detected in the message tree"; - mUnassignedMessageListForPass2.append(mi); + // Attempt to do threading with anything we already have in caches until now + // Note that this is likely to work since thread-parent messages tend + // to come before thread-children messages in the folders (simply because of + // date of arrival). + + // First of all try to find a "perfect parent", that is the message for that + // we have the ID in the "In-Reply-To" field. This is actually done by using + // MD5 caches of the message ids because of speed. Collisions are very unlikely. + + const QByteArray md5 = mi->inReplyToIdMD5(); + if (!md5.isEmpty()) { + // Have an In-Reply-To field MD5. + // In well behaved mailing lists 70% of the threadable messages get a parent here :) + pParent = mThreadingCacheMessageIdMD5ToMessageItem.value(md5, Q_NULLPTR); + + if (pParent) { // very likely + // Take care of self-referencing (which is always possible) + // and circular In-Reply-To reference loops which are possible + // in case this item was found to be a perfect parent for some + // imperfectly threaded message just above. + if ( + (mi == pParent) || // self referencing message + ( + (mi->childItemCount() > 0) && // mi already has children, this is fast to determine + pParent->hasAncestor(mi) // pParent is in the mi's children tree + ) + ) { + // Bad, bad message.. it has In-Reply-To equal to Message-Id + // or it's in a circular In-Reply-To reference loop. + // Will wait for Pass2 with References-Id only + qCWarning(MESSAGELIST_LOG) << "Circular In-Reply-To reference loop detected in the message tree"; + mUnassignedMessageListForPass2.append(mi); + } else { + // wow, got a perfect parent for this message! + mi->setThreadingStatus(MessageItem::PerfectParentFound); + attachMessageToParent(pParent, mi); + // we're done with this message (also for Pass2) + } } else { - // wow, got a perfect parent for this message! - mi->setThreadingStatus(MessageItem::PerfectParentFound); - attachMessageToParent(pParent, mi); - // we're done with this message (also for Pass2) + // got no parent + // will have to wait Pass2 + mUnassignedMessageListForPass2.append(mi); } } else { - // got no parent - // will have to wait Pass2 - mUnassignedMessageListForPass2.append(mi); - } - } else { - // No In-Reply-To header. + // No In-Reply-To header. - bool mightHaveOtherMeansForThreading; + bool mightHaveOtherMeansForThreading; - switch (mAggregation->threading()) { - case Aggregation::PerfectReferencesAndSubject: - mightHaveOtherMeansForThreading = mi->subjectIsPrefixed() || !mi->referencesIdMD5().isEmpty(); - break; - case Aggregation::PerfectAndReferences: - mightHaveOtherMeansForThreading = !mi->referencesIdMD5().isEmpty(); - break; - case Aggregation::PerfectOnly: - mightHaveOtherMeansForThreading = false; - break; - default: - // BUG: there shouldn't be other values (NoThreading is excluded in an upper branch) - Q_ASSERT(false); - mightHaveOtherMeansForThreading = false; // make gcc happy - break; - } + switch (mAggregation->threading()) { + case Aggregation::PerfectReferencesAndSubject: + mightHaveOtherMeansForThreading = mi->subjectIsPrefixed() || !mi->referencesIdMD5().isEmpty(); + break; + case Aggregation::PerfectAndReferences: + mightHaveOtherMeansForThreading = !mi->referencesIdMD5().isEmpty(); + break; + case Aggregation::PerfectOnly: + mightHaveOtherMeansForThreading = false; + break; + default: + // BUG: there shouldn't be other values (NoThreading is excluded in an upper branch) + Q_ASSERT(false); + mightHaveOtherMeansForThreading = false; // make gcc happy + break; + } - if (mightHaveOtherMeansForThreading) { - // We might have other means for threading this message, wait until Pass2 - mUnassignedMessageListForPass2.append(mi); - } else { - // No other means for threading this message. This is either - // a standalone message or a thread leader. - // If there is no grouping in effect or thread leaders are just the "topmost" - // messages then we might be done with this one. - if ( - (mAggregation->grouping() == Aggregation::NoGrouping) || - (mAggregation->threadLeader() == Aggregation::TopmostMessage) - ) { - // We're done with this message: it will be surely either toplevel (no grouping in effect) - // or a thread leader with a well defined group. Do it :) - //qCDebug(MESSAGELIST_LOG) << "Setting message status from " << mi->threadingStatus() << " to non threadable (1) " << mi; - mi->setThreadingStatus(MessageItem::NonThreadable); - // Locate the parent group for this item - attachMessageToGroupHeader(mi); - // we're done with this message (also for Pass2) - } else { - // Threads belong to the most recent message in the thread. This means - // that we have to wait until Pass2 or Pass3 to assign a group. + if (mightHaveOtherMeansForThreading) { + // We might have other means for threading this message, wait until Pass2 mUnassignedMessageListForPass2.append(mi); + } else { + // No other means for threading this message. This is either + // a standalone message or a thread leader. + // If there is no grouping in effect or thread leaders are just the "topmost" + // messages then we might be done with this one. + if ( + (mAggregation->grouping() == Aggregation::NoGrouping) || + (mAggregation->threadLeader() == Aggregation::TopmostMessage) + ) { + // We're done with this message: it will be surely either toplevel (no grouping in effect) + // or a thread leader with a well defined group. Do it :) + //qCDebug(MESSAGELIST_LOG) << "Setting message status from " << mi->threadingStatus() << " to non threadable (1) " << mi; + mi->setThreadingStatus(MessageItem::NonThreadable); + // Locate the parent group for this item + attachMessageToGroupHeader(mi); + // we're done with this message (also for Pass2) + } else { + // Threads belong to the most recent message in the thread. This means + // that we have to wait until Pass2 or Pass3 to assign a group. + mUnassignedMessageListForPass2.append(mi); + } } } - } - if (needsImmediateReAttach && !mi->isViewable()) { - // The item gathered previously viewable children. They must be immediately - // re-shown. So this item must currently be attached to the view. - // This is a temporary measure: it will be probably still moved. - MessageItem *topmost = mi->topmostMessage(); - Q_ASSERT(topmost->threadingStatus() == MessageItem::ParentMissing); - attachMessageToGroupHeader(topmost); + if (needsImmediateReAttach && !mi->isViewable()) { + // The item gathered previously viewable children. They must be immediately + // re-shown. So this item must currently be attached to the view. + // This is a temporary measure: it will be probably still moved. + MessageItem *topmost = mi->topmostMessage(); + Q_ASSERT(topmost->threadingStatus() == MessageItem::ParentMissing); + attachMessageToGroupHeader(topmost); + } } } else { @@ -2897,8 +2983,7 @@ curIndex++; if ((curIndex % mViewItemJobStepMessageCheckCount) == 0) { - elapsed = tStart.msecsTo(QTime::currentTime()); - if ((elapsed > mViewItemJobStepChunkTimeout) || (elapsed < 0)) { + if (elapsedTimer.elapsed() > mViewItemJobStepChunkTimeout) { if (curIndex <= endIndex) { job->setCurrentIndex(curIndex); return ViewItemJobInterrupted; @@ -2913,7 +2998,7 @@ return ViewItemJobCompleted; } -ModelPrivate::ViewItemJobResult ModelPrivate::viewItemJobStepInternalForJobPass1Cleanup(ViewItemJob *job, const QTime &tStart) +ModelPrivate::ViewItemJobResult ModelPrivate::viewItemJobStepInternalForJobPass1Cleanup(ViewItemJob *job, const QElapsedTimer &elapsedTimer) { Q_ASSERT(mModelForItemFunctions); // UI must be not disconnected here // In this pass we remove the MessageItem objects that are present in the job @@ -2926,8 +3011,6 @@ // It's faster to traverse an array of N entries than to remove K>0 entries // one by one and to traverse the remaining N-K entries. - int elapsed; - // The begin index of our work int curIndex = job->currentIndex(); // The end index of our work. @@ -2960,6 +3043,10 @@ } } + // Remove the message from threading cache before we start moving up the + // children, so that they don't get mislead by the cache + mThreadingCache.expireParent(dyingMessage); + if (dyingMessage->parent()) { // Handle saving the current selection: if this item was the current before the step // then zero it out. We have killed it and it's OK for the current item to change. @@ -3101,8 +3188,7 @@ // code above can generate large message tree movements // for each single item we sweep in the invalidatedMessages list. if ((curIndex % mViewItemJobStepMessageCheckCount) == 0) { - elapsed = tStart.msecsTo(QTime::currentTime()); - if ((elapsed > mViewItemJobStepChunkTimeout) || (elapsed < 0)) { + if (elapsedTimer.elapsed() > mViewItemJobStepChunkTimeout) { if (curIndex <= endIndex) { job->setCurrentIndex(curIndex); return ViewItemJobInterrupted; @@ -3138,8 +3224,7 @@ // FIXME: We could take "larger" steps here if ((curIndex % mViewItemJobStepMessageCheckCount) == 0) { - elapsed = tStart.msecsTo(QTime::currentTime()); - if ((elapsed > mViewItemJobStepChunkTimeout) || (elapsed < 0)) { + if (elapsedTimer.elapsed() > mViewItemJobStepChunkTimeout) { if (it != mOrphanChildrenHash.end()) { return ViewItemJobInterrupted; } @@ -3150,7 +3235,7 @@ return ViewItemJobCompleted; } -ModelPrivate::ViewItemJobResult ModelPrivate::viewItemJobStepInternalForJobPass1Update(ViewItemJob *job, const QTime &tStart) +ModelPrivate::ViewItemJobResult ModelPrivate::viewItemJobStepInternalForJobPass1Update(ViewItemJob *job, const QElapsedTimer &elapsedTimer) { Q_ASSERT(mModelForItemFunctions); // UI must be not disconnected here @@ -3163,8 +3248,6 @@ // It's faster to traverse an array of N entries than to remove K>0 entries // one by one and to traverse the remaining N-K entries. - int elapsed; - // The begin index of our work int curIndex = job->currentIndex(); // The end index of our work. @@ -3281,8 +3364,7 @@ // code above can generate large message tree movements // for each single item we sweep in the messagesThatNeedUpdate list. if ((curIndex % mViewItemJobStepMessageCheckCount) == 0) { - elapsed = tStart.msecsTo(QTime::currentTime()); - if ((elapsed > mViewItemJobStepChunkTimeout) || (elapsed < 0)) { + if (elapsedTimer.elapsed() > mViewItemJobStepChunkTimeout) { if (curIndex <= endIndex) { job->setCurrentIndex(curIndex); return ViewItemJobInterrupted; @@ -3294,7 +3376,7 @@ return ViewItemJobCompleted; } -ModelPrivate::ViewItemJobResult ModelPrivate::viewItemJobStepInternalForJob(ViewItemJob *job, const QTime &tStart) +ModelPrivate::ViewItemJobResult ModelPrivate::viewItemJobStepInternalForJob(ViewItemJob *job, const QElapsedTimer &elapsedTimer) { // This function does a timed chunk of work for a single Fill View job. // It attempts to process messages until a timeout forces it to return to the caller. @@ -3303,11 +3385,9 @@ // to place debugger breakpoints then we need it explicited. // A (template) helper would need to pass many parameters and would not be inlined... - int elapsed; - if (job->currentPass() == ViewItemJob::Pass1Fill) { // We're in Pass1Fill of the job. - switch (viewItemJobStepInternalForJobPass1Fill(job, tStart)) { + switch (viewItemJobStepInternalForJobPass1Fill(job, elapsedTimer)) { case ViewItemJobInterrupted: // current job interrupted by timeout: propagate status to caller return ViewItemJobInterrupted; @@ -3322,8 +3402,7 @@ // of a small number of messages. At the end of each job check // the time used and if we're timeoutting and there is another job // then interrupt. - elapsed = tStart.msecsTo(QTime::currentTime()); - if ((elapsed > mViewItemJobStepChunkTimeout) || (elapsed < 0)) { + if (elapsedTimer.elapsed() > mViewItemJobStepChunkTimeout) { return ViewItemJobInterrupted; } // else proceed with the next pass break; @@ -3335,7 +3414,7 @@ } } else if (job->currentPass() == ViewItemJob::Pass1Cleanup) { // We're in Pass1Cleanup of the job. - switch (viewItemJobStepInternalForJobPass1Cleanup(job, tStart)) { + switch (viewItemJobStepInternalForJobPass1Cleanup(job, elapsedTimer)) { case ViewItemJobInterrupted: // current job interrupted by timeout: propagate status to caller return ViewItemJobInterrupted; @@ -3349,8 +3428,7 @@ // of a small number of messages. At the end of each job check // the time used and if we're timeoutting and there is another job // then interrupt. - elapsed = tStart.msecsTo(QTime::currentTime()); - if ((elapsed > mViewItemJobStepChunkTimeout) || (elapsed < 0)) { + if (elapsedTimer.elapsed() > mViewItemJobStepChunkTimeout) { return ViewItemJobInterrupted; } // else proceed with the next pass break; @@ -3362,7 +3440,7 @@ } } else if (job->currentPass() == ViewItemJob::Pass1Update) { // We're in Pass1Update of the job. - switch (viewItemJobStepInternalForJobPass1Update(job, tStart)) { + switch (viewItemJobStepInternalForJobPass1Update(job, elapsedTimer)) { case ViewItemJobInterrupted: // current job interrupted by timeout: propagate status to caller return ViewItemJobInterrupted; @@ -3378,8 +3456,7 @@ // of a small number of messages. At the end of each job check // the time used and if we're timeoutting and there is another job // then interrupt. - elapsed = tStart.msecsTo(QTime::currentTime()); - if ((elapsed > mViewItemJobStepChunkTimeout) || (elapsed < 0)) { + if (elapsedTimer.elapsed() > mViewItemJobStepChunkTimeout) { return ViewItemJobInterrupted; } // else proceed with the next pass break; @@ -3395,7 +3472,7 @@ if (job->currentPass() == ViewItemJob::Pass2) { // We're in Pass2 of the job. - switch (viewItemJobStepInternalForJobPass2(job, tStart)) { + switch (viewItemJobStepInternalForJobPass2(job, elapsedTimer)) { case ViewItemJobInterrupted: // current job interrupted by timeout: propagate status to caller return ViewItemJobInterrupted; @@ -3409,8 +3486,7 @@ // of a small number of messages. At the end of each job check // the time used and if we're timeoutting and there is another job // then interrupt. - elapsed = tStart.msecsTo(QTime::currentTime()); - if ((elapsed > mViewItemJobStepChunkTimeout) || (elapsed < 0)) { + if (elapsedTimer.elapsed() > mViewItemJobStepChunkTimeout) { return ViewItemJobInterrupted; } // else proceed with the next pass @@ -3425,7 +3501,7 @@ if (job->currentPass() == ViewItemJob::Pass3) { // We're in Pass3 of the job. - switch (viewItemJobStepInternalForJobPass3(job, tStart)) { + switch (viewItemJobStepInternalForJobPass3(job, elapsedTimer)) { case ViewItemJobInterrupted: // current job interrupted by timeout: propagate status to caller return ViewItemJobInterrupted; @@ -3439,8 +3515,7 @@ // of a small number of messages. At the end of each job check // the time used and if we're timeoutting and there is another job // then interrupt. - elapsed = tStart.msecsTo(QTime::currentTime()); - if ((elapsed > mViewItemJobStepChunkTimeout) || (elapsed < 0)) { + if (elapsedTimer.elapsed() > mViewItemJobStepChunkTimeout) { return ViewItemJobInterrupted; } // else proceed with the next pass @@ -3455,7 +3530,7 @@ if (job->currentPass() == ViewItemJob::Pass4) { // We're in Pass4 of the job. - switch (viewItemJobStepInternalForJobPass4(job, tStart)) { + switch (viewItemJobStepInternalForJobPass4(job, elapsedTimer)) { case ViewItemJobInterrupted: // current job interrupted by timeout: propagate status to caller return ViewItemJobInterrupted; @@ -3469,8 +3544,7 @@ // of a small number of messages. At the end of each job check // the time used and if we're timeoutting and there is another job // then interrupt. - elapsed = tStart.msecsTo(QTime::currentTime()); - if ((elapsed > mViewItemJobStepChunkTimeout) || (elapsed < 0)) { + if (elapsedTimer.elapsed() > mViewItemJobStepChunkTimeout) { return ViewItemJobInterrupted; } // else proceed with the next pass @@ -3484,7 +3558,7 @@ } // Pass4 has been already completed. Proceed to Pass5. - return viewItemJobStepInternalForJobPass5(job, tStart); + return viewItemJobStepInternalForJobPass5(job, elapsedTimer); } #ifdef KDEPIM_FOLDEROPEN_PROFILE @@ -3625,8 +3699,8 @@ // It attempts to do processing until it either runs out of jobs // to be done or a timeout forces it to interrupt and jump back to the caller. - QTime tStart = QTime::currentTime(); - int elapsed; + QElapsedTimer elapsedTimer; + elapsedTimer.start(); while (!mViewItemJobs.isEmpty()) { // Have a job to do. @@ -3685,7 +3759,7 @@ //mView->setUpdatesEnabled( false ); } - switch (viewItemJobStepInternalForJob(job, tStart)) { + switch (viewItemJobStepInternalForJob(job, elapsedTimer)) { case ViewItemJobInterrupted: { // current job interrupted by timeout: will propagate status to caller // but before this, give some feedback to the user @@ -3794,8 +3868,7 @@ // of a small number of messages. At the end of each job check // the time used and if we're timeoutting and there is another job // then interrupt. - elapsed = tStart.msecsTo(QTime::currentTime()); - if ((elapsed > mViewItemJobStepChunkTimeout) || (elapsed < 0)) { + if ((elapsedTimer.elapsed() > mViewItemJobStepChunkTimeout) || (elapsedTimer.elapsed() < 0)) { if (!mViewItemJobs.isEmpty()) { return ViewItemJobInterrupted; } diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/model.h kf5-messagelib-16.12.3/messagelist/src/core/model.h --- kf5-messagelib-16.04.3/messagelist/src/core/model.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/model.h 2017-03-06 12:30:37.000000000 +0000 @@ -223,15 +223,6 @@ void statusMessage(const QString &message); private: - Q_PRIVATE_SLOT(d, void checkIfDateChanged()) - Q_PRIVATE_SLOT(d, void viewItemJobStep()) - Q_PRIVATE_SLOT(d, void slotStorageModelRowsInserted(const QModelIndex &, int, int)) - Q_PRIVATE_SLOT(d, void slotStorageModelRowsRemoved(const QModelIndex &, int, int)) - Q_PRIVATE_SLOT(d, void slotStorageModelDataChanged(const QModelIndex &, const QModelIndex &)) - Q_PRIVATE_SLOT(d, void slotStorageModelHeaderDataChanged(Qt::Orientation, int, int)) - Q_PRIVATE_SLOT(d, void slotStorageModelLayoutChanged()) - Q_PRIVATE_SLOT(d, void slotApplyFilter()) - friend class ModelPrivate; ModelPrivate *const d; }; diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/model_p.h kf5-messagelib-16.12.3/messagelist/src/core/model_p.h --- kf5-messagelib-16.04.3/messagelist/src/core/model_p.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/model_p.h 2017-03-06 12:30:37.000000000 +0000 @@ -22,8 +22,12 @@ #define __MESSAGELIST_CORE_MODEL_P_H__ #include "model.h" +#include "threadingcache.h" #include #include + +class QElapsedTimer; + namespace MessageList { @@ -61,7 +65,11 @@ */ MessageItem *guessMessageParent(MessageItem *mi); - void attachMessageToParent(Item *pParent, MessageItem *mi); + enum AttachOptions { + SkipCacheUpdate = 0, + StoreInCache = 1 + }; + void attachMessageToParent(Item *pParent, MessageItem *mi, AttachOptions attachOptions = StoreInCache); void messageDetachedUpdateParentProperties(Item *oldParent, MessageItem *mi); void attachMessageToGroupHeader(MessageItem *mi); void attachGroup(GroupHeaderItem *ghi); @@ -71,16 +79,16 @@ ViewItemJobInterrupted }; ViewItemJobResult viewItemJobStepInternal(); - ViewItemJobResult viewItemJobStepInternalForJob(ViewItemJob *job, const QTime &tStart); + ViewItemJobResult viewItemJobStepInternalForJob(ViewItemJob *job, const QElapsedTimer &elapsedTimer); // FIXME: Those look like they should be made virtual in some job class! -> Refactor - ViewItemJobResult viewItemJobStepInternalForJobPass1Fill(ViewItemJob *job, const QTime &tStart); - ViewItemJobResult viewItemJobStepInternalForJobPass1Cleanup(ViewItemJob *job, const QTime &tStart); - ViewItemJobResult viewItemJobStepInternalForJobPass1Update(ViewItemJob *job, const QTime &tStart); - ViewItemJobResult viewItemJobStepInternalForJobPass2(ViewItemJob *job, const QTime &tStart); - ViewItemJobResult viewItemJobStepInternalForJobPass3(ViewItemJob *job, const QTime &tStart); - ViewItemJobResult viewItemJobStepInternalForJobPass4(ViewItemJob *job, const QTime &tStart); - ViewItemJobResult viewItemJobStepInternalForJobPass5(ViewItemJob *job, const QTime &tStart); + ViewItemJobResult viewItemJobStepInternalForJobPass1Fill(ViewItemJob *job, const QElapsedTimer &elapsedTimer); + ViewItemJobResult viewItemJobStepInternalForJobPass1Cleanup(ViewItemJob *job, const QElapsedTimer &elapsedTimer); + ViewItemJobResult viewItemJobStepInternalForJobPass1Update(ViewItemJob *job, const QElapsedTimer &elapsedTimer); + ViewItemJobResult viewItemJobStepInternalForJobPass2(ViewItemJob *job, const QElapsedTimer &elapsedTimer); + ViewItemJobResult viewItemJobStepInternalForJobPass3(ViewItemJob *job, const QElapsedTimer &elapsedTimer); + ViewItemJobResult viewItemJobStepInternalForJobPass4(ViewItemJob *job, const QElapsedTimer &elapsedTimer); + ViewItemJobResult viewItemJobStepInternalForJobPass5(ViewItemJob *job, const QElapsedTimer &elapsedTimer); void clearJobList(); void clearUnassignedMessageLists(); void clearOrphanChildrenHash(); @@ -344,6 +352,16 @@ qint32 mCachedWatchedOrIgnoredStatusBits; /** + * The labels for week days names group items, cached, so we don't query QLocale multiple times. + */ + QMap mCachedDayNameLabel; + + /* + * The labels for month names group items, cached, so we don't query QLocale multiple times. + */ + QMap mCachedMonthNameLabel; + + /** * Flag signaling a possibly long job batch. This is checked by other * classes and used to display some kind of "please wait" feedback to the user. */ @@ -417,6 +435,18 @@ * virtual (so it's always an indirect function call). Caching makes sense. */ bool mStorageModelContainsOutboundMessages; + + /** + * Vector of signal-slot connections between StorageModel and us + */ + QVector mStorageModelConnections; + + /** + * Caches child - parent relation based on Akonadi ID and persists the cache + * in a file for each Collection. This allows for very fast reconstruction of + * threading. + */ + ThreadingCache mThreadingCache; }; } // namespace Core diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/settings.kcfg kf5-messagelib-16.12.3/messagelist/src/core/settings.kcfg --- kf5-messagelib-16.04.3/messagelist/src/core/settings.kcfg 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/settings.kcfg 2017-03-06 12:30:37.000000000 +0000 @@ -11,16 +11,6 @@ Enable this option to display tooltips when hovering over an item in the message list. - - true - - With this option enabled the tab bar will be displayed only when there are two or more tabs. With this option disabled the tab bar will be always shown. When the tab bar is hidden you can always open a folder in a new tab by middle-clicking it. - - - false - - Enable this option if you want to have a close button on each tab. - true diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/themedelegate.cpp kf5-messagelib-16.12.3/messagelist/src/core/themedelegate.cpp --- kf5-messagelib-16.04.3/messagelist/src/core/themedelegate.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/themedelegate.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -582,7 +582,7 @@ return; // hm... } - QStyleOptionViewItemV4 opt = option; + QStyleOptionViewItem opt = option; initStyleOption(&opt, index); opt.text.clear(); // draw no text for me, please.. I'll do it in a while @@ -695,8 +695,8 @@ } break; case Theme::PlainJoinedRect: { - int rleft = (opt.viewItemPosition == QStyleOptionViewItemV4::Beginning) || (opt.viewItemPosition == QStyleOptionViewItemV4::OnlyOne) ? left : opt.rect.left(); - int rright = (opt.viewItemPosition == QStyleOptionViewItemV4::End) || (opt.viewItemPosition == QStyleOptionViewItemV4::OnlyOne) ? right : opt.rect.left() + opt.rect.width(); + int rleft = (opt.viewItemPosition == QStyleOptionViewItem::Beginning) || (opt.viewItemPosition == QStyleOptionViewItem::OnlyOne) ? left : opt.rect.left(); + int rright = (opt.viewItemPosition == QStyleOptionViewItem::End) || (opt.viewItemPosition == QStyleOptionViewItem::OnlyOne) ? right : opt.rect.left() + opt.rect.width(); painter->fillRect( QRect(rleft, top, rright - rleft, opt.rect.height() - (gGroupHeaderInnerVerticalMargin * 2)), QBrush(mGroupHeaderBackgroundColor) @@ -704,19 +704,19 @@ } break; case Theme::RoundedJoinedRect: { - if (opt.viewItemPosition == QStyleOptionViewItemV4::Middle) { + if (opt.viewItemPosition == QStyleOptionViewItem::Middle) { painter->fillRect( QRect(opt.rect.left(), top, opt.rect.width(), opt.rect.height() - (gGroupHeaderInnerVerticalMargin * 2)), QBrush(mGroupHeaderBackgroundColor) ); break; // don't fall through } - if (opt.viewItemPosition == QStyleOptionViewItemV4::Beginning) { + if (opt.viewItemPosition == QStyleOptionViewItem::Beginning) { painter->fillRect( QRect(opt.rect.left() + opt.rect.width() - 10, top, 10, opt.rect.height() - (gGroupHeaderInnerVerticalMargin * 2)), QBrush(mGroupHeaderBackgroundColor) ); - } else if (opt.viewItemPosition == QStyleOptionViewItemV4::End) { + } else if (opt.viewItemPosition == QStyleOptionViewItem::End) { painter->fillRect( QRect(opt.rect.left(), top, 10, opt.rect.height() - (gGroupHeaderInnerVerticalMargin * 2)), QBrush(mGroupHeaderBackgroundColor) @@ -749,19 +749,19 @@ QLinearGradient gradient(0, top, 0, top + opt.rect.height() - (gGroupHeaderInnerVerticalMargin * 2)); gradient.setColorAt(0.0, KColorScheme::shade(mGroupHeaderBackgroundColor, KColorScheme::LightShade, 0.3)); gradient.setColorAt(1.0, mGroupHeaderBackgroundColor); - if (opt.viewItemPosition == QStyleOptionViewItemV4::Middle) { + if (opt.viewItemPosition == QStyleOptionViewItem::Middle) { painter->fillRect( QRect(opt.rect.left(), top, opt.rect.width(), opt.rect.height() - (gGroupHeaderInnerVerticalMargin * 2)), QBrush(gradient) ); break; // don't fall through } - if (opt.viewItemPosition == QStyleOptionViewItemV4::Beginning) { + if (opt.viewItemPosition == QStyleOptionViewItem::Beginning) { painter->fillRect( QRect(opt.rect.left() + opt.rect.width() - 10, top, 10, opt.rect.height() - (gGroupHeaderInnerVerticalMargin * 2)), QBrush(gradient) ); - } else if (opt.viewItemPosition == QStyleOptionViewItemV4::End) { + } else if (opt.viewItemPosition == QStyleOptionViewItem::End) { painter->fillRect( QRect(opt.rect.left(), top, 10, opt.rect.height() - (gGroupHeaderInnerVerticalMargin * 2)), QBrush(gradient) @@ -797,14 +797,14 @@ // oxygen, for instance, has a nice graphics for selected items opt.rect = QRect(left, top, right - left, opt.rect.height() - (gGroupHeaderInnerVerticalMargin * 2)); opt.state |= QStyle::State_Selected; - opt.viewItemPosition = QStyleOptionViewItemV4::OnlyOne; + opt.viewItemPosition = QStyleOptionViewItem::OnlyOne; opt.palette.setColor(cg, QPalette::Highlight, mGroupHeaderBackgroundColor); style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, mItemView); } break; case Theme::StyledJoinedRect: { - int rleft = (opt.viewItemPosition == QStyleOptionViewItemV4::Beginning) || (opt.viewItemPosition == QStyleOptionViewItemV4::OnlyOne) ? left : opt.rect.left(); - int rright = (opt.viewItemPosition == QStyleOptionViewItemV4::End) || (opt.viewItemPosition == QStyleOptionViewItemV4::OnlyOne) ? right : opt.rect.left() + opt.rect.width(); + int rleft = (opt.viewItemPosition == QStyleOptionViewItem::Beginning) || (opt.viewItemPosition == QStyleOptionViewItem::OnlyOne) ? left : opt.rect.left(); + int rright = (opt.viewItemPosition == QStyleOptionViewItem::End) || (opt.viewItemPosition == QStyleOptionViewItem::OnlyOne) ? right : opt.rect.left() + opt.rect.width(); opt.rect = QRect(rleft, top, rright - rleft, opt.rect.height() - (gGroupHeaderInnerVerticalMargin * 2)); opt.state |= QStyle::State_Selected; opt.palette.setColor(cg, QPalette::Highlight, mGroupHeaderBackgroundColor); @@ -871,15 +871,15 @@ paint_right_aligned_elided_text(item->subject(), ci, painter, l, top, r, layoutDir, font); break; case Theme::ContentItem::SenderOrReceiver: - paint_right_aligned_elided_text(MessageCore::StringUtil::stripEmailAddr(item->senderOrReceiver()), + paint_right_aligned_elided_text(item->displaySenderOrReceiver(), ci, painter, l, top, r, layoutDir, font); break; case Theme::ContentItem::Receiver: - paint_right_aligned_elided_text(MessageCore::StringUtil::stripEmailAddr(item->receiver()), + paint_right_aligned_elided_text(item->displayReceiver(), ci, painter, l, top, r, layoutDir, font); break; case Theme::ContentItem::Sender: - paint_right_aligned_elided_text(MessageCore::StringUtil::stripEmailAddr(item->sender()), + paint_right_aligned_elided_text(item->displaySender(), ci, painter, l, top, r, layoutDir, font); break; case Theme::ContentItem::Date: @@ -1030,15 +1030,15 @@ paint_left_aligned_elided_text(item->subject(), ci, painter, l, top, r, layoutDir, font); break; case Theme::ContentItem::SenderOrReceiver: - paint_left_aligned_elided_text(MessageCore::StringUtil::stripEmailAddr(item->senderOrReceiver()), + paint_left_aligned_elided_text(item->displaySenderOrReceiver(), ci, painter, l, top, r, layoutDir, font); break; case Theme::ContentItem::Receiver: - paint_left_aligned_elided_text(MessageCore::StringUtil::stripEmailAddr(item->receiver()), + paint_left_aligned_elided_text(item->displayReceiver(), ci, painter, l, top, r, layoutDir, font); break; case Theme::ContentItem::Sender: - paint_left_aligned_elided_text(MessageCore::StringUtil::stripEmailAddr(item->sender()), + paint_left_aligned_elided_text(item->displaySender(), ci, painter, l, top, r, layoutDir, font); break; case Theme::ContentItem::Date: @@ -1282,15 +1282,15 @@ compute_bounding_rect_for_right_aligned_elided_text(mHitItem->subject(), ci, l, top, r, mHitContentItemRect, layoutDir, font); break; case Theme::ContentItem::SenderOrReceiver: - compute_bounding_rect_for_right_aligned_elided_text(MessageCore::StringUtil::stripEmailAddr(mHitItem->senderOrReceiver()), + compute_bounding_rect_for_right_aligned_elided_text(mHitItem->displaySenderOrReceiver(), ci, l, top, r, mHitContentItemRect, layoutDir, font); break; case Theme::ContentItem::Receiver: - compute_bounding_rect_for_right_aligned_elided_text(MessageCore::StringUtil::stripEmailAddr(mHitItem->receiver()), + compute_bounding_rect_for_right_aligned_elided_text(mHitItem->displayReceiver(), ci, l, top, r, mHitContentItemRect, layoutDir, font); break; case Theme::ContentItem::Sender: - compute_bounding_rect_for_right_aligned_elided_text(MessageCore::StringUtil::stripEmailAddr(mHitItem->sender()), + compute_bounding_rect_for_right_aligned_elided_text(mHitItem->displaySender(), ci, l, top, r, mHitContentItemRect, layoutDir, font); break; case Theme::ContentItem::Date: @@ -1428,15 +1428,15 @@ compute_bounding_rect_for_left_aligned_elided_text(mHitItem->subject(), ci, l, top, r, mHitContentItemRect, layoutDir, font); break; case Theme::ContentItem::SenderOrReceiver: - compute_bounding_rect_for_left_aligned_elided_text(MessageCore::StringUtil::stripEmailAddr(mHitItem->senderOrReceiver()), + compute_bounding_rect_for_left_aligned_elided_text(mHitItem->displaySenderOrReceiver(), ci, l, top, r, mHitContentItemRect, layoutDir, font); break; case Theme::ContentItem::Receiver: - compute_bounding_rect_for_left_aligned_elided_text(MessageCore::StringUtil::stripEmailAddr(mHitItem->receiver()), + compute_bounding_rect_for_left_aligned_elided_text(mHitItem->displayReceiver(), ci, l, top, r, mHitContentItemRect, layoutDir, font); break; case Theme::ContentItem::Sender: - compute_bounding_rect_for_left_aligned_elided_text(MessageCore::StringUtil::stripEmailAddr(mHitItem->sender()), + compute_bounding_rect_for_left_aligned_elided_text(mHitItem->displaySender(), ci, l, top, r, mHitContentItemRect, layoutDir, font); break; case Theme::ContentItem::Date: @@ -1713,7 +1713,12 @@ mCachedMessageItemSizeHint = QSize(); mCachedGroupHeaderItemSizeHint = QSize(); - QFont font = QFontDatabase::systemFont(QFontDatabase::GeneralFont); + QFont font; + if (MessageCore::MessageCoreSettings::self()->useDefaultFonts()) { + font = QFontDatabase::systemFont(QFontDatabase::GeneralFont); + } else { + font = MessageListSettings::self()->messageListFont(); + } sFontCache[Normal] = font; sFontMetricsCache[Normal] = QFontMetrics(font); font.setBold(true); diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/threadingcache.cpp kf5-messagelib-16.12.3/messagelist/src/core/threadingcache.cpp --- kf5-messagelib-16.04.3/messagelist/src/core/threadingcache.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/threadingcache.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,190 @@ +/****************************************************************************** + * + * Copyright 2016 Daniel Vrátil + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + *******************************************************************************/ + +#include "threadingcache.h" +#include "aggregation.h" +#include "messagelist_debug.h" + +#include +#include +#include + +using namespace MessageList::Core; + +namespace +{ +struct CacheHeader { + int version; + Aggregation::Grouping grouping; + Aggregation::Threading threading; + Aggregation::ThreadLeader threadLeader; + int cacheSize; +}; + +QDataStream &operator<<(QDataStream &stream, const CacheHeader &header) +{ + return stream << header.version + << (qint8)header.grouping + << (qint8)header.threading + << (qint8)header.threadLeader + << header.cacheSize; +} + +QDataStream &operator>>(QDataStream &stream, CacheHeader &header) +{ + return stream >> header.version + >> (qint8 &)header.grouping + >> (qint8 &)header.threading + >> (qint8 &)header.threadLeader + >> header.cacheSize; +} + +} + +ThreadingCache::ThreadingCache() + : mGrouping(Aggregation::NoGrouping) + , mThreading(Aggregation::NoThreading) + , mThreadLeader(Aggregation::TopmostMessage) + , mEnabled(true) +{ +} + +ThreadingCache::~ThreadingCache() +{ + if (mEnabled && !mCacheId.isEmpty()) { + save(); + } +} + +bool ThreadingCache::isEnabled() const +{ + return mEnabled; +} + +void ThreadingCache::setEnabled(bool enabled) +{ + mEnabled = enabled; +} + +void ThreadingCache::load(const QString &id, const Aggregation *aggregation) +{ + mParentCache.clear(); + mItemCache.clear(); + + mCacheId = id; + mThreading = aggregation->threading(); + mThreadLeader = aggregation->threadLeader(); + mGrouping = aggregation->grouping(); + mEnabled = true; + + const QString cacheFileName = QStandardPaths::locate(QStandardPaths::CacheLocation, + QStringLiteral("/messagelist/threading/%1").arg(id), + QStandardPaths::LocateFile); + if (cacheFileName.isEmpty()) { + qCDebug(MESSAGELIST_LOG) << "No threading cache file for collection" << id; + return; + } + qCDebug(MESSAGELIST_LOG) << "Loading threading cache file" << cacheFileName; + + QFile cacheFile(cacheFileName); + if (!cacheFile.open(QIODevice::ReadOnly)) { + qCWarning(MESSAGELIST_LOG) << "Failed to open cache file" << cacheFileName << ":" << cacheFile.errorString(); + return; + } + + QDataStream stream(&cacheFile); + CacheHeader cacheHeader = {}; + stream >> cacheHeader; + + if (cacheHeader.version != 1) { + // Unknown version + qCDebug(MESSAGELIST_LOG) << "\tCache file unusable, unknown version"; + cacheFile.close(); + cacheFile.remove(); + return; + } + + if (cacheHeader.grouping != mGrouping + || cacheHeader.threading != mThreading + || cacheHeader.threadLeader != mThreadLeader) { + // The cache is valid, but for a different grouping/threading configuration. + qCDebug(MESSAGELIST_LOG) << "\tCache file unusable, threading configuration mismatch"; + cacheFile.close(); + cacheFile.remove(); + return; + } + + mItemCache.reserve(cacheHeader.cacheSize); + mParentCache.reserve(cacheHeader.cacheSize); + + for (int i = 0; i < cacheHeader.cacheSize; ++i) { + qint64 child, parent; + stream >> child >> parent; + if (stream.status() != QDataStream::Ok) { + // Suspect corrupted cache + qCDebug(MESSAGELIST_LOG) << "\tCache file unusable, data truncated"; + cacheFile.close(); + cacheFile.remove(); + mParentCache.clear(); + return; + } + + mParentCache.insert(child, parent); + } + + qCDebug(MESSAGELIST_LOG) << "Loaded" << cacheHeader.cacheSize << "entries from threading cache"; +} + +void ThreadingCache::save() +{ + if (mCacheId.isEmpty()) { + return; + } + const QDir cacheDir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation); + if (!cacheDir.exists(QStringLiteral("messagelist/threading"))) { + if (!cacheDir.mkpath(QStringLiteral("messagelist/threading"))) { + qCWarning(MESSAGELIST_LOG) << "Failed to create cache directory."; + return; + } + } + + QFile cacheFile(cacheDir.filePath(QStringLiteral("messagelist/threading/%1").arg(mCacheId))); + if (!cacheFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { + qCWarning(MESSAGELIST_LOG) << "Failed to create cache file:" << cacheFile.errorString() << " mCacheId " << mCacheId; + return; + } + + qCDebug(MESSAGELIST_LOG) << "Saving threading cache to" << cacheFile.fileName(); + + QDataStream stream(&cacheFile); + CacheHeader cacheHeader{ 1, // version + mGrouping, + mThreading, + mThreadLeader, + mParentCache.size() + }; + stream << cacheHeader; + cacheFile.flush(); + + for (auto iter = mParentCache.cbegin(), end = mParentCache.cend(); iter != end; ++iter) { + stream << iter.key() << iter.value(); + } + qCDebug(MESSAGELIST_LOG) << "Saved" << mParentCache.count() << "cache entries"; +} diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/threadingcache.h kf5-messagelib-16.12.3/messagelist/src/core/threadingcache.h --- kf5-messagelib-16.04.3/messagelist/src/core/threadingcache.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/threadingcache.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,99 @@ +/****************************************************************************** + * + * Copyright 2016 Daniel Vrátil + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + *******************************************************************************/ + +#ifndef THREADINGCACHE_H +#define THREADINGCACHE_H + +#include +#include "messageitem.h" + +namespace MessageList +{ + +namespace Core +{ + +class Aggregation; + +class ThreadingCache +{ +public: + ThreadingCache(); + ~ThreadingCache(); + + bool isEnabled() const; + void setEnabled(bool enabled); + + void load(const QString &id, const Aggregation *aggregation); + void save(); + + void addItemToCache(MessageItem *mi) + { + if (mEnabled) { + mItemCache.insert(mi->itemId(), mi); + } + } + + void updateParent(MessageItem *mi, MessageItem *parent) + { + if (mEnabled) { + mParentCache.insert(mi->itemId(), parent ? parent->itemId() : 0); + } + } + + MessageItem *parentForItem(MessageItem *mi, qint64 &parentId) const + { + if (mEnabled) { + parentId = mParentCache.value(mi->itemId(), -1); + if (parentId > -1) { + return mItemCache.value(parentId, Q_NULLPTR); + } else { + return Q_NULLPTR; + } + } else { + return Q_NULLPTR; + } + } + + void expireParent(MessageItem *item) + { + if (mEnabled) { + mParentCache.remove(item->itemId()); + mItemCache.remove(item->itemId()); + } + } + +private: + QString cacheFilePath(const QString &id) const; + + QHash mParentCache; + QHash mItemCache; + + QString mCacheId; + Aggregation::Grouping mGrouping; + Aggregation::Threading mThreading; + Aggregation::ThreadLeader mThreadLeader; + bool mEnabled; +}; + +} // namespace Core +} // namespace MessageList + +#endif diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/view.cpp kf5-messagelib-16.12.3/messagelist/src/core/view.cpp --- kf5-messagelib-16.04.3/messagelist/src/core/view.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/view.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -85,8 +85,6 @@ View::View(Widget *pParent) : QTreeView(pParent), d(new Private(this, pParent)) { - setFocusPolicy(Qt::NoFocus); - d->mSaveThemeColumnStateTimer = new QTimer(); connect(d->mSaveThemeColumnStateTimer, &QTimer::timeout, this, &View::saveThemeColumnState); @@ -557,7 +555,7 @@ (*it)->setCurrentWidth(columnWidth); //Laurent Bug 358855 - message list column widths lost when program closed // I need to investigate if this code is still necessary (all method) - //header()->resizeSection(idx, columnWidth); + header()->resizeSection(idx, columnWidth); } else { (*it)->setCurrentWidth(-1); } @@ -1482,8 +1480,6 @@ return false; } - setFocus(); - if (it->parent() != d->mModel->rootItem()) { ensureDisplayedWithParentsExpanded(it); } @@ -1526,8 +1522,6 @@ return false; } - setFocus(); - if (it->parent() != d->mModel->rootItem()) { ensureDisplayedWithParentsExpanded(it); } @@ -1565,8 +1559,6 @@ return false; } - setFocus(); - if (it->parent() != d->mModel->rootItem()) { ensureDisplayedWithParentsExpanded(it); } @@ -1591,8 +1583,6 @@ return false; } - setFocus(); - if (it->parent() != d->mModel->rootItem()) { ensureDisplayedWithParentsExpanded(it); } @@ -1617,8 +1607,6 @@ return; } - setFocus(); - if (selectionModel()->isSelected(idx)) { return; } @@ -1643,7 +1631,6 @@ Q_ASSERT(it != d->mModel->rootItem()); // must never happen (obviously) - setFocus(); ensureDisplayedWithParentsExpanded(it); QModelIndex idx = d->mModel->index(it, 0); @@ -1672,7 +1659,6 @@ Q_ASSERT(it != d->mModel->rootItem()); - setFocus(); ensureDisplayedWithParentsExpanded(it); QModelIndex idx = d->mModel->index(it, 0); @@ -1950,10 +1936,7 @@ QModelIndex current = currentIndex(); if (!current.isValid()) { - if (d->mLastCurrentItem) { - d->mWidget->viewMessageSelected(Q_NULLPTR); - d->mLastCurrentItem = Q_NULLPTR; - } + d->mLastCurrentItem = Q_NULLPTR; d->mWidget->viewMessageSelected(Q_NULLPTR); d->mWidget->viewSelectionChanged(); return; @@ -2395,7 +2378,7 @@ "
" \ "" \ "" - ).arg(txtColorName).arg(bckColorName).arg(mi->subject().toHtmlEscaped()).arg(textDirection); + ).arg(txtColorName, bckColorName, mi->subject().toHtmlEscaped(), textDirection); tip += QLatin1String( "" \ @@ -2416,12 +2399,12 @@ ""); if (textIsLeftToRight) { - tip += htmlCodeForStandardRow.arg(i18n("From")).arg(MessageCore::StringUtil::stripEmailAddr(mi->sender())); - tip += htmlCodeForStandardRow.arg(i18nc("Receiver of the email", "To")).arg(MessageCore::StringUtil::stripEmailAddr(mi->receiver())); - tip += htmlCodeForStandardRow.arg(i18n("Date")).arg(mi->formattedDate()); + tip += htmlCodeForStandardRow.arg(i18n("From"), mi->displaySender()); + tip += htmlCodeForStandardRow.arg(i18nc("Receiver of the email", "To"), mi->displayReceiver()); + tip += htmlCodeForStandardRow.arg(i18n("Date"), mi->formattedDate()); } else { - tip += htmlCodeForStandardRow.arg(MessageCore::StringUtil::stripEmailAddr(mi->sender())).arg(i18n("From")); - tip += htmlCodeForStandardRow.arg(MessageCore::StringUtil::stripEmailAddr(mi->receiver())).arg(i18nc("Receiver of the email", "To")); + tip += htmlCodeForStandardRow.arg(mi->displaySender(), i18n("From")); + tip += htmlCodeForStandardRow.arg(mi->displayReceiver(), i18nc("Receiver of the email", "To")); tip += htmlCodeForStandardRow.arg(mi->formattedDate(), i18n("Date")); } @@ -2460,7 +2443,7 @@ } tip += QLatin1String( - "" \ "" \ "" ); diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/widgetbase.cpp kf5-messagelib-16.12.3/messagelist/src/core/widgetbase.cpp --- kf5-messagelib-16.04.3/messagelist/src/core/widgetbase.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/widgetbase.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -20,6 +20,7 @@ #include "core/widgetbase.h" #include "core/widgets/quicksearchwarning.h" +#include "core/widgets/searchcollectionindexingwarning.h" #include "core/aggregation.h" #include "core/theme.h" #include "core/filter.h" @@ -60,6 +61,8 @@ public: Private(Widget *owner) : q(owner), + quickSearchWarning(Q_NULLPTR), + searchCollectionIndexingWarning(Q_NULLPTR), quickSearchLine(Q_NULLPTR), mView(Q_NULLPTR), mSearchTimer(Q_NULLPTR), @@ -97,6 +100,7 @@ Widget *const q; QuickSearchWarning *quickSearchWarning; + SearchCollectionIndexingWarning *searchCollectionIndexingWarning; QuickSearchLine *quickSearchLine; View *mView; QString mLastAggregationId; @@ -135,7 +139,6 @@ d->quickSearchLine = new QuickSearchLine; d->quickSearchLine->setObjectName(QStringLiteral("quicksearchline")); - connect(d->quickSearchLine, &QuickSearchLine::clearButtonClicked, this, &Widget::searchEditClearButtonClicked); connect(d->quickSearchLine, &QuickSearchLine::searchEditTextEdited, this, &Widget::searchEditTextEdited); @@ -144,6 +147,8 @@ g->addWidget(d->quickSearchLine, 0); d->quickSearchWarning = new QuickSearchWarning(this); g->addWidget(d->quickSearchWarning, 0); + d->searchCollectionIndexingWarning = new SearchCollectionIndexingWarning(this); + g->addWidget(d->searchCollectionIndexingWarning, 0); d->mView = new View(this); d->mView->setFrameStyle(QFrame::NoFrame); @@ -380,7 +385,7 @@ return; } - QMenu *menu = dynamic_cast< QMenu * >(sender()); + QMenu *menu = qobject_cast< QMenu * >(sender()); if (!menu) { return; } @@ -444,7 +449,7 @@ return; // nuthin to do } - QAction *act = dynamic_cast< QAction * >(sender()); + QAction *act = qobject_cast< QAction * >(sender()); if (!act) { return; } @@ -475,7 +480,7 @@ void Widget::aggregationMenuAboutToShow() { - QMenu *menu = dynamic_cast< QMenu * >(sender()); + QMenu *menu = qobject_cast< QMenu * >(sender()); if (!menu) { return; } @@ -518,7 +523,7 @@ void Widget::aggregationSelected(bool) { - QAction *act = dynamic_cast< QAction * >(sender()); + QAction *act = qobject_cast< QAction * >(sender()); if (!act) { return; } @@ -563,7 +568,7 @@ return; } - QMenu *menu = dynamic_cast< QMenu * >(sender()); + QMenu *menu = qobject_cast< QMenu * >(sender()); if (!menu) { return; } @@ -1108,10 +1113,10 @@ void Widget::setCurrentFolder(const Akonadi::Collection &collection) { d->mCurrentFolder = collection; + d->searchCollectionIndexingWarning->setCollection(collection); } bool Widget::searchEditHasFocus() const { return d->quickSearchLine->searchEdit()->hasFocus(); } - diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/widgets/quicksearchline.cpp kf5-messagelib-16.12.3/messagelist/src/core/widgets/quicksearchline.cpp --- kf5-messagelib-16.04.3/messagelist/src/core/widgets/quicksearchline.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/widgets/quicksearchline.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -37,10 +37,9 @@ QuickSearchLine::QuickSearchLine(QWidget *parent) : QWidget(parent) { - QVBoxLayout *vbox = new QVBoxLayout; + QVBoxLayout *vbox = new QVBoxLayout(this); vbox->setMargin(0); vbox->setSpacing(0); - setLayout(vbox); QWidget *w = new QWidget; QHBoxLayout *hbox = new QHBoxLayout; diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/widgets/quicksearchline.h kf5-messagelib-16.12.3/messagelist/src/core/widgets/quicksearchline.h --- kf5-messagelib-16.04.3/messagelist/src/core/widgets/quicksearchline.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/widgets/quicksearchline.h 2017-03-06 12:30:37.000000000 +0000 @@ -25,7 +25,6 @@ #include "messagelist_export.h" #include -class KLineEdit; class KComboBox; class QToolButton; namespace MessageList @@ -49,7 +48,7 @@ SearchAgainstTo = 32 }; - Q_ENUMS(SearchOption) + Q_ENUM(SearchOption) Q_DECLARE_FLAGS(SearchOptions, SearchOption) SearchOptions searchOptions() const; diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/widgets/searchcollectionindexingwarning.cpp kf5-messagelib-16.12.3/messagelist/src/core/widgets/searchcollectionindexingwarning.cpp --- kf5-messagelib-16.04.3/messagelist/src/core/widgets/searchcollectionindexingwarning.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/widgets/searchcollectionindexingwarning.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "searchcollectionindexingwarning.h" +#include "messagelist_debug.h" + +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include + +#include + +using namespace MessageList::Core; + +SearchCollectionIndexingWarning::SearchCollectionIndexingWarning(QWidget *parent) + : KMessageWidget(parent), + mIndexedItems(new Akonadi::Search::PIM::IndexedItems(this)) +{ + setVisible(false); + setWordWrap(true); + setText(i18n("Some of the search folders in this query are still being indexed " + "or are excluded from indexing completely. The results below may be incomplete.")); + setCloseButtonVisible(true); + setMessageType(Information); +} + +SearchCollectionIndexingWarning::~SearchCollectionIndexingWarning() +{ +} + +Akonadi::CollectionFetchJob *SearchCollectionIndexingWarning::fetchCollections(const Akonadi::Collection::List &cols, bool recursive) +{ + const Akonadi::CollectionFetchJob::Type type = recursive ? Akonadi::CollectionFetchJob::Recursive : Akonadi::CollectionFetchJob::Base; + Akonadi::CollectionFetchJob *fetch = new Akonadi::CollectionFetchJob(cols, type, this); + fetch->fetchScope().setAncestorRetrieval(Akonadi::CollectionFetchScope::None); + fetch->fetchScope().setContentMimeTypes(QStringList() << Akonadi::Collection::mimeType() + << QStringLiteral("message/rfc822")); + fetch->fetchScope().setIncludeStatistics(true); + return fetch; +} + +void SearchCollectionIndexingWarning::setCollection(const Akonadi::Collection &collection) +{ + if (collection == mCollection) { + return; + } + + animatedHide(); + + mCollection = collection; + mCollections.clear(); + + // Not a search collection? + if (!collection.hasAttribute()) { + return; + } + + Akonadi::PersistentSearchAttribute *attr = collection.attribute(); + Akonadi::Collection::List cols; + Q_FOREACH (qint64 col, attr->queryCollections()) { + cols.push_back(Akonadi::Collection(col)); + } + if (cols.isEmpty()) { + return; + } + + // First retrieve the top-level collections + Akonadi::CollectionFetchJob *fetch = fetchCollections(cols, false); + fetch->setProperty("recursiveQuery", attr->isRecursive()); + connect(fetch, SIGNAL(finished(KJob*)), this, SLOT(queryRootCollectionFetchFinished(KJob*))); +} + +void SearchCollectionIndexingWarning::queryRootCollectionFetchFinished(KJob *job) +{ + if (job->error()) { + qCWarning(MESSAGELIST_LOG) << job->errorString(); + return; + } + + // Store the root collections + mCollections = qobject_cast(job)->collections(); + + if (job->property("recursiveQuery").toBool()) { + // Fetch all descendants, if necessary + Akonadi::CollectionFetchJob *fetch = fetchCollections(mCollections, true); + connect(fetch, &Akonadi::CollectionFetchJob::finished, this, &SearchCollectionIndexingWarning::queryCollectionFetchFinished); + } else { + queryIndexerStatus(); + } +} + +void SearchCollectionIndexingWarning::queryCollectionFetchFinished(KJob *job) +{ + if (job->error()) { + qCWarning(MESSAGELIST_LOG) << job->errorString(); + return; + } + + mCollections += qobject_cast(job)->collections(); + queryIndexerStatus(); +} + +void SearchCollectionIndexingWarning::queryIndexerStatus() +{ + bool allFullyIndexed = true; + Q_FOREACH (const Akonadi::Collection &col, mCollections) { + if (col.hasAttribute()) { + continue; + } + if (PimCommon::Util::isImapResource(col.resource()) && !col.cachePolicy().localParts().contains(QLatin1String("RFC822"))) { + continue; + } + const qlonglong result = mIndexedItems->indexedItems(col.id()); + + qCDebug(MESSAGELIST_LOG) << "Collection:" << col.displayName() << "(" << col.id() << "), count:" << col.statistics().count() << ", index:" << result; + if (col.statistics().count() != result) { + allFullyIndexed = false; + break; + } + } + if (!allFullyIndexed) { + animatedShow(); + } +} diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/widgets/searchcollectionindexingwarning.h kf5-messagelib-16.12.3/messagelist/src/core/widgets/searchcollectionindexingwarning.h --- kf5-messagelib-16.04.3/messagelist/src/core/widgets/searchcollectionindexingwarning.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/widgets/searchcollectionindexingwarning.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef SEARCHCOLLECTIONINDEXINGWARNING_H +#define SEARCHCOLLECTIONINDEXINGWARNING_H + +#include +#include +#include "messagelist_export.h" +class KJob; + +namespace Akonadi +{ +namespace Search +{ +namespace PIM +{ +class IndexedItems; +} +} +} +namespace Akonadi +{ +class CollectionFetchJob; +} +namespace MessageList +{ +namespace Core +{ +class MESSAGELIST_EXPORT SearchCollectionIndexingWarning : public KMessageWidget +{ + Q_OBJECT +public: + explicit SearchCollectionIndexingWarning(QWidget *parent = Q_NULLPTR); + ~SearchCollectionIndexingWarning(); + + void setCollection(const Akonadi::Collection &collection); + +private Q_SLOTS: + void queryRootCollectionFetchFinished(KJob *job); + void queryCollectionFetchFinished(KJob *job); + +private: + Akonadi::CollectionFetchJob *fetchCollections(const Akonadi::Collection::List &cols, bool recursive); + void queryIndexerStatus(); + + Akonadi::Collection mCollection; + Akonadi::Collection::List mCollections; + Akonadi::Search::PIM::IndexedItems *mIndexedItems; +}; +} +} + +#endif // SEARCHCOLLECTIONINDEXINGWARNING_H diff -Nru kf5-messagelib-16.04.3/messagelist/src/core/widgets/searchlinestatus.cpp kf5-messagelib-16.12.3/messagelist/src/core/widgets/searchlinestatus.cpp --- kf5-messagelib-16.04.3/messagelist/src/core/widgets/searchlinestatus.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/core/widgets/searchlinestatus.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -180,11 +180,11 @@ i18nc("@action:inmenu Status of a message", "Action Item"), Akonadi::MessageStatus::statusToAct().toQInt32()); - createFilterAction(QIcon(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("messagelist/pics/mail-thread-watch.png"))), + createFilterAction(QIcon::fromTheme(QStringLiteral("mail-thread-watch.png")), i18nc("@action:inmenu Status of a message", "Watched"), Akonadi::MessageStatus::statusWatched().toQInt32()); - createFilterAction(QIcon(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("messagelist/pics/mail-thread-ignored.png"))), + createFilterAction(QIcon::fromTheme(QStringLiteral("mail-thread-ignored.png")), i18nc("@action:inmenu Status of a message", "Ignored"), Akonadi::MessageStatus::statusIgnored().toQInt32()); diff -Nru kf5-messagelib-16.04.3/messagelist/src/pane.cpp kf5-messagelib-16.12.3/messagelist/src/pane.cpp --- kf5-messagelib-16.04.3/messagelist/src/pane.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/pane.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -164,7 +164,7 @@ connect(d->mCloseTabButton, SIGNAL(clicked()), SLOT(onCloseTabClicked())); - setTabsClosable(MessageListSettings::self()->tabsHaveCloseButton()); + setTabsClosable(true); connect(this, SIGNAL(tabCloseRequested(int)), this, SLOT(slotTabCloseRequested(int))); readConfig(restoreSession); @@ -252,7 +252,7 @@ d->mCloseTabAction = new QAction(i18n("Close Tab"), this); d->mXmlGuiClient->actionCollection()->addAction(QStringLiteral("close_current_tab"), d->mCloseTabAction); - d->mXmlGuiClient->actionCollection()->setDefaultShortcut(d->mCloseTabAction, QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_W)); + d->mXmlGuiClient->actionCollection()->setDefaultShortcuts(d->mCloseTabAction, QList() << QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_W) << QKeySequence(Qt::CTRL + Qt::Key_W)); connect(d->mCloseTabAction, SIGNAL(triggered(bool)), SLOT(onCloseTabClicked())); d->mActionMenu->addAction(d->mCloseTabAction); d->mCloseTabAction->setEnabled(false); @@ -826,29 +826,20 @@ mMoveTabLeftAction->setEnabled(enableAction); } - if (MessageListSettings::self()->autoHideTabBarWithSingleTab()) { - q->tabBar()->setVisible(enableAction); - if (enableAction) { - q->setCornerWidget(mNewTabButton, Qt::TopLeftCorner); - mNewTabButton->setVisible(true); - } else { - q->setCornerWidget(Q_NULLPTR, Qt::TopLeftCorner); - } - } else { - q->tabBar()->setVisible(true); + q->tabBar()->setVisible(enableAction); + if (enableAction) { q->setCornerWidget(mNewTabButton, Qt::TopLeftCorner); mNewTabButton->setVisible(true); + } else { + q->setCornerWidget(Q_NULLPTR, Qt::TopLeftCorner); } - const bool hasCloseButton(MessageListSettings::self()->tabsHaveCloseButton()); - q->setTabsClosable(hasCloseButton); - if (hasCloseButton) { - const int numberOfTab(q->count()); - if (numberOfTab == 1) { - q->tabBar()->tabButton(0, QTabBar::RightSide)->setEnabled(false); - } else if (numberOfTab > 1) { - q->tabBar()->tabButton(0, QTabBar::RightSide)->setEnabled(true); - } + q->setTabsClosable(true); + const int numberOfTab(q->count()); + if (numberOfTab == 1) { + q->tabBar()->tabButton(0, QTabBar::RightSide)->setEnabled(false); + } else if (numberOfTab > 1) { + q->tabBar()->tabButton(0, QTabBar::RightSide)->setEnabled(true); } } @@ -1159,7 +1150,7 @@ void Pane::sortOrderMenuAboutToShow() { - QMenu *menu = dynamic_cast< QMenu * >(sender()); + QMenu *menu = qobject_cast< QMenu * >(sender()); if (!menu) { return; } @@ -1169,7 +1160,7 @@ void Pane::aggregationMenuAboutToShow() { - QMenu *menu = dynamic_cast< QMenu * >(sender()); + QMenu *menu = qobject_cast< QMenu * >(sender()); if (!menu) { return; } @@ -1179,7 +1170,7 @@ void Pane::themeMenuAboutToShow() { - QMenu *menu = dynamic_cast< QMenu * >(sender()); + QMenu *menu = qobject_cast< QMenu * >(sender()); if (!menu) { return; } Binary files /tmp/tmp7NwPti/OIbdaZrzaC/kf5-messagelib-16.04.3/messagelist/src/pics/mail-deleted.png and /tmp/tmp7NwPti/buqaWXjLeX/kf5-messagelib-16.12.3/messagelist/src/pics/mail-deleted.png differ Binary files /tmp/tmp7NwPti/OIbdaZrzaC/kf5-messagelib-16.04.3/messagelist/src/pics/mail-thread-ignored.png and /tmp/tmp7NwPti/buqaWXjLeX/kf5-messagelib-16.12.3/messagelist/src/pics/mail-thread-ignored.png differ Binary files /tmp/tmp7NwPti/OIbdaZrzaC/kf5-messagelib-16.04.3/messagelist/src/pics/mail-thread-watch.png and /tmp/tmp7NwPti/buqaWXjLeX/kf5-messagelib-16.12.3/messagelist/src/pics/mail-thread-watch.png differ diff -Nru kf5-messagelib-16.04.3/messagelist/src/storagemodel.cpp kf5-messagelib-16.12.3/messagelist/src/storagemodel.cpp --- kf5-messagelib-16.04.3/messagelist/src/storagemodel.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/storagemodel.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -169,7 +169,7 @@ } ids.sort(); - return ids.join(QStringLiteral(":")); + return ids.join(QLatin1Char(':')); } bool StorageModel::isOutBoundFolder(const Akonadi::Collection &c) const diff -Nru kf5-messagelib-16.04.3/messagelist/src/utils/aggregationcombobox.cpp kf5-messagelib-16.12.3/messagelist/src/utils/aggregationcombobox.cpp --- kf5-messagelib-16.04.3/messagelist/src/utils/aggregationcombobox.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/utils/aggregationcombobox.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -79,11 +79,6 @@ } } -void AggregationComboBox::writeStorageModelConfig(const Akonadi::Collection &col, bool isPrivateSetting) const -{ - writeStorageModelConfig(QString::number(col.id()), isPrivateSetting); -} - void AggregationComboBox::readStorageModelConfig(const QString &id, bool &isPrivateSetting) { if (Manager::instance()) { diff -Nru kf5-messagelib-16.04.3/messagelist/src/utils/aggregationcombobox.h kf5-messagelib-16.12.3/messagelist/src/utils/aggregationcombobox.h --- kf5-messagelib-16.04.3/messagelist/src/utils/aggregationcombobox.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/utils/aggregationcombobox.h 2017-03-06 12:30:37.000000000 +0000 @@ -53,7 +53,6 @@ void writeDefaultConfig() const; void writeStorageModelConfig(MessageList::Core::StorageModel *storageModel, bool isPrivateSetting) const; - void writeStorageModelConfig(const Akonadi::Collection &col, bool isPrivateSetting) const; void writeStorageModelConfig(const QString &id, bool isPrivateSetting) const; void readStorageModelConfig(MessageList::Core::StorageModel *storageModel, bool &isPrivateSetting); diff -Nru kf5-messagelib-16.04.3/messagelist/src/utils/configureaggregationsdialog.cpp kf5-messagelib-16.12.3/messagelist/src/utils/configureaggregationsdialog.cpp --- kf5-messagelib-16.04.3/messagelist/src/utils/configureaggregationsdialog.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/utils/configureaggregationsdialog.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -107,8 +107,7 @@ setAttribute(Qt::WA_DeleteOnClose); setWindowModality(Qt::ApplicationModal); // FIXME: Sure ? QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - QVBoxLayout *mainLayout = new QVBoxLayout; - setLayout(mainLayout); + QVBoxLayout *mainLayout = new QVBoxLayout(this); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); @@ -120,6 +119,7 @@ mainLayout->addWidget(buttonBox); QGridLayout *g = new QGridLayout(base); + g->setMargin(0); d->mAggregationList = new AggregationListWidget(base); d->mAggregationList->setSelectionMode(QAbstractItemView::ExtendedSelection); diff -Nru kf5-messagelib-16.04.3/messagelist/src/utils/configurethemesdialog.cpp kf5-messagelib-16.12.3/messagelist/src/utils/configurethemesdialog.cpp --- kf5-messagelib-16.04.3/messagelist/src/utils/configurethemesdialog.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/utils/configurethemesdialog.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -98,9 +98,8 @@ { setAttribute(Qt::WA_DeleteOnClose); setWindowModality(Qt::ApplicationModal); // FIXME: Sure ? + QVBoxLayout *mainLayout = new QVBoxLayout(this); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - QVBoxLayout *mainLayout = new QVBoxLayout; - setLayout(mainLayout); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); diff -Nru kf5-messagelib-16.04.3/messagelist/src/utils/themecombobox.cpp kf5-messagelib-16.12.3/messagelist/src/utils/themecombobox.cpp --- kf5-messagelib-16.04.3/messagelist/src/utils/themecombobox.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/utils/themecombobox.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -59,13 +59,6 @@ } } -void ThemeComboBox::writeStorageModelConfig(const Akonadi::Collection &col, bool isPrivateSetting) const -{ - if (col.isValid()) { - writeStorageModelConfig(QString::number(col.id()), isPrivateSetting); - } -} - void ThemeComboBox::writeStorageModelConfig(MessageList::Core::StorageModel *storageModel, bool isPrivateSetting) const { writeStorageModelConfig(storageModel->id(), isPrivateSetting); diff -Nru kf5-messagelib-16.04.3/messagelist/src/utils/themecombobox.h kf5-messagelib-16.12.3/messagelist/src/utils/themecombobox.h --- kf5-messagelib-16.04.3/messagelist/src/utils/themecombobox.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/utils/themecombobox.h 2017-03-06 12:30:37.000000000 +0000 @@ -54,7 +54,6 @@ void writeDefaultConfig() const; void writeStorageModelConfig(MessageList::Core::StorageModel *storageModel, bool isPrivateSetting) const; - void writeStorageModelConfig(const Akonadi::Collection &col, bool isPrivateSetting) const; void writeStorageModelConfig(const QString &id, bool isPrivateSetting)const; void readStorageModelConfig(const Akonadi::Collection &col, bool &isPrivateSetting); diff -Nru kf5-messagelib-16.04.3/messagelist/src/utils/themeeditor.cpp kf5-messagelib-16.12.3/messagelist/src/utils/themeeditor.cpp --- kf5-messagelib-16.04.3/messagelist/src/utils/themeeditor.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messagelist/src/utils/themeeditor.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -69,9 +69,8 @@ { //setAttribute( Qt::WA_DeleteOnClose ); setWindowModality(Qt::ApplicationModal); // FIXME: Sure ? - QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - QVBoxLayout *mainLayout = new QVBoxLayout; - setLayout(mainLayout); + QVBoxLayout *mainLayout = new QVBoxLayout(this); + QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/attachmenttest.cpp kf5-messagelib-16.12.3/messageviewer/autotests/attachmenttest.cpp --- kf5-messagelib-16.04.3/messageviewer/autotests/attachmenttest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/attachmenttest.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -/* - Copyright (c) 2015 Volker Krause - - This library 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. - - This library 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 this library; see the file COPYING.LIB. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. -*/ -#include "viewer/objecttreeparser.h" -#include "util.h" - -#include "viewer/objecttreeemptysource.h" - -#include "setupenv.h" - -#include - -using namespace MessageViewer; - -class AttachmentTest : public QObject -{ - Q_OBJECT -private Q_SLOTS: - void initTestCase(); - void testEncryptedAttachment_data(); - void testEncryptedAttachment(); -}; - -QTEST_MAIN(AttachmentTest) - -void AttachmentTest::initTestCase() -{ - MessageViewer::Test::setupEnv(); -} - -void AttachmentTest::testEncryptedAttachment_data() -{ - QTest::addColumn("mbox"); - QTest::newRow("encrypted") << "openpgp-encrypted-two-attachments.mbox"; - QTest::newRow("signed") << "openpgp-signed-two-attachments.mbox"; - QTest::newRow("signed+encrypted") << "openpgp-signed-encrypted-two-attachments.mbox"; - QTest::newRow("encrypted+partial signed") << "openpgp-encrypted-partially-signed-attachments.mbox"; -} - -void AttachmentTest::testEncryptedAttachment() -{ - QFETCH(QString, mbox); - auto msg = readAndParseMail(mbox); - NodeHelper nodeHelper; - EmptySource emptySource; - emptySource.setAllowDecryption(true); - ObjectTreeParser otp(&emptySource, &nodeHelper); - otp.parseObjectTree(msg.data()); - - auto attachments = msg->attachments(); - auto encAtts = nodeHelper.attachmentsOfExtraContents(); - QCOMPARE(attachments.size() + encAtts.size(), 2); -} - -#include "attachmenttest.moc" diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/CMakeLists.txt kf5-messagelib-16.12.3/messageviewer/autotests/CMakeLists.txt --- kf5-messagelib-16.04.3/messageviewer/autotests/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -1,17 +1,12 @@ set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}) -add_definitions( -DMAIL_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data" ) - -include(${CMAKE_SOURCE_DIR}/cmake/modules/kdepim_add_gpg_crypto_test.cmake) - -add_definitions(-DKMAIL_UNITTESTS=YES) # convenience macro to add qtest unit tests macro(add_messageviewer_unittest _source) get_filename_component(_name ${_source} NAME_WE) - ecm_add_test(${_source} util.cpp setupenv.cpp testcsshelper.cpp ../src/viewer/cryptohelper.cpp + ecm_add_test(${_source} TEST_NAME ${_name} NAME_PREFIX "messageviewer-" - LINK_LIBRARIES KF5::MessageViewer KF5::Libkleo KF5::QGpgme Qt5::Test Qt5::WebKitWidgets KF5::KIOCore KF5::Mime KF5::AkonadiCore KF5::AkonadiNotes KF5::CalendarCore + LINK_LIBRARIES KF5::MessageViewer KF5::Libkleo QGpgme Qt5::Test KF5::KIOCore KF5::Mime KF5::AkonadiCore KF5::AkonadiNotes KF5::CalendarCore ) endmacro () @@ -20,48 +15,19 @@ ecm_add_test(${_source} ${_additionalSource} TEST_NAME ${_name} NAME_PREFIX "messageviewer-" - LINK_LIBRARIES KF5::MessageViewer Qt5::Test KF5::IconThemes KF5::XmlGui Qt5::WebKitWidgets + LINK_LIBRARIES KF5::MessageViewer Qt5::Test KF5::IconThemes KF5::XmlGui KF5::I18n ) endmacro () -macro(add_messageviewer_crypto_unittest _source) - set(_test ${_source} util.cpp) - get_filename_component(_name ${_source} NAME_WE) - add_executable( ${_name} ${_test} setupenv.cpp testcsshelper.cpp ) - ecm_mark_as_test(messageviewer-${_name}) - target_link_libraries( ${_name} - KF5::MessageViewer - KF5::Libkleo - KF5::QGpgme - Qt5::Test - Qt5::WebKitWidgets - KF5::KIOCore - KF5::Mime - KF5::AkonadiCore - KF5::AkonadiNotes - KF5::CalendarCore - ) - add_gpg_crypto_test(${_name} messageviewer-${_name}) -endmacro () - -add_messageviewer_crypto_unittest( objecttreeparsertest.cpp ) -add_messageviewer_crypto_unittest( rendertest.cpp ) -add_messageviewer_crypto_unittest( unencryptedmessagetest.cpp ) -add_messageviewer_crypto_unittest( attachmenttest.cpp ) -add_messageviewer_unittest( csshelpertest.cpp ) -add_messageviewer_unittest( cryptohelpertest.cpp ) add_messageviewer_unittest( messagedisplayformatattributetest.cpp ) -add_messageviewer_unittest( nodehelpertest.cpp ) -add_messageviewer_class_unittest(zoomactionmenutest.cpp "../src/widgets/zoomactionmenu.cpp") # convenience macro to add qtest unit tests macro(add_messageviewer_mailsourceviewbrowserwidget_unittest _source) - set(_test ${_source} util.cpp) get_filename_component(_name ${_source} NAME_WE) - ecm_add_test(${_source} util.cpp ../src/widgets/mailsourceviewtextbrowserwidget.cpp ../src/findbar/findbarbase.cpp ../src/findbar/findbarsourceview.cpp + ecm_add_test(${_source} ../src/widgets/mailsourceviewtextbrowserwidget.cpp ../src/findbar/findbarsourceview.cpp TEST_NAME ${_name} NAME_PREFIX "messageviewer-" - LINK_LIBRARIES Qt5::Test Qt5::Gui Qt5::Widgets KF5::KIOCore KF5::Mime KF5::AkonadiCore KF5::CalendarCore KF5::PimTextEdit KF5::PimCommon KF5::MessageViewer + LINK_LIBRARIES Qt5::Test Qt5::Gui Qt5::Widgets KF5::KIOCore KF5::Mime KF5::AkonadiCore KF5::CalendarCore KF5::PimTextEdit KF5::PimCommon KF5::MessageViewer KF5::WebEngineViewer ) endmacro () @@ -69,12 +35,6 @@ add_messageviewer_mailsourceviewbrowserwidget_unittest( mailsourceviewtextbrowserwidgettest.cpp ) ########### viewertest_gui ############### -ecm_add_test(converthtmltoplaintexttest.cpp ../src/viewer/converthtmltoplaintext.cpp - TEST_NAME converthtmltoplaintexttest - NAME_PREFIX "messageviewer-" - LINK_LIBRARIES Qt5::Test Grantlee5::TextDocument -) - set(KDEPIMLIBS_RUN_ISOLATED_TESTS TRUE) set(KDEPIMLIBS_RUN_SQLITE_ISOLATED_TESTS TRUE) diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/converthtmltoplaintexttest.cpp kf5-messagelib-16.12.3/messageviewer/autotests/converthtmltoplaintexttest.cpp --- kf5-messagelib-16.04.3/messageviewer/autotests/converthtmltoplaintexttest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/converthtmltoplaintexttest.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ -/* - Copyright (c) 2015-2016 Montel Laurent - - This library 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. - - This library 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 this library; see the file COPYING.LIB. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. - -*/ - -#include "converthtmltoplaintexttest.h" -#include "../src/viewer/converthtmltoplaintext.h" -#include - -ConvertHtmlToPlainTextTest::ConvertHtmlToPlainTextTest(QObject *parent) - : QObject(parent) -{ - -} - -ConvertHtmlToPlainTextTest::~ConvertHtmlToPlainTextTest() -{ - -} - -void ConvertHtmlToPlainTextTest::shouldHaveDefaultValue() -{ - MessageViewer::ConvertHtmlToPlainText convert; - QVERIFY(convert.htmlString().isEmpty()); -} - -void ConvertHtmlToPlainTextTest::shouldReturnEmptyStringIfInputTextIsEmpty() -{ - MessageViewer::ConvertHtmlToPlainText convert; - convert.setHtmlString(QString()); - QVERIFY(convert.generatePlainText().isEmpty()); -} - -void ConvertHtmlToPlainTextTest::shouldReturnNotEmptyStringIfInputTextIsNotEmpty() -{ - MessageViewer::ConvertHtmlToPlainText convert; - const QString str = QStringLiteral("foo bla"); - convert.setHtmlString(str); - const QString result = convert.generatePlainText(); - QVERIFY(!result.isEmpty()); - QCOMPARE(result, QString(str + QLatin1String("\n"))); -} - -void ConvertHtmlToPlainTextTest::shouldConvertToPlainText_data() -{ - QTest::addColumn("inputText"); - QTest::addColumn("convertedText"); - QTest::newRow("plainText") << "foo" << "foo\n"; - QTest::newRow("htmlText") << "Hi! This is a KDE test" << "Hi! This is a KDE test\n"; - QTest::newRow("htmlTextWithBold") << "Hi! This is a KDE test" << "*Hi!* This is a KDE test\n"; - QTest::newRow("htmlTextWithH1") << "

Hi!

This is a KDE test" << "*Hi!*\nThis is a KDE test\n"; - QTest::newRow("htmlTextWithUnderLine") << "Hi! This is a KDE test" << "_Hi!_ This is a KDE test\n"; -} - -void ConvertHtmlToPlainTextTest::shouldConvertToPlainText() -{ - QFETCH(QString, inputText); - QFETCH(QString, convertedText); - - MessageViewer::ConvertHtmlToPlainText convert; - convert.setHtmlString(inputText); - const QString result = convert.generatePlainText(); - QVERIFY(!result.isEmpty()); - QCOMPARE(result, convertedText); -} - -QTEST_MAIN(ConvertHtmlToPlainTextTest) diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/converthtmltoplaintexttest.h kf5-messagelib-16.12.3/messageviewer/autotests/converthtmltoplaintexttest.h --- kf5-messagelib-16.04.3/messageviewer/autotests/converthtmltoplaintexttest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/converthtmltoplaintexttest.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -/* - Copyright (c) 2015-2016 Montel Laurent - - This library 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. - - This library 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 this library; see the file COPYING.LIB. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. - -*/ - -#ifndef CONVERTHTMLTOPLAINTEXTTEST_H -#define CONVERTHTMLTOPLAINTEXTTEST_H - -#include - -class ConvertHtmlToPlainTextTest : public QObject -{ - Q_OBJECT -public: - explicit ConvertHtmlToPlainTextTest(QObject *parent = Q_NULLPTR); - ~ConvertHtmlToPlainTextTest(); - -private Q_SLOTS: - void shouldHaveDefaultValue(); - void shouldReturnEmptyStringIfInputTextIsEmpty(); - void shouldReturnNotEmptyStringIfInputTextIsNotEmpty(); - void shouldConvertToPlainText_data(); - void shouldConvertToPlainText(); -}; - -#endif // CONVERTHTMLTOPLAINTEXTTEST_H diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/cryptohelpertest.cpp kf5-messagelib-16.12.3/messageviewer/autotests/cryptohelpertest.cpp --- kf5-messagelib-16.04.3/messageviewer/autotests/cryptohelpertest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/cryptohelpertest.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,145 +0,0 @@ -/* Copyright 2015 Sandro Knauß - - 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) version 3 or any later version - accepted by the membership of KDE e.V. (or its successor approved - by the membership of KDE e.V.), which shall act as a proxy - defined in Section 14 of version 3 of the license. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#include "cryptohelpertest.h" - -#include "viewer/cryptohelper.h" - -#include -#include - -using namespace MessageViewer; - -void CryptoHelperTest::testPMFDEmpty() -{ - QCOMPARE(prepareMessageForDecryption("").count(), 0); -} - -void CryptoHelperTest::testPMFDWithNoPGPBlock() -{ - const QByteArray text = "testblabla"; - const QList blocks = prepareMessageForDecryption(text); - QCOMPARE(blocks.count(), 1); - QCOMPARE(blocks[0].text(), text); - QCOMPARE(blocks[0].type(), NoPgpBlock); -} - -void CryptoHelperTest::testPGPBlockType() -{ - const QString blockText = QStringLiteral("text"); - const QString preString = QStringLiteral("before\n"); - for (int i = 1; i <= PrivateKeyBlock; ++i) { - QString name; - switch (i) { - case PgpMessageBlock: - name = QStringLiteral("MESSAGE"); - break; - case MultiPgpMessageBlock: - name = QStringLiteral("MESSAGE PART"); - break; - case SignatureBlock: - name = QStringLiteral("SIGNATURE"); - break; - case ClearsignedBlock: - name = QStringLiteral("SIGNED MESSAGE"); - break; - case PublicKeyBlock: - name = QStringLiteral("PUBLIC KEY BLOCK"); - break; - case PrivateKeyBlock: - name = QStringLiteral("PRIVATE KEY BLOCK"); - break; - } - QString text = QLatin1String("-----BEGIN PGP ") + name + QLatin1String("\n") + blockText; - QList blocks = prepareMessageForDecryption(preString.toLatin1() + text.toLatin1()); - QCOMPARE(blocks.count(), 1); - QCOMPARE(blocks[0].type(), UnknownBlock); - - text += QLatin1String("\n-----END PGP ") + name + QLatin1String("\n"); - blocks = prepareMessageForDecryption(preString.toLatin1() + text.toLatin1()); - QCOMPARE(blocks.count(), 2); - QCOMPARE(blocks[1].text(), text.toLatin1()); - QCOMPARE(blocks[1].type(), static_cast(i)); - } -} - -void CryptoHelperTest::testDeterminePGPBlockType() -{ - const QString blockText = QStringLiteral("text"); - for (int i = 1; i <= PrivateKeyBlock; ++i) { - QString name; - switch (i) { - - case PgpMessageBlock: - name = QStringLiteral("MESSAGE"); - break; - case MultiPgpMessageBlock: - name = QStringLiteral("MESSAGE PART"); - break; - case SignatureBlock: - name = QStringLiteral("SIGNATURE"); - break; - case ClearsignedBlock: - name = QStringLiteral("SIGNED MESSAGE"); - break; - case PublicKeyBlock: - name = QStringLiteral("PUBLIC KEY BLOCK"); - break; - case PrivateKeyBlock: - name = QStringLiteral("PRIVATE KEY BLOCK"); - break; - } - const QString text = QLatin1String("-----BEGIN PGP ") + name + QLatin1String("\n") + blockText + QLatin1String("\n"); - const Block block = Block(text.toLatin1()); - QCOMPARE(block.text(), text.toLatin1()); - QCOMPARE(block.type(), static_cast(i)); - } -} - -void CryptoHelperTest::testEmbededPGPBlock() -{ - const QByteArray text = QByteArray("before\n-----BEGIN PGP MESSAGE-----\ncrypted - you see :)\n-----END PGP MESSAGE-----\nafter"); - const QList blocks = prepareMessageForDecryption(text); - QCOMPARE(blocks.count(), 3); - QCOMPARE(blocks[0].text(), QByteArray("before\n")); - QCOMPARE(blocks[1].text(), QByteArray("-----BEGIN PGP MESSAGE-----\ncrypted - you see :)\n-----END PGP MESSAGE-----\n")); - QCOMPARE(blocks[2].text(), QByteArray("after")); -} - -void CryptoHelperTest::testClearSignedMessage() -{ - const QByteArray text = QByteArray("before\n-----BEGIN PGP SIGNED MESSAGE-----\nsigned content\n-----BEGIN PGP SIGNATURE-----\nfancy signature\n-----END PGP SIGNATURE-----\nafter"); - const QList blocks = prepareMessageForDecryption(text); - QCOMPARE(blocks.count(), 3); - QCOMPARE(blocks[0].text(), QByteArray("before\n")); - QCOMPARE(blocks[1].text(), QByteArray("-----BEGIN PGP SIGNED MESSAGE-----\nsigned content\n-----BEGIN PGP SIGNATURE-----\nfancy signature\n-----END PGP SIGNATURE-----\n")); - QCOMPARE(blocks[2].text(), QByteArray("after")); -} - -void CryptoHelperTest::testMultipleBlockMessage() -{ - const QByteArray text = QByteArray("before\n-----BEGIN PGP SIGNED MESSAGE-----\nsigned content\n-----BEGIN PGP SIGNATURE-----\nfancy signature\n-----END PGP SIGNATURE-----\nafter\n-----BEGIN PGP MESSAGE-----\ncrypted - you see :)\n-----END PGP MESSAGE-----\n"); - const QList blocks = prepareMessageForDecryption(text); - QCOMPARE(blocks.count(), 4); - QCOMPARE(blocks[0].text(), QByteArray("before\n")); - QCOMPARE(blocks[1].text(), QByteArray("-----BEGIN PGP SIGNED MESSAGE-----\nsigned content\n-----BEGIN PGP SIGNATURE-----\nfancy signature\n-----END PGP SIGNATURE-----\n")); - QCOMPARE(blocks[2].text(), QByteArray("after\n")); - QCOMPARE(blocks[3].text(), QByteArray("-----BEGIN PGP MESSAGE-----\ncrypted - you see :)\n-----END PGP MESSAGE-----\n")); -} - -QTEST_KDEMAIN(CryptoHelperTest, GUI) diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/cryptohelpertest.h kf5-messagelib-16.12.3/messageviewer/autotests/cryptohelpertest.h --- kf5-messagelib-16.04.3/messageviewer/autotests/cryptohelpertest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/cryptohelpertest.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -/* Copyright 2009 Thomas McGuire - - 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) version 3 or any later version - accepted by the membership of KDE e.V. (or its successor approved - by the membership of KDE e.V.), which shall act as a proxy - defined in Section 14 of version 3 of the license. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#ifndef CRYPTOHELPERTEST_H -#define CRYPTOHELPERTEST_H - -#include - -namespace MessageViewer -{ - -class CryptoHelperTest : public QObject -{ - Q_OBJECT - -private Q_SLOTS: - void testPMFDEmpty(); - void testPMFDWithNoPGPBlock(); - void testPGPBlockType(); - void testDeterminePGPBlockType(); - void testEmbededPGPBlock(); - void testClearSignedMessage(); - void testMultipleBlockMessage(); -}; - -} -#endif diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/csshelpertest.cpp kf5-messagelib-16.12.3/messageviewer/autotests/csshelpertest.cpp --- kf5-messagelib-16.04.3/messageviewer/autotests/csshelpertest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/csshelpertest.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -/* - Copyright (c) 2016 Sandro Knauß - - This library 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. - - This library 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 this library; see the file COPYING.LIB. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. -*/ - -#include "csshelpertest.h" -#include "testcsshelper.h" - -#include - -using namespace MessageViewer; - -QTEST_MAIN(CSSHelperTest) - -void CSSHelperTest::testCssDefinition() -{ - // load css header - QFile cssFile(QStringLiteral(MAIL_DATA_DIR) + QStringLiteral("/mailheader.css")); - QVERIFY(cssFile.open(QIODevice::ReadOnly)); - - QImage paintDevice; - TestCSSHelper cssHelper(&paintDevice); - - QCOMPARE(cssHelper.cssDefinitions(false).trimmed(), QString::fromUtf8(cssFile.readAll().trimmed())); -} diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/csshelpertest.h kf5-messagelib-16.12.3/messageviewer/autotests/csshelpertest.h --- kf5-messagelib-16.04.3/messageviewer/autotests/csshelpertest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/csshelpertest.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -/* - Copyright (c) 2016 Sandro Knauß - - This library 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. - - This library 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 this library; see the file COPYING.LIB. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. -*/ - -#ifndef CSSHELPERTEST_H -#define CSSHELPERTEST_H - -#include - -class CSSHelperTest : public QObject -{ - Q_OBJECT - -private Q_SLOTS: - void testCssDefinition(); -}; - -#endif \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/encapsulated-with-attachment.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/encapsulated-with-attachment.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/encapsulated-with-attachment.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/encapsulated-with-attachment.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -From: Thomas McGuire -Subject: Fwd: Test with attachment -Date: Wed, 5 Aug 2009 10:58:27 +0200 -MIME-Version: 1.0 -Content-Type: Multipart/Mixed; - boundary="Boundary-00=_zmUeKB+A8hGfCVZ" - - ---Boundary-00=_zmUeKB+A8hGfCVZ -Content-Type: text/plain; - charset="iso-8859-15" -Content-Transfer-Encoding: 7bit -Content-Disposition: inline - -This is the first encapsulating message. - ---Boundary-00=_zmUeKB+A8hGfCVZ -Content-Type: message/rfc822; - name="forwarded message" -Content-Transfer-Encoding: 7bit -Content-Description: Thomas McGuire : Test with attachment -Content-Disposition: inline - -From: Thomas McGuire -Subject: Test with attachment -Date: Wed, 5 Aug 2009 10:57:58 +0200 -MIME-Version: 1.0 -Content-Type: Multipart/Mixed; - boundary="Boundary-00=_WmUeKQpGb0DHyx1" - ---Boundary-00=_WmUeKQpGb0DHyx1 -Content-Type: text/plain; - charset="us-ascii" -Content-Transfer-Encoding: 7bit -Content-Disposition: inline - - - - -This is the second encapsulated message. - ---Boundary-00=_WmUeKQpGb0DHyx1 -Content-Type: text/plain; - name="attachment.txt" -Content-Transfer-Encoding: 7bit -Content-Disposition: attachment; - filename="attachment.txt" - -This is an attachment. - ---Boundary-00=_WmUeKQpGb0DHyx1-- - ---Boundary-00=_zmUeKB+A8hGfCVZ-- diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/encapsulated-with-attachment.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/encapsulated-with-attachment.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/encapsulated-with-attachment.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/encapsulated-with-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ - - - - -
- - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/forward-openpgp-signed-encrypted.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/forward-openpgp-signed-encrypted.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/forward-openpgp-signed-encrypted.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/forward-openpgp-signed-encrypted.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -From test@kolab.org Wed, 08 Sep 2010 17:52:37 +0200 -From: OpenPGP Test -Subject: Fwd: OpenPGP signed and encrypted -Date: Wed, 08 Sep 2010 17:52:37 +0200 -User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) -MIME-Version: 1.0 -Content-Type: multipart/mixed; boundary="nextPart2148910.9CGjQOYhYJ" -Content-Transfer-Encoding: 7Bit - - ---nextPart2148910.9CGjQOYhYJ -Content-Transfer-Encoding: 7Bit -Content-Type: text/plain; charset="us-ascii" - -bla bla bla ---nextPart2148910.9CGjQOYhYJ -Content-Type: message/rfc822 -Content-Disposition: inline; filename="forwarded message" -Content-Description: OpenPGP Test : OpenPGP signed and encrypted - -From: OpenPGP Test -To: test@kolab.org -Subject: OpenPGP signed and encrypted -Date: Tue, 07 Sep 2010 18:08:44 +0200 -User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) -MIME-Version: 1.0 -Content-Type: multipart/encrypted; boundary="nextPart25203163.0xtB501Z4V"; protocol="application/pgp-encrypted" -Content-Transfer-Encoding: 7Bit - - ---nextPart25203163.0xtB501Z4V -Content-Type: application/pgp-encrypted -Content-Disposition: attachment - -Version: 1 ---nextPart25203163.0xtB501Z4V -Content-Type: application/octet-stream -Content-Disposition: inline; filename="msg.asc" - ------BEGIN PGP MESSAGE----- -Version: GnuPG v2.0.15 (GNU/Linux) - -hQEMAwzOQ1qnzNo7AQf7BFYWaGiCTGtXY59bSh3LCXNnWZejblYALxIUNXOFEXbm -y/YA95FmQsy3U5HRCAJV/DY1PEaJz1RTm9bcdIpDC3Ab2YzSwmOwV5fcoUOB2df4 -KjX19Q+2F3JxpPQ0N1gHf4dKfIu19LH+CKeFzUN13aJs5J4A5wlj+NjJikxzmxDS -kDtNYndynPmo9DJQcsUFw3gpvx5HaHvx1cT4mAB2M5cd2l+vN1jYbaWb0x5Zq41z -mRNI89aPieC3rcM2289m68fGloNbYvi8mZJu5RrI4Tbi/D7Rjm1y63lHgVV6AN88 -XAzRiedOeF99LoTBulrJdtT8AAgCs8nCetcWpIffdtLpAZiZkzHmYOU7nqGxqpRk -OVeUTrCn9DW2SMmHjaP4IiKnMvzEycu5F4a72+V1LeMIhMSjTRTq+ZE2PTaqH59z -QsMn7Nb6GlOICbTptRKNNtyJKO7xXlpT7YtvNKnCyEOkH2XrYH7GvpYCiuQ0/o+7 -SxV436ZejiYIg6DQDXJCoa2DXimGp0C10Jh0HwX0BixpoNtwEjkGRYcX6P/JzkH0 -oBood4Ly+Tiu6iVDisrK3AVGYpIzCrKkE9qULTw4R/jFKR2tcCqGb7Fxtk2LV7Md -3S+DyOKrvKQ5GNwbp9OE97pwk+Lr1JS3UAvj5f6BR+1PVNcC0i0wWkgwDjPh1eGD -enMQmorE6+N0uHtH2F4fOxo/TbbA3+zhI25kVW3bO03xyUl/cmQZeb52nvfOvtOo -gSb2j6bPkzljDMPEzrtJjbFtGHJbPfUQYJgZv9OE2EQIqpg6goIw279alBq6GLIX -pkO+dRmztzjcDyhcLxMuQ4cTizel/0J/bU7U6lvwHSyZVbT4Ev+opG5K70Hbqbwr -NZcgdWXbSeesxGM/oQaMeSurOevxVl+/zrTVAek61aRRd1baAYqgi2pf2V7y4oK3 -qkdxzmoFpRdNlfrQW65NZWnHOi9rC9XxANIwnVn3kRcDf+t2K4PrFluI157lXM/o -wX91j88fazysbJlQ6TjsApO9ETiPOFEBqouxCTtCZzlUgyVG8jpIjdHWFnagHeXH -+lXNdYjxnTWTjTxMOZC9ySMpXkjWdFI1ecxVwu6Ik6RX51rvBJAAXWP75yUjPKJ4 -rRi5oQl/VLl0QznO7lvgMPtUwgDVNWO/r7Kn9B387h9fAJZ/kWFAEDW2yhAzABqO -rCNKDzBPgfAwCnikCpMoCbOL7SU8BdbzQHD8/Lkv4m0pzliHQ/KkGF710koBzTmF -N7+wk9pwIuvcrEBQj567 -=GV0c ------END PGP MESSAGE----- - ---nextPart25203163.0xtB501Z4V-- - ---nextPart2148910.9CGjQOYhYJ-- diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/forward-openpgp-signed-encrypted.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/forward-openpgp-signed-encrypted.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/forward-openpgp-signed-encrypted.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/forward-openpgp-signed-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-attachment.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-non-encrypted-attachment.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-partially-signed-attachments.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-partially-signed-attachments.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-partially-signed-attachments.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-partially-signed-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,84 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-two-attachments.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-two-attachments.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-two-attachments.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-encrypted-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-signed-encrypted-two-attachments.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-signed-encrypted-two-attachments.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-signed-encrypted-two-attachments.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-signed-encrypted-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-signed-mailinglist+additional-children.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-signed-mailinglist+additional-children.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-signed-mailinglist+additional-children.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-signed-mailinglist+additional-children.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-signed-no-protocol.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-signed-no-protocol.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-signed-no-protocol.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-signed-no-protocol.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-signed-two-attachments.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-signed-two-attachments.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/headeronly/openpgp-signed-two-attachments.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/headeronly/openpgp-signed-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/encapsulated-with-attachment.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/encapsulated-with-attachment.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/encapsulated-with-attachment.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/encapsulated-with-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-encrypted-attachment.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-encrypted-noData.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-encrypted-noData.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-encrypted-noData.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-encrypted-noData.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-encrypted-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-encrypted-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-encrypted-non-encrypted-attachment.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-encrypted-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-encrypted-partially-signed-attachments.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-encrypted-partially-signed-attachments.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-encrypted-partially-signed-attachments.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-encrypted-partially-signed-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,84 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-encrypted-two-attachments.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-encrypted-two-attachments.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-encrypted-two-attachments.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-encrypted-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-signed-encrypted-two-attachments.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-signed-encrypted-two-attachments.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-signed-encrypted-two-attachments.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-signed-encrypted-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-signed-mailinglist+additional-children.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-signed-mailinglist+additional-children.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-signed-mailinglist+additional-children.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-signed-mailinglist+additional-children.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-signed-no-protocol.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-signed-no-protocol.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-signed-no-protocol.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-signed-no-protocol.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-signed-two-attachments.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-signed-two-attachments.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/hidden/openpgp-signed-two-attachments.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/hidden/openpgp-signed-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/html.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/html.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/html.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/html.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -From foo@example.com Thu, 26 May 2011 01:16:54 +0100 -From: Thomas McGuire -Subject: HTML test -Date: Thu, 26 May 2011 01:16:54 +0100 -Message-ID: <1501334.pROlBb7MZF@herrwackelpudding.localhost> -X-KMail-Transport: GMX -X-KMail-Fcc: 28 -X-KMail-Drafts: 7 -X-KMail-Templates: 9 -User-Agent: KMail/4.6 beta5 (Linux/2.6.34.7-0.7-desktop; KDE/4.6.41; x86_64; git-0269848; 2011-04-19) -MIME-Version: 1.0 -Content-Type: multipart/alternative; boundary="nextPart8606278.tpV19BTJKu" -Content-Transfer-Encoding: 7Bit - - ---nextPart8606278.tpV19BTJKu -Content-Transfer-Encoding: 7Bit -Content-Type: text/plain; charset="windows-1252" - -Some HTML text ---nextPart8606278.tpV19BTJKu -Content-Transfer-Encoding: 7Bit -Content-Type: text/html; charset="windows-1252" - - - -

Some HTML text

---nextPart8606278.tpV19BTJKu-- - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/html.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/html.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/html.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/html.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ - - - - -
- - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/htmlonlyexternal.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/htmlonlyexternal.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/htmlonlyexternal.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/htmlonlyexternal.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -From foo@example.com Thu, 26 May 2011 01:16:54 +0100 -From: Thomas McGuire -Subject: HTML test -Date: Thu, 26 May 2011 01:16:54 +0100 -Message-ID: <1501334.pROlBb7MZF@herrwackelpudding.localhost> -X-KMail-Transport: GMX -X-KMail-Fcc: 28 -X-KMail-Drafts: 7 -X-KMail-Templates: 9 -User-Agent: KMail/4.6 beta5 (Linux/2.6.34.7-0.7-desktop; KDE/4.6.41; x86_64; git-0269848; 2011-04-19) -MIME-Version: 1.0 -Content-Type: text/html -Content-Transfer-Encoding: 7Bit - - - - - -SOME HTML text. - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/htmlonly.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/htmlonly.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/htmlonly.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/htmlonly.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -From foo@example.com Thu, 26 May 2011 01:16:54 +0100 -From: Thomas McGuire -Subject: HTML test -Date: Thu, 26 May 2011 01:16:54 +0100 -Message-ID: <1501334.pROlBb7MZF@herrwackelpudding.localhost> -X-KMail-Transport: GMX -X-KMail-Fcc: 28 -X-KMail-Drafts: 7 -X-KMail-Templates: 9 -User-Agent: KMail/4.6 beta5 (Linux/2.6.34.7-0.7-desktop; KDE/4.6.41; x86_64; git-0269848; 2011-04-19) -MIME-Version: 1.0 -Content-Type: text/html -Content-Transfer-Encoding: 7Bit - - - - - -SOME HTML text. - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/htmlonly.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/htmlonly.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/htmlonly.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/htmlonly.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/iconic/openpgp-encrypted-partially-signed-attachments.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/iconic/openpgp-encrypted-partially-signed-attachments.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/iconic/openpgp-encrypted-partially-signed-attachments.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/iconic/openpgp-encrypted-partially-signed-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,92 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/iconic/openpgp-encrypted-two-attachments.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/iconic/openpgp-encrypted-two-attachments.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/iconic/openpgp-encrypted-two-attachments.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/iconic/openpgp-encrypted-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/iconic/openpgp-signed-encrypted-two-attachments.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/iconic/openpgp-signed-encrypted-two-attachments.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/iconic/openpgp-signed-encrypted-two-attachments.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/iconic/openpgp-signed-encrypted-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/iconic/openpgp-signed-two-attachments.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/iconic/openpgp-signed-two-attachments.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/iconic/openpgp-signed-two-attachments.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/iconic/openpgp-signed-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/inlined/encapsulated-with-attachment.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/inlined/encapsulated-with-attachment.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/inlined/encapsulated-with-attachment.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/inlined/encapsulated-with-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/inlined/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/inlined/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/inlined/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/inlined/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,90 +0,0 @@ - - - - -
- - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/inlined/openpgp-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/inlined/openpgp-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/inlined/openpgp-encrypted-attachment.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/inlined/openpgp-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/inlined/openpgp-encrypted-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/inlined/openpgp-encrypted-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/inlined/openpgp-encrypted-non-encrypted-attachment.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/inlined/openpgp-encrypted-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ - - - - -
- - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/inlined/openpgp-signed-mailinglist+additional-children.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/inlined/openpgp-signed-mailinglist+additional-children.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/inlined/openpgp-signed-mailinglist+additional-children.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/inlined/openpgp-signed-mailinglist+additional-children.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ - - - - -
- - -
- - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/inlinepgpencrypted-appendix.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/inlinepgpencrypted-appendix.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/inlinepgpencrypted-appendix.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/inlinepgpencrypted-appendix.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -From test@kolab.org Wed, 25 May 2011 23:49:40 +0100 -From: OpenPGP Test -To: test@kolab.org -Subject: inlinepgpencrypted -Date: Wed, 25 May 2011 23:49:40 +0100 -Message-ID: <1786696.yKXrOjjflF@herrwackelpudding.localhost> -X-KMail-Transport: GMX -X-KMail-Fcc: 28 -X-KMail-Drafts: 7 -X-KMail-Templates: 9 -User-Agent: KMail/4.6 beta5 (Linux/2.6.34.7-0.7-desktop; KDE/4.6.41; x86_64; git-0269848; 2011-04-19) -MIME-Version: 1.0 -Content-Transfer-Encoding: 7Bit -Content-Type: text/plain; charset="us-ascii" - ------BEGIN PGP MESSAGE----- -Version: GnuPG v2.0.15 (GNU/Linux) - -hQEMAwzOQ1qnzNo7AQf/a3aNTLpQBfcUr+4AKsZQLj4h6z7e7a5AaCW8AG0wrbxN -kBYB7E5jdZh45DX/99gvoZslthWryUCX2kKZ3LtIllxKVjqNuK5hSt+SAuKkwiMR -Xcbf1KFKENKupgGSO9B2NJRbjoExdJ+fC3mGXnO3dT7xJJAo3oLE8Nivu+Bj1peY -E1wCf+vcTwVHFrA7SV8eMRb9Z9wBXmU8Q8e9ekJ7ZsRX3tMeBs6jvscVvfMf6DYY -N14snZBZuGNKT9a3DPny7IC1S0lHcaam34ogWwMi3FxPGJt/Lg52kARlkF5TDhcP -N6H0EB/iqDRjOOUoEVm8um5XOSR1FpEiAdD0DON3y9JPATnrYq7sgYZz3BVImYY+ -N/jV8fEiN0a34pcOq8NQedMuOsJHNBS5MtbQH/kJLq0MXBpXekGlHo4MKw0trISc -Rw3pW6/BFfhPJLni29g9tw== -=fRFW ------END PGP MESSAGE----- - -_______________________________________________ -test mailing list -test@lists.kde.org -http://kde.org diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/inlinepgpencrypted-appendix.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/inlinepgpencrypted-appendix.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/inlinepgpencrypted-appendix.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/inlinepgpencrypted-appendix.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/inlinepgpencrypted.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/inlinepgpencrypted.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/inlinepgpencrypted.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/inlinepgpencrypted.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -From test@kolab.org Wed, 25 May 2011 23:49:40 +0100 -From: OpenPGP Test -To: test@kolab.org -Subject: inlinepgpencrypted -Date: Wed, 25 May 2011 23:49:40 +0100 -Message-ID: <1786696.yKXrOjjflF@herrwackelpudding.localhost> -X-KMail-Transport: GMX -X-KMail-Fcc: 28 -X-KMail-Drafts: 7 -X-KMail-Templates: 9 -User-Agent: KMail/4.6 beta5 (Linux/2.6.34.7-0.7-desktop; KDE/4.6.41; x86_64; git-0269848; 2011-04-19) -MIME-Version: 1.0 -Content-Transfer-Encoding: 7Bit -Content-Type: text/plain; charset="us-ascii" - ------BEGIN PGP MESSAGE----- -Version: GnuPG v2.0.15 (GNU/Linux) - -hQEMAwzOQ1qnzNo7AQf/a3aNTLpQBfcUr+4AKsZQLj4h6z7e7a5AaCW8AG0wrbxN -kBYB7E5jdZh45DX/99gvoZslthWryUCX2kKZ3LtIllxKVjqNuK5hSt+SAuKkwiMR -Xcbf1KFKENKupgGSO9B2NJRbjoExdJ+fC3mGXnO3dT7xJJAo3oLE8Nivu+Bj1peY -E1wCf+vcTwVHFrA7SV8eMRb9Z9wBXmU8Q8e9ekJ7ZsRX3tMeBs6jvscVvfMf6DYY -N14snZBZuGNKT9a3DPny7IC1S0lHcaam34ogWwMi3FxPGJt/Lg52kARlkF5TDhcP -N6H0EB/iqDRjOOUoEVm8um5XOSR1FpEiAdD0DON3y9JPATnrYq7sgYZz3BVImYY+ -N/jV8fEiN0a34pcOq8NQedMuOsJHNBS5MtbQH/kJLq0MXBpXekGlHo4MKw0trISc -Rw3pW6/BFfhPJLni29g9tw== -=fRFW ------END PGP MESSAGE----- - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/inlinepgpencrypted.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/inlinepgpencrypted.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/inlinepgpencrypted.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/inlinepgpencrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/mailheader.css kf5-messagelib-16.12.3/messageviewer/autotests/data/mailheader.css --- kf5-messagelib-16.04.3/messageviewer/autotests/data/mailheader.css 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/mailheader.css 1970-01-01 00:00:00.000000000 +0000 @@ -1,506 +0,0 @@ -div.header { - margin-bottom: 10pt ! important; -} - -table.textAtm { - margin-top: 10pt ! important; - margin-bottom: 10pt ! important; -} - -tr.textAtmH, -tr.textAtmB, -tr.rfc822B { - font-weight: normal ! important; -} - -tr.signInProgressH, -tr.rfc822H, -tr.encrH, -tr.signOkKeyOkH, -tr.signOkKeyBadH, -tr.signWarnH, -tr.signErrH { - font-weight: bold ! important; -} - -tr.textAtmH td, -tr.textAtmB td { - padding: 3px ! important; -} - -table.rfc822 { - width: 100% ! important; - border: solid 1px black ! important; - margin-top: 10pt ! important; - margin-bottom: 10pt ! important; -} - -table.textAtm, -table.encr, -table.signWarn, -table.signErr, -table.signOkKeyBad, -table.signOkKeyOk, -table.signInProgress, -div.fancy.header table { - width: 100% ! important; - border-width: 0px ! important; - line-height: normal; -} - -div.htmlWarn { - margin: 0px 5% ! important; - padding: 10px ! important; - text-align: left ! important; - line-height: normal; -} - -div.fancy.header > div { - font-weight: bold ! important; - padding: 4px ! important; - line-height: normal; -} - -div.fancy.header table { - padding: 2px ! important; - text-align: left ! important; - border-collapse: separate ! important; -} - -div.fancy.header table th { - font-family: "Sans Serif" ! important; - font-size: 0px ! important; - - padding: 0px ! important; - white-space: nowrap ! important; - border-spacing: 0px ! important; - text-align: left ! important; - vertical-align: top ! important; - background-color: #d6d2d0 ! important; - color: #221f1e ! important; - border: 1px ! important; -} - -div.fancy.header table td { - font-family: "Sans Serif" ! important; - font-size: 0px ! important; - - padding: 0px ! important; - border-spacing: 0px ! important; - text-align: left ! important; - vertical-align: top ! important; - width: 100% ! important; - background-color: #d6d2d0 ! important; - color: #221f1e ! important; - border: 1px ! important; -} - -div.fancy.header table a:hover { - background-color: transparent ! important; -} - -span.pimsmileytext { - position: absolute; - top: 0px; - left: 0px; - visibility: hidden; -} - -img.pimsmileyimg { -} - -div.quotelevelmark { - position: absolute; - margin-left:-10px; -} - -@media screen { - -body { - font-family: "Sans Serif" ! important; - font-size: 0px ! important; - color: #1f1c1b ! important; - background-color: #ffffff ! important; -} - -a { - color: #0057ae ! important; - text-decoration: none ! important; -} - -a.white { - color: white ! important; -} - -a.black { - color: black ! important; -} - -table.textAtm { background-color: #1f1c1b ! important; } - -tr.textAtmH { - background-color: #ffffff ! important; - font-family: "Sans Serif" ! important; - font-size: 0px ! important; -} - -tr.textAtmB { - background-color: #ffffff ! important; -} - -table.signInProgress, -table.rfc822 { - background-color: #ffffff ! important; -} - -tr.signInProgressH, -tr.rfc822H { - font-family: "Sans Serif" ! important; - font-size: 0px ! important; -} - -table.encr { - background-color: #0069cc ! important; -} - -tr.encrH { - background-color: #0080ff ! important; - color: #ffffff ! important; - font-family: "Sans Serif" ! important; - font-size: 0px ! important; -} - -tr.encrB { background-color: #e0f0ff ! important; } - -table.signOkKeyOk { - background-color: #33cc33 ! important; -} - -tr.signOkKeyOkH { - background-color: #40ff40 ! important; - color: #27ae60 ! important; - font-family: "Sans Serif" ! important; - font-size: 0px ! important; -} - -tr.signOkKeyOkB { background-color: #e8ffe8 ! important; } - -table.signOkKeyBad { - background-color: #cccc33 ! important; -} - -tr.signOkKeyBadH { - background-color: #ffff40 ! important; - color: #f67400 ! important; - font-family: "Sans Serif" ! important; - font-size: 0px ! important; -} - -tr.signOkKeyBadB { background-color: #ffffe8 ! important; } - -table.signWarn { - background-color: #cccc33 ! important; -} - -tr.signWarnH { - background-color: #ffff40 ! important; - color: #f67400 ! important; - font-family: "Sans Serif" ! important; - font-size: 0px ! important; -} - -tr.signWarnB { background-color: #ffffe8 ! important; } - -table.signErr { - background-color: #cc0000 ! important; -} - -tr.signErrH { - background-color: #ff0000 ! important; - color: #da4453 ! important; - font-family: "Sans Serif" ! important; - font-size: 0px ! important; -} - -tr.signErrB { background-color: #ffe0e0 ! important; } - -div.htmlWarn { - border: 2px solid #ff4040 ! important; - line-height: normal; -} - -div.header { - font-family: "Sans Serif" ! important; - font-size: 0px ! important; -} - -div.fancy.header > div { - background-color: #43ace8 ! important; - color: #ffffff ! important; - border: solid #221f1e 1px ! important; - line-height: normal; -} - -div.fancy.header > div a[href] { color: #ffffff ! important; } - -div.fancy.header > div a[href]:hover { text-decoration: underline ! important; } - -div.fancy.header > div.spamheader { - background-color: #cdcdcd ! important; - border-top: 0px ! important; - padding: 3px ! important; - color: black ! important; - font-weight: bold ! important; - font-size: smaller ! important; -} - -div.fancy.header > table.outer { - background-color: #d6d2d0 ! important; - color: #221f1e ! important; - border-bottom: solid #221f1e 1px ! important; - border-left: solid #221f1e 1px ! important; - border-right: solid #221f1e 1px ! important; -} - -div.senderpic{ - padding: 0px ! important; - font-size:0.8em ! important; - border:1px solid #b3aba7 ! important; - background-color:#d6d2d0 ! important; -} - -div.senderstatus{ - text-align:center ! important; -} - -div.quotelevel1 { - color: #008000 ! important; - font-style: italic ! important; -} - -div.quotelevel2 { - color: #007000 ! important; - font-style: italic ! important; -} - -div.quotelevel3 { - color: #006000 ! important; - font-style: italic ! important; -} - -div.deepquotelevel1 { - color: #008000 ! important; - font-style: italic ! important; -} - -div.deepquotelevel2 { - color: #007000 ! important; - font-style: italic ! important; -} - -div.deepquotelevel3 { - color: #006000 ! important; - font-style: italic ! important; -} - -blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #008000; - unicode-bidi: -webkit-plaintext -} - -blockquote blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #007000; - unicode-bidi: -webkit-plaintext -} - -blockquote blockquote blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #006000; - unicode-bidi: -webkit-plaintext -} - -blockquote blockquote blockquote blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #008000; - unicode-bidi: -webkit-plaintext -} - -blockquote blockquote blockquote blockquote blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #007000; - unicode-bidi: -webkit-plaintext -} - -blockquote blockquote blockquote blockquote blockquote blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #006000; - unicode-bidi: -webkit-plaintext -} - -blockquote blockquote blockquote blockquote blockquote blockquote blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #008000; - unicode-bidi: -webkit-plaintext -} - -blockquote blockquote blockquote blockquote blockquote blockquote blockquote blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #007000; - unicode-bidi: -webkit-plaintext -} - -blockquote blockquote blockquote blockquote blockquote blockquote blockquote blockquote blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #006000; - unicode-bidi: -webkit-plaintext -} - -.quotemarks{ - color:transparent; - font-size:0px; -} - -} -@media print { - -body { - font-family: "Sans Serif" ! important; - font-size: 9pt ! important; - color: #000000 ! important; - background-color: #ffffff ! important -} - -tr.textAtmH, -tr.signInProgressH, -tr.rfc822H, -tr.encrH, -tr.signOkKeyOkH, -tr.signOkKeyBadH, -tr.signWarnH, -tr.signErrH, -div.header { - font-family: "Sans Serif" ! important; - font-size: 9pt ! important; -} - -div.fancy.header > div { - background-color: #d6d2d0 ! important; - color: #221f1e ! important; - padding: 4px ! important; - border: solid #221f1e 1px ! important; - line-height: normal; -} - -div.fancy.header > div a[href] { color: #221f1e ! important; } - -div.fancy.header > table.outer{ - background-color: #d6d2d0 ! important; - color: #221f1e ! important; - border-bottom: solid #221f1e 1px ! important; - border-left: solid #221f1e 1px ! important; - border-right: solid #221f1e 1px ! important; -} - -div.spamheader { - display:none ! important; -} - -div.htmlWarn { - border: 2px solid #ffffff ! important; - line-height: normal; -} - -div.senderpic{ - font-size:0.8em ! important; - border:1px solid black ! important; - background-color:#d6d2d0 ! important; -} - -div.senderstatus{ - text-align:center ! important; -} - -div.noprint { - display:none ! important; -} - -blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #008000; - unicode-bidi: -webkit-plaintext -} - -blockquote blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #007000; - unicode-bidi: -webkit-plaintext -} - -blockquote blockquote blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #006000; - unicode-bidi: -webkit-plaintext -} - -blockquote blockquote blockquote blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #008000; - unicode-bidi: -webkit-plaintext -} - -blockquote blockquote blockquote blockquote blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #007000; - unicode-bidi: -webkit-plaintext -} - -blockquote blockquote blockquote blockquote blockquote blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #006000; - unicode-bidi: -webkit-plaintext -} - -blockquote blockquote blockquote blockquote blockquote blockquote blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #008000; - unicode-bidi: -webkit-plaintext -} - -blockquote blockquote blockquote blockquote blockquote blockquote blockquote blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #007000; - unicode-bidi: -webkit-plaintext -} - -blockquote blockquote blockquote blockquote blockquote blockquote blockquote blockquote blockquote { - margin: 4pt 0 4pt 0; - padding: 0 0 0 1em; - border-left: 2px solid #006000; - unicode-bidi: -webkit-plaintext -} - -.quotemarks{ - color:transparent; - font-size:0px; -} - -} diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/no-content-type.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/no-content-type.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/no-content-type.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/no-content-type.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -From: hans@example.com -To: karl@example.com -Subject: Simple Mail Without Content-Type Header -Date: Sat, 15 May 2010 10:52:24 +0200 -MIME-Version: 1.0 - -asdfasdf \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/no-content-type.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/no-content-type.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/no-content-type.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/no-content-type.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encoded.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encoded.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encoded.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encoded.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -Content-Type: text/plain; charset="us-ascii" -Content-Transfer-Encoding: 7bit - ------BEGIN PGP MESSAGE----- -Version: GnuPG v2 - -owGdk31MlVUcx5G3jClvI1JH7GiOil0uYJATBW8FK6HkDtBJI93heQ6Xk8/L9Tnn -XExALDfJQaJutl4UzUoCIxDwos0XTLktqJaJkJE5QAU3yMKpkRqdc+GC/dsfz/bs -ec7v+/v+Pr/v2TnbxytgxvUt8T99cCirZEa9zw/5fopuIHX1xsjjr4gXgO2EqUDW -+WdAMAVQRdQEJF0jSKKIMgNAGdsxkbBmA0jB1AxSdQ1JAAIZQxUo/BgjZpCN5Kn6 -SVEVMgPzX69CJCENEqFqYwgo2MYUCKAENjCu4MAOZBgQCNH/9NUoAoVIkw1kTLfl -6qquKJhMeDYDqwERQRoVf9yOkI2/KTgfGbp4J5R3ViGlvGTKoANTiABk3I4ZrORF -FGsSlhmXmTSJNKyaAKPArhsUAjc1oECOAcOHbXp8samehJOAhsSAAxViSUzKFGpg -CSPCoWm6BiiXFNb/9waeRxqCmuhpM6ADy5P+zGAVBbyAHwYF/CQxATtTHFiDXIP7 -Uu3IEPZMDytieYokUhQOEpENTLCRuEegYYLFERXatMm5+dIoINCGBVIzeJEZMB8L -mzK043xG3OimUQvHwF4IDUT5kqc5FyBmw1yJd1AAFtZkjKh7BN7GAd07nkSK+ayG -5gEpOEoSUwnUPPQFc13GfOGGTjwfPcFSMQ8aF3OnbRoIDxJUEGGQ43PvyyjUNYm5 -R+L+dQnzGg1SXeCw8wDTiemoG4YIIH/s0OCjY5E/VRfsTLyESO61GVgW++c1qlBd -oQGDUYNre9xPB0NcEnFZJoPppi4o83gU8MxxFCK9Ewvk94bz4Lk2B2z3jvD1mhHg -5e/nLW60V8CjwZ7LTpKCxjNIzhNRXcER/6RVXUzaGdocqGY3vd+5LO7+qSV3pdFP -+s6tv3Jp8EZg+V9qza9zKhf4b3xn4MfVSYOW+qaihPsHrc3O5hpzXCV77sROqxWw -vbfaOrpClvTszr8+8pVc/ELc0aeOm+856kqfDYNZmUXt33+Y1nLT4nvH0tomz47f -tfzP+dlpQW8vRj3v+qcXyXpef3Hvldy2gfECZ3LMGdMomlsR8fQm42zMcLh3eW1N -Xszwqt5dLXimuVk6vb+/etNN8xgeuhoWeb79myzXg9jUv11xbQ8OR9/wnXP7QGzj -kWN+v+RpX58qa2dbTr2VeMn/aPJrOZ3ZYS0dW7s6dhcu/3lzT1DdhS8zGgIrynIH -tjkf21tmXtZ8pOjj/a7xsahsEGKxLG4h+St9Oj9ace1kn1+vdWl06+nEvhPlOWnh -5OVrw1nzTv6+pjo3K9Vr3YFZeZmu6K1jA2OW7M96Bs85ChL23ck95Cx5/bfuHeX3 -wktCXYN1/fvWpxxIfyk2/pm0N4bCRyrfS8z13VPNMr6rckbuP1YS2rp0z27X/FEy -FPHm4OHHv7iXsuaPg5dpg6XWN9B/SG/81Bq8tv5WwMjFRVUZId6Rn+sL68uudls3 -z+vMvLwwrdw5t+Pb5ISuppDUVkvmme4nTahhwYX7setmpdxt29ZeO5MFPFK6Pep2 -+nlHdfFa78ZFpSMV/Q1n/wU= -=zzr4 ------END PGP MESSAGE----- diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encoded.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encoded.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encoded.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encoded.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ - - - - -
- -
- - - - - - - - - - -
- - - - - -
Not enough information to check signature validity. - Show Details -
-
-
-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor. Pellentesque auctor nisi id magna consequat sagittis. Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet. Ut convallis libero in urna ultrices accumsan. Donec sed odio eros. Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisi at sem facilisis semper ac in est.
-
-
End of signed message
-
-
- - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,115 +0,0 @@ -From test@kolab.org Fri May 01 15:12:47 2015 -From: testkey -To: you@you.com -Subject: enc & non enc attachment -Date: Fri, 01 May 2015 17:12:47 +0200 -Message-ID: <13897561.XENKdJMSlR@tabin.local> -X-KMail-Identity: 1197256126 -User-Agent: KMail/4.13.0.1 (Linux/3.19.1-towo.1-siduction-amd64; KDE/4.14.2; x86_64; git-cd33034; 2015-04-11) -MIME-Version: 1.0 -Content-Type: multipart/mixed; boundary="nextPart1939768.sIoLGH0PD8" -Content-Transfer-Encoding: 7Bit - -This is a multi-part message in MIME format. - ---nextPart1939768.sIoLGH0PD8 -Content-Type: multipart/encrypted; boundary="nextPart2814166.CHKktCGlQ3"; protocol="application/pgp-encrypted" - - ---nextPart2814166.CHKktCGlQ3 -Content-Type: application/pgp-encrypted -Content-Disposition: attachment -Content-Transfer-Encoding: 7Bit - -Version: 1 ---nextPart2814166.CHKktCGlQ3 -Content-Type: application/octet-stream -Content-Disposition: inline; filename="msg.asc" -Content-Transfer-Encoding: 7Bit - ------BEGIN PGP MESSAGE----- -Version: GnuPG v2 - -hIwDGJlthTT7oq0BA/9cXFQ6mN9Vxnc2B9M10odS3/6z1tsIY9oJdsiOjpfxqapX -P7nOzR/jNWdFQanXoG1SjAcY2FeZEN0c3SkxEM6R5QVF1vMh/Xsni1clI+peZyVT -Z4OSU74YCfYLg+cgDnPCF3kyNPVe6Z1pnfWOCZNCG3rpApw6UVLN63ScWC6eQIUB -DAMMzkNap8zaOwEIANKHn1svvj+hBOIZYf8R+q2Bw7cd4xEChiJ7uQLnD98j0Fh1 -85v7/8JbZx6rEDDenPp1mCciDodb0aCmi0XLuzJz2ANGTVflfq+ZA+v1pwLksWCs -0YcHLEjOJzjr3KKmvu6wqnun5J2yV69K3OW3qTTGhNvcYZulqQ617pPa48+sFCgh -nM8TMAD0ElVEwmMtrS3AWoJz52Af+R3YzpAnX8NzV317/JG+b6e2ksl3tR7TWp1q -2FOqC1sXAxuv+DIz4GgRfaK1+xYr2ckkg+H/3HJqa5LmJ7rGCyv+Epfp9u+OvdBG -PBvuCtO3tm0crmnttMw57Gy35BKutRf/8MpBj/nS6QFX0t7XOLeL4Me7/a2H20wz -HZsuRGDXMCh0lL0FYCBAwdbbYvvy0gz/5iaNvoADtaIu+VtbFNrTUN0SwuL+AIFS -+WIiaSbFt4Ng3t9YmqL6pqB7fjxI10S+PK0s7ABqe4pgbzUWWt1yzBcxfk8l/47Q -JrlvcE7HuDOhNOHfZIgUP2Dbeu+pVvHIJbmLsNWpl4s+nHhoxc9HrVhYG/MTZtQ3 -kkUWviegO6mwEZjQvgBxjWib7090sCxkO847b8A93mfQNHnuy2ZEEJ+9xyk7nIWs -4RsiNR8pYc/SMvdocyAvQMH/qSvmn/IFJ+jHhtT8UJlXJ0bHvXTHjHMqBp6fP69z -Jh1ERadWQdMaTkzQ+asl+kl/x3p6RZP8MEVbZIl/3pcV+xiFCYcFu2TETKMtbW+b -NYOlrltFxFDvyu3WeNNp0g9k0nFpD/T1OXHRBRcbUDWE4QF6NWTm6NO9wy2UYHCi -7QTSecBWgMaw7cUdwvnW6chIVoov1pm69BI9D0PoV76zCI7KzpiDsTFxdilKwbQf -K/PDnv9Adx3ERh0/F8llBHrj2UGsRs4aHSEBDBJIHDCp8+lqtsRcINQBKEU3qIjt -wf5vizdaVIgQnsD2z8QmBQ7QCCipI0ur6GKl+YWDDOSDLDUs9dK4A6xo/4Q0bsnI -rH63ti5HslGq6uArfFkewH2MWff/8Li3uGEqzpK5NhP5UpbArelK+QaQQP5SdsmW -XFwUqDS4QTCKNJXw/5SQMl8UE10l2Xaav3TkiOYTcBcvPNDovYgnMyRff/tTeFa8 -83STkvpGtkULkCntp22fydv5rg6DZ7eJrYfC2oZXdM87hHhUALUO6Y/VtVmNdNYw -F3Uim4PDuLIKt+mFqRtFqnWm+5X/AslC31qLkjH+Fbb83TY+mC9gbIn7CZGJRCjn -zzzMX2h15V/VHzNUgx9V/h28T0/z25FxoozZiJxpmhOtqoxMHp+y6nXXfMoIAD1D -963Pc7u1HS0ny54A7bqc6KKd4W9IF7HkXn3SoBwCyn0IOPoKQTDD8mW3lbBI6+h9 -vP+MAQpfD8s+3VZ9r7OKYCVmUv47ViTRlf428Co6WT7rTHjGM09tqz826fTOXA== -=6Eu9 ------END PGP MESSAGE----- - ---nextPart2814166.CHKktCGlQ3-- - ---nextPart1939768.sIoLGH0PD8 -Content-Disposition: attachment; filename="image.png" -Content-Transfer-Encoding: base64 -Content-Type: image/png; name="image.png" - -iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAlwSFlzAAAb -rwAAG68BXhqRHAAAAAd0SU1FB9gHFg8aNG8uqeIAAAAGYktHRAD/AP8A/6C9p5MAAAkqSURBVHja -5VV7cFTVGf/OPefeu3fv3t1NdhMSCHkKASEpyEsaGwalWEWntLV1Wu0fdOxAx9Iq0xntAwac6ehY -p+rwKLbjjLRFh9JadURKRGgFQTTECCYQE9nNgzzYZDe7m33d1+l3tpOOU61T2tF/+s1s7pzn9/t+ -v993Av/3QT6FO6WdO/d+M55Il8rMOdrT0x3Zt++3+c8EgM/nozseeviJiYmpe1zOQdM8BOOCIku/ -lIj1VrQ/0r9n9+78xwLgeAA3w4fHXV1d5Omnn6aapumlJSVVqalUJJvJZRdcu0RSfZQsaW7mjfPm -cbF9+/btEIlEaq6Z03whXyhIjDFuGIZEKSP5fMFRVcVNT2Vf0jzsmMxYGtel9rff/vM/M8bjcZpM -Jp1XX32VNDc3e7ovRP3JyZGVNdXVd1FGGwKBQEM8njiWTKV36IHgEACwibGx62LjU/cBd01Zljoc -p9DHmLbHsmyK1UuKooJt24IMcLE+y3L45eEYLS8LgWH4YXR0bAPZtGmTVFvfoBZMEzKpFKmqqmqp -qane4DhOteH3L1FkWZVlGSzLAtd1Oe4773C4LxoZvDWXh82OY2MtwAuFvCvSyDIFXdelYDDIvF4d -xPzA0AgXFStMcWPxBPGoKvXpPh6JDG5hK1Zcv1H36Xc6tsMs21EMQ69CLSts2wGkDygTyW2CP8gX -TKLIyvx0OrdDUXyLKXVUkdSne4QKtFAwuWmabjAYkDyqAgG/jziORh1EKaonkkQt2yRZRC5JHEGn -L7OKyopNqqo2IbWQjqWgLOwFBFKsuGDa4PVyIssMk1sCACCjimXbrbquYKW41zJJOpXkeARyeZNQ -SUKwHEqCKnBuAybkZeFSmssVSDKdhlBpCRgIcnQsdvKPB19sY4rMNIaH0BhQUVHKvXgpIiQF0wK/ -4QORnOEayoDzOSBMXK4BSgpeTcMECqiqTDKZHDKmct3LCI55Kp0mQgK/3yDYkgIc3kNhfHzCkRk9 -p6nk+yPD3SmWzeZiKNkciUrg2g5BjQWdSBchiEvQjzoWAFkUYPDrCjBFUEJ8AhSIRyl2jcfjEL9h -AFJODL8B6H7IZrNIt2g3B1mysShdQhmbT58+ExRdx3L5/PNomGU4kJkuA9ILYn+JP4CXOoDUoWO9 -IBhCSBCLTYCK+rqOg8CKvY6JPQhGxjkX1zyAdwrgAhTKWBDmxTUTC7Tcy5dHBiilL7cdaTsNGAwP -7o32D4Q9HnWTrvsCiqIgdWgqDkJfkKgDU1MZcBGMhbKgj2B0LIle8eNhgiBsoMwFEY7rQDqVwlo5 -esUE/AAR81gUYIUT8UR2//4/rK+pLjs3MhIFEVJN9WwXK2oM+P1BREpQO0hjwkw+BzJWY1oOXB5L -w9DIOGTQvYS4UFqigR9ZwUqEXFghVop059AjonqcAIZrqCKg31AS3OU66Adf4sabWqKvvHIYpoNh -y+Vj4xMHVEW93eUuo0izhT4oRbcSIoALbRle4AVVkfBup6g9thwCzRX1VRQmdMeqLVETEIkW2ZNx -H8oqzqAfXCGJEQ6XBQEgNQ2A7tq1C1a1tvaattOOrVFOqVSLCQhqU6QPx+DTsOU0GavLYUV20Qv4 -rEIymYNQuB48Wkg8QTA0NIQeYKB6NGTgH90jIcJEMikAi1dRRo9NLV583ek33jjpFAGIPw8++IAj -e9SIRGm5wliraVosnTWLmmemUugBkTiPSS3AtgV8VQA9A8LxdfULYXBoEKv2wMhIn2BHGFR0DZ6d -glQ6hUDT6A/RWVSSmfx5DjxRV1vzVkdHBzDAWLNmDezc+aQVqqz5dSY52Z63nLn9A33lI9myLXNL -xv0Fq3gWutMN0BToxcso+AN+cKmOXI5A9P12mKDzYNXcZXDq1F+h+IboFgzb1VAhDULeJpxwC19G -g/uMgOXVfXW1tbWCYM6mtdi8+YfiM4m/Y1UrHzkergyXz/3czImCnRjuHiW3qxpPqGFPy6SpHJC9 -IR+Sm+2N8i/dcMOMZdGeshcrS/S58+c3zU2Z8oVD50cbVfP8M4pGkymoUxLxsUzOVhtmQ+5432Rg -oj6QOLFj28/caQk+EjMXraUV1eW+8dH06StQZnlnNbQefGTD92pWfu3I6TOT8oY7brv4hWUt3xiw -2OrlDVVdRslsd2Fd469Q8sUB3c8uOW49SdHX1rbcePhoz3B7feuqlt5oZtBTv+ioSdXc7q3fHQaM -fwtg6Vd/dEvn8Qssnzg/0Ns56jRcO6Nw4d1Af+/RH0/cdv+O/fRK7KnmBXPWGsQeDPhK9oWC6hdd -R3pdUcg88Tx7U7Ej1y1qMjreGwjt/cnaF2YtvCXQe7bzxLkj+/sunT0Ry00OwHRI8DERLqeNmqGV -JZJVC6Yu7UxMOfLFlV9pWQcYp57/013rb1u9ua29b0Ch4bsl4tKLY5P1sgxNJzsHDj136KzS3NTk -9mTNusPvXJLrbnjUe/b16FDfsZ/3xC8d4/HoCQ4Anwzg91vWPL7+3pvvDM806sTY4IVyMxfrojO3 -BVubbyJMhnVVM3y+l187/nChIJ2ZpSs9hMD4qC6t6x6+0gkAoRC33/Sb8RdmXj9nzvWraivhP47g -AyHxKb1mfWkRYHCjMb30nafeeWzerU9963w3L3/02c4f7D0y0NXTx3f3D/JTb7bzxpeODu55+PGT -yy5F+ZmeD/iSrh5efeJd/hGZP5GBux+6cysY3w7H+16IVy65V6trnn3P9JqVjQ3JuSsdHhWW6hIL -NuhyUpJgEF/ofSVBeLBuVtVjd3y55SHXhQ8UBht0DR4r98Fs+IRg/zrxlz2/2A7p5yYBY93Gu+4f -H5xojLwOxfjd/WufOHhQ/IcD7eYVC5YyCjFMfkVV4NpMFvpTachoZeDaNryLnliOczsUCv1XBWD8 -YjF5MWJ9kcT757qenR7vf4bDoqWwHCvUUfPNsQQMWSZAZTlsw7nxYQQTcuDrjgQuPn7z/D7YivNt -nPPfEDzwqcU75/j6SD/f8uG5vXs5dL7Hjb+d4gp8mnF8nAOabjcac+OBAxyuNiT4HyNwGZYgu0RW -IDt/Icz4zAC0tXE4183rQ6XwU9uBXgLQ5Teg7GIv1+EqgsF/GY4DtCQALZMp2ITttmqoHzpWr756 -o/0d59+Lh3Y1HHcAAAAASUVORK5CYII= - ---nextPart1939768.sIoLGH0PD8-- - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,77 +0,0 @@ - - - - -
- - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-attachment.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-attachment.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-attachment.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-attachment.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -From test@kolab.org Fri May 01 15:13:18 2015 -From: testkey -To: you@you.com -Subject: enc attachment -Date: Fri, 01 May 2015 17:13:18 +0200 -Message-ID: <2401407.XhOc2XYoOt@tabin.local> -X-KMail-Identity: 1197256126 -User-Agent: KMail/4.13.0.1 (Linux/3.19.1-towo.1-siduction-amd64; KDE/4.14.2; x86_64; git-cd33034; 2015-04-11) -MIME-Version: 1.0 -Content-Type: multipart/encrypted; boundary="nextPart4793536.cjk9hKXLQ5"; protocol="application/pgp-encrypted" - - ---nextPart4793536.cjk9hKXLQ5 -Content-Type: application/pgp-encrypted -Content-Disposition: attachment -Content-Transfer-Encoding: 7Bit - -Version: 1 ---nextPart4793536.cjk9hKXLQ5 -Content-Type: application/octet-stream -Content-Disposition: inline; filename="msg.asc" -Content-Transfer-Encoding: 7Bit - ------BEGIN PGP MESSAGE----- -Version: GnuPG v2 - -hIwDGJlthTT7oq0BBACLMnR5Mln6JGCccvqZCgM3qUkFWZ7a33b7Nl2g5lSOLX6q -dlGOr/0jAuqdkRwCDTom3hsrH2vf1kARTSST+5cewngS2CgBTAwwc8JymEagTkKf -VK/tTnM6G7puMVkwuafpuRggyJAUYvjktgUKOUaXtuxX71g0NagAFQGqlvGuq4UB -DAMMzkNap8zaOwEH+wWSs5xdV1x37T11EnUvkhoOMu+uId2U7NEx2JdQ/FGJZdti -mtqfM9GKTtQlGVcn3ISH7Wmrw3x0bsOLuW7oxkU4xIS3tVvibxaaWdmponN5TUai -Dr4LCTEmG7+jLNopF6V4zPmpQ9YxMwQOm8ITml+auNOg9EtHxavwr3Xd1hOYA92N -1bkOiHzmb9hQtUy1GfRRk91tRqtRPoaamczLxWV9yROFDRNuSSbZ8oBU/K4YgSTL -D+/FhCt6MxV0DQzp+UCSL7ZsMx+ldPnZK44Udd17+U3xQDDUffo6cSg6FAF425Rh -v3ZQP0j7LtSIwDh2Rxc+Is4DuSmfZksL5nLPH5nS6QGJnsVEqVcZgQPktl1Zaeil -x/6WaWruuJm92G2fd9x2/giTLZnk918BVi/n00xR/n4bnSQmmFhXVqAVjGlG6Tr9 -dxej8dSiFdxO8ZjFe5tguQw76xlCu/9MxmSXTP7Mfvm4jqdcjUOINwHOzR/h2T62 -ZlrmqoxMHm4RN0PQ334tSzQXD4gcoUHL+xq62ATt7/jx0p0pIXPmPVUFopCk8k1E -m2ErPLnyfGLd4LNZRL03oP0jCjX6Q/LFWLTjCIdU6+aM6nT26CZy98yZV0SRGyhu -qYxN0aVW+RatmDRWWtouOJllQouQ7ZaqmjHLgyOj32/oT8cYUWWdFswSsnMhJjxb -r6iajUeAZgiN+zqwgf6j1Z8/mMvb+yirP+Rn9ME1fq3XSYHlnIOxKNBa+St8DdaP -/ZvrkwNTpVp1GmaZLBXdqdeLmflJ4U/X7wphZGR3sgjOwj0oYotX1Zb8OrtlP5WC -VXhhrt40e7Ilt2B0x7Xe9DWKByDCqrQUhwxwTS3miiKH9G1VEcHko70O98RjKJQ3 -I4VW6e/Gqv2zAMiiOu1MBTeGfPQItca4bUrVzhKjm27twtZD4wLSQDTQECxrCWHC -BFAdzvsIry0FIXoO6Vh16Hojq+YZ8tpmknGfpg0pnuRvAdDWU+0uuECXDE0UZFWC -2g3Bs2Dn2BYYyrI6X92swHz8qP3JvdxN0dpsYMkMdHN4yWXJogNSfXzy2udf0A4P -NNZMOonhlwH+DBRfcWS0A/j0/fdDCDzR5Ca5dbX7lL4EscbBeoCP1JJyVoOp6DUc -ICuHJGGrnpNdG9DMa97tqpyGRHTAwI3lJXPKTDEHN9v9XobIyndFgi/tcPLZ7QWz -9mN94NKLmeYWjrMiRbNQk8BYXR9K17SHb4BkIMdBxRsJjgMEC8qniUH64Nnf8/x4 -yaRCuUo0bkHDE3AqCzZE1R0he66dDkfOIz+mLwcpG8jZWjFm7sXAflBe3jvIc0lm -NyWQ1WnMkP83fWm/+YqrLLf+tTQtievRPeS1Dd/7v9yqUWEmQ0pUOj3MNf9Ej2KI -vu5ap7fHIevcBn42BPwQgSnp4YmXEY0ir5Ccwogusnt7QliNSRmkN6Jap4AF -=AVJ4 ------END PGP MESSAGE----- - ---nextPart4793536.cjk9hKXLQ5-- - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-attachment.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-enigmail1.6.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-enigmail1.6.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-enigmail1.6.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-enigmail1.6.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -From you@you.com Sat, 29 Mar 2014 15:04:21 +0100 -FCC: imap://hefee%40netzguerilla.net@mail.netzguerilla.net/Sent -X-Identity-Key: id1 -X-Account-Key: account4 -Message-ID: <5336D2E5.6010602@you.com> -Date: Sat, 29 Mar 2014 15:04:21 +0100 -From: you -X-Mozilla-Draft-Info: internal/draft; vcard=0; receipt=0; DSN=0; uuencode=0 -User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Icedove/24.4.0 -MIME-Version: 1.0 -To: test@kolab.com -Subject: test -X-Enigmail-Version: 1.6 -X-Enigmail-Draft-Status: 515 -X-Enigmail-Draft-Status: 739 -Content-Type: multipart/encrypted; - protocol="application/pgp-encrypted"; - boundary="23VWJ4jAoB40SD17lh6TOBXK3fQSEGNu5" - -This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156) ---23VWJ4jAoB40SD17lh6TOBXK3fQSEGNu5 -Content-Type: application/pgp-encrypted -Content-Description: PGP/MIME version identification - -Version: 1 - ---23VWJ4jAoB40SD17lh6TOBXK3fQSEGNu5 -Content-Type: application/octet-stream; name="encrypted.asc" -Content-Description: OpenPGP encrypted message -Content-Disposition: inline; filename="encrypted.asc" - ------BEGIN PGP MESSAGE----- -Version: GnuPG v1 -Comment: Using GnuPG with Icedove - http://www.enigmail.net/ - -hIwDGJlthTT7oq0BA/9NtLLXbiIJVS6pOynwEeSznrQK7kYVla8RM43//JECCkGJ -azEaSBznabBv6epaFmQtVHLMXlCbZnMmW9loyqPBfMoAms6kKKBdG/jqhus89iXE -+seXngC233Va/gZMb2DxOqIokVNfj9tpR7xQ8wS/jHTDiLNc1GOQC7ku42z2bNLA -IQFRD/qbBFz89hU4wP4cYoAysOnEDojFrsrnCidTHJOJrndM6PPUtH/jQCyfr/EG -2tSpJwYKvmT6ly3yqaGLBtRPIxiv+dMe+7yw0t40qbjvvaTGavErEBJEKX5eWbTN -/sjajHpUHqs6SIiMheH9dr+WfzFONtVbPEgGRmOERhlgTl/nLo86AZpjJroIGKJJ -tTHCcoQGAWG+N7wrCE1RxR0kkMs4nRozj0TLu6ZyXMs+H063MewTPNxNAiQT1Nbi -udKWmfLBlxn06p+JDzUKxj8PFwObdbxTvACzbAvBY1aHMQ== -=mLl3 ------END PGP MESSAGE----- - ---23VWJ4jAoB40SD17lh6TOBXK3fQSEGNu5-- - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-enigmail1.6.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-enigmail1.6.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-enigmail1.6.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-enigmail1.6.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -From test@kolab.org Wed, 08 Sep 2010 17:02:52 +0200 -From: OpenPGP Test -To: test@kolab.org -Subject: OpenPGP encrypted -Date: Wed, 08 Sep 2010 17:02:52 +0200 -User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) -MIME-Version: 1.0 -Content-Type: multipart/encrypted; boundary="nextPart1357031.ppLHckZtsp"; protocol="application/pgp-encrypted" -Content-Transfer-Encoding: 7Bit - - ---nextPart1357031.ppLHckZtsp -Content-Type: application/pgp-encrypted -Content-Disposition: attachment - -Version: 1 ---nextPart1357031.ppLHckZtsp -Content-Type: application/octet-stream -Content-Disposition: inline; filename="msg.asc" - ------BEGIN PGP MESSAGE----- -Version: GnuPG v2.0.15 (GNU/Linux) - -hQEMAwzOQ1qnzNo7AQgAtWfDWWI2JUGuptpackiIxpWViEEpGAeruETubiIPwxNb -DNmXrMDhbm/zIbPntIGWJDgUMfABZCUgmlJLWhsceDTt+tXnWGha2VYrN2/WsF6/ -Pqs/TavTvMIJQHDaIH5yDDCaMoq/mGSbcu7go2H8Sw7aBEYlM8jGlqc1HziXnZ1q -3vDiA+4qWfvbNoSRo1kb9Pcq997yg6WqZXH2hJ7cp+hIQ4uTP1/+qgYHMvfPlzQk -XcDguGbIer88ELhuR5622unGBAB4dqp+5w6n9c6rrCH81qhV4W0nqSEvj1tBj78S -ZTi6VBAo5eS0e3iOJqMpwUZz6hQUpJw2wnNRGvLgI9KZAag0HkgPdMeANowg7vpE -L4nU7B0ybhswA2Y7QT/wwCDZu9N1JGeBmy0dgy4sA38Ki27rn2/lIaP0j14JycwM -RTJ1uwI+ZuQiwXlyYtdFZJWe8nraWARch0oKqhaR7aSsxGWo63eiGEQhkQCBFBb3 -Vg0nNCZRBauEqIESEW5EV2zrJqdfNYcz+f9IP125dnQEKgLZ6FxTt3+v -=mhNl ------END PGP MESSAGE----- - ---nextPart1357031.ppLHckZtsp-- diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-noData.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-noData.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-noData.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-noData.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -From test@kolab.org Wed, 08 Sep 2010 17:02:52 +0200 -From: OpenPGP Test -To: test@kolab.org -Subject: OpenPGP encrypted -Date: Wed, 08 Sep 2010 17:02:52 +0200 -User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) -MIME-Version: 1.0 -Content-Type: multipart/encrypted; boundary="nextPart1357031.ppLHckZtsp"; protocol="application/pgp-encrypted" -Content-Transfer-Encoding: 7Bit - ---nextPart1357031.ppLHckZtsp -Content-Type: application/pgp-encrypted -Content-Disposition: attachment - -Version: 1 - ---nextPart1357031.ppLHckZtsp-- diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-noData.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-noData.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-noData.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-noData.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ - - - - -
- - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,114 +0,0 @@ -From test@kolab.org Fri May 01 15:13:51 2015 -From: testkey -To: you@you.com -Subject: non enc attachment -Date: Fri, 01 May 2015 17:13:51 +0200 -Message-ID: <20157069.RcaNBhWVXx@tabin.local> -X-KMail-Identity: 1197256126 -User-Agent: KMail/4.13.0.1 (Linux/3.19.1-towo.1-siduction-amd64; KDE/4.14.2; x86_64; git-cd33034; 2015-04-11) -MIME-Version: 1.0 -Content-Type: multipart/mixed; boundary="nextPart1612969.Xqz3IcFXZ3" -Content-Transfer-Encoding: 7Bit - -This is a multi-part message in MIME format. - ---nextPart1612969.Xqz3IcFXZ3 -Content-Type: multipart/encrypted; boundary="nextPart2213427.hvfAsaxZ1O"; protocol="application/pgp-encrypted" - - ---nextPart2213427.hvfAsaxZ1O -Content-Type: application/pgp-encrypted -Content-Disposition: attachment -Content-Transfer-Encoding: 7Bit - -Version: 1 ---nextPart2213427.hvfAsaxZ1O -Content-Type: application/octet-stream -Content-Disposition: inline; filename="msg.asc" -Content-Transfer-Encoding: 7Bit - ------BEGIN PGP MESSAGE----- -Version: GnuPG v2 - -hIwDGJlthTT7oq0BBACdvp3PFrRx6vxZhxt06LqyaO7+SWBbVUr7GOa3QaYCCBm+ -/KTUZEfhPuGVcsVpJKZbPsUKVhYfvYpDAsZu3TehmKflobWAV/cCIK2BkQB744pd -oaCtTj7pmCO05Zt5Uo/tXbrgceuW+/huwn2DO2fk4MUBsluH3fMbvccZJnR3yoUB -DAMMzkNap8zaOwEIAOTKI8Bh3NhfuJdWDsjv+UT6E4kf/zg3D95mJ+3gK8kHFXdd -YyEKaMsYx64kSwm1KcjsJ4gWykJlB34YDDfcIrnbgO2QRss9GhgOcUtLr0KNcY+0 -OJ4sbNmI8I3XssMb4rHtDrcXc0ODd0v/C/Lw2VfUdN+bBY4EetG096OPiZ4R41kF -Rj95nhO8tpoJx9VltegCdZI2AxtykOYvUaLFyYqCoKMmQwqGjdaUv1CeMnxUIPsn -A/x6TQ0AjpZ5IfMqO7QmOv3ACFo5/Ur93NauOK6szg/zdih9OxUL0Qid3nZQQwqA -J9ZChTcUgdjQo8EjpWLy0oXR9uLSHcLwRo3OdRzS6QEz7Dus6hmpEal3zTZFj2NR -mK38tpp+eWhzSAFAx8tyImz8SU2N2o7xQHlEdlWYGeIQg0embMnmMv6WJVWhYahb -x5OTfHCGwHFsLhZDmtaNhAVMlYdqxKXoR45H9cmGNPpU5kN5Ckjr6I+I51cfgAOE -1vF54jYHXd1btfGrwAyKWBfFVQFPWjuIUdsEl8zDjNTmcCCbA77tEGohSqDi+WWL -LyYw5g/uwwZ+5OzeRdjAJ+9xtJ+WXhnDUffG8GgGgZWBQD+S2Ix4lZ2NcAeyLPt/ -cXeDHkPUXj7cjm0hl7SvBKzR6X4EEWO/hh19mxngd4+e19q6Qm4K2QMfTwQQyNED -whBkRXhcXcRxWlb/ICwFDIgxKLJko5HVTknBJDllNdm6l2C4Y9/IY2imqXni8xZX -zQfAkDOBlfouUrHbPuBCRdCLmp7BgbanCaJDvgYGBvXEgjMKpV3bezTfm4Ugwiyk -dJfMu/4XftZy7XqoFuDheNXuQ5JobpvVDaiTQ0EWHpHeX3TZ0xa8i1FO6ANLakUp -aVFWzYl91bxbNHIcPh278neyi+LNWWT6TvkCwcbUYUfuIySOwfSUJAHDIJOx50Ha -If0fNQDtF4o9mDFwXDwVf8e2zx5NjheqgYX/qIWjFE2cCCkUM4UkNrkYBOiwnh9F -RJz4M6wKPhZT34MBlTKgwDbypDp+XYnM2HunzIDXCAigYsD/AuLNeFwsIPiXWJ47 -oXamEJxyqS9G0t/iy7+1mbNiFct7pvHt6QUKZ9aXSXj3MkQuWjjVNvMz6KocTSyL -AeWQNYuvA5NkyZOA5+VU1ma3wn7IAXYkgw+OMvcz9VNevXNg956ZnGbb47Fqppp+ -MjK2ptM1UzIEnHxXtq3KFrXG1AzzhyFnKIjsiDpFTlMGTT9pRGnK8zyYXYPEgpwW -874A5auLFOvhwPSNMhMai+XSoE3P+zZDqhXMYU8c49O+SeOtISg3Iy5tXuIPlIps -7k0KA60hPulMYBQLtZ/yDO/gXhkeWaw= -=EJZ6 ------END PGP MESSAGE----- - ---nextPart2213427.hvfAsaxZ1O-- - ---nextPart1612969.Xqz3IcFXZ3 -Content-Disposition: attachment; filename="image.png" -Content-Transfer-Encoding: base64 -Content-Type: image/png; name="image.png" - -iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAlwSFlzAAAb -rwAAG68BXhqRHAAAAAd0SU1FB9gHFg8aNG8uqeIAAAAGYktHRAD/AP8A/6C9p5MAAAkqSURBVHja -5VV7cFTVGf/OPefeu3fv3t1NdhMSCHkKASEpyEsaGwalWEWntLV1Wu0fdOxAx9Iq0xntAwac6ehY -p+rwKLbjjLRFh9JadURKRGgFQTTECCYQE9nNgzzYZDe7m33d1+l3tpOOU61T2tF/+s1s7pzn9/t+ -v993Av/3QT6FO6WdO/d+M55Il8rMOdrT0x3Zt++3+c8EgM/nozseeviJiYmpe1zOQdM8BOOCIku/ -lIj1VrQ/0r9n9+78xwLgeAA3w4fHXV1d5Omnn6aapumlJSVVqalUJJvJZRdcu0RSfZQsaW7mjfPm -cbF9+/btEIlEaq6Z03whXyhIjDFuGIZEKSP5fMFRVcVNT2Vf0jzsmMxYGtel9rff/vM/M8bjcZpM -Jp1XX32VNDc3e7ovRP3JyZGVNdXVd1FGGwKBQEM8njiWTKV36IHgEACwibGx62LjU/cBd01Zljoc -p9DHmLbHsmyK1UuKooJt24IMcLE+y3L45eEYLS8LgWH4YXR0bAPZtGmTVFvfoBZMEzKpFKmqqmqp -qane4DhOteH3L1FkWZVlGSzLAtd1Oe4773C4LxoZvDWXh82OY2MtwAuFvCvSyDIFXdelYDDIvF4d -xPzA0AgXFStMcWPxBPGoKvXpPh6JDG5hK1Zcv1H36Xc6tsMs21EMQ69CLSts2wGkDygTyW2CP8gX -TKLIyvx0OrdDUXyLKXVUkdSne4QKtFAwuWmabjAYkDyqAgG/jziORh1EKaonkkQt2yRZRC5JHEGn -L7OKyopNqqo2IbWQjqWgLOwFBFKsuGDa4PVyIssMk1sCACCjimXbrbquYKW41zJJOpXkeARyeZNQ -SUKwHEqCKnBuAybkZeFSmssVSDKdhlBpCRgIcnQsdvKPB19sY4rMNIaH0BhQUVHKvXgpIiQF0wK/ -4QORnOEayoDzOSBMXK4BSgpeTcMECqiqTDKZHDKmct3LCI55Kp0mQgK/3yDYkgIc3kNhfHzCkRk9 -p6nk+yPD3SmWzeZiKNkciUrg2g5BjQWdSBchiEvQjzoWAFkUYPDrCjBFUEJ8AhSIRyl2jcfjEL9h -AFJODL8B6H7IZrNIt2g3B1mysShdQhmbT58+ExRdx3L5/PNomGU4kJkuA9ILYn+JP4CXOoDUoWO9 -IBhCSBCLTYCK+rqOg8CKvY6JPQhGxjkX1zyAdwrgAhTKWBDmxTUTC7Tcy5dHBiilL7cdaTsNGAwP -7o32D4Q9HnWTrvsCiqIgdWgqDkJfkKgDU1MZcBGMhbKgj2B0LIle8eNhgiBsoMwFEY7rQDqVwlo5 -esUE/AAR81gUYIUT8UR2//4/rK+pLjs3MhIFEVJN9WwXK2oM+P1BREpQO0hjwkw+BzJWY1oOXB5L -w9DIOGTQvYS4UFqigR9ZwUqEXFghVop059AjonqcAIZrqCKg31AS3OU66Adf4sabWqKvvHIYpoNh -y+Vj4xMHVEW93eUuo0izhT4oRbcSIoALbRle4AVVkfBup6g9thwCzRX1VRQmdMeqLVETEIkW2ZNx -H8oqzqAfXCGJEQ6XBQEgNQ2A7tq1C1a1tvaattOOrVFOqVSLCQhqU6QPx+DTsOU0GavLYUV20Qv4 -rEIymYNQuB48Wkg8QTA0NIQeYKB6NGTgH90jIcJEMikAi1dRRo9NLV583ek33jjpFAGIPw8++IAj -e9SIRGm5wliraVosnTWLmmemUugBkTiPSS3AtgV8VQA9A8LxdfULYXBoEKv2wMhIn2BHGFR0DZ6d -glQ6hUDT6A/RWVSSmfx5DjxRV1vzVkdHBzDAWLNmDezc+aQVqqz5dSY52Z63nLn9A33lI9myLXNL -xv0Fq3gWutMN0BToxcso+AN+cKmOXI5A9P12mKDzYNXcZXDq1F+h+IboFgzb1VAhDULeJpxwC19G -g/uMgOXVfXW1tbWCYM6mtdi8+YfiM4m/Y1UrHzkergyXz/3czImCnRjuHiW3qxpPqGFPy6SpHJC9 -IR+Sm+2N8i/dcMOMZdGeshcrS/S58+c3zU2Z8oVD50cbVfP8M4pGkymoUxLxsUzOVhtmQ+5432Rg -oj6QOLFj28/caQk+EjMXraUV1eW+8dH06StQZnlnNbQefGTD92pWfu3I6TOT8oY7brv4hWUt3xiw -2OrlDVVdRslsd2Fd469Q8sUB3c8uOW49SdHX1rbcePhoz3B7feuqlt5oZtBTv+ioSdXc7q3fHQaM -fwtg6Vd/dEvn8Qssnzg/0Ns56jRcO6Nw4d1Af+/RH0/cdv+O/fRK7KnmBXPWGsQeDPhK9oWC6hdd -R3pdUcg88Tx7U7Ej1y1qMjreGwjt/cnaF2YtvCXQe7bzxLkj+/sunT0Ry00OwHRI8DERLqeNmqGV -JZJVC6Yu7UxMOfLFlV9pWQcYp57/013rb1u9ua29b0Ch4bsl4tKLY5P1sgxNJzsHDj136KzS3NTk -9mTNusPvXJLrbnjUe/b16FDfsZ/3xC8d4/HoCQ4Anwzg91vWPL7+3pvvDM806sTY4IVyMxfrojO3 -BVubbyJMhnVVM3y+l187/nChIJ2ZpSs9hMD4qC6t6x6+0gkAoRC33/Sb8RdmXj9nzvWraivhP47g -AyHxKb1mfWkRYHCjMb30nafeeWzerU9963w3L3/02c4f7D0y0NXTx3f3D/JTb7bzxpeODu55+PGT -yy5F+ZmeD/iSrh5efeJd/hGZP5GBux+6cysY3w7H+16IVy65V6trnn3P9JqVjQ3JuSsdHhWW6hIL -NuhyUpJgEF/ofSVBeLBuVtVjd3y55SHXhQ8UBht0DR4r98Fs+IRg/zrxlz2/2A7p5yYBY93Gu+4f -H5xojLwOxfjd/WufOHhQ/IcD7eYVC5YyCjFMfkVV4NpMFvpTachoZeDaNryLnliOczsUCv1XBWD8 -YjF5MWJ9kcT757qenR7vf4bDoqWwHCvUUfPNsQQMWSZAZTlsw7nxYQQTcuDrjgQuPn7z/D7YivNt -nPPfEDzwqcU75/j6SD/f8uG5vXs5dL7Hjb+d4gp8mnF8nAOabjcac+OBAxyuNiT4HyNwGZYgu0RW -IDt/Icz4zAC0tXE4183rQ6XwU9uBXgLQ5Teg7GIv1+EqgsF/GY4DtCQALZMp2ITttmqoHzpWr756 -o/0d59+Lh3Y1HHcAAAAASUVORK5CYII= - ---nextPart1612969.Xqz3IcFXZ3-- - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ - - - - -
- - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,91 +0,0 @@ -From: firstname.lastname@example.com -To: test@kolab.org -Subject: OpenPGP encrypted one signed and one unsigned attachment -Date: Sun, 30 Aug 2015 12:08:40 +0200 -Message-ID: <1737262.ESByPkoaL9@vkpc5> -X-KMail-Identity: 402312391 -X-KMail-Dictionary: en_US -User-Agent: KMail/5.0.42 pre (Linux/3.16.6-2-desktop; KDE/5.14.0; x86_64; ; ) -MIME-Version: 1.0 -Content-Type: multipart/mixed; boundary="nextPart2760349.k2GQmrcl5a" -Content-Transfer-Encoding: 7Bit - -This is a multi-part message in MIME format. - ---nextPart2760349.k2GQmrcl5a -Content-Type: multipart/encrypted; boundary="nextPart2260160.XvshVD34ka"; protocol="application/pgp-encrypted" - ---nextPart2260160.XvshVD34ka -Content-Type: application/pgp-encrypted -Content-Disposition: attachment -Content-Transfer-Encoding: 7Bit - -Version: 1 ---nextPart2260160.XvshVD34ka -Content-Type: application/octet-stream -Content-Disposition: inline; filename="msg.asc" -Content-Transfer-Encoding: 7Bit - ------BEGIN PGP MESSAGE----- -Version: GnuPG v2 - -hQEMAwzOQ1qnzNo7AQgAooa+Peu1t5aiX4WvssEnRlapkr62/49/Dbz5assvshdr -o9zOC+89Qr5P/ea+tC1MO7ek/DfyL9C4EzOMp/r08GeInLqWMc9qLZO//YaT2JUp -0IZFbpUQ4C2zjXMRuy/PMrltHuCfsvhvHX1YAHp/xjRsKpQoE3mSDzz5sc8/Hj9n -2eoKoCEW1rgt2qHtV4DD6lvUPo42LMZclJ9GqfoD7WLoEH9ebRLhXr3D00j6xBfy -//nooAhzQSW8b7GZth4Qc7DKAZMhuEly/kp07nhuPd1fMJDEAB/zh9EYlgnn3STb -MCdtFs6kMC24uA2eDCH330Bn9OzzWnsVU9ae4XiKnNLpAeactSFRKKvGytBQaloq -Gvn1+D0Xmw6OsSmRJ84DzKqG4E6bzE+XhMEMnLlqDvZDsOtU/sCGvMK0MM3y5B7M -ONqWLN3ng3zrGPec5gqfvnWgKpANUrbJkzS8LNjv4hwoKh0tFpghWQiefG0Z9Hw1 -UaYbFwvaFgXcm72oBkynDCleWjQ2vnDE4P38PldqZbAW/Pw1q6Yq8m9MhS1VpbI5 -WBjuRQhgQvMG0LY0gR/3Qor5tX9ASllWnPfWYVuOiSOAe5Hsp7BmELXkWftHii7k -YW0Qim7jleDaY1MGfFr0vrO/PiYxGTb+4IUyUgEBYEpxa9ozUoeftF6JbHPuEZI0 -ENX8aIVJ9FnpssrR5HlpXieF12ec9ZFeV7mAwcucJ3RXuDcQHQTHgEbfnzTsaEpL -Hxs+6euOCJXhKOYVrsAlB4IxK0OQm4XHiZ7WBp5Jp7rlSHltdxFpSnHIfqngyCA4 -L+c/gsUEVbNI++iOOhOKVT47XIf+s/xa1Y4XghGbHIA3/pQphYo4U5dTeLoX0OWI -64tPxliQTKuJ+NAv9Km2bDgvlvn83jsc94THi5u+fIdDEGp7pgoQNXR69Lkz1bsA -Hh9xqKzVloHu4SsT3OGX+bfTO3jUh8ieU/4tflZMrJ9RkEfE08PzTnopT08FppFx -QWpHv/fwyJf6Cw1IevM5pVLAShg0sbCPF/xsYTjSyWNib1wFtxkmv5MToCFwkxi5 -b1yT23BNlV5RV6wcjmrum7p2fMwPjbt8X6z+pgUtkD7zImBWeYddMjgSjOFuFEjF -gpfVoV3OIvMPZMe2jqWsjnjujHJr2z5IZn3A7WI0b4SIDP0sGwsTBiogKqcBNWpn -O4MKUq9JwC0K/MY7yS1MCLoHfwU18z19Es/flaAgwtXk8IWIcjkkumAwNl+y8Q+I -+8AFGdiXTKld9QVwCKnMS3QivHPuFNL8rfcWKsr1nOhOEhaO+zD94eOOiCbwiXGr -E6WsewNCVQUN4bxAXl2vRi+9WRctLy7bsuIL5dgUz0CMYkQ+dDmrBflD0nyC -=TGNA ------END PGP MESSAGE----- - ---nextPart2260160.XvshVD34ka-- - ---nextPart2760349.k2GQmrcl5a -Content-Type: multipart/encrypted; boundary="nextPart22530242.iRl14SoP0Q"; protocol="application/pgp-encrypted" - ---nextPart22530242.iRl14SoP0Q -Content-Type: application/pgp-encrypted -Content-Disposition: attachment -Content-Transfer-Encoding: 7Bit - -Version: 1 ---nextPart22530242.iRl14SoP0Q -Content-Type: application/octet-stream -Content-Disposition: inline; filename="msg.asc" -Content-Transfer-Encoding: 7Bit - ------BEGIN PGP MESSAGE----- -Version: GnuPG v2 - -hQEMAwzOQ1qnzNo7AQgAtA94bBRwgpo64zcyh+4dzt0Pr2pmNjiS4ZX+a/xzYCmD -oS1a26s/LVZH+aJYC13l1kEu+6YjKn+ruQvMfhihOxglHBLjmUO17TPFC05AReSn -amMqPbgS6mOwhlBJHrBa/SVwkxmbMaNBUJ/KxRXFtTW/V4pPWImRvI9mnmpo8fHy -ZLvVAI3hGe7vPG5Vbdi5/Iu/JzqwlglVsP82gYpLlx7HhWGF4gmTGc6YBwFtzEvS -eqFtKRDqN60bo4HnNLOEnMaWlYPTpt3QibLWWIbtpA1Gb0Q/1NvDnn3Lyj8H+0WV -8H6Ks9/cvAuoAMOad6y4gDJb+K/AS7Ha+08/3lMYG9LAAgGe8Qocxg1W3ha1o0Ph -YSfV2ooebsLiHjwspjYpsX5ijnRj6uNGp5Dt28EIo1ANF+oDiSKEwAMGPBtcnqaO -FWXy39dP3VXE73nsO+dyTidaATFBlYg+IpPTDSFTgsk7XDV973EpdXvOkBEp/vBv -EZknuZFOkS0v5QHk9Y/hhlSLACTIEWQpBiFGOwUVSZFXLEY5zQNTbQdRbz3ZYcE9 -mIFzD9Ujw6tIJIOFazhwr9SxxyeaAygWeg4ifmmdhAsmFYum -=WsAv ------END PGP MESSAGE----- - ---nextPart22530242.iRl14SoP0Q-- - ---nextPart2760349.k2GQmrcl5a-- diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,99 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted+signed.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted+signed.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted+signed.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted+signed.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -From test@kolab.org Wed, 08 Sep 2010 17:02:52 +0200 -From: OpenPGP Test -To: test@kolab.org -Subject: OpenPGP encrypted -Date: Wed, 08 Sep 2010 17:02:52 +0200 -User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) -MIME-Version: 1.0 -Content-Type: multipart/encrypted; boundary="nextPart1357031.ppLHckZtsp"; protocol="application/pgp-encrypted" -Content-Transfer-Encoding: 7Bit - - ---nextPart1357031.ppLHckZtsp -Content-Type: application/pgp-encrypted -Content-Disposition: attachment - -Version: 1 ---nextPart1357031.ppLHckZtsp -Content-Type: application/octet-stream -Content-Disposition: inline; filename="msg.asc" - ------BEGIN PGP MESSAGE----- -Version: GnuPG v2 - -hQEMAwzOQ1qnzNo7AQgAkQI925mOOybpzcGcjUE7jmfMVoUvJW6Br9Zx9UEtko5H -fdmnrrUhFDyhBdwcg2E6AChipNcJjZhdX17lNAO0kI2IoPJAEkX9lyhjoiVEH/M8 -xmJEKFRejYzefx0S8esKyqqtfAmMKfsA5HmKRY8iDmQnI5d/FKhkcqLTJYo7fQyL -rEEycdr5PU5OJbMtE5+8+kbmG8PywjiCCad68FXakXIEFyWX1A99W/0ScWtqrqDB -kuQSdxJs4aAZWopxGKxDobt/qVyG6W6+PUnLx3eg80KytcWNxLJRV7WEJMj4OYCU -JdHrh4J1DTTRbuRmqx9de3fBDFHNNZpJP43UJYJWtoSMAxiZbYU0+6KtAQQAnRxD -XNwzBSmPk9NG3HYf/RleTAS8/fMp3D973Y3VF5JV72ljWqZO/1o/3RIpD0pl5nSE -nI0wPyncmPvAgQl5EAKTdYonKLuMCTbQ4eT7vkOdfA/HUxgaoE8ppH/OYXDDiqz/ -2GlNCCHcaQcVWwkHbWWgyhd/VvB7Mt9PVqPgTsHSwQ4BZf/JDwWe3MDAg21Raryf -dN4ZmWUzd3osDIRyy8H2hZL9vgZ3r0auIP6DMyYrPf3yTj9ApZeBiIpgBvqMwvR/ -8si6r1JaXr48KRCxAkn9fIXe2jMwQE2bk5tYDrTXY868V3DA5iKq1dgXUSn0tzG3 -0x9pjaOFkwxm0wtlpwnhZREJ9/ieIY7hy6p7CDpq4ZGRh8jQta4tWrjxN0wly+Dh -a9TjzHzgTh9BTh7vjcDLitOQFL5NcCQtK717FQ5Z1DRnkHDVLPoyPnW+5sllOVr9 -UcqNXwrPbrtElFjHULL5Y1pem1+AE6nCAtlvCAc7cil6QDsU508sOXW7BhTWATIU -tGHg/nIC0qVs24LR3MyYrwvfXL2JOkN/IK/g+0bbs6DMYVYaEOjcjqtidxWuLsE5 -aFEwlUFzcTcSauW+AOKwH+YFihRnlh9+4taaZxGZeutb12D5u8eEk+3nyVcsdogY -k/nT6ElN8i/Z2vgcxL6ABvB+g/bZmp/eCJphDNYc00lP8NMC4EEJvTZL438ThJ3j -wz0Qo4PlV0/OMXYxP2iZup2/rCe+pkmc9Gyz3Mkal4/9bBtIgP9cWBR7JZLMrK50 -KO4+NtrZYEY4JXRJlAo= -=1lYB ------END PGP MESSAGE----- - ---nextPart1357031.ppLHckZtsp-- diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted+signed.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted+signed.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted+signed.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted+signed.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-two-attachments.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-two-attachments.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-two-attachments.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-two-attachments.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -From: firstname.lastname@example.com -To: test@kolab.org -Subject: OpenPGP encrypted with 2 text attachments -Date: Sun, 30 Aug 2015 12:05:17 +0200 -Message-ID: <1505824.VT0nqpAGu0@vkpc5> -X-KMail-Identity: 402312391 -X-KMail-Dictionary: en_US -User-Agent: KMail/5.0.42 pre (Linux/3.16.6-2-desktop; KDE/5.14.0; x86_64; ; ) -MIME-Version: 1.0 -Content-Type: multipart/encrypted; boundary="nextPart3335835.KxmPgziKxd"; protocol="application/pgp-encrypted" - ---nextPart3335835.KxmPgziKxd -Content-Type: application/pgp-encrypted -Content-Disposition: attachment -Content-Transfer-Encoding: 7Bit - -Version: 1 ---nextPart3335835.KxmPgziKxd -Content-Type: application/octet-stream -Content-Disposition: inline; filename="msg.asc" -Content-Transfer-Encoding: 7Bit - ------BEGIN PGP MESSAGE----- -Version: GnuPG v2 - -hQEMAwzOQ1qnzNo7AQgA6tTJs017mI+xuhjcSTr3F5X/rJghq0oaXbjk1K0W33p+ -jsEyPTbuUIvI2a+5xHJ3BV+gnnO0Xosz57tGTF/eVAySnGiMse5cu2RQR9b/9EkC -uzt3tIChyub3GUODG3yzXqkhSiwIImvedWgnJYTJ7eeBkWdizVT0b0byiG2d7Hjq -hzYzyPJRwuoE36hryDsFycAhPfSsQAirxDJXk4HTsfBCmz7tzJhtt4wKc7z5m8fq -y+jddnDADq5+tykJS6zemJOzgU3AOQyVJbmsx2vTV1CJdpKPHvTTgghpAaSuVbg0 -tR9BX1nPnA/bgX/V7C+3PwuCvB0ZKmv5d8kaGaTwO9LAhQGaWTfhG1cyy+MJhXdR -rH63PMkZh/lrvj7qJYofI5iVoe1CiMaX44BiwKVclGf7bEFdzc2NSRvvTSzisN3T -nSzydEttuEY5jGagQQNT1l1l4I8HAtUgwGtkKZVTAUL6iKHYAqzB77sRs33UJy4k -ZSIWFnSY8l+HLG+MYKsYCGsvJHkxEHnMiS1EZcmpUFhxOGQpiF2rJ4qnL2jbFWbA -9N1O5N1N/DJ/YKjwgy/jVVj6AOCrBZrxvKKt2mtG/wVX0F/KSKiEd8mgrLIx1udw -tibiDAJmDxUk8K0lAdOHBrzBChvysiT/QxCJFcSY6FE99Rral+BWjeyAIQQWvc2B -cEceZCtzjCOrwvoJwl2uEX+51nmMp+z1EoeyyhmUZZ4y65yOg4P6KGXGcLmIjSbH -IhsSls1jRkSrypf/wcEd6o7KZdeYbfA= -=Sud3 ------END PGP MESSAGE----- - ---nextPart3335835.KxmPgziKxd-- diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-two-attachments.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-two-attachments.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-encrypted-two-attachments.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-encrypted-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-inline-charset-encrypted.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-inline-charset-encrypted.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-inline-charset-encrypted.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-inline-charset-encrypted.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -From test@example.com Thu, 17 Oct 2013 02:13:03 +0200 -Return-Path: -Delivered-To: you@you.com -Received: from localhost (localhost [127.0.0.1]) - by test@example.com (Postfix) with ESMTP id B30D8120030 - for ; Thu, 17 Oct 2013 02:13:05 +0200 (CEST) -From: test -To: you@you.com -Subject: charset -Date: Thu, 17 Oct 2013 02:13:03 +0200 -Message-ID: <4081645.yGjUJ4o4Se@example.local> -User-Agent: KMail/4.12 pre (Linux/3.11-4.towo-siduction-amd64; KDE/4.11.2; x86_64; git-f7f14e3; 2013-10-15) -MIME-Version: 1.0 -Content-Transfer-Encoding: 7Bit -Content-Type: text/plain; charset="ISO-8859-15" - ------BEGIN PGP MESSAGE----- -Version: GnuPG v2.0.22 (GNU/Linux) - -hIwDGJlthTT7oq0BBACbaRZudMigMTetPZNRgkfEXv4QQowR1jborw0dcgKKqMQ1 -6o67NkpxvmXKGJTfTVCLBX3nk6FKYo6NwlPCyU7X9X0DDk8hvaBdR9wGfrdm5YWX -GKOzcqJY1EypiMsspXeZvjzEW7O8I956c3vBb/2pM3xqYEK1kh8+d9bVH+cjf4UB -DAMMzkNap8zaOwEH/1rPShyYL8meJN+/GGgS8+Nf1BW5pSHdAPCg0dnX4QCLEx7u -GkBU6N4JGYayaCBofibOLacQPhYZdnR5Xb/Pvrx03GrzyzyDp0WyeI9nGNfkani7 -sCRWbzlMPsEvGEvJVnMLNRSk4xhPIWumL4APkw+Mgi6mf+Br8z0RhfnGwyMA53Mr -pG9VQKlq3v7/aaN40pMjAsxiytcHS515jXrb3Ko4pWbTlAr/eytOEfkLRJgSOpQT -BY7lWs+UQJqiG8Yn65vS9LMDNJgX9EOGx77Z4u9wvv4ZieOxzgbHGg5kYCoae7ba -hxZeNjYKscH+E6epbOxM/wlTdr4UTiiW9dMsH0zSwMUB891gToeXq+LDGEPTKVSX -tsJm4HS/kISJBwrCI4EUqWZML6xQ427NkZGmF2z/sD3kmL66GjspIKnb4zHmXacp -84n2KrI9s7p6AnKnQjsxvB/4/lpXPCIY5GH7KjySEJiMsHECzeN1dJSL6keykBsx -DtmYDA+dhZ6UWbwzx/78+mjNREhyp/UiSAmLzlJh89OH/xelAPvKcIosYwz4cY9N -wjralTmL+Y0aHKeZJOeqPLaXADcPFiZrCNPCH65Ey5GEtDpjLpEbjVbykPV9+YkK -7JKW6bwMraOl5zmAoR77PWMo3IoYb9q4GuqDr1V2ZGlb7eMH1gj1nfgfVintKC1X -3jFfy7aK6LIQDVKEwbi0SxVXTKStuliVUy5oX4woDOxmTEotJf1QlKZpn5oF20UP -tumYrp0SPoP8Bo4EVRVaLupduI5cYce1q/kFj9Iho/wk56MoG9PxMMfsH7oKg3AA -CqQ6/kM4oJNdN5xIf1EH5HeaNFkDy1jlLznnhwVAZKPo/9ffpg== -=bPqu ------END PGP MESSAGE----- - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-inline-charset-encrypted.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-inline-charset-encrypted.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-inline-charset-encrypted.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-inline-charset-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-inline-signed-broken.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-inline-signed-broken.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-inline-signed-broken.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-inline-signed-broken.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -From: test -To: you@you.de -Subject: test -Date: Tue, 25 Aug 2015 16:47:10 +0200 -Message-ID: <1662097.O9NVKTC5pT@11b508545ba2> -X-KMail-Identity: 1428848833 -User-Agent: KMail/4.13.0.3 (Linux/4.1.0-rc5-siduction-amd64; KDE/4.14.3; x86_64; git-7c86098; 2015-08-23) -MIME-Version: 1.0 -Content-Transfer-Encoding: quoted-printable -Content-Type: text/plain; charset="iso-8859-1" - ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA256 - -ohno break it =F6=E4=FC ------BEGIN PGP SIGNATURE----- -Version: GnuPG v2 - -iQEcBAEBCAAGBQJV3H/vAAoJEI2YYMWPJG3mEZQH/2mbCDa60risTUsomEecasc7 -kIc8Ch+OjZwlEQWKEiFbpLCMVjMwf0oGFcpc/dqnIyIqeVvF6Em+v7iqKuyAaihu -7ZxxC816tDDI7UIpmyWu39McqGB/2hoA/q+QAMgBiaIuMwYJK9Aw08hXzoCds6O7 -Uor2Y6kMSwEiRnTSYvQHdoaZY3F9SFTLPgjvwfSu7scvp7xvH7bAVIqGGfkLjXpP -OFkDhEqUI7ORwD5cvvzEu57XmbGB7Nj5LRCGcTq6IlaGeN6Pw5+hOdd6MQ4iISwy -870msP9NvktURnfXYC3fYnJaK/eUln7LYCBl/k04Z/3Um6dMYyQGh63oGv/2qxQ=3D -=3D4ctb ------END PGP SIGNATURE----- diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-inline-signed.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-inline-signed.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-inline-signed.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-inline-signed.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -From: test -To: you@you.de -Subject: test -Date: Tue, 25 Aug 2015 16:47:10 +0200 -Message-ID: <1662097.O9NVKTC5pT@11b508545ba2> -X-KMail-Identity: 1428848833 -User-Agent: KMail/4.13.0.3 (Linux/4.1.0-rc5-siduction-amd64; KDE/4.14.3; x86_64; git-7c86098; 2015-08-23) -MIME-Version: 1.0 -Content-Transfer-Encoding: quoted-printable -Content-Type: text/plain; charset="iso-8859-1" - ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA256 - -ohno =F6=E4=FC ------BEGIN PGP SIGNATURE----- -Version: GnuPG v2 - -iQEcBAEBCAAGBQJV3H/vAAoJEI2YYMWPJG3mEZQH/2mbCDa60risTUsomEecasc7 -kIc8Ch+OjZwlEQWKEiFbpLCMVjMwf0oGFcpc/dqnIyIqeVvF6Em+v7iqKuyAaihu -7ZxxC816tDDI7UIpmyWu39McqGB/2hoA/q+QAMgBiaIuMwYJK9Aw08hXzoCds6O7 -Uor2Y6kMSwEiRnTSYvQHdoaZY3F9SFTLPgjvwfSu7scvp7xvH7bAVIqGGfkLjXpP -OFkDhEqUI7ORwD5cvvzEu57XmbGB7Nj5LRCGcTq6IlaGeN6Pw5+hOdd6MQ4iISwy -870msP9NvktURnfXYC3fYnJaK/eUln7LYCBl/k04Z/3Um6dMYyQGh63oGv/2qxQ=3D -=3D4ctb ------END PGP SIGNATURE----- diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-inline-signed.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-inline-signed.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-inline-signed.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-inline-signed.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-base64-mailman-footer.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-base64-mailman-footer.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-base64-mailman-footer.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-base64-mailman-footer.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,117 +0,0 @@ -Return-Path: -X-Sieve: CMU Sieve 2.3 -X-Virus-Scanned: amavisd-new at site -Authentication-Results: linux.site (amavisd-new); dkim=pass (1024-bit key) - header.d=kde.org -Received: from postbox.kde.org (localhost.localdomain [127.0.0.1]) - by postbox.kde.org (Postfix) with ESMTP id 867B8BF274; - Sat, 22 Aug 2015 09:32:21 +0000 (UTC) -DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=kde.org; s=default; - t=1440235945; bh=WhGhdxvdvRs04JdzjAkPcBVPmx7putlUE3ka9dvMIoc=; - h=From:To:Date:Subject:Reply-To:List-Id:List-Unsubscribe:List-Post: - List-Help:List-Subscribe:From; - b=mvxeMMGebkZKq7hekRypkPvt6S8lidA/8vQ3AC5Kft8HDmj8lDUpvOo0VXwCF0OG+ - iAOPKxYtxclf8PgYvgK8NIzr56CwcdlNm3/PpoSe20P3I1DGFpDDMFtW5tOD05SSHz - 5L6PCQyb+KFW1GrXgcm+eHshzJh3U8nHcyd8Vw2E= -X-Original-To: kde-pim@kde.org -Delivered-To: kde-pim@localhost.kde.org -X-Virus-Scanned: amavisd-new at site -From: Volker Krause -To: KDEPIM -Date: Sat, 22 Aug 2015 11:31:38 +0200 -Message-ID: <11737387.KAAPH2KlE3@vkpc5> -Organization: KDE -User-Agent: KMail/4.14.3 (Linux/3.16.6-2-desktop; KDE/4.14.7; x86_64; - git-c97b13e; 2014-12-30) -MIME-Version: 1.0 -Subject: [Kde-pim] Phabricator Project Setup -X-BeenThere: kde-pim@kde.org -X-Mailman-Version: 2.1.16 -Precedence: list -Reply-To: KDE PIM -List-Id: KDE PIM -List-Unsubscribe: , - -List-Post: -List-Help: -List-Subscribe: , - -Content-Type: multipart/mixed; boundary="===============1910646461178264940==" -Errors-To: kde-pim-bounces@kde.org -Sender: "kde-pim" - - ---===============1910646461178264940== -Content-Type: multipart/signed; boundary="nextPart2440608.7aDuJBW7cK"; micalg="pgp-sha1"; protocol="application/pgp-signature" - ---nextPart2440608.7aDuJBW7cK -Content-Transfer-Encoding: quoted-printable -Content-Type: text/plain; charset="us-ascii" - -Hi, - -I've talked to Ben, the current Phabricator test setup would actually b= -e=20 -usable for "production" use for task/project management for us, without= -=20 -causing the sysadmins unreasonable trouble when migrating to the full=20= - -production deployment of Phabricator eventually. - -Phabricator project layout it orthogonal to repo layout, so we can stru= -cture=20 -this however we want. Among other teams I see at least the following la= -youts: -- single project for everything -- a project per release -- a project per component/module (ie. close to the repo layout) - -How do we want to structure this? - -I would start with a single project to not fragment this too much, as w= -e have=20 -a relatively small team actually looking into this, so everyone is look= -ing at=20 -most sub-projects anyway. And should we eventually hit scaling limits, = -we can=20 -always expand this I think. - -We of course should also talk about what we actually want to put in the= -re. My=20 -current motivation is having a place to collect the tasks for getting m= -ore of=20 -the former pimlibs into KF5, and anything else I run into on the way th= -ere=20 -that we eventually should clean up/improve. - -regards, -Volker - ---nextPart2440608.7aDuJBW7cK -Content-Type: application/pgp-signature; name="signature.asc" -Content-Description: This is a digitally signed message part. -Content-Transfer-Encoding: 7Bit - ------BEGIN PGP SIGNATURE----- -Version: GnuPG v2 - -iD8DBQBV2EF9f5bM1k0S0kcRAk9cAJ4vHEh9JkT3Jy3EfxII7nP9HPmxrQCgjeLF -eYXCyN9NRAyC6CHeNnWZN10= -=Y8W4 ------END PGP SIGNATURE----- - ---nextPart2440608.7aDuJBW7cK-- - - ---===============1910646461178264940== -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: base64 -Content-Disposition: inline - -X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KS0RFIFBJTSBt -YWlsaW5nIGxpc3Qga2RlLXBpbUBrZGUub3JnCmh0dHBzOi8vbWFpbC5rZGUub3JnL21haWxtYW4v -bGlzdGluZm8va2RlLXBpbQpLREUgUElNIGhvbWUgcGFnZSBhdCBodHRwOi8vcGltLmtkZS5vcmcv - ---===============1910646461178264940==-- - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-base64-mailman-footer.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-base64-mailman-footer.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-base64-mailman-footer.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-base64-mailman-footer.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,78 +0,0 @@ - - - - -
- -
- - - - -
-
- - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-encrypted.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-encrypted.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-encrypted.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-encrypted.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -From: OpenPGP Test -To: test@kolab.org -Subject: OpenPGP signed and encrypted -Date: Tue, 07 Sep 2010 18:08:44 +0200 -User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) -MIME-Version: 1.0 -Content-Type: multipart/encrypted; boundary="nextPart25203163.0xtB501Z4V"; protocol="application/pgp-encrypted" -Content-Transfer-Encoding: 7Bit - - ---nextPart25203163.0xtB501Z4V -Content-Type: application/pgp-encrypted -Content-Disposition: attachment - -Version: 1 ---nextPart25203163.0xtB501Z4V -Content-Type: application/octet-stream -Content-Disposition: inline; filename="msg.asc" - ------BEGIN PGP MESSAGE----- -Version: GnuPG v2.0.15 (GNU/Linux) - -hQEMAwzOQ1qnzNo7AQf7BFYWaGiCTGtXY59bSh3LCXNnWZejblYALxIUNXOFEXbm -y/YA95FmQsy3U5HRCAJV/DY1PEaJz1RTm9bcdIpDC3Ab2YzSwmOwV5fcoUOB2df4 -KjX19Q+2F3JxpPQ0N1gHf4dKfIu19LH+CKeFzUN13aJs5J4A5wlj+NjJikxzmxDS -kDtNYndynPmo9DJQcsUFw3gpvx5HaHvx1cT4mAB2M5cd2l+vN1jYbaWb0x5Zq41z -mRNI89aPieC3rcM2289m68fGloNbYvi8mZJu5RrI4Tbi/D7Rjm1y63lHgVV6AN88 -XAzRiedOeF99LoTBulrJdtT8AAgCs8nCetcWpIffdtLpAZiZkzHmYOU7nqGxqpRk -OVeUTrCn9DW2SMmHjaP4IiKnMvzEycu5F4a72+V1LeMIhMSjTRTq+ZE2PTaqH59z -QsMn7Nb6GlOICbTptRKNNtyJKO7xXlpT7YtvNKnCyEOkH2XrYH7GvpYCiuQ0/o+7 -SxV436ZejiYIg6DQDXJCoa2DXimGp0C10Jh0HwX0BixpoNtwEjkGRYcX6P/JzkH0 -oBood4Ly+Tiu6iVDisrK3AVGYpIzCrKkE9qULTw4R/jFKR2tcCqGb7Fxtk2LV7Md -3S+DyOKrvKQ5GNwbp9OE97pwk+Lr1JS3UAvj5f6BR+1PVNcC0i0wWkgwDjPh1eGD -enMQmorE6+N0uHtH2F4fOxo/TbbA3+zhI25kVW3bO03xyUl/cmQZeb52nvfOvtOo -gSb2j6bPkzljDMPEzrtJjbFtGHJbPfUQYJgZv9OE2EQIqpg6goIw279alBq6GLIX -pkO+dRmztzjcDyhcLxMuQ4cTizel/0J/bU7U6lvwHSyZVbT4Ev+opG5K70Hbqbwr -NZcgdWXbSeesxGM/oQaMeSurOevxVl+/zrTVAek61aRRd1baAYqgi2pf2V7y4oK3 -qkdxzmoFpRdNlfrQW65NZWnHOi9rC9XxANIwnVn3kRcDf+t2K4PrFluI157lXM/o -wX91j88fazysbJlQ6TjsApO9ETiPOFEBqouxCTtCZzlUgyVG8jpIjdHWFnagHeXH -+lXNdYjxnTWTjTxMOZC9ySMpXkjWdFI1ecxVwu6Ik6RX51rvBJAAXWP75yUjPKJ4 -rRi5oQl/VLl0QznO7lvgMPtUwgDVNWO/r7Kn9B387h9fAJZ/kWFAEDW2yhAzABqO -rCNKDzBPgfAwCnikCpMoCbOL7SU8BdbzQHD8/Lkv4m0pzliHQ/KkGF710koBzTmF -N7+wk9pwIuvcrEBQj567 -=GV0c ------END PGP MESSAGE----- - ---nextPart25203163.0xtB501Z4V-- diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-encrypted.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-encrypted.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-encrypted.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-encrypted-two-attachments.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-encrypted-two-attachments.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-encrypted-two-attachments.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-encrypted-two-attachments.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -From: firstname.lastname@example.com -To: test@kolab.org -Subject: OpenPGP signed+encrypted with 2 text attachments -Date: Sun, 30 Aug 2015 12:01:20 +0200 -Message-ID: <4368981.7YjI8cQ7Br@vkpc5> -X-KMail-Identity: 402312391 -X-KMail-Dictionary: en_US -User-Agent: KMail/5.0.42 pre (Linux/3.16.6-2-desktop; KDE/5.14.0; x86_64; ; ) -MIME-Version: 1.0 -Content-Type: multipart/encrypted; boundary="nextPart3246504.5GAivIUY6Q"; protocol="application/pgp-encrypted" - ---nextPart3246504.5GAivIUY6Q -Content-Type: application/pgp-encrypted -Content-Disposition: attachment -Content-Transfer-Encoding: 7Bit - -Version: 1 ---nextPart3246504.5GAivIUY6Q -Content-Type: application/octet-stream -Content-Disposition: inline; filename="msg.asc" -Content-Transfer-Encoding: 7Bit - ------BEGIN PGP MESSAGE----- -Version: GnuPG v2 - -hQEMAwzOQ1qnzNo7AQf9Ge9nFjtqLOKSQNhobS+0iCB2GUdLP7LCIWu6gBo9pWa+ -9wCNLxwmhqWOYv37RAk6v5VXjCYUX3/7UF7e7epSqo7YjS7VsUOow0gszQjJqocK -Gd1T1oyNknza6oaRGgVeWPOZVAPb+Gj+3yS8VZa33Aq2ay7F7eI8dvRUN7Z3TuAh -BOVV+itwHHzanfNG8RoCvokcE1vkANfvI3u7R4Q93U8Q+Qmjh1L5ypPe37N5BtAF -UCPCiD9XySHjm5PyXx8ImrJDeUgFs1YhYox4B6NKsCcmm7R8NdYZYGNo1kzR4yKV -FzMu1NUU/bwtvrpRXLe4dBL1pEkO2PpuMYDUR9+WVNLpAafTDbeIHPi/Z8v48seQ -JxscRehfOB3DG1xrvQTMFJc3UJEBqNMkM9gOxLKOQcCcZp79FMsfWB7EjjlPR1Oh -gyA5NR+4HxNw75Q5FpZ7qziWvIrb1Kzwfbsb9Dimx+MmiNMX9kUEPqkPo4pspwZ9 -pLCfjYUnikcnYyQ0b2ojsjQmLotYlz8mK0GH9L40zfFb1+oYfuu4Y9FPzHdPzNjx -aFRY8cJQy1CNkCITsz53kni5rk3zVsapq0+NeBDEBYoUqX815fo0W+HVF7/j/uhT -lPkJhRnJZPwOr5XgzPk3Yk9GlSRLJiqKF4/G8ya/nKyiNIebKM7DTcldWCmZM95B -BIftaRN4hvVBhl0ElFnZg0xLP1AePFuuplRQTDuW8gpaNKrxwXiF3d4XJdVmjh/p -YmnieIhbogUHFXugc3g9rE8c3oHA8b514ajSHUm9DXc0cXqw/DrsxXZtKXb+IDpF -uv9AiM7bSU7I0h/AlaAL5uU0mL58XhkXXFQtaTbMS+u4Rv/Ie1IsnlWR4QSc4m7x -91rfC1fIf/U43wwwnR+UjIRyr2vWcgTTpwnsZFDD8eSoJ8WqinazJRlMud6Sv+L6 -gI2wiCYyEYHrFEHy0WuS2nUSMNl5AWm31zB+erfKSLZr4EIFBIy4dJWZKwYhi46Q -pDbw1Svf7xVdHix+5UkkYy3AY70ipf5bxA7FTJ1geJa86VKShDkqVpU6EtT+YQIJ -7geWCyskT0DTaPp6qc8QpjajmRYssDcjiTke5WiqLQAjm8BIuny0fNm6kNC8KMS7 -eGmaBI2nB92bgrqlAW+LhvW95YB0dfO8beg3jKk8s6OJ4gicGFEFp6hXFfEsEZiv -gi7Q2QCVFvCV11884H8rtZYmMRFGmuVUvm6xh/z1xicmfSy0YUowgkA3jpi7o913 -fqmYOHAwzCxv8Zp7xBf9hLT8DxMXdxqYUnJ+FaEMRcFkJ1MAFBpQ9uDbbqAz5bd5 -F3d6o0JSleOOTDlNH7wpN15HYtaCx9v3mXLN9FY4Y1g4mE8wdU0JZn7sFEmgmAkV -/vj9khHS6eB01GPiCA6sy/u2tSdCQQ== -=1GHi ------END PGP MESSAGE----- - ---nextPart3246504.5GAivIUY6Q-- diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-encrypted-two-attachments.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-encrypted-two-attachments.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-encrypted-two-attachments.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-encrypted-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-mailinglist+additional-children.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-mailinglist+additional-children.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-mailinglist+additional-children.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-mailinglist+additional-children.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,126 +0,0 @@ -Return-Path: -Delivered-To: einar@heavensinferno.net -Received: from localhost (localhost.localdomain [127.0.0.1]) - by akihabara.dennogumi.org (Postfix) with ESMTP id 15AB75CD846 - for ; Mon, 8 Apr 2013 12:15:03 +0200 (CEST) -Authentication-Results: akihabara.dennogumi.org; dkim=pass - (1024-bit key; insecure key) header.i=@kde.org header.b=vQ0NnJ9g; - dkim-adsp=pass -X-Virus-Scanned: Debian amavisd-new at akihabara.dennogumi.org -X-Spam-Flag: NO -X-Spam-Score: -3.818 -X-Spam-Level: -X-Spam-Status: No, score=-3.818 required=5 tests=[BAYES_50=0.8, - RCVD_IN_DNSWL_MED=-2.3, RP_MATCHES_RCVD=-2.328, T_DKIM_INVALID=0.01] - autolearn=unavailable -Received: from akihabara.dennogumi.org ([127.0.0.1]) - by localhost (akihabara.dennogumi.org [127.0.0.1]) (amavisd-new, port 10024) - with ESMTP id RMAq-XNJ040f for ; - Mon, 8 Apr 2013 12:14:44 +0200 (CEST) -Received: from postbox.kde.org (postbox.kde.org [46.4.96.248]) - by akihabara.dennogumi.org (Postfix) with ESMTP id 321675CD845 - for ; Mon, 8 Apr 2013 12:14:44 +0200 (CEST) -Authentication-Results: akihabara.dennogumi.org; dkim=pass - (1024-bit key; insecure key) header.i=@kde.org header.b=vQ0NnJ9g; - dkim-adsp=pass -Received: from postbox.kde.org (localhost [IPv6:::1]) - by postbox.kde.org (Postfix) with ESMTP id 9F5E1B37F95; - Mon, 8 Apr 2013 10:13:32 +0000 (UTC) -DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=kde.org; s=default; - t=1365416012; bh=ZJtmtbDLoGFwSyJUINdTk4UpuX+xzxcjGp7LSPrKNUs=; - h=From:To:Subject:Date:Message-ID:MIME-Version:Reply-To:List-Id: - List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: - Content-Type:Sender; b=vQ0NnJ9gjeyPLhPbQx6o9UxmILkS9KrhaKG6luAS/GR - 6iR3HKXR3HE0BCkTMD5xmKL5ztFMGcU5e79fz0ch0sd2pnZ0y1WVw7KjCxsv/YtO9HM - OplAHmhwRI5zH8KKQbyvdPULvssI/ISdViAXmHw04hNPsBjsIGkTPgvNbPFuk= -X-Original-To: plasma-devel@kde.org -Delivered-To: plasma-devel@localhost.kde.org -Received: from mail.bddf.ca (unknown [64.141.113.219]) - by postbox.kde.org (Postfix) with ESMTP id 782C6B37BE6 - for ; Mon, 8 Apr 2013 09:51:17 +0000 (UTC) -Received: from freedom.localnet (242.13.24.31.ftth.as8758.net [31.24.13.242]) - (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) - (No client certificate requested) - by mail.bddf.ca (Postfix) with ESMTPSA id 0CB712DC040 - for ; Mon, 8 Apr 2013 03:51:16 -0600 (MDT) -From: "Aaron J. Seigo" -To: plasma-devel@kde.org -Subject: activities_optional branch in kde-workspace -Date: Mon, 08 Apr 2013 11:51:11 +0200 -Message-ID: <4143483.eqrJjo7JEn@freedom> -User-Agent: KMail/4.11 pre (Linux/3.6.3-1-desktop; KDE/4.10.60; i686; - git-da50be0; 2013-03-12) -MIME-Version: 1.0 -X-Scanned-By: MIMEDefang 2.71 on 46.4.96.248 -X-BeenThere: plasma-devel@kde.org -X-Mailman-Version: 2.1.14 -Precedence: list -Reply-To: plasma-devel@kde.org -List-Id: -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Content-Type: multipart/mixed; boundary="===============6664737512143839854==" -Errors-To: plasma-devel-bounces@kde.org -Sender: plasma-devel-bounces@kde.org - - ---===============6664737512143839854== -Content-Type: multipart/signed; boundary="nextPart1996263.NlFDv9GTkA"; micalg="pgp-sha1"; protocol="application/pgp-signature" - - ---nextPart1996263.NlFDv9GTkA -Content-Transfer-Encoding: 7Bit -Content-Type: text/plain; charset="us-ascii" - -hi.. - -i noticed a new branch when i pulled kde-workspace today (finally!): -activities_optional - -the lone commit in it was pushed on april 1, so maybe it's an april fools -joke, but if it isn't, it looks like someone is trying to do something that -makes no sense (and has no chance of being merged into master). so if this is -a "for reals" branch, perhaps the motivation behind it can be shared? - --- -Aaron J. Seigo ---nextPart1996263.NlFDv9GTkA -Content-Type: application/pgp-signature; name="signature.asc" -Content-Description: This is a digitally signed message part. -Content-Transfer-Encoding: 7Bit - ------BEGIN PGP SIGNATURE----- -Version: GnuPG v2.0.19 (GNU/Linux) - -iEUEABECAAYFAlFikxAACgkQ1rcusafx20MHbwCfeXOgTDwtR81XJwAdcQB40Lt7 -t2IAmJpIZxdU+SSruySeEfbQs3VXq/8= -=BQPF ------END PGP SIGNATURE----- ---nextPart1996263.NlFDv9GTkA -Content-Type: text/plain; name="broken.attachment" -Content-Transfer-Encoding: 7Bit - -Let's break a signed message - This messageblock should not be here :D - ---nextPart1996263.NlFDv9GTkA-- - - ---===============6664737512143839854== -Content-Type: text/plain; charset="us-ascii" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Content-Disposition: inline - -_______________________________________________ -Plasma-devel mailing list -Plasma-devel@kde.org -https://mail.kde.org/mailman/listinfo/plasma-devel - ---===============6664737512143839854==-- - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-mailinglist+additional-children.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-mailinglist+additional-children.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-mailinglist+additional-children.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-mailinglist+additional-children.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ - - - - -
- - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-mailinglist.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-mailinglist.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-mailinglist.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-mailinglist.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,121 +0,0 @@ -Return-Path: -Delivered-To: einar@heavensinferno.net -Received: from localhost (localhost.localdomain [127.0.0.1]) - by akihabara.dennogumi.org (Postfix) with ESMTP id 15AB75CD846 - for ; Mon, 8 Apr 2013 12:15:03 +0200 (CEST) -Authentication-Results: akihabara.dennogumi.org; dkim=pass - (1024-bit key; insecure key) header.i=@kde.org header.b=vQ0NnJ9g; - dkim-adsp=pass -X-Virus-Scanned: Debian amavisd-new at akihabara.dennogumi.org -X-Spam-Flag: NO -X-Spam-Score: -3.818 -X-Spam-Level: -X-Spam-Status: No, score=-3.818 required=5 tests=[BAYES_50=0.8, - RCVD_IN_DNSWL_MED=-2.3, RP_MATCHES_RCVD=-2.328, T_DKIM_INVALID=0.01] - autolearn=unavailable -Received: from akihabara.dennogumi.org ([127.0.0.1]) - by localhost (akihabara.dennogumi.org [127.0.0.1]) (amavisd-new, port 10024) - with ESMTP id RMAq-XNJ040f for ; - Mon, 8 Apr 2013 12:14:44 +0200 (CEST) -Received: from postbox.kde.org (postbox.kde.org [46.4.96.248]) - by akihabara.dennogumi.org (Postfix) with ESMTP id 321675CD845 - for ; Mon, 8 Apr 2013 12:14:44 +0200 (CEST) -Authentication-Results: akihabara.dennogumi.org; dkim=pass - (1024-bit key; insecure key) header.i=@kde.org header.b=vQ0NnJ9g; - dkim-adsp=pass -Received: from postbox.kde.org (localhost [IPv6:::1]) - by postbox.kde.org (Postfix) with ESMTP id 9F5E1B37F95; - Mon, 8 Apr 2013 10:13:32 +0000 (UTC) -DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=kde.org; s=default; - t=1365416012; bh=ZJtmtbDLoGFwSyJUINdTk4UpuX+xzxcjGp7LSPrKNUs=; - h=From:To:Subject:Date:Message-ID:MIME-Version:Reply-To:List-Id: - List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: - Content-Type:Sender; b=vQ0NnJ9gjeyPLhPbQx6o9UxmILkS9KrhaKG6luAS/GR - 6iR3HKXR3HE0BCkTMD5xmKL5ztFMGcU5e79fz0ch0sd2pnZ0y1WVw7KjCxsv/YtO9HM - OplAHmhwRI5zH8KKQbyvdPULvssI/ISdViAXmHw04hNPsBjsIGkTPgvNbPFuk= -X-Original-To: plasma-devel@kde.org -Delivered-To: plasma-devel@localhost.kde.org -Received: from mail.bddf.ca (unknown [64.141.113.219]) - by postbox.kde.org (Postfix) with ESMTP id 782C6B37BE6 - for ; Mon, 8 Apr 2013 09:51:17 +0000 (UTC) -Received: from freedom.localnet (242.13.24.31.ftth.as8758.net [31.24.13.242]) - (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) - (No client certificate requested) - by mail.bddf.ca (Postfix) with ESMTPSA id 0CB712DC040 - for ; Mon, 8 Apr 2013 03:51:16 -0600 (MDT) -From: "Aaron J. Seigo" -To: plasma-devel@kde.org -Subject: activities_optional branch in kde-workspace -Date: Mon, 08 Apr 2013 11:51:11 +0200 -Message-ID: <4143483.eqrJjo7JEn@freedom> -User-Agent: KMail/4.11 pre (Linux/3.6.3-1-desktop; KDE/4.10.60; i686; - git-da50be0; 2013-03-12) -MIME-Version: 1.0 -X-Scanned-By: MIMEDefang 2.71 on 46.4.96.248 -X-BeenThere: plasma-devel@kde.org -X-Mailman-Version: 2.1.14 -Precedence: list -Reply-To: plasma-devel@kde.org -List-Id: -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Content-Type: multipart/mixed; boundary="===============6664737512143839854==" -Errors-To: plasma-devel-bounces@kde.org -Sender: plasma-devel-bounces@kde.org - - ---===============6664737512143839854== -Content-Type: multipart/signed; boundary="nextPart1996263.NlFDv9GTkA"; micalg="pgp-sha1"; protocol="application/pgp-signature" - - ---nextPart1996263.NlFDv9GTkA -Content-Transfer-Encoding: 7Bit -Content-Type: text/plain; charset="us-ascii" - -hi.. - -i noticed a new branch when i pulled kde-workspace today (finally!): -activities_optional - -the lone commit in it was pushed on april 1, so maybe it's an april fools -joke, but if it isn't, it looks like someone is trying to do something that -makes no sense (and has no chance of being merged into master). so if this is -a "for reals" branch, perhaps the motivation behind it can be shared? - --- -Aaron J. Seigo ---nextPart1996263.NlFDv9GTkA -Content-Type: application/pgp-signature; name="signature.asc" -Content-Description: This is a digitally signed message part. -Content-Transfer-Encoding: 7Bit - ------BEGIN PGP SIGNATURE----- -Version: GnuPG v2.0.19 (GNU/Linux) - -iEUEABECAAYFAlFikxAACgkQ1rcusafx20MHbwCfeXOgTDwtR81XJwAdcQB40Lt7 -t2IAmJpIZxdU+SSruySeEfbQs3VXq/8= -=BQPF ------END PGP SIGNATURE----- - ---nextPart1996263.NlFDv9GTkA-- - - ---===============6664737512143839854== -Content-Type: text/plain; charset="us-ascii" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Content-Disposition: inline - -_______________________________________________ -Plasma-devel mailing list -Plasma-devel@kde.org -https://mail.kde.org/mailman/listinfo/plasma-devel - ---===============6664737512143839854==-- - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-mailinglist.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-mailinglist.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-mailinglist.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-mailinglist.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-mailinglist+old.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-mailinglist+old.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-mailinglist+old.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-mailinglist+old.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -Return-Path: -Delivered-To: einar@heavensinferno.net -From: "Aaron J. Seigo" -To: plasma-devel@kde.org -Subject: activities_optional branch in kde-workspace -Date: Mon, 08 Apr 2013 11:51:11 +0200 -Message-ID: <4143483.eqrJjo7JEn@freedom> -User-Agent: KMail/4.11 pre (Linux/3.6.3-1-desktop; KDE/4.10.60; i686; - git-da50be0; 2013-03-12) -X-Mailman-Version: 2.1.14 -Precedence: list -Reply-To: plasma-devel@kde.org -List-Id: -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Errors-To: plasma-devel-bounces@kde.org -Sender: plasma-devel-bounces@kde.org - -Oh man a header :) - ---__--__-- - -Message: -MIME-Version: 1.0 -Content-Type: multipart/signed; boundary="nextPart1996263.NlFDv9GTkA"; micalg="pgp-sha1"; protocol="application/pgp-signature" - - ---nextPart1996263.NlFDv9GTkA -Content-Transfer-Encoding: 7Bit -Content-Type: text/plain; charset="us-ascii" - -hi.. - -i noticed a new branch when i pulled kde-workspace today (finally!): -activities_optional - -the lone commit in it was pushed on april 1, so maybe it's an april fools -joke, but if it isn't, it looks like someone is trying to do something that -makes no sense (and has no chance of being merged into master). so if this is -a "for reals" branch, perhaps the motivation behind it can be shared? - --- -Aaron J. Seigo ---nextPart1996263.NlFDv9GTkA -Content-Type: application/pgp-signature; name="signature.asc" -Content-Description: This is a digitally signed message part. -Content-Transfer-Encoding: 7Bit - ------BEGIN PGP SIGNATURE----- -Version: GnuPG v2.0.19 (GNU/Linux) - -iEUEABECAAYFAlFikxAACgkQ1rcusafx20MHbwCfeXOgTDwtR81XJwAdcQB40Lt7 -t2IAmJpIZxdU+SSruySeEfbQs3VXq/8= -=BQPF ------END PGP SIGNATURE----- - ---__--__-- - -_______________________________________________ -Plasma-devel mailing list -Plasma-devel@kde.org -https://mail.kde.org/mailman/listinfo/plasma-devel \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-mailinglist+old.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-mailinglist+old.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-mailinglist+old.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-mailinglist+old.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,94 +0,0 @@ - - - - -
- - -
- - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-no-protocol.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-no-protocol.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-no-protocol.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-no-protocol.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -Return-Path: -Delivered-To: einar@heavensinferno.net -Content-Type: multipart/signed; boundary="nextPart1996263.NlFDv9GTkA"; micalg="pgp-sha1"; protocol="application/broken-signature" - - ---nextPart1996263.NlFDv9GTkA -Content-Transfer-Encoding: 7Bit -Content-Type: text/plain; charset="us-ascii" - -hi.. - -i noticed a new branch when i pulled kde-workspace today (finally!): -activities_optional - -the lone commit in it was pushed on april 1, so maybe it's an april fools -joke, but if it isn't, it looks like someone is trying to do something that -makes no sense (and has no chance of being merged into master). so if this is -a "for reals" branch, perhaps the motivation behind it can be shared? - --- -Aaron J. Seigo ---nextPart1996263.NlFDv9GTkA -Content-Type: application/broken-signature; name="signature.asc" -Content-Description: This is a digitally signed message part. -Content-Transfer-Encoding: 7Bit - ------BEGIN PGP SIGNATURE----- -Version: GnuPG v2.0.19 (GNU/Linux) - -iEUEABECAAYFAlFikxAACgkQ1rcusafx20MHbwCfeXOgTDwtR81XJwAdcQB40Lt7 -t2IAmJpIZxdU+SSruySeEfbQs3VXq/8= -=BQPF ------END PGP SIGNATURE----- - ---nextPart1996263.NlFDv9GTkA-- diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-no-protocol.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-no-protocol.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-no-protocol.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-no-protocol.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-two-attachments.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-two-attachments.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-two-attachments.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-two-attachments.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -From: firstname.lastname@example.com -To: test@kolab.org -Subject: OpenPGP signed with 2 text attachments -Date: Sun, 30 Aug 2015 12:02:56 +0200 -Message-ID: <2033829.IGepAdxqt9@vkpc5> -X-KMail-Identity: 402312391 -X-KMail-Dictionary: en_US -User-Agent: KMail/5.0.42 pre (Linux/3.16.6-2-desktop; KDE/5.14.0; x86_64; ; ) -MIME-Version: 1.0 -Content-Type: multipart/signed; boundary="nextPart3682207.KLrp2sxpbf"; micalg="pgp-sha1"; protocol="application/pgp-signature" - ---nextPart3682207.KLrp2sxpbf -Content-Type: multipart/mixed; boundary="nextPart2397422.QDHKUNdbyg" -Content-Transfer-Encoding: 7Bit - -This is a multi-part message in MIME format. - ---nextPart2397422.QDHKUNdbyg -Content-Transfer-Encoding: 7Bit -Content-Type: text/plain; charset="us-ascii" - -this is the main body text ---nextPart2397422.QDHKUNdbyg -Content-Disposition: inline; filename="attachment1.txt" -Content-Transfer-Encoding: 7Bit -Content-Type: text/plain; charset="utf-8"; name="attachment1.txt" - -this is attachment one ---nextPart2397422.QDHKUNdbyg -Content-Disposition: inline; filename="attachment2.txt" -Content-Transfer-Encoding: 7Bit -Content-Type: text/plain; charset="utf-8"; name="attachment2.txt" - -this is attachment two ---nextPart2397422.QDHKUNdbyg-- - ---nextPart3682207.KLrp2sxpbf -Content-Type: application/pgp-signature; name="signature.asc" -Content-Description: This is a digitally signed message part. -Content-Transfer-Encoding: 7Bit - ------BEGIN PGP SIGNATURE----- -Version: GnuPG v2 - -iQEVAwUAVeLU0I2YYMWPJG3mAQL/fgf+LXmO7bKafdd4g5OOVHHyXRprVmX/6hBq -mZoor29KLIHkvAH9OJi4qBy/ZKwqqKLfttLzHb2UaAfl5kn4f0ckmnwUhU7u32Sm -JZ0Q50SxrRVFRyvTvPG22ho9IwQUO1YSZrL4wO9v8ZBQ3vkfpmAiUQVxPQMINc8L -i68xQEm4y1Dtoc+DTUkoIMeOOPnEl6PTMPrwn906K0r30hI4788fEGRn6uOXb+vD -G/ISlXu+JHIxxf/J5/jVjKNbra+trrfSPzB3piJIjBLEPO5FvLx8SgQFJcJHt/kw -ps8D5YULj/MVMLlsPtXDdZmbOi/G9pN0tr05MKcXsO5Ywe7n2BhASw== -=2Nzb ------END PGP SIGNATURE----- - ---nextPart3682207.KLrp2sxpbf-- diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-two-attachments.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-two-attachments.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/openpgp-signed-two-attachments.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/openpgp-signed-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/signed-forward-openpgp-signed-encrypted.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/signed-forward-openpgp-signed-encrypted.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/signed-forward-openpgp-signed-encrypted.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/signed-forward-openpgp-signed-encrypted.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,92 +0,0 @@ -From test@kolab.org Wed, 08 Sep 2010 17:53:29 +0200 -From: OpenPGP Test -Subject: Signed Fwd: OpenPGP signed and encrypted -Date: Wed, 08 Sep 2010 17:53:29 +0200 -User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) -MIME-Version: 1.0 -Content-Type: multipart/signed; boundary="nextPart4350242.cT7m6ulPOV"; micalg="pgp-sha1"; protocol="application/pgp-signature" -Content-Transfer-Encoding: 7Bit - - ---nextPart4350242.cT7m6ulPOV -Content-Type: multipart/mixed; boundary="nextPart1512490.WQBKYaOrt8" -Content-Transfer-Encoding: 7Bit - - ---nextPart1512490.WQBKYaOrt8 -Content-Transfer-Encoding: 7Bit -Content-Type: text/plain; charset="us-ascii" - -bla bla bla ---nextPart1512490.WQBKYaOrt8 -Content-Type: message/rfc822 -Content-Disposition: inline; filename="forwarded message" -Content-Description: OpenPGP Test : OpenPGP signed and encrypted - -From: OpenPGP Test -To: test@kolab.org -Subject: OpenPGP signed and encrypted -Date: Tue, 07 Sep 2010 18:08:44 +0200 -User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) -MIME-Version: 1.0 -Content-Type: multipart/encrypted; boundary="nextPart25203163.0xtB501Z4V"; protocol="application/pgp-encrypted" -Content-Transfer-Encoding: 7Bit - - ---nextPart25203163.0xtB501Z4V -Content-Type: application/pgp-encrypted -Content-Disposition: attachment - -Version: 1 ---nextPart25203163.0xtB501Z4V -Content-Type: application/octet-stream -Content-Disposition: inline; filename="msg.asc" - ------BEGIN PGP MESSAGE----- -Version: GnuPG v2.0.15 (GNU/Linux) - -hQEMAwzOQ1qnzNo7AQf7BFYWaGiCTGtXY59bSh3LCXNnWZejblYALxIUNXOFEXbm -y/YA95FmQsy3U5HRCAJV/DY1PEaJz1RTm9bcdIpDC3Ab2YzSwmOwV5fcoUOB2df4 -KjX19Q+2F3JxpPQ0N1gHf4dKfIu19LH+CKeFzUN13aJs5J4A5wlj+NjJikxzmxDS -kDtNYndynPmo9DJQcsUFw3gpvx5HaHvx1cT4mAB2M5cd2l+vN1jYbaWb0x5Zq41z -mRNI89aPieC3rcM2289m68fGloNbYvi8mZJu5RrI4Tbi/D7Rjm1y63lHgVV6AN88 -XAzRiedOeF99LoTBulrJdtT8AAgCs8nCetcWpIffdtLpAZiZkzHmYOU7nqGxqpRk -OVeUTrCn9DW2SMmHjaP4IiKnMvzEycu5F4a72+V1LeMIhMSjTRTq+ZE2PTaqH59z -QsMn7Nb6GlOICbTptRKNNtyJKO7xXlpT7YtvNKnCyEOkH2XrYH7GvpYCiuQ0/o+7 -SxV436ZejiYIg6DQDXJCoa2DXimGp0C10Jh0HwX0BixpoNtwEjkGRYcX6P/JzkH0 -oBood4Ly+Tiu6iVDisrK3AVGYpIzCrKkE9qULTw4R/jFKR2tcCqGb7Fxtk2LV7Md -3S+DyOKrvKQ5GNwbp9OE97pwk+Lr1JS3UAvj5f6BR+1PVNcC0i0wWkgwDjPh1eGD -enMQmorE6+N0uHtH2F4fOxo/TbbA3+zhI25kVW3bO03xyUl/cmQZeb52nvfOvtOo -gSb2j6bPkzljDMPEzrtJjbFtGHJbPfUQYJgZv9OE2EQIqpg6goIw279alBq6GLIX -pkO+dRmztzjcDyhcLxMuQ4cTizel/0J/bU7U6lvwHSyZVbT4Ev+opG5K70Hbqbwr -NZcgdWXbSeesxGM/oQaMeSurOevxVl+/zrTVAek61aRRd1baAYqgi2pf2V7y4oK3 -qkdxzmoFpRdNlfrQW65NZWnHOi9rC9XxANIwnVn3kRcDf+t2K4PrFluI157lXM/o -wX91j88fazysbJlQ6TjsApO9ETiPOFEBqouxCTtCZzlUgyVG8jpIjdHWFnagHeXH -+lXNdYjxnTWTjTxMOZC9ySMpXkjWdFI1ecxVwu6Ik6RX51rvBJAAXWP75yUjPKJ4 -rRi5oQl/VLl0QznO7lvgMPtUwgDVNWO/r7Kn9B387h9fAJZ/kWFAEDW2yhAzABqO -rCNKDzBPgfAwCnikCpMoCbOL7SU8BdbzQHD8/Lkv4m0pzliHQ/KkGF710koBzTmF -N7+wk9pwIuvcrEBQj567 -=GV0c ------END PGP MESSAGE----- - ---nextPart25203163.0xtB501Z4V-- - ---nextPart1512490.WQBKYaOrt8-- - ---nextPart4350242.cT7m6ulPOV -Content-Type: application/pgp-signature; name="signature.asc" -Content-Description: This is a digitally signed message part. - ------BEGIN PGP SIGNATURE----- -Version: GnuPG v2.0.15 (GNU/Linux) - -iQEcBAABAgAGBQJMh7F5AAoJEI2YYMWPJG3mOB0IALeHfwg8u7wK0tDKtKqxQSqC -2Bbk4pTLuLw/VniQNauDG+kc1eUc5RJk/R31aB1ysiQCV5Q8ucI8c9vCDDMbd+s4 -t2bZUEzMpXrw/aFiHgYGXFAY+tpqZqDGNVRNHWsPYJKtx8cci9E5DLnBJcVXVqib -3iiHlr9AQOok3PUmpPk1a61q2L0kk8wqRenC0yZXNw5qFn5WW/hFeCOfYB+t+s5N -IuE6ihFCJIlvGborrvl6VgPJTCyUQ3XgI90vS6ABN8TFlCNr3grXOWUePc2a20or -xFgh38cnSR64WJajU5K1nUL9/RgfIcs+PvyHuJaRf/iUFkj1jiMEuaSi9jVFco0= -=bArV ------END PGP SIGNATURE----- - ---nextPart4350242.cT7m6ulPOV-- diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/signed-forward-openpgp-signed-encrypted.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/signed-forward-openpgp-signed-encrypted.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/signed-forward-openpgp-signed-encrypted.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/signed-forward-openpgp-signed-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-cert.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-cert.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-cert.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-cert.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -From test@example.com Sat, 13 Apr 2013 01:54:30 +0200 -From: test -To: you@you.com -Subject: test -Date: Sat, 13 Apr 2013 01:54:30 +0200 -Message-ID: <1576646.QQxzHWx8dA@tabin> -X-KMail-Identity: 505942601 -User-Agent: KMail/4.10.2 (Linux/3.9.0-rc4-experimental-amd64; KDE/4.10.60; x86_64; git-fc9b82c; 2013-04-11) -MIME-Version: 1.0 -Content-Type: application/pkcs7-mime; name="smime.crt"; smime-type="certs-only" -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; filename="smime.crt" - -asdfasdfasdfasdfasdfasdfasdfasdf -asdfasdfadsfsadfasdf -asdfasdf -sadfas -dfasdf -sadf -sadf -adsf -adsf -asdf - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-encrypted.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-encrypted.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-encrypted.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-encrypted.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -From test@example.com Sat, 13 Apr 2013 01:54:30 +0200 -From: test -To: you@you.com -Subject: test -Date: Sat, 13 Apr 2013 01:54:30 +0200 -Message-ID: <1576646.QQxzHWx8dA@tabin> -X-KMail-Identity: 505942601 -User-Agent: KMail/4.10.2 (Linux/3.9.0-rc4-experimental-amd64; KDE/4.10.60; x86_64; git-fc9b82c; 2013-04-11) -MIME-Version: 1.0 -Content-Type: application/pkcs7-mime; name="smime.p7m"; smime-type="enveloped-data" -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; filename="smime.p7m" - -MIAGCSqGSIb3DQEHA6CAMIACAQAxgfwwgfkCAQAwYjBVMQswCQYDVQQGEwJVUzENMAsGA1UECgwE -S0RBQjEWMBQGA1UEAwwNdW5pdHRlc3QgY2VydDEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxl -LmNvbQIJANNFIDoYY4XJMA0GCSqGSIb3DQEBAQUABIGAJwmmaOeidXUHSQGOf2OBIsPYafVqdORe -y54pEXbXiAfSVUWgI4a9CsiWwcDX8vlaX9ZLLr+L2VmOfr6Yc5214yxzausZVvnUFjy6LUXotuEX -tSar4EW7XI9DjaZc1l985naMsTx9JUa5GyQ9J6PGqhosAKpKMGgKkFAHaOwE1/IwgAYJKoZIhvcN -AQcBMBQGCCqGSIb3DQMHBAieDfmz3WGbN6CABHgEpsLrNn0PAZTDUfNomDypvSCl5bQH+9cKm80m -upMV2r8RBiXS7OaP4SpCxq18afDTTPatvboHIoEX92taTbq8soiAgEs6raSGtEYZNvFL0IYqm7MA -o5HCOmjiEcInyPf14lL3HnPk10FaP3hh58qTHUh4LPYtL7UECOZELYnUfUVhAAAAAAAAAAAAAA== - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-encrypted.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-encrypted.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-encrypted.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-encrypted-octet-stream.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-encrypted-octet-stream.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-encrypted-octet-stream.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-encrypted-octet-stream.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -From test@example.com Sat, 13 Apr 2013 01:54:30 +0200 -From: test -To: you@you.com -Subject: test -Date: Sat, 13 Apr 2013 01:54:30 +0200 -Message-ID: <1576646.QQxzHWx8dA@tabin> -X-KMail-Identity: 505942601 -User-Agent: KMail/4.10.2 (Linux/3.9.0-rc4-experimental-amd64; KDE/4.10.60; x86_64; git-fc9b82c; 2013-04-11) -MIME-Version: 1.0 -Content-Type: application/octet-stream; - name="smime.p7m" -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; filename="smime.p7m" - -MIAGCSqGSIb3DQEHA6CAMIACAQAxgfwwgfkCAQAwYjBVMQswCQYDVQQGEwJVUzENMAsGA1UECgwE -S0RBQjEWMBQGA1UEAwwNdW5pdHRlc3QgY2VydDEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxl -LmNvbQIJANNFIDoYY4XJMA0GCSqGSIb3DQEBAQUABIGAJwmmaOeidXUHSQGOf2OBIsPYafVqdORe -y54pEXbXiAfSVUWgI4a9CsiWwcDX8vlaX9ZLLr+L2VmOfr6Yc5214yxzausZVvnUFjy6LUXotuEX -tSar4EW7XI9DjaZc1l985naMsTx9JUa5GyQ9J6PGqhosAKpKMGgKkFAHaOwE1/IwgAYJKoZIhvcN -AQcBMBQGCCqGSIb3DQMHBAieDfmz3WGbN6CABHgEpsLrNn0PAZTDUfNomDypvSCl5bQH+9cKm80m -upMV2r8RBiXS7OaP4SpCxq18afDTTPatvboHIoEX92taTbq8soiAgEs6raSGtEYZNvFL0IYqm7MA -o5HCOmjiEcInyPf14lL3HnPk10FaP3hh58qTHUh4LPYtL7UECOZELYnUfUVhAAAAAAAAAAAAAA== - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-encrypted-octet-stream.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-encrypted-octet-stream.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-encrypted-octet-stream.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-encrypted-octet-stream.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-opaque-enc+sign.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-opaque-enc+sign.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-opaque-enc+sign.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-opaque-enc+sign.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -From test@example.com Fri Sep 11 10:18:48 2015 -From: test -To: you@you.com -Subject: enc+sign -Date: Fri, 11 Sep 2015 12:18:48 +0200 -Message-ID: <49743203.WFa6qKaG4S@tabin.local> -X-KMail-Identity: 792434561 -User-Agent: KMail/4.13.0.1 (Linux/4.1.5-towo.1-siduction-amd64; KDE/4.14.2; x86_64; ; ) -MIME-Version: 1.0 -Content-Type: application/pkcs7-mime; name="smime.p7m"; smime-type="enveloped-data" -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; filename="smime.p7m" - -MIAGCSqGSIb3DQEHA6CAMIACAQAxgfwwgfkCAQAwYjBVMQswCQYDVQQGEwJVUzENMAsGA1UECgwE -S0RBQjEWMBQGA1UEAwwNdW5pdHRlc3QgY2VydDEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxl -LmNvbQIJANNFIDoYY4XJMA0GCSqGSIb3DQEBAQUABIGAkttyRl8OyZkRGfs3CMfzYchrG4rRMfbE -WIkAFIXf64yAzPZfo6cCn0Il/6q4793FeKUrsJUvzP21KBLp4u1t5qLL5iPAmAzBdLg0teoEzLZe -CEZHinM+WSMdz2wEV8lgAt8x/3yhXmDMB09FEapUaBCK5NhbLAFkpI2mFg66zxcwgAYJKoZIhvcN -AQcBMB0GCWCGSAFlAwQBAgQQ6DSjjkXJNm5cXQNek9eozqCABIIDsI7lufqw58g/uVM2gymkldmb -BOgdimxshJkYznbbG5sfQPNM9ROhXKRUOc8hfzgmZ9dOZvtAyzepROMHrcL1mFFx7c1vgyT85fai -PLEqRs8FRoztXJ0I3q57r+sPW4BtYJp9WCBSerdLSrBFK1zvKpVQtSCYbbDCc3462KnSsBrE4XTf -BiiLWkpok4fNIdqYG1aWPLgRbp7wwLiXcq5RxYCail1tlyAty6dWBrYE1+ABZoqnKUqNqbghxJUd -X9t3EziUnzw7c0Hq03sJEShzbXI9BxOTs8ZZ+1Ktx3rdh6RhZZ7XfJ7XIuN0yYhusBeOgC8AuILN -lYojgmXMin52VPFmz9siI8jnKaqsr1uUqVfMLNc+mLhZEjuOu99eAHwdJUS95BKWm9J8DBe/lpz3 -s09Oz2oOoiQx0WxKmQZ4GXW/UI9OwykfNLqWfmDrbMbGW4Mvq615ucHZixFdp2vf3kU72wfk8hFK -EIU/1Ov85glDj96ELdXErXn02BNvVBQIsRx3DbBGEgj9tz+WHbCR6RjEK4eV5lhInZplFGmYr4Uu -9ALS+MRGTYZnALNPrWu6b1aWprnlJCyKZeeyqUzpQVPoWOh7CfdvBxvQoil4Z9Neb9O0AGCZ0axc -zZ4yYcS/LpHkLgYPC5BphNtpyciQh6ZFeexi8rsZuHRu+YUKnuM+DQyUxtUvDYhiX7CT49MMXIwt -bdyA0IAbIXXb/Us9GGX11gAfz2EFI3QBDHtsyciEgCIlA32OiiJF0T5CnQsku2yu6c3TWC4k+feL -jjTEhm/KPUL6SkksarFeEncJlVt7impW9FlHyBpISwlQF4RAxDYTRX475VTNu7wn3PQx376m8iBN -K20MjdfIM162jcQh9IWnqTZ0nH/gT2kQPYe7GqjFi6XmU3bwdzW9SXR0G9A8juIXaaNR7aXcsB53 -/W4WHPcdJBwRELa0dT1/bPg8z3EV2vM7Flc/Q5ugTWHxk8GHNEPpotArpLq1sEAZu78mSCqzzEDA -TwzEpj9LZYIv4rDYYLCAxUR9YGhiJ5Qm21YnklkE++4zfpsl/KJcwtNsp7SWdzeVuPoUYBNhsgp/ -PZgudzQoOhxcF4ChHMVSNk1f1tlvXZppeXwv9OwpSszz0zZUr46ievpkQwL0Sa1XAfKwAt7bFJwp -i95ae7p58ZdizJVsz0QUhFDxIDL76qiPEYXC7nIf4ZPQ36dzLAfZ6OwWGffluxHpE6oqUoM3l320 -7yQT66xfRKLGl5Cr1Q8UBBABC6aR2dt6RVbsxbR3mB0PAAAAAAAAAAAAAA== - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-opaque-enc+sign.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-opaque-enc+sign.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-opaque-enc+sign.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-opaque-enc+sign.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-opaque-sign.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-opaque-sign.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-opaque-sign.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-opaque-sign.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -From test@example.com Fri Sep 11 10:16:06 2015 -From: test -To: you@you.com -Subject: sign only -Date: Fri, 11 Sep 2015 12:16:06 +0200 -Message-ID: <3182420.pXWeMPZlAJ@tabin.local> -X-KMail-Identity: 792434561 -User-Agent: KMail/4.13.0.1 (Linux/4.1.5-towo.1-siduction-amd64; KDE/4.14.2; x86_64; ; ) -MIME-Version: 1.0 -Content-Type: application/pkcs7-mime; name="smime.p7m"; smime-type="signed-data" -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; filename="smime.p7m" - -MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAaCAJIAEZUNvbnRl -bnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdCaXQKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy -c2V0PSJ1dGYtOCIKCkEgc2ltcGxlIHNpZ25lZCBvbmx5IHRlc3QuAAAAAAAAMYIBkjCCAY4CAQEw -YjBVMQswCQYDVQQGEwJVUzENMAsGA1UECgwES0RBQjEWMBQGA1UEAwwNdW5pdHRlc3QgY2VydDEf -MB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJANNFIDoYY4XJMAkGBSsOAwIaBQCggYcw -GAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTMwMTEwMTU0ODEyWjAj -BgkqhkiG9w0BCQQxFgQUvJ5zI7oyv5fNx1H1wabIa6atsdcwKAYJKoZIhvcNAQkPMRswGTALBglg -hkgBZQMEAQIwCgYIKoZIhvcNAwcwDQYJKoZIhvcNAQEBBQAEgYAHFCw88FPy1n2lu5ql5sD2J4Yi -2/N9gUQvNQF5F/kd48HncdihLPZRs7eEX7IzDZNeylTmyp2WIiGEwQrIHbxtqU32NRouc09Zv4bu -iUwUoz1SM2s7qipikwayQMD3d5zWNhszNLBsw8z48uXAzjZAejBCfPP0/w3z7DZDJC2R2QAAAAAA -AA== - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-opaque-sign.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-opaque-sign.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-opaque-sign.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-opaque-sign.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-signed-encrypted.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-signed-encrypted.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-signed-encrypted.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-signed-encrypted.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -From test@example.com Wed, 08 Sep 2010 17:51:32 +0200 -From: S/MIME Test -To: test@example.com -Subject: S/MIME signed and encrypted -Date: Wed, 08 Sep 2010 17:51:32 +0200 -User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) -MIME-Version: 1.0 -Content-Type: application/pkcs7-mime; name="smime.p7m"; smime-type="enveloped-data" -Content-Disposition: attachment; filename="smime.p7m" -Content-Transfer-Encoding: base64 - -MIAGCSqGSIb3DQEHA6CAMIACAQAxgfwwgfkCAQAwYjBVMQswCQYDVQQGEwJVUzENMAsGA1UECgwE -S0RBQjEWMBQGA1UEAwwNdW5pdHRlc3QgY2VydDEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxl -LmNvbQIJANNFIDoYY4XJMA0GCSqGSIb3DQEBAQUABIGAl7xMheBEpCAwYsr64BE1WY6ohFTuoxV4 -/F8NXDyH+RZqpdpF6ltEThAgZBsYlhx2olMHIINfifsnzkxYiSwvuZkD94KMcegdn1XGPAYTQnR6 -8IK+grfHM5kWYW36XAbZmHNgl1lTh1/tqCyqDCI+Yah6UtBaJbR4gflMmGM5f+IwgAYJKoZIhvcN -AQcBMBQGCCqGSIb3DQMHBAhWM773SZc7KaCABIIEmKhZSl2YtYYlvthLk4/hEmyK5c2xx/MCqIxM -hh3vbaDK2TWspQwtbBm/96xQbCDzZU9NeNv0rmjRAELK3AgqUVTnbi3Ozf6MLrEUsuXvlR214OPs -sv374AF1ZoLJRaHyRo8/RkcwEbCMZbRPT56qM58tQQ54G7lTmWAHhV6zRx9B7ODgikt6CjgQr7Wn -EAV33Pei17sM6Pa+mtZhz+tlUOQBRuZI6EOgbG1hixSaClgPnyphLxpwjiN3pym2tiVqsQxnSJ3f -XRCx9E/kSWrJelME3aEU6++RXTuxbGJceDweo9SWQsXobU3Ot71pCIcZC7Tfv6qnICHsTAxc3Igw -xHGHufnVoU7HZCXLi5AbhHvZYdLftEX2/6eA6/efEn4Jnrn9EMzOeLnySEaW5mE0AW8d27LDK62J -+Mag1TTC2BivRhKRY0/GZCSiT8LepPb0DVYxb5vc2D5COVjG4ZhnDd0JbO2YnXoxfsi92M1CmssN -YjBlB7R+HAFOoFGE+xuSGZZr+Ox4Q8+l7/cebLHjXcAsJ81fRlcWZNVreh4b5x3vZm9vRLNiHsqB -h5wXeu5jV1zQ7okhT4mKGp5RbIVYOaBic0mg7+Z2iF4gn37tisU1yahboj2YMYP3pPVYgwuSnv3H -308EAyFRu5/a5gGhj5ze2L5+vDgE5jk2REDYt9EH1kNtllDn8vN8e/6YfLBqDHQE+Hv5iC3YAygI -mVNdSL0V8xMrUbqqmXXx23URwic1BetW6L4oDQpPhuMf4wrwXYwmQtCZj9EGZq+NpFxb6xSIvvRG -n5mAT07HmI69EYnx4SbZq1YhWsY2AQHpxIFtLD2olW5SDISjbUKyxtcCdTuwk0ykajaxYHOC3t9E -wQ7GreQAGY+kBIyDhB/L8sD46gPmmP+hO7QVXKESyOIfTnbo2rWVhToXPGMVD2dr/GJOP6DUmRj8 -3ba/9l1bFKMxWFBYm/MgdNN5H/SOWlhN1N+Fl820HYCXZTSWLTUH6Bq8kf3FuKz+MJDwbl417ctL -+ojLATnLgKu+x/B6H1sOd2E6KY73SlCoKG/AfzSelbVPUZbbUU7kOECvzKWY/Zx/a55FBkF6ASm9 -6CgFk5VVuyG2VbncLtesluJJOTTYEHl20RaiGYJNUL22tTe5nCIdIrKzOI4xMXQBAZcPSdojlNIj -bSRRX+9jJIRUIExncNZvWn7VtsD1v7gLFD+BN98Cy5E7n/1NByQTOpoislrVi/sMRJQ9bPs/j5sL -B2tzVR08ODQYfdWWT+1ynbvegBx4wi8I2Orc5BEW+0NjUdnUHTFORBEnq8CjSRgHyckcsJMJommM -m4wvkQj7YX/cps8QqCPzEKAdykU2hsd6sEycKtxi3gW6uDIOMwzapkxZSH7IcMriWBDXRsMebHsv -+R0A8eT7dC09cgQw+kScSe+cYgRZk0R/26eqhukprECaf9SptYll10GQ0eLcIpX4deXr0ZNmAHYy -+5D7yoysVFNyC5QE3tAhS1HapixB8lPeJUndifGfbt3u8lpFb7lodnJIj2oHgo5MUNkxhPchHW0t -GJMpP9esdvIZxwQInpSuNeUy6Z8AAAAAAAAAAAAA diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-signed-encrypted.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-signed-encrypted.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/smime-signed-encrypted.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/smime-signed-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/text+html-maillinglist.mbox kf5-messagelib-16.12.3/messageviewer/autotests/data/text+html-maillinglist.mbox --- kf5-messagelib-16.04.3/messageviewer/autotests/data/text+html-maillinglist.mbox 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/text+html-maillinglist.mbox 1970-01-01 00:00:00.000000000 +0000 @@ -1,163 +0,0 @@ -Return-Path: -Received: from kolab01.kolabsys.com ([unix socket]) - by kolab01.kolabsys.com (Cyrus v2.4.17-Kolab-2.4.17-1.el6.kolab_3.0) with LMTPA; - Thu, 11 Apr 2013 09:03:01 +0200 -X-Sieve: CMU Sieve 2.4 -Received: from ext-mx01.kolabsys.com (unknown [10.10.20.253]) - by kolab01.kolabsys.com (Postfix) with ESMTP id 3D8A9C0AE3 - for ; Thu, 11 Apr 2013 09:03:01 +0200 (CEST) -Received: from localhost (localhost [127.0.0.1]) - by ext-mx01.kolabsys.com (Postfix) with ESMTP id 89D4E10057E - for ; Thu, 11 Apr 2013 09:02:38 +0200 (CEST) -X-Virus-Scanned: amavisd-new at example.com -X-Amavis-Alert: BAD HEADER SECTION, Duplicate header field: "MIME-Version" -Received: from ext-mx01.kolabsys.com ([127.0.0.1]) - by localhost (fw01.kolabsys.com [127.0.0.1]) (amavisd-new, port 10024) - with ESMTP id BJxrh9Yst1Ac - for ; - Thu, 11 Apr 2013 09:02:38 +0200 (CEST) -Received: from lists.kolabsys.com (static.253.32.46.78.clients.your-server.de [78.46.32.253]) - by ext-mx01.kolabsys.com (Postfix) with ESMTP id 609821004A7 - for ; Thu, 11 Apr 2013 09:02:38 +0200 (CEST) -Received: from localhost (localhost [127.0.0.1]) - by lists.kolabsys.com (Postfix) with ESMTP id BFA6941D4EAD; - Thu, 11 Apr 2013 09:03:00 +0200 (CEST) -X-Virus-Scanned: Debian amavisd-new at lists.kolabsys.com -X-Amavis-Alert: BAD HEADER SECTION, Duplicate header field: "MIME-Version" -Received: from lists.kolabsys.com ([127.0.0.1]) - by localhost (lists.kolabsys.com [127.0.0.1]) (amavisd-new, port 10024) - with ESMTP id TYU5eAMK5J6T; Thu, 11 Apr 2013 09:02:58 +0200 (CEST) -Received: from lists.kolabsys.com (localhost [127.0.0.1]) - by lists.kolabsys.com (Postfix) with ESMTP id 182FC41D2A3B; - Thu, 11 Apr 2013 09:02:58 +0200 (CEST) -Received: from localhost (localhost [127.0.0.1]) - by lists.kolabsys.com (Postfix) with ESMTP id A2B3641D4EC2 - for ; - Thu, 11 Apr 2013 09:02:56 +0200 (CEST) -X-Virus-Scanned: Debian amavisd-new at lists.kolabsys.com -Received: from lists.kolabsys.com ([127.0.0.1]) - by localhost (lists.kolabsys.com [127.0.0.1]) (amavisd-new, port 10024) - with ESMTP id cyO-CNB3vFwu for ; - Thu, 11 Apr 2013 09:02:54 +0200 (CEST) -Received: from ext-mx02.kolabsys.com (ext-mx02.kolabsys.com [94.230.208.222]) - by lists.kolabsys.com (Postfix) with ESMTP id 1640E41D2A3B - for ; - Thu, 11 Apr 2013 09:02:54 +0200 (CEST) -Received: from localhost (localhost [127.0.0.1]) - by ext-mx01.kolabsys.com (Postfix) with ESMTP id 58CBC160522 - for ; - Thu, 11 Apr 2013 10:02:44 +0200 (CEST) -X-Virus-Scanned: amavisd-new at example.com -Received: from ext-mx02.kolabsys.com ([127.0.0.1]) - by localhost (fw02.kolabsys.com [127.0.0.1]) (amavisd-new, port 10024) - with ESMTP id 4VjnHg6Y6jo7 for ; - Thu, 11 Apr 2013 10:02:42 +0200 (CEST) -Received: from app04.kolabsys.com (unknown [10.10.20.16]) - by ext-mx02.kolabsys.com (Postfix) with ESMTP id 062DF160521 - for ; - Thu, 11 Apr 2013 10:02:42 +0200 (CEST) -Received: by app04.kolabsys.com (Postfix, from userid 48) - id 8E7524048C; Thu, 11 Apr 2013 09:02:51 +0200 (CEST) -From: Kolab Bugzilla -To: bugzilla@lists.kolabsys.com -Subject: [Bug 1741] Standard folder name configuration ignored on creating - new users -Date: Thu, 11 Apr 2013 07:02:43 +0000 -X-Bugzilla-Reason: GlobalWatcher -X-Bugzilla-Type: changed -X-Bugzilla-Watch-Reason: None -X-Bugzilla-Product: UCS -X-Bugzilla-Component: roundcube -X-Bugzilla-Keywords: -X-Bugzilla-Severity: normal -X-Bugzilla-Who: wickert@kolabsys.com -X-Bugzilla-Status: NEW -X-Bugzilla-Priority: P3 -X-Bugzilla-Assigned-To: machniak@kolabsys.com -X-Bugzilla-Target-Milestone: 3.1-next -X-Bugzilla-Changed-Fields: -Message-ID: -In-Reply-To: -References: -X-Bugzilla-URL: http://issues.kolab.org/ -Auto-Submitted: auto-generated -MIME-Version: 1.0 -X-BeenThere: bugzilla@lists.kolabsys.com -X-Mailman-Version: 2.1.11 -Precedence: list -Reply-To: server-team@lists.kolabsys.com -List-Id: All Bugzilla email notifications -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Content-Type: multipart/mixed; boundary="===============1778809852==" -Mime-version: 1.0 -Sender: bugzilla-bounces@lists.kolabsys.com -Errors-To: bugzilla-bounces@lists.kolabsys.com - - ---===============1778809852== -Content-Type: multipart/alternative; boundary="1365663771.ec4d382.10226"; charset="us-ascii" - - ---1365663771.ec4d382.10226 -Date: Thu, 11 Apr 2013 09:02:51 +0200 -MIME-Version: 1.0 -Content-Type: text/plain; charset="UTF-8" - -https://issues.kolab.org/show_bug.cgi?id=1741 - ---- Comment #4 from Christoph Wickert --- -You can get everything you need on test93-18. - --- -You are receiving this mail because: -You are watching all bug changes. - ---1365663771.ec4d382.10226 -Date: Thu, 11 Apr 2013 09:02:51 +0200 -MIME-Version: 1.0 -Content-Type: text/html; charset="UTF-8" - - - - - - - Comment # 4 - on bug 1741 - from - -
You can get everything you need on test93-18.
- You are receiving this mail because: -
    -
  • You are watching all bug changes.
  • -
- - - ---1365663771.ec4d382.10226-- - ---===============1778809852== -Content-Type: text/plain; charset="us-ascii" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Content-Disposition: inline - -_______________________________________________ -bugzilla mailing list -bugzilla@lists.kolabsys.com -https://lists.kolabsys.com/mailman/listinfo/bugzilla - ---===============1778809852==-- - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/data/text+html-maillinglist.mbox.html kf5-messagelib-16.12.3/messageviewer/autotests/data/text+html-maillinglist.mbox.html --- kf5-messagelib-16.04.3/messageviewer/autotests/data/text+html-maillinglist.mbox.html 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/data/text+html-maillinglist.mbox.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ - - - - -
- -
- -
- -
-
- Comment # 4 - on bug 1741 - from -
You can get everything you need on test93-18.
- You are receiving this mail because: -
    -
  • You are watching all bug changes.
  • -
-
-
-
- - -
-
- - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/nodehelpertest.cpp kf5-messagelib-16.12.3/messageviewer/autotests/nodehelpertest.cpp --- kf5-messagelib-16.04.3/messageviewer/autotests/nodehelpertest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/nodehelpertest.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,190 +0,0 @@ -/* Copyright 2015 Sandro Knauß - - 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) version 3 or any later version - accepted by the membership of KDE e.V. (or its successor approved - by the membership of KDE e.V.), which shall act as a proxy - defined in Section 14 of version 3 of the license. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#include "nodehelpertest.h" - -#include "messageviewer/nodehelper.h" - -#include - -using namespace MessageViewer; - -NodeHelperTest::NodeHelperTest() - : QObject() -{ - -} - -void NodeHelperTest::testPersistentIndex() -{ - NodeHelper helper; - - KMime::Content *node = new KMime::Content(); - KMime::Content *subNode = new KMime::Content(); - KMime::Content *subsubNode = new KMime::Content(), *subsubNode2 = new KMime::Content(); - KMime::Content *extra = new KMime::Content(), *extra2 = new KMime::Content(); - KMime::Content *subExtra = new KMime::Content(); - KMime::Content *subsubExtra = new KMime::Content(); - KMime::Content *subsubExtraNode = new KMime::Content(); - - subNode->addContent(subsubNode); - subNode->addContent(subsubNode2); - node->addContent(subNode); - subsubExtra->addContent(subsubExtraNode); - helper.attachExtraContent(node, extra); - helper.attachExtraContent(node, extra2); - helper.attachExtraContent(subNode, subExtra); - helper.attachExtraContent(subsubNode2, subsubExtra); - - /* all content has a internal first child, so indexes starts at 2 - * node "" - * -> subNode "2" - * -> subsubNode "2.2" - * -> subsubNode2 "2.3" - * - * node "" - * -> extra "0:" - * -> extra2 "1:" - * - * subNode "2" - * -> subExtra "2:0:" - * - * subsubNode2 "2.3" - * -> subsubExtra "2.3:0:" - * -> subsubExtraNode "2.3:0:2" - * - */ - - QCOMPARE(helper.persistentIndex(node), QStringLiteral("")); - QCOMPARE(helper.contentFromIndex(node, QStringLiteral("")), node); - - QCOMPARE(helper.persistentIndex(node->contents()[0]), QStringLiteral("1")); - QCOMPARE(helper.contentFromIndex(node, QStringLiteral("1")), node->contents()[0]); - - QCOMPARE(helper.persistentIndex(subNode), QStringLiteral("2")); - QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2")), subNode); - - QCOMPARE(helper.persistentIndex(subsubNode), QStringLiteral("2.2")); - QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2.2")), subsubNode); - - QCOMPARE(helper.persistentIndex(subsubNode2), QStringLiteral("2.3")); - QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2.3")), subsubNode2); - - QCOMPARE(helper.persistentIndex(extra), QStringLiteral("0:")); - QCOMPARE(helper.contentFromIndex(node, QStringLiteral("0:")), extra); - - QCOMPARE(helper.persistentIndex(extra2), QStringLiteral("1:")); - QCOMPARE(helper.contentFromIndex(node, QStringLiteral("1:")), extra2); - - QCOMPARE(helper.persistentIndex(subExtra), QStringLiteral("2:0:")); - QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2:0:")), subExtra); - - QCOMPARE(helper.persistentIndex(subsubExtra), QStringLiteral("2.3:0:")); - QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2.3:0:")), subsubExtra); - - QCOMPARE(helper.persistentIndex(subsubExtraNode), QStringLiteral("2.3:0:2")); - QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2.3:0:2")), subsubExtraNode); - - delete node; -} - -void NodeHelperTest::testHREF() -{ - NodeHelper helper; - KMime::Message::Ptr msg(new KMime::Message); - QUrl url; - - KMime::Content *node = msg->topLevel(); - KMime::Content *subNode = new KMime::Content(); - KMime::Content *subsubNode = new KMime::Content(), *subsubNode2 = new KMime::Content(); - KMime::Content *extra = new KMime::Content(), *extra2 = new KMime::Content(); - KMime::Content *subExtra = new KMime::Content(); - KMime::Content *subsubExtra = new KMime::Content(); - KMime::Content *subsubExtraNode = new KMime::Content(); - - subNode->addContent(subsubNode); - subNode->addContent(subsubNode2); - node->addContent(subNode); - subsubExtra->addContent(subsubExtraNode); - helper.attachExtraContent(node, extra); - helper.attachExtraContent(node, extra2); - helper.attachExtraContent(subNode, subExtra); - helper.attachExtraContent(subsubNode2, subsubExtra); - - url = QUrl(QStringLiteral("")); - QCOMPARE(helper.fromHREF(msg, url), node); - - url = QUrl(QStringLiteral("attachment:0:?place=body")); - QCOMPARE(helper.fromHREF(msg, url), extra); - - url = QUrl(QStringLiteral("attachment:2.2?place=body")); - QCOMPARE(helper.fromHREF(msg, url), subsubNode); - - url = QUrl(QStringLiteral("attachment:2.3:0:2?place=body")); - QCOMPARE(helper.fromHREF(msg, url), subsubExtraNode); - - QCOMPARE(helper.asHREF(node, QStringLiteral("body")), QStringLiteral("attachment:?place=body")); - QCOMPARE(helper.asHREF(extra, QStringLiteral("body")), QStringLiteral("attachment:0:?place=body")); - QCOMPARE(helper.asHREF(subsubNode, QStringLiteral("body")), QStringLiteral("attachment:2.2?place=body")); - QCOMPARE(helper.asHREF(subsubExtraNode, QStringLiteral("body")), QStringLiteral("attachment:2.3:0:2?place=body")); -} - -void NodeHelperTest::testLocalFiles() -{ - NodeHelper helper; - KMime::Message::Ptr msg(new KMime::Message); - - KMime::Content *node = msg->topLevel(); - KMime::Content *subNode = new KMime::Content(); - KMime::Content *subsubNode = new KMime::Content(), *subsubNode2 = new KMime::Content(); - KMime::Content *extra = new KMime::Content(), *extra2 = new KMime::Content(); - KMime::Content *subExtra = new KMime::Content(); - KMime::Content *subsubExtra = new KMime::Content(); - KMime::Content *subsubExtraNode = new KMime::Content(); - - subNode->addContent(subsubNode); - subNode->addContent(subsubNode2); - node->addContent(subNode); - subsubExtra->addContent(subsubExtraNode); - helper.attachExtraContent(node, extra); - helper.attachExtraContent(node, extra2); - helper.attachExtraContent(subNode, subExtra); - helper.attachExtraContent(subsubNode2, subsubExtra); - - helper.writeNodeToTempFile(node); - QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(node)), node); - helper.writeNodeToTempFile(subNode); - QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subNode)), subNode); - helper.writeNodeToTempFile(subsubNode); - QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subsubNode)), subsubNode); - helper.writeNodeToTempFile(subsubNode2); - QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subsubNode2)), subsubNode2); - helper.writeNodeToTempFile(extra); - QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(extra)), extra); - helper.writeNodeToTempFile(subExtra); - QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subExtra)), subExtra); - helper.writeNodeToTempFile(subsubExtra); - QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subsubExtra)), subsubExtra); - helper.writeNodeToTempFile(subsubExtraNode); - QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subsubExtraNode)), subsubExtraNode); - - helper.forceCleanTempFiles(); -} - -QTEST_MAIN(NodeHelperTest) - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/nodehelpertest.h kf5-messagelib-16.12.3/messageviewer/autotests/nodehelpertest.h --- kf5-messagelib-16.04.3/messageviewer/autotests/nodehelpertest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/nodehelpertest.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -/* Copyright 2015 Sandro Knauß - - 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) version 3 or any later version - accepted by the membership of KDE e.V. (or its successor approved - by the membership of KDE e.V.), which shall act as a proxy - defined in Section 14 of version 3 of the license. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#ifndef NODEHELPERTEST_H -#define NODEHELPERTEST_H - -#include - -#include - -namespace MessageViewer -{ - -class NodeHelperTest : public QObject -{ - Q_OBJECT - -public: - NodeHelperTest(); - -private Q_SLOTS: - void testPersistentIndex(); - void testLocalFiles(); - void testHREF(); -}; - -} -#endif diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/objecttreeparsertest.cpp kf5-messagelib-16.12.3/messageviewer/autotests/objecttreeparsertest.cpp --- kf5-messagelib-16.04.3/messageviewer/autotests/objecttreeparsertest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/objecttreeparsertest.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,316 +0,0 @@ -/* Copyright 2009 Thomas McGuire - - 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) version 3 or any later version - accepted by the membership of KDE e.V. (or its successor approved - by the membership of KDE e.V.), which shall act as a proxy - defined in Section 14 of version 3 of the license. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#include "objecttreeparsertest.h" -#include "util.h" - -#include "viewer/objecttreeparser.h" -#include "viewer/objecttreeemptysource.h" -#include "interfaces/htmlwriter.h" -#include "viewer/csshelperbase.h" - -#include - -#include - -using namespace MessageViewer; - -QTEST_MAIN(ObjectTreeParserTester) - -void ObjectTreeParserTester::initTestCase() -{ - MessageViewer::Test::setupEnv(); -} - -void ObjectTreeParserTester::test_parsePlainMessage() -{ - KMime::Message::Ptr msg(new KMime::Message()); - QByteArray content( - "From: Thomas McGuire \n" - "Subject: Plain Message Test\n" - "Date: Wed, 5 Aug 2009 10:58:27 +0200\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain;\n" - " charset=\"iso-8859-15\"\n" - "\n" - "This is the message text.\n"); - msg->setContent(content); - msg->parse(); - - QCOMPARE(msg->subject()->as7BitString(false).constData(), "Plain Message Test"); - QCOMPARE(msg->contents().size(), 0); - - // Parse the message - EmptySource emptySource; - ObjectTreeParser otp(&emptySource); - otp.parseObjectTree(msg.data()); - - // Check that the textual content and the charset have the expected values - QCOMPARE(otp.plainTextContent(), QStringLiteral("This is the message text.\n")); - QVERIFY(otp.htmlContent().isEmpty()); - QCOMPARE(otp.plainTextContentCharset().toLower(), QByteArray("iso-8859-15")); - - // Check that the message was not modified in any way - QCOMPARE(msg->encodedContent().constData(), content.constData()); - - // Test that the charset of messages without an explicit charset declaration - // is correct - content = - "From: Thomas McGuire \n" - "Subject: Plain Message Test\n" - "Date: Wed, 5 Aug 2009 10:58:27 +0200\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain;\n" - "\n" - "This is the message text.\n"; - msg->setContent(content); - msg->parse(); - ObjectTreeParser otp2(&emptySource); - otp2.parseObjectTree(msg.data()); - QCOMPARE(otp2.plainTextContentCharset().constData(), msg->defaultCharset().constData()); -} - -void ObjectTreeParserTester::test_parseEncapsulatedMessage() -{ - KMime::Message::Ptr msg = readAndParseMail(QStringLiteral("encapsulated-with-attachment.mbox")); - QCOMPARE(msg->subject()->as7BitString(false).constData(), "Fwd: Test with attachment"); - QCOMPARE(msg->contents().size(), 2); - - // Parse the message - TestHtmlWriter testWriter; - TestCSSHelper testCSSHelper; - NodeHelper nodeHelper; - MessageViewer::Test::TestObjectTreeSource emptySource(&testWriter, &testCSSHelper); - ObjectTreeParser otp(&emptySource, &nodeHelper); - otp.parseObjectTree(msg.data()); - - // Check that the OTP didn't modify the message in weird ways - QCOMPARE(msg->contents().size(), 2); - QCOMPARE(msg->contents().at(0)->contents().size(), 0); - QCOMPARE(msg->contents().at(1)->contents().size(), 1); - QCOMPARE(msg->contents().at(1)->contents().first()->contents().size(), 2); - QCOMPARE(msg->contents().at(1)->contents().first()->contents().at(0)->contents().size(), 0); - QCOMPARE(msg->contents().at(1)->contents().first()->contents().at(1)->contents().size(), 0); - - // Check that the textual content and the charset have the expected values - QCOMPARE(otp.plainTextContent(), QStringLiteral("This is the first encapsulating message.\n")); - QCOMPARE(otp.plainTextContentCharset().toLower(), QByteArray("iso-8859-15")); - QVERIFY(otp.htmlContent().isEmpty()); - - // Check that the objecttreeparser did process the encapsulated message - KMime::Message::Ptr encapsulated = msg->contents().at(1)->bodyAsMessage(); - QVERIFY(encapsulated.data()); - QVERIFY(nodeHelper.nodeProcessed(encapsulated.data())); - QVERIFY(nodeHelper.nodeProcessed(encapsulated->contents().at(0))); - QVERIFY(nodeHelper.nodeProcessed(encapsulated->contents().at(1))); - QVERIFY(nodeHelper.partMetaData(msg->contents().at(1)).isEncapsulatedRfc822Message); -} - -void ObjectTreeParserTester::test_missingContentTypeHeader() -{ - KMime::Message::Ptr msg = readAndParseMail(QStringLiteral("no-content-type.mbox")); - QCOMPARE(msg->subject()->as7BitString(false).constData(), "Simple Mail Without Content-Type Header"); - QCOMPARE(msg->contents().size(), 0); - - TestHtmlWriter testWriter; - TestCSSHelper testCSSHelper; - NodeHelper nodeHelper; - MessageViewer::Test::TestObjectTreeSource emptySource(&testWriter, &testCSSHelper); - ObjectTreeParser otp(&emptySource, &nodeHelper); - otp.parseObjectTree(msg.data()); - - QCOMPARE(otp.plainTextContent().toLatin1().data(), "asdfasdf"); - QVERIFY(otp.htmlContent().isEmpty()); -} - -void ObjectTreeParserTester::test_inlinePGPDecryption() -{ - KMime::Message::Ptr msg = readAndParseMail(QStringLiteral("inlinepgpencrypted.mbox")); - - QCOMPARE(msg->subject()->as7BitString(false).constData(), "inlinepgpencrypted"); - QCOMPARE(msg->contents().size(), 0); - - TestHtmlWriter testWriter; - TestCSSHelper testCSSHelper; - NodeHelper nodeHelper; - MessageViewer::Test::TestObjectTreeSource emptySource(&testWriter, &testCSSHelper); - ObjectTreeParser otp(&emptySource, &nodeHelper); - - emptySource.setAllowDecryption(true); - otp.parseObjectTree(msg.data()); - - QCOMPARE(otp.plainTextContent().toLatin1().data(), "some random text"); - - // This test is only a workaround, till we can set the memento to the propper node of the mail. - KMime::Content *content = new KMime::Content; - QVERIFY(nodeHelper.bodyPartMemento(content, "decryptverify")); - - QVERIFY(otp.htmlContent().isEmpty()); -} - -void ObjectTreeParserTester::test_inlinePGPSigned() -{ - KMime::Message::Ptr msg = readAndParseMail(QStringLiteral("openpgp-inline-signed.mbox")); - - QCOMPARE(msg->subject()->as7BitString(false).constData(), "test"); - QCOMPARE(msg->contents().size(), 0); - - TestHtmlWriter testWriter; - TestCSSHelper testCSSHelper; - NodeHelper nodeHelper; - MessageViewer::Test::TestObjectTreeSource emptySource(&testWriter, &testCSSHelper); - ObjectTreeParser otp(&emptySource, &nodeHelper); - - emptySource.setAllowDecryption(true); - otp.parseObjectTree(msg.data()); - - // This test is only a workaround, till we can set the memento to the propper node of the mail. - QVERIFY(nodeHelper.bodyPartMemento(0, "verification")); -} - -void ObjectTreeParserTester::test_HTML() -{ - KMime::Message::Ptr msg = readAndParseMail(QStringLiteral("html.mbox")); - - QCOMPARE(msg->subject()->as7BitString(false).constData(), "HTML test"); - QCOMPARE(msg->contents().size(), 2); - - EmptySource emptySource; - ObjectTreeParser otp(&emptySource); - - otp.parseObjectTree(msg.data()); - - QCOMPARE(otp.plainTextContent().toLatin1().data(), "Some HTML text"); - QVERIFY(otp.htmlContent().contains(QStringLiteral("Some HTML text"))); - QCOMPARE(otp.htmlContentCharset().data(), "windows-1252"); -} - -void ObjectTreeParserTester::test_HTMLasText() -{ - KMime::Message::Ptr msg = readAndParseMail(QStringLiteral("html.mbox")); - - QCOMPARE(msg->subject()->as7BitString(false).constData(), "HTML test"); - QCOMPARE(msg->contents().size(), 2); - - TestHtmlWriter testWriter; - TestCSSHelper testCSSHelper; - MessageViewer::Test::TestObjectTreeSource emptySource(&testWriter, &testCSSHelper); - ObjectTreeParser otp(&emptySource); - emptySource.setHtmlMail(false); - otp.parseObjectTree(msg.data()); - - QCOMPARE(otp.htmlContent().toLatin1().constData(), ""); - QCOMPARE(otp.htmlContentCharset().constData(), ""); - QCOMPARE(otp.plainTextContent().toLatin1().constData(), "Some HTML text"); - QCOMPARE(otp.plainTextContentCharset().constData(), "windows-1252"); -} - -void ObjectTreeParserTester::test_HTMLOnly() -{ - KMime::Message::Ptr msg = readAndParseMail(QStringLiteral("htmlonly.mbox")); - - QCOMPARE(msg->subject()->as7BitString(false).constData(), "HTML test"); - QCOMPARE(msg->contents().size(), 0); - - EmptySource emptySource; - ObjectTreeParser otp(&emptySource); - - otp.parseObjectTree(msg.data()); - - QVERIFY(otp.plainTextContent().isEmpty()); - QVERIFY(otp.htmlContent().contains(QStringLiteral("SOME HTML text."))); -} - -void ObjectTreeParserTester::test_HTMLOnlyText() -{ - KMime::Message::Ptr msg = readAndParseMail(QStringLiteral("htmlonly.mbox")); - - QCOMPARE(msg->subject()->as7BitString(false).constData(), "HTML test"); - QCOMPARE(msg->contents().size(), 0); - - TestHtmlWriter testWriter; - TestCSSHelper testCSSHelper; - MessageViewer::Test::TestObjectTreeSource emptySource(&testWriter, &testCSSHelper); - ObjectTreeParser otp(&emptySource); - - emptySource.setHtmlMail(false); - otp.parseObjectTree(msg.data()); - - QVERIFY(otp.plainTextContent().isEmpty()); - QVERIFY(otp.htmlContent().contains(QStringLiteral("SOME HTML text."))); - QVERIFY(testWriter.html.contains(QStringLiteral("This is an HTML message. For security reasons, only the raw HTML code is shown."))); - QVERIFY(testWriter.html.contains(QStringLiteral("*SOME* HTML text.
"))); -} - -void ObjectTreeParserTester::test_HTMLExternal() -{ - KMime::Message::Ptr msg = readAndParseMail(QStringLiteral("htmlonlyexternal.mbox")); - - QCOMPARE(msg->subject()->as7BitString(false).constData(), "HTML test"); - QCOMPARE(msg->contents().size(), 0); - - { - TestHtmlWriter testWriter; - TestCSSHelper testCSSHelper; - MessageViewer::Test::TestObjectTreeSource emptySource(&testWriter, &testCSSHelper); - ObjectTreeParser otp(&emptySource); - - otp.parseObjectTree(msg.data()); - - QVERIFY(otp.plainTextContent().isEmpty()); - QVERIFY(otp.htmlContent().contains(QStringLiteral("SOME HTML text."))); - QVERIFY(testWriter.html.contains(QStringLiteral("SOME HTML text."))); - QVERIFY(testWriter.html.contains(QStringLiteral("This HTML message may contain external references to images etc. For security/privacy reasons external references are not loaded."))); - } - { - TestHtmlWriter testWriter; - TestCSSHelper testCSSHelper; - MessageViewer::Test::TestObjectTreeSource emptySource(&testWriter, &testCSSHelper); - ObjectTreeParser otp(&emptySource); - - emptySource.setHtmlLoadExternal(true); - otp.parseObjectTree(msg.data()); - - QVERIFY(otp.htmlContent().contains(QStringLiteral("SOME HTML text."))); - QVERIFY(testWriter.html.contains(QStringLiteral("SOME HTML text."))); - QVERIFY(!testWriter.html.contains(QStringLiteral("This HTML message may contain external references to images etc. For security/privacy reasons external references are not loaded."))); - } -} - -void ObjectTreeParserTester::text_quoteHtml_data() -{ - QTest::addColumn("data"); - QTest::addColumn("result"); - QTest::newRow("simpletext") << QStringLiteral("http") << QStringLiteral("
http
"); - QTest::newRow("simplequote") << QStringLiteral(">") << QStringLiteral("
>
"); - QTest::newRow("doublequotewithtext") << QStringLiteral(">> sddf") << QStringLiteral("
>> sddf
"); - QTest::newRow("doublequote") << QStringLiteral(">>") << QStringLiteral("
>>
"); - QTest::newRow("simplespace") << QStringLiteral(" ") << QStringLiteral("
 
"); - QTest::newRow("multispace") << QStringLiteral(" Bug ID: 358324") << QStringLiteral("
            Bug ID: 358324
"); -} - -void ObjectTreeParserTester::text_quoteHtml() -{ - QFETCH(QString, data); - QFETCH(QString, result); - TestHtmlWriter testWriter; - TestCSSHelper testCSSHelper; - MessageViewer::Test::TestObjectTreeSource emptySource(&testWriter, &testCSSHelper); - ObjectTreeParser otp(&emptySource); - QCOMPARE(otp.quotedHTML(data, false), result); -} diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/objecttreeparsertest.h kf5-messagelib-16.12.3/messageviewer/autotests/objecttreeparsertest.h --- kf5-messagelib-16.04.3/messageviewer/autotests/objecttreeparsertest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/objecttreeparsertest.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -/* Copyright 2009 Thomas McGuire - - 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) version 3 or any later version - accepted by the membership of KDE e.V. (or its successor approved - by the membership of KDE e.V.), which shall act as a proxy - defined in Section 14 of version 3 of the license. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#ifndef OBJECTTREEPARSERTEST_H -#define OBJECTTREEPARSERTEST_H - -#include - -#include - -class ObjectTreeParserTester : public QObject -{ - Q_OBJECT - -public Q_SLOTS: - void initTestCase(); - -private Q_SLOTS: - void test_parseEncapsulatedMessage(); - void test_parsePlainMessage(); - void test_missingContentTypeHeader(); - void test_inlinePGPDecryption(); - void test_inlinePGPSigned(); - void test_HTML(); - void test_HTMLasText(); - void test_HTMLOnly(); - void test_HTMLOnlyText(); - void test_HTMLExternal(); - - void text_quoteHtml(); - void text_quoteHtml_data(); -}; - -#endif diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/rendertest.cpp kf5-messagelib-16.12.3/messageviewer/autotests/rendertest.cpp --- kf5-messagelib-16.04.3/messageviewer/autotests/rendertest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/rendertest.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,231 +0,0 @@ -/* - Copyright (c) 2010 Volker Krause - - This library 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. - - This library 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 this library; see the file COPYING.LIB. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. -*/ - -#include "rendertest.h" -#include "util.h" -#include "testcsshelper.h" -#include "setupenv.h" - -#include "htmlwriter/filehtmlwriter.h" -#include "viewer/objecttreeparser.h" - -#include - -#include -#include -#include - -using namespace MessageViewer; - -void RenderTest::initTestCase() -{ - MessageViewer::Test::setupEnv(); -} - -void RenderTest::testRenderSmart_data() -{ - QTest::addColumn("mailFileName"); - QTest::addColumn("referenceFileName"); - QTest::addColumn("outFileName"); - QTest::addColumn("attachmentStrategy"); - - QDir dir(QStringLiteral(MAIL_DATA_DIR)); - foreach (const QString &file, dir.entryList(QStringList(QLatin1String("*.mbox")), QDir::Files | QDir::Readable | QDir::NoSymLinks)) { - if (!QFile::exists(dir.path() + QLatin1Char('/') + file + QStringLiteral(".html"))) { - continue; - } - QTest::newRow(file.toLatin1()) << file << QString(dir.path() + QLatin1Char('/') + file + QStringLiteral(".html")) << QString(file + QStringLiteral(".out")) << QStringLiteral("smart"); - } -} - -void RenderTest::testRenderSmart() -{ - testRender(); -} - -void RenderTest::testRenderInlined_data() -{ - QTest::addColumn("mailFileName"); - QTest::addColumn("referenceFileName"); - QTest::addColumn("outFileName"); - QTest::addColumn("attachmentStrategy"); - - QDir dir(QStringLiteral(MAIL_DATA_DIR)); - foreach (const QString &file, dir.entryList(QStringList(QLatin1String("*.mbox")), QDir::Files | QDir::Readable | QDir::NoSymLinks)) { - QString fname = dir.path() + QStringLiteral("/inlined/") + file + QStringLiteral(".html"); - if (!QFile::exists(fname)) { - fname = dir.path() + QStringLiteral("/") + file + QStringLiteral(".html"); - if (!QFile::exists(fname)) { - continue; - } - } - QTest::newRow(file.toLatin1()) << file << fname << QString(file + QStringLiteral(".out")) << QStringLiteral("inlined"); - } -} - -void RenderTest::testRenderInlined() -{ - testRender(); -} - -void RenderTest::testRenderIconic_data() -{ - QTest::addColumn("mailFileName"); - QTest::addColumn("referenceFileName"); - QTest::addColumn("outFileName"); - QTest::addColumn("attachmentStrategy"); - - QDir dir(QStringLiteral(MAIL_DATA_DIR)); - foreach (const QString &file, dir.entryList(QStringList(QLatin1String("*.mbox")), QDir::Files | QDir::Readable | QDir::NoSymLinks)) { - QString fname = dir.path() + QStringLiteral("/iconic/") + file + QStringLiteral(".html"); - if (!QFile::exists(fname)) { - fname = dir.path() + QStringLiteral("/") + file + QStringLiteral(".html"); - if (!QFile::exists(fname)) { - continue; - } - } - QTest::newRow(file.toLatin1()) << file << fname << QString(file + QStringLiteral(".out")) << QStringLiteral("iconic"); - } -} - -void RenderTest::testRenderIconic() -{ - testRender(); -} - -void RenderTest::testRenderHidden_data() -{ - QTest::addColumn("mailFileName"); - QTest::addColumn("referenceFileName"); - QTest::addColumn("outFileName"); - QTest::addColumn("attachmentStrategy"); - - QDir dir(QStringLiteral(MAIL_DATA_DIR)); - foreach (const QString &file, dir.entryList(QStringList(QLatin1String("*.mbox")), QDir::Files | QDir::Readable | QDir::NoSymLinks)) { - QString fname = dir.path() + QStringLiteral("/hidden/") + file + QStringLiteral(".html"); - if (!QFile::exists(fname)) { - fname = dir.path() + QStringLiteral("/") + file + QStringLiteral(".html"); - if (!QFile::exists(fname)) { - continue; - } - } - QTest::newRow(file.toLatin1()) << file << fname << QString(file + QStringLiteral(".out")) << QStringLiteral("hidden"); - } -} - -void RenderTest::testRenderHidden() -{ - testRender(); -} - -void RenderTest::testRenderHeaderOnly_data() -{ - QTest::addColumn("mailFileName"); - QTest::addColumn("referenceFileName"); - QTest::addColumn("outFileName"); - QTest::addColumn("attachmentStrategy"); - - QDir dir(QStringLiteral(MAIL_DATA_DIR)); - foreach (const QString &file, dir.entryList(QStringList(QLatin1String("*.mbox")), QDir::Files | QDir::Readable | QDir::NoSymLinks)) { - QString fname = dir.path() + QStringLiteral("/headeronly/") + file + QStringLiteral(".html"); - if (!QFile::exists(fname)) { - fname = dir.path() + QStringLiteral("/") + file + QStringLiteral(".html"); - if (!QFile::exists(fname)) { - continue; - } - } - QTest::newRow(file.toLatin1()) << file << fname << QString(file + QStringLiteral(".out")) << QStringLiteral("headeronly"); - } -} - -void RenderTest::testRenderHeaderOnly() -{ - testRender(); -} - -void RenderTest::testRender() -{ - QFETCH(QString, mailFileName); - QFETCH(QString, referenceFileName); - QFETCH(QString, outFileName); - QFETCH(QString, attachmentStrategy); - - const QString htmlFileName = outFileName + QStringLiteral(".html"); - - // load input mail - const KMime::Message::Ptr msg(readAndParseMail(mailFileName)); - - // render the mail - FileHtmlWriter fileWriter(outFileName); - QImage paintDevice; - MessageViewer::TestCSSHelper cssHelper(&paintDevice); - NodeHelper nodeHelper; - MessageViewer::Test::TestObjectTreeSource testSource(&fileWriter, &cssHelper); - testSource.setAllowDecryption(true); - testSource.setAttachmentStrategy(attachmentStrategy); - ObjectTreeParser otp(&testSource, &nodeHelper); - - fileWriter.begin(QString()); - fileWriter.queue(cssHelper.htmlHead(false)); - - otp.parseObjectTree(msg.data()); - - fileWriter.queue(QStringLiteral("")); - fileWriter.flush(); - fileWriter.end(); - - QVERIFY(QFile::exists(outFileName)); - - // validate xml and pretty-print for comparisson - // TODO add proper cmake check for xmllint and diff - QStringList args = QStringList() - << QStringLiteral("--format") - << QStringLiteral("--encode") - << QStringLiteral("UTF8") - << QStringLiteral("--output") - << htmlFileName - << outFileName; - QCOMPARE(QProcess::execute(QStringLiteral("xmllint"), args), 0); - - // get rid of system dependent or random paths - { - QFile f(htmlFileName); - QVERIFY(f.open(QIODevice::ReadOnly)); - QString content = QString::fromUtf8(f.readAll()); - f.close(); - content.replace(QRegExp(QStringLiteral("\"file:[^\"]*[/(?:%2F)]([^\"/(?:%2F)]*)\"")), QStringLiteral("\"file:\\1\"")); - QVERIFY(f.open(QIODevice::WriteOnly | QIODevice::Truncate)); - f.write(content.toUtf8()); - f.close(); - } - - // compare to reference file - args = QStringList() - << QStringLiteral("-u") - << referenceFileName - << htmlFileName; - QProcess proc; - proc.setProcessChannelMode(QProcess::ForwardedChannels); - proc.start(QStringLiteral("diff"), args); - QVERIFY(proc.waitForFinished()); - - QCOMPARE(proc.exitCode(), 0); -} - -QTEST_MAIN(RenderTest) \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/rendertest.h kf5-messagelib-16.12.3/messageviewer/autotests/rendertest.h --- kf5-messagelib-16.04.3/messageviewer/autotests/rendertest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/rendertest.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -/* Copyright (c) 2010 Volker Krause - Copyright (c) 2016 sandro Knauß - - 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 - accepted by the membership of KDE e.V. (or its successor approved - by the membership of KDE e.V.), which shall act as a proxy - defined in Section 14 of version 3 of the license. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#ifndef RENDERTEST_H -#define RENDERTEST_H - -#include - -class RenderTest : public QObject -{ - Q_OBJECT - -public Q_SLOTS: - void initTestCase(); - -private Q_SLOTS: - void testRenderSmart_data(); - void testRenderSmart(); - - void testRenderInlined_data(); - void testRenderInlined(); - - void testRenderIconic_data(); - void testRenderIconic(); - - void testRenderHidden_data(); - void testRenderHidden(); - - void testRenderHeaderOnly_data(); - void testRenderHeaderOnly(); -private: - void testRender(); -}; - -#endif \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/setupenv.cpp kf5-messagelib-16.12.3/messageviewer/autotests/setupenv.cpp --- kf5-messagelib-16.04.3/messageviewer/autotests/setupenv.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/setupenv.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -28,7 +28,7 @@ void MessageViewer::Test::setupEnv() { setenv("LC_ALL", "C", 1); - setenv("KDEHOME", QFile::encodeName(QDir::homePath() + QString::fromLatin1("/.qttest")), 1); + setenv("KDEHOME", QFile::encodeName(QDir::homePath() + QString::fromLatin1("/.qttest")).constData(), 1); QStandardPaths::setTestModeEnabled(true); } diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/setupenv.h kf5-messagelib-16.12.3/messageviewer/autotests/setupenv.h --- kf5-messagelib-16.04.3/messageviewer/autotests/setupenv.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/setupenv.h 2017-03-06 12:30:37.000000000 +0000 @@ -38,80 +38,6 @@ */ void setupEnv(); -// We can't use EmptySource, since we need to control some emelnets of the source for tests to also test -// loadExternal and htmlMail. -class TestObjectTreeSource : public MessageViewer::EmptySource -{ -public: - TestObjectTreeSource(MessageViewer::HtmlWriter *writer, - MessageViewer::CSSHelperBase *cssHelper) - : mWriter(writer) - , mCSSHelper(cssHelper) - , mAttachmentStrategy(QStringLiteral("smart")) - , mHtmlLoadExternal(false) - , mHtmlMail(true) - { - } - - MessageViewer::HtmlWriter *htmlWriter() Q_DECL_OVERRIDE { - return mWriter; - } - MessageViewer::CSSHelperBase *cssHelper() Q_DECL_OVERRIDE { - return mCSSHelper; - } - - bool htmlLoadExternal() const Q_DECL_OVERRIDE - { - return mHtmlLoadExternal; - } - - void setHtmlLoadExternal(bool loadExternal) - { - mHtmlLoadExternal = loadExternal; - } - - bool htmlMail() const Q_DECL_OVERRIDE - { - return mHtmlMail; - } - - void setHtmlMail(bool htmlMail) - { - mHtmlMail = htmlMail; - } - - void setAttachmentStrategy(QString strategy) - { - mAttachmentStrategy = strategy; - } - - const AttachmentStrategy *attachmentStrategy() Q_DECL_OVERRIDE { - return AttachmentStrategy::create(mAttachmentStrategy); - } - - bool autoImportKeys() const Q_DECL_OVERRIDE - { - return true; - } - - bool showEmoticons() const Q_DECL_OVERRIDE - { - return false; - } - - bool showExpandQuotesMark() const Q_DECL_OVERRIDE - { - return false; - } - -private: - MessageViewer::HtmlWriter *mWriter; - MessageViewer::CSSHelperBase *mCSSHelper; - QString mAttachmentStrategy; - bool mHtmlLoadExternal; - bool mHtmlMail; -}; - } } diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/testcsshelper.cpp kf5-messagelib-16.12.3/messageviewer/autotests/testcsshelper.cpp --- kf5-messagelib-16.04.3/messageviewer/autotests/testcsshelper.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/testcsshelper.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,106 +0,0 @@ -/* - testcsshelper.cpp - - This file is part of KMail, the KDE mail client. - Copyright (c) 2013 Sandro Knauß - - KMail is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - KMail is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - In addition, as a special exception, the copyright holders give - permission to link the code of this program with any edition of - the Qt library by Trolltech AS, Norway (or with modified versions - of Qt that use the same license as Qt), and distribute linked - combinations including the two. You must obey the GNU General - Public License in all respects for all of the code used other than - Qt. If you modify this file, you may extend this exception to - your version of the file, but you are not obligated to do so. If - you do not wish to do so, delete this exception statement from - your version. -*/ - -#include "testcsshelper.h" - -#include -#include -#include -#include - -namespace MessageViewer -{ - -TestCSSHelper::TestCSSHelper(const QPaintDevice *pd) : - CSSHelperBase(pd) -{ - mRecycleQuoteColors = false; - mBackgroundColor = QColor(0xff, 0xff, 0xff); - mForegroundColor = QColor(0x1f, 0x1c, 0x1b); - mLinkColor = QColor(0x00, 0x57, 0xae); - cPgpEncrH = QColor(0x00, 0x80, 0xff); - cPgpOk1H = QColor(0x40, 0xff, 0x40); - cPgpOk0H = QColor(0xff, 0xff, 0x40); - cPgpWarnH = QColor(0xff, 0xff, 0x40); - cPgpErrH = QColor(0xff, 0x00, 0x00); - - cPgpEncrHT = QColor(0xff, 0xff, 0xff); - cPgpOk1HT = QColor(0x27, 0xae, 0x60); - cPgpOk0HT = QColor(0xf6, 0x74, 0x00); - cPgpWarnHT = QColor(0xf6, 0x74, 0x00); - cPgpErrHT = QColor(0xda, 0x44, 0x53); - - cHtmlWarning = QColor(0xff, 0x40, 0x40); - for (int i = 0; i < 3; ++i) { - mQuoteColor[i] = QColor(0x00, 0x80 - i * 0x10, 0x00); - } - - QFont defaultFont = QFont(QStringLiteral("Sans Serif"), 9); - mBodyFont = defaultFont; - mPrintFont = defaultFont; - mFixedFont = defaultFont; - mFixedPrintFont = defaultFont; - defaultFont.setItalic(true); - for (int i = 0; i < 3; ++i) { - mQuoteFont[i] = defaultFont; - } - - mShrinkQuotes = false; - - QPalette pal; - - pal.setColor(QPalette::Background, QColor(0xd6, 0xd2, 0xd0)); - pal.setColor(QPalette::Foreground, QColor(0x22, 0x1f, 0x1e)); - pal.setColor(QPalette::Highlight, QColor(0x43, 0xac, 0xe8)); - pal.setColor(QPalette::HighlightedText, QColor(0xff, 0xff, 0xff)); - pal.setColor(QPalette::Mid, QColor(0xb3, 0xab, 0xa7)); - - QApplication::setPalette(pal); - - recalculatePGPColors(); -} - -TestCSSHelper::~TestCSSHelper() -{ - -} - -QString TestCSSHelper::htmlHead(bool fixed) const -{ - Q_UNUSED(fixed); - return - QStringLiteral("\n" - "\n" - "\n"); -} - -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/testcsshelper.h kf5-messagelib-16.12.3/messageviewer/autotests/testcsshelper.h --- kf5-messagelib-16.04.3/messageviewer/autotests/testcsshelper.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/testcsshelper.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -/* -*- c++ -*- - testcsshelper.h - - This file is part of KMail, the KDE mail client. - Copyright (c) 2013 Sandro Knauß - - KMail is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - KMail is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - In addition, as a special exception, the copyright holders give - permission to link the code of this program with any edition of - the Qt library by Trolltech AS, Norway (or with modified versions - of Qt that use the same license as Qt), and distribute linked - combinations including the two. You must obey the GNU General - Public License in all respects for all of the code used other than - Qt. If you modify this file, you may extend this exception to - your version of the file, but you are not obligated to do so. If - you do not wish to do so, delete this exception statement from - your version. -*/ - -#ifndef __MESSAGEVIEWER_TESTCSSHELPER_H__ -#define __MESSAGEVIEWER_TESTCSSHELPER_H__ - -#include "viewer/csshelperbase.h" - -namespace MessageViewer -{ - -class TestCSSHelper : public CSSHelperBase -{ -public: - explicit TestCSSHelper(const QPaintDevice *pd); - virtual ~TestCSSHelper(); - QString htmlHead(bool fixed) const Q_DECL_OVERRIDE; -}; - -} - -#endif // __MESSAGEVIEWER_TESTCSSHELPER_H__ diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unencryptedmessagetest.cpp kf5-messagelib-16.12.3/messageviewer/autotests/unencryptedmessagetest.cpp --- kf5-messagelib-16.04.3/messageviewer/autotests/unencryptedmessagetest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unencryptedmessagetest.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,310 +0,0 @@ -/* - Copyright (c) 2010 Thomas McGuire - - This library 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. - - This library 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 this library; see the file COPYING.LIB. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. -*/ -#include "viewer/objecttreeparser.h" -#include "util.h" - -#include "viewer/objecttreeemptysource.h" - -#include - -#include - -using namespace MessageViewer; - -class UnencryptedMessageTest : public QObject -{ - Q_OBJECT -private Q_SLOTS: - void initTestCase(); - void testMailWithoutEncryption(); - void testSMIMESignedEncrypted(); - void testOpenPGPSignedEncrypted(); - void testForwardedOpenPGPSignedEncrypted(); - void testSignedForwardedOpenPGPSignedEncrypted(); - void testOpenPGPEncrypted(); - void testOpenPGPEncryptedNotDecrypted(); - void testAsync_data(); - void testAsync(); - void testNotDecrypted_data(); - void testNotDecrypted(); - void testSMimeAutoCertImport(); -}; - -QTEST_MAIN(UnencryptedMessageTest) - -void UnencryptedMessageTest::initTestCase() -{ - MessageViewer::Test::setupEnv(); -} - -void UnencryptedMessageTest::testMailWithoutEncryption() -{ - KMime::Message::Ptr originalMessage = readAndParseMail(QStringLiteral("encapsulated-with-attachment.mbox")); - NodeHelper nodeHelper; - EmptySource emptySource; - ObjectTreeParser otp(&emptySource, &nodeHelper); - otp.parseObjectTree(originalMessage.data()); - QVERIFY(!nodeHelper.unencryptedMessage(originalMessage)); -} - -void UnencryptedMessageTest::testSignedForwardedOpenPGPSignedEncrypted() -{ - KMime::Message::Ptr originalMessage = readAndParseMail(QStringLiteral("signed-forward-openpgp-signed-encrypted.mbox")); - - NodeHelper nodeHelper; - TestHtmlWriter testWriter; - TestCSSHelper testCSSHelper; - MessageViewer::Test::TestObjectTreeSource emptySource(&testWriter, &testCSSHelper); - ObjectTreeParser otp(&emptySource, &nodeHelper); - otp.parseObjectTree(originalMessage.data()); - - QCOMPARE(otp.plainTextContent().toLatin1().data(), "bla bla bla"); // The textual content doesn't include the encrypted encapsulated message by design - QCOMPARE(nodeHelper.overallEncryptionState(originalMessage.data()), KMMsgPartiallyEncrypted); - QCOMPARE(nodeHelper.overallSignatureState(originalMessage.data()), KMMsgFullySigned); - - KMime::Message::Ptr unencryptedMessage = nodeHelper.unencryptedMessage(originalMessage); - QVERIFY(!unencryptedMessage); // We must not invalidate the outer signature -} - -void UnencryptedMessageTest::testForwardedOpenPGPSignedEncrypted() -{ - KMime::Message::Ptr originalMessage = readAndParseMail(QStringLiteral("forward-openpgp-signed-encrypted.mbox")); - - NodeHelper nodeHelper; - TestHtmlWriter testWriter; - TestCSSHelper testCSSHelper; - MessageViewer::Test::TestObjectTreeSource emptySource(&testWriter, &testCSSHelper); - emptySource.setAllowDecryption(true); - ObjectTreeParser otp(&emptySource, &nodeHelper); - otp.parseObjectTree(originalMessage.data()); - - QCOMPARE(otp.plainTextContent().toLatin1().data(), "bla bla bla"); // The textual content doesn't include the encrypted encapsulated message by design - QCOMPARE(nodeHelper.overallEncryptionState(originalMessage.data()), KMMsgPartiallyEncrypted); - - // Signature state handling is broken. First, the state is apparently not calculated correctly, - // and then the state is never stored somewhere so it can't be remembered. - QEXPECT_FAIL("", "Signature state handling broken!", Continue); - QVERIFY(nodeHelper.overallSignatureState(originalMessage.data()) != KMMsgNotSigned); - - // Now, test that the unencrypted message is generated correctly - KMime::Message::Ptr unencryptedMessage = nodeHelper.unencryptedMessage(originalMessage); - QVERIFY(unencryptedMessage.data()); - QCOMPARE(unencryptedMessage->contentType()->mimeType().data(), "multipart/mixed"); - QCOMPARE(unencryptedMessage->contents().size(), 2); - QCOMPARE(unencryptedMessage->contents().first()->contentType()->mimeType().data(), "text/plain"); - QCOMPARE(unencryptedMessage->contents().first()->decodedContent().data(), "bla bla bla"); - QCOMPARE(unencryptedMessage->contents().at(1)->contentType()->mimeType().data(), "message/rfc822"); - KMime::Message::Ptr encapsulated = unencryptedMessage->contents().at(1)->bodyAsMessage(); - QCOMPARE(encapsulated->contentType()->mimeType().data(), "multipart/signed"); - QCOMPARE(encapsulated->contents().size(), 2); - QCOMPARE(encapsulated->contents().first()->contentType()->mimeType().data(), "text/plain"); - QCOMPARE(encapsulated->contents().at(1)->contentType()->mimeType().data(), "application/pgp-signature"); - QCOMPARE(encapsulated->contents().first()->decodedContent().data(), "encrypted message text"); - - // TODO: Check that the signature is valid -} - -void UnencryptedMessageTest::testSMIMESignedEncrypted() -{ - KMime::Message::Ptr originalMessage = readAndParseMail(QStringLiteral("smime-signed-encrypted.mbox")); - - NodeHelper nodeHelper; - EmptySource emptySource; - emptySource.setAllowDecryption(true); - ObjectTreeParser otp(&emptySource, &nodeHelper); - otp.parseObjectTree(originalMessage.data()); - - QCOMPARE(otp.plainTextContent().toLatin1().data(), "encrypted message text"); - QCOMPARE(nodeHelper.overallEncryptionState(originalMessage.data()), KMMsgFullyEncrypted); - - // Signature state handling is broken. First, the state is apparently not calculated correctly, - // and then the state is never stored somewhere so it can't be remembered. - QEXPECT_FAIL("", "Signature state handling broken!", Continue); - QVERIFY(nodeHelper.overallSignatureState(originalMessage.data()) != KMMsgNotSigned); - - // Now, test that the unencrypted message is generated correctly - KMime::Message::Ptr unencryptedMessage = nodeHelper.unencryptedMessage(originalMessage); - QCOMPARE(unencryptedMessage->contentType()->mimeType().data(), "multipart/signed"); - QCOMPARE(unencryptedMessage->contents().size(), 2); - QCOMPARE(unencryptedMessage->contents().first()->contentType()->mimeType().data(), "text/plain"); - QCOMPARE(unencryptedMessage->contents().at(1)->contentType()->mimeType().data(), "application/pkcs7-signature"); - QCOMPARE(unencryptedMessage->contents().first()->decodedContent().data(), "encrypted message text"); - - // TODO: Check that the signature is valid -} - -void UnencryptedMessageTest::testOpenPGPSignedEncrypted() -{ - KMime::Message::Ptr originalMessage = readAndParseMail(QStringLiteral("openpgp-signed-encrypted.mbox")); - - NodeHelper nodeHelper; - EmptySource emptySource; - emptySource.setAllowDecryption(true); - ObjectTreeParser otp(&emptySource, &nodeHelper); - otp.parseObjectTree(originalMessage.data()); - - QCOMPARE(otp.plainTextContent().toLatin1().data(), "encrypted message text"); - QCOMPARE(nodeHelper.overallEncryptionState(originalMessage.data()), KMMsgFullyEncrypted); - - // Signature state handling is broken. First, the state is apparently not calculated correctly, - // and then the state is never stored somewhere so it can't be remembered. - QEXPECT_FAIL("", "Signature state handling broken!", Continue); - QVERIFY(nodeHelper.overallSignatureState(originalMessage.data()) != KMMsgNotSigned); - - // Now, test that the unencrypted message is generated correctly - KMime::Message::Ptr unencryptedMessage = nodeHelper.unencryptedMessage(originalMessage); - QCOMPARE(unencryptedMessage->contentType()->mimeType().data(), "multipart/signed"); - QCOMPARE(unencryptedMessage->contents().size(), 2); - QCOMPARE(unencryptedMessage->contents().first()->contentType()->mimeType().data(), "text/plain"); - QCOMPARE(unencryptedMessage->contents().at(1)->contentType()->mimeType().data(), "application/pgp-signature"); - QCOMPARE(unencryptedMessage->contents().first()->decodedContent().data(), "encrypted message text"); - - // TODO: Check that the signature is valid -} - -void UnencryptedMessageTest::testOpenPGPEncrypted() -{ - KMime::Message::Ptr originalMessage = readAndParseMail(QStringLiteral("openpgp-encrypted.mbox")); - - NodeHelper nodeHelper; - EmptySource emptySource; - emptySource.setAllowDecryption(true); - ObjectTreeParser otp(&emptySource, &nodeHelper); - otp.parseObjectTree(originalMessage.data()); - - QCOMPARE(otp.plainTextContent().toLatin1().data(), "encrypted message text"); - QCOMPARE(nodeHelper.overallEncryptionState(originalMessage.data()), KMMsgFullyEncrypted); - - // Now, test that the unencrypted message is generated correctly - KMime::Message::Ptr unencryptedMessage = nodeHelper.unencryptedMessage(originalMessage); - QCOMPARE(unencryptedMessage->contentType()->mimeType().data(), "text/plain"); - QCOMPARE(unencryptedMessage->decodedContent().data(), "encrypted message text"); - QCOMPARE(unencryptedMessage->contents().size(), 0); -} - -void UnencryptedMessageTest::testOpenPGPEncryptedNotDecrypted() -{ - KMime::Message::Ptr originalMessage = readAndParseMail(QStringLiteral("openpgp-encrypted.mbox")); - - NodeHelper nodeHelper; - EmptySource emptySource; - emptySource.setAllowDecryption(false); - ObjectTreeParser otp(&emptySource, &nodeHelper); - otp.parseObjectTree(originalMessage.data()); - - QCOMPARE(nodeHelper.overallEncryptionState(originalMessage.data()), KMMsgFullyEncrypted); - QCOMPARE(otp.plainTextContent().toLatin1().data(), ""); - - KMime::Message::Ptr unencryptedMessage = nodeHelper.unencryptedMessage(originalMessage); - QCOMPARE((bool) unencryptedMessage, false); -} - -void UnencryptedMessageTest::testAsync_data() -{ - QTest::addColumn("mailFileName"); - QTest::addColumn("output"); - - QTest::newRow("openpgp-encrypt") << QStringLiteral("openpgp-encrypted.mbox") << QStringLiteral("encrypted message text"); - QTest::newRow("smime-opaque-sign") << QStringLiteral("smime-opaque-sign.mbox") << QStringLiteral("A simple signed only test."); - QTest::newRow("smime-encrypt") << QStringLiteral("smime-encrypted.mbox") << QStringLiteral("The quick brown fox jumped over the lazy dog."); - QTest::newRow("openpgp-inline-encrypt") << QStringLiteral("openpgp-inline-charset-encrypted.mbox") << QStringLiteral("asdasd asd asd asdf sadf sdaf sadf \u00F6\u00E4\u00FC"); -} - -void UnencryptedMessageTest::testAsync() -{ - QFETCH(QString, mailFileName); - QFETCH(QString, output); - - KMime::Message::Ptr originalMessage = readAndParseMail(mailFileName); - NodeHelper nodeHelper; - EmptySource emptySource; - emptySource.setAllowDecryption(true); - { - QEventLoop loop; - ObjectTreeParser otp(&emptySource, &nodeHelper); - - connect(&nodeHelper, &NodeHelper::update, &loop, &QEventLoop::quit); - otp.setAllowAsync(true); - otp.parseObjectTree(originalMessage.data()); - loop.exec(); - } - // Job ended - { - ObjectTreeParser otp(&emptySource, &nodeHelper); - otp.setAllowAsync(true); - otp.parseObjectTree(originalMessage.data()); - QCOMPARE(otp.plainTextContent(), output); - } -} - -void UnencryptedMessageTest::testNotDecrypted_data() -{ - QTest::addColumn("mailFileName"); - QTest::addColumn("decryptMessage"); - - QTest::newRow("openpgp-inline") << QStringLiteral("inlinepgpencrypted.mbox") << true; - QTest::newRow("openpgp-encrypt") << QStringLiteral("openpgp-encrypted.mbox") << true; - QTest::newRow("smime-encrypt") << QStringLiteral("smime-encrypted.mbox") << true; - QTest::newRow("openpgp-inline-encrypt") << QStringLiteral("openpgp-inline-charset-encrypted.mbox") << true; - QTest::newRow("smime-opaque-sign") << QStringLiteral("smime-opaque-sign.mbox") << false; - QTest::newRow("openpgp-inline-signed") << QStringLiteral("openpgp-inline-signed.mbox") << false; - QTest::newRow("openpgp-mime-signed") << QStringLiteral("openpgp-signed-mailinglist.mbox") << false; -} - -void UnencryptedMessageTest::testNotDecrypted() -{ - QFETCH(QString, mailFileName); - QFETCH(bool, decryptMessage); - KMime::Message::Ptr originalMessage = readAndParseMail(mailFileName); - - NodeHelper nodeHelper; - TestHtmlWriter testWriter; - TestCSSHelper testCSSHelper; - MessageViewer::Test::TestObjectTreeSource emptySource(&testWriter, &testCSSHelper); - emptySource.setAllowDecryption(false); - ObjectTreeParser otp(&emptySource, &nodeHelper); - otp.parseObjectTree(originalMessage.data()); - - if (decryptMessage) { - QCOMPARE(otp.plainTextContent().toLatin1().data(), ""); - } else { - QVERIFY(otp.plainTextContent().toLatin1().data()); - } - QCOMPARE(testWriter.html.contains(QStringLiteral("")), decryptMessage); - - KMime::Message::Ptr unencryptedMessage = nodeHelper.unencryptedMessage(originalMessage); - QCOMPARE((bool) unencryptedMessage, false); -} - -void UnencryptedMessageTest::testSMimeAutoCertImport() -{ - KMime::Message::Ptr originalMessage = readAndParseMail(QStringLiteral("smime-cert.mbox")); - - NodeHelper nodeHelper; - TestHtmlWriter testWriter; - TestCSSHelper testCSSHelper; - MessageViewer::Test::TestObjectTreeSource emptySource(&testWriter, &testCSSHelper); - ObjectTreeParser otp(&emptySource, &nodeHelper); - otp.parseObjectTree(originalMessage.data()); - - QCOMPARE(otp.plainTextContent().toLatin1().data(), ""); - QVERIFY(testWriter.html.contains(QStringLiteral("Sorry, certificate could not be imported."))); -} - -#include "unencryptedmessagetest.moc" diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/config-mysql-fs.xml kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/config-mysql-fs.xml --- kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/config-mysql-fs.xml 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/config-mysql-fs.xml 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,10 @@ + + xdgconfig-mysql.fs + xdglocal + akonadi_knut_resource + akonadi_knut_resource + akonadi_knut_resource + true + mysql + akonadi_test_searchplugin + diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/config-postgresql-fs.xml kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/config-postgresql-fs.xml --- kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/config-postgresql-fs.xml 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/config-postgresql-fs.xml 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,10 @@ + + xdgconfig-postgresql.fs + xdglocal + akonadi_knut_resource + akonadi_knut_resource + akonadi_knut_resource + true + postgresql + akonadi_test_searchplugin + diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/config-sqlite-db.xml kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/config-sqlite-db.xml --- kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/config-sqlite-db.xml 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/config-sqlite-db.xml 2017-03-06 12:30:37.000000000 +0000 @@ -1,7 +1,10 @@ - kdehome xdgconfig-sqlite.db xdglocal + akonadi_knut_resource + akonadi_knut_resource + akonadi_knut_resource true sqlite + akonadi_test_searchplugin diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/config.xml kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/config.xml --- kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/config.xml 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/config.xml 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,8 @@ + + xdgconfig + xdglocal + akonadi_knut_resource + akonadi_knut_resource + akonadi_knut_resource + true + diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/kdehome/share/config/akonadi-firstrunrc kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/kdehome/share/config/akonadi-firstrunrc --- kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/kdehome/share/config/akonadi-firstrunrc 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/kdehome/share/config/akonadi-firstrunrc 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -[ProcessedDefaults] -defaultaddressbook=done -defaultcalendar=done -defaultnotebook=done diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/kdehome/share/config/kdebugrc kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/kdehome/share/config/kdebugrc --- kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/kdehome/share/config/kdebugrc 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/kdehome/share/config/kdebugrc 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ -DisableAll=false - -[0] -AbortFatal=true -ErrorFilename[$e]=kdebug.dbg -ErrorOutput=2 -FatalFilename[$e]=kdebug.dbg -FatalOutput=2 -InfoFilename[$e]=kdebug.dbg -InfoOutput=2 -WarnFilename[$e]=kdebug.dbg -WarnOutput=2 - -[264] -AbortFatal=true -ErrorFilename[$e]=kdebug.dbg -ErrorOutput=4 -FatalFilename[$e]=kdebug.dbg -FatalOutput=4 -InfoFilename[$e]=kdebug.dbg -WarnFilename[$e]=kdebug.dbg -WarnOutput=4 - -[5250] -InfoOutput=2 - -[7009] -AbortFatal=true -ErrorFilename[$e]=kdebug.dbg -ErrorOutput=4 -FatalFilename[$e]=kdebug.dbg -FatalOutput=4 -InfoFilename[$e]=kdebug.dbg -InfoOutput=4 -WarnFilename[$e]=kdebug.dbg -WarnOutput=4 - -[7011] -AbortFatal=true -ErrorFilename[$e]=kdebug.dbg -ErrorOutput=4 -FatalFilename[$e]=kdebug.dbg -FatalOutput=4 -InfoFilename[$e]=kdebug.dbg -InfoOutput=4 -WarnFilename[$e]=kdebug.dbg -WarnOutput=4 - -[7012] -AbortFatal=true -ErrorFilename[$e]=kdebug.dbg -ErrorOutput=4 -FatalFilename[$e]=kdebug.dbg -FatalOutput=4 -InfoFilename[$e]=kdebug.dbg -InfoOutput=4 -WarnFilename[$e]=kdebug.dbg -WarnOutput=4 - -[7014] -AbortFatal=true -ErrorFilename[$e]=kdebug.dbg -ErrorOutput=0 -FatalFilename[$e]=kdebug.dbg -FatalOutput=0 -InfoFilename[$e]=kdebug.dbg -InfoOutput=0 -WarnFilename[$e]=kdebug.dbg -WarnOutput=0 - -[7021] -AbortFatal=true -ErrorFilename[$e]=kdebug.dbg -ErrorOutput=4 -FatalFilename[$e]=kdebug.dbg -FatalOutput=4 -InfoFilename[$e]=kdebug.dbg -InfoOutput=4 -WarnFilename[$e]=kdebug.dbg -WarnOutput=4 diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/kdehome/share/config/kdedrc kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/kdehome/share/config/kdedrc --- kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/kdehome/share/config/kdedrc 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/kdehome/share/config/kdedrc 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -[General] -CheckSycoca=false -CheckFileStamps=false diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdgconfig/akonadi-firstrunrc kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdgconfig/akonadi-firstrunrc --- kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdgconfig/akonadi-firstrunrc 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdgconfig/akonadi-firstrunrc 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4 @@ +[ProcessedDefaults] +defaultaddressbook=done +defaultcalendar=done +defaultnotebook=done diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_0rc kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_0rc --- kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_0rc 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_0rc 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4 @@ +[General] +DataFile[$e]=$XDG_DATA_HOME/testdata-res1.xml +FileWatchingEnabled=false + diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_1rc kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_1rc --- kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_1rc 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_1rc 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,3 @@ +[General] +DataFile[$e]=$XDG_DATA_HOME/testdata-res2.xml +FileWatchingEnabled=false diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_2rc kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_2rc --- kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_2rc 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdgconfig/akonadi_knut_resource_2rc 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,3 @@ +[General] +DataFile[$e]=$XDG_DATA_HOME/testdata-res3.xml +FileWatchingEnabled=false diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdgconfig-mysql.fs/akonadi/akonadiserverrc kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdgconfig-mysql.fs/akonadi/akonadiserverrc --- kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdgconfig-mysql.fs/akonadi/akonadiserverrc 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdgconfig-mysql.fs/akonadi/akonadiserverrc 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,6 @@ +[%General] +SizeThreshold=0 +ExternalPayload=true + +[Search] +Manager=Dummy diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdgconfig-postgresql.fs/akonadi/akonadiserverrc kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdgconfig-postgresql.fs/akonadi/akonadiserverrc --- kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdgconfig-postgresql.fs/akonadi/akonadiserverrc 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdgconfig-postgresql.fs/akonadi/akonadiserverrc 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,10 @@ +[%General] +Driver=QPSQL +SizeThreshold=0 +ExternalPayload=true + +[Search] +Manager=Dummy + +[QPSQL] +StartServer=true diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdglocal/testdata-res1.xml kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdglocal/testdata-res1.xml --- kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdglocal/testdata-res1.xml 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdglocal/testdata-res1.xml 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,78 @@ + + + + + + + + + + + testmailbody + From: <test@user.tst> + \SEEN + \FLAGGED + \DRAFT + + + testmailbody1 + From: <test1@user.tst> + \FLAGGED + tagrid + + + testmailbody2 + From: <test2@user.tst> + + + testmailbody3 + From: <test3@user.tst> + + + testmailbody4 + From: <test4@user.tst> + + + testmailbody5 + From: <test5@user.tst> + + + testmailbody6 + From: <test6@user.tst> + + + testmailbody7 + From: <test7@user.tst> + + + testmailbody8 + From: <test8@user.tst> + + + testmailbody9 + From: <test9@user.tst> + + + testmailbody10 + From: <test10@user.tst> + + + testmailbody11 + From: <test11@user.tst> + + + testmailbody12 + From: <test12@user.tst> + + + testmailbody13 + From: <test13@user.tst> + + + testmailbody14 + From: <test14@user.tst> + + + + + diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdglocal/testdata-res2.xml kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdglocal/testdata-res2.xml --- kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdglocal/testdata-res2.xml 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdglocal/testdata-res2.xml 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,6 @@ + + + + + + diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdglocal/testdata-res3.xml kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdglocal/testdata-res3.xml --- kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdglocal/testdata-res3.xml 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdglocal/testdata-res3.xml 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4 @@ + + + + diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdglocal/testdata.xml kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdglocal/testdata.xml --- kf5-messagelib-16.04.3/messageviewer/autotests/unittestenv/xdglocal/testdata.xml 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/unittestenv/xdglocal/testdata.xml 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,82 @@ + + + + + + + + + + + testmailbody + From: <test@user.tst> + \SEEN + \FLAGGED + \DRAFT + + + testmailbody1 + From: <test1@user.tst> + \FLAGGED + + + testmailbody2 + From: <test2@user.tst> + + + testmailbody3 + From: <test3@user.tst> + + + testmailbody4 + From: <test4@user.tst> + + + testmailbody5 + From: <test5@user.tst> + + + testmailbody6 + From: <test6@user.tst> + + + testmailbody7 + From: <test7@user.tst> + + + testmailbody8 + From: <test8@user.tst> + + + testmailbody9 + From: <test9@user.tst> + + + testmailbody10 + From: <test10@user.tst> + + + testmailbody11 + From: <test11@user.tst> + + + testmailbody12 + From: <test12@user.tst> + + + testmailbody13 + From: <test13@user.tst> + + + testmailbody14 + From: <test14@user.tst> + + + + + + + + + + diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/util.cpp kf5-messagelib-16.12.3/messageviewer/autotests/util.cpp --- kf5-messagelib-16.04.3/messageviewer/autotests/util.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/util.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -/* - Copyright (c) 2010 Thomas McGuire - - This library 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. - - This library 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 this library; see the file COPYING.LIB. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. -*/ -#include "util.h" - -#include - -KMime::Message::Ptr readAndParseMail(const QString &mailFile) -{ - QFile file(QLatin1String(MAIL_DATA_DIR) + QLatin1Char('/') + mailFile); - Q_ASSERT(file.open(QIODevice::ReadOnly)); - const QByteArray data = KMime::CRLFtoLF(file.readAll()); - Q_ASSERT(!data.isEmpty()); - KMime::Message::Ptr msg(new KMime::Message); - msg->setContent(data); - msg->parse(); - return msg; -} diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/util.h kf5-messagelib-16.12.3/messageviewer/autotests/util.h --- kf5-messagelib-16.04.3/messageviewer/autotests/util.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/util.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -/* - Copyright (c) 2010 Thomas McGuire - - This library 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. - - This library 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 this library; see the file COPYING.LIB. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. -*/ -#include "interfaces/htmlwriter.h" -#include "viewer/csshelper.h" - -#include - -class TestHtmlWriter : public MessageViewer::HtmlWriter -{ -public: - explicit TestHtmlWriter() {} - virtual ~TestHtmlWriter() {} - - virtual void begin(const QString &) {} - virtual void write(const QString &) {} - virtual void end() {} - virtual void reset() {} - virtual void queue(const QString &str) - { - html.append(str); - } - virtual void flush() {} - virtual void embedPart(const QByteArray &, const QString &) {} - virtual void extraHead(const QString &) {} - - QString html; -}; - -class TestCSSHelper : public MessageViewer::CSSHelper -{ -public: - TestCSSHelper() : MessageViewer::CSSHelper(0) - { - for (int i = 0; i < 3; ++i) { - mQuoteColor[i] = QColor(0x00, 0x80 - i * 0x10, 0x00); - } - } - virtual ~TestCSSHelper() {} - - QString nonQuotedFontTag() const - { - return QStringLiteral("<"); - } - - QString quoteFontTag(int) const - { - return QStringLiteral("<"); - } -}; - -KMime::Message::Ptr readAndParseMail(const QString &mailFile); diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/viewertest.cpp kf5-messagelib-16.12.3/messageviewer/autotests/viewertest.cpp --- kf5-messagelib-16.04.3/messageviewer/autotests/viewertest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/viewertest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -27,65 +27,95 @@ void ViewerTest::shouldHaveDefaultValuesOnCreation() { - MessageViewer::Viewer viewer(0, 0, new KActionCollection(this)); - viewer.show(); - QTest::qWaitForWindowExposed(&viewer); + MessageViewer::Viewer *viewer = new MessageViewer::Viewer(0, 0, new KActionCollection(this)); + viewer->show(); + QTest::qWaitForWindowExposed(viewer); - QVERIFY(!viewer.message()); - QWidget *createtodowidget = viewer.findChild(QStringLiteral("todoedit")); - QVERIFY(createtodowidget); - QCOMPARE(createtodowidget->isVisible(), false); + QWidget *mViewer = viewer->findChild(QStringLiteral("mViewer")); + QVERIFY(mViewer); + QCOMPARE(mViewer->isVisible(), true); - QWidget *sliderContainer = viewer.findChild(QStringLiteral("slidercontainer")); + QWidget *sliderContainer = viewer->findChild(QStringLiteral("slidercontainer")); QVERIFY(sliderContainer); - QVERIFY(sliderContainer->isVisible()); - - QWidget *translaterwidget = viewer.findChild(QStringLiteral("translatorwidget")); - QVERIFY(translaterwidget); - QVERIFY(!translaterwidget->isVisible()); + QCOMPARE(sliderContainer->isVisible(), false); - QWidget *colorBar = viewer.findChild(QStringLiteral("mColorBar")); + QWidget *colorBar = viewer->findChild(QStringLiteral("mColorBar")); QVERIFY(colorBar); - QWidget *scandetectionWidget = viewer.findChild(QStringLiteral("scandetectionwarning")); + QWidget *scandetectionWidget = viewer->findChild(QStringLiteral("scandetectionwarning")); QVERIFY(scandetectionWidget); - QVERIFY(!scandetectionWidget->isVisible()); + QCOMPARE(scandetectionWidget->isVisible(), false); - QWidget *openattachementfolderwidget = viewer.findChild(QStringLiteral("openattachementfolderwidget")); + QWidget *openattachementfolderwidget = viewer->findChild(QStringLiteral("openattachementfolderwidget")); QVERIFY(openattachementfolderwidget); - QVERIFY(!openattachementfolderwidget->isVisible()); + QCOMPARE(openattachementfolderwidget->isVisible(), false); - QWidget *createeventwidget = viewer.findChild(QStringLiteral("eventedit")); - QVERIFY(createeventwidget); - QCOMPARE(createeventwidget->isVisible(), false); + QVERIFY(viewer->toggleFixFontAction()); + QVERIFY(viewer->toggleMimePartTreeAction()); + QVERIFY(viewer->selectAllAction()); + QVERIFY(viewer->copyURLAction()); + QVERIFY(viewer->copyAction()); + QVERIFY(viewer->urlOpenAction()); + QVERIFY(viewer->speakTextAction()); + QVERIFY(viewer->copyImageLocation()); + QVERIFY(viewer->viewSourceAction()); + QVERIFY(viewer->findInMessageAction()); + QVERIFY(viewer->saveAsAction()); + QVERIFY(viewer->saveMessageDisplayFormatAction()); + QVERIFY(viewer->resetMessageDisplayFormatAction()); + QVERIFY(viewer->urlClicked().isEmpty()); + QVERIFY(viewer->imageUrlClicked().isEmpty()); + QCOMPARE(viewer->isFixedFont(), false); + QVERIFY(viewer->shareServiceUrlMenu()); + delete viewer; +} - QWidget *createnotewidget = viewer.findChild(QStringLiteral("noteedit")); - QVERIFY(createnotewidget); - QCOMPARE(createnotewidget->isVisible(), false); +static const char s_mail1[] = + "From: Konqui \n" + "To: Friends \n" + "Date: Sun, 21 Mar 1993 23:56:48 -0800 (PST)\n" + "Subject: Sample message\n" + "MIME-Version: 1.0\n" + "Content-type: text/plain; charset=us-ascii\n" + "\n" + "\n" + "This is a test message.\n" + "\n"; + +static const char s_mail2[] = + "From: David Faure \n" + "To: Friends \n" + "Date: Sun, 31 Aug 2016 23:56:48 +0200 (CEST)\n" + "Subject: Second mail\n" + "MIME-Version: 1.0\n" + "Content-type: text/plain; charset=\"us-ascii\"\n" + "\n" + "\n" + "This is the second message.\n" + "\n"; - QWidget *mViewer = viewer.findChild(QStringLiteral("mViewer")); - QVERIFY(mViewer); - QCOMPARE(mViewer->isVisible(), true); +KMime::Message::Ptr createMsg(const char *data) +{ + KMime::Message::Ptr msgPtr(new KMime::Message()); + msgPtr->setContent(QByteArray(data)); + msgPtr->parse(); + return msgPtr; +} + +void ViewerTest::shouldDisplayMessage() +{ + MessageViewer::Viewer viewer(0, 0, new KActionCollection(this)); + viewer.setMessage(createMsg(s_mail1), MimeTreeParser::Force); + // not sure what to check, but at least we check it neither crashes nor hangs + // TODO: retrieve message text and check it +} + +void ViewerTest::shouldSwitchToAnotherMessage() +{ + MessageViewer::Viewer viewer(0, 0, new KActionCollection(this)); + viewer.setMessage(createMsg(s_mail1), MimeTreeParser::Force); - QVERIFY(viewer.toggleFixFontAction()); - QVERIFY(viewer.toggleMimePartTreeAction()); - QVERIFY(viewer.selectAllAction()); - QVERIFY(viewer.copyURLAction()); - QVERIFY(viewer.copyAction()); - QVERIFY(viewer.urlOpenAction()); - QVERIFY(viewer.speakTextAction()); - QVERIFY(viewer.copyImageLocation()); - QVERIFY(viewer.viewSourceAction()); - QVERIFY(viewer.findInMessageAction()); - QVERIFY(viewer.saveAsAction()); - QVERIFY(viewer.saveMessageDisplayFormatAction()); - QVERIFY(viewer.resetMessageDisplayFormatAction()); - QVERIFY(viewer.blockImage()); - QVERIFY(viewer.openBlockableItems()); - QVERIFY(viewer.urlClicked().isEmpty()); - QVERIFY(viewer.imageUrlClicked().isEmpty()); - QCOMPARE(viewer.isFixedFont(), false); - QVERIFY(viewer.shareServiceUrlMenu()); + viewer.setMessage(createMsg(s_mail2), MimeTreeParser::Force); } QTEST_MAIN(ViewerTest) diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/viewertest.h kf5-messagelib-16.12.3/messageviewer/autotests/viewertest.h --- kf5-messagelib-16.04.3/messageviewer/autotests/viewertest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/viewertest.h 2017-03-06 12:30:37.000000000 +0000 @@ -26,6 +26,8 @@ ViewerTest(); private Q_SLOTS: void shouldHaveDefaultValuesOnCreation(); + void shouldDisplayMessage(); + void shouldSwitchToAnotherMessage(); }; #endif // VIEWERTEST_H diff -Nru kf5-messagelib-16.04.3/messageviewer/autotests/zoomactionmenutest.cpp kf5-messagelib-16.12.3/messageviewer/autotests/zoomactionmenutest.cpp --- kf5-messagelib-16.04.3/messageviewer/autotests/zoomactionmenutest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/autotests/zoomactionmenutest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -37,7 +37,6 @@ menu.setActionCollection(new KActionCollection(this)); menu.createZoomActions(); - QVERIFY(menu.zoomTextOnlyAction()); QVERIFY(menu.zoomInAction()); QVERIFY(menu.zoomOutAction()); QVERIFY(menu.zoomResetAction()); diff -Nru kf5-messagelib-16.04.3/messageviewer/CMakeLists.txt kf5-messagelib-16.12.3/messageviewer/CMakeLists.txt --- kf5-messagelib-16.04.3/messageviewer/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -12,11 +12,15 @@ add_definitions("-DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII") #verify remove_definitions("-DQT_NO_URL_CAST_FROM_STRING") -remove_definitions( -DQT_NO_CAST_FROM_BYTEARRAY ) ########### CMake Config Files ########### set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF5MessageViewer") +if (Qt5WebEngineWidgets_VERSION VERSION_GREATER "5.7.99") + set(WEBENGINEVIEWER_PRINT_SUPPORT true) +endif() + + ecm_configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/KF5MessageViewerConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/KF5MessageViewerConfig.cmake" @@ -37,36 +41,7 @@ DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5} COMPONENT Devel ) - -# Disabled libotp for 16.04, because it is not ready for release yet. - -# ecm_setup_version(${MESSAGELIB_LIB_VERSION} VARIABLE_PREFIX MESSAGEVIEWER -# VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/otp_version.h" -# PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF5OtpConfigVersion.cmake" -# SOVERSION 5 -# ) -# -# set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF5Otp") -# -# ecm_configure_package_config_file( -# "${CMAKE_CURRENT_SOURCE_DIR}/KF5OtpConfig.cmake.in" -# "${CMAKE_CURRENT_BINARY_DIR}/KF5OtpConfig.cmake" -# INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} -# ) -# -# install(FILES -# "${CMAKE_CURRENT_BINARY_DIR}/KF5OtpConfig.cmake" -# "${CMAKE_CURRENT_BINARY_DIR}/KF5OtpConfigVersion.cmake" -# DESTINATION "${CMAKECONFIG_INSTALL_DIR}" -# COMPONENT Devel -# ) -# -# install(EXPORT KF5OtpTargets DESTINATION "${CMAKECONFIG_INSTALL_DIR}" FILE KF5OtpTargets.cmake NAMESPACE KF5::) -# -# install(FILES -# ${CMAKE_CURRENT_BINARY_DIR}/otp_version.h -# DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5} COMPONENT Devel -# ) +include_directories(${Messagelib_BINARY_DIR}) add_subdirectory(src) if (BUILD_TESTING) diff -Nru kf5-messagelib-16.04.3/messageviewer/KF5MessageViewerConfig.cmake.in kf5-messagelib-16.12.3/messageviewer/KF5MessageViewerConfig.cmake.in --- kf5-messagelib-16.04.3/messageviewer/KF5MessageViewerConfig.cmake.in 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/KF5MessageViewerConfig.cmake.in 2017-03-06 12:30:37.000000000 +0000 @@ -2,9 +2,9 @@ find_dependency(KF5PimCommon "@PIMCOMMON_LIB_VERSION@") find_dependency(KF5MessageCore "@MESSAGELIB_LIB_VERSION@") -find_dependency(KF5Akonadi "@KDEPIMLIBS_LIB_VERSION@") +find_dependency(KF5MimeTreeParser "@MESSAGELIB_LIB_VERSION@") +find_dependency(KF5Akonadi "@AKONADIMIME_LIB_VERSION@") find_dependency(KF5Mime "@KMIME_LIB_VERSION@") find_dependency(KF5Contacts "@KCONTACTS_LIB_VERSION@") -find_dependency(KF5WebKit "@KF5_VERSION@") include("${CMAKE_CURRENT_LIST_DIR}/KF5MessageViewerTargets.cmake") diff -Nru kf5-messagelib-16.04.3/messageviewer/KF5OtpConfig.cmake.in kf5-messagelib-16.12.3/messageviewer/KF5OtpConfig.cmake.in --- kf5-messagelib-16.04.3/messageviewer/KF5OtpConfig.cmake.in 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/KF5OtpConfig.cmake.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -@PACKAGE_INIT@ - -find_dependency(KF5PimCommon "@PIMCOMMON_LIB_VERSION@") -find_dependency(KF5MessageCore "@MESSAGELIB_LIB_VERSION@") -find_dependency(KF5Mime "@KMIME_LIB_VERSION@") - -include("${CMAKE_CURRENT_LIST_DIR}/KF5OtpTargets.cmake") diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockblockableitemsdialog.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockblockableitemsdialog.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockblockableitemsdialog.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockblockableitemsdialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "adblockblockableitemsdialog.h" -#include "adblockblockableitemswidget.h" - -#include -#include - -#include -#include -#include -#include -#include -#include - -using namespace MessageViewer; -AdBlockBlockableItemsDialog::AdBlockBlockableItemsDialog(QWidget *parent) - : QDialog(parent) -{ - setWindowTitle(i18n("Blockable Items")); - QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - QVBoxLayout *mainLayout = new QVBoxLayout; - setLayout(mainLayout); - QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); - okButton->setDefault(true); - okButton->setShortcut(Qt::CTRL | Qt::Key_Return); - connect(buttonBox, &QDialogButtonBox::accepted, this, &AdBlockBlockableItemsDialog::accept); - connect(buttonBox, &QDialogButtonBox::rejected, this, &AdBlockBlockableItemsDialog::reject); - - mBlockableItems = new AdBlockBlockableItemsWidget; - - mainLayout->addWidget(mBlockableItems); - mainLayout->addWidget(buttonBox); - readConfig(); -} - -AdBlockBlockableItemsDialog::~AdBlockBlockableItemsDialog() -{ - writeConfig(); -} - -void AdBlockBlockableItemsDialog::setWebFrame(QWebFrame *frame) -{ - mBlockableItems->setWebFrame(frame); -} - -void AdBlockBlockableItemsDialog::saveFilters() -{ - mBlockableItems->saveFilters(); -} - -void AdBlockBlockableItemsDialog::writeConfig() -{ - KConfigGroup group(KSharedConfig::openConfig(), "AdBlockBlockableItemsDialog"); - group.writeEntry("Size", size()); -} - -void AdBlockBlockableItemsDialog::readConfig() -{ - KConfigGroup group(KSharedConfig::openConfig(), "AdBlockBlockableItemsDialog"); - const QSize sizeDialog = group.readEntry("Size", QSize(500, 300)); - if (sizeDialog.isValid()) { - resize(sizeDialog); - } -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockblockableitemsdialog.h kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockblockableitemsdialog.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockblockableitemsdialog.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockblockableitemsdialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef ADBLOCKBLOCKABLEITEMSDIALOG_H -#define ADBLOCKBLOCKABLEITEMSDIALOG_H - -#include -#include "messageviewer_export.h" -class QWebFrame; -namespace MessageViewer -{ -class AdBlockBlockableItemsWidget; -class MESSAGEVIEWER_EXPORT AdBlockBlockableItemsDialog : public QDialog -{ - Q_OBJECT -public: - explicit AdBlockBlockableItemsDialog(QWidget *parent = Q_NULLPTR); - ~AdBlockBlockableItemsDialog(); - - void setWebFrame(QWebFrame *frame); - void saveFilters(); - -private: - void writeConfig(); - void readConfig(); - AdBlockBlockableItemsWidget *mBlockableItems; -}; -} - -#endif // ADBLOCKBLOCKABLEITEMSDIALOG_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockblockableitemswidget.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockblockableitemswidget.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockblockableitemswidget.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockblockableitemswidget.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,328 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "adblockblockableitemswidget.h" -#include "common/adblockcreatefilterdialog.h" -#include "settings/messageviewersettings.h" -#include "adblock/adblockmanager.h" -#include "PimCommon/CustomTreeView" -#include "messageviewer_debug.h" -#include -#include -#include -#include -#include "adblock/common/adblockutil.h" -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include - -using namespace MessageViewer; - -AdBlockBlockableItemsWidget::AdBlockBlockableItemsWidget(QWidget *parent) - : QWidget(parent) -{ - QVBoxLayout *lay = new QVBoxLayout; - lay->setMargin(0); - setLayout(lay); - mListItems = new PimCommon::CustomTreeView; - mListItems->setDefaultText(i18n("No blockable element found.")); - - mListItems->setContextMenuPolicy(Qt::CustomContextMenu); - mListItems->setAlternatingRowColors(true); - mListItems->setRootIsDecorated(false); - connect(mListItems, &PimCommon::CustomTreeView::customContextMenuRequested, this, &AdBlockBlockableItemsWidget::customContextMenuRequested); - - QStringList lst; - lst << i18n("Filter") << i18n("Address") << i18n("Type"); - mListItems->setHeaderLabels(lst); - - KTreeWidgetSearchLine *searchLine = new KTreeWidgetSearchLine(this, mListItems); - searchLine->setPlaceholderText(i18n("Search...")); - - lay->addWidget(searchLine); - lay->addWidget(mListItems); - - KConfigGroup config(MessageViewer::MessageViewerSettings::self()->config(), "AdBlockHeaders"); - mListItems->header()->restoreState(config.readEntry("HeaderState", QByteArray())); -} - -AdBlockBlockableItemsWidget::~AdBlockBlockableItemsWidget() -{ - KConfigGroup groupHeader(MessageViewer::MessageViewerSettings::self()->config(), "AdBlockHeaders"); - groupHeader.writeEntry("HeaderState", mListItems->header()->saveState()); - groupHeader.sync(); -} - -void AdBlockBlockableItemsWidget::setWebFrame(QWebFrame *frame) -{ - mListItems->clear(); - searchBlockableElement(frame); -} - -QString AdBlockBlockableItemsWidget::elementTypeToI18n(AdBlockBlockableItemsWidget::TypeElement type) -{ - QString result; - switch (type) { - case AdBlockBlockableItemsWidget::Image: - result = i18n("Image"); - break; - case AdBlockBlockableItemsWidget::Script: - result = i18n("Script"); - break; - case AdBlockBlockableItemsWidget::StyleSheet: - result = i18n("Stylesheet"); - break; - case AdBlockBlockableItemsWidget::Font: - result = i18n("Font"); - break; - case AdBlockBlockableItemsWidget::Frame: - result = i18n("Frame"); - break; - case AdBlockBlockableItemsWidget::XmlRequest: - result = i18n("XML Request"); - break; - case AdBlockBlockableItemsWidget::Object: - result = i18n("Object"); - break; - case AdBlockBlockableItemsWidget::Media: - result = i18n("Audio/Video"); - break; - case AdBlockBlockableItemsWidget::Popup: - result = i18n("Popup window"); - break; - case AdBlockBlockableItemsWidget::None: - default: - result = i18n("Unknown"); - } - return result; -} - -QString AdBlockBlockableItemsWidget::elementType(AdBlockBlockableItemsWidget::TypeElement type) -{ - QString result; - switch (type) { - case AdBlockBlockableItemsWidget::Image: - result = QStringLiteral("image"); - break; - case AdBlockBlockableItemsWidget::Script: - result = QStringLiteral("script"); - break; - case AdBlockBlockableItemsWidget::StyleSheet: - result = QStringLiteral("stylesheet"); - break; - case AdBlockBlockableItemsWidget::Font: - result = QStringLiteral("font"); - break; - case AdBlockBlockableItemsWidget::Frame: - result = QStringLiteral("frame"); - break; - case AdBlockBlockableItemsWidget::XmlRequest: - result = QStringLiteral("xmlhttprequest"); - break; - case AdBlockBlockableItemsWidget::Object: - result = QStringLiteral("other"); - break; - case AdBlockBlockableItemsWidget::Media: - result = QStringLiteral("media"); - break; - case AdBlockBlockableItemsWidget::Popup: - result = QStringLiteral("popup"); - break; - case AdBlockBlockableItemsWidget::None: - default: - qCDebug(MESSAGEVIEWER_LOG) << " unknown type " << type; - } - return result; -} - -void AdBlockBlockableItemsWidget::adaptSrc(QString &src, const QString &hostName) -{ - if (src.startsWith(QStringLiteral("http://")) || src.startsWith(QStringLiteral("https://"))) { - //Nothing - } else if (src.startsWith(QStringLiteral("//"))) { - src = QLatin1String("https:") + src; - } else if (src.startsWith(QLatin1Char('/'))) { - src = QLatin1String("https://") + hostName + src; - } else { - src = QString(); - } -} - -void AdBlockBlockableItemsWidget::searchBlockableElement(QWebFrame *frame) -{ - const QUrl url = frame->requestedUrl(); - const QString host = url.host(); - const QWebElementCollection images = frame->findAllElements(QStringLiteral("img")); - Q_FOREACH (const QWebElement &img, images) { - if (img.hasAttribute(QStringLiteral("src"))) { - QString src = img.attribute(QStringLiteral("src")); - if (src.isEmpty()) { - continue; - } - adaptSrc(src, host); - if (src.isEmpty()) { - continue; - } - QTreeWidgetItem *item = new QTreeWidgetItem(mListItems); - item->setText(Url, src); - item->setText(Type, elementTypeToI18n(AdBlockBlockableItemsWidget::Image)); - item->setTextColor(FilterValue, Qt::red); - item->setData(Type, Element, Image); - } - } - const QWebElementCollection scripts = frame->findAllElements(QStringLiteral("script")); - Q_FOREACH (const QWebElement &script, scripts) { - QString src = script.attribute(QStringLiteral("src")); - if (src.isEmpty()) { - continue; - } - adaptSrc(src, host); - if (src.isEmpty()) { - continue; - } - QTreeWidgetItem *item = new QTreeWidgetItem(mListItems); - item->setText(Url, src); - item->setText(Type, elementTypeToI18n(AdBlockBlockableItemsWidget::Script)); - item->setTextColor(FilterValue, Qt::red); - item->setData(Type, Element, Script); - } - foreach (QWebFrame *childFrame, frame->childFrames()) { - searchBlockableElement(childFrame); - } - mListItems->setShowDefaultText(mListItems->model()->rowCount() == 0); -} - -void AdBlockBlockableItemsWidget::customContextMenuRequested(const QPoint &) -{ - QTreeWidgetItem *item = mListItems->currentItem(); - if (!item) { - return; - } - - QMenu menu; - menu.addAction(i18n("Copy url"), this, SLOT(slotCopyItem())); - if (!item->text(FilterValue).isEmpty()) { - menu.addAction(i18n("Copy filter"), this, SLOT(slotCopyFilterItem())); - } - menu.addAction(i18n("Block item..."), this, SLOT(slotBlockItem())); - menu.addSeparator(); - menu.addAction(i18n("Open"), this, SLOT(slotOpenItem())); - if (!item->text(FilterValue).isEmpty()) { - menu.addSeparator(); - menu.addAction(i18n("Remove filter"), this, SLOT(slotRemoveFilter())); - } - menu.exec(QCursor::pos()); -} - -void AdBlockBlockableItemsWidget::slotCopyFilterItem() -{ - QTreeWidgetItem *item = mListItems->currentItem(); - if (!item) { - return; - } - QClipboard *cb = QApplication::clipboard(); - cb->setText(item->text(FilterValue), QClipboard::Clipboard); -} - -void AdBlockBlockableItemsWidget::slotOpenItem() -{ - QTreeWidgetItem *item = mListItems->currentItem(); - if (!item) { - return; - } - const QUrl url(item->text(Url)); - KRun *runner = new KRun(url, this); // will delete itself - runner->setRunExecutables(false); -} - -void AdBlockBlockableItemsWidget::slotBlockItem() -{ - QTreeWidgetItem *item = mListItems->currentItem(); - if (!item) { - return; - } - - QPointer dlg = new AdBlockCreateFilterDialog(this); - dlg->setPattern(static_cast(item->data(Type, Element).toInt()), item->text(Url)); - if (dlg->exec()) { - const QString filter = dlg->filter(); - item->setText(FilterValue, filter); - } - delete dlg; -} - -void AdBlockBlockableItemsWidget::slotCopyItem() -{ - QTreeWidgetItem *item = mListItems->currentItem(); - if (!item) { - return; - } - QClipboard *cb = QApplication::clipboard(); - cb->setText(item->text(Url), QClipboard::Clipboard); -} - -void AdBlockBlockableItemsWidget::saveFilters() -{ - const int numberOfElement(mListItems->topLevelItemCount()); - QString filters; - for (int i = 0; i < numberOfElement; ++i) { - QTreeWidgetItem *item = mListItems->topLevelItem(i); - if (!item->text(FilterValue).isEmpty()) { - if (filters.isEmpty()) { - filters = item->text(FilterValue); - } else { - filters += QLatin1Char('\n') + item->text(FilterValue); - } - } - } - - if (filters.isEmpty()) { - return; - } - - const QString localRulesFilePath = MessageViewer::AdBlockUtil::localFilterPath(); - - QFile ruleFile(localRulesFilePath); - if (!ruleFile.open(QFile::WriteOnly | QFile::Text)) { - qCDebug(MESSAGEVIEWER_LOG) << "Unable to open rule file" << localRulesFilePath; - return; - } - - QTextStream out(&ruleFile); - out << filters; - - AdBlockManager::self()->reloadConfig(); -} - -void AdBlockBlockableItemsWidget::slotRemoveFilter() -{ - QTreeWidgetItem *item = mListItems->currentItem(); - if (!item) { - return; - } - item->setText(FilterValue, QString()); -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockblockableitemswidget.h kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockblockableitemswidget.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockblockableitemswidget.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockblockableitemswidget.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef ADBLOCKBLOCKABLEITEMSWIDGET_H -#define ADBLOCKBLOCKABLEITEMSWIDGET_H - -#include -#include "messageviewer_export.h" -class QWebFrame; -namespace PimCommon -{ -class CustomTreeView; -} -namespace MessageViewer -{ - -class MESSAGEVIEWER_EXPORT AdBlockBlockableItemsWidget : public QWidget -{ - Q_OBJECT -public: - enum TypeElement { - None = 0, - Image, - Script, - StyleSheet, - Font, - Frame, - XmlRequest, - Object, - Media, - Popup, - - MaxTypeElement - }; - explicit AdBlockBlockableItemsWidget(QWidget *parent = Q_NULLPTR); - ~AdBlockBlockableItemsWidget(); - - static QString elementTypeToI18n(AdBlockBlockableItemsWidget::TypeElement type); - static QString elementType(AdBlockBlockableItemsWidget::TypeElement type); - - void setWebFrame(QWebFrame *frame); - void saveFilters(); - -private Q_SLOTS: - void slotCopyItem(); - void slotBlockItem(); - void slotOpenItem(); - void slotCopyFilterItem(); - void customContextMenuRequested(const QPoint &); - void slotRemoveFilter(); - -private: - enum BlockType { - FilterValue = 0, - Url, - Type - }; - - enum TypeItem { - Element = Qt::UserRole + 1 - }; - - void searchBlockableElement(QWebFrame *frame); - void adaptSrc(QString &src, const QString &hostName); - -private: - PimCommon::CustomTreeView *mListItems; -}; -} - -#endif // ADBLOCKBLOCKABLEITEMSWIDGET_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockelementhiding.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockelementhiding.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockelementhiding.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockelementhiding.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,126 +0,0 @@ -/* ============================================================ -* -* This file is a part of the rekonq project -* Copyright (c) 2013-2016 Montel Laurent -* based on code from rekonq -* Copyright (C) 2013 by Paul Rohrbach -* -* -* 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) version 3 or any later version -* accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy -* defined in Section 14 of version 3 of the license. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* ============================================================ */ - -// Self Includes -#include "adblockelementhiding.h" - -#include "messageviewer_debug.h" - -using namespace MessageViewer; -AdBlockElementHiding::AdBlockElementHiding() -{ -} - -bool AdBlockElementHiding::addRule(const QString &rule) -{ - if (!rule.contains(QStringLiteral("##"))) { - return false; - } - - if (rule.startsWith(QStringLiteral("##"))) { - m_GenericRules.push_back(rule.mid(2)); - return true; - } - - const QStringList lst = rule.split(QStringLiteral("##")); - const QString domainSpecificRule = lst[1]; - - QStringList domains = lst[0].split(QLatin1Char(',')); - Q_FOREACH (const QString &domain, domains) { - if (domain.startsWith(QLatin1Char('~'))) { - m_DomainSpecificRulesWhitelist.insert(domain.mid(1), - domainSpecificRule); - continue; - } - - m_DomainSpecificRules.insert(domain, domainSpecificRule); - } - - return true; -} - -void AdBlockElementHiding::apply(QWebElement &document, const QString &domain) const -{ - - //first apply generic rules - Q_FOREACH (const QString &rule, m_GenericRules) { - applyStringRule(document, rule); - } - - //check for whitelisted rules - QStringList whiteListedRules; - const QStringList subdomainList = generateSubdomainList(domain); - whiteListedRules.reserve(subdomainList.count()); - - Q_FOREACH (const QString &d, subdomainList) { - whiteListedRules.append(m_DomainSpecificRulesWhitelist.values(d)); - } - - //apply rules if not whitelisted - Q_FOREACH (const QString &d, subdomainList) { - QList ruleList = m_DomainSpecificRules.values(d); - Q_FOREACH (const QString &rule, ruleList) { - if (!whiteListedRules.contains(rule)) { - applyStringRule(document, rule); - } - } - } -} - -void AdBlockElementHiding::clear() -{ - m_GenericRules.clear(); - m_DomainSpecificRules.clear(); - m_DomainSpecificRulesWhitelist.clear(); -} - -void AdBlockElementHiding::applyStringRule(QWebElement &document, const QString &rule) const -{ - QWebElementCollection elements = document.findAll(rule); - - Q_FOREACH (QWebElement el, elements) { - if (el.isNull()) { - continue; - } - qCDebug(MESSAGEVIEWER_LOG) << "Hide element: " << el.localName(); - el.removeFromDocument(); - } -} - -QStringList AdBlockElementHiding::generateSubdomainList(const QString &domain) const -{ - QStringList returnList; - - int dotPosition = domain.lastIndexOf(QLatin1Char('.')); - dotPosition = domain.lastIndexOf(QLatin1Char('.'), dotPosition - 1); - while (dotPosition != -1) { - returnList.append(domain.mid(dotPosition + 1)); - dotPosition = domain.lastIndexOf(QLatin1Char('.'), dotPosition - 1); - } - returnList.append(domain); - - return returnList; -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockelementhiding.h kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockelementhiding.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockelementhiding.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockelementhiding.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -/* ============================================================ -* -* This file is a part of the rekonq project -* Copyright (c) 2013-2016 Montel Laurent -* based on code from rekonq -* Copyright (C) 2013 by Paul Rohrbach -* -* -* 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) version 3 or any later version -* accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy -* defined in Section 14 of version 3 of the license. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* ============================================================ */ - -#ifndef ADBLOCKELEMENTHIDING_H -#define ADBLOCKELEMENTHIDING_H - -#include -#include -#include - -namespace MessageViewer -{ -class AdBlockElementHiding -{ -public: - AdBlockElementHiding(); - - bool addRule(const QString &rule); - void apply(QWebElement &document, const QString &domain) const; - - void clear(); - -private: - void applyStringRule(QWebElement &document, const QString &rule) const; - QStringList generateSubdomainList(const QString &domain) const; - - QStringList m_GenericRules; - QMultiHash m_DomainSpecificRules; - QMultiHash m_DomainSpecificRulesWhitelist; -}; -} - -#endif // ADBLOCKELEMENTHIDING_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockmanager.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockmanager.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockmanager.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockmanager.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,435 +0,0 @@ -/* ============================================================ -* Copyright (c) 2013-2016 Montel Laurent -* based on code from rekonq -* This file is a part of the rekonq project -* -* Copyright (C) 2010-2012 by Andrea Diamantini -* -* -* 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) version 3 or any later version -* accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy -* defined in Section 14 of version 3 of the license. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* ============================================================ */ - -// Self Includes -#include "adblockmanager.h" -#include "messageviewer_debug.h" -#include "settings/messageviewersettings.h" -#include "adblock/common/adblockutil.h" -#include "adblockelementhiding.h" -#include "common/matcher/adblockhostmatcher.h" -#include "common/matcher/adblockrule.h" - -#include "viewer/webview/webpage.h" - -// KDE Includes -#include -#include -#include -#include -// Qt Includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef QList AdBlockRuleList; - -using namespace MessageViewer; - -class MessageViewer::AdBlockManagerPrivate -{ -public: - AdBlockManagerPrivate() - { - - } - AdBlockHostMatcher _hostBlackList; - AdBlockHostMatcher _hostWhiteList; - AdBlockRuleList _blackList; - AdBlockRuleList _whiteList; - - AdBlockElementHiding _elementHiding; -}; - -QWeakPointer AdBlockManager::s_adBlockManager; - -AdBlockManager *AdBlockManager::self() -{ - if (s_adBlockManager.isNull()) { - s_adBlockManager = new AdBlockManager(qApp); - } - return s_adBlockManager.data(); -} - -// ---------------------------------------------------------------------------------------------- - -AdBlockManager::AdBlockManager(QObject *parent) - : QObject(parent), - d(new AdBlockManagerPrivate) -{ - const QString savedPath = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QStringLiteral("/kmail2"); - QDir().mkpath(savedPath); - loadSettings(); -} - -AdBlockManager::~AdBlockManager() -{ - d->_whiteList.clear(); - d->_blackList.clear(); - delete d; -} - -bool AdBlockManager::isEnabled() -{ - return MessageViewer::MessageViewerSettings::self()->adBlockEnabled(); -} - -bool AdBlockManager::isHidingElements() -{ - return MessageViewer::MessageViewerSettings::self()->hideAdsEnabled(); -} - -void AdBlockManager::reloadConfig() -{ - loadSettings(); -} - -void AdBlockManager::loadSettings() -{ - KConfig config(QStringLiteral("messagevieweradblockrc")); - // ---------------- - - d->_hostWhiteList.clear(); - d->_hostBlackList.clear(); - - d->_whiteList.clear(); - d->_blackList.clear(); - - d->_elementHiding.clear(); - - if (!isEnabled()) { - return; - } - // ---------------------------------------------------------- - - QDateTime today = QDateTime::currentDateTime(); - const int days = MessageViewer::MessageViewerSettings::self()->adBlockUpdateInterval(); - - const QStringList itemList = config.groupList().filter(QRegularExpression(QStringLiteral("FilterList \\d+"))); - Q_FOREACH (const QString &item, itemList) { - KConfigGroup filtersGroup(&config, item); - const bool isFilterEnabled = filtersGroup.readEntry(QStringLiteral("FilterEnabled"), false); - if (!isFilterEnabled) { - continue; - } - const QString url = filtersGroup.readEntry(QStringLiteral("url")); - if (url.isEmpty()) { - continue; - } - const QString path = filtersGroup.readEntry(QStringLiteral("path")); - if (path.isEmpty()) { - continue; - } - - const QDateTime lastDateTime = filtersGroup.readEntry(QStringLiteral("lastUpdate"), QDateTime()); - if (!lastDateTime.isValid() || today > lastDateTime.addDays(days) || !QFile(path).exists()) { - updateSubscription(path, url, item); - } else { - loadRules(path); - } - } - - // load local rules - const QString localRulesFilePath = MessageViewer::AdBlockUtil::localFilterPath(); - KConfigGroup grp = config.group(QStringLiteral("DisableRules")); - const QStringList disableCustomFilters = grp.readEntry("DisableRules", QStringList()); - - loadRules(localRulesFilePath, disableCustomFilters); -} - -void AdBlockManager::loadRules(const QString &rulesFilePath, const QStringList &disableEntries) -{ - QFile ruleFile(rulesFilePath); - if (!ruleFile.open(QFile::ReadOnly | QFile::Text)) { - qCDebug(MESSAGEVIEWER_LOG) << "Unable to open rule file" << rulesFilePath; - return; - } - - QTextStream in(&ruleFile); - while (!in.atEnd()) { - const QString stringRule = in.readLine(); - if (!disableEntries.contains(stringRule)) { - loadRuleString(stringRule); - } - } -} - -void AdBlockManager::loadRuleString(const QString &stringRule) -{ - // empty rules are just dangerous.. - // (an empty rule in whitelist allows all, in blacklist blocks all..) - if (stringRule.isEmpty()) { - return; - } - - // ! rules are comments - if (stringRule.startsWith(QLatin1Char('!'))) { - return; - } - - // [ rules are ABP info - if (stringRule.startsWith(QLatin1Char('['))) { - return; - } - - // white rules - if (stringRule.startsWith(QStringLiteral("@@"))) { - if (d->_hostWhiteList.tryAddFilter(stringRule)) { - return; - } - - const QString filter = stringRule.mid(2); - if (filter.isEmpty()) { - return; - } - - AdBlockRule rule(filter); - d->_whiteList << rule; - return; - } - - // hide (CSS) rules - if (stringRule.contains(QStringLiteral("##"))) { - d->_elementHiding.addRule(stringRule); - return; - } - - if (d->_hostBlackList.tryAddFilter(stringRule)) { - return; - } - - AdBlockRule rule(stringRule); - d->_blackList << rule; -} - -bool AdBlockManager::blockRequest(const QNetworkRequest &request) -{ - if (!isEnabled()) { - return false; - } - - // we (ad)block just http & https traffic - if (request.url().scheme() != QLatin1String("http") - && request.url().scheme() != QLatin1String("https")) { - return false; - } - - const QStringList whiteRefererList = MessageViewer::MessageViewerSettings::self()->whiteReferer(); - const QString referer = QString::fromLatin1(request.rawHeader("referer")); - Q_FOREACH (const QString &host, whiteRefererList) { - if (referer.contains(host)) { - return false; - } - } - - QString urlString = request.url().toString(); - // We compute a lowercase version of the URL so each rule does not - // have to do it. - const QString urlStringLowerCase = urlString.toLower(); - const QString host = request.url().host(); - - // check white rules before :) - if (d->_hostWhiteList.match(host)) { - qCDebug(MESSAGEVIEWER_LOG) << "ADBLOCK: WHITE RULE (@@) Matched by string: " << urlString; - return false; - } - - Q_FOREACH (const AdBlockRule &filter, d->_whiteList) { - if (filter.match(request, urlString, urlStringLowerCase)) { - qCDebug(MESSAGEVIEWER_LOG) << "ADBLOCK: WHITE RULE (@@) Matched by string: " << urlString; - return false; - } - } - - // then check the black ones :( - if (d->_hostBlackList.match(host)) { - qCDebug(MESSAGEVIEWER_LOG) << "ADBLOCK: BLACK RULE Matched by string: " << urlString; - return true; - } - - Q_FOREACH (const AdBlockRule &filter, d->_blackList) { - if (filter.match(request, urlString, urlStringLowerCase)) { - qCDebug(MESSAGEVIEWER_LOG) << "ADBLOCK: BLACK RULE Matched by string: " << urlString; - return true; - } - } - - // no match - return false; -} - -void AdBlockManager::updateSubscription(const QString &path, const QString &url, const QString &itemName) -{ - QUrl subUrl = QUrl(url); - - const QString rulesFilePath = path; - QUrl destUrl = QUrl::fromLocalFile(rulesFilePath); - - KIO::FileCopyJob *job = KIO::file_copy(subUrl, destUrl, -1, KIO::HideProgressInfo | KIO::Overwrite); - KIO::MetaData metadata = job->metaData(); - metadata.insert(QStringLiteral("ssl_no_client_cert"), QStringLiteral("TRUE")); - metadata.insert(QStringLiteral("ssl_no_ui"), QStringLiteral("TRUE")); - metadata.insert(QStringLiteral("UseCache"), QStringLiteral("false")); - metadata.insert(QStringLiteral("cookies"), QStringLiteral("none")); - metadata.insert(QStringLiteral("no-auth"), QStringLiteral("true")); - job->setMetaData(metadata); - job->setProperty("itemname", itemName); - - connect(job, &KIO::FileCopyJob::finished, this, &AdBlockManager::slotFinished); -} - -void AdBlockManager::slotFinished(KJob *job) -{ - if (job->error()) { - KNotification *notify = new KNotification(QStringLiteral("adblock-list-download-failed")); - notify->setComponentName(QStringLiteral("messageviewer")); - notify->setText(i18n("Download new ad-block list was failed.")); - notify->sendEvent(); - return; - } - - KNotification *notify = new KNotification(QStringLiteral("adblock-list-download-done")); - notify->setComponentName(QStringLiteral("messageviewer")); - notify->setText(i18n("Download new ad-block list was done.")); - notify->sendEvent(); - const QString itemName = job->property("itemname").toString(); - if (!itemName.isEmpty()) { - KConfig config(QStringLiteral("messagevieweradblockrc")); - if (config.hasGroup(itemName)) { - KConfigGroup grp = config.group(itemName); - grp.writeEntry(QStringLiteral("lastUpdate"), QDateTime::currentDateTime()); - } - } - - KIO::FileCopyJob *fJob = qobject_cast(job); - QUrl url = fJob->destUrl(); - url.setScheme(QString()); // this is needed to load local url well :( - loadRules(url.url()); -} - -bool AdBlockManager::subscriptionFileExists(int i) -{ - const QString n = QString::number(i + 1); - - const QString rulesFilePath = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/kmail2/adblockrules_") + n; - return QFile::exists(rulesFilePath); -} - -void AdBlockManager::addCustomRule(const QString &stringRule, bool reloadPage) -{ - // save rule in local filters - const QString localRulesFilePath = MessageViewer::AdBlockUtil::localFilterPath(); - - QFile ruleFile(localRulesFilePath); - if (!ruleFile.open(QFile::ReadOnly)) { - qCDebug(MESSAGEVIEWER_LOG) << "Unable to open rule file" << localRulesFilePath; - return; - } - - QTextStream in(&ruleFile); - while (!in.atEnd()) { - QString readStringRule = in.readLine(); - if (stringRule == readStringRule) { - ruleFile.close(); - return; - } - } - ruleFile.close(); - if (!ruleFile.open(QFile::WriteOnly | QFile::Append)) { - qCDebug(MESSAGEVIEWER_LOG) << "Unable to open rule file" << localRulesFilePath; - return; - } - - QTextStream out(&ruleFile); - out << stringRule << '\n'; - - ruleFile.close(); - - // load it - loadRuleString(stringRule); - - // eventually reload page - if (reloadPage) { - Q_EMIT reloadCurrentPage(); - } -} - -bool AdBlockManager::isAdblockEnabledForHost(const QString &host) -{ - if (!isEnabled()) { - return false; - } - - return ! d->_hostWhiteList.match(host); -} - -void AdBlockManager::applyHidingRules(QWebFrame *frame) -{ - if (!frame) { - return; - } - - if (!isEnabled()) { - return; - } - - connect(frame, SIGNAL(loadFinished(bool)), this, SLOT(applyHidingRules(bool))); -} - -void AdBlockManager::applyHidingRules(bool ok) -{ - if (!ok) { - return; - } - - QWebFrame *frame = qobject_cast(sender()); - if (!frame) { - return; - } - MessageViewer::WebPage *page = qobject_cast(frame->page()); - if (!page) { - return; - } - - QString mainPageHost = page->loadingUrl().host(); - const QStringList hosts = MessageViewer::MessageViewerSettings::self()->whiteReferer(); - if (hosts.contains(mainPageHost)) { - return; - } - - QWebElement document = frame->documentElement(); - - d->_elementHiding.apply(document, mainPageHost); -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockmanager.h kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockmanager.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockmanager.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockmanager.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,192 +0,0 @@ -/* ============================================================ -* -* This file is a part of the rekonq project -* Copyright (c) 2013-2016 Montel Laurent -* based on code from rekonq -* Copyright (C) 2010-2012 by Andrea Diamantini -* -* -* 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) version 3 or any later version -* accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy -* defined in Section 14 of version 3 of the license. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* ============================================================ */ - -#ifndef ADBLOCK_MANAGER_H -#define ADBLOCK_MANAGER_H - -// NOTE: AdBlockPlus Filters (fast) summary -// -// ### Basic Filter rules -// -// RULE = http://example.com/ads/* -// this should block every link containing all things from that link -// -// ### Exception rules (@@) -// -// RULE = @@advice* -// -// this will save every site, also that matched by other rules, cointaining words -// that starts with "advice". Wildcards && regular expression allowed here. -// -// ### Beginning/end matching rules (||) -// -// RULE=||http://badsite.com -// -// will stop all links starting with http://badsite.com -// -// RULE=*swf|| -// -// will stop all links to direct flash contents -// -// ### Comments (!) -// -// RULE=!azz.. -// -// Every rule starting with a ! is commented out and should not be checked -// -// ### Filter Options -// -// There are 3 kind of filter options: -// -// --- ### TYPE OPTIONS -// -// You can also specify a number of options to modify the behavior of a filter. -// You list these options separated with commas after a dollar sign ($) at the end of the filter -// -// RULE=*/ads/*$element,match-case -// -// where $element can be one of the following: -// $script external scripts loaded via HTML script tag -// $image regular images, typically loaded via HTML img tag -// $background background images, often specified via CSS -// $stylesheet external CSS stylesheet files -// $object content handled by browser plugins, e.g. Flash or Java -// $xbl XBL bindings (typically loaded by -moz-binding CSS property) Firefox 3 or higher required -// $ping link pings Firefox 3 or higher required -// $xmlhttprequest requests started by the XMLHttpRequest object Firefox 3 or higher required -// $object-subrequest requests started plugins like Flash Firefox 3 or higher required -// $dtd DTD files loaded by XML documents Firefox 3 or higher required -// $subdocument embedded pages, usually included via HTML frames -// $document the page itself (only exception rules can be applied to the page) -// $other types of requests not covered in the list above -// -// -// --- ### INVERSE TYPE OPTIONS -// -// Inverse type options are allowed through the ~ sign, for example: -// -// RULE=*/ads/*~$script,match-case -// -// -// --- ### THIRD-PARTY OPTIONS -// -// If "third-party" option is specified, filter is applied just to requests coming from a different -// origin than the currently viewed page. -// In the same way, the "~third-party" option restricts the filter to the requests coming from the -// same origin as the currently viewed page. -// -// -// ### Regular expressions -// -// They usually allow to check for (a lot of) sites, using just one rule, but be careful: -// BASIC FILTERS ARE PROCESSED FASTER THAN REGULAR EXPRESSIONS -// (That's true at least in ABP! In rekonq, I don't know...) -// -// -// ### ELEMENT HIDING (##) -// -// This is quite different from usual adblock (but, for me, more powerful!). Sometimes you will find advertisements -// that can’t be blocked because they are embedded as text in the web page itself. -// All you can do there is HIDE the element :) -// -// RULE=##div.advise -// -// The previous rule will hide every div whose class is named "advise". Usual CSS selectors apply here :) -// -// END NOTE ---------------------------------------------------------------------------------------------------------- - -// Local Includes -#include "messageviewer_export.h" -// KDE Includes -#include - -// Qt Includes -#include -#include - -// Forward Includes -class QNetworkRequest; -class QWebFrame; - -// Definitions - -namespace MessageViewer -{ -class AdBlockManagerPrivate; -class MESSAGEVIEWER_EXPORT AdBlockManager : public QObject -{ - Q_OBJECT - -public: - /** - * Entry point. - * Access to AdBlockManager class by using - * AdBlockManager::self()->thePublicMethodYouNeed() - */ - static AdBlockManager *self(); - - ~AdBlockManager(); - - bool isEnabled(); - bool isHidingElements(); - - bool blockRequest(const QNetworkRequest &request); - - void addCustomRule(const QString &, bool reloadPage = true); - - bool isAdblockEnabledForHost(const QString &host); - - void reloadConfig(); - -private: - AdBlockManager(QObject *parent = Q_NULLPTR); - - void updateSubscription(const QString &path, const QString &url, const QString &itemName); - bool subscriptionFileExists(int); - - // load a file rule, given a path - void loadRules(const QString &rulesFilePath, const QStringList &disableEntries = QStringList()); - - // load a single rule - void loadRuleString(const QString &stringRule); - -private Q_SLOTS: - void loadSettings(); - - void slotFinished(KJob *); - - void applyHidingRules(QWebFrame *); - void applyHidingRules(bool); - -Q_SIGNALS: - void reloadCurrentPage(); - -private: - AdBlockManagerPrivate *const d; - static QWeakPointer s_adBlockManager; -}; -} -#endif diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockrulefallbackimpl.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockrulefallbackimpl.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockrulefallbackimpl.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockrulefallbackimpl.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,192 +0,0 @@ -/* ============================================================ -* Copyright (c) 2013-2016 Montel Laurent -* based on code from rekonq -* This file is a part of the rekonq project -* -* Copyright (C) 2010-2011 by Benjamin Poulain -* Copyright (C) 2011-2012 by Andrea Diamantini -* -* -* 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) version 3 or any later version -* accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy -* defined in Section 14 of version 3 of the license. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* ============================================================ */ - -// Self Includes -#include "adblockrulefallbackimpl.h" - -// Qt Includes -#include -#include -#include - -using namespace MessageViewer; -static inline bool isRegExpFilter(const QString &filter) -{ - return filter.startsWith(QLatin1Char('/')) && filter.endsWith(QLatin1Char('/')); -} - -AdBlockRuleFallbackImpl::AdBlockRuleFallbackImpl(const QString &filter) - : AdBlockRuleImpl(filter) - , m_unsupported(false) - , m_thirdPartyOption(false) - , m_thirdPartyOptionReversed(false) -{ - m_regExp.setCaseSensitivity(Qt::CaseInsensitive); - m_regExp.setPatternSyntax(QRegExp::RegExp2); - - QString parsedLine = filter; - - if (isRegExpFilter(parsedLine)) { - parsedLine = parsedLine.mid(1, parsedLine.length() - 2); - } else { - const int optionsNumber = parsedLine.lastIndexOf(QLatin1Char('$')); - - if (optionsNumber >= 0) { - QStringList options(parsedLine.mid(optionsNumber + 1).split(QLatin1Char(','))); - parsedLine = parsedLine.left(optionsNumber); - - if (options.removeOne(QStringLiteral("match-case"))) { - m_regExp.setCaseSensitivity(Qt::CaseSensitive); - } - - if (options.removeOne(QStringLiteral("third-party"))) { - m_thirdPartyOption = true; - } - - if (options.removeOne(QStringLiteral("~third-party"))) { - m_thirdPartyOption = true; - m_thirdPartyOptionReversed = true; - } - - Q_FOREACH (const QString &option, options) { - // Domain restricted filter - const QString domainKeyword(QStringLiteral("domain=")); - if (option.startsWith(domainKeyword)) { - options.removeOne(option); - const QStringList domainList = option.mid(domainKeyword.length()).split(QLatin1Char('|')); - Q_FOREACH (const QString &domain, domainList) { - if (domain.startsWith(QLatin1Char('~'))) { - m_whiteDomains.insert(domain.toLower()); - } else { - m_blackDomains.insert(domain.toLower()); - } - } - break; - } - } - - // if there are yet options available we have to whitelist the rule - // to not be too much restrictive on adblocking - m_unsupported = (!options.isEmpty()); - } - - parsedLine = convertPatternToRegExp(parsedLine); - } - - m_regExp.setPattern(parsedLine); -} - -bool AdBlockRuleFallbackImpl::match(const QNetworkRequest &request, const QString &encodedUrl, const QString &) const -{ - if (m_unsupported) { - return false; - } - - if (m_thirdPartyOption) { - const QString referer = QString::fromLatin1(request.rawHeader("referer")); - const QString host = request.url().host(); - - bool isThirdParty = !referer.contains(host); - - if (!m_thirdPartyOptionReversed && !isThirdParty) { - return false; - } - - if (m_thirdPartyOptionReversed && isThirdParty) { - return false; - } - } - - const bool regexpMatch = m_regExp.indexIn(encodedUrl) != -1; - - if (regexpMatch && (!m_whiteDomains.isEmpty() || !m_blackDomains.isEmpty())) { - Q_ASSERT(qobject_cast(request.originatingObject())); - const QWebFrame *const origin = static_cast(request.originatingObject()); - - const QString originDomain = origin->url().host(); - - if (!m_whiteDomains.isEmpty()) { - // In this context, white domains means we block anything but what is in the list. - if (m_whiteDomains.contains(originDomain)) { - return false; - } - return true; - } else if (m_blackDomains.contains(originDomain)) { - return true; - } - return false; - } - return regexpMatch; -} - -QString AdBlockRuleFallbackImpl::convertPatternToRegExp(const QString &wildcardPattern) -{ - QString pattern = wildcardPattern; - - // remove multiple wildcards - pattern.replace(QRegExp(QLatin1String("\\*+")), QStringLiteral("*")); - - // remove anchors following separator placeholder - pattern.replace(QRegExp(QLatin1String("\\^\\|$")), QStringLiteral("^")); - - // remove leading wildcards - pattern.replace(QRegExp(QLatin1String("^(\\*)")), QStringLiteral("")); - - // remove trailing wildcards - pattern.replace(QRegExp(QLatin1String("(\\*)$")), QStringLiteral("")); - - // escape special symbols - pattern.replace(QRegExp(QLatin1String("(\\W)")), QStringLiteral("\\\\1")); - - // process extended anchor at expression start - pattern.replace(QRegExp(QLatin1String("^\\\\\\|\\\\\\|")), QStringLiteral("^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?")); - - // process separator placeholders - pattern.replace(QRegExp(QLatin1String("\\\\\\^")), QStringLiteral("(?:[^\\w\\d\\-.%]|$)")); - - // process anchor at expression start - pattern.replace(QRegExp(QLatin1String("^\\\\\\|")), QStringLiteral("^")); - - // process anchor at expression end - pattern.replace(QRegExp(QLatin1String("\\\\\\|$")), QStringLiteral("$")); - - // replace wildcards by .* - pattern.replace(QRegExp(QLatin1String("\\\\\\*")), QStringLiteral(".*")); - - // Finally, return... - return pattern; -} - -QString AdBlockRuleFallbackImpl::ruleString() const -{ - return m_regExp.pattern(); -} - -QString AdBlockRuleFallbackImpl::ruleType() const -{ - return QStringLiteral("AdBlockRuleFallbackImpl"); -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockrulefallbackimpl.h kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockrulefallbackimpl.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockrulefallbackimpl.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockrulefallbackimpl.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -/* ============================================================ -* -* This file is a part of the rekonq project -* Copyright (c) 2013-2016 Montel Laurent -* based on code from rekonq -* Copyright (C) 2010-2011 by Benjamin Poulain -* Copyright (C) 2011-2012 by Andrea Diamantini -* -* -* 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) version 3 or any later version -* accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy -* defined in Section 14 of version 3 of the license. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* ============================================================ */ - -#ifndef ADBLOCKRULEFALLBACKIMPL_H -#define ADBLOCKRULEFALLBACKIMPL_H - -#include "adblockruleimpl.h" - -// Qt Includes -#include -#include -#include -namespace MessageViewer -{ -class AdBlockRuleFallbackImpl : public AdBlockRuleImpl -{ -public: - explicit AdBlockRuleFallbackImpl(const QString &filter); - - bool match(const QNetworkRequest &request, const QString &encodedUrl, const QString &encodedUrlLowerCase) const Q_DECL_OVERRIDE; - - QString ruleString() const Q_DECL_OVERRIDE; - QString ruleType() const Q_DECL_OVERRIDE; - -private: - QString convertPatternToRegExp(const QString &wildcardPattern); - - QRegExp m_regExp; - QSet m_whiteDomains; - QSet m_blackDomains; - - bool m_unsupported; - bool m_thirdPartyOption; - bool m_thirdPartyOptionReversed; -}; -} - -#endif // ADBLOCKRULEFALLBACKIMPL_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockruleimpl.h kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockruleimpl.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/adblockruleimpl.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/adblockruleimpl.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -/* ============================================================ -* -* This file is a part of the rekonq project -* -* Copyright (C) 2010-2011 by Benjamin Poulain -* -* -* 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) version 3 or any later version -* accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy -* defined in Section 14 of version 3 of the license. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* ============================================================ */ - -#ifndef ADBLOCKRULEIMPL_H -#define ADBLOCKRULEIMPL_H - -class QString; -class QNetworkRequest; -namespace MessageViewer -{ -class AdBlockRuleImpl -{ -public: - explicit AdBlockRuleImpl(const QString &) {} - virtual ~AdBlockRuleImpl() {} - - virtual bool match(const QNetworkRequest &request, const QString &encodedUrl, const QString &encodedUrlLowerCase) const = 0; - - // This are added just for debugging purposes - virtual QString ruleString() const = 0; - virtual QString ruleType() const = 0; -}; -} -#endif // ADBLOCKRULEIMPL_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockaddsubscriptiondialog.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockaddsubscriptiondialog.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockaddsubscriptiondialog.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockaddsubscriptiondialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "adblockaddsubscriptiondialog.h" -#include "adblockshowlistdialog.h" -#include "adblockutil.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace MessageViewer; -AdBlockAddSubscriptionDialog::AdBlockAddSubscriptionDialog(const QStringList &excludeList, QWidget *parent) - : QDialog(parent) -{ - setWindowTitle(i18n("Add subscription")); - QVBoxLayout *mainLayout = new QVBoxLayout; - setLayout(mainLayout); - - QWidget *w = new QWidget; - QHBoxLayout *lay = new QHBoxLayout; - lay->setMargin(0); - QLabel *lab = new QLabel(i18n("Select List:")); - lab->setObjectName(QStringLiteral("listsubscriptionlabel")); - lay->addWidget(lab); - - mListSubscription = new QComboBox; - mListSubscription->setObjectName(QStringLiteral("listsubscriptioncombobox")); - lay->addWidget(mListSubscription); - - mShowList = new QToolButton; - mShowList->setToolTip(i18n("Show List")); - mShowList->setObjectName(QStringLiteral("showlisttoolbutton")); - mShowList->setIcon(QIcon::fromTheme(QStringLiteral("document-preview"))); - lay->addWidget(mShowList); - connect(mShowList, &QToolButton::clicked, this, &AdBlockAddSubscriptionDialog::slotShowList); - - QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - buttonBox->setObjectName(QStringLiteral("listsubscriptionbuttonBox")); - QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); - okButton->setDefault(true); - okButton->setShortcut(Qt::CTRL | Qt::Key_Return); - connect(buttonBox, &QDialogButtonBox::accepted, this, &AdBlockAddSubscriptionDialog::accept); - connect(buttonBox, &QDialogButtonBox::rejected, this, &AdBlockAddSubscriptionDialog::reject); - - w->setLayout(lay); - mainLayout->addWidget(w); - mainLayout->addWidget(buttonBox); - initializeList(excludeList); -} - -AdBlockAddSubscriptionDialog::~AdBlockAddSubscriptionDialog() -{ - -} - -void AdBlockAddSubscriptionDialog::initializeList(const QStringList &excludeList) -{ - QMapIterator i(MessageViewer::AdBlockUtil::listSubscriptions()); - while (i.hasNext()) { - i.next(); - if (!excludeList.contains(i.key())) { - mListSubscription->addItem(i.key(), i.value()); - } - } -} - -void AdBlockAddSubscriptionDialog::selectedList(QString &name, QString &url) -{ - name = mListSubscription->currentText(); - url = mListSubscription->itemData(mListSubscription->currentIndex()).toString(); -} - -void AdBlockAddSubscriptionDialog::slotShowList() -{ - const QString url = mListSubscription->itemData(mListSubscription->currentIndex()).toString(); - if (!url.isEmpty()) { - QPointer dlg = new AdBlockShowListDialog(false, this); - dlg->setListName(mListSubscription->currentText()); - dlg->setAdBlockListPath(QString(), url); - dlg->exec(); - delete dlg; - } -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockaddsubscriptiondialog.h kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockaddsubscriptiondialog.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockaddsubscriptiondialog.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockaddsubscriptiondialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef ADBLOCKADDSUBSCRIPTIONDIALOG_H -#define ADBLOCKADDSUBSCRIPTIONDIALOG_H - -#include - -class QComboBox; -class QToolButton; -namespace MessageViewer -{ -class AdBlockAddSubscriptionDialog : public QDialog -{ - Q_OBJECT -public: - explicit AdBlockAddSubscriptionDialog(const QStringList &excludeList, QWidget *parent = Q_NULLPTR); - ~AdBlockAddSubscriptionDialog(); - - void selectedList(QString &name, QString &url); - -private Q_SLOTS: - void slotShowList(); - -private: - void initializeList(const QStringList &excludeList); - QComboBox *mListSubscription; - QToolButton *mShowList; -}; -} - -#endif // ADBLOCKADDSUBSCRIPTIONDIALOG_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockautomaticruleslistwidget.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockautomaticruleslistwidget.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockautomaticruleslistwidget.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockautomaticruleslistwidget.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "adblockautomaticruleslistwidget.h" - -using namespace MessageViewer; - -AdBlockAutomaticRulesListWidget::AdBlockAutomaticRulesListWidget(QWidget *parent) - : QListWidget(parent) -{ - connect(this, &AdBlockAutomaticRulesListWidget::itemChanged, this, &AdBlockAutomaticRulesListWidget::slotItemChanged); -} - -AdBlockAutomaticRulesListWidget::~AdBlockAutomaticRulesListWidget() -{ - -} - -void AdBlockAutomaticRulesListWidget::slotItemChanged(QListWidgetItem *item) -{ - updateItem(item); -} - -void AdBlockAutomaticRulesListWidget::updateItem(QListWidgetItem *item) -{ - const bool itemIsChecked = (item->checkState() & Qt::Checked); - QFont font = item->font(); - const QString rule = item->text(); - if (itemIsChecked) { - font.setItalic(false); - item->setFont(font); - if (rule.contains(QRegularExpression(QStringLiteral("^@@.*")))) { - item->setTextColor(Qt::magenta); - } else if (rule.contains(QRegularExpression(QStringLiteral("^\\[.*")))) { - item->setTextColor(Qt::red); - } else if (rule.contains(QRegularExpression(QStringLiteral(".*##.*")))) { - item->setTextColor(Qt::blue); - } else { - item->setTextColor(Qt::black); - } - } else { - font.setItalic(true); - item->setFont(font); - item->setTextColor(Qt::gray); - } -} - -void AdBlockAutomaticRulesListWidget::setDisabledRules(const QStringList &disabledRules) -{ - mDisabledRules = disabledRules; -} - -void AdBlockAutomaticRulesListWidget::setRules(const QString &rules) -{ - clear(); - const QStringList lst = rules.split(QLatin1Char('\n'), QString::SkipEmptyParts); - Q_FOREACH (const QString &rule, lst) { - createItem(rule); - } -} - -void AdBlockAutomaticRulesListWidget::createItem(const QString &rule) -{ - QListWidgetItem *subItem = new QListWidgetItem(this); - subItem->setText(rule); - if (rule.startsWith(QLatin1Char('!')) || rule.startsWith(QLatin1Char('['))) { - //Comment - subItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled); - subItem->setTextColor(Qt::gray); - } else { - subItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled); - const bool checkState = mDisabledRules.contains(rule); - subItem->setCheckState(checkState ? Qt::Unchecked : Qt::Checked); - updateItem(subItem); - } -} - -QStringList AdBlockAutomaticRulesListWidget::disabledRules() const -{ - QStringList currentDisabledRules; - for (int i = 0; i < count(); ++i) { - QListWidgetItem *row = item(i); - if (row->flags() & Qt::ItemIsUserCheckable) { - if (row->checkState() == Qt::Unchecked) { - currentDisabledRules << row->text(); - } - } - } - return currentDisabledRules; -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockautomaticruleslistwidget.h kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockautomaticruleslistwidget.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockautomaticruleslistwidget.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockautomaticruleslistwidget.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef ADBLOCKAUTOMATICRULESLISTWIDGET_H -#define ADBLOCKAUTOMATICRULESLISTWIDGET_H - -#include -#include "messageviewer_export.h" -namespace MessageViewer -{ -class MESSAGEVIEWER_EXPORT AdBlockAutomaticRulesListWidget : public QListWidget -{ - Q_OBJECT -public: - explicit AdBlockAutomaticRulesListWidget(QWidget *parent = Q_NULLPTR); - ~AdBlockAutomaticRulesListWidget(); - void setRules(const QString &rules); - - void setDisabledRules(const QStringList &disabledRules); - QStringList disabledRules() const; - -private Q_SLOTS: - void slotItemChanged(QListWidgetItem *item); - -private: - void updateItem(QListWidgetItem *item); - void createItem(const QString &rule); - QStringList mDisabledRules; -}; -} - -#endif // ADBLOCKAUTOMATICRULESLISTWIDGET_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockcreatefilterdialog.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockcreatefilterdialog.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockcreatefilterdialog.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockcreatefilterdialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,159 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "adblockcreatefilterdialog.h" -#include "ui_adblockcreatefilterwidget.h" - -#include - -#include -#include -#include -#include - -using namespace MessageViewer; -AdBlockCreateFilterDialog::AdBlockCreateFilterDialog(QWidget *parent) - : QDialog(parent), - mCurrentType(AdBlockBlockableItemsWidget::None) -{ - QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); - okButton->setDefault(true); - okButton->setShortcut(Qt::CTRL | Qt::Key_Return); - connect(buttonBox, &QDialogButtonBox::accepted, this, &AdBlockCreateFilterDialog::accept); - connect(buttonBox, &QDialogButtonBox::rejected, this, &AdBlockCreateFilterDialog::reject); - - QWidget *w = new QWidget; - mUi = new Ui::AdBlockCreateFilterWidget; - mUi->setupUi(w); - QVBoxLayout *mainLayout = new QVBoxLayout; - setLayout(mainLayout); - mainLayout->addWidget(w); - mainLayout->addWidget(buttonBox); - connect(mUi->filtercustom, &QLineEdit::textChanged, this, &AdBlockCreateFilterDialog::slotUpdateFilter); - connect(mUi->blockingFilter, &QRadioButton::toggled, this, &AdBlockCreateFilterDialog::slotUpdateFilter); - connect(mUi->exceptionFilter, &QRadioButton::toggled, this, &AdBlockCreateFilterDialog::slotUpdateFilter); - connect(mUi->atTheBeginning, &QCheckBox::toggled, this, &AdBlockCreateFilterDialog::slotUpdateFilter); - connect(mUi->atTheEnd, &QCheckBox::toggled, this, &AdBlockCreateFilterDialog::slotUpdateFilter); - connect(mUi->restrictToDomain, &QCheckBox::toggled, this, &AdBlockCreateFilterDialog::slotUpdateFilter); - connect(mUi->restrictToDomainStr, &QLineEdit::textChanged, this, &AdBlockCreateFilterDialog::slotUpdateFilter); - connect(mUi->firstPartOnly, &QCheckBox::toggled, this, &AdBlockCreateFilterDialog::slotUpdateFilter); - connect(mUi->matchCase, &QCheckBox::toggled, this, &AdBlockCreateFilterDialog::slotUpdateFilter); - connect(mUi->applyListElement, &QListWidget::itemChanged, this, &AdBlockCreateFilterDialog::slotUpdateFilter); - mUi->collapseBlocked->addItem(i18n("Use default"), QString()); - mUi->collapseBlocked->addItem(i18n("Yes"), QStringLiteral("collapse")); - mUi->collapseBlocked->addItem(i18n("Not"), QStringLiteral("~collapse")); - connect(mUi->collapseBlocked, static_cast(&QComboBox::activated), this, &AdBlockCreateFilterDialog::slotUpdateFilter); - readConfig(); -} - -AdBlockCreateFilterDialog::~AdBlockCreateFilterDialog() -{ - writeConfig(); - delete mUi; - mUi = 0; -} - -void AdBlockCreateFilterDialog::writeConfig() -{ - KConfigGroup group(KSharedConfig::openConfig(), "AdBlockCreateFilterDialog"); - group.writeEntry("Size", size()); -} - -void AdBlockCreateFilterDialog::readConfig() -{ - KConfigGroup group(KSharedConfig::openConfig(), "AdBlockCreateFilterDialog"); - const QSize sizeDialog = group.readEntry("Size", QSize(800, 600)); - if (sizeDialog.isValid()) { - resize(sizeDialog); - } -} - -void AdBlockCreateFilterDialog::setPattern(AdBlockBlockableItemsWidget::TypeElement type, const QString &pattern) -{ - if (mPattern != pattern) { - mPattern = pattern; - mCurrentType = type; - initialize(); - } -} - -void AdBlockCreateFilterDialog::initialize() -{ - mUi->applyListElement->clear(); - for (int i = AdBlockBlockableItemsWidget::None + 1; i < AdBlockBlockableItemsWidget::MaxTypeElement; ++i) { - QListWidgetItem *item = new QListWidgetItem(AdBlockBlockableItemsWidget::elementTypeToI18n(static_cast(i)), mUi->applyListElement); - item->setData(ElementValue, static_cast(i)); - item->setCheckState(Qt::Unchecked); - if (i == (int)mCurrentType) { - item->setFlags(item->flags() & ~Qt::ItemIsEnabled); - } - - } - - mUi->blockingFilter->setChecked(true); - mUi->filtercustom->setText(mPattern); - slotUpdateFilter(); -} - -QString AdBlockCreateFilterDialog::filter() const -{ - return mUi->filterName->text(); -} - -void AdBlockCreateFilterDialog::slotUpdateFilter() -{ - QString pattern = mUi->filtercustom->text(); - if (mUi->atTheBeginning->isChecked()) { - pattern = QLatin1String("|") + pattern; - } - if (mUi->atTheEnd->isChecked()) { - pattern += QLatin1String("|"); - } - - const QString collapseValue = mUi->collapseBlocked->itemData(mUi->collapseBlocked->currentIndex()).toString(); - if (!collapseValue.isEmpty()) { - pattern += QLatin1Char('$') + collapseValue; - } - - pattern += (collapseValue.isEmpty() ? QLatin1String("$") : QLatin1String(",")) + AdBlockBlockableItemsWidget::elementType(mCurrentType); - - if (mUi->exceptionFilter->isChecked()) { - pattern = QLatin1String("@@") + pattern; - } - const int numberOfElement(mUi->applyListElement->count()); - for (int i = 0; i < numberOfElement; ++i) { - QListWidgetItem *item = mUi->applyListElement->item(i); - if ((item->checkState() == Qt::Checked) && (item->flags() & Qt::ItemIsEnabled)) { - pattern += QLatin1Char(',') + AdBlockBlockableItemsWidget::elementType(static_cast(item->data(ElementValue).toInt())); - } - } - - if (mUi->restrictToDomain->isChecked()) { - if (!mUi->restrictToDomainStr->text().isEmpty()) { - pattern += QLatin1String(",domain=") + mUi->restrictToDomainStr->text(); - } - } - if (mUi->matchCase->isChecked()) { - pattern += QLatin1String(",match-case"); - } - if (mUi->firstPartOnly->isChecked()) { - pattern += QLatin1String(",~third-party"); - } - mUi->filterName->setText(pattern); -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockcreatefilterdialog.h kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockcreatefilterdialog.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockcreatefilterdialog.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockcreatefilterdialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef ADBLOCKCREATEFILTERDIALOG_H -#define ADBLOCKCREATEFILTERDIALOG_H - -#include "adblock/adblockblockableitemswidget.h" - -#include -namespace Ui -{ -class AdBlockCreateFilterWidget; -} -namespace MessageViewer -{ -class AdBlockCreateFilterDialog : public QDialog -{ - Q_OBJECT -public: - explicit AdBlockCreateFilterDialog(QWidget *parent = Q_NULLPTR); - ~AdBlockCreateFilterDialog(); - - void setPattern(AdBlockBlockableItemsWidget::TypeElement type, const QString &pattern); - - QString filter() const; - -private Q_SLOTS: - void slotUpdateFilter(); - -private: - enum ElementType { - ElementValue = Qt::UserRole + 1 - }; - - void readConfig(); - void writeConfig(); - void initialize(); - QString mPattern; - AdBlockBlockableItemsWidget::TypeElement mCurrentType; - Ui::AdBlockCreateFilterWidget *mUi; -}; -} - -#endif // ADBLOCKCREATEFILTERDIALOG_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblocklistwidget.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblocklistwidget.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblocklistwidget.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblocklistwidget.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "adblocklistwidget.h" - -#include - -#include -#include - -using namespace MessageViewer; -AdBlockListWidget::AdBlockListWidget(QWidget *parent) - : QListWidget(parent) -{ -} - -AdBlockListWidget::~AdBlockListWidget() -{ - -} - -void AdBlockListWidget::changeEvent(QEvent *event) -{ - if (event->type() == QEvent::PaletteChange) { - generalPaletteChanged(); - } - QListWidget::changeEvent(event); -} - -void AdBlockListWidget::generalPaletteChanged() -{ - const QPalette palette = viewport()->palette(); - QColor color = palette.text().color(); - color.setAlpha(128); - mTextColor = color; -} - -void AdBlockListWidget::paintEvent(QPaintEvent *event) -{ - if (!model() || model()->rowCount() == 0) { - QPainter p(viewport()); - - QFont font = p.font(); - font.setItalic(true); - p.setFont(font); - - if (!mTextColor.isValid()) { - generalPaletteChanged(); - } - p.setPen(mTextColor); - - p.drawText(QRect(0, 0, width(), height()), Qt::AlignCenter, i18n("Not subscription added...")); - } else { - QListWidget::paintEvent(event); - } -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblocklistwidget.h kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblocklistwidget.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblocklistwidget.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblocklistwidget.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef ADBLOCKLISTWIDGET_H -#define ADBLOCKLISTWIDGET_H - -#include - -class QPaintEvent; -class QEvent; -namespace MessageViewer -{ -class AdBlockListWidget : public QListWidget -{ - Q_OBJECT -public: - explicit AdBlockListWidget(QWidget *parent = Q_NULLPTR); - ~AdBlockListWidget(); - -private: - void generalPaletteChanged(); - -protected: - void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; - - void changeEvent(QEvent *event) Q_DECL_OVERRIDE; -private: - QColor mTextColor; -}; -} - -#endif // ADBLOCKLISTWIDGET_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblocksettingwidget.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblocksettingwidget.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblocksettingwidget.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblocksettingwidget.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,479 +0,0 @@ -/* ============================================================ -* -* This file is a part of the rekonq project -* -* Copyright (c) 2013-2016 Montel Laurent -* based on code from rekonq -* Copyright (C) 2010-2012 by Andrea Diamantini -* -* -* 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) version 3 or any later version -* accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy -* defined in Section 14 of version 3 of the license. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* ============================================================ */ - -// Self Includes -#include "adblocksettingwidget.h" -#include "ui_settings_adblock.h" -#include "messageviewer_debug.h" -#include "settings/messageviewersettings.h" -#include "adblockaddsubscriptiondialog.h" -#include "adblock/adblockmanager.h" -#include "adblockshowlistdialog.h" -#include "adblock/common/adblockutil.h" -#include "PimCommon/ConfigureImmutableWidgetUtils" -using namespace PimCommon::ConfigureImmutableWidgetUtils; - -#include "PimCommon/PimUtil" - -// KDE Includes -#include - -#include - -#include -#include - -// Qt Includes -#include -#include -#include -#include -#include -#include -#include - -using namespace MessageViewer; -AdBlockSettingWidget::AdBlockSettingWidget(QWidget *parent) - : QWidget(parent) - , mChanged(false) -{ - mUi = new Ui::adblock; - mUi->setupUi(this); - - mUi->hintLabel->setText(i18n("Filter expression (e.g. http://www.example.com/ad/*, more information):")); - connect(mUi->hintLabel, &QLabel::linkActivated, this, &AdBlockSettingWidget::slotInfoLinkActivated); - mUi->hintLabel->setContextMenuPolicy(Qt::NoContextMenu); - - mUi->manualFiltersListWidget->setSelectionMode(QAbstractItemView::MultiSelection); - - mUi->searchLine->setListWidget(mUi->manualFiltersListWidget); - - mUi->insertButton->setIcon(QIcon::fromTheme(QStringLiteral("list-add"))); - connect(mUi->insertButton, &QToolButton::clicked, this, &AdBlockSettingWidget::insertRule); - - mUi->removeButton->setIcon(QIcon::fromTheme(QStringLiteral("list-remove"))); - connect(mUi->removeButton, &QPushButton::clicked, this, &AdBlockSettingWidget::removeRule); - connect(mUi->removeSubscription, &QPushButton::clicked, this, &AdBlockSettingWidget::slotRemoveSubscription); - connect(mUi->manualFiltersListWidget, &QListWidget::currentItemChanged, this, &AdBlockSettingWidget::slotUpdateManualButtons); - connect(mUi->manualFiltersListWidget, &QListWidget::itemChanged, this, &AdBlockSettingWidget::hasChanged); - - mUi->spinBox->setSuffix(ki18np(" day", " days")); - - mUi->removeSubscription->setEnabled(false); - mUi->showList->setEnabled(false); - // Q_EMIT changed signal - connect(mUi->checkEnableAdblock, &QCheckBox::stateChanged, this, &AdBlockSettingWidget::hasChanged); - connect(mUi->checkHideAds, &QCheckBox::stateChanged, this, &AdBlockSettingWidget::hasChanged); - connect(mUi->spinBox, static_cast(&KPluralHandlingSpinBox::valueChanged), this, &AdBlockSettingWidget::hasChanged); - connect(mUi->addFilters, &QPushButton::clicked, this, &AdBlockSettingWidget::slotAddFilter); - connect(mUi->showList, &QPushButton::clicked, this, &AdBlockSettingWidget::slotShowList); - connect(mUi->editFilter, &QPushButton::clicked, this, &AdBlockSettingWidget::slotEditFilter); - - connect(mUi->automaticFiltersListWidget, &MessageViewer::AdBlockListWidget::itemChanged, this, &AdBlockSettingWidget::hasChanged); - connect(mUi->automaticFiltersListWidget, &MessageViewer::AdBlockListWidget::currentItemChanged, this, &AdBlockSettingWidget::slotUpdateButtons); - connect(mUi->automaticFiltersListWidget, &MessageViewer::AdBlockListWidget::itemDoubleClicked, this, &AdBlockSettingWidget::slotAutomaticFilterDouble); - - connect(mUi->importFilters, &QPushButton::clicked, this, &AdBlockSettingWidget::slotImportFilters); - connect(mUi->exportFilters, &QPushButton::clicked, this, &AdBlockSettingWidget::slotExportFilters); - connect(mUi->addFilterLineEdit, &QLineEdit::textChanged, this, &AdBlockSettingWidget::slotManualFilterLineEditTextChanged); - slotUpdateManualButtons(); - mUi->insertButton->setEnabled(false); -} - -AdBlockSettingWidget::~AdBlockSettingWidget() -{ - delete mUi; -} - -void AdBlockSettingWidget::slotManualFilterLineEditTextChanged(const QString &text) -{ - mUi->insertButton->setEnabled(!text.isEmpty()); -} - -void AdBlockSettingWidget::slotEditFilter() -{ - QListWidgetItem *item = mUi->manualFiltersListWidget->currentItem(); - if (item) { - mUi->manualFiltersListWidget->editItem(item); - } -} - -void AdBlockSettingWidget::slotUpdateButtons() -{ - const bool enabled = mUi->automaticFiltersListWidget->currentItem(); - mUi->removeSubscription->setEnabled(enabled); - mUi->showList->setEnabled(enabled); -} - -void AdBlockSettingWidget::slotUpdateManualButtons() -{ - const bool enabled = mUi->manualFiltersListWidget->currentItem(); - mUi->removeButton->setEnabled(enabled); - mUi->editFilter->setEnabled(enabled); - mUi->exportFilters->setEnabled(mUi->manualFiltersListWidget->count() > 0); -} - -void AdBlockSettingWidget::slotInfoLinkActivated(const QString &url) -{ - Q_UNUSED(url) - - const QString hintHelpString = i18n("

Enter an expression to filter. Filters can be defined as either:" - "

  • a shell-style wildcard, e.g. http://www.example.com/ads*, " - "the wildcards *?[] may be used
  • " - "
  • a full regular expression by surrounding the string with '/', " - "e.g. /\\/(ad|banner)\\./
" - "

Any filter string can be preceded by '@@' to whitelist (allow) any matching URL, " - "which takes priority over any blacklist (blocking) filter."); - - QWhatsThis::showText(QCursor::pos(), hintHelpString); -} - -void AdBlockSettingWidget::insertRule() -{ - const QString rule = mUi->addFilterLineEdit->text(); - if (rule.isEmpty()) { - return; - } - const int numberItem(mUi->manualFiltersListWidget->count()); - for (int i = 0; i < numberItem; ++i) { - if (mUi->manualFiltersListWidget->item(i)->text() == rule) { - mUi->addFilterLineEdit->clear(); - return; - } - } - - addManualFilter(rule); - mUi->exportFilters->setEnabled(mUi->manualFiltersListWidget->count() > 0); - mUi->addFilterLineEdit->clear(); - hasChanged(); -} - -void AdBlockSettingWidget::removeRule() -{ - QList select = mUi->manualFiltersListWidget->selectedItems(); - if (select.isEmpty()) { - return; - } - Q_FOREACH (QListWidgetItem *item, select) { - delete item; - } - mUi->exportFilters->setEnabled(mUi->manualFiltersListWidget->count() > 0); - hasChanged(); -} - -void AdBlockSettingWidget::doResetToDefaultsOther() -{ - const bool bUseDefaults = MessageViewer::MessageViewerSettings::self()->useDefaults(true); - loadWidget(mUi->checkEnableAdblock, MessageViewer::MessageViewerSettings::self()->adBlockEnabledItem()); - mUi->tabWidget->setEnabled(MessageViewer::MessageViewerSettings::self()->adBlockEnabled()); - saveCheckBox(mUi->checkHideAds, MessageViewer::MessageViewerSettings::self()->hideAdsEnabledItem()); - loadWidget(mUi->spinBox, MessageViewer::MessageViewerSettings::self()->adBlockUpdateIntervalItem()); - MessageViewer::MessageViewerSettings::self()->useDefaults(bUseDefaults); -} - -void AdBlockSettingWidget::doLoadFromGlobalSettings() -{ - mUi->manualFiltersListWidget->clear(); - mUi->automaticFiltersListWidget->clear(); - loadWidget(mUi->checkEnableAdblock, MessageViewer::MessageViewerSettings::self()->adBlockEnabledItem()); - - // update enabled status - mUi->tabWidget->setEnabled(MessageViewer::MessageViewerSettings::self()->adBlockEnabled()); - loadWidget(mUi->checkHideAds, MessageViewer::MessageViewerSettings::self()->hideAdsEnabledItem()); - loadWidget(mUi->spinBox, MessageViewer::MessageViewerSettings::self()->adBlockUpdateIntervalItem()); - - // ------------------------------------------------------------------------------ - - // automatic filters - KConfig config(QStringLiteral("messagevieweradblockrc")); - - const QStringList itemList = config.groupList().filter(QRegularExpression(QStringLiteral("FilterList \\d+"))); - Q_FOREACH (const QString &item, itemList) { - KConfigGroup filtersGroup(&config, item); - const bool isFilterEnabled = filtersGroup.readEntry(QStringLiteral("FilterEnabled"), false); - const QString url = filtersGroup.readEntry(QStringLiteral("url")); - const QString path = filtersGroup.readEntry(QStringLiteral("path")); - const QString name = filtersGroup.readEntry(QStringLiteral("name")); - const QDateTime lastUpdate = filtersGroup.readEntry(QStringLiteral("lastUpdate"), QDateTime()); - if (url.isEmpty() || path.isEmpty() || name.isEmpty()) { - continue; - } - - QListWidgetItem *subItem = new QListWidgetItem(mUi->automaticFiltersListWidget); - subItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled); - if (isFilterEnabled) { - subItem->setCheckState(Qt::Checked); - } else { - subItem->setCheckState(Qt::Unchecked); - } - - subItem->setData(UrlList, url); - subItem->setData(PathList, path); - subItem->setData(LastUpdateList, lastUpdate); - subItem->setText(name); - } - - // ------------------------------------------------------------------------------ - - // local filters - const QString localRulesFilePath = MessageViewer::AdBlockUtil::localFilterPath(); - - QFile ruleFile(localRulesFilePath); - if (!ruleFile.open(QFile::ReadOnly | QFile::Text)) { - qCDebug(MESSAGEVIEWER_LOG) << "Unable to open rule file" << localRulesFilePath; - return; - } - - KConfigGroup grp = config.group(QStringLiteral("DisableRules")); - const QStringList disableRules = grp.readEntry("DisableRules", QStringList()); - - QTextStream in(&ruleFile); - while (!in.atEnd()) { - QString stringRule = in.readLine(); - addManualFilter(stringRule, disableRules); - } - updateCheckBox(); -} - -void AdBlockSettingWidget::save() -{ - if (!mChanged) { - return; - } - - // General settings - saveCheckBox(mUi->checkEnableAdblock, MessageViewer::MessageViewerSettings::self()->adBlockEnabledItem()); - saveCheckBox(mUi->checkHideAds, MessageViewer::MessageViewerSettings::self()->hideAdsEnabledItem()); - saveSpinBox(mUi->spinBox, MessageViewer::MessageViewerSettings::self()->adBlockUpdateIntervalItem()); - - // automatic filters - KConfig config(QStringLiteral("messagevieweradblockrc")); - const QStringList list = config.groupList().filter(QRegularExpression(QStringLiteral("FilterList \\d+"))); - foreach (const QString &group, list) { - config.deleteGroup(group); - } - - const int numberItem(mUi->automaticFiltersListWidget->count()); - for (int i = 0; i < numberItem; ++i) { - QListWidgetItem *subItem = mUi->automaticFiltersListWidget->item(i); - KConfigGroup grp = config.group(QStringLiteral("FilterList %1").arg(i)); - grp.writeEntry(QStringLiteral("FilterEnabled"), subItem->checkState() == Qt::Checked); - grp.writeEntry(QStringLiteral("url"), subItem->data(UrlList).toString()); - grp.writeEntry(QStringLiteral("name"), subItem->text()); - if (subItem->data(LastUpdateList).toDateTime().isValid()) { - grp.writeEntry(QStringLiteral("lastUpdate"), subItem->data(LastUpdateList).toDateTime()); - } - QString path = subItem->data(PathList).toString(); - if (path.isEmpty()) { - path = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1Char('/') + QStringLiteral("kmail2/adblockrules-%1").arg(i); - } - grp.writeEntry(QStringLiteral("path"), path); - } - - config.sync(); - // local filters - const QString localRulesFilePath = MessageViewer::AdBlockUtil::localFilterPath(); - - QFile ruleFile(localRulesFilePath); - if (!ruleFile.open(QFile::WriteOnly | QFile::Text)) { - qCDebug(MESSAGEVIEWER_LOG) << "Unable to open rule file" << localRulesFilePath; - return; - } - - QStringList disableCustomFilter; - QTextStream out(&ruleFile); - for (int i = 0; i < mUi->manualFiltersListWidget->count(); ++i) { - QListWidgetItem *subItem = mUi->manualFiltersListWidget->item(i); - const QString stringRule = subItem->text(); - if (!stringRule.trimmed().isEmpty()) { - out << stringRule << '\n'; - } - if (subItem->checkState() == Qt::Unchecked) { - disableCustomFilter << stringRule; - } - } - - if (!disableCustomFilter.isEmpty()) { - KConfigGroup grp = config.group(QStringLiteral("DisableRules")); - grp.writeEntry("DisableRules", disableCustomFilter); - } else { - config.deleteGroup(QStringLiteral("DisableRules")); - } - // ------------------------------------------------------------------------------- - mChanged = false; - Q_EMIT changed(false); - AdBlockManager::self()->reloadConfig(); -} - -void AdBlockSettingWidget::updateCheckBox() -{ - // update enabled status - mUi->checkHideAds->setEnabled(mUi->checkEnableAdblock->isChecked()); - mUi->tabWidget->setEnabled(mUi->checkEnableAdblock->isChecked()); -} - -void AdBlockSettingWidget::hasChanged() -{ - updateCheckBox(); - mChanged = true; - Q_EMIT changed(true); -} - -bool AdBlockSettingWidget::changed() const -{ - return mChanged; -} - -void AdBlockSettingWidget::slotAddFilter() -{ - QStringList excludeList; - const int numberItem(mUi->automaticFiltersListWidget->count()); - excludeList.reserve(numberItem); - for (int i = 0; i < numberItem; ++i) { - excludeList << mUi->automaticFiltersListWidget->item(i)->text(); - } - QPointer dlg = new MessageViewer::AdBlockAddSubscriptionDialog(excludeList, this); - if (dlg->exec()) { - QString name; - QString url; - dlg->selectedList(name, url); - QListWidgetItem *subItem = new QListWidgetItem(mUi->automaticFiltersListWidget); - subItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled); - subItem->setCheckState(Qt::Checked); - subItem->setText(name); - subItem->setData(UrlList, url); - subItem->setData(LastUpdateList, QDateTime()); - subItem->setData(PathList, QString()); - hasChanged(); - } - delete dlg; -} - -void AdBlockSettingWidget::slotRemoveSubscription() -{ - QListWidgetItem *item = mUi->automaticFiltersListWidget->currentItem(); - if (item) { - if (KMessageBox::questionYesNo(this, i18n("Do you want to delete list \"%1\"?", item->text()), i18n("Delete current list")) == KMessageBox::Yes) { - const QString path = item->data(PathList).toString(); - if (!path.isEmpty()) { - if (!QFile(path).remove()) { - qCDebug(MESSAGEVIEWER_LOG) << " we can not remove file:" << path; - } - } - delete item; - } - hasChanged(); - } -} - -void AdBlockSettingWidget::slotShowList() -{ - showAutomaticFilterList(mUi->automaticFiltersListWidget->currentItem()); -} - -void AdBlockSettingWidget::showAutomaticFilterList(QListWidgetItem *item) -{ - if (item) { - QPointer dlg = new AdBlockShowListDialog(true, this); - dlg->setListName(item->text()); - dlg->setAdBlockListPath(item->data(PathList).toString(), item->data(UrlList).toString()); - connect(dlg.data(), &AdBlockShowListDialog::deleteList, this, &AdBlockSettingWidget::slotDeleteList); - dlg->exec(); - delete dlg; - } -} - -void AdBlockSettingWidget::slotDeleteList(const QString &listName) -{ - QListWidgetItem *item = mUi->automaticFiltersListWidget->currentItem(); - if (item && item->text() == listName) { - const QString path = item->data(PathList).toString(); - if (!path.isEmpty()) { - if (!QFile(path).remove()) { - qCDebug(MESSAGEVIEWER_LOG) << " we can not remove file:" << path; - } - } - delete item; - hasChanged(); - } -} - -void AdBlockSettingWidget::slotImportFilters() -{ - const QString filter = i18n("All Files (*)"); - const QString result = PimCommon::Util::loadToFile(filter, this, i18n("Import Filters")); - if (result.isEmpty()) { - return; - } - const QStringList listFilter = result.split(QLatin1Char('\n')); - QStringList excludeFilter; - const int numberOfElements(mUi->manualFiltersListWidget->count()); - excludeFilter.reserve(numberOfElements); - for (int i = 0; i < numberOfElements; ++i) { - QListWidgetItem *subItem = mUi->manualFiltersListWidget->item(i); - excludeFilter.append(subItem->text()); - } - - Q_FOREACH (const QString &element, listFilter) { - if (element == QLatin1String("\n")) { - continue; - } - if (excludeFilter.contains(element)) { - continue; - } - addManualFilter(element); - } -} - -void AdBlockSettingWidget::addManualFilter(const QString &text, const QStringList &excludeRules) -{ - QListWidgetItem *subItem = new QListWidgetItem(mUi->manualFiltersListWidget); - subItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled); - subItem->setCheckState(excludeRules.contains(text) ? Qt::Unchecked : Qt::Checked); - subItem->setText(text); -} - -void AdBlockSettingWidget::slotExportFilters() -{ - const QString filter = i18n("All Files (*)"); - QString exportFilters; - const int numberOfElement(mUi->manualFiltersListWidget->count()); - for (int i = 0; i < numberOfElement; ++i) { - QListWidgetItem *subItem = mUi->manualFiltersListWidget->item(i); - const QString stringRule = subItem->text(); - if (!stringRule.isEmpty()) { - exportFilters += stringRule + QLatin1Char('\n'); - } - } - PimCommon::Util::saveTextAs(exportFilters, filter, this, QUrl(), i18n("Export Filters")); -} - -void AdBlockSettingWidget::slotAutomaticFilterDouble(QListWidgetItem *item) -{ - showAutomaticFilterList(item); -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblocksettingwidget.h kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblocksettingwidget.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblocksettingwidget.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblocksettingwidget.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,91 +0,0 @@ -/* ============================================================ -* -* This file is a part of the rekonq project -* Copyright (c) 2013-2016 Montel Laurent -* based on code from rekonq -* Copyright (C) 2010-2012 by Andrea Diamantini -* -* -* 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) version 3 or any later version -* accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy -* defined in Section 14 of version 3 of the license. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* ============================================================ */ - -#ifndef AD_BLOCK_SETTINGS_WIDGET_H -#define AD_BLOCK_SETTINGS_WIDGET_H - -#include "messageviewer_export.h" - -// Qt Includes -#include - -class QListWidgetItem; - -namespace Ui -{ -class adblock; -} - -namespace MessageViewer -{ -class MESSAGEVIEWER_EXPORT AdBlockSettingWidget : public QWidget -{ - Q_OBJECT - -public: - explicit AdBlockSettingWidget(QWidget *parent = Q_NULLPTR); - virtual ~AdBlockSettingWidget(); - - bool changed() const; - - void save(); - void doLoadFromGlobalSettings(); - void doResetToDefaultsOther(); - -Q_SIGNALS: - void changed(bool); - -private Q_SLOTS: - void hasChanged(); - void slotInfoLinkActivated(const QString &); - void insertRule(); - void removeRule(); - void slotAddFilter(); - void slotRemoveSubscription(); - void slotUpdateButtons(); - void slotShowList(); - void slotImportFilters(); - void slotExportFilters(); - void slotUpdateManualButtons(); - void slotEditFilter(); - void slotManualFilterLineEditTextChanged(const QString &); - void slotAutomaticFilterDouble(QListWidgetItem *item); - void slotDeleteList(const QString &listName); -private: - void updateCheckBox(); - void addManualFilter(const QString &text, const QStringList &excludeRules = QStringList()); - void showAutomaticFilterList(QListWidgetItem *item); - enum List { - UrlList = Qt::UserRole + 1, - PathList = Qt::UserRole + 2, - LastUpdateList = Qt::UserRole + 3 - }; - Ui::adblock *mUi; - bool mChanged; -}; -} - -#endif // AD_BLOCK_SETTINGS_WIDGET_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockshowlistdialog.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockshowlistdialog.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockshowlistdialog.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockshowlistdialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,161 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "adblockshowlistdialog.h" -#include "adblocksyntaxhighlighter.h" -#include "kpimtextedit/plaintexteditorwidget.h" -#include "kpimtextedit/plaintexteditor.h" -#include "messageviewer_debug.h" -#include "Libkdepim/ProgressIndicatorLabel" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -using namespace MessageViewer; -AdBlockShowListDialog::AdBlockShowListDialog(bool showDeleteBrokenList, QWidget *parent) - : QDialog(parent), - mTemporaryFile(Q_NULLPTR), - mUser1Button(Q_NULLPTR) -{ - setWindowTitle(i18n("Show adblock list")); - QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); - QVBoxLayout *mainLayout = new QVBoxLayout; - setLayout(mainLayout); - connect(buttonBox, &QDialogButtonBox::rejected, this, &AdBlockShowListDialog::reject); - if (showDeleteBrokenList) { - mUser1Button = new QPushButton; - buttonBox->addButton(mUser1Button, QDialogButtonBox::ActionRole); - mUser1Button->setText(i18n("Delete List")); - mUser1Button->setEnabled(false); - mUser1Button->hide(); - connect(mUser1Button, &QPushButton::clicked, this, &AdBlockShowListDialog::slotDeleteBrokenList); - } - QWidget *w = new QWidget; - QVBoxLayout *lay = new QVBoxLayout; - mTextEdit = new KPIMTextEdit::PlainTextEditorWidget; - (void)new MessageViewer::AdBlockSyntaxHighlighter(mTextEdit->editor()->document()); - mTextEdit->setReadOnly(true); - lay->addWidget(mTextEdit); - - mProgress = new KPIM::ProgressIndicatorLabel(i18n("Download...")); - lay->addWidget(mProgress); - w->setLayout(lay); - mainLayout->addWidget(w); - mainLayout->addWidget(buttonBox); - readConfig(); -} - -AdBlockShowListDialog::~AdBlockShowListDialog() -{ - delete mTemporaryFile; - writeConfig(); -} - -void AdBlockShowListDialog::writeConfig() -{ - KConfigGroup group(KSharedConfig::openConfig(), "AdBlockShowListDialog"); - group.writeEntry("Size", size()); -} - -void AdBlockShowListDialog::readConfig() -{ - KConfigGroup group(KSharedConfig::openConfig(), "AdBlockShowListDialog"); - const QSize sizeDialog = group.readEntry("Size", QSize(800, 600)); - if (sizeDialog.isValid()) { - resize(sizeDialog); - } -} - -void AdBlockShowListDialog::setAdBlockListPath(const QString &localPath, const QString &url) -{ - if (localPath.isEmpty()) { - downLoadList(url); - } else { - QFile file(localPath); - if (file.open(QFile::ReadOnly | QFile::Text)) { - mTextEdit->editor()->setPlainText(QString::fromUtf8(file.readAll())); - } else { - downLoadList(url); - } - } -} - -void AdBlockShowListDialog::downLoadList(const QString &url) -{ - delete mTemporaryFile; - mTemporaryFile = new QTemporaryFile; - if (!mTemporaryFile->open()) { - qCDebug(MESSAGEVIEWER_LOG) << "can not open temporary file"; - delete mTemporaryFile; - mTemporaryFile = 0; - return; - } - QUrl subUrl(url); - - QUrl destUrl = QUrl::fromLocalFile(mTemporaryFile->fileName()); - - mProgress->start(); - KIO::FileCopyJob *job = KIO::file_copy(subUrl, destUrl, -1, KIO::HideProgressInfo | KIO::Overwrite); - KIO::MetaData metadata = job->metaData(); - metadata.insert(QStringLiteral("ssl_no_client_cert"), QStringLiteral("TRUE")); - metadata.insert(QStringLiteral("ssl_no_ui"), QStringLiteral("TRUE")); - metadata.insert(QStringLiteral("UseCache"), QStringLiteral("false")); - metadata.insert(QStringLiteral("cookies"), QStringLiteral("none")); - metadata.insert(QStringLiteral("no-auth"), QStringLiteral("true")); - job->setMetaData(metadata); - - connect(job, &KIO::FileCopyJob::finished, this, &AdBlockShowListDialog::slotFinished); -} - -void AdBlockShowListDialog::slotFinished(KJob *job) -{ - mProgress->stop(); - if (job->error()) { - mTextEdit->editor()->setPlainText(i18n("An error occurs during download list: \"%1\"", job->errorString())); - if (mUser1Button) { - mUser1Button->show(); - mUser1Button->setEnabled(true); - } - } else { - QFile f(mTemporaryFile->fileName()); - if (f.open(QIODevice::ReadOnly | QIODevice::Text)) { - mTextEdit->editor()->setPlainText(QString::fromUtf8(f.readAll())); - } - } - mTemporaryFile->close(); - delete mTemporaryFile; - mTemporaryFile = 0; -} - -void AdBlockShowListDialog::slotDeleteBrokenList() -{ - Q_EMIT deleteList(mListName); - accept(); -} - -void AdBlockShowListDialog::setListName(const QString &listName) -{ - mListName = listName; -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockshowlistdialog.h kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockshowlistdialog.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockshowlistdialog.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockshowlistdialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef ADBLOCKSHOWLISTDIALOG_H -#define ADBLOCKSHOWLISTDIALOG_H - -#include - -class KJob; -class QTemporaryFile; - -namespace KPIM -{ -class ProgressIndicatorLabel; -} - -namespace KPIMTextEdit -{ -class PlainTextEditorWidget; -} -class QPushButton; -namespace MessageViewer -{ -class AdBlockShowListDialog : public QDialog -{ - Q_OBJECT -public: - explicit AdBlockShowListDialog(bool showDeleteBrokenList, QWidget *parent = Q_NULLPTR); - ~AdBlockShowListDialog(); - - void setAdBlockListPath(const QString &localPath, const QString &url); - - void setListName(const QString &listName); -private Q_SLOTS: - void slotFinished(KJob *job); - void slotDeleteBrokenList(); - -Q_SIGNALS: - void deleteList(const QString &name); - -private: - void readConfig(); - void writeConfig(); - void downLoadList(const QString &url); - - QString mListName; - KPIMTextEdit::PlainTextEditorWidget *mTextEdit; - QTemporaryFile *mTemporaryFile; - KPIM::ProgressIndicatorLabel *mProgress; - QPushButton *mUser1Button; -}; -} - -#endif // ADBLOCKSHOWLISTDIALOG_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblocksyntaxhighlighter.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblocksyntaxhighlighter.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblocksyntaxhighlighter.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblocksyntaxhighlighter.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "adblocksyntaxhighlighter.h" - -using namespace MessageViewer; - -AdBlockSyntaxHighlighter::AdBlockSyntaxHighlighter(QTextDocument *doc) - : KPIMTextEdit::SyntaxHighlighterBase(doc) -{ - init(); -} - -AdBlockSyntaxHighlighter::~AdBlockSyntaxHighlighter() -{ -} - -void AdBlockSyntaxHighlighter::init() -{ - QTextCharFormat commentFormat; - commentFormat.setForeground(Qt::darkYellow); - QRegularExpression commentRegex(QStringLiteral("^!.*")); - m_rules.append(KPIMTextEdit::Rule(commentRegex, commentFormat)); - - QTextCharFormat exceptionFormat; - exceptionFormat.setForeground(Qt::magenta); - QRegularExpression exceptionRegex(QStringLiteral("^@@.*")); - m_rules.append(KPIMTextEdit::Rule(exceptionRegex, exceptionFormat)); - - QTextCharFormat headerFormat; - headerFormat.setForeground(Qt::red); - QRegularExpression headerRegex(QStringLiteral("^\\[.*")); - m_rules.append(KPIMTextEdit::Rule(headerRegex, headerFormat)); - - QTextCharFormat elementFormat; - elementFormat.setForeground(Qt::blue); - QRegularExpression elementRegex(QStringLiteral(".*##.*")); - m_rules.append(KPIMTextEdit::Rule(elementRegex, elementFormat)); -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblocksyntaxhighlighter.h kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblocksyntaxhighlighter.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblocksyntaxhighlighter.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblocksyntaxhighlighter.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef ADBLOCKSYNTAXHIGHLIGHTER_H -#define ADBLOCKSYNTAXHIGHLIGHTER_H - -#include - -namespace MessageViewer -{ -class AdBlockSyntaxHighlighter : public KPIMTextEdit::SyntaxHighlighterBase -{ - Q_OBJECT -public: - explicit AdBlockSyntaxHighlighter(QTextDocument *doc); - ~AdBlockSyntaxHighlighter(); - -private: - void init() Q_DECL_OVERRIDE; -}; -} - -#endif // ADBLOCKSYNTAXHIGHLIGHTER_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockutil.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockutil.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockutil.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockutil.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "adblockutil.h" - -#include - -QMap MessageViewer::AdBlockUtil::listSubscriptions() -{ - QMap lst; - lst.insert(QStringLiteral("EasyList"), QStringLiteral("https://easylist-downloads.adblockplus.org/easylist.txt")); - lst.insert(QStringLiteral("EasyList without element hiding"), QStringLiteral("https://easylist-downloads.adblockplus.org/easylist_noelemhide.txt")); - lst.insert(QStringLiteral("Corset"), QStringLiteral("http://brianyi.com/corset.txt")); - lst.insert(QStringLiteral("EasyList Germany+EasyList"), QStringLiteral("https://easylist-downloads.adblockplus.org/ares+easylist.txt")); - lst.insert(QStringLiteral("EasyList Germany"), QStringLiteral("https://easylist-downloads.adblockplus.org/easylistgermany.txt")); - lst.insert(QStringLiteral("Liste FR+EasyList"), QStringLiteral("https://easylist-downloads.adblockplus.org/liste_fr+easylist.txt")); - lst.insert(QStringLiteral("Liste FR"), QStringLiteral("http://lian.info.tm/liste_fr.txt")); - lst.insert(QStringLiteral("ROList+EasyList"), QStringLiteral("https://easylist-downloads.adblockplus.org/rolist+easylist.txt")); - lst.insert(QStringLiteral("ROList"), QStringLiteral("http://www.picpoc.ro/menetzrolist.txt")); - lst.insert(QStringLiteral("Việt Nam List"), QStringLiteral("http://adblockplus-vietnam.googlecode.com/svn/trunk/abpvn.txt")); - lst.insert(QStringLiteral("AdblockList.org"), QStringLiteral("http://adblocklist.org/adblock-pxf-polish.txt")); - lst.insert(QStringLiteral("Bulgarian list"), QStringLiteral("http://stanev.org/abp/adblock_bg.txt")); - lst.insert(QStringLiteral("EasyPrivacy+EasyList"), QStringLiteral("https://easylist-downloads.adblockplus.org/easyprivacy+easylist.txt")); - lst.insert(QStringLiteral("EasyPrivacy+Cédrics Liste"), QStringLiteral("https://easylist-downloads.adblockplus.org/easyprivacy+cedrics.txt")); - lst.insert(QStringLiteral("EasyPrivacy"), QStringLiteral("https://easylist-downloads.adblockplus.org/easyprivacy.txt")); - lst.insert(QStringLiteral("void.gr"), QStringLiteral("http://www.void.gr/kargig/void-gr-filters.txt")); - //lst.insert(QStringLiteral("Wiltteri"), QStringLiteral("http://www.wiltteri.net/wiltteri.txt")); - lst.insert(QStringLiteral("ChinaList"), QStringLiteral("http://adblock-chinalist.googlecode.com/svn/trunk/adblock.txt")); - lst.insert(QStringLiteral("Filter von Dr.Evil"), QStringLiteral("http://adblock.maltekraus.de/adblock.txt")); - lst.insert(QStringLiteral("RuAdList"), QStringLiteral("http://ruadlist.googlecode.com/svn/trunk/adblock.txt")); - //lst.insert(QStringLiteral("AdblockRules.org"), QStringLiteral("http://adblockrules.org/download.php?typeall")); - lst.insert(QStringLiteral("BSI Lista Polska"), QStringLiteral("http://www.bsi.info.pl/filtrABP.txt")); - lst.insert(QStringLiteral("Czech List"), QStringLiteral("http://dajbych.net/adblock.txt")); - lst.insert(QStringLiteral("Cédrics Liste"), QStringLiteral("http://chewey.de/mozilla/data/adblock.txt")); - lst.insert(QStringLiteral("Fanboy's List"), QStringLiteral("http://www.fanboy.co.nz/adblock/fanboy-adblocklist-current-expanded.txt")); - lst.insert(QStringLiteral("Filter von MonztA"), QStringLiteral("http://monzta.maltekraus.de/adblock.txt")); - lst.insert(QStringLiteral("hufilter"), QStringLiteral("http://pete.teamlupus.hu/hufilter.txt")); - lst.insert(QStringLiteral("Iceland List"), QStringLiteral("http://adblock-iceland.googlecode.com/files/icelandic%20filter.txt")); - lst.insert(QStringLiteral("Japanese General Filter"), QStringLiteral("http://adblock-plus-japanese-filter.googlecode.com/svn/trunk/abp_jp_general.txt")); - lst.insert(QStringLiteral("Japanese Site-Specific Filter"), QStringLiteral("http://adblock-plus-japanese-filter.googlecode.com/svn/trunk/abp_jp_site_specific.txt")); - lst.insert(QStringLiteral("NLBlock"), QStringLiteral("http://www.verzijlbergh.com/adblock/nlblock.txt")); - lst.insert(QStringLiteral("PLgeneral"), QStringLiteral("http://www.niecko.pl/adblock/adblock.txt")); - lst.insert(QStringLiteral("Schacks Adblock Plus liste"), QStringLiteral("http://adblock.schack.dk/block.txt")); - lst.insert(QStringLiteral("Xfiles"), QStringLiteral("http://mozilla.gfsolone.com/filtri.txt")); - lst.insert(QStringLiteral("adblock.free.fr"), QStringLiteral("http://adblock.free.fr/adblock.txt")); - lst.insert(QStringLiteral("adblock.free.fr basic (bloque les pubs uniquement)"), QStringLiteral("http://adblock.free.fr/adblock_basic.txt")); - lst.insert(QStringLiteral("Ajnasz's list"), QStringLiteral("http://ajnasz.hu/adblock/recent")); - lst.insert(QStringLiteral("Schuzak's Universal Filter"), QStringLiteral("http://www.schuzak.jp/other/abp.txt")); - lst.insert(QStringLiteral("Rickroll Blacklist"), QStringLiteral("http://rickrolldb.com/ricklist.txt")); - lst.insert(QStringLiteral("Corset+EasyList"), QStringLiteral("https://easylist-downloads.adblockplus.org/corset+easylist.txt")); - return lst; -} - -QString MessageViewer::AdBlockUtil::localFilterPath() -{ - return QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QStringLiteral("/kmail2/adblockrules_local"); -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockutil.h kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockutil.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/adblockutil.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/adblockutil.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef ADBLOCKUTIL_H -#define ADBLOCKUTIL_H - -#include -#include - -namespace MessageViewer -{ -namespace AdBlockUtil -{ -QMap listSubscriptions(); - -QString localFilterPath(); - -} -} - -#endif // ADBLOCKUTIL_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/autotests/adblockaddsubscriptiondialogtest.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/common/autotests/adblockaddsubscriptiondialogtest.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/autotests/adblockaddsubscriptiondialogtest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/autotests/adblockaddsubscriptiondialogtest.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "adblockaddsubscriptiondialogtest.h" -#include "../adblockaddsubscriptiondialog.h" -#include "../adblockutil.h" -#include -#include -#include -#include -#include - -AdBlockAddSubscriptionDialogTest::AdBlockAddSubscriptionDialogTest(QObject *parent) - : QObject(parent) -{ - -} - -AdBlockAddSubscriptionDialogTest::~AdBlockAddSubscriptionDialogTest() -{ - -} - -void AdBlockAddSubscriptionDialogTest::shouldHaveDefaultValue() -{ - QStringList lst; - MessageViewer::AdBlockAddSubscriptionDialog w(lst); - - QLabel *lab = w.findChild(QStringLiteral("listsubscriptionlabel")); - QVERIFY(lab); - - QComboBox *listSubscription = w.findChild(QStringLiteral("listsubscriptioncombobox")); - QVERIFY(listSubscription); - QVERIFY(listSubscription->count() > 0); - - QDialogButtonBox *buttonBox = w.findChild(QStringLiteral("listsubscriptionbuttonBox")); - QVERIFY(buttonBox); - - QToolButton *showList = w.findChild(QStringLiteral("showlisttoolbutton")); - QVERIFY(showList); -} - -void AdBlockAddSubscriptionDialogTest::shouldExcludeAllList() -{ - QStringList lst = MessageViewer::AdBlockUtil::listSubscriptions().keys(); - MessageViewer::AdBlockAddSubscriptionDialog w(lst); - QComboBox *listSubscription = w.findChild(QStringLiteral("listsubscriptioncombobox")); - QCOMPARE(listSubscription->count(), 0); -} - -QTEST_MAIN(AdBlockAddSubscriptionDialogTest) diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/autotests/adblockaddsubscriptiondialogtest.h kf5-messagelib-16.12.3/messageviewer/src/adblock/common/autotests/adblockaddsubscriptiondialogtest.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/autotests/adblockaddsubscriptiondialogtest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/autotests/adblockaddsubscriptiondialogtest.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef ADBLOCKADDSUBSCRIPTIONDIALOGTEST_H -#define ADBLOCKADDSUBSCRIPTIONDIALOGTEST_H - -#include - -class AdBlockAddSubscriptionDialogTest : public QObject -{ - Q_OBJECT -public: - explicit AdBlockAddSubscriptionDialogTest(QObject *parent = Q_NULLPTR); - ~AdBlockAddSubscriptionDialogTest(); - -private Q_SLOTS: - void shouldHaveDefaultValue(); - void shouldExcludeAllList(); -}; - -#endif // ADBLOCKADDSUBSCRIPTIONDIALOGTEST_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/autotests/adblockautomaticruleslistwidgettest.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/common/autotests/adblockautomaticruleslistwidgettest.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/autotests/adblockautomaticruleslistwidgettest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/autotests/adblockautomaticruleslistwidgettest.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "adblockautomaticruleslistwidgettest.h" -#include "../adblockautomaticruleslistwidget.h" -#include - -AdBlockAutomaticRulesListWidgetTest::AdBlockAutomaticRulesListWidgetTest(QObject *parent) - : QObject(parent) -{ - -} - -AdBlockAutomaticRulesListWidgetTest::~AdBlockAutomaticRulesListWidgetTest() -{ - -} - -void AdBlockAutomaticRulesListWidgetTest::shouldHaveDefaultValue() -{ - MessageViewer::AdBlockAutomaticRulesListWidget w; - QCOMPARE(w.count(), 0); -} - -void AdBlockAutomaticRulesListWidgetTest::shouldCreateRules_data() -{ - QTest::addColumn("rules"); - QTest::addColumn("numberOfItem"); - QTest::newRow("notest") << QString() << 0; -} - -void AdBlockAutomaticRulesListWidgetTest::shouldCreateRules() -{ - QFETCH(QString, rules); - QFETCH(int, numberOfItem); - - MessageViewer::AdBlockAutomaticRulesListWidget w; - w.setRules(rules); - QCOMPARE(w.count(), numberOfItem); -} - -QTEST_MAIN(AdBlockAutomaticRulesListWidgetTest) diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/autotests/adblockautomaticruleslistwidgettest.h kf5-messagelib-16.12.3/messageviewer/src/adblock/common/autotests/adblockautomaticruleslistwidgettest.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/autotests/adblockautomaticruleslistwidgettest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/autotests/adblockautomaticruleslistwidgettest.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef ADBLOCKAUTOMATICRULESLISTWIDGETTEST_H -#define ADBLOCKAUTOMATICRULESLISTWIDGETTEST_H - -#include - -class AdBlockAutomaticRulesListWidgetTest : public QObject -{ - Q_OBJECT -public: - explicit AdBlockAutomaticRulesListWidgetTest(QObject *parent = Q_NULLPTR); - ~AdBlockAutomaticRulesListWidgetTest(); -private Q_SLOTS: - void shouldHaveDefaultValue(); - void shouldCreateRules_data(); - void shouldCreateRules(); -}; - -#endif // ADBLOCKAUTOMATICRULESLISTWIDGETTEST_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/autotests/CMakeLists.txt kf5-messagelib-16.12.3/messageviewer/src/adblock/common/autotests/CMakeLists.txt --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/autotests/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/autotests/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -set(adblock_autotest_common_SRCS) -ecm_qt_declare_logging_category(adblock_autotest_common_SRCS HEADER messageviewer_debug.h IDENTIFIER MESSAGEVIEWER_LOG CATEGORY_NAME log_messageviewer) -set( adblockaddsubscriptiondialogtest_SRCS ${adblock_autotest_common_SRCS} adblockaddsubscriptiondialogtest.cpp ../adblockaddsubscriptiondialog.cpp ../adblockutil.cpp ../adblockshowlistdialog.cpp ../adblocksyntaxhighlighter.cpp) -add_executable( adblockaddsubscriptiondialogtest ${adblockaddsubscriptiondialogtest_SRCS}) -add_test(adblockaddsubscriptiondialogtest adblockaddsubscriptiondialogtest) -ecm_mark_as_test(adblockaddsubscriptiondialogtest) -target_link_libraries( adblockaddsubscriptiondialogtest Qt5::Test Qt5::Widgets KF5::I18n KF5::ConfigCore KF5::PimTextEdit KF5::MessageViewer KF5::Libkdepim) - - -set( adblockautomaticruleslistwidgettest_SRCS adblockautomaticruleslistwidgettest.cpp ../adblockautomaticruleslistwidget.cpp) -add_executable( adblockautomaticruleslistwidgettest ${adblockautomaticruleslistwidgettest_SRCS}) -add_test(adblockautomaticruleslistwidgettest adblockautomaticruleslistwidgettest) -ecm_mark_as_test(adblockautomaticruleslistwidgettest) -target_link_libraries( adblockautomaticruleslistwidgettest Qt5::Test Qt5::Widgets KF5::MessageViewer) diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/matcher/adblockhostmatcher.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/common/matcher/adblockhostmatcher.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/matcher/adblockhostmatcher.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/matcher/adblockhostmatcher.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,96 +0,0 @@ -/* ============================================================ -* -* This file is a part of the rekonq project -* Copyright (c) 2013-2016 Montel Laurent -* based on code from rekonq -* Copyright (C) 2010-2011 by Benjamin Poulain -* Copyright (C) 2012 by Andrea Diamantini -* -* -* 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) version 3 or any later version -* accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy -* defined in Section 14 of version 3 of the license. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* ============================================================ */ - -// Self Includes -#include "adblockhostmatcher.h" - -using namespace MessageViewer; -bool AdBlockHostMatcher::tryAddFilter(const QString &filter) -{ - if (filter.startsWith(QStringLiteral("||"))) { - QString domain = filter.mid(2); - - if (!domain.endsWith(QLatin1Char('^'))) { - return false; - } - - if (domain.contains(QLatin1Char('$'))) { - return false; - } - - domain = domain.left(domain.size() - 1); - - if (domain.contains(QLatin1Char('/')) || domain.contains(QLatin1Char('*')) || domain.contains(QLatin1Char('^'))) { - return false; - } - - domain = domain.toLower(); - m_hostList.insert(domain); - return true; - } - - if (filter.startsWith(QStringLiteral("@@"))) { - QString domain = filter.mid(2); - - if (domain.contains(QLatin1Char('^'))) { - return false; - } - - if (domain.contains(QLatin1Char('$'))) { - return false; - } - - if (domain.contains(QLatin1Char('*'))) { - return false; - } - - if (domain.contains(QLatin1Char('|'))) { - return false; - } - - if (domain.contains(QLatin1Char('/'))) { - if (!domain.endsWith(QLatin1Char('/'))) { - return false; - } - } - domain = domain.toLower(); - m_hostList.insert(domain); - return true; - } - - return false; -} - -bool AdBlockHostMatcher::match(const QString &host) const -{ - return m_hostList.contains(host.toLower()); -} - -void AdBlockHostMatcher::clear() -{ - m_hostList.clear(); -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/matcher/adblockhostmatcher.h kf5-messagelib-16.12.3/messageviewer/src/adblock/common/matcher/adblockhostmatcher.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/matcher/adblockhostmatcher.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/matcher/adblockhostmatcher.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -/* ============================================================ -* -* This file is a part of the rekonq project -* Copyright (c) 2013-2016 Montel Laurent -* based on code from rekonq -* Copyright (C) 2010-2011 by Benjamin Poulain -* Copyright (C) 2012 by Andrea Diamantini -* -* -* 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) version 3 or any later version -* accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy -* defined in Section 14 of version 3 of the license. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* ============================================================ */ - -#ifndef ADBLOCKHOSTMATCHER_H -#define ADBLOCKHOSTMATCHER_H - -#include -#include - -namespace MessageViewer -{ -class AdBlockHostMatcher -{ -public: - // Try to add an adblock filter to this host matcher. - // If the filter is not an hostname, the filter is not added - // and the method return false; - bool tryAddFilter(const QString &filter); - - bool match(const QString &host) const; - - void clear(); - -private: - QSet m_hostList; -}; -} - -#endif // ADBLOCKHOSTMATCHER_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/matcher/adblockrule.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/common/matcher/adblockrule.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/matcher/adblockrule.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/matcher/adblockrule.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,78 +0,0 @@ -/* ============================================================ - * - * This file is a part of the rekonq project - * Copyright (c) 2013-2016 Montel Laurent - * based on code from rekonq - * Copyright (c) 2009 by Zsombor Gegesy - * Copyright (c) 2009 by Benjamin C. Meyer - * Copyright (C) 2010-2012 by Andrea Diamantini - * - * - * 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) version 3 or any later version - * accepted by the membership of KDE e.V. (or its successor approved - * by the membership of KDE e.V.), which shall act as a proxy - * defined in Section 14 of version 3 of the license. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * ============================================================ */ - -// Self Includes -#include "adblockrule.h" -#include "messageviewer_debug.h" - -// Local Includes -#include "../../adblockrulefallbackimpl.h" -#include "adblockrulenullimpl.h" -#include "adblockruletextmatchimpl.h" - -using namespace MessageViewer; -AdBlockRule::AdBlockRule(const QString &filter) -{ - switch (AdBlockRule::ruleType(filter)) { - case TextRule: - m_implementation = QSharedPointer(new AdBlockRuleTextMatchImpl(filter)); - break; - - case FallbackRule: - m_implementation = QSharedPointer(new AdBlockRuleFallbackImpl(filter)); - break; - - case NullRule: - default: - m_implementation = QSharedPointer(new AdBlockRuleNullImpl(filter)); - break; - } -} - -RuleTypes AdBlockRule::ruleType(const QString &filter) -{ - if (AdBlockRuleTextMatchImpl::isTextMatchFilter(filter)) { - return TextRule; - } - - if (AdBlockRuleNullImpl::isNullFilter(filter)) { - return NullRule; - } - - return FallbackRule; -} - -bool AdBlockRule::match(const QNetworkRequest &request, const QString &encodedUrl, const QString &encodedUrlLowerCase) const -{ - Q_ASSERT(encodedUrl.toLower() == encodedUrlLowerCase); - const bool b = m_implementation->match(request, encodedUrl, encodedUrlLowerCase); - if (b) { - qCDebug(MESSAGEVIEWER_LOG) << m_implementation->ruleType() << ": rule string = " << m_implementation->ruleString(); - } - return b; -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/matcher/adblockrule.h kf5-messagelib-16.12.3/messageviewer/src/adblock/common/matcher/adblockrule.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/matcher/adblockrule.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/matcher/adblockrule.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -/* - * This file is a part of the rekonq project - * Copyright (c) 2013-2016 Montel Laurent - * based on code from rekonq - * Copyright (c) 2009 by Benjamin C. Meyer - * Copyright (C) 2010-2012 by Andrea Diamantini - * - * - * 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) version 3 or any later version - * accepted by the membership of KDE e.V. (or its successor approved - * by the membership of KDE e.V.), which shall act as a proxy - * defined in Section 14 of version 3 of the license. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * ============================================================ */ - -#ifndef ADBLOCKRULE_H -#define ADBLOCKRULE_H - -#include "../../adblockruleimpl.h" - -#include - -// Forward Includes -class QNetworkRequest; -class QString; - -namespace MessageViewer -{ -enum RuleTypes { - TextRule, - FallbackRule, - NullRule -}; - -class AdBlockRule -{ -public: - explicit AdBlockRule(const QString &filter); - - bool match(const QNetworkRequest &request, const QString &encodedUrl, const QString &encodedUrlLowerCase) const; - - static RuleTypes ruleType(const QString &filter); - -private: - QSharedPointer m_implementation; -}; -} - -#endif // ADBLOCKRULE_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/matcher/adblockrulenullimpl.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/common/matcher/adblockrulenullimpl.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/matcher/adblockrulenullimpl.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/matcher/adblockrulenullimpl.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,147 +0,0 @@ -/* ============================================================ -* -* This file is a part of the rekonq project -* Copyright (c) 2013-2016 Montel Laurent -* based on code from rekonq -* Copyright (C) 2011-2012 by Andrea Diamantini -* -* -* 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) version 3 or any later version -* accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy -* defined in Section 14 of version 3 of the license. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* ============================================================ */ - -// Self Includes -#include "adblockrulenullimpl.h" - -// Qt Includes -#include - -using namespace MessageViewer; -AdBlockRuleNullImpl::AdBlockRuleNullImpl(const QString &filter) - : AdBlockRuleImpl(filter) -{ -} - -bool AdBlockRuleNullImpl::match(const QNetworkRequest &, const QString &, const QString &) const -{ - return false; -} - -bool AdBlockRuleNullImpl::isNullFilter(const QString &filter) -{ - QString parsedLine = filter; - - const int optionsNumber = parsedLine.lastIndexOf(QLatin1Char('$')); - if (optionsNumber == 0) { - return false; - } - - const QStringList options(parsedLine.mid(optionsNumber + 1).split(QLatin1Char(','))); - - Q_FOREACH (const QString &option, options) { - // NOTE: - // I moved the check from option == QLatin1String to option.endsWith() - // to check option && ~option. Hope it will NOT be a problem... - - // third_party: managed inside adblockrulefallbackimpl - if (option.endsWith(QStringLiteral("third-party"))) { - return false; - } - - // script - if (option.endsWith(QStringLiteral("script"))) { - return true; - } - - // image - if (option.endsWith(QStringLiteral("image"))) { - return true; - } - - // background - if (option.endsWith(QStringLiteral("background"))) { - return true; - } - - // stylesheet - if (option.endsWith(QStringLiteral("stylesheet"))) { - return true; - } - - // object - if (option.endsWith(QStringLiteral("object"))) { - return true; - } - - // xbl - if (option.endsWith(QStringLiteral("xbl"))) { - return true; - } - - // ping - if (option.endsWith(QStringLiteral("ping"))) { - return true; - } - - // xmlhttprequest - if (option.endsWith(QStringLiteral("xmlhttprequest"))) { - return true; - } - - // object_subrequest - if (option.endsWith(QStringLiteral("object-subrequest"))) { - return true; - } - - // dtd - if (option.endsWith(QStringLiteral("dtd"))) { - return true; - } - - // subdocument - if (option.endsWith(QStringLiteral("subdocument"))) { - return true; - } - - // document - if (option.endsWith(QStringLiteral("document"))) { - return true; - } - - // other - if (option.endsWith(QStringLiteral("other"))) { - return true; - } - - // collapse - if (option.endsWith(QStringLiteral("collapse"))) { - return true; - } - } - - return false; -} - -QString AdBlockRuleNullImpl::ruleString() const -{ - return QString(); -} - -QString AdBlockRuleNullImpl::ruleType() const -{ - return QStringLiteral("AdBlockRuleNullImpl"); -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/matcher/adblockrulenullimpl.h kf5-messagelib-16.12.3/messageviewer/src/adblock/common/matcher/adblockrulenullimpl.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/matcher/adblockrulenullimpl.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/matcher/adblockrulenullimpl.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -/* ============================================================ -* -* This file is a part of the rekonq project -* Copyright (c) 2013-2016 Montel Laurent -* based on code from rekonq -* Copyright (C) 2011-2012 by Andrea Diamantini -* -* -* 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) version 3 or any later version -* accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy -* defined in Section 14 of version 3 of the license. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* ============================================================ */ - -#ifndef ADBLOCKRULE_NULL_IMPL_H -#define ADBLOCKRULE_NULL_IMPL_H - -// Local Includes -#include "../../adblockruleimpl.h" - -// Qt Includes -#include - -namespace MessageViewer -{ -class AdBlockRuleNullImpl : public AdBlockRuleImpl -{ - -public: - explicit AdBlockRuleNullImpl(const QString &filter); - - bool match(const QNetworkRequest &, const QString &, const QString &) const Q_DECL_OVERRIDE; - - static bool isNullFilter(const QString &filter); - - QString ruleString() const Q_DECL_OVERRIDE; - QString ruleType() const Q_DECL_OVERRIDE; -}; -} - -#endif // ADBLOCKRULE_NULL_IMPL_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/matcher/adblockruletextmatchimpl.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/common/matcher/adblockruletextmatchimpl.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/matcher/adblockruletextmatchimpl.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/matcher/adblockruletextmatchimpl.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,95 +0,0 @@ -/* ============================================================ -* -* This file is a part of the rekonq project -* Copyright (c) 2013-2016 Montel Laurent -* based on code from rekonq -* Copyright (C) 2010-2011 by Benjamin Poulain -* Copyright (C) 2010-2013 by Andrea Diamantini -* -* -* 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) version 3 or any later version -* accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy -* defined in Section 14 of version 3 of the license. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* ============================================================ */ - -// Self Includes -#include "adblockruletextmatchimpl.h" - -// Qt Includes -#include - -using namespace MessageViewer; -AdBlockRuleTextMatchImpl::AdBlockRuleTextMatchImpl(const QString &filter) - : AdBlockRuleImpl(filter) -{ - Q_ASSERT(AdBlockRuleTextMatchImpl::isTextMatchFilter(filter)); - - m_textToMatch = filter.toLower(); - m_textToMatch.remove(QLatin1Char('*')); -} - -bool AdBlockRuleTextMatchImpl::match(const QNetworkRequest &request, const QString &encodedUrl, const QString &encodedUrlLowerCase) const -{ - Q_UNUSED(request); - Q_UNUSED(encodedUrl); - if (m_textToMatch.isEmpty()) { - return false; - } - - // Case sensitive compare is faster, but would be incorrect with encodedUrl since - // we do want case insensitive. - // What we do is work on a lowercase version of m_textToMatch, and compare to the lowercase - // version of encodedUrl. - return encodedUrlLowerCase.contains(m_textToMatch, Qt::CaseSensitive); -} - -bool AdBlockRuleTextMatchImpl::isTextMatchFilter(const QString &filter) -{ - // We don't deal with options just yet - if (filter.contains(QLatin1Char('$'))) { - return false; - } - - // We don't deal with element matching - if (filter.contains(QStringLiteral("##"))) { - return false; - } - - // We don't deal with the begin-end matching - if (filter.startsWith(QLatin1Char('|')) || filter.endsWith(QLatin1Char('|'))) { - return false; - } - - // We only handle * at the beginning or the end - int starPosition = filter.indexOf(QLatin1Char('*')); - while (starPosition >= 0) { - if (starPosition != 0 && starPosition != (filter.length() - 1)) { - return false; - } - starPosition = filter.indexOf(QLatin1Char('*'), starPosition + 1); - } - return true; -} - -QString AdBlockRuleTextMatchImpl::ruleString() const -{ - return m_textToMatch; -} - -QString AdBlockRuleTextMatchImpl::ruleType() const -{ - return QStringLiteral("AdBlockRuleTextMatchImpl"); -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/common/matcher/adblockruletextmatchimpl.h kf5-messagelib-16.12.3/messageviewer/src/adblock/common/matcher/adblockruletextmatchimpl.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/common/matcher/adblockruletextmatchimpl.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/common/matcher/adblockruletextmatchimpl.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -/* ============================================================ -* -* This file is a part of the rekonq project -* Copyright (c) 2013-2016 Montel Laurent -* based on code from rekonq -* Copyright (C) 2010-2011 by Benjamin Poulain -* Copyright (C) 2010-2013 by Andrea Diamantini -* -* -* 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) version 3 or any later version -* accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy -* defined in Section 14 of version 3 of the license. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* ============================================================ */ - -#ifndef ADBLOCKRULETEXTMATCHIMPL_H -#define ADBLOCKRULETEXTMATCHIMPL_H - -#include "../../adblockruleimpl.h" - -// Qt Includes -#include - -namespace MessageViewer -{ -// Simple rule to find a string in the URL -class AdBlockRuleTextMatchImpl : public AdBlockRuleImpl -{ -public: - explicit AdBlockRuleTextMatchImpl(const QString &filter); - - bool match(const QNetworkRequest &request, const QString &encodedUrl, const QString &encodedUrlLowerCase) const Q_DECL_OVERRIDE; - - static bool isTextMatchFilter(const QString &filter); - - QString ruleString() const Q_DECL_OVERRIDE; - QString ruleType() const Q_DECL_OVERRIDE; - -private: - QString m_textToMatch; -}; -} - -#endif // ADBLOCKRULETEXTMATCHIMPL_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/tests/adblockautomaticruleslistwidget_gui.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/tests/adblockautomaticruleslistwidget_gui.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/tests/adblockautomaticruleslistwidget_gui.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/tests/adblockautomaticruleslistwidget_gui.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "adblockautomaticruleslistwidget_gui.h" -#include "../common/adblockautomaticruleslistwidget.h" - -#include -#include -#include -#include -#include -#include -#include - -AdBlockAutomaticRulesListWidgetTest::AdBlockAutomaticRulesListWidgetTest(const QString &fileName, QWidget *parent) - : QWidget(parent) -{ - QVBoxLayout *lay = new QVBoxLayout(this); - QFile localFile(fileName); - QString adblockList; - if (localFile.open(QIODevice::ReadOnly | QIODevice::Text)) { - adblockList = QString::fromLatin1(localFile.readAll()); - } - MessageViewer::AdBlockAutomaticRulesListWidget *list = new MessageViewer::AdBlockAutomaticRulesListWidget(this); - list->setRules(adblockList); - lay->addWidget(list); -} - -AdBlockAutomaticRulesListWidgetTest::~AdBlockAutomaticRulesListWidgetTest() -{ -} - -int main(int argc, char **argv) -{ - QApplication app(argc, argv); - QStandardPaths::setTestModeEnabled(true); - KAboutData aboutData(QStringLiteral("AdBlockAutomaticRulesListWidget_gui"), i18n("AdBlockAutomaticRulesListWidget_Gui"), QStringLiteral("1.0")); - aboutData.setShortDescription(i18n("Test for AdBlockAutomaticRulesListWidget")); - QCommandLineParser parser; - KAboutData::setApplicationData(aboutData); - parser.addVersionOption(); - parser.addHelpOption(); - parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("+[url]"), i18n("URL of adblock file list"))); - - aboutData.setupCommandLine(&parser); - parser.process(app); - aboutData.processCommandLine(&parser); - - QString fileName; - if (parser.positionalArguments().count()) { - fileName = parser.positionalArguments().at(0); - } else { - fileName = QFileDialog::getOpenFileName(0, QString(), QString(), i18n("Adblock File (*)")); - } - if (fileName.isEmpty()) { - return 0; - } - - AdBlockAutomaticRulesListWidgetTest *w = new AdBlockAutomaticRulesListWidgetTest(fileName); - - w->resize(800, 600); - w->show(); - app.exec(); - delete w; - return 0; -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/tests/adblockautomaticruleslistwidget_gui.h kf5-messagelib-16.12.3/messageviewer/src/adblock/tests/adblockautomaticruleslistwidget_gui.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/tests/adblockautomaticruleslistwidget_gui.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/tests/adblockautomaticruleslistwidget_gui.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef TEST_ADBLOCKAUTOMATICRULESLISTWIDGET_GUI_H -#define TEST_ADBLOCKAUTOMATICRULESLISTWIDGET_GUI_H - -#include - -class AdBlockAutomaticRulesListWidgetTest : public QWidget -{ - Q_OBJECT -public: - explicit AdBlockAutomaticRulesListWidgetTest(const QString &fileName, QWidget *parent = Q_NULLPTR); - ~AdBlockAutomaticRulesListWidgetTest(); -}; - -#endif diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/tests/adblockblockableitemdialog_gui.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/tests/adblockblockableitemdialog_gui.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/tests/adblockblockableitemdialog_gui.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/tests/adblockblockableitemdialog_gui.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,112 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "adblockblockableitemdialog_gui.h" -#include "adblock/adblockblockableitemswidget.h" -#include "Libkdepim/ProgressIndicatorLabel" -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -AdBlockBlockableItemTestDialog::AdBlockBlockableItemTestDialog(const QString &filename, QWidget *parent) - : QWidget(parent) -{ - QVBoxLayout *lay = new QVBoxLayout; - - mWidget = new MessageViewer::AdBlockBlockableItemsWidget; - lay->addWidget(mWidget); - - mProgress = new KPIM::ProgressIndicatorLabel(i18n("Rendering page...")); - lay->addWidget(mProgress); - - QHBoxLayout *hbox = new QHBoxLayout; - QPushButton *openFile = new QPushButton(i18n("Open html...")); - connect(openFile, &QPushButton::clicked, this, &AdBlockBlockableItemTestDialog::slotOpenHtml); - hbox->addWidget(openFile); - lay->addLayout(hbox); - - setLayout(lay); - connect(&page, &QWebPage::loadFinished, this, &AdBlockBlockableItemTestDialog::slotLoadFinished); - mProgress->start(); - page.mainFrame()->load(QUrl::fromLocalFile(filename)); -} - -AdBlockBlockableItemTestDialog::~AdBlockBlockableItemTestDialog() -{ -} - -void AdBlockBlockableItemTestDialog::slotLoadFinished() -{ - mProgress->stop(); - mWidget->setWebFrame(page.mainFrame()); -} - -void AdBlockBlockableItemTestDialog::slotOpenHtml() -{ - const QString fileName = QFileDialog::getOpenFileName(this, QString(), QString(), i18n("HTML File (*.html)")); - if (!fileName.isEmpty()) { - mProgress->start(); - page.mainFrame()->load(QUrl::fromLocalFile(fileName)); - } -} - -int main(int argc, char **argv) -{ - QApplication app(argc, argv); - QStandardPaths::setTestModeEnabled(true); - KAboutData aboutData(QStringLiteral("adblockblockableitemtest_gui"), i18n("adblockblockableitemtest_Gui"), QStringLiteral("1.0")); - aboutData.setShortDescription(i18n("Test for adblockblokabledialog")); - QCommandLineParser parser; - KAboutData::setApplicationData(aboutData); - parser.addVersionOption(); - parser.addHelpOption(); - parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("+[url]"), i18n("URL of an html file to be opened"))); - - aboutData.setupCommandLine(&parser); - parser.process(app); - aboutData.processCommandLine(&parser); - - QString fileName; - if (parser.positionalArguments().count()) { - fileName = parser.positionalArguments().at(0); - } else { - fileName = QFileDialog::getOpenFileName(0, QString(), QString(), i18n("HTML File (*.html)")); - } - if (fileName.isEmpty()) { - return 0; - } - - AdBlockBlockableItemTestDialog *w = new AdBlockBlockableItemTestDialog(fileName); - - w->resize(800, 600); - w->show(); - app.exec(); - delete w; - return 0; -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/tests/adblockblockableitemdialog_gui.h kf5-messagelib-16.12.3/messageviewer/src/adblock/tests/adblockblockableitemdialog_gui.h --- kf5-messagelib-16.04.3/messageviewer/src/adblock/tests/adblockblockableitemdialog_gui.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/tests/adblockblockableitemdialog_gui.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef TEST_ADBLOCKABLEITEMDIALOG_GUI_H -#define TEST_ADBLOCKABLEITEMDIALOG_GUI_H - -#include -#include - -namespace KPIM -{ -class ProgressIndicatorLabel; -} -namespace MessageViewer -{ -class AdBlockBlockableItemsWidget; -} -class AdBlockBlockableItemTestDialog : public QWidget -{ - Q_OBJECT -public: - explicit AdBlockBlockableItemTestDialog(const QString &filename, QWidget *parent = Q_NULLPTR); - ~AdBlockBlockableItemTestDialog(); - -private Q_SLOTS: - void slotLoadFinished(); - void slotOpenHtml(); - -private: - MessageViewer::AdBlockBlockableItemsWidget *mWidget; - QWebPage page; - KPIM::ProgressIndicatorLabel *mProgress; -}; - -#endif diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/tests/adblocksettingsdialog_gui.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/tests/adblocksettingsdialog_gui.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/tests/adblocksettingsdialog_gui.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/tests/adblocksettingsdialog_gui.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "adblock/common/adblocksettingwidget.h" - -int main(int argc, char **argv) -{ - QApplication app(argc, argv); - QStandardPaths::setTestModeEnabled(true); - KAboutData aboutData(QStringLiteral("adblocksettings_gui"), i18n("adblocksettingstest_Gui"), QStringLiteral("1.0")); - aboutData.setShortDescription(i18n("Test for adblocksettings")); - QCommandLineParser parser; - KAboutData::setApplicationData(aboutData); - parser.addVersionOption(); - parser.addHelpOption(); - aboutData.setupCommandLine(&parser); - parser.process(app); - aboutData.processCommandLine(&parser); - - MessageViewer::AdBlockSettingWidget *w = new MessageViewer::AdBlockSettingWidget; - QDialog dlg; - QVBoxLayout *layout = new QVBoxLayout; - dlg.setLayout(layout); - layout->addWidget(w); - QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); - okButton->setDefault(true); - okButton->setShortcut(Qt::CTRL | Qt::Key_Return); - QObject::connect(buttonBox, &QDialogButtonBox::accepted, &dlg, &QDialog::accept); - QObject::connect(buttonBox, &QDialogButtonBox::rejected, &dlg, &QDialog::reject); - layout->addWidget(buttonBox); - - w->doLoadFromGlobalSettings(); - if (dlg.exec()) { - w->save(); - } - return 0; -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/tests/adblocksettings_gui.cpp kf5-messagelib-16.12.3/messageviewer/src/adblock/tests/adblocksettings_gui.cpp --- kf5-messagelib-16.04.3/messageviewer/src/adblock/tests/adblocksettings_gui.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/tests/adblocksettings_gui.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include -#include -#include -#include -#include - -#include "adblock/common/adblocksettingwidget.h" - -int main(int argc, char **argv) -{ - QApplication app(argc, argv); - QStandardPaths::setTestModeEnabled(true); - KAboutData aboutData(QStringLiteral("adblocksettings_gui"), i18n("adblocksettingstest_Gui"), QStringLiteral("1.0")); - aboutData.setShortDescription(i18n("Test for adblocksettings")); - QCommandLineParser parser; - KAboutData::setApplicationData(aboutData); - parser.addVersionOption(); - parser.addHelpOption(); - aboutData.setupCommandLine(&parser); - parser.process(app); - aboutData.processCommandLine(&parser); - MessageViewer::AdBlockSettingWidget *w = new MessageViewer::AdBlockSettingWidget; - w->show(); - return app.exec(); -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/tests/CMakeLists.txt kf5-messagelib-16.12.3/messageviewer/src/adblock/tests/CMakeLists.txt --- kf5-messagelib-16.04.3/messageviewer/src/adblock/tests/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/tests/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -set(adblocksettings_gui_SRCS adblocksettings_gui.cpp) -add_executable(adblocksettings_gui ${adblocksettings_gui_SRCS}) -target_link_libraries(adblocksettings_gui - KF5::MessageViewer - KF5::ItemViews -) - -set(adblocksettingsdialog_gui_SRCS adblocksettingsdialog_gui.cpp) -add_executable(adblocksettingsdialog_gui ${adblocksettingsdialog_gui_SRCS}) -target_link_libraries(adblocksettingsdialog_gui - KF5::MessageViewer - KF5::ItemViews -) - -set(adblockblockableitemdialog_gui_SRCS adblockblockableitemdialog_gui.cpp) -add_executable(adblockblockableitemdialog_gui ${adblockblockableitemdialog_gui_SRCS}) -target_link_libraries(adblockblockableitemdialog_gui - KF5::KIOCore - KF5::MessageViewer - KF5::Libkdepim - Qt5::WebKitWidgets - KF5::ItemViews -) - - -set(adblockautomaticruleslistwidget_gui_SRCS adblockautomaticruleslistwidget_gui.cpp) -add_executable(adblockautomaticruleslistwidget_gui ${adblockautomaticruleslistwidget_gui_SRCS}) -target_link_libraries(adblockautomaticruleslistwidget_gui - KF5::MessageViewer - KF5::ItemViews -) diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/ui/adblockcreatefilterwidget.ui kf5-messagelib-16.12.3/messageviewer/src/adblock/ui/adblockcreatefilterwidget.ui --- kf5-messagelib-16.04.3/messageviewer/src/adblock/ui/adblockcreatefilterwidget.ui 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/ui/adblockcreatefilterwidget.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,199 +0,0 @@ - - - AdBlockCreateFilterWidget - - - - 0 - 0 - 599 - 602 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - Filters: - - - - - - - true - - - - - - - - - - - &Blocking filter - - - - - - - Exception Filter - - - - - - - - - Pattern - - - - - - - - custom - - - - - - - - - - - - - - - Accept pattern only - - - - - - At the beginning of the address - - - - - - - At the end of address - - - - - - - - - - Options - - - - - - First-part only - - - - - - - Match case - - - - - - - - - Restrict to domain - - - - - - - - - - - - - - - Apply to: - - - - - - - - - - - - Collapse blocked: - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/adblock/ui/settings_adblock.ui kf5-messagelib-16.12.3/messageviewer/src/adblock/ui/settings_adblock.ui --- kf5-messagelib-16.04.3/messageviewer/src/adblock/ui/settings_adblock.ui 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/adblock/ui/settings_adblock.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,256 +0,0 @@ - - - adblock - - - - 0 - 0 - 601 - 507 - - - - - - - &Enable Ad Block - - - - - - - &Hide filtered elements - - - - - - - - - - 0 - - - - Automatic Filters - - - - - - Add Filters subscriptions... - - - - - - - true - - - false - - - QAbstractItemView::InternalMove - - - - - - - Remove subscription - - - - - - - Qt::Vertical - - - - 20 - 301 - - - - - - - - - - Update enabled automatic filters every: - - - - - - - - 120 - 0 - - - - 1 - - - 7 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Show List... - - - - - - - - Manual Filters - - - - - - - - - - - Add filter expression - - - ... - - - - - - - - - Qt::Vertical - - - - 20 - 252 - - - - - - - - TextLabel - - - - - - - true - - - QAbstractItemView::InternalMove - - - QAbstractItemView::MultiSelection - - - - - - - Import Filters... - - - - - - - Export filters... - - - - - - - - - Search: - - - - - - - - - - - - Edit - - - - - - - Remove filter expression - - - Remove Filter - - - - - - - - - - - - KPluralHandlingSpinBox - QSpinBox -

KPluralHandlingSpinBox
- - - MessageViewer::AdBlockListWidget - QListWidget -
messageviewer/adblocklistwidget.h
- 1 -
- - KListWidgetSearchLine - KLineEdit -
klistwidgetsearchline.h
-
- - - - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/antispam/antispamconfig.cpp kf5-messagelib-16.12.3/messageviewer/src/antispam/antispamconfig.cpp --- kf5-messagelib-16.04.3/messageviewer/src/antispam/antispamconfig.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/antispam/antispamconfig.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -36,16 +36,15 @@ #include #include -namespace MessageViewer -{ +using namespace MessageViewer; -class AntiSpamConfigSingletonProvider +class MessageViewer::AntiSpamConfigSingletonProvider { public: AntiSpamConfig instance; }; -Q_GLOBAL_STATIC(AntiSpamConfigSingletonProvider, theAntiSpamConfigSingletonProvider) +Q_GLOBAL_STATIC(MessageViewer::AntiSpamConfigSingletonProvider, theAntiSpamConfigSingletonProvider) AntiSpamConfig *AntiSpamConfig::instance() { @@ -118,4 +117,3 @@ } return agents; } -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/antispam/spamheaderanalyzer.cpp kf5-messagelib-16.12.3/messageviewer/src/antispam/spamheaderanalyzer.cpp --- kf5-messagelib-16.04.3/messageviewer/src/antispam/spamheaderanalyzer.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/antispam/spamheaderanalyzer.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -57,7 +57,7 @@ } // Do we have the needed score field for this agent? - KMime::Headers::Base *header = message->headerByType((*it).header()); + KMime::Headers::Base *header = message->headerByType((*it).header().constData()); if (!header) { continue; } @@ -167,7 +167,7 @@ const QByteArray confidenceHeaderName = (*it).confidenceHeader(); QString mCField; if (!confidenceHeaderName.isEmpty()) { - KMime::Headers::Base *cHeader = message->headerByType(confidenceHeaderName); + KMime::Headers::Base *cHeader = message->headerByType(confidenceHeaderName.constData()); if (cHeader) { mCField = cHeader->asUnicodeString(); if (! mCField.isEmpty()) { diff -Nru kf5-messagelib-16.04.3/messageviewer/src/CMakeLists.txt kf5-messagelib-16.12.3/messageviewer/src/CMakeLists.txt --- kf5-messagelib-16.04.3/messageviewer/src/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -13,12 +13,10 @@ set(LEGACY_MANGLE_FROM_TO_HEADERS true) set(LEGACY_BODY_INVITES true) set(EXCHANGE_COMPATIBLE_INVITATIONS true) - set(OUTLOOK_COMPATIBLE_INVITATION_REPLY_COMMENTS true) else() set(LEGACY_MANGLE_FROM_TO_HEADERS false) set(LEGACY_BODY_INVITES false) set(EXCHANGE_COMPATIBLE_INVITATIONS false) - set(OUTLOOK_COMPATIBLE_INVITATION_REPLY_COMMENTS false) endif() configure_file(settings/messageviewer.kcfg.cmake ${CMAKE_CURRENT_BINARY_DIR}/messageviewer.kcfg) @@ -32,142 +30,46 @@ if(BUILD_TESTING) add_subdirectory(scamdetection/autotests) - add_subdirectory(findbar/autotests) add_subdirectory(scamdetection/tests) - add_subdirectory(adblock/tests/) - add_subdirectory(adblock/common/autotests) add_subdirectory(viewerplugins/tests/) - if (QTWEBENGINE_EXPERIMENTAL_OPTION) - add_subdirectory(webengine/tests) - add_subdirectory(viewer/webengine/autotests) - endif() - + add_subdirectory(htmlwriter/autotests/) + add_subdirectory(viewer/webengine/tests) + add_subdirectory(messagepartthemes/default/autotests) + add_subdirectory(viewer/webengine/autotests/) endif() add_subdirectory(pics) add_subdirectory(kconf_update) add_subdirectory(about) - +add_subdirectory(messageviewerheaderplugins) if(DEBUG_SIGNATURE) add_definitions(-DDEBUG_SIGNATURE) endif() -set(_mailwebview_cpp - adblock/adblockelementhiding.cpp - adblock/adblockmanager.cpp - adblock/adblockrulefallbackimpl.cpp - adblock/adblockblockableitemsdialog.cpp - adblock/adblockblockableitemswidget.cpp - - adblock/common/matcher/adblockrule.cpp - adblock/common/matcher/adblockruletextmatchimpl.cpp - adblock/common/matcher/adblockrulenullimpl.cpp - adblock/common/matcher/adblockhostmatcher.cpp - - adblock/common/adblocksettingwidget.cpp - adblock/common/adblockutil.cpp - adblock/common/adblockcreatefilterdialog.cpp - adblock/common/adblockaddsubscriptiondialog.cpp - adblock/common/adblocklistwidget.cpp - adblock/common/adblocksyntaxhighlighter.cpp - adblock/common/adblockshowlistdialog.cpp - adblock/common/adblockautomaticruleslistwidget.cpp - ) - - -# For the moment we can't replace mailwebengine set(libmessageviewer_mailviewer_SRCS - viewer/webview/mailwebview.cpp - viewer/webview/webpage.cpp - viewer/webview/networkaccessmanager.cpp - ) -set(libmessageviewer_web_LIB KF5::WebKit Qt5::WebKitWidgets) - - -if (QTWEBENGINE_EXPERIMENTAL_OPTION) - set(libmessageviewer_mailviewer_SRCS - viewer/webengine/mailwebengineview.cpp - viewer/webengine/mailwebenginepage.cpp - viewer/webengine/mailwebengineaccesskey.cpp - viewer/webengine/mailwebengineaccesskeyanchor.cpp - viewer/webengine/mailwebengineaccesskeyutils.cpp - ${libmessageviewer_mailviewer_SRCS} - findbar/findbarwebengineview.cpp - ) - - set(libmessageviewer_webengine_SRCS - webengine/networkmanager/networkaccessmanagerwebengine.cpp - webengine/urlinterceptor/networkurlinterceptor.cpp - webengine/urlinterceptor/networkpluginurlinterceptorinterface.cpp - webengine/urlinterceptor/networkurlinterceptorpluginmanager.cpp - webengine/urlinterceptor/networkpluginurlinterceptor.cpp - webengine/urlinterceptor/networkurlinterceptormanager.cpp - webengine/urlinterceptor/networkpluginurlinterceptorconfigurewidget.cpp - webengine/webhittestresult.cpp - webengine/webhittest.cpp - webengine/webenginepage.cpp - webengine/webenginescript.cpp - webengine/webengineview.cpp - ) - set(libmessageviewer_web_LIB Qt5::WebEngine Qt5::WebEngineWidgets ${libmessageviewer_web_LIB}) -endif() - -set(libmessageviewer_otp_SRCS - interfaces/bodypartformatter.cpp - viewer/bodypartformatter.cpp - viewer/bodypartformatterbasefactory.cpp - viewer/cryptohelper.cpp - viewer/nodehelper.cpp - viewer/objecttreeparser.cpp - viewer/messagepart.cpp - viewer/partnodebodypart.cpp - viewer/memento/cryptobodypartmemento.cpp - viewer/memento/decryptverifybodypartmemento.cpp - viewer/memento/verifydetachedbodypartmemento.cpp - viewer/memento/verifyopaquebodypartmemento.cpp - ) - -set(libmessageviewer_otp_extra_SRCS - job/kleojobexecutor.cpp - #for quotes - viewer/csshelperbase.cpp - viewer/attachmentstrategy.cpp - utils/iconnamecache.cpp - utils/mimetype.cpp - viewer/converthtmltoplaintext.cpp - #HTML Writer - htmlwriter/filehtmlwriter.cpp - htmlwriter/queuehtmlwriter.cpp + viewer/webengine/mailwebengineview.cpp + viewer/webengine/mailwebenginepage.cpp + viewer/webengine/loadexternalreferencesurlinterceptor/loadexternalreferencesurlinterceptor.cpp + viewer/webengine/cidreferencesurlinterceptor/cidreferencesurlinterceptor.cpp + viewer/webengine/blockexternalresourcesurlinterceptor/blockexternalresourcesurlinterceptor.cpp + viewer/webengine/mailwebenginescript.cpp ) set(libmessageviewer_viewer_SRCS - viewer/attachmentstrategy.cpp - viewer/bodypartformatter.cpp - viewer/bodypartformatterbasefactory.cpp viewer/bodypartformatterfactory.cpp viewer/bodypartformatterfactorysingleton.cpp - viewer/cryptohelper.cpp viewer/csshelper.cpp viewer/csshelperbase.cpp viewer/editorwatcher.cpp - viewer/mimeparttree/mimetreemodel.cpp - viewer/nodehelper.cpp viewer/objecttreeemptysource.cpp - viewer/objecttreeparser.cpp viewer/objecttreeviewersource.cpp - viewer/messagepart.cpp - viewer/partnodebodypart.cpp viewer/pluginloaderbase.cpp viewer/viewer.cpp viewer/viewer_p.cpp - viewer//webview/webviewaccesskey.cpp viewer/messagedisplayformatattribute.cpp viewer/urlhandlermanager.cpp viewer/mimeparttree/mimeparttreeview.cpp - viewer/converthtmltoplaintext.cpp - viewer/memento/cryptobodypartmemento.cpp - viewer/memento/decryptverifybodypartmemento.cpp - viewer/memento/verifydetachedbodypartmemento.cpp - viewer/memento/verifyopaquebodypartmemento.cpp + viewer/mimeparttree/mimetreemodel.cpp + viewer/mailcheckphishingurljob.cpp ) set(libmessageviewer_widgets_SRCS @@ -178,16 +80,13 @@ widgets/vcardviewer.cpp widgets/invitationsettings.cpp widgets/openattachmentfolderwidget.cpp - widgets/mailsourceviewer.cpp widgets/mailsourceviewtextbrowserwidget.cpp - widgets/zoomactionmenu.cpp + widgets/submittedformwarningwidget.cpp ) -if (QTWEBENGINE_EXPERIMENTAL_OPTION) - set(libmessageviewer_widgets_webengine_SRCS - widgets/mailsourcewebengineviewer.cpp +set(libmessageviewer_widgets_webengine_SRCS + widgets/mailsourcewebengineviewer.cpp ) -endif() set(libmessageviewer_header_SRCS header/contactdisplaymessagememento.cpp @@ -208,7 +107,6 @@ set(libmessageviewer_scamdetection_SRCS scamdetection/scamdetectionwarningwidget.cpp - scamdetection/scamdetection.cpp scamdetection/scamdetectiondetailsdialog.cpp scamdetection/scamattribute.cpp scamdetection/scamcheckshorturl.cpp @@ -216,15 +114,11 @@ scamdetection/scamcheckshorturlmanager.cpp ) -if (QTWEBENGINE_EXPERIMENTAL_OPTION) - set(libmessageviewer_scamdetection_webengine_SRCS - scamdetection/scamdetectionwebengine.cpp - ) -endif() +set(libmessageviewer_scamdetection_webengine_SRCS + scamdetection/scamdetectionwebengine.cpp + ) set(libmessageviewer_findbar_SRCS - findbar/findbarbase.cpp - findbar/findbarwebview.cpp findbar/findbarsourceview.cpp ) @@ -235,19 +129,13 @@ utils/mimetype.cpp ) -if (QTWEBENGINE_EXPERIMENTAL_OPTION) - set(libmessageviewer_htmlwriter_webengine_SRCS - htmlwriter/webengineparthtmlwriter.cpp +set(libmessageviewer_htmlwriter_webengine_SRCS + htmlwriter/webengineparthtmlwriter.cpp + htmlwriter/webengineembedpart.cpp ) -endif() - set(libmessageviewer_htmlwriter_SRCS - htmlwriter/filehtmlwriter.cpp - htmlwriter/queuehtmlwriter.cpp htmlwriter/teehtmlwriter.cpp - htmlwriter/webkitparthtmlwriter.cpp - ${libmessageviewer_htmlwriter_webengine_SRCS} ) set(libmessageviewer_antispam_SRCS @@ -256,12 +144,8 @@ ) set(libmessageviewer_job_SRCS - job/createtodojob.cpp - job/createeventjob.cpp - job/createnotejob.cpp job/attachmenteditjob.cpp job/modifymessagedisplayformatjob.cpp - job/kleojobexecutor.cpp ) set(libmessageviewer_viewerplugins_SRCS @@ -271,10 +155,19 @@ viewerplugins/viewerplugintoolmanager.cpp ) +set(libmessageviewer_messagepartthemes_default_SRCS + messagepartthemes/default/converthtmltoplaintext.cpp + messagepartthemes/default/defaultrenderer.cpp + messagepartthemes/default/htmlblock.cpp + messagepartthemes/default/messagepartrenderermanager.cpp + ) + set(libmessageviewer_SRCS + ${libmessageviewer_messagepartthemes_default_SRCS} + ${libmessageviewer_htmlwriter_webengine_SRCS} + ${libmessageviewer_messagepartthemes_SRCS} ${libmessageviewer_scamdetection_webengine_SRCS} ${libmessageviewer_widgets_webengine_SRCS} - ${libmessageviewer_webengine_SRCS} ${libmessageviewer_viewer_SRCS} ${libmessageviewer_widgets_SRCS} ${libmessageviewer_header_SRCS} @@ -286,12 +179,12 @@ ${libmessageviewer_job_SRCS} ${libmessageviewer_viewerplugins_SRCS} settings/messageviewersettings.cpp - interfaces/bodypartformatter.cpp - ${_mailwebview_cpp} ${libmessageviewer_mailviewer_SRCS} ) -ecm_qt_declare_logging_category(libmessageviewer_SRCS HEADER messageviewer_debug.h IDENTIFIER MESSAGEVIEWER_LOG CATEGORY_NAME log_messageviewer) +qt5_add_resources(libmessageviewer_SRCS messagepartthemes.qrc) + +ecm_qt_declare_logging_category(libmessageviewer_SRCS HEADER messageviewer_debug.h IDENTIFIER MESSAGEVIEWER_LOG CATEGORY_NAME org.kde.pim.messageviewer) kconfig_add_kcfg_files(libmessageviewer_SRCS settings/globalsettings_messageviewer.kcfgc @@ -301,8 +194,6 @@ ui/settings.ui ui/invitationsettings.ui ui/printingsettings.ui - adblock/ui/settings_adblock.ui - adblock/ui/adblockcreatefilterwidget.ui ) @@ -321,30 +212,33 @@ KF5::AkonadiMime KF5::Contacts KF5::Libkleo + KF5::MimeTreeParser PRIVATE + KF5::SyntaxHighlighting KF5::ItemViews - ${libmessageviewer_web_LIB} + Qt5::Network + Qt5::WebKitWidgets + KF5::WebEngineViewer KF5::Libkdepim KF5::GrantleeTheme KF5::KaddressbookGrantlee - Grantlee5::TextDocument Grantlee5::Templates KF5::MailTransport KF5::Mime KF5::Mbox - KF5::AkonadiNotes KF5::PimTextEdit - KF5::CalendarCore KF5::Gravatar KF5::IconThemes + KF5::I18n + KF5::KIOFileWidgets + KF5::KIOWidgets + KF5::WindowSystem + KF5::XmlGui + Grantlee5::TextDocument + Grantlee5::Templates + Qt5::PrintSupport + QGpgme ) -if (WIN32) - target_link_libraries(KF5MessageViewer PUBLIC KF5::Gpgmepp) -else() - target_link_libraries(KF5MessageViewer PUBLIC KF5::Gpgmepp-pthread) -endif() - -target_include_directories(KF5MessageViewer PUBLIC $) set_target_properties(KF5MessageViewer PROPERTIES VERSION ${MESSAGEVIEWER_VERSION_STRING} @@ -357,58 +251,16 @@ EXPORT KF5MessageViewerTargets ${KF5_INSTALL_TARGETS_DEFAULT_ARGS} ${LIBRARY_NAMELINK} ) -ecm_generate_headers(MessageViewer_Camelcasewebviewer_HEADERS +ecm_generate_headers(MessageViewer_Camelcasewebengine_HEADERS HEADER_NAMES - MailWebView - WebViewAccessKey - WebPage - REQUIRED_HEADERS MessageViewer_webviewer_HEADERS + MailWebEnginePage + MailWebEngineView + + REQUIRED_HEADERS MessageViewer_webengine_HEADERS PREFIX MessageViewer - RELATIVE viewer/webview + RELATIVE viewer/webengine ) -if (QTWEBENGINE_EXPERIMENTAL_OPTION) - ecm_generate_headers(MessageViewer_Camelcasewebengine_HEADERS - HEADER_NAMES - MailWebEnginePage - MailWebEngineAccessKey - MailWebEngineView - - REQUIRED_HEADERS MessageViewer_webengine_HEADERS - PREFIX MessageViewer - RELATIVE viewer/webengine - ) - ecm_generate_headers(MessageViewer_Camelcasewebengine_urlinterceptor_HEADERS - HEADER_NAMES - NetworkUrlInterceptorPluginManager - NetworkUrlInterceptor - NetworkPluginUrlInterceptorInterface - NetworkPluginUrlInterceptor - NetworkPluginUrlInterceptorConfigureWidget - - REQUIRED_HEADERS MessageViewer_webengine_urlinterceptor_HEADERS - PREFIX MessageViewer - RELATIVE webengine/urlinterceptor - ) - ecm_generate_headers(MessageViewer_Camelcasewebengine_manager_HEADERS - HEADER_NAMES - NetworkAccessManagerWebEngine - REQUIRED_HEADERS MessageViewer_webengine_manager_HEADERS - PREFIX MessageViewer - RELATIVE webengine/networkmanager - ) - ecm_generate_headers(MessageViewer_Camelcasewebengine_misc_HEADERS - HEADER_NAMES - WebHitTestResult - WebEnginePage - WebEngineView - WebHitTest - REQUIRED_HEADERS MessageViewer_webengine_misc_HEADERS - PREFIX MessageViewer - RELATIVE webengine/ - ) -endif() - ecm_generate_headers(MessageViewer_Camelcasescam_HEADERS HEADER_NAMES ScamExpandUrlJob @@ -423,38 +275,22 @@ ecm_generate_headers(MessageViewer_Camelcaseviewer_HEADERS HEADER_NAMES Viewer + CSSHelperBase CSSHelper - PartMetaData - ObjectTreeParser ObjectTreeEmptySource - AttachmentStrategy - NodeHelper EditorWatcher Stl_Util - CSSHelperBase - MessagePart - Enums - BodyPartFormatterBaseFactory BodyPartFormatterFactory REQUIRED_HEADERS MessageViewer_viewer_HEADERS PREFIX MessageViewer RELATIVE viewer ) -ecm_generate_headers(MessageViewer_Camelcasemain_HEADERS - HEADER_NAMES - ObjectTreeSourceIf - REQUIRED_HEADERS MessageViewer_main_HEADERS - PREFIX MessageViewer - ) - - ecm_generate_headers(MessageViewer_Camelcasewidgets_HEADERS HEADER_NAMES InvitationSettings PrintingSettings ConfigureWidget - ZoomActionMenu REQUIRED_HEADERS MessageViewer_widgets_HEADERS PREFIX MessageViewer RELATIVE widgets @@ -462,34 +298,15 @@ ecm_generate_headers(MessageViewer_Camelcaseutils_HEADERS HEADER_NAMES - MessageViewerUtil - MarkMessageReadHandler IconNameCache + MarkMessageReadHandler + MessageViewerUtil MimeType REQUIRED_HEADERS MessageViewer_utils_HEADERS PREFIX MessageViewer RELATIVE utils ) -ecm_generate_headers(MessageViewer_Camelfindbar_HEADERS - HEADER_NAMES - FindBarWebView - FindBarBase - REQUIRED_HEADERS MessageViewer_findbar_HEADERS - PREFIX MessageViewer - RELATIVE findbar - ) - -if (QTWEBENGINE_EXPERIMENTAL_OPTION) - ecm_generate_headers(MessageViewer_CamelfindbarWebEngine_HEADERS - HEADER_NAMES - FindBarWebEngineView - REQUIRED_HEADERS MessageViewer_findbarWebEngine_HEADERS - PREFIX MessageViewer - RELATIVE findbar - ) -endif() - ecm_generate_headers(MessageViewer_Camelcaseantispam_HEADERS HEADER_NAMES SpamHeaderAnalyzer @@ -500,10 +317,7 @@ ecm_generate_headers(MessageViewer_Camelcaseinterfaces_HEADERS HEADER_NAMES - BodyPartFormatter - BodyPart BodyPartURLHandler - HtmlWriter URLHandler REQUIRED_HEADERS MessageViewer_interfaces_HEADERS PREFIX MessageViewer @@ -538,34 +352,6 @@ RELATIVE header ) -ecm_generate_headers(MessageViewer_Camelcasehtmlwriter_HEADERS - HEADER_NAMES - WebKitPartHtmlWriter - FileHtmlWriter - REQUIRED_HEADERS MessageViewer_htmlwriter_HEADERS - PREFIX MessageViewer - RELATIVE htmlwriter - ) - -ecm_generate_headers(MessageViewer_Camelcaseadblockcommon_HEADERS - HEADER_NAMES - AdBlockListWidget - AdBlockSettingWidget - REQUIRED_HEADERS MessageViewer_adblockcommon_HEADERS - PREFIX MessageViewer - RELATIVE adblock/common - ) - - -ecm_generate_headers(MessageViewer_Camelcaseadblock_HEADERS - HEADER_NAMES - AdBlockBlockableItemsDialog - AdBlockManager - REQUIRED_HEADERS MessageViewer_adblock_HEADERS - PREFIX MessageViewer - RELATIVE adblock - ) - ecm_generate_headers(MessageViewer_Camelcaseviewerplugin_HEADERS HEADER_NAMES ViewerPluginManager @@ -577,75 +363,45 @@ RELATIVE viewerplugins ) -ecm_generate_headers(MessageViewer_Camelcaseviewerjob_HEADERS - HEADER_NAMES - CreateTodoJob - CreateNoteJob - CreateEventJob - REQUIRED_HEADERS MessageViewer_viewerjob_HEADERS - PREFIX MessageViewer - RELATIVE job - ) - ecm_generate_pri_file(BASE_NAME MessageViewer LIB_NAME KF5MessageViewer - DEPS "PimCommon MessageCore AkonadiCore AkonadiMime Contacts Libkleo" FILENAME_VAR PRI_FILENAME INCLUDE_INSTALL_DIR ${KDE_INSTALL_INCLUDEDIR_KF5}/MessageViewer + DEPS "PimCommon MessageCore AkonadiCore AkonadiMime Contacts Libkleo MimeTreeParser" FILENAME_VAR PRI_FILENAME INCLUDE_INSTALL_DIR ${KDE_INSTALL_INCLUDEDIR_KF5}/MessageViewer ) install(FILES - ${MessageViewer_Camelcasewebengine_misc_HEADERS} - ${MessageViewer_Camelcasewebengine_manager_HEADERS} - ${MessageViewer_Camelcasewebengine_urlinterceptor_HEADERS} ${MessageViewer_Camelcasewebengine_HEADERS} - ${MessageViewer_CamelfindbarWebEngine_HEADERS} - ${MessageViewer_Camelcasewebviewer_HEADERS} ${MessageViewer_Camelcaseheader_HEADERS} ${MessageViewer_Camelcaseviewerplugin_HEADERS} ${MessageViewer_Camelcasesettings_HEADERS} - ${MessageViewer_Camelcaseadblock_HEADERS} - ${MessageViewer_Camelcasehtmlwriter_HEADERS} ${MessageViewer_Camelcaseutils_HEADERS} ${MessageViewer_Camelcaseinterfaces_HEADERS} ${MessageViewer_Camelcaseviewer_HEADERS} ${MessageViewer_Camelcasewidgets_HEADERS} - ${MessageViewer_Camelcasemain_HEADERS} - ${MessageViewer_Camelcaseviewerjob_HEADERS} ${MessageViewer_Camelcaseantispam_HEADERS} ${MessageViewer_Camelfindbar_HEADERS} - ${MessageViewer_Camelcaseadblockcommon_HEADERS} ${MessageViewer_Camelcasescam_HEADERS} DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/MessageViewer COMPONENT Devel ) install(FILES - ${MessageViewer_scam_HEADERS} - ${MessageViewer_webengine_misc_HEADERS} - ${MessageViewer_webengine_manager_HEADERS} - ${MessageViewer_webengine_urlinterceptor_HEADERS} ${MessageViewer_webengine_HEADERS} - ${MessageViewer_findbarWebEngine_HEADERS} - ${MessageViewer_adblockcommon_HEADERS} - ${MessageViewer_webviewer_HEADERS} + ${MessageViewer_scam_HEADERS} ${MessageViewer_viewerplugin_HEADERS} ${MessageViewer_settings_HEADERS} - ${MessageViewer_adblock_HEADERS} - ${MessageViewer_htmlwriter_HEADERS} ${MessageViewer_header_HEADERS} ${MessageViewer_utils_HEADERS} ${MessageViewer_interfaces_HEADERS} ${MessageViewer_HEADERS} ${MessageViewer_viewer_HEADERS} - ${MessageViewer_main_HEADERS} ${MessageViewer_widgets_HEADERS} - ${MessageViewer_viewerjob_HEADERS} ${MessageViewer_antispam_HEADERS} ${MessageViewer_findbar_HEADERS} ${CMAKE_CURRENT_BINARY_DIR}/messageviewer_export.h ${CMAKE_CURRENT_BINARY_DIR}/globalsettings_messageviewer.h ${CMAKE_CURRENT_BINARY_DIR}/messageviewer_debug.h - + ${CMAKE_CURRENT_BINARY_DIR}/config-messageviewer.h DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/messageviewer COMPONENT Devel ) @@ -659,42 +415,3 @@ install(FILES notify/messageviewer.notifyrc DESTINATION ${KDE_INSTALL_KNOTIFY5RCDIR} ) install(FILES scamdetection/data/longurlServices.json DESTINATION ${KDE_INSTALL_DATADIR}/messageviewer ) - -# Disabled libotp for 16.04, because it is not ready for release yet. - -# Project(Otp) -# -# set(libotp_SRCS -# ${libmessageviewer_otp_SRCS} -# ${libmessageviewer_otp_extra_SRCS} -# ) -# ecm_qt_declare_logging_category(libotp_SRCS HEADER messageviewer_debug.h IDENTIFIER MESSAGEVIEWER_LOG CATEGORY_NAME log_messageviewer) -# -# add_library(KF5Otp -# ${libotp_SRCS} -# ) -# generate_export_header(KF5Otp BASE_NAME otp) -# add_library(KF5::Otp ALIAS KF5Otp) -# -# target_link_libraries(KF5Otp -# PUBLIC -# KF5::MessageCore #NodeHelper, StringUtils, Settings -# KF5::PimCommon #AttachmentTemporaryFile handling -# KF5::Libkleo -# PRIVATE -# KF5::Mime -# KF5::IconThemes -# ${libmessageviewer_web_LIB} -# Grantlee5::TextDocument -# ) -# -# install(TARGETS -# KF5Otp -# EXPORT KF5OtpTargets ${KF5_INSTALL_TARGETS_DEFAULT_ARGS} ${LIBRARY_NAMELINK} -# ) -# -# set_target_properties(KF5Otp PROPERTIES -# VERSION ${MESSAGEVIEWER_VERSION_STRING} -# SOVERSION ${MESSAGEVIEWER_SOVERSION} -# EXPORT_NAME Otp -# ) diff -Nru kf5-messagelib-16.04.3/messageviewer/src/config-messageviewer.h.cmake kf5-messagelib-16.12.3/messageviewer/src/config-messageviewer.h.cmake --- kf5-messagelib-16.04.3/messageviewer/src/config-messageviewer.h.cmake 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/config-messageviewer.h.cmake 2017-03-06 12:30:37.000000000 +0000 @@ -1,2 +1,2 @@ #cmakedefine HAVE_SYS_INOTIFY_H 1 - +#cmakedefine WEBENGINEVIEWER_PRINT_SUPPORT 1 diff -Nru kf5-messagelib-16.04.3/messageviewer/src/findbar/autotests/CMakeLists.txt kf5-messagelib-16.12.3/messageviewer/src/findbar/autotests/CMakeLists.txt --- kf5-messagelib-16.04.3/messageviewer/src/findbar/autotests/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/findbar/autotests/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -ecm_add_test(findbarbasetest.cpp ../findbarbase.cpp - TEST_NAME findbarbasetest - NAME_PREFIX "messageviewer-findbar-" - LINK_LIBRARIES Qt5::Test Qt5::Widgets Qt5::Gui KF5::Completion KF5::I18n KF5::ConfigWidgets KF5::PimCommon -) -set_property(TARGET findbarbasetest PROPERTY INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/messageviewer ${CMAKE_BINARY_DIR}/messageviewer/src) diff -Nru kf5-messagelib-16.04.3/messageviewer/src/findbar/autotests/findbarbasetest.cpp kf5-messagelib-16.12.3/messageviewer/src/findbar/autotests/findbarbasetest.cpp --- kf5-messagelib-16.04.3/messageviewer/src/findbar/autotests/findbarbasetest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/findbar/autotests/findbarbasetest.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,115 +0,0 @@ -/* - Copyright (c) 2014-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "findbarbasetest.h" -#include "../findbarbase.h" - -#include -#include -#include -#include -#include -#include - -FindBarBaseTest::FindBarBaseTest(QObject *parent) - : QObject(parent) -{ - -} - -FindBarBaseTest::~FindBarBaseTest() -{ - -} - -void FindBarBaseTest::shouldHaveDefaultValue() -{ - MessageViewer::FindBarBase bar; - QLabel *status = bar.findChild(QStringLiteral("status")); - QVERIFY(status); - QVERIFY(status->text().isEmpty()); - - QPushButton *previous = bar.findChild(QStringLiteral("findprevious")); - QVERIFY(previous); - QVERIFY(!previous->isEnabled()); - - QPushButton *next = bar.findChild(QStringLiteral("findnext")); - QVERIFY(next); - QVERIFY(!next->isEnabled()); - - QToolButton *close = bar.findChild(QStringLiteral("close")); - QVERIFY(close); - - KLineEdit *lineedit = bar.findChild(QStringLiteral("searchline")); - QVERIFY(lineedit); - QVERIFY(lineedit->text().isEmpty()); -} - -void FindBarBaseTest::shouldClearLineWhenClose() -{ - MessageViewer::FindBarBase bar; - bar.show(); - QSignalSpy spy(&bar, SIGNAL(hideFindBar())); - QTest::qWaitForWindowExposed(&bar); - QVERIFY(bar.isVisible()); - bar.focusAndSetCursor(); - KLineEdit *lineedit = bar.findChild(QStringLiteral("searchline")); - lineedit->setText(QStringLiteral("FOO")); - QVERIFY(!lineedit->text().isEmpty()); - QVERIFY(lineedit->hasFocus()); - bar.closeBar(); - QVERIFY(lineedit->text().isEmpty()); - QVERIFY(!lineedit->hasFocus()); - QCOMPARE(spy.count(), 1); -} - -void FindBarBaseTest::shouldEnableDisableNextPreviousButton() -{ - MessageViewer::FindBarBase bar; - bar.show(); - QTest::qWaitForWindowExposed(&bar); - QPushButton *previous = bar.findChild(QStringLiteral("findprevious")); - - QPushButton *next = bar.findChild(QStringLiteral("findnext")); - - bar.autoSearch(QStringLiteral("FOO")); - QVERIFY(next->isEnabled()); - QVERIFY(previous->isEnabled()); - - bar.autoSearch(QString()); - QVERIFY(!next->isEnabled()); - QVERIFY(!previous->isEnabled()); - -} - -void FindBarBaseTest::shouldClearAllWhenShowBar() -{ - MessageViewer::FindBarBase bar; - bar.show(); - QTest::qWaitForWindowExposed(&bar); - QLabel *status = bar.findChild(QStringLiteral("status")); - status->setText(QStringLiteral("FOO")); - bar.closeBar(); - - bar.show(); - bar.focusAndSetCursor(); - KLineEdit *lineedit = bar.findChild(QStringLiteral("searchline")); - QVERIFY(lineedit->hasFocus()); - QVERIFY(status->text().isEmpty()); -} - -QTEST_MAIN(FindBarBaseTest) diff -Nru kf5-messagelib-16.04.3/messageviewer/src/findbar/autotests/findbarbasetest.h kf5-messagelib-16.12.3/messageviewer/src/findbar/autotests/findbarbasetest.h --- kf5-messagelib-16.04.3/messageviewer/src/findbar/autotests/findbarbasetest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/findbar/autotests/findbarbasetest.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -/* - Copyright (c) 2014-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef FINDBARBASETEST_H -#define FINDBARBASETEST_H - -#include - -class FindBarBaseTest : public QObject -{ - Q_OBJECT -public: - explicit FindBarBaseTest(QObject *parent = Q_NULLPTR); - ~FindBarBaseTest(); - -private Q_SLOTS: - void shouldHaveDefaultValue(); - void shouldClearLineWhenClose(); - void shouldEnableDisableNextPreviousButton(); - void shouldClearAllWhenShowBar(); - -}; - -#endif // FINDBARBASETEST_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/findbar/findbarbase.cpp kf5-messagelib-16.12.3/messageviewer/src/findbar/findbarbase.cpp --- kf5-messagelib-16.04.3/messageviewer/src/findbar/findbarbase.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/findbar/findbarbase.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,275 +0,0 @@ -/* Copyright (C) 2010 Torgny Nyblom - * Copyright (C) 2010-2016 Laurent Montel - * - * This library 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. - * - * This library 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 this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "findbarbase.h" -#include "PimCommon/LineEditWithCompleter" - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace MessageViewer; - -FindBarBase::FindBarBase(QWidget *parent) - : QWidget(parent) -{ - QHBoxLayout *lay = new QHBoxLayout(this); - lay->setMargin(2); - - QToolButton *closeBtn = new QToolButton(this); - closeBtn->setIcon(QIcon::fromTheme(QStringLiteral("dialog-close"))); - closeBtn->setObjectName(QStringLiteral("close")); - closeBtn->setIconSize(QSize(16, 16)); - closeBtn->setToolTip(i18n("Close")); - -#ifndef QT_NO_ACCESSIBILITY - closeBtn->setAccessibleName(i18n("Close")); -#endif - - closeBtn->setAutoRaise(true); - lay->addWidget(closeBtn); - - QLabel *label = new QLabel(i18nc("Find text", "F&ind:"), this); - lay->addWidget(label); - - mSearch = new PimCommon::LineEditWithCompleter(this); - mSearch->setObjectName(QStringLiteral("searchline")); - mSearch->setToolTip(i18n("Text to search for")); - mSearch->setClearButtonShown(true); - label->setBuddy(mSearch); - lay->addWidget(mSearch); - - mFindNextBtn = new QPushButton(QIcon::fromTheme(QStringLiteral("go-down-search")), i18nc("Find and go to the next search match", "Next"), this); - mFindNextBtn->setToolTip(i18n("Jump to next match")); - mFindNextBtn->setObjectName(QStringLiteral("findnext")); - lay->addWidget(mFindNextBtn); - mFindNextBtn->setEnabled(false); - - mFindPrevBtn = new QPushButton(QIcon::fromTheme(QStringLiteral("go-up-search")), i18nc("Find and go to the previous search match", "Previous"), this); - mFindPrevBtn->setToolTip(i18n("Jump to previous match")); - mFindPrevBtn->setObjectName(QStringLiteral("findprevious")); - lay->addWidget(mFindPrevBtn); - mFindPrevBtn->setEnabled(false); - - QPushButton *optionsBtn = new QPushButton(this); - optionsBtn->setText(i18n("Options")); - optionsBtn->setToolTip(i18n("Modify search behavior")); - mOptionsMenu = new QMenu(optionsBtn); - mCaseSensitiveAct = mOptionsMenu->addAction(i18n("Case sensitive")); - mCaseSensitiveAct->setCheckable(true); - - optionsBtn->setMenu(mOptionsMenu); - lay->addWidget(optionsBtn); - - connect(closeBtn, &QToolButton::clicked, this, &FindBarBase::closeBar); - connect(mFindNextBtn, &QPushButton::clicked, this, &FindBarBase::findNext); - connect(mFindPrevBtn, &QPushButton::clicked, this, &FindBarBase::findPrev); - connect(mCaseSensitiveAct, &QAction::toggled, this, &FindBarBase::caseSensitivityChanged); - connect(mSearch, &KLineEdit::textChanged, this, &FindBarBase::autoSearch); - connect(mSearch, &KLineEdit::clearButtonClicked, this, &FindBarBase::slotClearSearch); - - mStatus = new QLabel; - mStatus->setObjectName(QStringLiteral("status")); - QFontMetrics fm(mStatus->font()); - mNotFoundString = i18n("Phrase not found"); - mStatus->setFixedWidth(fm.width(mNotFoundString)); - lay->addWidget(mStatus); - - setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed)); - //lay->addStretch(); - hide(); -} - -FindBarBase::~FindBarBase() -{ -} - -QMenu *FindBarBase::optionsMenu() -{ - return mOptionsMenu; -} - -QString FindBarBase::text() const -{ - return mSearch->text(); -} - -void FindBarBase::setText(const QString &text) -{ - mSearch->setText(text); -} - -void FindBarBase::focusAndSetCursor() -{ - setFocus(); - mStatus->clear(); - mSearch->selectAll(); - mSearch->setFocus(); -} - -void FindBarBase::slotClearSearch() -{ - clearSelections(); -} - -void FindBarBase::autoSearch(const QString &str) -{ - const bool isNotEmpty = (!str.isEmpty()); - mFindPrevBtn->setEnabled(isNotEmpty); - mFindNextBtn->setEnabled(isNotEmpty); - if (isNotEmpty) { - QTimer::singleShot(0, this, SLOT(slotSearchText())); - } else { - clearSelections(); - } -} - -void FindBarBase::slotSearchText(bool backward, bool isAutoSearch) -{ - searchText(backward, isAutoSearch); -} - -void FindBarBase::setFoundMatch(bool match) -{ -#ifndef QT_NO_STYLE_STYLESHEET - QString styleSheet; - - if (!mSearch->text().isEmpty()) { - if (mNegativeBackground.isEmpty()) { - KStatefulBrush bgBrush(KColorScheme::View, KColorScheme::PositiveBackground); - mPositiveBackground = QStringLiteral("QLineEdit{ background-color:%1 }").arg(bgBrush.brush(mSearch).color().name()); - bgBrush = KStatefulBrush(KColorScheme::View, KColorScheme::NegativeBackground); - mNegativeBackground = QStringLiteral("QLineEdit{ background-color:%1 }").arg(bgBrush.brush(mSearch).color().name()); - } - if (match) { - styleSheet = mPositiveBackground; - mStatus->clear(); - } else { - styleSheet = mNegativeBackground; - mStatus->setText(mNotFoundString); - } - } - mSearch->setStyleSheet(styleSheet); -#endif - -} - -void FindBarBase::searchText(bool backward, bool isAutoSearch) -{ - Q_UNUSED(backward); - Q_UNUSED(isAutoSearch); -} - -void FindBarBase::addToCompletion(const QString &text) -{ - KCompletion *comp = mSearch->completionObject(); - comp->addItem(text); -} - -void FindBarBase::findNext() -{ - searchText(false, false); - addToCompletion(mLastSearchStr); -} - -void FindBarBase::findPrev() -{ - searchText(true, false); - addToCompletion(mLastSearchStr); -} - -void FindBarBase::caseSensitivityChanged(bool b) -{ - updateSensitivity(b); -} - -void FindBarBase::updateSensitivity(bool) -{ -} - -void FindBarBase::slotHighlightAllChanged(bool b) -{ - updateHighLight(b); -} - -void FindBarBase::updateHighLight(bool) -{ -} - -void FindBarBase::clearSelections() -{ - setFoundMatch(false); -} - -void FindBarBase::closeBar() -{ - // Make sure that all old searches are cleared - mSearch->clear(); - clearSelections(); - mSearch->clearFocus(); - Q_EMIT hideFindBar(); -} - -bool FindBarBase::event(QEvent *e) -{ - // Close the bar when pressing Escape. - // Not using a QShortcut for this because it could conflict with - // window-global actions (e.g. Emil Sedgh binds Esc to "close tab"). - // With a shortcut Q_DECL_OVERRIDE we can catch this before it gets to kactions. - const bool shortCutOverride = (e->type() == QEvent::ShortcutOverride); - if (shortCutOverride || e->type() == QEvent::KeyPress) { - QKeyEvent *kev = static_cast(e); - if (kev->key() == Qt::Key_Escape) { - if (shortCutOverride) { - e->accept(); - return true; - } - e->accept(); - closeBar(); - return true; - } else if (kev->key() == Qt::Key_Enter || - kev->key() == Qt::Key_Return) { - e->accept(); - if (shortCutOverride) { - return true; - } - if (mSearch->text().isEmpty()) { - return true; - } - if (kev->modifiers() & Qt::ShiftModifier) { - findPrev(); - } else if (kev->modifiers() == Qt::NoModifier) { - findNext(); - } - return true; - } - } - return QWidget::event(e); -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/findbar/findbarbase.h kf5-messagelib-16.12.3/messageviewer/src/findbar/findbarbase.h --- kf5-messagelib-16.04.3/messageviewer/src/findbar/findbarbase.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/findbar/findbarbase.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ -/* Copyright (C) 2010 Torgny Nyblom - * Copyright (C) 2010-2016 Laurent Montel - * - * This library 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. - * - * This library 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 this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef FINDBARBASE_H -#define FINDBARBASE_H - -#include -#include "messageviewer_export.h" -class QAction; -class QPushButton; -class QMenu; -class QLabel; -namespace PimCommon -{ -class LineEditWithCompleter; -} -namespace MessageViewer -{ -class MESSAGEVIEWER_EXPORT FindBarBase : public QWidget -{ - Q_OBJECT -public: - explicit FindBarBase(QWidget *parent = Q_NULLPTR); - virtual ~FindBarBase(); - - QString text() const; - void setText(const QString &text); - void focusAndSetCursor(); - -protected: - bool event(QEvent *e) Q_DECL_OVERRIDE; - virtual void clearSelections(); - virtual void updateHighLight(bool); - virtual void searchText(bool backward, bool isAutoSearch); - virtual void updateSensitivity(bool); - - void setFoundMatch(bool match); - QMenu *optionsMenu(); - -public Q_SLOTS: - void findNext(); - void findPrev(); - void autoSearch(const QString &str); - void slotSearchText(bool backward = false, bool isAutoSearch = true); - void closeBar(); - -Q_SIGNALS: - void hideFindBar(); - -protected Q_SLOTS: - void caseSensitivityChanged(bool); - void slotHighlightAllChanged(bool); - void slotClearSearch(); - -protected: - QString mNotFoundString; - QString mPositiveBackground; - QString mNegativeBackground; - QString mLastSearchStr; - PimCommon::LineEditWithCompleter *mSearch; - QAction *mCaseSensitiveAct; - - QPushButton *mFindPrevBtn; - QPushButton *mFindNextBtn; - QMenu *mOptionsMenu; - QLabel *mStatus; - void addToCompletion(const QString &text); -}; - -} - -#endif /* FINDBARBASE_H */ - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/findbar/findbarsourceview.cpp kf5-messagelib-16.12.3/messageviewer/src/findbar/findbarsourceview.cpp --- kf5-messagelib-16.04.3/messageviewer/src/findbar/findbarsourceview.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/findbar/findbarsourceview.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -24,7 +24,7 @@ using namespace MessageViewer; FindBarSourceView::FindBarSourceView(QPlainTextEdit *view, QWidget *parent) - : FindBarBase(parent), mView(view) + : WebEngineViewer::FindBarBase(parent), mView(view) { } @@ -62,7 +62,7 @@ textCursor.setPosition(0); mView->setTextCursor(textCursor); - FindBarBase::clearSelections(); + WebEngineViewer::FindBarBase::clearSelections(); } void FindBarSourceView::updateHighLight(bool) diff -Nru kf5-messagelib-16.04.3/messageviewer/src/findbar/findbarsourceview.h kf5-messagelib-16.12.3/messageviewer/src/findbar/findbarsourceview.h --- kf5-messagelib-16.04.3/messageviewer/src/findbar/findbarsourceview.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/findbar/findbarsourceview.h 2017-03-06 12:30:37.000000000 +0000 @@ -19,13 +19,13 @@ #ifndef FINDBARSOURCEVIEW_H #define FINDBARSOURCEVIEW_H -#include "findbarbase.h" +#include class QPlainTextEdit; namespace MessageViewer { -class FindBarSourceView : public FindBarBase +class FindBarSourceView : public WebEngineViewer::FindBarBase { Q_OBJECT diff -Nru kf5-messagelib-16.04.3/messageviewer/src/findbar/findbarwebengineview.cpp kf5-messagelib-16.12.3/messageviewer/src/findbar/findbarwebengineview.cpp --- kf5-messagelib-16.04.3/messageviewer/src/findbar/findbarwebengineview.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/findbar/findbarwebengineview.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ -/* Copyright (C) 2016 Laurent Montel - * - * This library 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. - * - * This library 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 this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "findbarwebengineview.h" -#include "PimCommon/LineEditWithCompleter" -#include -#include - -using namespace MessageViewer; - -class MessageViewer::FindBarWebEngineViewPrivate -{ -public: - FindBarWebEngineViewPrivate() - : mView(Q_NULLPTR) - { - - } - QWebEngineView *mView; -}; - -FindBarWebEngineView::FindBarWebEngineView(QWebEngineView *view, QWidget *parent) - : FindBarBase(parent), - d(new MessageViewer::FindBarWebEngineViewPrivate) -{ - d->mView = view; -} - -FindBarWebEngineView::~FindBarWebEngineView() -{ - delete d; -} - -void FindBarWebEngineView::searchText(bool backward, bool isAutoSearch) -{ - QWebEnginePage::FindFlags searchOptions; - - if (backward) { - searchOptions |= QWebEnginePage::FindBackward; - } - if (mCaseSensitiveAct->isChecked()) { - searchOptions |= QWebEnginePage::FindCaseSensitively; - } - const QString searchWord(mSearch->text()); - if (!isAutoSearch && !mLastSearchStr.contains(searchWord, Qt::CaseSensitive)) { - clearSelections(); - } - d->mView->findText(QString()); //Clear an existing highligh - mLastSearchStr = searchWord; - d->mView->findText(mLastSearchStr, searchOptions, [this](bool found) { - setFoundMatch(found); - }); -} - -void FindBarWebEngineView::updateSensitivity(bool sensitivity) -{ - QWebEnginePage::FindFlags searchOptions; - if (sensitivity) { - searchOptions |= QWebEnginePage::FindCaseSensitively; - d->mView->findText(QString()); //Clear an existing highligh - } - d->mView->findText(QString(), searchOptions, [this](bool found) { - setFoundMatch(found); - }); -} - -void FindBarWebEngineView::clearSelections() -{ - d->mView->findText(QString()); - mLastSearchStr.clear(); - FindBarBase::clearSelections(); -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/findbar/findbarwebengineview.h kf5-messagelib-16.12.3/messageviewer/src/findbar/findbarwebengineview.h --- kf5-messagelib-16.04.3/messageviewer/src/findbar/findbarwebengineview.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/findbar/findbarwebengineview.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -/* Copyright (C) 2016 Laurent Montel - * - * This library 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. - * - * This library 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 this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef MESSAGEVIEWER_FINDBAR_MAILWEBENGINEVIEW_H -#define MESSAGEVIEWER_FINDBAR_MAILWEBENGINEVIEW_H - -#include "findbarbase.h" -#include "messageviewer_export.h" - -class QWebEngineView; - -namespace MessageViewer -{ -class FindBarWebEngineViewPrivate; -class MESSAGEVIEWER_EXPORT FindBarWebEngineView : public FindBarBase -{ - Q_OBJECT -public: - explicit FindBarWebEngineView(QWebEngineView *view, QWidget *parent = Q_NULLPTR); - ~FindBarWebEngineView(); - -private: - void clearSelections() Q_DECL_OVERRIDE; - void searchText(bool backward, bool isAutoSearch) Q_DECL_OVERRIDE; - void updateSensitivity(bool sensitivity) Q_DECL_OVERRIDE; - -private: - FindBarWebEngineViewPrivate *const d; -}; - -} - -#endif diff -Nru kf5-messagelib-16.04.3/messageviewer/src/findbar/findbarwebview.cpp kf5-messagelib-16.12.3/messageviewer/src/findbar/findbarwebview.cpp --- kf5-messagelib-16.04.3/messageviewer/src/findbar/findbarwebview.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/findbar/findbarwebview.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,141 +0,0 @@ -/* Copyright (C) 2011-2016 Laurent Montel - * - * This library 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. - * - * This library 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 this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "findbarwebview.h" -#include "PimCommon/LineEditWithCompleter" -#include - -#include -#include -using namespace MessageViewer; - -class MessageViewer::FindBarWebViewPrivate -{ -public: - FindBarWebViewPrivate() - : mView(Q_NULLPTR), - mHighlightAll(Q_NULLPTR), - mFindInSelection(Q_NULLPTR) - { - - } - QWebView *mView; - QAction *mHighlightAll; - QAction *mFindInSelection; -}; - -FindBarWebView::FindBarWebView(QWebView *view, QWidget *parent) - : FindBarBase(parent), - d(new MessageViewer::FindBarWebViewPrivate) -{ - d->mView = view; - QMenu *options = optionsMenu(); - d->mHighlightAll = options->addAction(i18n("Highlight all matches")); - d->mHighlightAll->setCheckable(true); - d->mFindInSelection = options->addAction(i18n("Find in selection first")); - d->mFindInSelection->setCheckable(true); - connect(d->mHighlightAll, &QAction::toggled, this, &FindBarWebView::slotHighlightAllChanged); - connect(d->mFindInSelection, &QAction::toggled, this, &FindBarWebView::slotFindSelectionFirstChanged); -} - -FindBarWebView::~FindBarWebView() -{ - delete d; -} - -void FindBarWebView::searchText(bool backward, bool isAutoSearch) -{ - QWebPage::FindFlags searchOptions = QWebPage::FindWrapsAroundDocument; - - if (backward) { - searchOptions |= QWebPage::FindBackward; - } - if (mCaseSensitiveAct->isChecked()) { - searchOptions |= QWebPage::FindCaseSensitively; - } - if (d->mHighlightAll->isChecked()) { - searchOptions |= QWebPage::HighlightAllOccurrences; - } - if (d->mFindInSelection->isChecked()) { - searchOptions |= QWebPage::FindBeginsInSelection; - } - const QString searchWord(mSearch->text()); - if (!isAutoSearch && !mLastSearchStr.contains(searchWord, Qt::CaseSensitive)) { - clearSelections(); - } - d->mView->findText(QString(), QWebPage::HighlightAllOccurrences); //Clear an existing highligh - - mLastSearchStr = searchWord; - const bool found = d->mView->findText(mLastSearchStr, searchOptions); - - setFoundMatch(found); -} - -void FindBarWebView::updateHighLight(bool highLight) -{ - bool found = false; - if (highLight) { - QWebPage::FindFlags searchOptions = QWebPage::FindWrapsAroundDocument; - if (mCaseSensitiveAct->isChecked()) { - searchOptions |= QWebPage::FindCaseSensitively; - } - searchOptions |= QWebPage::HighlightAllOccurrences; - found = d->mView->findText(mLastSearchStr, searchOptions); - } else { - found = d->mView->findText(QString(), QWebPage::HighlightAllOccurrences); - } - setFoundMatch(found); -} - -void FindBarWebView::updateSensitivity(bool sensitivity) -{ - QWebPage::FindFlags searchOptions = QWebPage::FindWrapsAroundDocument; - if (sensitivity) { - searchOptions |= QWebPage::FindCaseSensitively; - d->mView->findText(QString(), QWebPage::HighlightAllOccurrences); //Clear an existing highligh - } - if (d->mHighlightAll->isChecked()) { - searchOptions |= QWebPage::HighlightAllOccurrences; - } - const bool found = d->mView->findText(mLastSearchStr, searchOptions); - setFoundMatch(found); -} - -void FindBarWebView::slotFindSelectionFirstChanged(bool findSectionFirst) -{ - QWebPage::FindFlags searchOptions = QWebPage::FindWrapsAroundDocument; - if (findSectionFirst) { - searchOptions |= QWebPage::FindBeginsInSelection; - d->mView->findText(QString(), QWebPage::HighlightAllOccurrences); //Clear an existing highligh - } - if (d->mHighlightAll->isChecked()) { - searchOptions |= QWebPage::HighlightAllOccurrences; - } - const bool found = d->mView->findText(mLastSearchStr, searchOptions); - setFoundMatch(found); -} - -void FindBarWebView::clearSelections() -{ - //WEBKIT: TODO: Find a way to unselect last selection - // http://bugreports.qt.nokia.com/browse/QTWEBKIT-80 - d->mView->findText(QString(), QWebPage::HighlightAllOccurrences); - mLastSearchStr.clear(); - FindBarBase::clearSelections(); -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/findbar/findbarwebview.h kf5-messagelib-16.12.3/messageviewer/src/findbar/findbarwebview.h --- kf5-messagelib-16.04.3/messageviewer/src/findbar/findbarwebview.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/findbar/findbarwebview.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -/* Copyright (C) 2011-2016 Laurent Montel - * - * This library 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. - * - * This library 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 this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef MESSAGEVIEWER_FINDBAR_MAILWEBVIEW_H -#define MESSAGEVIEWER_FINDBAR_MAILWEBVIEW_H - -#include "findbarbase.h" -#include "messageviewer_export.h" - -class QWebView; - -namespace MessageViewer -{ -class FindBarWebViewPrivate; -class MESSAGEVIEWER_EXPORT FindBarWebView : public FindBarBase -{ - Q_OBJECT -public: - explicit FindBarWebView(QWebView *view, QWidget *parent = Q_NULLPTR); - ~FindBarWebView(); - -private: - void clearSelections() Q_DECL_OVERRIDE; - void searchText(bool backward, bool isAutoSearch) Q_DECL_OVERRIDE; - void updateHighLight(bool) Q_DECL_OVERRIDE; - void updateSensitivity(bool sensitivity) Q_DECL_OVERRIDE; - -private Q_SLOTS: - void slotFindSelectionFirstChanged(bool findSectionFirst); -private: - FindBarWebViewPrivate *const d; -}; - -} - -#endif diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/contactdisplaymessagememento.cpp kf5-messagelib-16.12.3/messageviewer/src/header/contactdisplaymessagememento.cpp --- kf5-messagelib-16.04.3/messageviewer/src/header/contactdisplaymessagememento.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/contactdisplaymessagememento.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,4 +1,5 @@ -/* Copyright (C) 2012-2016 Laurent Montel +/* + * Copyright (C) 2012-2016 Laurent Montel * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -48,6 +49,7 @@ { if (mSearchJob) { disconnect(mSearchJob.data(), &Akonadi::ContactSearchJob::result, this, &ContactDisplayMessageMemento::slotSearchJobFinished); + mSearchJob->kill(); } } @@ -57,7 +59,7 @@ Akonadi::ContactSearchJob *searchJob = static_cast(job); if (searchJob->error()) { qCWarning(MESSAGEVIEWER_LOG) << "Unable to fetch contact:" << searchJob->errorText(); - Q_EMIT update(Delayed); + Q_EMIT update(MimeTreeParser::Delayed); return; } @@ -73,7 +75,7 @@ if (!mPhoto.isEmpty()) { //We have a data raw => we can update message if (mPhoto.isIntern()) { - Q_EMIT update(Delayed); + Q_EMIT update(MimeTreeParser::Delayed); } else { QUrl url = QUrl::fromUserInput(mPhoto.url(), QString(), QUrl::AssumeLocalFile); QImage image; @@ -98,7 +100,7 @@ } if (ok) { mImageFromUrl = image; - Q_EMIT update(Delayed); + Q_EMIT update(MimeTreeParser::Delayed); } } } @@ -112,7 +114,7 @@ job->setUseDefaultPixmap(Gravatar::GravatarSettings::self()->gravatarUseDefaultImage()); job->setUseLibravatar(Gravatar::GravatarSettings::self()->libravatarSupportEnabled()); job->setFallbackGravatar(Gravatar::GravatarSettings::self()->fallbackToGravatar()); - job->setUseHttps(Gravatar::GravatarSettings::self()->gravatarHttpsSupport()); + job->setUseHttps(/*Gravatar::GravatarSettings::self()->gravatarHttpsSupport()*/true); if (job->canStart()) { connect(job, &Gravatar::GravatarResolvUrlJob::finished, this, &ContactDisplayMessageMemento::slotGravatarResolvUrlFinished); job->start(); @@ -131,7 +133,7 @@ void ContactDisplayMessageMemento::detach() { - disconnect(this, SIGNAL(update(MessageViewer::UpdateMode)), 0, 0); + disconnect(this, SIGNAL(update(MimeTreeParser::UpdateMode)), 0, 0); disconnect(this, SIGNAL(changeDisplayMail(Viewer::DisplayFormatMessage,bool)), 0, 0); } @@ -193,6 +195,6 @@ { if (job && job->hasGravatar()) { mGravatarPixmap = job->pixmap(); - Q_EMIT update(Delayed); + Q_EMIT update(MimeTreeParser::Delayed); } } diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/contactdisplaymessagememento.h kf5-messagelib-16.12.3/messageviewer/src/header/contactdisplaymessagememento.h --- kf5-messagelib-16.04.3/messageviewer/src/header/contactdisplaymessagememento.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/contactdisplaymessagememento.h 2017-03-06 12:30:37.000000000 +0000 @@ -41,7 +41,7 @@ namespace MessageViewer { -class ContactDisplayMessageMemento : public QObject, public Interface::BodyPartMemento +class ContactDisplayMessageMemento : public QObject, public MimeTreeParser::Interface::BodyPartMemento { Q_OBJECT public: @@ -61,7 +61,7 @@ Q_SIGNALS: // TODO: Factor our update and detach into base class - void update(MessageViewer::UpdateMode); + void update(MimeTreeParser::UpdateMode); void changeDisplayMail(Viewer::DisplayFormatMessage displayAsHtml, bool remoteContent); private Q_SLOTS: diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/data/messageviewer_header_themes.knsrc kf5-messagelib-16.12.3/messageviewer/src/header/data/messageviewer_header_themes.knsrc --- kf5-messagelib-16.04.3/messageviewer/src/header/data/messageviewer_header_themes.knsrc 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/data/messageviewer_header_themes.knsrc 2017-03-06 12:30:37.000000000 +0000 @@ -1,5 +1,5 @@ [KNewStuff3] -ProvidersUrl=http://download.kde.org/ocs/providers.xml +ProvidersUrl=https://autoconfig.kde.org/ocs/providers.xml Categories=KMail Header Theme TargetDir=messageviewer/themes Uncompress=always diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/grantleeheaderformatter.cpp kf5-messagelib-16.12.3/messageviewer/src/header/grantleeheaderformatter.cpp --- kf5-messagelib-16.04.3/messageviewer/src/header/grantleeheaderformatter.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/grantleeheaderformatter.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,43 +1,46 @@ /* - Copyright (c) 2013-2016 Montel Laurent + Copyright (C) 2013-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "grantleeheaderformatter.h" #include "headerstyle_util.h" +#include "grantleetheme/grantleetheme.h" #include "settings/messageviewersettings.h" +#include "utils/iconnamecache.h" #include "config-messageviewer.h" #include -#include "utils/iconnamecache.h" #include #include #include #include +#include #include #include using namespace MessageCore; -namespace MessageViewer -{ +using namespace MessageViewer; -class Q_DECL_HIDDEN GrantleeHeaderFormatter::Private +class Q_DECL_HIDDEN MessageViewer::GrantleeHeaderFormatter::Private { public: Private() @@ -68,33 +71,33 @@ delete d; } -QString GrantleeHeaderFormatter::toHtml(const QStringList &displayExtraHeaders, const QString &absolutPath, const QString &filename, const MessageViewer::HeaderStyle *style, KMime::Message *message, bool isPrinting) const -{ - d->templateLoader->setTemplateDirs(QStringList() << absolutPath); - Grantlee::Template headerTemplate = d->engine->loadByName(filename); - if (headerTemplate->error()) { - return headerTemplate->errorString(); - } - return format(absolutPath, headerTemplate, displayExtraHeaders, isPrinting, style, message); -} - -QString GrantleeHeaderFormatter::toHtml(const GrantleeTheme::Theme &theme, bool isPrinting, const MessageViewer::HeaderStyle *style, KMime::Message *message) const +QString GrantleeHeaderFormatter::toHtml(const GrantleeHeaderFormatter::GrantleeHeaderFormatterSettings &settings) const { QString errorMessage; - if (!theme.isValid()) { - errorMessage = i18n("Grantlee theme \"%1\" is not valid.", theme.name()); + if (!settings.theme.isValid()) { + errorMessage = i18n("Grantlee theme \"%1\" is not valid.", settings.theme.name()); return errorMessage; } - d->templateLoader->setTemplateDirs(QStringList() << theme.absolutePath()); - Grantlee::Template headerTemplate = d->engine->loadByName(theme.themeFilename()); + d->templateLoader->setTemplateDirs(QStringList() << settings.theme.absolutePath()); + Grantlee::Template headerTemplate = d->engine->loadByName(settings.theme.themeFilename()); if (headerTemplate->error()) { errorMessage = headerTemplate->errorString(); return errorMessage; } - return format(theme.absolutePath(), headerTemplate, theme.displayExtraVariables(), isPrinting, style, message); + return format(settings.theme.absolutePath(), headerTemplate, settings.theme.displayExtraVariables(), settings.isPrinting, settings.style, settings.message, settings.showMailAction); } -QString GrantleeHeaderFormatter::format(const QString &absolutePath, const Grantlee::Template &headerTemplate, const QStringList &displayExtraHeaders, bool isPrinting, const MessageViewer::HeaderStyle *style, KMime::Message *message) const +QString GrantleeHeaderFormatter::toHtml(const QStringList &displayExtraHeaders, const QString &absolutPath, const QString &filename, const MessageViewer::HeaderStyle *style, KMime::Message *message, bool isPrinting) const +{ + d->templateLoader->setTemplateDirs(QStringList() << absolutPath); + Grantlee::Template headerTemplate = d->engine->loadByName(filename); + if (headerTemplate->error()) { + return headerTemplate->errorString(); + } + return format(absolutPath, headerTemplate, displayExtraHeaders, isPrinting, style, message); +} + +QString GrantleeHeaderFormatter::format(const QString &absolutePath, const Grantlee::Template &headerTemplate, const QStringList &displayExtraHeaders, bool isPrinting, const MessageViewer::HeaderStyle *style, KMime::Message *message, bool showMailAction) const { QVariantHash headerObject; @@ -105,11 +108,14 @@ // direction. const QString absoluteThemePath = QUrl::fromLocalFile(absolutePath + QLatin1Char('/')).url(); headerObject.insert(QStringLiteral("absoluteThemePath"), absoluteThemePath); + headerObject.insert(QStringLiteral("showMailAction"), showMailAction); headerObject.insert(QStringLiteral("applicationDir"), QApplication::isRightToLeft() ? QStringLiteral("rtl") : QStringLiteral("ltr")); headerObject.insert(QStringLiteral("subjectDir"), d->headerStyleUtil.subjectDirectionString(message)); headerObject.insert(QStringLiteral("subjecti18n"), i18n("Subject:")); - headerObject.insert(QStringLiteral("subject"), d->headerStyleUtil.subjectString(message)); + const KTextToHTML::Options flags = KTextToHTML::PreserveSpaces | KTextToHTML::ReplaceSmileys; + + headerObject.insert(QStringLiteral("subject"), d->headerStyleUtil.subjectString(message, flags)); if (message->to(false)) { headerObject.insert(QStringLiteral("toi18n"), i18n("To:")); @@ -153,6 +159,15 @@ headerObject.insert(QStringLiteral("from"), StringUtil::emailAddrAsAnchor(message->from(), StringUtil::DisplayFullAddress)); headerObject.insert(QStringLiteral("fromStr"), message->from()->asUnicodeString()); + //Sender + headerObject.insert(QStringLiteral("sender"), d->headerStyleUtil.strToHtml(message->sender()->asUnicodeString())); + headerObject.insert(QStringLiteral("senderi18n"), i18n("Sender:")); + headerObject.insert(QStringLiteral("listidi18n"), i18n("List-Id:")); + + if (auto hrd = message->headerByType("List-Id")) { + headerObject.insert(QStringLiteral("listid"), hrd->asUnicodeString()); + } + const QString spamHtml = d->headerStyleUtil.spamStatus(message); if (!spamHtml.isEmpty()) { headerObject.insert(QStringLiteral("spamstatusi18n"), i18n("Spam Status:")); @@ -172,18 +187,18 @@ headerObject.insert(QStringLiteral("useragent"), d->headerStyleUtil.strToHtml(hdr->asUnicodeString())); } - if (message->headerByType("X-Mailer")) { - headerObject.insert(QStringLiteral("xmailer"), d->headerStyleUtil.strToHtml(message->headerByType("X-Mailer")->asUnicodeString())); + if (auto hrd = message->headerByType("X-Mailer")) { + headerObject.insert(QStringLiteral("xmailer"), d->headerStyleUtil.strToHtml(hrd->asUnicodeString())); } } - if (message->headerByType("Resent-From")) { + if (message->hasHeader("Resent-From")) { headerObject.insert(QStringLiteral("resentfromi18n"), i18n("resent from")); const QVector resentFrom = d->headerStyleUtil.resentFromList(message); headerObject.insert(QStringLiteral("resentfrom"), StringUtil::emailAddrAsAnchor(resentFrom, StringUtil::DisplayFullAddress)); } - if (message->headerByType("Resent-To")) { + if (message->hasHeader("Resent-To")) { const QVector resentTo = d->headerStyleUtil.resentToList(message); headerObject.insert(QStringLiteral("resenttoi18n"), i18np("receiver was", "receivers were", resentTo.count())); headerObject.insert(QStringLiteral("resentto"), StringUtil::emailAddrAsAnchor(resentTo, StringUtil::DisplayFullAddress)); @@ -236,10 +251,10 @@ Q_FOREACH (QString header, displayExtraHeaders) { const QByteArray baHeader = header.toLocal8Bit(); - if (message->headerByType(baHeader)) { + if (auto hrd = message->headerByType(baHeader.constData())) { //Grantlee doesn't support '-' in variable name => remove it. header = header.remove(QLatin1Char('-')); - headerObject.insert(header, message->headerByType(baHeader)->asUnicodeString()); + headerObject.insert(header, hrd->asUnicodeString()); } } @@ -250,7 +265,7 @@ headerObject.insert(QStringLiteral("hasAttachment"), messageHasAttachment); if (messageHasAttachment) { - const QString iconPath = IconNameCache::instance()->iconPath(QStringLiteral("mail-attachment"), KIconLoader::Toolbar); + const QString iconPath = MessageViewer::IconNameCache::instance()->iconPath(QStringLiteral("mail-attachment"), KIconLoader::Toolbar); const QString html = QStringLiteral("").arg(QUrl::fromLocalFile(iconPath).url(), QString::number(d->iconSize)); headerObject.insert(QStringLiteral("attachmentIcon"), html); } @@ -263,5 +278,3 @@ return headerTemplate->render(&context); } - -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/grantleeheaderformatter.h kf5-messagelib-16.12.3/messageviewer/src/header/grantleeheaderformatter.h --- kf5-messagelib-16.04.3/messageviewer/src/header/grantleeheaderformatter.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/grantleeheaderformatter.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2013-2016 Montel Laurent + Copyright (C) 2013-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef GRANTLEEHEADERFORMATTER_H @@ -20,31 +22,43 @@ #include #include +#include #include "messageviewer_export.h" namespace KMime { class Message; } -namespace GrantleeTheme -{ -class Theme; -} - namespace MessageViewer { class HeaderStyle; class MESSAGEVIEWER_EXPORT GrantleeHeaderFormatter { public: + struct GrantleeHeaderFormatterSettings { + GrantleeHeaderFormatterSettings() + : isPrinting(false), + style(Q_NULLPTR), + message(Q_NULLPTR), + showMailAction(true) + { + + } + GrantleeTheme::Theme theme; + bool isPrinting; + mutable const MessageViewer::HeaderStyle *style; + KMime::Message *message; + bool showMailAction; + }; + explicit GrantleeHeaderFormatter(); ~GrantleeHeaderFormatter(); - QString toHtml(const GrantleeTheme::Theme &theme, bool isPrinting, const MessageViewer::HeaderStyle *style, KMime::Message *message) const; + QString toHtml(const GrantleeHeaderFormatterSettings &settings) const; QString toHtml(const QStringList &displayExtraHeaders, const QString &absolutPath, const QString &filename, const MessageViewer::HeaderStyle *style, KMime::Message *message, bool isPrinting) const; private: - QString format(const QString &absolutePath, const Grantlee::Template &headerTemplate, const QStringList &displayExtraHeaders, bool isPrinting, const MessageViewer::HeaderStyle *style, KMime::Message *message) const; + QString format(const QString &absolutePath, const Grantlee::Template &headerTemplate, const QStringList &displayExtraHeaders, bool isPrinting, const MessageViewer::HeaderStyle *style, KMime::Message *message, bool showMailAction = true) const; class Private; Private *const d; }; diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/grantleeheaderstyle.cpp kf5-messagelib-16.12.3/messageviewer/src/header/grantleeheaderstyle.cpp --- kf5-messagelib-16.04.3/messageviewer/src/header/grantleeheaderstyle.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/grantleeheaderstyle.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,40 +1,57 @@ /* - Copyright (c) 2013-2016 Montel Laurent + Copyright (C) 2013-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "grantleeheaderstyle.h" #include "header/grantleeheaderformatter.h" #include "header/headerstrategy.h" +#include "grantleetheme/grantleetheme.h" #include using namespace MessageViewer; - -namespace MessageViewer +class MessageViewer::GrantleeHeaderStylePrivate { +public: + GrantleeHeaderStylePrivate() + : mGrantleeFormatter(Q_NULLPTR), + mShowMailAction(true) + { + mGrantleeFormatter = new GrantleeHeaderFormatter; + } + ~GrantleeHeaderStylePrivate() + { + delete mGrantleeFormatter; + } + + GrantleeHeaderFormatter *mGrantleeFormatter; + bool mShowMailAction; +}; GrantleeHeaderStyle::GrantleeHeaderStyle() - : HeaderStyle() + : HeaderStyle(), + d(new MessageViewer::GrantleeHeaderStylePrivate) { - mGrantleeFormatter = new GrantleeHeaderFormatter; } GrantleeHeaderStyle::~GrantleeHeaderStyle() { - delete mGrantleeFormatter; + delete d; } const char *GrantleeHeaderStyle::name() const @@ -47,7 +64,14 @@ if (!message) { return QString(); } - return mGrantleeFormatter->toHtml(theme(), isPrinting(), this, message); + + GrantleeHeaderFormatter::GrantleeHeaderFormatterSettings settings; + settings.isPrinting = isPrinting(); + settings.theme = theme(); + settings.style = this; + settings.message = message; + settings.showMailAction = d->mShowMailAction; + return d->mGrantleeFormatter->toHtml(settings); } bool GrantleeHeaderStyle::hasAttachmentQuickList() const @@ -55,4 +79,12 @@ return true; } +bool GrantleeHeaderStyle::showMailAction() const +{ + return d->mShowMailAction; +} + +void GrantleeHeaderStyle::setShowMailAction(bool showAction) +{ + d->mShowMailAction = showAction; } diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/grantleeheaderstyle.h kf5-messagelib-16.12.3/messageviewer/src/header/grantleeheaderstyle.h --- kf5-messagelib-16.04.3/messageviewer/src/header/grantleeheaderstyle.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/grantleeheaderstyle.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2013-2016 Montel Laurent + Copyright (C) 2013-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef GRANTLEEHEADERSTYLE_H @@ -22,8 +24,7 @@ namespace MessageViewer { -class GrantleeHeaderFormatter; -//Temporary. +class GrantleeHeaderStylePrivate; class MESSAGEVIEWER_EXPORT GrantleeHeaderStyle : public HeaderStyle { public: @@ -37,8 +38,10 @@ bool hasAttachmentQuickList() const Q_DECL_OVERRIDE; + bool showMailAction() const; + void setShowMailAction(bool showAction); private: - GrantleeHeaderFormatter *mGrantleeFormatter; + GrantleeHeaderStylePrivate *const d; }; } #endif // GRANTLEEHEADERSTYLE_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/grantleeheaderteststyle.cpp kf5-messagelib-16.12.3/messageviewer/src/header/grantleeheaderteststyle.cpp --- kf5-messagelib-16.04.3/messageviewer/src/header/grantleeheaderteststyle.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/grantleeheaderteststyle.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2013-2016 Montel Laurent + Copyright (C) 2013-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + This library 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This library 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 General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "grantleeheaderteststyle.h" diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/grantleeheaderteststyle.h kf5-messagelib-16.12.3/messageviewer/src/header/grantleeheaderteststyle.h --- kf5-messagelib-16.04.3/messageviewer/src/header/grantleeheaderteststyle.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/grantleeheaderteststyle.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2013-2016 Montel Laurent + Copyright (C) 2013-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + This library 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This library 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 General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef GRANTLEEHEADERTESTSTYLE_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/headerstrategy.cpp kf5-messagelib-16.12.3/messageviewer/src/header/headerstrategy.cpp --- kf5-messagelib-16.04.3/messageviewer/src/header/headerstrategy.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/headerstrategy.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -36,8 +36,7 @@ // // HeaderStrategy abstract base: // -namespace MessageViewer -{ +using namespace MessageViewer; HeaderStrategy::HeaderStrategy() { @@ -79,5 +78,3 @@ } return sl; } - -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/headerstrategy.h kf5-messagelib-16.12.3/messageviewer/src/header/headerstrategy.h --- kf5-messagelib-16.04.3/messageviewer/src/header/headerstrategy.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/headerstrategy.h 2017-03-06 12:30:37.000000000 +0000 @@ -46,9 +46,9 @@ { protected: HeaderStrategy(); - virtual ~HeaderStrategy(); public: + virtual ~HeaderStrategy(); // // Methods for handling the strategies: // diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/headerstyle.cpp kf5-messagelib-16.12.3/messageviewer/src/header/headerstyle.cpp --- kf5-messagelib-16.04.3/messageviewer/src/header/headerstyle.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/headerstyle.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -33,28 +33,48 @@ #include "headerstyle.h" #include "messageviewer_debug.h" +#include "grantleetheme/grantleetheme.h" using namespace MessageViewer; -// ##################### - // // HeaderStyle abstract base: // +class MessageViewer::HeaderStylePrivate +{ +public: + HeaderStylePrivate() + : mStrategy(0), + mNodeHelper(0), + mSourceObject(0), + mPrinting(false), + mTopLevel(true), + mAllowAsync(false), + mReadOnlyMessage(false) + { + + } + GrantleeTheme::Theme mTheme; + QString mMessagePath; + const HeaderStrategy *mStrategy; + QString mVCardName; + QString mCollectionName; + MimeTreeParser::NodeHelper *mNodeHelper; + QObject *mSourceObject; + Akonadi::MessageStatus mMessageStatus; + bool mPrinting; + bool mTopLevel; + bool mAllowAsync; + bool mReadOnlyMessage; +}; HeaderStyle::HeaderStyle() - : mStrategy(0), - mNodeHelper(0), - mSourceObject(0), - mPrinting(false), - mTopLevel(true), - mAllowAsync(false), - mReadOnlyMessage(false) + : d(new MessageViewer::HeaderStylePrivate) { } HeaderStyle::~HeaderStyle() { - + delete d; } bool HeaderStyle::hasAttachmentQuickList() const @@ -64,121 +84,121 @@ void HeaderStyle::setMessagePath(const QString &path) { - mMessagePath = path; + d->mMessagePath = path; } QString HeaderStyle::messagePath() const { - return mMessagePath; + return d->mMessagePath; } void HeaderStyle::setHeaderStrategy(const HeaderStrategy *strategy) { - mStrategy = strategy; + d->mStrategy = strategy; } const HeaderStrategy *HeaderStyle::headerStrategy() const { - return mStrategy; + return d->mStrategy; } void HeaderStyle::setVCardName(const QString &vCardName) { - mVCardName = vCardName; + d->mVCardName = vCardName; } QString HeaderStyle::vCardName() const { - return mVCardName; + return d->mVCardName; } void HeaderStyle::setPrinting(bool printing) { - mPrinting = printing; + d->mPrinting = printing; } bool HeaderStyle::isPrinting() const { - return mPrinting; + return d->mPrinting; } void HeaderStyle::setTopLevel(bool topLevel) { - mTopLevel = topLevel; + d->mTopLevel = topLevel; } bool HeaderStyle::isTopLevel() const { - return mTopLevel; + return d->mTopLevel; } -void HeaderStyle::setNodeHelper(NodeHelper *nodeHelper) +void HeaderStyle::setNodeHelper(MimeTreeParser::NodeHelper *nodeHelper) { - mNodeHelper = nodeHelper; + d->mNodeHelper = nodeHelper; } -NodeHelper *HeaderStyle::nodeHelper() const +MimeTreeParser::NodeHelper *HeaderStyle::nodeHelper() const { - return mNodeHelper; + return d->mNodeHelper; } void HeaderStyle::setAllowAsync(bool allowAsync) { - mAllowAsync = allowAsync; + d->mAllowAsync = allowAsync; } bool HeaderStyle::allowAsync() const { - return mAllowAsync; + return d->mAllowAsync; } void HeaderStyle::setSourceObject(QObject *sourceObject) { - mSourceObject = sourceObject; + d->mSourceObject = sourceObject; } QObject *HeaderStyle::sourceObject() const { - return mSourceObject; + return d->mSourceObject; } void HeaderStyle::setMessageStatus(Akonadi::MessageStatus status) { - mMessageStatus = status; + d->mMessageStatus = status; } Akonadi::MessageStatus HeaderStyle::messageStatus() const { - return mMessageStatus; + return d->mMessageStatus; } void HeaderStyle::setTheme(const GrantleeTheme::Theme &theme) { - mTheme = theme; + d->mTheme = theme; } GrantleeTheme::Theme HeaderStyle::theme() const { - return mTheme; + return d->mTheme; } void HeaderStyle::setCollectionName(const QString &name) { - mCollectionName = name; + d->mCollectionName = name; } QString HeaderStyle::collectionName() const { - return mCollectionName; + return d->mCollectionName; } bool HeaderStyle::readOnlyMessage() const { - return mReadOnlyMessage; + return d->mReadOnlyMessage; } void HeaderStyle::setReadOnlyMessage(bool readOnlyMessage) { - mReadOnlyMessage = readOnlyMessage; + d->mReadOnlyMessage = readOnlyMessage; } diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/headerstyle.h kf5-messagelib-16.12.3/messageviewer/src/header/headerstyle.h --- kf5-messagelib-16.04.3/messageviewer/src/header/headerstyle.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/headerstyle.h 2017-03-06 12:30:37.000000000 +0000 @@ -36,18 +36,27 @@ #include "messageviewer_export.h" -#include "grantleetheme/grantleetheme.h" +//#include "grantleetheme/grantleetheme.h" #include #include class QString; +namespace MimeTreeParser +{ +class NodeHelper; +} + +namespace GrantleeTheme +{ +class Theme; +} + namespace MessageViewer { class HeaderStrategy; -class NodeHelper; /** This class encapsulates the visual appearance of message headers. Together with HeaderStrategy, which determines @@ -58,13 +67,14 @@ @author Marc Mutz @see HeaderStrategy **/ +class HeaderStylePrivate; class MESSAGEVIEWER_EXPORT HeaderStyle { protected: HeaderStyle(); - virtual ~HeaderStyle(); public: + virtual ~HeaderStyle(); // // Methods for handling the styles: // @@ -93,8 +103,8 @@ void setTopLevel(bool topLevel); bool isTopLevel() const; - void setNodeHelper(NodeHelper *nodeHelper); - NodeHelper *nodeHelper() const; + void setNodeHelper(MimeTreeParser::NodeHelper *nodeHelper); + MimeTreeParser::NodeHelper *nodeHelper() const; void setAllowAsync(bool allowAsync); bool allowAsync() const; @@ -114,18 +124,7 @@ void setReadOnlyMessage(bool readOnlyMessage); private: - GrantleeTheme::Theme mTheme; - QString mMessagePath; - const HeaderStrategy *mStrategy; - QString mVCardName; - QString mCollectionName; - NodeHelper *mNodeHelper; - QObject *mSourceObject; - Akonadi::MessageStatus mMessageStatus; - bool mPrinting; - bool mTopLevel; - bool mAllowAsync; - bool mReadOnlyMessage; + HeaderStylePrivate *const d; }; } diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/headerstyleinterface.cpp kf5-messagelib-16.12.3/messageviewer/src/header/headerstyleinterface.cpp --- kf5-messagelib-16.04.3/messageviewer/src/header/headerstyleinterface.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/headerstyleinterface.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + This library 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This library 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 General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "headerstyle.h" diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/headerstyleinterface.h kf5-messagelib-16.12.3/messageviewer/src/header/headerstyleinterface.h --- kf5-messagelib-16.04.3/messageviewer/src/header/headerstyleinterface.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/headerstyleinterface.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + This library 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This library 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 General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef HEADERSTYLEINTERFACE_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/headerstylemenumanager.cpp kf5-messagelib-16.12.3/messageviewer/src/header/headerstylemenumanager.cpp --- kf5-messagelib-16.04.3/messageviewer/src/header/headerstylemenumanager.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/headerstylemenumanager.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "headerstyleinterface.h" @@ -68,7 +70,7 @@ } } else { if (lstInterface.isEmpty()) { - qCCritical(MESSAGEVIEWER_LOG) << "No plugin found !"; + qCCritical(MESSAGEVIEWER_LOG) << "No Header Style plugin found !"; return; } else { interface = lstInterface.cbegin().value(); @@ -131,10 +133,12 @@ const QVector lstPlugin = MessageViewer::HeaderStylePluginManager::self()->pluginsList(); Q_FOREACH (MessageViewer::HeaderStylePlugin *plugin, lstPlugin) { - MessageViewer::HeaderStyleInterface *interface = plugin->createView(headerMenu, group, ac, q); - lstInterface.insert(plugin->name(), interface); - q->connect(interface, &HeaderStyleInterface::styleChanged, q, &HeaderStyleMenuManager::slotStyleChanged); - q->connect(interface, &HeaderStyleInterface::styleUpdated, q, &HeaderStyleMenuManager::styleUpdated); + if (plugin->isEnabled()) { + MessageViewer::HeaderStyleInterface *interface = plugin->createView(headerMenu, group, ac, q); + lstInterface.insert(plugin->name(), interface); + q->connect(interface, &HeaderStyleInterface::styleChanged, q, &HeaderStyleMenuManager::slotStyleChanged); + q->connect(interface, &HeaderStyleInterface::styleUpdated, q, &HeaderStyleMenuManager::styleUpdated); + } } } diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/headerstylemenumanager.h kf5-messagelib-16.12.3/messageviewer/src/header/headerstylemenumanager.h --- kf5-messagelib-16.04.3/messageviewer/src/header/headerstylemenumanager.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/headerstylemenumanager.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + This library 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This library 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 General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef HEADERSTYLEMENU_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/headerstyleplugin.cpp kf5-messagelib-16.12.3/messageviewer/src/header/headerstyleplugin.cpp --- kf5-messagelib-16.04.3/messageviewer/src/header/headerstyleplugin.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/headerstyleplugin.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "headerstyleplugin.h" @@ -22,9 +24,11 @@ { public: HeaderStylePluginPrivate() + : mIsEnabled(false) { } + bool mIsEnabled; }; HeaderStylePlugin::HeaderStylePlugin(QObject *parent) @@ -53,3 +57,24 @@ { return -1; } + +void HeaderStylePlugin::setIsEnabled(bool enabled) +{ + d->mIsEnabled = enabled; +} + +bool HeaderStylePlugin::isEnabled() const +{ + return d->mIsEnabled; +} + +bool HeaderStylePlugin::hasConfigureDialog() const +{ + return false; +} + +void HeaderStylePlugin::showConfigureDialog(QWidget *parent) +{ + Q_UNUSED(parent); + //Reimplement +} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/headerstyleplugin.h kf5-messagelib-16.12.3/messageviewer/src/header/headerstyleplugin.h --- kf5-messagelib-16.04.3/messageviewer/src/header/headerstyleplugin.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/headerstyleplugin.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef HEADERSTYLEPLUGIN_H @@ -45,6 +47,12 @@ virtual QString alignment() const; virtual int elidedTextSize() const; + void setIsEnabled(bool enabled); + bool isEnabled() const; + + virtual bool hasConfigureDialog() const; + + virtual void showConfigureDialog(QWidget *parent); private: HeaderStylePluginPrivate *const d; }; diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/headerstylepluginmanager.cpp kf5-messagelib-16.12.3/messageviewer/src/header/headerstylepluginmanager.cpp --- kf5-messagelib-16.04.3/messageviewer/src/header/headerstylepluginmanager.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/headerstylepluginmanager.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,22 +1,25 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "headerstylepluginmanager.h" #include "headerstyleplugin.h" +#include "messageviewer_debug.h" #include #include #include @@ -47,21 +50,19 @@ { public: HeaderStylePluginInfo() - : plugin(Q_NULLPTR) + : plugin(Q_NULLPTR), + isEnabled(false) { } - QString saveName() const; - KPluginMetaData metaData; + QString metaDataFileNameBaseName; + QString metaDataFileName; + PimCommon::PluginUtilData pluginData; MessageViewer::HeaderStylePlugin *plugin; + bool isEnabled; }; -QString HeaderStylePluginInfo::saveName() const -{ - return QFileInfo(metaData.fileName()).baseName(); -} - class MessageViewer::HeaderStylePluginManagerPrivate { public: @@ -71,8 +72,14 @@ } QVector pluginsList() const; + QVector pluginDataList() const; void initializePluginList(); void loadPlugin(HeaderStylePluginInfo *item); + QString configGroupName() const; + QString configPrefixSettingKey() const; + MessageViewer::HeaderStylePlugin *pluginFromIdentifier(const QString &id); +private: + QVector mPluginDataList; QVector mPluginList; HeaderStylePluginManager *q; }; @@ -85,6 +92,21 @@ } } +QVector HeaderStylePluginManagerPrivate::pluginDataList() const +{ + return mPluginDataList; +} + +QString HeaderStylePluginManagerPrivate::configGroupName() const +{ + return QStringLiteral("HeaderStylePlugins"); +} + +QString HeaderStylePluginManagerPrivate::configPrefixSettingKey() const +{ + return QStringLiteral("PluginHeaderStyle"); +} + void HeaderStylePluginManagerPrivate::initializePluginList() { const QVector plugins = KPluginLoader::findPlugins(QStringLiteral("messageviewer"), [](const KPluginMetaData & md) { @@ -93,20 +115,29 @@ QVectorIterator i(plugins); i.toBack(); + const QPair pair = PimCommon::PluginUtil::loadPluginSetting(configGroupName(), configPrefixSettingKey()); QSet unique; QList listOrder; while (i.hasPrevious()) { HeaderStylePluginInfo info; - info.metaData = i.previous(); - const QString version = info.metaData.version(); + const KPluginMetaData data = i.previous(); + + //1) get plugin data => name/description etc. + info.pluginData = PimCommon::PluginUtil::createPluginMetaData(data); + //2) look at if plugin is activated + const bool isPluginActivated = PimCommon::PluginUtil::isPluginActivated(pair.first, pair.second, info.pluginData.mEnableByDefault, info.pluginData.mIdentifier); + info.isEnabled = isPluginActivated; + info.metaDataFileNameBaseName = QFileInfo(data.fileName()).baseName(); + info.metaDataFileName = data.fileName(); + const QString version = data.version(); if (pluginVersion() == version) { // only load plugins once, even if found multiple times! - if (unique.contains(info.saveName())) { + if (unique.contains(info.metaDataFileNameBaseName)) { continue; } - const QVariant p = info.metaData.rawData().value(QStringLiteral("X-KDE-MessageViewer-Header-Order")).toVariant(); + const QVariant p = data.rawData().value(QStringLiteral("X-KDE-MessageViewer-Header-Order")).toVariant(); int order = -1; if (p.isValid()) { order = p.toInt(); @@ -122,7 +153,9 @@ listOrder.insert(pos, order); info.plugin = Q_NULLPTR; mPluginList.insert(pos, info); - unique.insert(info.saveName()); + unique.insert(info.metaDataFileNameBaseName); + } else { + qCWarning(MESSAGEVIEWER_LOG) << "Plugin " << data.name() << " doesn't have correction plugin version. It will not be loaded."; } } QVector::iterator end(mPluginList.end()); @@ -145,7 +178,24 @@ void HeaderStylePluginManagerPrivate::loadPlugin(HeaderStylePluginInfo *item) { - item->plugin = KPluginLoader(item->metaData.fileName()).factory()->create(q, QVariantList() << item->saveName()); + KPluginLoader pluginLoader(item->metaDataFileName); + if (pluginLoader.factory()) { + item->plugin = pluginLoader.factory()->create(q, QVariantList() << item->metaDataFileNameBaseName); + item->plugin->setIsEnabled(item->isEnabled); + item->pluginData.mHasConfigureDialog = false; + mPluginDataList.append(item->pluginData); + } +} + +MessageViewer::HeaderStylePlugin *HeaderStylePluginManagerPrivate::pluginFromIdentifier(const QString &id) +{ + QVector::ConstIterator end(mPluginList.constEnd()); + for (QVector::ConstIterator it = mPluginList.constBegin(); it != end; ++it) { + if ((*it).pluginData.mIdentifier == id) { + return (*it).plugin; + } + } + return {}; } HeaderStylePluginManager *HeaderStylePluginManager::self() @@ -178,3 +228,23 @@ } return lst; } + +QString HeaderStylePluginManager::configGroupName() const +{ + return d->configGroupName(); +} + +QString HeaderStylePluginManager::configPrefixSettingKey() const +{ + return d->configPrefixSettingKey(); +} + +QVector HeaderStylePluginManager::pluginsDataList() const +{ + return d->pluginDataList(); +} + +MessageViewer::HeaderStylePlugin *HeaderStylePluginManager::pluginFromIdentifier(const QString &id) +{ + return d->pluginFromIdentifier(id); +} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/headerstylepluginmanager.h kf5-messagelib-16.12.3/messageviewer/src/header/headerstylepluginmanager.h --- kf5-messagelib-16.04.3/messageviewer/src/header/headerstylepluginmanager.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/headerstylepluginmanager.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef HEADERSTYLEPLUGINMANAGER_H @@ -20,6 +22,7 @@ #include #include "messageviewer_export.h" +#include namespace MessageViewer { class HeaderStylePlugin; @@ -36,6 +39,10 @@ QVector pluginsList() const; QStringList pluginListName() const; + QVector pluginsDataList() const; + QString configPrefixSettingKey() const; + QString configGroupName() const; + MessageViewer::HeaderStylePlugin *pluginFromIdentifier(const QString &id); private: HeaderStylePluginManagerPrivate *const d; }; diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/headerstyle_util.cpp kf5-messagelib-16.12.3/messageviewer/src/header/headerstyle_util.cpp --- kf5-messagelib-16.04.3/messageviewer/src/header/headerstyle_util.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/headerstyle_util.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,38 +1,43 @@ /* - Copyright (c) 2013-2016 Montel Laurent + Copyright (C) 2013-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "headerstyle_util.h" -#include "messageviewer/nodehelper.h" -#include "header/headerstyle.h" #include "messageviewer_debug.h" -#include -#include "utils/iconnamecache.h" -#include "MessageCore/MessageCoreSettings" +#include "contactdisplaymessagememento.h" +#include "kxface.h" + +#include "header/headerstyle.h" +#include "utils/iconnamecache.h" #include "settings/messageviewersettings.h" -#include +#include +#include -#include -#include "contactdisplaymessagememento.h" -#include "kxface.h" +#include #include +#include +#include #include + +#include #include using namespace MessageCore; @@ -60,19 +65,20 @@ QString HeaderStyleUtil::dateString(KMime::Message *message, bool printing, HeaderStyleUtilDateFormat dateFormat) const { const QDateTime dateTime = message->date()->dateTime(); + const time_t unixTime = dateTime.toTime_t(); if (!dateTime.isValid()) { return i18nc("Unknown date", "Unknown"); } if (printing) { - return QLocale::system().toString(dateTime, QLocale::ShortFormat); + return KMime::DateFormatter::formatDate(KMime::DateFormatter::Localized, unixTime); } else { switch (dateFormat) { case ShortDate: - return QLocale::system().toString(dateTime, QLocale::ShortFormat); + return KMime::DateFormatter::formatDate(KMime::DateFormatter::Localized, unixTime); case LongDate: - return QLocale::system().toString(dateTime, QLocale::LongFormat); + return KMime::DateFormatter::formatDate(KMime::DateFormatter::CTime, unixTime);; case FancyShortDate: - return dateShortStr(dateTime); + return KMime::DateFormatter::formatDate(KMime::DateFormatter::Fancy, unixTime);; case FancyLongDate: //Laurent fix me //TODO return QLocale::system().toString(dateTime, QLocale::LongFormat); @@ -104,7 +110,7 @@ { QString subjectDir; if (message->subject(false)) { - subjectDir = directionOf(NodeHelper::cleanSubject(message)); + subjectDir = directionOf(MimeTreeParser::NodeHelper::cleanSubject(message)); } else { subjectDir = directionOf(i18n("No Subject")); } @@ -114,13 +120,11 @@ QString HeaderStyleUtil::spamStatus(KMime::Message *message) const { QString spamHTML; - if (MessageViewer::MessageViewerSettings::self()->showSpamStatus()) { - const SpamScores scores = SpamHeaderAnalyzer::getSpamScores(message); + const SpamScores scores = SpamHeaderAnalyzer::getSpamScores(message); - for (SpamScores::const_iterator it = scores.constBegin(), end = scores.constEnd(); it != end; ++it) - spamHTML += (*it).agent() + QLatin1Char(' ') + - drawSpamMeter((*it).error(), (*it).score(), (*it).confidence(), (*it).spamHeader(), (*it).confidenceHeader()); - } + for (SpamScores::const_iterator it = scores.constBegin(), end = scores.constEnd(); it != end; ++it) + spamHTML += (*it).agent() + QLatin1Char(' ') + + drawSpamMeter((*it).error(), (*it).score(), (*it).confidence(), (*it).spamHeader(), (*it).confidenceHeader()); return spamHTML; } @@ -243,8 +247,8 @@ { // Get the resent-from header into a Mailbox QVector resentFrom; - if (message->headerByType("Resent-From")) { - const QByteArray data = message->headerByType("Resent-From")->as7BitString(false); + if (auto hrd = message->headerByType("Resent-From")) { + const QByteArray data = hrd->as7BitString(false); const char *start = data.data(); const char *end = start + data.length(); KMime::Types::AddressList addressList; @@ -262,8 +266,8 @@ { // Get the resent-from header into a Mailbox QVector resentTo; - if (message->headerByType("Resent-To")) { - const QByteArray data = message->headerByType("Resent-To")->as7BitString(false); + if (auto hrd = message->headerByType("Resent-To")) { + const QByteArray data = hrd->as7BitString(false); const char *start = data.data(); const char *end = start + data.length(); KMime::Types::AddressList addressList; @@ -310,8 +314,8 @@ const QString email = QString::fromLatin1(KEmailAddress::firstEmailAddress(message->from()->as7BitString(false))); photoMemento = new ContactDisplayMessageMemento(email); style->nodeHelper()->setBodyPartMemento(message, "contactphoto", photoMemento); - QObject::connect(photoMemento, SIGNAL(update(MessageViewer::UpdateMode)), - style->sourceObject(), SLOT(update(MessageViewer::UpdateMode))); + QObject::connect(photoMemento, SIGNAL(update(MimeTreeParser::UpdateMode)), + style->sourceObject(), SLOT(update(MimeTreeParser::UpdateMode))); QObject::connect(photoMemento, SIGNAL(changeDisplayMail(Viewer::DisplayFormatMessage,bool)), style->sourceObject(), SIGNAL(changeDisplayMail(Viewer::DisplayFormatMessage,bool))); @@ -343,47 +347,51 @@ useOtherPhotoSources = true; } - if (settings.photoURL.isEmpty() && message->headerByType("Face") && useOtherPhotoSources) { - // no photo, look for a Face header - const QString faceheader = message->headerByType("Face")->asUnicodeString(); - if (!faceheader.isEmpty()) { - - qCDebug(MESSAGEVIEWER_LOG) << "Found Face: header"; - - const QByteArray facestring = faceheader.toUtf8(); - // Spec says header should be less than 998 bytes - // Face: is 5 characters - if (facestring.length() < 993) { - const QByteArray facearray = QByteArray::fromBase64(facestring); - - QImage faceimage; - if (faceimage.loadFromData(facearray, "png")) { - // Spec says image must be 48x48 pixels - if ((48 == faceimage.width()) && (48 == faceimage.height())) { - settings.photoURL = MessageViewer::HeaderStyleUtil::imgToDataUrl(faceimage); - settings.photoWidth = 48; - settings.photoHeight = 48; + if (settings.photoURL.isEmpty() && useOtherPhotoSources) { + if (auto hrd = message->headerByType("Face")) { + // no photo, look for a Face header + const QString faceheader = hrd->asUnicodeString(); + if (!faceheader.isEmpty()) { + + qCDebug(MESSAGEVIEWER_LOG) << "Found Face: header"; + + const QByteArray facestring = faceheader.toUtf8(); + // Spec says header should be less than 998 bytes + // Face: is 5 characters + if (facestring.length() < 993) { + const QByteArray facearray = QByteArray::fromBase64(facestring); + + QImage faceimage; + if (faceimage.loadFromData(facearray, "png")) { + // Spec says image must be 48x48 pixels + if ((48 == faceimage.width()) && (48 == faceimage.height())) { + settings.photoURL = MessageViewer::HeaderStyleUtil::imgToDataUrl(faceimage); + settings.photoWidth = 48; + settings.photoHeight = 48; + } else { + qCDebug(MESSAGEVIEWER_LOG) << "Face: header image is" << faceimage.width() << "by" + << faceimage.height() << "not 48x48 Pixels"; + } } else { - qCDebug(MESSAGEVIEWER_LOG) << "Face: header image is" << faceimage.width() << "by" - << faceimage.height() << "not 48x48 Pixels"; + qCDebug(MESSAGEVIEWER_LOG) << "Failed to load decoded png from Face: header"; } } else { - qCDebug(MESSAGEVIEWER_LOG) << "Failed to load decoded png from Face: header"; + qCDebug(MESSAGEVIEWER_LOG) << "Face: header too long at" << facestring.length(); } - } else { - qCDebug(MESSAGEVIEWER_LOG) << "Face: header too long at" << facestring.length(); } } } - if (settings.photoURL.isEmpty() && message->headerByType("X-Face") && useOtherPhotoSources) { - // no photo, look for a X-Face header - const QString xfhead = message->headerByType("X-Face")->asUnicodeString(); - if (!xfhead.isEmpty()) { - MessageViewer::KXFace xf; - settings.photoURL = MessageViewer::HeaderStyleUtil::imgToDataUrl(xf.toImage(xfhead)); - settings.photoWidth = 48; - settings.photoHeight = 48; + if (settings.photoURL.isEmpty() && useOtherPhotoSources) { + if (auto hrd = message->headerByType("X-Face")) { + // no photo, look for a X-Face header + const QString xfhead = hrd->asUnicodeString(); + if (!xfhead.isEmpty()) { + MessageViewer::KXFace xf; + settings.photoURL = MessageViewer::HeaderStyleUtil::imgToDataUrl(xf.toImage(xfhead)); + settings.photoWidth = 48; + settings.photoHeight = 48; + } } } @@ -406,37 +414,37 @@ QString html; switch (action) { case Viewer::Trash: { - const QString iconPath = IconNameCache::instance()->iconPath(QStringLiteral("user-trash"), KIconLoader::Toolbar); + const QString iconPath = MessageViewer::IconNameCache::instance()->iconPath(QStringLiteral("user-trash"), KIconLoader::Toolbar); html = QStringLiteral("").arg(QUrl::fromLocalFile(iconPath).url(), i18n("Move to Trash"), QString::number(mIconSize)); break; } case Viewer::Reply: { - const QString iconPath = IconNameCache::instance()->iconPath(QStringLiteral("mail-reply-sender"), KIconLoader::Toolbar); + const QString iconPath = MessageViewer::IconNameCache::instance()->iconPath(QStringLiteral("mail-reply-sender"), KIconLoader::Toolbar); html = QStringLiteral("").arg(QUrl::fromLocalFile(iconPath).url(), i18n("Reply"), QString::number(mIconSize)); break; } case Viewer::ReplyToAll: { - const QString iconPath = IconNameCache::instance()->iconPath(QStringLiteral("mail-reply-all"), KIconLoader::Toolbar); + const QString iconPath = MessageViewer::IconNameCache::instance()->iconPath(QStringLiteral("mail-reply-all"), KIconLoader::Toolbar); html = QStringLiteral("").arg(QUrl::fromLocalFile(iconPath).url(), i18n("Reply to All"), QString::number(mIconSize)); break; } case Viewer::Forward: { - const QString iconPath = IconNameCache::instance()->iconPath(QStringLiteral("mail-forward"), KIconLoader::Toolbar); + const QString iconPath = MessageViewer::IconNameCache::instance()->iconPath(QStringLiteral("mail-forward"), KIconLoader::Toolbar); html = QStringLiteral("").arg(QUrl::fromLocalFile(iconPath).url(), i18n("Forward"), QString::number(mIconSize)); break; } case Viewer::NewMessage: { - const QString iconPath = IconNameCache::instance()->iconPath(QStringLiteral("mail-message-new"), KIconLoader::Toolbar); + const QString iconPath = MessageViewer::IconNameCache::instance()->iconPath(QStringLiteral("mail-message-new"), KIconLoader::Toolbar); html = QStringLiteral("").arg(QUrl::fromLocalFile(iconPath).url(), i18n("New Message"), QString::number(mIconSize)); break; } case Viewer::Print: { - const QString iconPath = IconNameCache::instance()->iconPath(QStringLiteral("document-print"), KIconLoader::Toolbar); + const QString iconPath = MessageViewer::IconNameCache::instance()->iconPath(QStringLiteral("document-print"), KIconLoader::Toolbar); html = QStringLiteral("").arg(QUrl::fromLocalFile(iconPath).url(), i18n("Print"), QString::number(mIconSize)); break; } case Viewer::PrintPreview: { - const QString iconPath = IconNameCache::instance()->iconPath(QStringLiteral("document-print-preview"), KIconLoader::Toolbar); + const QString iconPath = MessageViewer::IconNameCache::instance()->iconPath(QStringLiteral("document-print-preview"), KIconLoader::Toolbar); html = QStringLiteral("").arg(QUrl::fromLocalFile(iconPath).url(), i18n("Print Preview"), QString::number(mIconSize)); break; } diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/headerstyle_util.h kf5-messagelib-16.12.3/messageviewer/src/header/headerstyle_util.h --- kf5-messagelib-16.04.3/messageviewer/src/header/headerstyle_util.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/headerstyle_util.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2013-2016 Montel Laurent + Copyright (C) 2013-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + This library 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This library 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 General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef HEADERSTYLE_UTIL_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/kxface.cpp kf5-messagelib-16.12.3/messageviewer/src/header/kxface.cpp --- kf5-messagelib-16.04.3/messageviewer/src/header/kxface.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/kxface.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -130,7 +130,7 @@ tmp.replace(QRegExp(QLatin1String("(\\w{4})")), QStringLiteral("0x\\1,")); len = tmp.length(); char *fbuf = (char *)malloc(len + 1); - strncpy(fbuf, (const char *)tmp.toLatin1(), len); + strncpy(fbuf, tmp.toLatin1().constData(), len); fbuf[len] = '\0'; if (!(status = setjmp(comp_env))) { ReadFace(fbuf); @@ -151,7 +151,7 @@ char *fbuf = (char *)malloc(MAX_XFACE_LENGTH); memset(fbuf, '\0', MAX_XFACE_LENGTH); - strncpy(fbuf, xface.toLatin1(), xface.length()); + strncpy(fbuf, xface.toLatin1().constData(), xface.length()); QByteArray img; if (!(status = setjmp(comp_env))) { UnCompAll(fbuf); /* compress otherwise */ diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/plainheaderstyle.cpp kf5-messagelib-16.12.3/messageviewer/src/header/plainheaderstyle.cpp --- kf5-messagelib-16.04.3/messageviewer/src/header/plainheaderstyle.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/plainheaderstyle.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,22 +1,24 @@ /* - Copyright (c) 2013-2016 Montel Laurent + Copyright (C) 2013-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "plainheaderstyle.h" - +#include "messageviewer/messageviewersettings.h" #include "header/headerstyle_util.h" #include "header/headerstrategy.h" @@ -31,12 +33,44 @@ using namespace MessageViewer; +class MessageViewer::PlainHeaderStylePrivate +{ +public: + PlainHeaderStylePrivate() + { + + } + QString formatAllMessageHeaders(KMime::Message *message) const; + MessageViewer::HeaderStyleUtil mHeaderStyleUtil; +}; + +QString PlainHeaderStylePrivate::formatAllMessageHeaders(KMime::Message *message) const +{ + QByteArray head = message->head(); + KMime::Headers::Base *header = KMime::HeaderParsing::extractFirstHeader(head); + QString result; + while (header) { + result += mHeaderStyleUtil.strToHtml(QLatin1String(header->type()) + QLatin1String(": ") + header->asUnicodeString()); + result += QLatin1String("
\n"); + delete header; + header = KMime::HeaderParsing::extractFirstHeader(head); + } + + return result; +} + PlainHeaderStyle::PlainHeaderStyle() - : HeaderStyle() + : HeaderStyle(), + d(new MessageViewer::PlainHeaderStylePrivate) { } +PlainHeaderStyle::~PlainHeaderStyle() +{ + delete d; +} + // // PlainHeaderStyle: // show every header field on a line by itself, @@ -59,7 +93,7 @@ // considered left-to-right, they are ignored when determining its // direction. - const QString subjectDir = mHeaderStyleUtil.subjectDirectionString(message); + const QString subjectDir = d->mHeaderStyleUtil.subjectDirectionString(message); QString headerStr; if (strategy->headersToDisplay().isEmpty() @@ -67,19 +101,22 @@ // crude way to emulate "all" headers - Note: no strings have // i18n(), so direction should always be ltr. headerStr = QStringLiteral("
"); - headerStr += formatAllMessageHeaders(message); + headerStr += d->formatAllMessageHeaders(message); return headerStr + QLatin1String("
"); } headerStr = QStringLiteral("
").arg(dir); //case HdrLong: - if (strategy->showHeader(QStringLiteral("subject"))) + if (strategy->showHeader(QStringLiteral("subject"))) { + const KTextToHTML::Options flags = KTextToHTML::PreserveSpaces | KTextToHTML::ReplaceSmileys; + headerStr += QStringLiteral("
").arg(subjectDir) + - mHeaderStyleUtil.subjectString(message) + QLatin1String("
\n"); + d->mHeaderStyleUtil.subjectString(message, flags) + QLatin1String("
\n"); + } if (strategy->showHeader(QStringLiteral("date"))) { - headerStr.append(i18n("Date: ") + mHeaderStyleUtil.strToHtml(mHeaderStyleUtil.dateString(message, isPrinting(), /* short = */ MessageViewer::HeaderStyleUtil::CustomDate)) + QLatin1String("
\n")); + headerStr.append(i18n("Date: ") + d->mHeaderStyleUtil.strToHtml(d->mHeaderStyleUtil.dateString(message, isPrinting(), /* short = */ MessageViewer::HeaderStyleUtil::CustomDate)) + QLatin1String("
\n")); } if (strategy->showHeader(QStringLiteral("from"))) { @@ -92,7 +129,7 @@ if (strategy->showHeader(QStringLiteral("organization")) && message->organization(false)) headerStr.append(QLatin1String("  (") + - mHeaderStyleUtil.strToHtml(message->organization()->asUnicodeString()) + QLatin1Char(')')); + d->mHeaderStyleUtil.strToHtml(message->organization()->asUnicodeString()) + QLatin1Char(')')); headerStr.append(QLatin1String("
\n")); } @@ -100,13 +137,19 @@ headerStr.append(i18nc("To-field of the mailheader.", "To: ") + StringUtil::emailAddrAsAnchor(message->to(), StringUtil::DisplayFullAddress) + QLatin1String("
\n")); - if (strategy->showHeader(QStringLiteral("cc")) && message->cc(false)) - headerStr.append(i18n("CC: ") + - StringUtil::emailAddrAsAnchor(message->cc(), StringUtil::DisplayFullAddress) + QLatin1String("
\n")); - - if (strategy->showHeader(QStringLiteral("bcc")) && message->bcc(false)) - headerStr.append(i18n("BCC: ") + - StringUtil::emailAddrAsAnchor(message->bcc(), StringUtil::DisplayFullAddress) + QLatin1String("
\n")); + if (strategy->showHeader(QStringLiteral("cc")) && message->cc(false)) { + const QString str = StringUtil::emailAddrAsAnchor(message->cc(), StringUtil::DisplayFullAddress); + if (!str.isEmpty()) { + headerStr.append(i18n("CC: ") + str + QLatin1String("
\n")); + } + } + + if (strategy->showHeader(QStringLiteral("bcc")) && message->bcc(false)) { + const QString str = StringUtil::emailAddrAsAnchor(message->bcc(), StringUtil::DisplayFullAddress); + if (!str.isEmpty()) { + headerStr.append(i18n("BCC: ") + str + QLatin1String("
\n")); + } + } if (strategy->showHeader(QStringLiteral("reply-to")) && message->replyTo(false)) headerStr.append(i18n("Reply to: ") + @@ -117,21 +160,6 @@ return headerStr; } -QString PlainHeaderStyle::formatAllMessageHeaders(KMime::Message *message) const -{ - QByteArray head = message->head(); - KMime::Headers::Base *header = KMime::HeaderParsing::extractFirstHeader(head); - QString result; - while (header) { - result += mHeaderStyleUtil.strToHtml(QLatin1String(header->type()) + QLatin1String(": ") + header->asUnicodeString()); - result += QLatin1String("
\n"); - delete header; - header = KMime::HeaderParsing::extractFirstHeader(head); - } - - return result; -} - const char *MessageViewer::PlainHeaderStyle::name() const { return "plain"; diff -Nru kf5-messagelib-16.04.3/messageviewer/src/header/plainheaderstyle.h kf5-messagelib-16.12.3/messageviewer/src/header/plainheaderstyle.h --- kf5-messagelib-16.04.3/messageviewer/src/header/plainheaderstyle.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/header/plainheaderstyle.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,33 +1,35 @@ /* - Copyright (c) 2013-2016 Montel Laurent + Copyright (C) 2013-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef PLAINHEADERSTYLE_H #define PLAINHEADERSTYLE_H #include "messageviewer/headerstyle.h" -#include "headerstyle_util.h" #include "messageviewer_export.h" namespace MessageViewer { +class PlainHeaderStylePrivate; class MESSAGEVIEWER_EXPORT PlainHeaderStyle : public HeaderStyle { public: PlainHeaderStyle(); - ~PlainHeaderStyle() {} + ~PlainHeaderStyle(); public: const char *name() const Q_DECL_OVERRIDE; @@ -35,8 +37,7 @@ QString format(KMime::Message *message) const Q_DECL_OVERRIDE; private: - QString formatAllMessageHeaders(KMime::Message *message) const; - MessageViewer::HeaderStyleUtil mHeaderStyleUtil; + PlainHeaderStylePrivate *const d; }; } #endif // PLAINHEADERSTYLE_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/autotests/CMakeLists.txt kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/autotests/CMakeLists.txt --- kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/autotests/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/autotests/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,15 @@ +ecm_add_test(webengineembedparttest.cpp ../webengineembedpart.cpp + TEST_NAME webengineembedparttest + NAME_PREFIX "messageviewer-webengine-" + LINK_LIBRARIES Qt5::Test Qt5::Core + ) + +set(webengineparthtmlwritertestdebug_SRCS) +ecm_qt_declare_logging_category(webengineparthtmlwritertestdebug_SRCS HEADER messageviewer_debug.h IDENTIFIER MESSAGEVIEWER_LOG CATEGORY_NAME org.kde.pim.messageviewer) + + +ecm_add_test(webengineparthtmlwritertest.cpp ../webengineembedpart.cpp ../webengineparthtmlwriter.cpp ${webengineparthtmlwritertestdebug_SRCS} + TEST_NAME webengineparthtmlwritertest + NAME_PREFIX "messageviewer-webengine-" + LINK_LIBRARIES Qt5::Test Qt5::Core KF5::MimeTreeParser KF5::MessageViewer Qt5::WebKitWidgets KF5::WebEngineViewer + ) diff -Nru kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/autotests/webengineembedparttest.cpp kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/autotests/webengineembedparttest.cpp --- kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/autotests/webengineembedparttest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/autotests/webengineembedparttest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,70 @@ +/* + Copyright (c) 2016 Montel Laurent + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "webengineembedparttest.h" +#include "../webengineembedpart.h" +#include + +WebEngineEmbedPartTest::WebEngineEmbedPartTest(QObject *parent) + : QObject(parent) +{ + +} + +WebEngineEmbedPartTest::~WebEngineEmbedPartTest() +{ + +} + +void WebEngineEmbedPartTest::shouldHaveDefaultValue() +{ + MessageViewer::WebEngineEmbedPart part; + QVERIFY(part.isEmpty()); +} + +void WebEngineEmbedPartTest::shouldClearValue() +{ + MessageViewer::WebEngineEmbedPart part; + part.addEmbedPart(QByteArrayLiteral("foo"), QStringLiteral("bla")); + QVERIFY(!part.isEmpty()); + QCOMPARE(part.embeddedPartMap().count(), 1); + + part.clear(); + QVERIFY(part.isEmpty()); +} + +void WebEngineEmbedPartTest::shouldAddValues() +{ + MessageViewer::WebEngineEmbedPart part; + part.addEmbedPart(QByteArrayLiteral("foo"), QStringLiteral("bla")); + QVERIFY(!part.isEmpty()); + QCOMPARE(part.embeddedPartMap().count(), 1); + part.addEmbedPart(QByteArrayLiteral("foo1"), QStringLiteral("bla")); + QCOMPARE(part.embeddedPartMap().count(), 2); +} + +void WebEngineEmbedPartTest::shouldAddTwoIdenticalValues() +{ + MessageViewer::WebEngineEmbedPart part; + part.addEmbedPart(QByteArrayLiteral("foo"), QStringLiteral("bla")); + QVERIFY(!part.isEmpty()); + QCOMPARE(part.embeddedPartMap().count(), 1); + part.addEmbedPart(QByteArrayLiteral("foo"), QStringLiteral("bla")); + QCOMPARE(part.embeddedPartMap().count(), 1); +} + +QTEST_MAIN(WebEngineEmbedPartTest) diff -Nru kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/autotests/webengineembedparttest.h kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/autotests/webengineembedparttest.h --- kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/autotests/webengineembedparttest.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/autotests/webengineembedparttest.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,36 @@ +/* + Copyright (c) 2016 Montel Laurent + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef WEBENGINEEMBEDPARTTEST_H +#define WEBENGINEEMBEDPARTTEST_H + +#include + +class WebEngineEmbedPartTest : public QObject +{ + Q_OBJECT +public: + explicit WebEngineEmbedPartTest(QObject *parent = Q_NULLPTR); + ~WebEngineEmbedPartTest(); +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldClearValue(); + void shouldAddValues(); + void shouldAddTwoIdenticalValues(); +}; + +#endif // WEBENGINEEMBEDPARTTEST_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/autotests/webengineparthtmlwritertest.cpp kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/autotests/webengineparthtmlwritertest.cpp --- kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/autotests/webengineparthtmlwritertest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/autotests/webengineparthtmlwritertest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,73 @@ +/* + Copyright (c) 2016 Montel Laurent + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "webengineparthtmlwritertest.h" +#include "../webengineparthtmlwriter.h" + +#include + +WebEnginePartHtmlWriterTest::WebEnginePartHtmlWriterTest(QObject *parent) + : QObject(parent) +{ + +} + +WebEnginePartHtmlWriterTest::~WebEnginePartHtmlWriterTest() +{ + +} + +void WebEnginePartHtmlWriterTest::removeScriptInHtml_data() +{ + QTest::addColumn("input"); + QTest::addColumn("output"); + QTest::newRow("noscript") << QStringLiteral("boo") << QStringLiteral("boo"); + QTest::newRow("onescript") << QStringLiteral("boo") << QStringLiteral("boo"); + QTest::newRow("onescriptwithattribute") << QStringLiteral("boo") << QStringLiteral("boo"); + QTest::newRow("severalscriptwithattribute") << QStringLiteral("

foo

boo") << QStringLiteral("

foo

boo"); + QTest::newRow("scriptwithspace") << QStringLiteral("boo") << QStringLiteral("boo"); + QTest::newRow("scriptwithremoveaccess") << QStringLiteral("boo") << QStringLiteral("boo"); + QTest::newRow("multiline-scriptwithspace") << QStringLiteral("boo") << QStringLiteral("boo"); + QTest::newRow("multiline-severalscriptwithattribute") << QStringLiteral("

foo

boo") << QStringLiteral("

foo

boo"); + QTest::newRow("multiline-scriptwithspace") << QStringLiteral("boo") << QStringLiteral("boo"); + + //Insensitive case + QTest::newRow("onescript-insensitive") << QStringLiteral("boo") << QStringLiteral("boo"); + QTest::newRow("onescriptwithattribute-insensitive") << QStringLiteral("boo") << QStringLiteral("boo"); + QTest::newRow("severalscriptwithattribute-insensitive") << QStringLiteral("

foo

boo") << QStringLiteral("

foo

boo"); + QTest::newRow("scriptwithspace-insensitive") << QStringLiteral("boo") << QStringLiteral("boo"); + QTest::newRow("scriptwithremoveaccess-insensitive") << QStringLiteral("boo") << QStringLiteral("boo"); + QTest::newRow("multiline-scriptwithspace-insensitive") << QStringLiteral("boo") << QStringLiteral("boo"); + QTest::newRow("multiline-severalscriptwithattribute-insensitive") << QStringLiteral("

foo

boo") << QStringLiteral("

foo

boo"); + QTest::newRow("multiline-scriptwithspace-insensitive") << QStringLiteral("boo") << QStringLiteral("boo"); +} + +void WebEnginePartHtmlWriterTest::removeScriptInHtml() +{ + QFETCH(QString, input); + QFETCH(QString, output); + QCOMPARE(MessageViewer::WebEnginePartHtmlWriter::removeJscripts(input), output); +} + +QTEST_MAIN(WebEnginePartHtmlWriterTest) diff -Nru kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/autotests/webengineparthtmlwritertest.h kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/autotests/webengineparthtmlwritertest.h --- kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/autotests/webengineparthtmlwritertest.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/autotests/webengineparthtmlwritertest.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,34 @@ +/* + Copyright (c) 2016 Montel Laurent + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef WEBENGINEPARTHTMLWRITERTEST_H +#define WEBENGINEPARTHTMLWRITERTEST_H + +#include + +class WebEnginePartHtmlWriterTest : public QObject +{ + Q_OBJECT +public: + explicit WebEnginePartHtmlWriterTest(QObject *parent = Q_NULLPTR); + ~WebEnginePartHtmlWriterTest(); +private Q_SLOTS: + void removeScriptInHtml_data(); + void removeScriptInHtml(); +}; + +#endif // WEBENGINEPARTHTMLWRITERTEST_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/filehtmlwriter.cpp kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/filehtmlwriter.cpp --- kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/filehtmlwriter.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/filehtmlwriter.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,119 +0,0 @@ -/* -*- c++ -*- - filehtmlwriter.cpp - - This file is part of KMail, the KDE mail client. - Copyright (c) 2003 Marc Mutz - - KMail is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - KMail is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - In addition, as a special exception, the copyright holders give - permission to link the code of this program with any edition of - the Qt library by Trolltech AS, Norway (or with modified versions - of Qt that use the same license as Qt), and distribute linked - combinations including the two. You must obey the GNU General - Public License in all respects for all of the code used other than - Qt. If you modify this file, you may extend this exception to - your version of the file, but you are not obligated to do so. If - you do not wish to do so, delete this exception statement from - your version. -*/ - -#include "filehtmlwriter.h" - -#include "messageviewer_debug.h" - -namespace MessageViewer -{ - -FileHtmlWriter::FileHtmlWriter(const QString &filename) - : HtmlWriter(), - mFile(filename.isEmpty() ? QStringLiteral("filehtmlwriter.out") : filename) -{ - mStream.setCodec("UTF-8"); -} - -FileHtmlWriter::~FileHtmlWriter() -{ - if (mFile.isOpen()) { - qCWarning(MESSAGEVIEWER_LOG) << "FileHtmlWriter: file still open!"; - mStream.setDevice(0); - mFile.close(); - } -} - -void FileHtmlWriter::begin(const QString &css) -{ - openOrWarn(); - if (!css.isEmpty()) { - write(QLatin1String("\n")); - } -} - -void FileHtmlWriter::end() -{ - flush(); - mStream.setDevice(0); - mFile.close(); -} - -void FileHtmlWriter::reset() -{ - if (mFile.isOpen()) { - mStream.setDevice(0); - mFile.close(); - } -} - -void FileHtmlWriter::write(const QString &str) -{ - mStream << str.toUtf8(); - flush(); -} - -void FileHtmlWriter::queue(const QString &str) -{ - write(str); -} - -void FileHtmlWriter::flush() -{ - mStream.flush(); - mFile.flush(); -} - -void FileHtmlWriter::openOrWarn() -{ - if (mFile.isOpen()) { - qCWarning(MESSAGEVIEWER_LOG) << "FileHtmlWriter: file still open!"; - mStream.setDevice(0); - mFile.close(); - } - if (!mFile.open(QIODevice::WriteOnly)) { - qCWarning(MESSAGEVIEWER_LOG) << "FileHtmlWriter: Cannot open file" << mFile.fileName(); - } else { - mStream.setDevice(&mFile); - } -} - -void FileHtmlWriter::embedPart(const QByteArray &contentId, const QString &url) -{ - mStream << "" << endl; - flush(); -} -void FileHtmlWriter::extraHead(const QString &) -{ - -} - -} // diff -Nru kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/filehtmlwriter.h kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/filehtmlwriter.h --- kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/filehtmlwriter.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/filehtmlwriter.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -/* -*- c++ -*- - filehtmlwriter.h - - This file is part of KMail, the KDE mail client. - Copyright (c) 2003 Marc Mutz - - KMail is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - KMail is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - In addition, as a special exception, the copyright holders give - permission to link the code of this program with any edition of - the Qt library by Trolltech AS, Norway (or with modified versions - of Qt that use the same license as Qt), and distribute linked - combinations including the two. You must obey the GNU General - Public License in all respects for all of the code used other than - Qt. If you modify this file, you may extend this exception to - your version of the file, but you are not obligated to do so. If - you do not wish to do so, delete this exception statement from - your version. -*/ - -#ifndef __MESSAGEVIEWER_FILEHTMLWRITER_H__ -#define __MESSAGEVIEWER_FILEHTMLWRITER_H__ - -#include "messageviewer_export.h" -#include "messageviewer/htmlwriter.h" - -#include -#include - -class QString; - -namespace MessageViewer -{ - -class MESSAGEVIEWER_EXPORT FileHtmlWriter : public HtmlWriter -{ -public: - explicit FileHtmlWriter(const QString &filename); - virtual ~FileHtmlWriter(); - - void begin(const QString &cssDefs) Q_DECL_OVERRIDE; - void end() Q_DECL_OVERRIDE; - void reset() Q_DECL_OVERRIDE; - void write(const QString &str) Q_DECL_OVERRIDE; - void queue(const QString &str) Q_DECL_OVERRIDE; - void flush() Q_DECL_OVERRIDE; - void embedPart(const QByteArray &contentId, const QString &url) Q_DECL_OVERRIDE; - void extraHead(const QString &str) Q_DECL_OVERRIDE; -private: - void openOrWarn(); - -private: - QFile mFile; - QTextStream mStream; -}; - -} // namespace MessageViewer - -#endif // __MESSAGEVIEWER_FILEHTMLWRITER_H__ diff -Nru kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/queuehtmlwriter.cpp kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/queuehtmlwriter.cpp --- kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/queuehtmlwriter.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/queuehtmlwriter.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,131 +0,0 @@ -/* - Copyright (c) 2015 Sandro Knauß - - This library 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. - - This library 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 this library; see the file COPYING.LIB. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. -*/ - -#include "queuehtmlwriter.h" - -#include "messageviewer_debug.h" - -#include -#include - -using namespace MessageViewer; - -QueueHtmlWriter::QueueHtmlWriter(HtmlWriter *base) - : HtmlWriter() - , mBase(base) -{ -} - -QueueHtmlWriter::~QueueHtmlWriter() -{ -} - -void QueueHtmlWriter::begin(const QString &css) -{ - Command cmd; - cmd.type = Command::Begin; - cmd.s = css; - mQueue.append(cmd); -} - -void QueueHtmlWriter::end() -{ - Command cmd; - cmd.type = Command::End; - mQueue.append(cmd); -} - -void QueueHtmlWriter::reset() -{ - Command cmd; - cmd.type = Command::Reset; - mQueue.append(cmd); -} - -void QueueHtmlWriter::write(const QString &str) -{ - Command cmd; - cmd.type = Command::Write; - cmd.s = str; - mQueue.append(cmd); -} - -void QueueHtmlWriter::queue(const QString &str) -{ - Command cmd; - cmd.type = Command::Queue; - cmd.s = str; - mQueue.append(cmd); -} - -void QueueHtmlWriter::flush() -{ - Command cmd; - cmd.type = Command::Flush; - mQueue.append(cmd); -} - -void QueueHtmlWriter::replay() -{ - foreach (auto entry, mQueue) { - switch (entry.type) { - case Command::Begin: - mBase->begin(entry.s); - break; - case Command::End: - mBase->end(); - break; - case Command::Reset: - mBase->reset(); - break; - case Command::Write: - mBase->write(entry.s); - break; - case Command::Queue: - mBase->queue(entry.s); - break; - case Command::Flush: - mBase->flush(); - break; - case Command::EmbedPart: - mBase->embedPart(entry.b, entry.s); - break; - case Command::ExtraHead: - mBase->extraHead(entry.s); - break; - } - } -} - -void QueueHtmlWriter::embedPart(const QByteArray &contentId, const QString &url) -{ - Command cmd; - cmd.type = Command::EmbedPart; - cmd.s = url; - cmd.b = contentId; - mQueue.append(cmd); -} -void QueueHtmlWriter::extraHead(const QString &extra) -{ - Command cmd; - cmd.type = Command::ExtraHead; - cmd.s = extra; - mQueue.append(cmd); -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/queuehtmlwriter.h kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/queuehtmlwriter.h --- kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/queuehtmlwriter.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/queuehtmlwriter.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -/* - Copyright (c) 2015 Sandro Knauß - - This library 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. - - This library 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 this library; see the file COPYING.LIB. If not, write to the - Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. -*/ - -#ifndef __MESSAGEVIEWER_QUEUEHTMLWRITER_H__ -#define __MESSAGEVIEWER_QUEUEHTMLWRITER_H__ - -#include "messageviewer_export.h" -#include "messageviewer/htmlwriter.h" - -#include -#include - -class QString; -class QByteArray; - -namespace MessageViewer -{ -/** -\brief Cache HTML output and not write them directy. - -This class is needed to make it possible to first process the mime tree and -afterwards render the HTML. - -Please do not use this class - it is only added to make it possible to slowly -move ObjectTreeParser to a process fist / render later. - -*/ -struct Command { - enum { Begin, End, Reset, Write, Queue, Flush, EmbedPart, ExtraHead } type; - QString s; - QByteArray b; -}; - -class MESSAGEVIEWER_DEPRECATED_EXPORT QueueHtmlWriter : public HtmlWriter -{ -public: - explicit QueueHtmlWriter(MessageViewer::HtmlWriter *base); - virtual ~QueueHtmlWriter(); - - void begin(const QString &cssDefs) Q_DECL_OVERRIDE; - void end() Q_DECL_OVERRIDE; - void reset() Q_DECL_OVERRIDE; - void write(const QString &str) Q_DECL_OVERRIDE; - void queue(const QString &str) Q_DECL_OVERRIDE; - void flush() Q_DECL_OVERRIDE; - void embedPart(const QByteArray &contentId, const QString &url) Q_DECL_OVERRIDE; - void extraHead(const QString &str) Q_DECL_OVERRIDE; - - void replay(); - -private: - HtmlWriter *mBase; - QVector mQueue; -}; - -} // namespace MessageViewer - -#endif // __MESSAGEVIEWER_QUEUEHTMLWRITER_H__ diff -Nru kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/teehtmlwriter.cpp kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/teehtmlwriter.cpp --- kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/teehtmlwriter.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/teehtmlwriter.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -34,8 +34,8 @@ namespace MessageViewer { -TeeHtmlWriter::TeeHtmlWriter(HtmlWriter *writer1, HtmlWriter *writer2) - : HtmlWriter() +TeeHtmlWriter::TeeHtmlWriter(HtmlWriter *writer1, MimeTreeParser::HtmlWriter *writer2) + : MimeTreeParser::HtmlWriter() { if (writer1) { mWriters.append(writer1); @@ -61,49 +61,56 @@ void TeeHtmlWriter::begin(const QString &css) { - for (QList::Iterator it = mWriters.begin(); it != mWriters.end(); ++it) { + QList::const_iterator end(mWriters.constEnd()); + for (QList::const_iterator it = mWriters.constBegin(); it != end; ++it) { (*it)->begin(css); } } void TeeHtmlWriter::end() { - for (QList::Iterator it = mWriters.begin(); it != mWriters.end(); ++it) { + QList::const_iterator end(mWriters.constEnd()); + for (QList::const_iterator it = mWriters.constBegin(); it != end; ++it) { (*it)->end(); } } void TeeHtmlWriter::reset() { - for (QList::Iterator it = mWriters.begin(); it != mWriters.end(); ++it) { + QList::const_iterator end(mWriters.constEnd()); + for (QList::const_iterator it = mWriters.constBegin(); it != end; ++it) { (*it)->reset(); } } void TeeHtmlWriter::write(const QString &str) { - for (QList::Iterator it = mWriters.begin(); it != mWriters.end(); ++it) { + QList::const_iterator end(mWriters.constEnd()); + for (QList::const_iterator it = mWriters.constBegin(); it != end; ++it) { (*it)->write(str); } } void TeeHtmlWriter::queue(const QString &str) { - for (QList::Iterator it = mWriters.begin(); it != mWriters.end(); ++it) { + QList::const_iterator end(mWriters.constEnd()); + for (QList::const_iterator it = mWriters.constBegin(); it != end; ++it) { (*it)->queue(str); } } void TeeHtmlWriter::flush() { - for (QList::Iterator it = mWriters.begin(); it != mWriters.end(); ++it) { + QList::const_iterator end(mWriters.constEnd()); + for (QList::const_iterator it = mWriters.constBegin(); it != end; ++it) { (*it)->flush(); } } void TeeHtmlWriter::embedPart(const QByteArray &contentId, const QString &url) { - for (QList::Iterator it = mWriters.begin(); it != mWriters.end(); ++it) { + QList::const_iterator end(mWriters.constEnd()); + for (QList::const_iterator it = mWriters.constBegin(); it != end; ++it) { (*it)->embedPart(contentId, url); } } diff -Nru kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/teehtmlwriter.h kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/teehtmlwriter.h --- kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/teehtmlwriter.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/teehtmlwriter.h 2017-03-06 12:30:37.000000000 +0000 @@ -32,7 +32,7 @@ #ifndef __MESSAGEVIEWER_TEEHTMLWRITER_H__ #define __MESSAGEVIEWER_TEEHTMLWRITER_H__ -#include "interfaces/htmlwriter.h" +#include #include @@ -44,11 +44,11 @@ /** @short A HtmlWriter that dispatches all calls to a list of other HtmlWriters @author Marc Mutz **/ -class TeeHtmlWriter : public HtmlWriter +class TeeHtmlWriter : public MimeTreeParser::HtmlWriter { public: - explicit TeeHtmlWriter(HtmlWriter *writer1 = 0, - HtmlWriter *writer2 = 0); + explicit TeeHtmlWriter(HtmlWriter *writer1 = Q_NULLPTR, + MimeTreeParser::HtmlWriter *writer2 = Q_NULLPTR); virtual ~TeeHtmlWriter(); void addHtmlWriter(HtmlWriter *writer); diff -Nru kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/webengineembedpart.cpp kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/webengineembedpart.cpp --- kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/webengineembedpart.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/webengineembedpart.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,79 @@ +/* + Copyright (c) 2016 Montel Laurent + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "webengineembedpart.h" + +using namespace MessageViewer; + +class WebEngineEmbedPartInstancePrivate +{ +public: + WebEngineEmbedPartInstancePrivate() + : webEngineEmbedPart(new WebEngineEmbedPart) + { + } + + ~WebEngineEmbedPartInstancePrivate() + { + delete webEngineEmbedPart; + } + + WebEngineEmbedPart *webEngineEmbedPart; +}; + +Q_GLOBAL_STATIC(WebEngineEmbedPartInstancePrivate, sInstance) + +WebEngineEmbedPart::WebEngineEmbedPart(QObject *parent) + : QObject(parent) +{ + +} + +WebEngineEmbedPart::~WebEngineEmbedPart() +{ + +} + +WebEngineEmbedPart *WebEngineEmbedPart::self() +{ + return sInstance->webEngineEmbedPart; +} + +QString WebEngineEmbedPart::contentUrl(const QString &contentId) const +{ + return mEmbeddedPartMap.value(contentId); +} + +void WebEngineEmbedPart::addEmbedPart(const QByteArray &contentId, const QString &contentURL) +{ + mEmbeddedPartMap[QLatin1String(contentId)] = contentURL; +} + +void WebEngineEmbedPart::clear() +{ + mEmbeddedPartMap.clear(); +} + +bool WebEngineEmbedPart::isEmpty() const +{ + return mEmbeddedPartMap.isEmpty(); +} + +QMap WebEngineEmbedPart::embeddedPartMap() const +{ + return mEmbeddedPartMap; +} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/webengineembedpart.h kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/webengineembedpart.h --- kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/webengineembedpart.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/webengineembedpart.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,46 @@ +/* + Copyright (c) 2016 Montel Laurent + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef WEBENGINEEMBEDPART_H +#define WEBENGINEEMBEDPART_H + +#include +#include +namespace MessageViewer +{ +class WebEngineEmbedPart : public QObject +{ + Q_OBJECT +public: + explicit WebEngineEmbedPart(QObject *parent = Q_NULLPTR); + ~WebEngineEmbedPart(); + + void clear(); + bool isEmpty() const; + + QMap embeddedPartMap() const; + + void addEmbedPart(const QByteArray &contentId, const QString &contentURL); + QString contentUrl(const QString &contentId) const; + + static WebEngineEmbedPart *self(); +private: + // Key is Content-Id, value is URL + QMap mEmbeddedPartMap; +}; +} +#endif // WEBENGINEEMBEDPART_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/webengineparthtmlwriter.cpp kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/webengineparthtmlwriter.cpp --- kf5-messagelib-16.04.3/messageviewer/src/htmlwriter/webengineparthtmlwriter.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/htmlwriter/webengineparthtmlwriter.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -15,6 +15,7 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "webengineparthtmlwriter.h" +#include "webengineembedpart.h" #include "messageviewer_debug.h" #include "viewer/webengine/mailwebengineview.h" @@ -23,11 +24,12 @@ #include #include +#include using namespace MessageViewer; WebEnginePartHtmlWriter::WebEnginePartHtmlWriter(MailWebEngineView *view, QObject *parent) - : QObject(parent), HtmlWriter(), + : QObject(parent), MimeTreeParser::HtmlWriter(), mHtmlView(view), mState(Ended) { assert(view); @@ -46,14 +48,7 @@ reset(); } - mEmbeddedPartMap.clear(); -#if 0 //FIXME - // clear the widget: - mHtmlView->setUpdatesEnabled(false); - mHtmlView->scrollUp(10); - // PENDING(marc) push into MailWebView -#endif - mHtmlView->load(QUrl()); + MessageViewer::WebEngineEmbedPart::self()->clear(); mState = Begun; } @@ -66,20 +61,48 @@ insertExtraHead(); mExtraHead.clear(); } +#if QT_VERSION < QT_VERSION_CHECK(5, 7, 0) + mHtml = removeJscripts(mHtml); +#endif mHtmlView->setHtml(mHtml, QUrl(QStringLiteral("file:///"))); mHtmlView->show(); mHtml.clear(); - resolveCidUrls(); -#if 0 //FIXME - mHtmlView->scamCheck(); -#endif mHtmlView->setUpdatesEnabled(true); mHtmlView->update(); mState = Ended; Q_EMIT finished(); } +QString WebEnginePartHtmlWriter::removeJscripts(QString str) +{ + //Remove regular + const QRegularExpression regScript(QStringLiteral("]*>.*?"), QRegularExpression::CaseInsensitiveOption); + str.remove(regScript); + //Remove string as <\"> +--nextPart8606278.tpV19BTJKu-- + diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testjquerysupportmailwebengine.cpp kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testjquerysupportmailwebengine.cpp --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testjquerysupportmailwebengine.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testjquerysupportmailwebengine.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,90 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "testjquerysupportmailwebengine.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +TestJQuerySupportMailWebEngine::TestJQuerySupportMailWebEngine(QWidget *parent) + : QWidget(parent) +{ + QVBoxLayout *vboxLayout = new QVBoxLayout(this); + viewer = new MessageViewer::Viewer(0, 0, new KActionCollection(this)); + vboxLayout->addWidget(viewer); + viewer->setMessage(readAndParseMail(QStringLiteral("encapsulated-with-attachment.mbox"))); + viewer->setPluginName(QStringLiteral("enterprise")); + viewer->setAttachmentStrategy(MimeTreeParser::AttachmentStrategy::headerOnly()); + + mEditor = new QTextEdit(this); + mEditor->setAcceptRichText(false); + mEditor->setPlainText(QStringLiteral("qt.jQuery('img').each( function () { qt.jQuery(this).css('-webkit-transition', '-webkit-transform 2s'); qt.jQuery(this).css('-webkit-transform', 'rotate(180deg)') } ); undefined")); + vboxLayout->addWidget(mEditor); + + QPushButton *executeQuery = new QPushButton(QStringLiteral("Execute Query"), this); + connect(executeQuery, &QPushButton::clicked, this, &TestJQuerySupportMailWebEngine::slotExecuteQuery); + vboxLayout->addWidget(executeQuery); +} + +TestJQuerySupportMailWebEngine::~TestJQuerySupportMailWebEngine() +{ + +} + +KMime::Message::Ptr TestJQuerySupportMailWebEngine::readAndParseMail(const QString &mailFile) +{ + QFile file(QLatin1String(MAIL_DATA_DIR) + QLatin1Char('/') + mailFile); + file.open(QIODevice::ReadOnly); + QByteArray ba = file.readAll(); + qDebug() << ba; + const QByteArray data = ba; + Q_ASSERT(!data.isEmpty()); + KMime::Message::Ptr msg(new KMime::Message); + msg->setContent(data); + msg->parse(); + return msg; +} + +void TestJQuerySupportMailWebEngine::slotExecuteQuery() +{ + const QString code = mEditor->toPlainText(); + if (!code.isEmpty()) { + viewer->runJavaScript(code); + } +} + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + app.setAttribute(Qt::AA_UseHighDpiPixmaps, true); + TestJQuerySupportMailWebEngine *testWebEngine = new TestJQuerySupportMailWebEngine; + testWebEngine->show(); + const int ret = app.exec(); + return ret; +} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testjquerysupportmailwebengine.h kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testjquerysupportmailwebengine.h --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testjquerysupportmailwebengine.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testjquerysupportmailwebengine.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,47 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef TestJQuerySupportMailWebEngine_H +#define TestJQuerySupportMailWebEngine_H + +#include +#include +namespace MessageViewer +{ +class Viewer; +} + +class QTextEdit; +class TestJQuerySupportMailWebEngine : public QWidget +{ + Q_OBJECT +public: + explicit TestJQuerySupportMailWebEngine(QWidget *parent = Q_NULLPTR); + ~TestJQuerySupportMailWebEngine(); + +private Q_SLOTS: + void slotExecuteQuery(); + +private: + KMime::Message::Ptr readAndParseMail(const QString &mailFile); + MessageViewer::Viewer *viewer; + QTextEdit *mEditor; +}; + +#endif diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testjquerysupportmailwebengine.js kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testjquerysupportmailwebengine.js --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testjquerysupportmailwebengine.js 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testjquerysupportmailwebengine.js 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,10 @@ +qt.jQuery('#kmailshowattachment').click(function(){ +qt.jQuery('#kmailshowattachment').hide(); +qt.jQuery("#kmailhideattachment").show(); +qt.jQuery("#attachmentid").hide()} +); +qt.jQuery('#kmailhideattachment').click(function(){ +qt.jQuery("#kmailhideattachment").hide(); +qt.jQuery("#kmailshowattachment").show(); +qt.jQuery("#attachmentid").show()} +); diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testmaildndattachment.cpp kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testmaildndattachment.cpp --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testmaildndattachment.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testmaildndattachment.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,70 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "testmaildndattachment.h" + +#include +#include +#include +#include +#include +#include + +#include +#include + +TestMailDndAttachment::TestMailDndAttachment(QWidget *parent) + : QWidget(parent) +{ + QVBoxLayout *vbox = new QVBoxLayout; + setLayout(vbox); + MessageViewer::Viewer *viewer = new MessageViewer::Viewer(0, 0, new KActionCollection(this)); + vbox->addWidget(viewer); + viewer->setMessage(readAndParseMail(QStringLiteral("encapsulated-with-attachment.mbox"))/*KMime::Message::Ptr(msg)*/); + viewer->setPluginName(QStringLiteral("longheaderstyleplugin")); +} + +TestMailDndAttachment::~TestMailDndAttachment() +{ + +} + +KMime::Message::Ptr TestMailDndAttachment::readAndParseMail(const QString &mailFile) +{ + QFile file(QLatin1String(MAIL_DATA_DIR) + QLatin1Char('/') + mailFile); + file.open(QIODevice::ReadOnly); + QByteArray ba = file.readAll(); + qDebug() << ba; + const QByteArray data = ba; + Q_ASSERT(!data.isEmpty()); + KMime::Message::Ptr msg(new KMime::Message); + msg->setContent(data); + msg->parse(); + return msg; +} + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + app.setAttribute(Qt::AA_UseHighDpiPixmaps, true); + TestMailDndAttachment *testWebEngine = new TestMailDndAttachment; + testWebEngine->show(); + const int ret = app.exec(); + return ret; +} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testmaildndattachment.h kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testmaildndattachment.h --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testmaildndattachment.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testmaildndattachment.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,36 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef TESTMAILDNDATTACHMENT_H +#define TESTMAILDNDATTACHMENT_H + +#include +#include + +class TestMailDndAttachment : public QWidget +{ + Q_OBJECT +public: + explicit TestMailDndAttachment(QWidget *parent = Q_NULLPTR); + ~TestMailDndAttachment(); +private: + KMime::Message::Ptr readAndParseMail(const QString &mailFile); +}; + +#endif // TESTMAILDNDATTACHMENT_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testmailmboxwebengine.cpp kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testmailmboxwebengine.cpp --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testmailmboxwebengine.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testmailmboxwebengine.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,70 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "testmailmboxwebengine.h" + +#include +#include +#include +#include +#include +#include + +#include +#include + +TestMailMBoxWebEngine::TestMailMBoxWebEngine(QWidget *parent) + : QWidget(parent) +{ + QVBoxLayout *vbox = new QVBoxLayout; + setLayout(vbox); + MessageViewer::Viewer *viewer = new MessageViewer::Viewer(0, 0, new KActionCollection(this)); + vbox->addWidget(viewer); + viewer->setMessage(readAndParseMail(QStringLiteral("html.mbox"))); + viewer->setPluginName(QStringLiteral("longheaderstyleplugin")); +} + +TestMailMBoxWebEngine::~TestMailMBoxWebEngine() +{ + +} + +KMime::Message::Ptr TestMailMBoxWebEngine::readAndParseMail(const QString &mailFile) +{ + QFile file(QLatin1String(MAIL_DATA_DIR) + QLatin1Char('/') + mailFile); + file.open(QIODevice::ReadOnly); + QByteArray ba = file.readAll(); + qDebug() << ba; + const QByteArray data = ba; + Q_ASSERT(!data.isEmpty()); + KMime::Message::Ptr msg(new KMime::Message); + msg->setContent(data); + msg->parse(); + return msg; +} + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + app.setAttribute(Qt::AA_UseHighDpiPixmaps, true); + TestMailMBoxWebEngine *testWebEngine = new TestMailMBoxWebEngine; + testWebEngine->show(); + const int ret = app.exec(); + return ret; +} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testmailmboxwebengine.h kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testmailmboxwebengine.h --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testmailmboxwebengine.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testmailmboxwebengine.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,36 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef TESTMAILMBOXWEBENGINE_H +#define TESTMAILMBOXWEBENGINE_H + +#include +#include + +class TestMailMBoxWebEngine : public QWidget +{ + Q_OBJECT +public: + explicit TestMailMBoxWebEngine(QWidget *parent = Q_NULLPTR); + ~TestMailMBoxWebEngine(); +private: + KMime::Message::Ptr readAndParseMail(const QString &mailFile); +}; + +#endif // TESTMAILMBOXWEBENGINE_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testmailwebengine.cpp kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testmailwebengine.cpp --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testmailwebengine.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testmailwebengine.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,115 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "testmailwebengine.h" +#include "webenginescript.h" + +#include +#include +#include +#include +#include + +#include +#include + +TestMailWebEngine::TestMailWebEngine(QWidget *parent) + : QWidget(parent) +{ + mZoom = 1.0; + QVBoxLayout *vbox = new QVBoxLayout(this); + mTestWebEngine = new MessageViewer::MailWebEngineView(new KActionCollection(this), this); + connect(mTestWebEngine, &MessageViewer::MailWebEngineView::openUrl, this, &TestMailWebEngine::slotOpenUrl); + //mTestWebEngine->load(QUrl(QStringLiteral("http://www.kde.org"))); + QString str = QStringLiteral("\n\n\n\n\n \n\n Akregator\n\n\n\n
\"akregator\"\n
\n

Akregator

Akregator est un agrégateur de flux pour KDE.\n
\n
\n\n
\n
\n\n
\n

Feed readers provide a convenient way to browse different kinds of content, including news, blogs, and other content from online sites. Instead of checking all your favorite web sites manually for updates, Akregator collects the content for you.

\n

For more information about using Akregator, check the Akregator website. If you do not want to see this page anymore, click here.

\n

We hope that you will enjoy Akregator.

\n

Thank you, The Akregator Team

\n
\n\n
\n
\n\n\n\n\n"); + mTestWebEngine->setHtml(str, QUrl(QStringLiteral("file:///"))); + mTestWebEngine->settings()->setAttribute(QWebEngineSettings::JavascriptEnabled, true); + vbox->addWidget(mTestWebEngine); + QHBoxLayout *hButtonBox = new QHBoxLayout; + vbox->addLayout(hButtonBox); + + QPushButton *scrollUp = new QPushButton(QStringLiteral("scrollUp 10px"), this); + connect(scrollUp, &QPushButton::clicked, this, &TestMailWebEngine::slotScrollUp); + hButtonBox->addWidget(scrollUp); + + QPushButton *scrollDown = new QPushButton(QStringLiteral("scrollDown 10px"), this); + connect(scrollDown, &QPushButton::clicked, this, &TestMailWebEngine::slotScrollDown); + hButtonBox->addWidget(scrollDown); + + hButtonBox = new QHBoxLayout; + vbox->addLayout(hButtonBox); + + QPushButton *zoomUp = new QPushButton(QStringLiteral("zoom Up"), this); + connect(zoomUp, &QPushButton::clicked, this, &TestMailWebEngine::slotZoomUp); + hButtonBox->addWidget(zoomUp); + + QPushButton *zoomDown = new QPushButton(QStringLiteral("zoom Down"), this); + connect(zoomDown, &QPushButton::clicked, this, &TestMailWebEngine::slotZoomDown); + hButtonBox->addWidget(zoomDown); +} + +TestMailWebEngine::~TestMailWebEngine() +{ + +} + +void TestMailWebEngine::slotOpenUrl(const QUrl &url) +{ + mTestWebEngine->load(url); +} + +void TestMailWebEngine::slotScrollDown() +{ +#if QT_VERSION >= 0x050700 + mTestWebEngine->page()->runJavaScript(WebEngineViewer::WebEngineScript::scrollDown(10), WebEngineViewer::WebEngineManageScript::scriptWordId()); +#else + mTestWebEngine->page()->runJavaScript(WebEngineViewer::WebEngineScript::scrollDown(10)); +#endif +} + +void TestMailWebEngine::slotScrollUp() +{ +#if QT_VERSION >= 0x050700 + mTestWebEngine->page()->runJavaScript(WebEngineViewer::WebEngineScript::scrollUp(10), WebEngineViewer::WebEngineManageScript::scriptWordId()); +#else + mTestWebEngine->page()->runJavaScript(WebEngineViewer::WebEngineScript::scrollUp(10)); +#endif +} + +void TestMailWebEngine::slotZoomDown() +{ + mZoom -= 0.2; + mTestWebEngine->setZoomFactor(mZoom); +} + +void TestMailWebEngine::slotZoomUp() +{ + mZoom += 0.2; + mTestWebEngine->setZoomFactor(mZoom); +} + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + app.setAttribute(Qt::AA_UseHighDpiPixmaps, true); + TestMailWebEngine *testWebEngine = new TestMailWebEngine; + testWebEngine->show(); + const int ret = app.exec(); + return ret; +} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testmailwebengine.h kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testmailwebengine.h --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testmailwebengine.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testmailwebengine.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,48 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef TESTMAILWEBENGINE_H +#define TESTMAILWEBENGINE_H + +#include + +namespace MessageViewer +{ +class MailWebEngineView; +} + +class TestMailWebEngine : public QWidget +{ + Q_OBJECT +public: + explicit TestMailWebEngine(QWidget *parent = Q_NULLPTR); + ~TestMailWebEngine(); +private Q_SLOTS: + void slotScrollUp(); + + void slotScrollDown(); + void slotZoomUp(); + void slotZoomDown(); + void slotOpenUrl(const QUrl &url); +private: + MessageViewer::MailWebEngineView *mTestWebEngine; + qreal mZoom; +}; + +#endif // TESTMAILWEBENGINE_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testmailwebengineselection.cpp kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testmailwebengineselection.cpp --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testmailwebengineselection.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testmailwebengineselection.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,83 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ +#include "testmailwebengineselection.h" + +#include +#include +#include +#include +#include +#include + +#include + +TestMailWebEngineSelection::TestMailWebEngineSelection(QWidget *parent) + : QWidget(parent), + mNumber(0) +{ + QVBoxLayout *vbox = new QVBoxLayout(this); + mTestWebEngine = new MessageViewer::MailWebEngineView(new KActionCollection(this), this); + connect(mTestWebEngine, &MessageViewer::MailWebEngineView::openUrl, this, &TestMailWebEngineSelection::slotOpenUrl); + QString str = QStringLiteral("\n\n\n\n\n \n\n Akregator\n\n\n\n
\"akregator\"\n
\n

Akregator

Akregator est un agrégateur de flux pour KDE.\n
\n
\n\n
\n
\n\n
\n

Feed readers provide a convenient way to browse different kinds of content, including news, blogs, and other content from online sites. Instead of checking all your favorite web sites manually for updates, Akregator collects the content for you.

\n

For more information about using Akregator, check the Akregator website. If you do not want to see this page anymore, click here.

\n

We hope that you will enjoy Akregator.

\n

Thank you, The Akregator Team

\n
\n\n
\n
\n\n\n\n\n"); + mTestWebEngine->setHtml(str, QUrl(QStringLiteral("file:///"))); + mTestWebEngine->settings()->setAttribute(QWebEngineSettings::JavascriptEnabled, true); + vbox->addWidget(mTestWebEngine); + QHBoxLayout *hButtonBox = new QHBoxLayout; + vbox->addLayout(hButtonBox); + + QPushButton *changeHtml = new QPushButton(QStringLiteral("switch html"), this); + connect(changeHtml, &QPushButton::clicked, this, &TestMailWebEngineSelection::slotSwitchHtml); + hButtonBox->addWidget(changeHtml); + + QPushButton *showSelection = new QPushButton(QStringLiteral("Show Selection"), this); + connect(showSelection, &QPushButton::clicked, this, &TestMailWebEngineSelection::slotShowSelection); + hButtonBox->addWidget(showSelection); +} + +TestMailWebEngineSelection::~TestMailWebEngineSelection() +{ + +} + +void TestMailWebEngineSelection::slotSwitchHtml() +{ + QString str = QStringLiteral("\n\n\n\n\n \n\n Akregator\n\n\n\n
\"akregator\"\n
\n

Akregator

Akregator est un agrégateur de flux pour KDE.\n
\n
\n\n
\n
\n\n
\n

Feed readers provide a convenient way to browse different kinds of content, including news, blogs, and other content from online sites. Instead of checking all your favorite web sites manually for updates, Akregator collects the content for you.

\n

For more information about using Akregator, check the Akregator website. If you do not want to see this page anymore, click here.

\n

We hope that you will enjoy Akregator.

\n

Thank you, number %1

\n
\n\n
\n
\n\n\n\n\n").arg(mNumber); + mTestWebEngine->setHtml(str, QUrl(QStringLiteral("file:///"))); + mNumber++; +} + +void TestMailWebEngineSelection::slotShowSelection() +{ + QMessageBox::information(this, QStringLiteral("selection"), mTestWebEngine->selectedText()); +} + +void TestMailWebEngineSelection::slotOpenUrl(const QUrl &url) +{ + mTestWebEngine->load(url); +} + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + app.setAttribute(Qt::AA_UseHighDpiPixmaps, true); + TestMailWebEngineSelection *testWebEngine = new TestMailWebEngineSelection; + testWebEngine->show(); + const int ret = app.exec(); + return ret; +} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testmailwebengineselection.h kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testmailwebengineselection.h --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testmailwebengineselection.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testmailwebengineselection.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,45 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef TESTMAILWEBENGINESELECTION_H +#define TESTMAILWEBENGINESELECTION_H + +#include + +namespace MessageViewer +{ +class MailWebEngineView; +} + +class TestMailWebEngineSelection : public QWidget +{ + Q_OBJECT +public: + explicit TestMailWebEngineSelection(QWidget *parent = Q_NULLPTR); + ~TestMailWebEngineSelection(); +private Q_SLOTS: + void slotOpenUrl(const QUrl &url); + void slotSwitchHtml(); + void slotShowSelection(); +private: + MessageViewer::MailWebEngineView *mTestWebEngine; + int mNumber; +}; + +#endif // TESTMAILWEBENGINE_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testwebengineaccesskey.cpp kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testwebengineaccesskey.cpp --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testwebengineaccesskey.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testwebengineaccesskey.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,86 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "testwebengineaccesskey.h" +#include "../mailwebengineview.h" + +#include "messageviewer/messageviewersettings.h" +#include +#include +#include +#include + +#include +#include + +TestWidget::TestWidget(QWidget *parent) + : QWidget(parent) +{ + WebEngineViewer::MessageViewerSettings::self()->setAccessKeyEnabled(true); + QHBoxLayout *hbox = new QHBoxLayout(this); + hbox->setMargin(0); + TestWebEngineAccesskey *webEngine = new TestWebEngineAccesskey(this); + hbox->addWidget(webEngine); + + TestWebKitAccesskey *webKit = new TestWebKitAccesskey(this); + hbox->addWidget(webKit); +} + +TestWidget::~TestWidget() +{ + +} + +TestWebEngineAccesskey::TestWebEngineAccesskey(QWidget *parent) + : QWidget(parent) +{ + QVBoxLayout *vboxLayout = new QVBoxLayout(this); + QLabel *label = new QLabel(QStringLiteral("WebEngine")); + vboxLayout->addWidget(label); + + mTestWebEngine = new WebEngineViewer::MailWebEngineView(new KActionCollection(this), this); + mTestWebEngine->settings()->setAttribute(QWebEngineSettings::JavascriptEnabled, true); + vboxLayout->addWidget(mTestWebEngine); + mTestWebEngine->load(QUrl(QStringLiteral("http://www.kde.org"))); + QPushButton *searchAccessKey = new QPushButton(QStringLiteral("AccessKey"), this); + vboxLayout->addWidget(searchAccessKey); + connect(searchAccessKey, &QPushButton::clicked, this, &TestWebEngineAccesskey::slotShowAccessKey); +} + +TestWebEngineAccesskey::~TestWebEngineAccesskey() +{ + +} + +void TestWebEngineAccesskey::slotShowAccessKey() +{ + mTestWebEngine->showAccessKeys(); +} + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + QStandardPaths::setTestModeEnabled(true); + app.setAttribute(Qt::AA_UseHighDpiPixmaps, true); + TestWidget *testWebEngine = new TestWidget; + testWebEngine->show(); + const int ret = app.exec(); + return ret; +} + diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testwebengineaccesskey.h kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testwebengineaccesskey.h --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testwebengineaccesskey.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testwebengineaccesskey.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,51 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ +#ifndef TESTWEBENGINEACCESSKEY_H +#define TESTWEBENGINEACCESSKEY_H + +#include +#include +namespace WebEngineViewer +{ +class MailWebEngineView; +} + +class TestWidget : public QWidget +{ + Q_OBJECT +public: + explicit TestWidget(QWidget *parent = Q_NULLPTR); + ~TestWidget(); +}; + +class TestWebEngineAccesskey : public QWidget +{ + Q_OBJECT +public: + explicit TestWebEngineAccesskey(QWidget *parent = Q_NULLPTR); + ~TestWebEngineAccesskey(); + +private Q_SLOTS: + void slotShowAccessKey(); + +private: + WebEngineViewer::MailWebEngineView *mTestWebEngine; +}; + +#endif // TESTWEBENGINEACCESSKEY_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testwebenginescrolladdattachment.cpp kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testwebenginescrolladdattachment.cpp --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testwebenginescrolladdattachment.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testwebenginescrolladdattachment.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,76 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "testwebenginescrolladdattachment.h" + +#include +#include +#include +#include +#include + +#include + +template +struct InvokeWrapper { + R *receiver; + void (C::*memberFunction)(Arg); + void operator()(Arg result) + { + (receiver->*memberFunction)(result); + } +}; + +template + +InvokeWrapper invoke(R *receiver, void (C::*memberFunction)(Arg)) +{ + InvokeWrapper wrapper = {receiver, memberFunction}; + return wrapper; +} + +TestWebEngineScrollAddAttachment::TestWebEngineScrollAddAttachment(QWidget *parent) + : QWidget(parent) +{ + QVBoxLayout *vboxLayout = new QVBoxLayout(this); + + mTestWebEngine = new MessageViewer::MailWebEngineView(new KActionCollection(this), this); + mTestWebEngine->settings()->setAttribute(QWebEngineSettings::JavascriptEnabled, true); + vboxLayout->addWidget(mTestWebEngine); + mTestWebEngine->load(QUrl(QStringLiteral("http://www.kde.org"))); + QPushButton *scrollToButton = new QPushButton(QStringLiteral("Scroll to Attachment"), this); + vboxLayout->addWidget(scrollToButton); + connect(scrollToButton, &QPushButton::clicked, this, &TestWebEngineScrollAddAttachment::slotScrollToAttachment); + +} + +void TestWebEngineScrollAddAttachment::slotScrollToAttachment() +{ + mTestWebEngine->scrollToAnchor(QStringLiteral("module")); +} + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + app.setAttribute(Qt::AA_UseHighDpiPixmaps, true); + TestWebEngineScrollAddAttachment *testWebEngine = new TestWebEngineScrollAddAttachment; + testWebEngine->show(); + const int ret = app.exec(); + return ret; +} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testwebenginescrolladdattachment.h kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testwebenginescrolladdattachment.h --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webengine/tests/testwebenginescrolladdattachment.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webengine/tests/testwebenginescrolladdattachment.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,40 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef TESTWEBENGINESCROLLADDATTACHMENT_H +#define TESTWEBENGINESCROLLADDATTACHMENT_H + +#include +namespace MessageViewer +{ +class MailWebEngineView; +} +class TestWebEngineScrollAddAttachment : public QWidget +{ + Q_OBJECT +public: + explicit TestWebEngineScrollAddAttachment(QWidget *parent = Q_NULLPTR); + +private Q_SLOTS: + void slotScrollToAttachment(); +private: + MessageViewer::MailWebEngineView *mTestWebEngine; +}; + +#endif // TESTWEBENGINESCROLLADDATTACHMENT_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webview/mailwebview.cpp kf5-messagelib-16.12.3/messageviewer/src/viewer/webview/mailwebview.cpp --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webview/mailwebview.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webview/mailwebview.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,352 +0,0 @@ -/* - Copyright 2010 Thomas McGuire - - Copyright 2013-2016 Laurent Montel - - 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) version 3 or any later version - accepted by the membership of KDE e.V. (or its successor approved - by the membership of KDE e.V.), which shall act as a proxy - defined in Section 14 of version 3 of the license. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#include "mailwebview.h" -#include "messageviewer_debug.h" -#include "scamdetection/scamdetection.h" -#include "scamdetection/scamcheckshorturl.h" -#include "adblock/adblockblockableitemsdialog.h" -#include "webpage.h" -#include "webviewaccesskey.h" - -#include -#include -#include -#include -#include -#include - -#include -#include - -using namespace boost; -using namespace MessageViewer; - -MailWebView::MailWebView(KActionCollection *actionCollection, QWidget *parent) - : KWebView(parent, false), - mScamDetection(new ScamDetection), - mActionCollection(actionCollection) -{ - mWebViewAccessKey = new WebViewAccessKey(this, this); - mWebViewAccessKey->setActionCollection(mActionCollection); - setPage(new MessageViewer::WebPage(this)); - page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); - settings()->setAttribute(QWebSettings::JavascriptEnabled, false); - settings()->setAttribute(QWebSettings::JavaEnabled, false); - settings()->setAttribute(QWebSettings::PluginsEnabled, false); - - const QFontInfo font(QFontDatabase().systemFont(QFontDatabase::GeneralFont)); - settings()->setFontFamily(QWebSettings::StandardFont, font.family()); - settings()->setFontSize(QWebSettings::DefaultFontSize, font.pixelSize()); - - connect(page(), &QWebPage::linkHovered, - this, &MailWebView::linkHovered); - connect(this, &QWebView::loadStarted, mWebViewAccessKey, &WebViewAccessKey::hideAccessKeys); - connect(mScamDetection, &ScamDetection::messageMayBeAScam, this, &MailWebView::messageMayBeAScam); - connect(page(), &QWebPage::scrollRequested, mWebViewAccessKey, &WebViewAccessKey::hideAccessKeys); - connect(mWebViewAccessKey, &WebViewAccessKey::openUrl, this, &MailWebView::linkClicked); -} - -MailWebView::~MailWebView() -{ - delete mScamDetection; -} - -bool MailWebView::event(QEvent *event) -{ - if (event->type() == QEvent::ContextMenu) { - // Don't call KWebView::event() here, it will do silly things like selecting the text - // under the mouse cursor, which we don't want. - - QContextMenuEvent const *contextMenuEvent = static_cast(event); - const QWebFrame *const frame = page()->currentFrame(); - const QWebHitTestResult hit = frame->hitTestContent(contextMenuEvent->pos()); - qCDebug(MESSAGEVIEWER_LOG) << "Right-clicked URL:" << hit.linkUrl(); - - Q_EMIT popupMenu(hit.linkUrl(), ((hit.pixmap().isNull()) ? QUrl() : hit.imageUrl()), mapToGlobal(contextMenuEvent->pos())); - event->accept(); - return true; - } - return KWebView::event(event); -} - -void MailWebView::scrollDown(int pixels) -{ - QPoint point = page()->mainFrame()->scrollPosition(); - point.ry() += pixels; - page()->mainFrame()->setScrollPosition(point); -} - -void MailWebView::scrollUp(int pixels) -{ - scrollDown(-pixels); -} - -bool MailWebView::isScrolledToBottom() const -{ - const int pos = page()->mainFrame()->scrollBarValue(Qt::Vertical); - const int max = page()->mainFrame()->scrollBarMaximum(Qt::Vertical); - return pos == max; -} - -void MailWebView::scrollPageDown(int percent) -{ - const qint64 height = page()->viewportSize().height(); - const qint64 current = page()->mainFrame()->scrollBarValue(Qt::Vertical); - // do arithmetic in higher precision, and check for overflow: - const qint64 newPosition = current + height * percent / 100; - if (newPosition > std::numeric_limits::max()) { - qCWarning(MESSAGEVIEWER_LOG) << "new position" << newPosition << "exceeds range of 'int'!"; - } - page()->mainFrame()->setScrollBarValue(Qt::Vertical, newPosition); -} - -void MailWebView::scrollPageUp(int percent) -{ - scrollPageDown(-percent); -} - -bool MailWebView::hasVerticalScrollBar() const -{ - return page()->mainFrame()->scrollBarGeometry(Qt::Vertical).isValid(); -} - -double MailWebView::relativePosition() const -{ - if (hasVerticalScrollBar()) { - const double pos = page()->mainFrame()->scrollBarValue(Qt::Vertical); - const int height = page()->mainFrame()->scrollBarMaximum(Qt::Vertical); - return height ? pos / height : 0.0; - } else { - return 0.0; - } -} - -void MailWebView::scrollToRelativePosition(double pos) -{ - // FIXME: This doesn't work, Qt resets the scrollbar value somewhere in the event handler. - // Using a singleshot timer wouldn't work either, since that introduces visible scrolling. - const int max = page()->mainFrame()->scrollBarMaximum(Qt::Vertical); - page()->currentFrame()->setScrollBarValue(Qt::Vertical, max * pos); -} - -void MailWebView::selectAll() -{ - page()->triggerAction(QWebPage::SelectAll); -} - -void MailWebView::clearSelection() -{ - //This is an ugly hack to remove the selection, I found no other way to do it with QWebView - QMouseEvent event(QEvent::MouseButtonPress, QPoint(10, 10), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); - QCoreApplication::sendEvent(page(), &event); - QMouseEvent event2(QEvent::MouseButtonRelease, QPoint(10, 10), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); - QCoreApplication::sendEvent(page(), &event2); -} - -// Checks if the given node has a child node that is a DIV which has an ID attribute -// with the value specified here -static bool has_parent_div_with_id(const QWebElement &start, const QString &id) -{ - if (start.isNull()) { - return false; - } - - if (start.tagName().toLower() == QLatin1String("div")) { - if (start.attribute(QStringLiteral("id"), QString()) == id) { - return true; - } - } - - return has_parent_div_with_id(start.parent(), id); -} - -bool MailWebView::isAttachmentInjectionPoint(const QPoint &global) const -{ - const QPoint local = page()->view()->mapFromGlobal(global); - const QWebHitTestResult hit = page()->currentFrame()->hitTestContent(local); - return has_parent_div_with_id(hit.enclosingBlockElement(), QStringLiteral("attachmentInjectionPoint")); -} - -void MailWebView::injectAttachments(const function &delayedHtml) -{ - QWebElement doc = page()->currentFrame()->documentElement(); - QWebElement injectionPoint = doc.findFirst(QStringLiteral("*#attachmentInjectionPoint")); - if (injectionPoint.isNull()) { - return; - } - - const QString html = delayedHtml(); - if (html.isEmpty()) { - return; - } - - assert(injectionPoint.tagName().toLower() == QLatin1String("div")); - injectionPoint.setInnerXml(html); -} - -void MailWebView::scrollToAnchor(const QString &anchor) -{ - page()->mainFrame()->scrollToAnchor(anchor); -} - -bool MailWebView::removeAttachmentMarking(const QString &id) -{ - QWebElement doc = page()->mainFrame()->documentElement(); - QWebElement attachmentDiv = doc.findFirst(QLatin1String("*#") + id); - if (attachmentDiv.isNull()) { - return false; - } - attachmentDiv.removeAttribute(QStringLiteral("style")); - return true; -} - -void MailWebView::markAttachment(const QString &id, const QString &style) -{ - QWebElement doc = page()->mainFrame()->documentElement(); - QWebElement attachmentDiv = doc.findFirst(QLatin1String("*#") + id); - if (!attachmentDiv.isNull()) { - attachmentDiv.setAttribute(QStringLiteral("style"), style); - } -} - -QString MailWebView::htmlSource() const -{ - return page()->mainFrame()->documentElement().toOuterXml(); -} - -QUrl MailWebView::linkOrImageUrlAt(const QPoint &global) const -{ - const QPoint local = page()->view()->mapFromGlobal(global); - const QWebHitTestResult hit = page()->currentFrame()->hitTestContent(local); - if (!hit.linkUrl().isEmpty()) { - return hit.linkUrl(); - } else if (!hit.imageUrl().isEmpty()) { - return hit.imageUrl(); - } else { - return QUrl(); - } -} - -bool MailWebView::replaceInnerHtml(const QString &id, const function &delayedHtml) -{ - QWebElement doc = page()->currentFrame()->documentElement(); - QWebElement tag = doc.findFirst(QLatin1String("*#") + id); - if (tag.isNull()) { - return false; - } - tag.setInnerXml(delayedHtml()); - return true; -} - -void MailWebView::setElementByIdVisible(const QString &id, bool visible) -{ - QWebElement doc = page()->currentFrame()->documentElement(); - QWebElement e = doc.findFirst(QLatin1String("*#") + id); - Q_ASSERT(!e.isNull()); - - if (visible) { - e.removeAttribute(QStringLiteral("display")); - } else { - e.setStyleProperty(QStringLiteral("display"), QStringLiteral("none")); - } -} - -void MailWebView::keyReleaseEvent(QKeyEvent *e) -{ - if (MessageViewer::MessageViewerSettings::self()->accessKeyEnabled()) { - mWebViewAccessKey->keyReleaseEvent(e); - } - KWebView::keyReleaseEvent(e); -} - -void MailWebView::keyPressEvent(QKeyEvent *e) -{ - if (e && hasFocus()) { - if (MessageViewer::MessageViewerSettings::self()->accessKeyEnabled()) { - mWebViewAccessKey->keyPressEvent(e); - } - } - KWebView::keyPressEvent(e); -} - -void MailWebView::wheelEvent(QWheelEvent *e) -{ - if (MessageViewer::MessageViewerSettings::self()->accessKeyEnabled()) { - mWebViewAccessKey->wheelEvent(e); - } - KWebView::wheelEvent(e); -} - -void MailWebView::resizeEvent(QResizeEvent *e) -{ - if (MessageViewer::MessageViewerSettings::self()->accessKeyEnabled()) { - mWebViewAccessKey->resizeEvent(e); - } - KWebView::resizeEvent(e); -} - -void MailWebView::scamCheck() -{ - QWebFrame *mainFrame = page()->mainFrame(); - mScamDetection->scanPage(mainFrame); -} - -void MailWebView::slotShowDetails() -{ - mScamDetection->showDetails(); -} - -void MailWebView::slotZoomChanged(qreal zoom) -{ - setZoomFactor(zoom); -} - -void MailWebView::slotZoomTextOnlyChanged(bool b) -{ - settings()->setAttribute(QWebSettings::ZoomTextOnly, b); -} - -void MailWebView::saveMainFrameScreenshotInFile(const QString &filename) -{ - QWebFrame *frame = page()->mainFrame(); - QImage image(frame->contentsSize(), QImage::Format_ARGB32_Premultiplied); - image.fill(Qt::transparent); - - QPainter painter(&image); - painter.setRenderHint(QPainter::Antialiasing, true); - painter.setRenderHint(QPainter::TextAntialiasing, true); - painter.setRenderHint(QPainter::SmoothPixmapTransform, true); - frame->documentElement().render(&painter); - painter.end(); - image.save(filename); -} - -void MailWebView::openBlockableItemsDialog() -{ - QPointer dlg = new AdBlockBlockableItemsDialog(this); - dlg->setWebFrame(page()->mainFrame()); - if (dlg->exec()) { - dlg->saveFilters(); - } - delete dlg; -} -#include "moc_mailwebview.cpp" diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webview/mailwebview.h kf5-messagelib-16.12.3/messageviewer/src/viewer/webview/mailwebview.h --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webview/mailwebview.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webview/mailwebview.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,103 +0,0 @@ -/* Copyright 2010 Thomas McGuire - - Copyright 2013-2016 Laurent Montel - - 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) version 3 or any later version - accepted by the membership of KDE e.V. (or its successor approved - by the membership of KDE e.V.), which shall act as a proxy - defined in Section 14 of version 3 of the license. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifndef MESSAGEVIEWER_MAILWEBVIEW_H -#define MESSAGEVIEWER_MAILWEBVIEW_H - -#include "messageviewer/messageviewersettings.h" -#include "messageviewer_export.h" -#include - -#include - -class KActionCollection; - -namespace MessageViewer -{ -class ScamDetection; -class WebViewAccessKey; -/// MailWebView extends KWebView so that it can emit the popupMenu() signal -class MESSAGEVIEWER_EXPORT MailWebView : public KWebView -{ - Q_OBJECT -public: - - explicit MailWebView(KActionCollection *actionCollection = Q_NULLPTR, QWidget *parent = Q_NULLPTR); - ~MailWebView(); - - void scrollUp(int pixels); - void scrollDown(int pixels); - bool isScrolledToBottom() const; - bool hasVerticalScrollBar() const; - void scrollPageDown(int percent); - void scrollPageUp(int percent); - void scrollToAnchor(const QString &anchor); - - bool isAttachmentInjectionPoint(const QPoint &globalPos) const; - void injectAttachments(const boost::function &delayedHtml); - bool removeAttachmentMarking(const QString &id); - void markAttachment(const QString &id, const QString &style); - bool replaceInnerHtml(const QString &id, const boost::function &delayedHtml); - void setElementByIdVisible(const QString &id, bool visible); - QString htmlSource() const; - void selectAll(); - void clearSelection(); - void scrollToRelativePosition(double pos); - double relativePosition() const; - - QUrl linkOrImageUrlAt(const QPoint &global) const; - - void scamCheck(); - void saveMainFrameScreenshotInFile(const QString &filename); - void openBlockableItemsDialog(); - -public Q_SLOTS: - void slotShowDetails(); - void slotZoomChanged(qreal zoom); - void slotZoomTextOnlyChanged(bool b); - -Q_SIGNALS: - - /// Emitted when the user right-clicks somewhere - /// @param url if an URL was under the cursor, this parameter contains it. Otherwise empty - /// @param point position where the click happened, in local coordinates - void popupMenu(const QUrl &url, const QUrl &imageUrl, const QPoint &point); - - void linkHovered(const QString &link, const QString &title = QString(), const QString &textContent = QString()); - void messageMayBeAScam(); - -protected: - /// Reimplemented to catch context menu events and emit popupMenu() - bool event(QEvent *event) Q_DECL_OVERRIDE; - /// Reimplement for access key - void keyReleaseEvent(QKeyEvent *) Q_DECL_OVERRIDE; - void keyPressEvent(QKeyEvent *) Q_DECL_OVERRIDE; - void wheelEvent(QWheelEvent *e) Q_DECL_OVERRIDE; - void resizeEvent(QResizeEvent *e) Q_DECL_OVERRIDE; -private: - ScamDetection *mScamDetection; - KActionCollection *mActionCollection; - WebViewAccessKey *mWebViewAccessKey; -}; - -} - -#endif /* MESSAGEVIEWER_MAILWEBVIEW_H */ diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webview/networkaccessmanager.cpp kf5-messagelib-16.12.3/messageviewer/src/viewer/webview/networkaccessmanager.cpp --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webview/networkaccessmanager.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webview/networkaccessmanager.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,179 +0,0 @@ -/* - * This file is part of the KDE project. - * Copyright (c) 2013-2016 Montel Laurent - * based on code from kwebkit part Copyright (C) 2009 Dawit Alemayehu - * - * This library is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by the - * Free Software Foundation; either version 2.1 of the License, or (at your - * option) any later version. - * - * This library 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 Lesser General Public - * License along with this library. If not, see . - * - */ - -#include "networkaccessmanager.h" -#include "messageviewer_debug.h" -#include "settings/messageviewersettings.h" -#include "adblock/adblockmanager.h" - -#include -#include -#include - -#include -#include -#include -#include -#include - -#define HIDABLE_ELEMENTS QLatin1String("audio,img,embed,object,iframe,frame,video") - -/* Null network reply */ -class NullNetworkReply : public QNetworkReply -{ -public: - NullNetworkReply(const QNetworkRequest &req, QObject *parent = Q_NULLPTR) - : QNetworkReply(parent) - { - setRequest(req); - setUrl(req.url()); - setHeader(QNetworkRequest::ContentLengthHeader, 0); - setHeader(QNetworkRequest::ContentTypeHeader, QStringLiteral("text/plain")); - setError(QNetworkReply::ContentAccessDenied, i18n("Blocked by ad filter")); - setAttribute(QNetworkRequest::User, QNetworkReply::ContentAccessDenied); - QTimer::singleShot(0, this, &QNetworkReply::finished); - } - - void abort() Q_DECL_OVERRIDE {} - qint64 bytesAvailable() const Q_DECL_OVERRIDE - { - return 0; - } - -protected: - qint64 readData(char *, qint64) Q_DECL_OVERRIDE { - return -1; - } -}; - -using namespace MessageViewer; - -MyNetworkAccessManager::MyNetworkAccessManager(QObject *parent) - : KIO::AccessManager(parent), - mDoNotTrack(true) -{ - auto lang = QLocale::system().language(); - QString c = QLocale(lang).name(); - - if (c == QLatin1String("C")) { - c = QStringLiteral("en-US"); - } else { - c = c.replace(QLatin1Char('_'), QLatin1Char('-')); - } - - c.append(QLatin1String(", en-US; q=0.8, en; q=0.6")); - - mAcceptLanguage = c.toLatin1(); -} - -void MyNetworkAccessManager::setDoNotTrack(bool state) -{ - mDoNotTrack = state; -} - -QNetworkReply *MyNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData) -{ - bool blocked = false; - - // Handle GET operations with AdBlock - if (op == QNetworkAccessManager::GetOperation) { - blocked = AdBlockManager::self()->blockRequest(req); - } - - if (!blocked) { - if (KProtocolInfo::isHelperProtocol(req.url())) { - (void) new KRun(req.url(), qobject_cast(req.originatingObject())); - return new NullNetworkReply(req, this); - } - // set our "nice" accept-language header... - QNetworkRequest request = req; - request.setRawHeader("Accept-Language", mAcceptLanguage); - if (mDoNotTrack) { - // The 'Do Not Track' header: http://datatracker.ietf.org/doc/draft-mayer-do-not-track - request.setRawHeader("DNT", "1"); - } - - return KIO::AccessManager::createRequest(op, req, outgoingData); - } - - QWebFrame *frame = qobject_cast(req.originatingObject()); - if (frame) { - if (!mBlockedRequests.contains(frame)) { - connect(frame, &QWebFrame::loadFinished, this, &MyNetworkAccessManager::slotApplyHidingBlockedElements); - } - mBlockedRequests.insert(frame, req.url()); - } - - return new NullNetworkReply(req, this); -} - -static void hideBlockedElements(const QUrl &url, QWebElementCollection &collection) -{ - for (QWebElementCollection::iterator it = collection.begin(); it != collection.end(); ++it) { - const QUrl baseUrl((*it).webFrame()->baseUrl()); - QString src = (*it).attribute(QStringLiteral("src")); - if (src.isEmpty()) { - src = (*it).evaluateJavaScript(QStringLiteral("this.src")).toString(); - } - if (src.isEmpty()) { - continue; - } - const QUrl resolvedUrl(baseUrl.resolved(src)); - if (url == resolvedUrl) { - qCDebug(MESSAGEVIEWER_LOG) << "*** HIDING ELEMENT: " << (*it).tagName() << resolvedUrl; - (*it).removeFromDocument(); - } - } -} - -void MyNetworkAccessManager::slotApplyHidingBlockedElements(bool ok) -{ - if (!ok) { - return; - } - - if (!MessageViewer::MessageViewerSettings::self()->adBlockEnabled()) { - return; - } - - if (!MessageViewer::MessageViewerSettings::self()->hideAdsEnabled()) { - return; - } - - QWebFrame *frame = qobject_cast(sender()); - if (!frame) { - return; - } - - QList urls = mBlockedRequests.values(frame); - if (urls.isEmpty()) { - return; - } - - QWebElementCollection collection = frame->findAllElements(HIDABLE_ELEMENTS); - if (frame->parentFrame()) { - collection += frame->parentFrame()->findAllElements(HIDABLE_ELEMENTS); - } - - Q_FOREACH (const QUrl &url, urls) { - hideBlockedElements(url, collection); - } -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webview/networkaccessmanager.h kf5-messagelib-16.12.3/messageviewer/src/viewer/webview/networkaccessmanager.h --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webview/networkaccessmanager.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webview/networkaccessmanager.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -/* - * This file is part of the KDE project. - * - * Copyright (c) 2013-2016 Montel Laurent - * based on code from kwebkit part Copyright (C) 2009 Dawit Alemayehu - * - * This library is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by the - * Free Software Foundation; either version 2.1 of the License, or (at your - * option) any later version. - * - * This library 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 Lesser General Public - * License along with this library. If not, see . - * - */ -#ifndef NETWORKACCESSMANAGER_H -#define NETWORKACCESSMANAGER_H - -#include - -#include - -class QWebFrame; - -namespace MessageViewer -{ - -/** - * Re-implemented for internal reasons. API remains unaffected. - */ -class MyNetworkAccessManager : public KIO::AccessManager -{ - Q_OBJECT - -public: - explicit MyNetworkAccessManager(QObject *parent = Q_NULLPTR); - - void setDoNotTrack(bool state); - -protected: - QNetworkReply *createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData = Q_NULLPTR) Q_DECL_OVERRIDE; - -private Q_SLOTS: - void slotApplyHidingBlockedElements(bool ok); - -private: - QMultiHash mBlockedRequests; - QByteArray mAcceptLanguage; - bool mDoNotTrack; -}; - -} - -#endif // NETWORKACCESSMANAGER_P_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webview/webpage.cpp kf5-messagelib-16.12.3/messageviewer/src/viewer/webview/webpage.cpp --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webview/webpage.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webview/webpage.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "webpage.h" -#include "networkaccessmanager.h" -#include "adblock/adblockmanager.h" - -using namespace MessageViewer; - -class MessageViewer::WebPagePrivate -{ -public: - WebPagePrivate() - { - - } - QUrl mLoadingUrl; - MessageViewer::MyNetworkAccessManager *mCustomNetworkManager; -}; - -WebPage::WebPage(QWidget *parent) - : KWebPage(parent), - d(new WebPagePrivate) -{ - d->mCustomNetworkManager = new MessageViewer::MyNetworkAccessManager(this); - d->mCustomNetworkManager->setEmitReadyReadOnMetaDataChange(true); - d->mCustomNetworkManager->setCache(0); - QWidget *window = parent ? parent->window() : 0; - if (window) { - d->mCustomNetworkManager->setWindow(window); - } - setNetworkAccessManager(d->mCustomNetworkManager); - connect(this, SIGNAL(frameCreated(QWebFrame*)), AdBlockManager::self(), SLOT(applyHidingRules(QWebFrame*))); -} - -WebPage::~WebPage() -{ - delete d; -} - -QUrl WebPage::loadingUrl() const -{ - return d->mLoadingUrl; -} - -void WebPage::setDoNotTrack(bool state) -{ - d->mCustomNetworkManager->setDoNotTrack(state); -} - -bool WebPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type) -{ - const bool isMainFrameRequest = (frame == mainFrame()); - if (isMainFrameRequest) { - d->mLoadingUrl = request.url(); - } - return QWebPage::acceptNavigationRequest(frame, request, type); -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webview/webpage.h kf5-messagelib-16.12.3/messageviewer/src/viewer/webview/webpage.h --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webview/webpage.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webview/webpage.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -/* - Copyright (c) 2013-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef WEBPAGE_H -#define WEBPAGE_H - -#include -#include -#include "messageviewer_export.h" - -namespace MessageViewer -{ -class WebPagePrivate; -class MESSAGEVIEWER_EXPORT WebPage : public KWebPage -{ - Q_OBJECT -public: - explicit WebPage(QWidget *parent = Q_NULLPTR); - ~WebPage(); - QUrl loadingUrl() const; - - void setDoNotTrack(bool state); -protected: - bool acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type) Q_DECL_OVERRIDE; - -private: - WebPagePrivate *const d; -}; -} - -#endif // WEBPAGE_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webview/webviewaccesskey.cpp kf5-messagelib-16.12.3/messageviewer/src/viewer/webview/webviewaccesskey.cpp --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webview/webviewaccesskey.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webview/webviewaccesskey.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,358 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "webviewaccesskey.h" -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace MessageViewer; - -class MessageViewer::WebViewAccessKeyPrivate -{ -public: - enum AccessKeyState { - NotActivated, - PreActivated, - Activated - }; - WebViewAccessKeyPrivate(QWebView *webView) - : mAccessKeyActivated(NotActivated), - mWebView(webView), - mActionCollection(Q_NULLPTR) - { - - } - AccessKeyState mAccessKeyActivated; - QList mAccessKeyLabels; - QHash mAccessKeyNodes; - QHash mDuplicateLinkElements; - QWebView *mWebView; - KActionCollection *mActionCollection; -}; - -static bool isEditableElement(QWebPage *page) -{ - const QWebFrame *frame = (page ? page->currentFrame() : 0); - QWebElement element = (frame ? frame->findFirstElement(QStringLiteral(":focus")) : QWebElement()); - if (!element.isNull()) { - const QString tagName(element.tagName()); - if (tagName.compare(QLatin1String("textarea"), Qt::CaseInsensitive) == 0) { - return true; - } - const QString type(element.attribute(QStringLiteral("type")).toLower()); - if (tagName.compare(QLatin1String("input"), Qt::CaseInsensitive) == 0 - && (type.isEmpty() || type == QLatin1String("text") || type == QLatin1String("password"))) { - return true; - } - if (element.evaluateJavaScript(QStringLiteral("this.isContentEditable")).toBool()) { - return true; - } - } - return false; -} - -static bool isHiddenElement(const QWebElement &element) -{ - // width property set to less than zero - if (element.hasAttribute(QStringLiteral("width")) && element.attribute(QStringLiteral("width")).toInt() < 1) { - return true; - } - - // height property set to less than zero - if (element.hasAttribute(QStringLiteral("height")) && element.attribute(QStringLiteral("height")).toInt() < 1) { - return true; - } - - // visibility set to 'hidden' in the element itself or its parent elements. - if (element.styleProperty(QStringLiteral("visibility"), QWebElement::ComputedStyle).compare(QLatin1String("hidden"), Qt::CaseInsensitive) == 0) { - return true; - } - - // display set to 'none' in the element itself or its parent elements. - if (element.styleProperty(QStringLiteral("display"), QWebElement::ComputedStyle).compare(QLatin1String("none"), Qt::CaseInsensitive) == 0) { - return true; - } - - return false; -} - -static QString linkElementKey(const QWebElement &element) -{ - if (element.hasAttribute(QStringLiteral("href"))) { - const QUrl url = element.webFrame()->baseUrl().resolved(element.attribute(QStringLiteral("href"))); - QString linkKey(url.toString()); - if (element.hasAttribute(QStringLiteral("target"))) { - linkKey += QLatin1Char('+'); - linkKey += element.attribute(QStringLiteral("target")); - } - return linkKey; - } - return QString(); -} - -static void handleDuplicateLinkElements(const QWebElement &element, QHash *dupLinkList, QChar *accessKey) -{ - if (element.tagName().compare(QLatin1String("A"), Qt::CaseInsensitive) == 0) { - const QString linkKey(linkElementKey(element)); - // qCDebug(MESSAGEVIEWER_LOG) << "LINK KEY:" << linkKey; - if (dupLinkList->contains(linkKey)) { - // qCDebug(MESSAGEVIEWER_LOG) << "***** Found duplicate link element:" << linkKey; - *accessKey = dupLinkList->value(linkKey); - } else if (!linkKey.isEmpty()) { - dupLinkList->insert(linkKey, *accessKey); - } - if (linkKey.isEmpty()) { - *accessKey = QChar(); - } - } -} - -WebViewAccessKey::WebViewAccessKey(QWebView *webView, QObject *parent) - : QObject(parent), - d(new MessageViewer::WebViewAccessKeyPrivate(webView)) -{ - -} - -WebViewAccessKey::~WebViewAccessKey() -{ - delete d; -} - -void WebViewAccessKey::wheelEvent(QWheelEvent *e) -{ - if (d->mAccessKeyActivated == WebViewAccessKeyPrivate::PreActivated && (e->modifiers() & Qt::ControlModifier)) { - d->mAccessKeyActivated = WebViewAccessKeyPrivate::NotActivated; - } -} - -void WebViewAccessKey::resizeEvent(QResizeEvent *) -{ - if (d->mAccessKeyActivated == WebViewAccessKeyPrivate::Activated) { - hideAccessKeys(); - } -} - -void WebViewAccessKey::keyPressEvent(QKeyEvent *e) -{ - if (e && d->mWebView->hasFocus()) { - if (d->mAccessKeyActivated == WebViewAccessKeyPrivate::Activated) { - if (checkForAccessKey(e)) { - hideAccessKeys(); - e->accept(); - return; - } - hideAccessKeys(); - } else if (e->key() == Qt::Key_Control && e->modifiers() == Qt::ControlModifier && !isEditableElement(d->mWebView->page())) { - d->mAccessKeyActivated = WebViewAccessKeyPrivate::PreActivated; // Only preactive here, it will be actually activated in key release. - } - } -} - -void WebViewAccessKey::keyReleaseEvent(QKeyEvent *e) -{ - if (d->mAccessKeyActivated == WebViewAccessKeyPrivate::PreActivated) { - // Activate only when the CTRL key is pressed and released by itself. - if (e->key() == Qt::Key_Control && e->modifiers() == Qt::NoModifier) { - showAccessKeys(); - d->mAccessKeyActivated = WebViewAccessKeyPrivate::Activated; - } else { - d->mAccessKeyActivated = WebViewAccessKeyPrivate::NotActivated; - } - } -} - -void WebViewAccessKey::setActionCollection(KActionCollection *ac) -{ - d->mActionCollection = ac; -} - -bool WebViewAccessKey::checkForAccessKey(QKeyEvent *event) -{ - if (d->mAccessKeyLabels.isEmpty()) { - return false; - } - QString text = event->text(); - if (text.isEmpty()) { - return false; - } - QChar key = text.at(0).toUpper(); - bool handled = false; - if (d->mAccessKeyNodes.contains(key)) { - QWebElement element = d->mAccessKeyNodes[key]; - QPoint p = element.geometry().center(); - - if (element.tagName().compare(QLatin1String("A"), Qt::CaseInsensitive) == 0) { - const QString linkKey(linkElementKey(element)); - if (!linkKey.isEmpty()) { - handled = true; - Q_EMIT openUrl(QUrl(linkKey)); - } - } - } - return handled; -} - -void WebViewAccessKey::showAccessKeys() -{ - QList unusedKeys; - unusedKeys.reserve(10 + ('Z' - 'A' + 1)); - for (char c = 'A'; c <= 'Z'; ++c) { - unusedKeys << QLatin1Char(c); - } - for (char c = '0'; c <= '9'; ++c) { - unusedKeys << QLatin1Char(c); - } - if (d->mActionCollection) { - Q_FOREACH (QAction *act, d->mActionCollection->actions()) { - QAction *a = qobject_cast(act); - if (a) { - const QKeySequence shortCut = a->shortcut(); - if (!shortCut.isEmpty()) { - Q_FOREACH (QChar c, unusedKeys) { - if (shortCut.matches(QKeySequence(c)) != QKeySequence::NoMatch) { - unusedKeys.removeOne(c); - } - } - } - } - } - } - QList unLabeledElements; - QRect viewport = QRect(d->mWebView->page()->mainFrame()->scrollPosition(), d->mWebView->page()->viewportSize()); - const QString selectorQuery(QStringLiteral("a[href]," - "area," - "button:not([disabled])," - "input:not([disabled]):not([hidden])," - "label[for]," - "legend," - "select:not([disabled])," - "textarea:not([disabled])")); - QList result = d->mWebView->page()->mainFrame()->findAllElements(selectorQuery).toList(); - - // Priority first goes to elements with accesskey attributes - Q_FOREACH (const QWebElement &element, result) { - const QRect geometry = element.geometry(); - if (geometry.size().isEmpty() || !viewport.contains(geometry.topLeft())) { - continue; - } - if (isHiddenElement(element)) { - continue; // Do not show access key for hidden elements... - } - const QString accessKeyAttribute(element.attribute(QStringLiteral("accesskey")).toUpper()); - if (accessKeyAttribute.isEmpty()) { - unLabeledElements.append(element); - continue; - } - QChar accessKey; - for (int i = 0; i < accessKeyAttribute.count(); i += 2) { - const QChar &possibleAccessKey = accessKeyAttribute[i]; - if (unusedKeys.contains(possibleAccessKey)) { - accessKey = possibleAccessKey; - break; - } - } - if (accessKey.isNull()) { - unLabeledElements.append(element); - continue; - } - - handleDuplicateLinkElements(element, &d->mDuplicateLinkElements, &accessKey); - if (!accessKey.isNull()) { - unusedKeys.removeOne(accessKey); - makeAccessKeyLabel(accessKey, element); - } - } - - // Pick an access key first from the letters in the text and then from the - // list of unused access keys - Q_FOREACH (const QWebElement &element, unLabeledElements) { - const QRect geometry = element.geometry(); - if (unusedKeys.isEmpty() - || geometry.size().isEmpty() - || !viewport.contains(geometry.topLeft())) { - continue; - } - QChar accessKey; - const QString text = element.toPlainText().toUpper(); - for (int i = 0; i < text.count(); ++i) { - const QChar &c = text.at(i); - if (unusedKeys.contains(c)) { - accessKey = c; - break; - } - } - if (accessKey.isNull()) { - accessKey = unusedKeys.takeFirst(); - } - - handleDuplicateLinkElements(element, &d->mDuplicateLinkElements, &accessKey); - if (!accessKey.isNull()) { - unusedKeys.removeOne(accessKey); - makeAccessKeyLabel(accessKey, element); - } - } - - d->mAccessKeyActivated = (!d->mAccessKeyLabels.isEmpty() ? WebViewAccessKeyPrivate::Activated : WebViewAccessKeyPrivate::NotActivated); -} - -void WebViewAccessKey::makeAccessKeyLabel(QChar accessKey, const QWebElement &element) -{ - QLabel *label = new QLabel(d->mWebView); - QFont font(label->font()); - font.setBold(true); - label->setFont(font); - label->setText(accessKey); - label->setPalette(QToolTip::palette()); - label->setAutoFillBackground(true); - label->setFrameStyle(QFrame::Box | QFrame::Plain); - QPoint point = element.geometry().center(); - point -= d->mWebView->page()->mainFrame()->scrollPosition(); - label->move(point); - label->show(); - point.setX(point.x() - label->width() / 2); - label->move(point); - d->mAccessKeyLabels.append(label); - d->mAccessKeyNodes.insertMulti(accessKey, element); - -} - -void WebViewAccessKey::hideAccessKeys() -{ - if (!d->mAccessKeyLabels.isEmpty()) { - for (int i = 0, count = d->mAccessKeyLabels.count(); i < count; ++i) { - QLabel *label = d->mAccessKeyLabels[i]; - label->hide(); - label->deleteLater(); - } - d->mAccessKeyLabels.clear(); - d->mAccessKeyNodes.clear(); - d->mDuplicateLinkElements.clear(); - d->mAccessKeyActivated = WebViewAccessKeyPrivate::NotActivated; - d->mWebView->update(); - } -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewer/webview/webviewaccesskey.h kf5-messagelib-16.12.3/messageviewer/src/viewer/webview/webviewaccesskey.h --- kf5-messagelib-16.04.3/messageviewer/src/viewer/webview/webviewaccesskey.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewer/webview/webviewaccesskey.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef WEBVIEWACCESSKEY_H -#define WEBVIEWACCESSKEY_H - -#include -#include "messageviewer_export.h" -class QKeyEvent; -class QWebElement; -class QWebView; -class KActionCollection; -class QWheelEvent; -class QResizeEvent; -namespace MessageViewer -{ -class WebViewAccessKeyPrivate; -class MESSAGEVIEWER_EXPORT WebViewAccessKey : public QObject -{ - Q_OBJECT -public: - explicit WebViewAccessKey(QWebView *webView, QObject *parent = Q_NULLPTR); - ~WebViewAccessKey(); - - void setActionCollection(KActionCollection *ac); - - bool checkForAccessKey(QKeyEvent *event); - void showAccessKeys(); - void makeAccessKeyLabel(QChar accessKey, const QWebElement &element); - - void wheelEvent(QWheelEvent *e); - void keyPressEvent(QKeyEvent *e); - void keyReleaseEvent(QKeyEvent *e); - void resizeEvent(QResizeEvent *); -public Q_SLOTS: - void hideAccessKeys(); - -Q_SIGNALS: - void openUrl(const QUrl &url); - -private: - WebViewAccessKeyPrivate *const d; -}; -} -#endif // WEBVIEWACCESSKEY_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/tests/CMakeLists.txt kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/tests/CMakeLists.txt --- kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/tests/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/tests/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -3,5 +3,6 @@ target_link_libraries(viewerplugin_gui KF5::MessageViewer KF5::XmlGui + KF5::I18n ) diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/tests/viewerplugin_gui.cpp kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/tests/viewerplugin_gui.cpp --- kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/tests/viewerplugin_gui.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/tests/viewerplugin_gui.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + This library 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This library 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 General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "viewerplugin_gui.h" diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/tests/viewerplugin_gui.h kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/tests/viewerplugin_gui.h --- kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/tests/viewerplugin_gui.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/tests/viewerplugin_gui.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + This library 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This library 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 General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef TEST_VIEWVERPLUGIN_GUI_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/viewerplugin.cpp kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/viewerplugin.cpp --- kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/viewerplugin.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/viewerplugin.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "viewerplugin.h" @@ -23,9 +25,11 @@ { public: ViewerPluginPrivate() + : mEnabled(false) { } + bool mEnabled; }; ViewerPlugin::ViewerPlugin(QObject *parent) @@ -40,3 +44,23 @@ delete d; } +void ViewerPlugin::showConfigureDialog(QWidget *parent) +{ + Q_UNUSED(parent); +} + +bool ViewerPlugin::hasConfigureDialog() const +{ + return false; +} + +void ViewerPlugin::setIsEnabled(bool enabled) +{ + d->mEnabled = enabled; +} + +bool ViewerPlugin::isEnabled() const +{ + return d->mEnabled; +} + diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/viewerplugin.h kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/viewerplugin.h --- kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/viewerplugin.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/viewerplugin.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef VIEWERPLUGIN_H @@ -35,6 +37,11 @@ virtual MessageViewer::ViewerPluginInterface *createView(QWidget *parent, KActionCollection *ac) = 0; virtual QString viewerPluginName() const = 0; + virtual void showConfigureDialog(QWidget *parent = Q_NULLPTR); + virtual bool hasConfigureDialog() const; + + void setIsEnabled(bool enabled); + bool isEnabled() const; private: ViewerPluginPrivate *const d; diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/viewerplugininterface.cpp kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/viewerplugininterface.cpp --- kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/viewerplugininterface.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/viewerplugininterface.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "viewerplugininterface.h" @@ -51,10 +53,10 @@ // Reimplement in subclass. } -QAction *ViewerPluginInterface::action() const +QList ViewerPluginInterface::actions() const { // Reimplement in subclass - return Q_NULLPTR; + return {}; } void ViewerPluginInterface::setUrl(const QUrl &url) diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/viewerplugininterface.h kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/viewerplugininterface.h --- kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/viewerplugininterface.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/viewerplugininterface.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef VIEWERPLUGININTERFACE_H @@ -46,7 +48,7 @@ virtual void execute(); virtual void setText(const QString &text); - virtual QAction *action() const; + virtual QList actions() const; virtual void setUrl(const QUrl &url); virtual void setMessage(const KMime::Message::Ptr &value); virtual void setMessageItem(const Akonadi::Item &item); diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/viewerpluginmanager.cpp kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/viewerpluginmanager.cpp --- kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/viewerpluginmanager.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/viewerpluginmanager.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,28 +1,33 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "viewerpluginmanager.h" #include "viewerplugin.h" +#include "messageviewer_debug.h" +#include #include #include #include #include #include +#include using namespace MessageViewer; @@ -48,21 +53,19 @@ { public: ViewerPluginInfo() - : plugin(Q_NULLPTR) + : plugin(Q_NULLPTR), + isEnabled(false) { } - QString saveName() const; - KPluginMetaData metaData; + QString metaDataFileNameBaseName; + QString metaDataFileName; + PimCommon::PluginUtilData pluginData; MessageViewer::ViewerPlugin *plugin; + bool isEnabled; }; -QString ViewerPluginInfo::saveName() const -{ - return QFileInfo(metaData.fileName()).baseName(); -} - class MessageViewer::ViewerPluginManagerPrivate { public: @@ -74,9 +77,16 @@ bool initializePluginList(); void loadPlugin(ViewerPluginInfo *item); QVector pluginsList() const; - QVector mPluginList; + QVector pluginDataList() const; + QString serviceTypeName; QString pluginName; + QString configGroupName() const; + QString configPrefixSettingKey() const; + ViewerPlugin *pluginFromIdentifier(const QString &id); +private: + QVector mPluginList; + QVector mPluginDataList; ViewerPluginManager *q; }; @@ -84,18 +94,28 @@ { QString pluginVersion() { - return QStringLiteral("1.0"); + return QStringLiteral("2.0"); } } +QString ViewerPluginManagerPrivate::configGroupName() const +{ + return QStringLiteral("PluginMessageViewer%1").arg(pluginName); +} + +QString ViewerPluginManagerPrivate::configPrefixSettingKey() const +{ + return QStringLiteral("MessageViewerPlugins"); +} + bool ViewerPluginManagerPrivate::initializePluginList() { - if (serviceTypeName.isEmpty() || pluginName.isEmpty()) { - return false; - } if (!mPluginList.isEmpty()) { return true; } + if (serviceTypeName.isEmpty() || pluginName.isEmpty()) { + return false; + } static const QString s_serviceTypeName = serviceTypeName; QVector plugins = KPluginLoader::findPlugins(pluginName, [](const KPluginMetaData & md) { @@ -106,22 +126,34 @@ plugins += KPluginLoader::findPlugins(QStringLiteral("messageviewer"), [](const KPluginMetaData & md) { return md.serviceTypes().contains(QStringLiteral("MessageViewer/ViewerCommonPlugin")); }); + + const QPair pair = PimCommon::PluginUtil::loadPluginSetting(configGroupName(), configPrefixSettingKey()); QVectorIterator i(plugins); i.toBack(); QSet unique; while (i.hasPrevious()) { ViewerPluginInfo info; - info.metaData = i.previous(); - const QString version = info.metaData.version(); - if (pluginVersion() == version) { + const KPluginMetaData data = i.previous(); + + //1) get plugin data => name/description etc. + info.pluginData = PimCommon::PluginUtil::createPluginMetaData(data); + //2) look at if plugin is activated + const bool isPluginActivated = PimCommon::PluginUtil::isPluginActivated(pair.first, pair.second, info.pluginData.mEnableByDefault, info.pluginData.mIdentifier); + info.isEnabled = isPluginActivated; + info.metaDataFileNameBaseName = QFileInfo(data.fileName()).baseName(); + info.metaDataFileName = data.fileName(); + + if (pluginVersion() == data.version()) { // only load plugins once, even if found multiple times! - if (unique.contains(info.saveName())) { + if (unique.contains(info.metaDataFileNameBaseName)) { continue; } info.plugin = Q_NULLPTR; mPluginList.push_back(info); - unique.insert(info.saveName()); + unique.insert(info.metaDataFileNameBaseName); + } else { + qCWarning(MESSAGEVIEWER_LOG) << "Plugin name :" << data.name() << " doesn't have correct plugin version. Please update it"; } } QVector::iterator end(mPluginList.end()); @@ -133,7 +165,13 @@ void ViewerPluginManagerPrivate::loadPlugin(ViewerPluginInfo *item) { - item->plugin = KPluginLoader(item->metaData.fileName()).factory()->create(q, QVariantList() << item->saveName()); + KPluginLoader pluginLoader(item->metaDataFileName); + if (pluginLoader.factory()) { + item->plugin = pluginLoader.factory()->create(q, QVariantList() << item->metaDataFileNameBaseName); + item->plugin->setIsEnabled(item->isEnabled); + item->pluginData.mHasConfigureDialog = item->plugin->hasConfigureDialog(); + mPluginDataList.append(item->pluginData); + } } QVector ViewerPluginManagerPrivate::pluginsList() const @@ -148,6 +186,22 @@ return lst; } +QVector ViewerPluginManagerPrivate::pluginDataList() const +{ + return mPluginDataList; +} + +ViewerPlugin *ViewerPluginManagerPrivate::pluginFromIdentifier(const QString &id) +{ + QVector::ConstIterator end(mPluginList.constEnd()); + for (QVector::ConstIterator it = mPluginList.constBegin(); it != end; ++it) { + if ((*it).pluginData.mIdentifier == id) { + return (*it).plugin; + } + } + return {}; +} + ViewerPluginManager::ViewerPluginManager(QObject *parent) : QObject(parent), d(new MessageViewer::ViewerPluginManagerPrivate(this)) @@ -193,3 +247,24 @@ { return d->pluginName; } + +QVector ViewerPluginManager::pluginsDataList() const +{ + return d->pluginDataList(); +} + +QString ViewerPluginManager::configGroupName() const +{ + return d->configGroupName(); +} + +QString ViewerPluginManager::configPrefixSettingKey() const +{ + return d->configPrefixSettingKey(); +} + +MessageViewer::ViewerPlugin *ViewerPluginManager::pluginFromIdentifier(const QString &id) +{ + return d->pluginFromIdentifier(id); +} + diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/viewerpluginmanager.h kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/viewerpluginmanager.h --- kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/viewerpluginmanager.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/viewerpluginmanager.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef VIEWERPLUGINMANAGER_H @@ -20,7 +22,7 @@ #include #include "messageviewer_export.h" - +#include namespace MessageViewer { class ViewerPluginManagerPrivate; @@ -29,11 +31,13 @@ { Q_OBJECT public: + explicit ViewerPluginManager(QObject *parent = Q_NULLPTR); ~ViewerPluginManager(); static ViewerPluginManager *self(); QVector pluginsList() const; + QVector pluginsDataList() const; void setServiceTypeName(const QString &serviceName); QString serviceTypeName() const; @@ -42,6 +46,10 @@ QString pluginName() const; bool initializePluginList(); + + QString configGroupName() const; + QString configPrefixSettingKey() const; + MessageViewer::ViewerPlugin *pluginFromIdentifier(const QString &id); private: ViewerPluginManagerPrivate *const d; }; diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/viewerplugintoolmanager.cpp kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/viewerplugintoolmanager.cpp --- kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/viewerplugintoolmanager.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/viewerplugintoolmanager.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "viewerplugintoolmanager.h" @@ -73,9 +75,11 @@ { QVector listPlugin = MessageViewer::ViewerPluginManager::self()->pluginsList(); Q_FOREACH (MessageViewer::ViewerPlugin *plugin, listPlugin) { - MessageViewer::ViewerPluginInterface *interface = plugin->createView(mParentWidget, mActionCollection); - q->connect(interface, &MessageViewer::ViewerPluginInterface::activatePlugin, q, &ViewerPluginToolManager::activatePlugin); - mListInterface.append(interface); + if (plugin->isEnabled()) { + MessageViewer::ViewerPluginInterface *interface = plugin->createView(mParentWidget, mActionCollection); + q->connect(interface, &MessageViewer::ViewerPluginInterface::activatePlugin, q, &ViewerPluginToolManager::activatePlugin); + mListInterface.append(interface); + } } } @@ -96,10 +100,10 @@ QList lstAction; Q_FOREACH (MessageViewer::ViewerPluginInterface *interface, mListInterface) { if (features & ViewerPluginInterface::All) { - lstAction.append(interface->action()); + lstAction.append(interface->actions()); } else { if (interface->featureTypes() & features) { - lstAction.append(interface->action()); + lstAction.append(interface->actions()); } } } diff -Nru kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/viewerplugintoolmanager.h kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/viewerplugintoolmanager.h --- kf5-messagelib-16.04.3/messageviewer/src/viewerplugins/viewerplugintoolmanager.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/viewerplugins/viewerplugintoolmanager.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2015-2016 Montel Laurent + Copyright (C) 2015-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + This library 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This library 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 General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef VIEWERPLUGINTOOLMANAGER_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/networkmanager/networkaccessmanagerwebengine.cpp kf5-messagelib-16.12.3/messageviewer/src/webengine/networkmanager/networkaccessmanagerwebengine.cpp --- kf5-messagelib-16.04.3/messageviewer/src/webengine/networkmanager/networkaccessmanagerwebengine.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/networkmanager/networkaccessmanagerwebengine.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "networkaccessmanagerwebengine.h" -#include "webengine/urlinterceptor/networkurlinterceptormanager.h" -#include "webengine/urlinterceptor/networkurlinterceptor.h" -#include - -using namespace MessageViewer; - -class MessageViewer::NetworkAccessManagerWebEnginePrivate -{ -public: - NetworkAccessManagerWebEnginePrivate() - : mManager(Q_NULLPTR) - { - - } - MessageViewer::NetworkUrlInterceptorManager *mManager; -}; - -NetworkAccessManagerWebEngine::NetworkAccessManagerWebEngine(KActionCollection *ac, QObject *parent) - : QNetworkAccessManager(parent), - d(new NetworkAccessManagerWebEnginePrivate) -{ - d->mManager = new MessageViewer::NetworkUrlInterceptorManager(ac, this); - - // Add interceptor. - MessageViewer::NetworkUrlInterceptor *networkUrlInterceptor = new MessageViewer::NetworkUrlInterceptor(this); - Q_FOREACH (MessageViewer::NetworkPluginUrlInterceptorInterface *interface, d->mManager->interfaceList()) { - networkUrlInterceptor->addInterceptor(interface); - } - QWebEngineProfile::defaultProfile()->setRequestInterceptor(networkUrlInterceptor); -} - -NetworkAccessManagerWebEngine::~NetworkAccessManagerWebEngine() -{ - delete d; -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/networkmanager/networkaccessmanagerwebengine.h kf5-messagelib-16.12.3/messageviewer/src/webengine/networkmanager/networkaccessmanagerwebengine.h --- kf5-messagelib-16.04.3/messageviewer/src/webengine/networkmanager/networkaccessmanagerwebengine.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/networkmanager/networkaccessmanagerwebengine.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef MAILNETWORKACCESSMANAGER_H -#define MAILNETWORKACCESSMANAGER_H - -#include -#include "messageviewer_export.h" -class KActionCollection; -namespace MessageViewer -{ -class NetworkAccessManagerWebEnginePrivate; -class MESSAGEVIEWER_EXPORT NetworkAccessManagerWebEngine : public QNetworkAccessManager -{ - Q_OBJECT -public: - explicit NetworkAccessManagerWebEngine(KActionCollection *ac, QObject *parent = Q_NULLPTR); - ~NetworkAccessManagerWebEngine(); -private: - NetworkAccessManagerWebEnginePrivate *const d; -}; -} -#endif // MAILNETWORKACCESSMANAGER_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/CMakeLists.txt kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/CMakeLists.txt --- kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -set(webengine_test_SRCS - testwebengine.cpp - ) - -add_executable(webenginetest ${webengine_test_SRCS}) - -target_link_libraries(webenginetest - Qt5::Widgets KF5::MessageViewer Qt5::WebEngine Qt5::WebEngineWidgets - ) - -##### -set(webenginescript_test_SRCS - testwebenginescript.cpp - ) - -add_executable(webenginescripttest ${webenginescript_test_SRCS}) - -target_link_libraries(webenginescripttest - Qt5::Widgets KF5::MessageViewer Qt5::WebEngine Qt5::WebEngineWidgets - ) - -###### - -set(webengineaccesskey_test_SRCS - testwebengineaccesskey.cpp - ) - -add_executable(webengineaccesskeytest ${webengineaccesskey_test_SRCS}) - -target_link_libraries(webengineaccesskeytest - Qt5::Widgets KF5::MessageViewer Qt5::WebEngine Qt5::WebEngineWidgets KF5::XmlGui KF5::IconThemes - ) - -#### -set(scrolladdattachment_test_SRCS - testwebenginescrolladdattachment.cpp - ) - -add_executable(scrolladdattachmenttest ${scrolladdattachment_test_SRCS}) - -target_link_libraries(scrolladdattachmenttest - Qt5::Widgets KF5::MessageViewer Qt5::WebEngine Qt5::WebEngineWidgets KF5::XmlGui KF5::IconThemes - ) diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/testwebengineaccesskey.cpp kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/testwebengineaccesskey.cpp --- kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/testwebengineaccesskey.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/testwebengineaccesskey.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "testwebengineaccesskey.h" -#include "viewer/webengine/mailwebengineaccesskey.h" -#include "viewer/webengine/mailwebengineview.h" -#include "messageviewer/messageviewersettings.h" -#include -#include -#include -#include - -#include -#include - - -TestWebEngineAccesskey::TestWebEngineAccesskey(QWidget *parent) - : QWidget(parent) -{ - QVBoxLayout *vboxLayout = new QVBoxLayout(this); - MessageViewer::MessageViewerSettings::self()->setAccessKeyEnabled(true); - mTestWebEngine = new MessageViewer::MailWebEngineView(new KActionCollection(this), this); - mTestWebEngine->settings()->setAttribute(QWebEngineSettings::JavascriptEnabled, true); - vboxLayout->addWidget(mTestWebEngine); - mTestWebEngine->load(QUrl(QStringLiteral("http://www.kde.org"))); - QPushButton *searchAccessKey = new QPushButton(QStringLiteral("AccessKey"), this); - vboxLayout->addWidget(searchAccessKey); - connect(searchAccessKey, &QPushButton::clicked, this, &TestWebEngineAccesskey::slotShowAccessKey); -} - -TestWebEngineAccesskey::~TestWebEngineAccesskey() -{ - -} - -void TestWebEngineAccesskey::slotShowAccessKey() -{ - mTestWebEngine->showAccessKeys(); -} - -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - QStandardPaths::setTestModeEnabled(true); - app.setAttribute(Qt::AA_UseHighDpiPixmaps, true); - TestWebEngineAccesskey *testWebEngine = new TestWebEngineAccesskey; - testWebEngine->show(); - const int ret = app.exec(); - return ret; -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/testwebengineaccesskey.h kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/testwebengineaccesskey.h --- kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/testwebengineaccesskey.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/testwebengineaccesskey.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef TESTWEBENGINEACCESSKEY_H -#define TESTWEBENGINEACCESSKEY_H - -#include -#include -namespace MessageViewer -{ -class MailWebEngineView; -} - -class TestWebEngineAccesskey : public QWidget -{ - Q_OBJECT -public: - explicit TestWebEngineAccesskey(QWidget *parent = Q_NULLPTR); - ~TestWebEngineAccesskey(); - -private Q_SLOTS: - void slotShowAccessKey(); - -private: - MessageViewer::MailWebEngineView *mTestWebEngine; -}; - -#endif // TESTWEBENGINEACCESSKEY_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/testwebengine.cpp kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/testwebengine.cpp --- kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/testwebengine.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/testwebengine.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "testwebengine.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -TestWebEngine::TestWebEngine(QWidget *parent) - : QWidget(parent) -{ - QHBoxLayout *hboxLayout = new QHBoxLayout(this); - TestWebEngineView *pageView = new TestWebEngineView(this); - hboxLayout->addWidget(pageView); - mEnginePage = new MessageViewer::WebEnginePage(this); - pageView->setPage(mEnginePage); - pageView->setContextMenuPolicy(Qt::DefaultContextMenu); - setContextMenuPolicy(Qt::DefaultContextMenu); - pageView->load(QUrl(QStringLiteral("http://www.kde.org"))); -} - -TestWebEngine::~TestWebEngine() -{ - -} - -TestWebEngineView::TestWebEngineView(QWidget *parent) - : QWebEngineView(parent) -{ - setContextMenuPolicy(Qt::DefaultContextMenu); - settings()->setAttribute(QWebEngineSettings::JavascriptEnabled, false); -} - -void TestWebEngineView::slotHitTestFinished(const MessageViewer::WebHitTestResult &result) -{ - qDebug() << " alternateText" << result.alternateText(); - qDebug() << " boundingRect" << result.boundingRect(); - qDebug() << " imageUrl" << result.imageUrl(); - qDebug() << " isContentEditable" << result.isContentEditable(); - qDebug() << " isContentSelected" << result.isContentSelected(); - qDebug() << " isNull" << result.isNull(); - qDebug() << " linkTitle" << result.linkTitle(); - qDebug() << " linkUrl" << result.linkUrl(); - qDebug() << " mediaUrl" << result.mediaUrl(); - qDebug() << " mediaPaused" << result.mediaPaused(); - qDebug() << " mediaMuted" << result.mediaMuted(); - qDebug() << " pos" << result.pos(); - qDebug() << " tagName" << result.tagName(); - -} - -void TestWebEngineView::contextMenuEvent(QContextMenuEvent *e) -{ - MessageViewer::WebHitTest *webHit = static_cast(page())->hitTestContent(e->pos()); - connect(webHit, &MessageViewer::WebHitTest::finished, this, &TestWebEngineView::slotHitTestFinished); -} - -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - app.setAttribute(Qt::AA_UseHighDpiPixmaps, true); - TestWebEngine *testWebEngine = new TestWebEngine; - testWebEngine->show(); - const int ret = app.exec(); - return ret; -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/testwebengine.h kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/testwebengine.h --- kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/testwebengine.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/testwebengine.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef TESTWEBENGINE_H -#define TESTWEBENGINE_H - -#include -#include -namespace MessageViewer -{ -class WebEnginePage; -class WebHitTestResult; -} - -class TestWebEngineView : public QWebEngineView -{ - Q_OBJECT -public: - explicit TestWebEngineView(QWidget *parent = Q_NULLPTR); -protected: - void contextMenuEvent(QContextMenuEvent *e); -private Q_SLOTS: - void slotHitTestFinished(const MessageViewer::WebHitTestResult &result); -}; - -class TestWebEngine : public QWidget -{ - Q_OBJECT -public: - explicit TestWebEngine(QWidget *parent = Q_NULLPTR); - ~TestWebEngine(); -private: - MessageViewer::WebEnginePage *mEnginePage; -}; - -#endif // TESTWEBENGINE_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/testwebenginescript.cpp kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/testwebenginescript.cpp --- kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/testwebenginescript.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/testwebenginescript.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,123 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "testwebenginescript.h" -#include "webengine/webenginescript.h" - -#include -#include -#include -#include -#include - -template -struct InvokeWrapper { - R *receiver; - void (C::*memberFunction)(Arg); - void operator()(Arg result) - { - (receiver->*memberFunction)(result); - } -}; - -template - -InvokeWrapper invoke(R *receiver, void (C::*memberFunction)(Arg)) -{ - InvokeWrapper wrapper = {receiver, memberFunction}; - return wrapper; -} - -TestWebEngineScriptView::TestWebEngineScriptView(QWidget *parent) - : QWebEngineView(parent) -{ - settings()->setAttribute(QWebEngineSettings::JavascriptEnabled, true); -} - -TestWebEngineScript::TestWebEngineScript(QWidget *parent) - : QWidget(parent) -{ - QVBoxLayout *vboxLayout = new QVBoxLayout(this); - mTestWebEngine = new TestWebEngineScriptView(this); - vboxLayout->addWidget(mTestWebEngine); - mTestWebEngine->load(QUrl(QStringLiteral("http://www.kde.org"))); - - mTestScriptWidget = new TestScriptWidget(this); - vboxLayout->addWidget(mTestScriptWidget); - connect(mTestScriptWidget, &TestScriptWidget::executeScript, this, &TestWebEngineScript::slotExecuteScript); -} - -TestWebEngineScript::~TestWebEngineScript() -{ - -} - -void TestWebEngineScript::handleScript(const QVariant &res) -{ - qDebug() << " res" << res; - //TODO - //mTestScriptWidget->setResult(); -} - -void TestWebEngineScript::slotExecuteScript() -{ - const QString script = mTestScriptWidget->script(); - if (!script.isEmpty()) { - qDebug() << " script" << script; - mTestWebEngine->page()->runJavaScript(script, invoke(this, &TestWebEngineScript::handleScript)); - } -} - -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - app.setAttribute(Qt::AA_UseHighDpiPixmaps, true); - TestWebEngineScript *testWebEngine = new TestWebEngineScript; - testWebEngine->show(); - const int ret = app.exec(); - return ret; -} - -TestScriptWidget::TestScriptWidget(QWidget *parent) - : QWidget(parent) -{ - QHBoxLayout *layout = new QHBoxLayout(this); - - mScriptEdit = new QTextEdit; - mScriptEdit->setAcceptRichText(false); - layout->addWidget(mScriptEdit); - - QVBoxLayout *vboxLayout = new QVBoxLayout; - layout->addLayout(vboxLayout); - - mResultEdit = new QTextEdit; - mResultEdit->setReadOnly(true); - vboxLayout->addWidget(mResultEdit); - QPushButton *button = new QPushButton(QStringLiteral("Execute Script"), this); - connect(button, &QPushButton::clicked, this, &TestScriptWidget::executeScript); - vboxLayout->addWidget(button); -} - -void TestScriptWidget::setResult(const QString &res) -{ - mResultEdit->setText(res); -} - -QString TestScriptWidget::script() const -{ - return mScriptEdit->toPlainText(); -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/testwebenginescript.h kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/testwebenginescript.h --- kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/testwebenginescript.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/testwebenginescript.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef TESTWEBENGINESCRIPT_H -#define TESTWEBENGINESCRIPT_H - -#include -#include -class QTextEdit; -class TestScriptWidget : public QWidget -{ - Q_OBJECT -public: - explicit TestScriptWidget(QWidget *parent = Q_NULLPTR); - void setResult(const QString &res); - QString script() const; -Q_SIGNALS: - void executeScript(); -private: - QTextEdit *mScriptEdit; - QTextEdit *mResultEdit; -}; - -class TestWebEngineScriptView : public QWebEngineView -{ - Q_OBJECT -public: - explicit TestWebEngineScriptView(QWidget *parent = Q_NULLPTR); -}; - -class TestWebEngineScript : public QWidget -{ - Q_OBJECT -public: - explicit TestWebEngineScript(QWidget *parent = Q_NULLPTR); - ~TestWebEngineScript(); - -private Q_SLOTS: - void slotExecuteScript(); - void handleScript(const QVariant &res); - -private: - TestScriptWidget *mTestScriptWidget; - TestWebEngineScriptView *mTestWebEngine; -}; - -#endif // TESTWEBENGINESCRIPT_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/testwebenginescrolladdattachment.cpp kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/testwebenginescrolladdattachment.cpp --- kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/testwebenginescrolladdattachment.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/testwebenginescrolladdattachment.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "testwebenginescrolladdattachment.h" - -#include - -TestWebEngineScrollAddAttachment::TestWebEngineScrollAddAttachment(QWidget *parent) - : QWidget(parent) -{ - -} - -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - app.setAttribute(Qt::AA_UseHighDpiPixmaps, true); - TestWebEngineScrollAddAttachment *testWebEngine = new TestWebEngineScrollAddAttachment; - testWebEngine->show(); - const int ret = app.exec(); - return ret; -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/testwebenginescrolladdattachment.h kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/testwebenginescrolladdattachment.h --- kf5-messagelib-16.04.3/messageviewer/src/webengine/tests/testwebenginescrolladdattachment.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/tests/testwebenginescrolladdattachment.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef TESTWEBENGINESCROLLADDATTACHMENT_H -#define TESTWEBENGINESCROLLADDATTACHMENT_H - -#include - -class TestWebEngineScrollAddAttachment : public QWidget -{ - Q_OBJECT -public: - explicit TestWebEngineScrollAddAttachment(QWidget *parent = Q_NULLPTR); -}; - -#endif // TESTWEBENGINESCROLLADDATTACHMENT_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptorconfigurewidget.cpp kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptorconfigurewidget.cpp --- kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptorconfigurewidget.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptorconfigurewidget.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "networkpluginurlinterceptorconfigurewidget.h" - -using namespace MessageViewer; - -NetworkPluginUrlInterceptorConfigureWidget::NetworkPluginUrlInterceptorConfigureWidget(QWidget *parent) - : QWidget(parent) -{ - -} - -NetworkPluginUrlInterceptorConfigureWidget::~NetworkPluginUrlInterceptorConfigureWidget() -{ - -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptorconfigurewidget.h kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptorconfigurewidget.h --- kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptorconfigurewidget.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptorconfigurewidget.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef NETWORKPLUGINURLINTERCEPTORCONFIGUREWIDGET_H -#define NETWORKPLUGINURLINTERCEPTORCONFIGUREWIDGET_H - -#include -#include "messageviewer_export.h" - -namespace MessageViewer -{ -class MESSAGEVIEWER_EXPORT NetworkPluginUrlInterceptorConfigureWidget : public QWidget -{ - Q_OBJECT -public: - explicit NetworkPluginUrlInterceptorConfigureWidget(QWidget *parent = Q_NULLPTR); - ~NetworkPluginUrlInterceptorConfigureWidget(); - - virtual void loadSettings() = 0; - virtual void saveSettings() = 0; - virtual void resetSettings() = 0; -}; -} -#endif // NETWORKPLUGINURLINTERCEPTORCONFIGUREWIDGET_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptor.cpp kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptor.cpp --- kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptor.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptor.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "networkpluginurlinterceptor.h" - -using namespace MessageViewer; - -NetworkPluginUrlInterceptor::NetworkPluginUrlInterceptor(QObject *parent) - : QObject(parent) -{ - -} - -NetworkPluginUrlInterceptor::~NetworkPluginUrlInterceptor() -{ - -} - -void NetworkPluginUrlInterceptor::createActions(KActionCollection *ac) -{ - Q_UNUSED(ac); -} - -bool NetworkPluginUrlInterceptor::hasConfigureSupport() const -{ - return false; -} - -MessageViewer::NetworkPluginUrlInterceptorConfigureWidget *NetworkPluginUrlInterceptor::createConfigureWidget(QWidget *parent) -{ - Q_UNUSED(parent); - return Q_NULLPTR; -} - -QList MessageViewer::NetworkPluginUrlInterceptor::actions() const -{ - return {}; -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptor.h kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptor.h --- kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptor.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptor.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef MAILNETWORKPLUGINURLINTERCEPTOR_H -#define MAILNETWORKPLUGINURLINTERCEPTOR_H - -#include -#include "messageviewer_export.h" -class QAction; -class KActionCollection; -namespace MessageViewer -{ -class NetworkPluginUrlInterceptorConfigureWidget; -class NetworkPluginUrlInterceptorInterface; -class MESSAGEVIEWER_EXPORT NetworkPluginUrlInterceptor : public QObject -{ - Q_OBJECT -public: - explicit NetworkPluginUrlInterceptor(QObject *parent = Q_NULLPTR); - ~NetworkPluginUrlInterceptor(); - virtual NetworkPluginUrlInterceptorInterface *createInterface(QObject *parent = Q_NULLPTR) = 0; - - virtual void createActions(KActionCollection *ac); - virtual QList actions() const; - virtual bool hasConfigureSupport() const; - virtual MessageViewer::NetworkPluginUrlInterceptorConfigureWidget *createConfigureWidget(QWidget *parent = Q_NULLPTR); -}; -} -#endif // MAILNETWORKPLUGINURLINTERCEPTOR_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptorinterface.cpp kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptorinterface.cpp --- kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptorinterface.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptorinterface.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "networkpluginurlinterceptorinterface.h" - -using namespace MessageViewer; - -NetworkPluginUrlInterceptorInterface::NetworkPluginUrlInterceptorInterface(QObject *parent) - : QObject(parent) -{ - -} - -NetworkPluginUrlInterceptorInterface::~NetworkPluginUrlInterceptorInterface() -{ - -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptorinterface.h kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptorinterface.h --- kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptorinterface.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkpluginurlinterceptorinterface.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef MAILNETWORKPLUGINURLINTERCEPTORINTERFACE_H -#define MAILNETWORKPLUGINURLINTERCEPTORINTERFACE_H - -#include -#include "messageviewer_export.h" -class QWebEngineUrlRequestInfo; -namespace MessageViewer -{ -class MESSAGEVIEWER_EXPORT NetworkPluginUrlInterceptorInterface : public QObject -{ - Q_OBJECT -public: - explicit NetworkPluginUrlInterceptorInterface(QObject *parent = Q_NULLPTR); - ~NetworkPluginUrlInterceptorInterface(); - - virtual void interceptRequest(QWebEngineUrlRequestInfo &info) = 0; -}; -} -#endif // MAILNETWORKPLUGINURLINTERCEPTORINTERFACE_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptor.cpp kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptor.cpp --- kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptor.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptor.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,75 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "networkpluginurlinterceptorinterface.h" -#include "networkurlinterceptor.h" -#include "messageviewer_debug.h" - -#include - -using namespace MessageViewer; - -class MessageViewer::NetworkUrlInterceptorPrivate -{ -public: - NetworkUrlInterceptorPrivate() - { - - } - void addInterceptor(NetworkPluginUrlInterceptorInterface *interceptor); - void interceptRequest(QWebEngineUrlRequestInfo &info); - QVector listInterceptor; -}; - -void NetworkUrlInterceptorPrivate::addInterceptor(NetworkPluginUrlInterceptorInterface *interceptor) -{ - if (!listInterceptor.contains(interceptor)) { - listInterceptor.append(interceptor); - } else { - qCDebug(MESSAGEVIEWER_LOG) << "interceptor already added. This is a problem" << interceptor; - } -} - -void NetworkUrlInterceptorPrivate::interceptRequest(QWebEngineUrlRequestInfo &info) -{ - Q_FOREACH (NetworkPluginUrlInterceptorInterface *inter, listInterceptor) { - inter->interceptRequest(info); - } -} - -NetworkUrlInterceptor::NetworkUrlInterceptor(QObject *parent) - : QWebEngineUrlRequestInterceptor(parent), - d(new NetworkUrlInterceptorPrivate) -{ - -} - -NetworkUrlInterceptor::~NetworkUrlInterceptor() -{ - delete d; -} - -void NetworkUrlInterceptor::interceptRequest(QWebEngineUrlRequestInfo &info) -{ - d->interceptRequest(info); -} - -void NetworkUrlInterceptor::addInterceptor(NetworkPluginUrlInterceptorInterface *interceptor) -{ - d->addInterceptor(interceptor); -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptor.h kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptor.h --- kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptor.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptor.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef MAILNETWORKURLINTERCEPTOR_H -#define MAILNETWORKURLINTERCEPTOR_H - -#include -#include "messageviewer_export.h" - -namespace MessageViewer -{ -class NetworkUrlInterceptorPrivate; -class NetworkPluginUrlInterceptorInterface; -class MESSAGEVIEWER_EXPORT NetworkUrlInterceptor : public QWebEngineUrlRequestInterceptor -{ - Q_OBJECT -public: - explicit NetworkUrlInterceptor(QObject *parent = Q_NULLPTR); - ~NetworkUrlInterceptor(); - - void interceptRequest(QWebEngineUrlRequestInfo &info) Q_DECL_OVERRIDE; - - void addInterceptor(NetworkPluginUrlInterceptorInterface *interceptor); -private: - NetworkUrlInterceptorPrivate *const d; -}; -} -#endif // MAILNETWORKURLINTERCEPTOR_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptormanager.cpp kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptormanager.cpp --- kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptormanager.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptormanager.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "networkurlinterceptormanager.h" -#include "networkurlinterceptorpluginmanager.h" - -using namespace MessageViewer; - -class MessageViewer::NetworkUrlInterceptorManagerPrivate -{ -public: - NetworkUrlInterceptorManagerPrivate(KActionCollection *ac, NetworkUrlInterceptorManager *qq) - : q(qq) - { - createInterfaces(ac); - } - void createInterfaces(KActionCollection *ac); - QVector mListInterface; - NetworkUrlInterceptorManager *q; -}; - -void NetworkUrlInterceptorManagerPrivate::createInterfaces(KActionCollection *ac) -{ - Q_FOREACH (NetworkPluginUrlInterceptor *plugin, NetworkUrlInterceptorPluginManager::self()->pluginsList()) { - MessageViewer::NetworkPluginUrlInterceptorInterface *interface = plugin->createInterface(q); - plugin->createActions(ac); - mListInterface.append(interface); - } -} - -NetworkUrlInterceptorManager::NetworkUrlInterceptorManager(KActionCollection *ac, QObject *parent) - : QObject(parent), - d(new NetworkUrlInterceptorManagerPrivate(ac, this)) -{ - -} - -NetworkUrlInterceptorManager::~NetworkUrlInterceptorManager() -{ - delete d; -} - -QVector NetworkUrlInterceptorManager::interfaceList() const -{ - return d->mListInterface; -} - diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptormanager.h kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptormanager.h --- kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptormanager.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptormanager.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef MAILNETWORKURLINTERCEPTORMANAGER_H -#define MAILNETWORKURLINTERCEPTORMANAGER_H - -#include -#include -#include "messageviewer_export.h" - -namespace MessageViewer -{ -class NetworkUrlInterceptorManagerPrivate; -class MESSAGEVIEWER_EXPORT NetworkUrlInterceptorManager : public QObject -{ - Q_OBJECT -public: - explicit NetworkUrlInterceptorManager(KActionCollection *ac, QObject *parent = Q_NULLPTR); - ~NetworkUrlInterceptorManager(); - - QVector interfaceList() const; -private: - NetworkUrlInterceptorManagerPrivate *const d; -}; -} -#endif // MAILNETWORKURLINTERCEPTORMANAGER_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptorpluginmanager.cpp kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptorpluginmanager.cpp --- kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptorpluginmanager.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptorpluginmanager.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,160 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "networkpluginurlinterceptor.h" -#include "networkurlinterceptorpluginmanager.h" - -#include -#include -#include -#include -#include -#include - -using namespace MessageViewer; - -class MailNetworkUrlInterceptorPluginManagerInstancePrivate -{ -public: - MailNetworkUrlInterceptorPluginManagerInstancePrivate() - : mailNetworkUrlInterceptorPluginManager(new NetworkUrlInterceptorPluginManager) - { - } - - ~MailNetworkUrlInterceptorPluginManagerInstancePrivate() - { - delete mailNetworkUrlInterceptorPluginManager; - } - - NetworkUrlInterceptorPluginManager *mailNetworkUrlInterceptorPluginManager; -}; - -Q_GLOBAL_STATIC(MailNetworkUrlInterceptorPluginManagerInstancePrivate, sInstance) - -class MailNetworkUrlInterceptorPluginInfo -{ -public: - MailNetworkUrlInterceptorPluginInfo() - : plugin(Q_NULLPTR) - { - - } - QString saveName() const; - - KPluginMetaData metaData; - MessageViewer::NetworkPluginUrlInterceptor *plugin; -}; - -QString MailNetworkUrlInterceptorPluginInfo::saveName() const -{ - return QFileInfo(metaData.fileName()).baseName(); -} - -namespace -{ -QString pluginVersion() -{ - return QStringLiteral("1.0"); -} -} - -class MessageViewer::NetworkUrlInterceptorPluginManagerPrivate -{ -public: - NetworkUrlInterceptorPluginManagerPrivate(NetworkUrlInterceptorPluginManager *qq) - : q(qq) - { - - } - void initializePluginList(); - - void loadPlugin(MailNetworkUrlInterceptorPluginInfo *item); - QVector pluginsList() const; - - QVector mPluginList; - NetworkUrlInterceptorPluginManager *q; -}; - -void NetworkUrlInterceptorPluginManagerPrivate::initializePluginList() -{ - const QVector plugins = KPluginLoader::findPlugins(QStringLiteral("messageviewer"), [](const KPluginMetaData & md) { - return md.serviceTypes().contains(QStringLiteral("MessageViewer/UrlInterceptor")); - }); - - QVectorIterator i(plugins); - i.toBack(); - QSet unique; - while (i.hasPrevious()) { - MailNetworkUrlInterceptorPluginInfo info; - info.metaData = i.previous(); - - const QString version = info.metaData.version(); - if (pluginVersion() == version) { - - // only load plugins once, even if found multiple times! - if (unique.contains(info.saveName())) { - continue; - } - info.plugin = Q_NULLPTR; - mPluginList.append(info); - unique.insert(info.saveName()); - } - } - QVector::iterator end(mPluginList.end()); - for (QVector::iterator it = mPluginList.begin(); it != end; ++it) { - loadPlugin(&(*it)); - } -} - -QVector NetworkUrlInterceptorPluginManagerPrivate::pluginsList() const -{ - QVector lst; - QVector::ConstIterator end(mPluginList.constEnd()); - for (QVector::ConstIterator it = mPluginList.constBegin(); it != end; ++it) { - if ((*it).plugin) { - lst << (*it).plugin; - } - } - return lst; -} - -void NetworkUrlInterceptorPluginManagerPrivate::loadPlugin(MailNetworkUrlInterceptorPluginInfo *item) -{ - item->plugin = KPluginLoader(item->metaData.fileName()).factory()->create(q, QVariantList() << item->saveName()); -} - -NetworkUrlInterceptorPluginManager *NetworkUrlInterceptorPluginManager::self() -{ - return sInstance->mailNetworkUrlInterceptorPluginManager; -} - -NetworkUrlInterceptorPluginManager::NetworkUrlInterceptorPluginManager(QObject *parent) - : QObject(parent), - d(new NetworkUrlInterceptorPluginManagerPrivate(this)) -{ - d->initializePluginList(); -} - -NetworkUrlInterceptorPluginManager::~NetworkUrlInterceptorPluginManager() -{ - delete d; -} - -QVector NetworkUrlInterceptorPluginManager::pluginsList() const -{ - return d->pluginsList(); -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptorpluginmanager.h kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptorpluginmanager.h --- kf5-messagelib-16.04.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptorpluginmanager.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/urlinterceptor/networkurlinterceptorpluginmanager.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef MAILNETWORKURLINTERCEPTORPLUGINMANAGER_H -#define MAILNETWORKURLINTERCEPTORPLUGINMANAGER_H - -#include -#include -#include "messageviewer_export.h" -namespace MessageViewer -{ -class NetworkUrlInterceptorPluginManagerPrivate; -class NetworkPluginUrlInterceptor; -class MESSAGEVIEWER_EXPORT NetworkUrlInterceptorPluginManager : public QObject -{ - Q_OBJECT -public: - static NetworkUrlInterceptorPluginManager *self(); - explicit NetworkUrlInterceptorPluginManager(QObject *parent = Q_NULLPTR); - ~NetworkUrlInterceptorPluginManager(); - - QVector pluginsList() const; -private: - NetworkUrlInterceptorPluginManagerPrivate *const d; -}; -} - -#endif // MAILNETWORKURLINTERCEPTORPLUGINMANAGER_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/webenginepage.cpp kf5-messagelib-16.12.3/messageviewer/src/webengine/webenginepage.cpp --- kf5-messagelib-16.04.3/messageviewer/src/webengine/webenginepage.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/webenginepage.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "webenginepage.h" -#include "webhittest.h" -#include "webhittestresult.h" - -#include -#include -#include - -using namespace MessageViewer; - -class MessageViewer::WebEnginePagePrivate -{ -public: - WebEnginePagePrivate() - { - - } -}; - -WebEnginePage::WebEnginePage(QObject *parent) - : QWebEnginePage(parent), - d(new WebEnginePagePrivate) -{ - -} - -WebEnginePage::~WebEnginePage() -{ - delete d; -} - -MessageViewer::WebHitTest *WebEnginePage::hitTestContent(const QPoint &pos) -{ - return new WebHitTest(this, pos); -} - -QVariant WebEnginePage::execJavaScript(const QString &scriptSource, int timeout) -{ - QPointer loop = new QEventLoop; - QVariant result; - QTimer::singleShot(timeout, loop.data(), &QEventLoop::quit); - - runJavaScript(scriptSource, [loop, &result](const QVariant & res) { - if (loop && loop->isRunning()) { - result = res; - loop->quit(); - } - }); - loop->exec(); - delete loop; - - return result; -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/webenginepage.h kf5-messagelib-16.12.3/messageviewer/src/webengine/webenginepage.h --- kf5-messagelib-16.04.3/messageviewer/src/webengine/webenginepage.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/webenginepage.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef WEBENGINEPAGE_H -#define WEBENGINEPAGE_H - -#include -#include "messageviewer_export.h" -#include -namespace MessageViewer -{ -class WebHitTest; -class WebEnginePagePrivate; -class MESSAGEVIEWER_EXPORT WebEnginePage : public QWebEnginePage -{ - Q_OBJECT -public: - explicit WebEnginePage(QObject *parent = Q_NULLPTR); - ~WebEnginePage(); - MessageViewer::WebHitTest *hitTestContent(const QPoint &pos); - QVariant execJavaScript(const QString &scriptSource, int timeout = 500); - -private: - WebEnginePagePrivate *const d; -}; -} - -#endif // WEBENGINEPAGE_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/webenginescript.cpp kf5-messagelib-16.12.3/messageviewer/src/webengine/webenginescript.cpp --- kf5-messagelib-16.04.3/messageviewer/src/webengine/webenginescript.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/webenginescript.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,95 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ -#include "webenginescript.h" - -using namespace MessageViewer; - -QString WebEngineScript::findAllImages() -{ - const QString source = QLatin1String("(function() {" - "var out = [];" - "var imgs = document.getElementsByTagName('img');" - "for (var i = 0; i < imgs.length; ++i) {" - " var e = imgs[i];" - " out.push({" - " src: e.src" - " });" - "}" - "return out;" - "})()"); - - return source; -} - -QString WebEngineScript::findAllScripts() -{ - const QString source = QLatin1String("(function() {" - "var out = [];" - "var scripts = document.getElementsByTagName('script');" - "for (var i = 0; i < scripts.length; ++i) {" - " var e = scripts[i];" - " out.push({" - " src: e.src" - " });" - "}" - "return out;" - "})()"); - - return source; -} - -QString WebEngineScript::findAllAnchors() -{ - const QString source = QLatin1String("(function() {" - "var out = [];" - "var anchors = document.getElementsByTagName('a');" - "for (var i = 0; i < anchors.length; ++i) {" - " var r = anchors[i].getBoundingClientRect();" - " out.push({" - " src: anchors[i].href," - " title: anchors[i].title," - " boudingRect: [r.top, r.left, r.width, r.height]" - " });" - "}" - "return out;" - "})()"); - - return source; -} - -QString WebEngineScript::findAllAnchorsAndForms() -{ - const QString source = QLatin1String("(function() {" - "var res = [];" - "var out = [];" - "var anchors = document.getElementsByTagName('a');" - "for (var i = 0; i < anchors.length; ++i) {" - " out.push({" - " src: anchors[i].href," - " title: anchors[i].title" - " });" - "}" - "var forms = document.getElementsByTagName('form');" - "res.push({" - " anchors: out," - " forms: forms.length" - " });" - "return res;" - "})()"); - - return source; -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/webenginescript.h kf5-messagelib-16.12.3/messageviewer/src/webengine/webenginescript.h --- kf5-messagelib-16.04.3/messageviewer/src/webengine/webenginescript.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/webenginescript.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ -#ifndef WEBENGINESCRIPT_H -#define WEBENGINESCRIPT_H - -#include -#include "messageviewer_export.h" - -namespace MessageViewer -{ -namespace WebEngineScript -{ -MESSAGEVIEWER_EXPORT QString findAllImages(); -MESSAGEVIEWER_EXPORT QString findAllScripts(); -MESSAGEVIEWER_EXPORT QString findAllAnchors(); -MESSAGEVIEWER_EXPORT QString findAllAnchorsAndForms(); -} -} -#endif // WEBENGINESCRIPT_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/webengineview.cpp kf5-messagelib-16.12.3/messageviewer/src/webengine/webengineview.cpp --- kf5-messagelib-16.04.3/messageviewer/src/webengine/webengineview.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/webengineview.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,137 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "webengineview.h" -#include -#include -#include -#include - -using namespace MessageViewer; - -class MessageViewer::WebEngineViewPrivate -{ -public: - WebEngineViewPrivate() - : mCurrentWidget(Q_NULLPTR) - { - - } - QWidget *mCurrentWidget; -}; - -WebEngineView::WebEngineView(QWidget *parent) - : QWebEngineView(parent), - d(new MessageViewer::WebEngineViewPrivate) -{ - installEventFilter(this); -} - -WebEngineView::~WebEngineView() -{ - delete d; -} - -void WebEngineView::forwardWheelEvent(QWheelEvent *event) -{ - //qDebug()<<" void WebEngineView::forwardWheelEvent(QWheelEvent *event)"; -} - -void WebEngineView::forwardKeyPressEvent(QKeyEvent *event) -{ - //qDebug()<<" void WebEngineView::forwardKeyPressEvent(QKeyEvent *event)"; -} - -void WebEngineView::forwardKeyReleaseEvent(QKeyEvent *event) -{ - //qDebug()<<" void WebEngineView::forwardKeyReleaseEvent(QKeyEvent *event)"; -} - -void WebEngineView::forwardMousePressEvent(QMouseEvent *event) -{ - //qDebug()<<" void WebEngineView::forwardMousePressEvent(QKeyEvent *event)"; -} - -void WebEngineView::forwardMouseMoveEvent(QMouseEvent *event) -{ - //qDebug()<<" void WebEngineView::forwardMouseMoveEvent(QKeyEvent *event)"; -} - -void WebEngineView::forwardMouseReleaseEvent(QMouseEvent *event) -{ - //qDebug()<<" void WebEngineView::forwardMouseReleaseEvent(QKeyEvent *event)"; -} - -bool WebEngineView::eventFilter(QObject *obj, QEvent *event) -{ - // Hack to find widget that receives input events - if (obj == this && event->type() == QEvent::ChildAdded) { - QWidget *child = qobject_cast(static_cast(event)->child()); - if (child && child->inherits("QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget")) { - d->mCurrentWidget = child; - d->mCurrentWidget->installEventFilter(this); - } - } - - // Forward events to WebEngineView - if (obj == d->mCurrentWidget) { -#define HANDLE_EVENT(f, t) \ - { \ - bool wasAccepted = event->isAccepted(); \ - event->setAccepted(false); \ - f(static_cast(event)); \ - bool ret = event->isAccepted(); \ - event->setAccepted(wasAccepted); \ - return ret; \ - } - - switch (event->type()) { - case QEvent::KeyPress: - HANDLE_EVENT(forwardKeyPressEvent, QKeyEvent); - case QEvent::KeyRelease: - HANDLE_EVENT(forwardKeyReleaseEvent, QKeyEvent); - case QEvent::MouseButtonPress: - HANDLE_EVENT(forwardMousePressEvent, QMouseEvent); - case QEvent::MouseButtonRelease: - HANDLE_EVENT(forwardMouseReleaseEvent, QMouseEvent); - case QEvent::MouseMove: - HANDLE_EVENT(forwardMouseMoveEvent, QMouseEvent); - case QEvent::Wheel: - HANDLE_EVENT(forwardWheelEvent, QWheelEvent); - default: - break; - } - -#undef HANDLE_EVENT - } - // Block already handled events - if (obj == this) { - switch (event->type()) { - case QEvent::KeyPress: - case QEvent::KeyRelease: - case QEvent::MouseButtonPress: - case QEvent::MouseButtonRelease: - case QEvent::MouseMove: - case QEvent::Wheel: - return true; - - default: - break; - } - } - return QWebEngineView::eventFilter(obj, event); -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/webengineview.h kf5-messagelib-16.12.3/messageviewer/src/webengine/webengineview.h --- kf5-messagelib-16.04.3/messageviewer/src/webengine/webengineview.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/webengineview.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef WEBENGINEVIEW_H -#define WEBENGINEVIEW_H - -#include -#include "messageviewer_export.h" - -namespace MessageViewer -{ -class WebEngineViewPrivate; -class MESSAGEVIEWER_EXPORT WebEngineView : public QWebEngineView -{ - Q_OBJECT -public: - explicit WebEngineView(QWidget *parent = Q_NULLPTR); - ~WebEngineView(); - -protected: - bool eventFilter(QObject *obj, QEvent *event) Q_DECL_OVERRIDE; - - virtual void forwardWheelEvent(QWheelEvent *event); - virtual void forwardKeyPressEvent(QKeyEvent *event); - virtual void forwardKeyReleaseEvent(QKeyEvent *event); - virtual void forwardMousePressEvent(QMouseEvent *event); - virtual void forwardMouseMoveEvent(QMouseEvent *event); - virtual void forwardMouseReleaseEvent(QMouseEvent *event); -private: - WebEngineViewPrivate *const d; -}; -} -#endif // WEBENGINEVIEW_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/webhittest.cpp kf5-messagelib-16.12.3/messageviewer/src/webengine/webhittest.cpp --- kf5-messagelib-16.04.3/messageviewer/src/webengine/webhittest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/webhittest.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,127 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "webhittest.h" -#include "webhittestresult.h" -#include - -using namespace MessageViewer; -template - -struct InvokeWrapper { - R *receiver; - void (C::*memberFunction)(Arg); - void operator()(Arg result) - { - (receiver->*memberFunction)(result); - } -}; - -template - -InvokeWrapper invoke(R *receiver, void (C::*memberFunction)(Arg)) -{ - InvokeWrapper wrapper = {receiver, memberFunction}; - return wrapper; -} - -class MessageViewer::WebHitTestPrivate -{ -public: - WebHitTestPrivate(const QPoint &pos) - : m_pos(pos) - { - - } - QPoint m_pos; - QUrl m_pageUrl; -}; - -WebHitTest::WebHitTest(QWebEnginePage *page, const QPoint &pos, QObject *parent) - : QObject(parent), - d(new WebHitTestPrivate(pos)) -{ - QString source = QStringLiteral("(function() {" - "var e = document.elementFromPoint(%1, %2);" - "if (!e)" - " return;" - "function isMediaElement(e) {" - " return e.tagName == 'AUDIO' || e.tagName == 'VIDEO';" - "}" - "function isEditableElement(e) {" - " if (e.isContentEditable)" - " return true;" - " if (e.tagName == 'INPUT' || e.tagName == 'TEXTAREA')" - " return e.getAttribute('readonly') != 'readonly';" - " return false;" - "}" - "function isSelected(e) {" - " var selection = window.getSelection();" - " if (selection.type != 'Range')" - " return false;" - " return window.getSelection().containsNode(e, true);" - "}" - "var res = {" - " alternateText: e.getAttribute('alt')," - " boundingRect: ''," - " imageUrl: ''," - " contentEditable: isEditableElement(e)," - " contentSelected: isSelected(e)," - " linkTitle: ''," - " linkUrl: ''," - " mediaUrl: ''," - " tagName: e.tagName.toLowerCase()" - "};" - "var r = e.getBoundingClientRect();" - "res.boundingRect = [r.top, r.left, r.width, r.height];" - "if (e.tagName == 'IMG')" - " res.imageUrl = e.getAttribute('src');" - "if (e.tagName == 'A') {" - " res.linkTitle = e.text;" - " res.linkUrl = e.getAttribute('href');" - "}" - "while (e) {" - " if (res.linkTitle == '' && e.tagName == 'A')" - " res.linkTitle = e.text;" - " if (res.linkUrl == '' && e.tagName == 'A')" - " res.linkUrl = e.getAttribute('href');" - " if (res.mediaUrl == '' && isMediaElement(e)) {" - " res.mediaUrl = e.currentSrc;" - " res.mediaPaused = e.paused;" - " res.mediaMuted = e.muted;" - " }" - " e = e.parentElement;" - "}" - "return res;" - "})()"); - - const QString &js = source.arg(pos.x()).arg(pos.y()); - d->m_pageUrl = page->url(); - page->runJavaScript(js, invoke(this, &WebHitTest::handleHitTest)); -} - -WebHitTest::~WebHitTest() -{ - delete d; -} - -void WebHitTest::handleHitTest(const QVariant &result) -{ - const WebHitTestResult webHitResult(d->m_pos, d->m_pageUrl, result); - Q_EMIT finished(webHitResult); - deleteLater(); -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/webhittest.h kf5-messagelib-16.12.3/messageviewer/src/webengine/webhittest.h --- kf5-messagelib-16.04.3/messageviewer/src/webengine/webhittest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/webhittest.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef WEBHITTEST_H -#define WEBHITTEST_H - -#include -#include "messageviewer_export.h" -#include -#include -class QWebEnginePage; -namespace MessageViewer -{ -class WebHitTestResult; -class WebHitTestPrivate; -class MESSAGEVIEWER_EXPORT WebHitTest : public QObject -{ - Q_OBJECT -public: - explicit WebHitTest(QWebEnginePage *page, const QPoint &pos, QObject *parent = Q_NULLPTR); - ~WebHitTest(); - -Q_SIGNALS: - void finished(const MessageViewer::WebHitTestResult &result); - -private Q_SLOTS: - void handleHitTest(const QVariant &result); -private: - WebHitTestPrivate *const d; -}; -} - -#endif // WEBHITTEST_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/webengine/webhittestresult.cpp kf5-messagelib-16.12.3/messageviewer/src/webengine/webhittestresult.cpp --- kf5-messagelib-16.04.3/messageviewer/src/webengine/webhittestresult.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/webengine/webhittestresult.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,149 +0,0 @@ -/* - Copyright (c) 2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -/* ============================================================ -* QupZilla - QtWebEngine based browser -* Copyright (C) 2015 David Rosca -* -* 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 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* ============================================================ */ -#include "webhittestresult.h" -#include - -using namespace MessageViewer; - -WebHitTestResult::WebHitTestResult(const QPoint &pos, const QUrl &url, const QVariant &result) - : m_isNull(true), - m_isContentEditable(false), - m_isContentSelected(false), - m_mediaPaused(false), - m_mediaMuted(false), - m_pos(pos), - m_pageUrl(url) -{ - init(result.toMap()); -} - -QString WebHitTestResult::alternateText() const -{ - return m_alternateText; -} - -QRect WebHitTestResult::boundingRect() const -{ - return m_boundingRect; -} - -QUrl WebHitTestResult::imageUrl() const -{ - return m_imageUrl; -} - -bool WebHitTestResult::isContentEditable() const -{ - return m_isContentEditable; -} - -bool WebHitTestResult::isContentSelected() const -{ - return m_isContentSelected; -} - -bool WebHitTestResult::isNull() const -{ - return m_isNull; -} - -QString WebHitTestResult::linkTitle() const -{ - return m_linkTitle; -} - -QUrl WebHitTestResult::linkUrl() const -{ - return m_linkUrl; -} - -QUrl WebHitTestResult::mediaUrl() const -{ - return m_mediaUrl; -} - -bool WebHitTestResult::mediaPaused() const -{ - return m_mediaPaused; -} - -bool WebHitTestResult::mediaMuted() const -{ - return m_mediaMuted; -} - -QPoint WebHitTestResult::pos() const -{ - return m_pos; -} - -QString WebHitTestResult::tagName() const -{ - return m_tagName; -} - -void WebHitTestResult::init(const QVariantMap &map) -{ - if (map.isEmpty()) { - return; - } - //qDebug()<<" void WebHitTestResult::init(const QVariantMap &map)"< - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -/* ============================================================ -* QupZilla - QtWebEngine based browser -* Copyright (C) 2015 David Rosca -* -* 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 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* ============================================================ */ -#ifndef WebHitTestResult_H -#define WebHitTestResult_H - -#include "messageviewer_export.h" -#include -#include -#include -#include - -namespace MessageViewer -{ -class MESSAGEVIEWER_EXPORT WebHitTestResult -{ -public: - WebHitTestResult(const QPoint &pos, const QUrl &url, const QVariant &result); - - QString alternateText() const; - QRect boundingRect() const; - QUrl imageUrl() const; - bool isContentEditable() const; - bool isContentSelected() const; - bool isNull() const; - QString linkTitle() const; - QUrl linkUrl() const; - QUrl mediaUrl() const; - bool mediaPaused() const; - bool mediaMuted() const; - QPoint pos() const; - QString tagName() const; - -private: - void init(const QVariantMap &map); - - bool m_isNull; - QString m_alternateText; - QRect m_boundingRect; - QUrl m_imageUrl; - bool m_isContentEditable; - bool m_isContentSelected; - QString m_linkTitle; - QUrl m_linkUrl; - QUrl m_mediaUrl; - bool m_mediaPaused; - bool m_mediaMuted; - QPoint m_pos; - QString m_tagName; - QUrl m_pageUrl; - -}; -} -#endif // WEBHITTESTRESULT_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/attachmentdialog.h kf5-messagelib-16.12.3/messageviewer/src/widgets/attachmentdialog.h --- kf5-messagelib-16.04.3/messageviewer/src/widgets/attachmentdialog.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/attachmentdialog.h 2017-03-06 12:30:37.000000000 +0000 @@ -52,12 +52,10 @@ // executes the modal dialog int exec(); -private Q_SLOTS: +private: void saveClicked(); void openClicked(); void openWithClicked(); - -private: QString text, dontAskName; QDialog *dialog; QDialogButtonBox *mButtonBox; diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/configurewidget.cpp kf5-messagelib-16.12.3/messageviewer/src/widgets/configurewidget.cpp --- kf5-messagelib-16.04.3/messageviewer/src/widgets/configurewidget.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/configurewidget.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -20,9 +20,9 @@ #include "configurewidget.h" #include "messageviewer_debug.h" #include "ui_settings.h" -#include "messageviewer/messageviewerutil.h" +#include "utils/messageviewerutil.h" #include "settings/messageviewersettings.h" -#include "messageviewer/nodehelper.h" +#include #include "MessageCore/MessageCoreSettings" @@ -56,15 +56,13 @@ d->mSettingsUi->setupUi(this); layout()->setContentsMargins(0, 0, 0, 0); - QStringList encodings = NodeHelper::supportedEncodings(false); + QStringList encodings = MimeTreeParser::NodeHelper::supportedEncodings(false); encodings.prepend(i18n("Auto")); d->mSettingsUi->overrideCharacterEncoding->addItems(encodings); d->mSettingsUi->overrideCharacterEncoding->setCurrentIndex(0); d->mSettingsUi->overrideCharacterEncoding->setWhatsThis( MessageCore::MessageCoreSettings::self()->overrideCharacterEncodingItem()->whatsThis()); - d->mSettingsUi->kcfg_ShowEmoticons->setWhatsThis( - MessageViewer::MessageViewerSettings::self()->showEmoticonsItem()->whatsThis()); d->mSettingsUi->kcfg_ShrinkQuotes->setWhatsThis( MessageViewer::MessageViewerSettings::self()->shrinkQuotesItem()->whatsThis()); d->mSettingsUi->kcfg_ShowExpandQuotesMark->setWhatsThis( @@ -90,7 +88,7 @@ MessageCore::MessageCoreSettings::self()->setOverrideCharacterEncoding( d->mSettingsUi->overrideCharacterEncoding->currentIndex() == 0 ? QString() : - NodeHelper::encodingForName(d->mSettingsUi->overrideCharacterEncoding->currentText())); + MimeTreeParser::NodeHelper::encodingForName(d->mSettingsUi->overrideCharacterEncoding->currentText())); } void ConfigureWidget::readCurrentOverrideCodec() @@ -100,13 +98,13 @@ d->mSettingsUi->overrideCharacterEncoding->setCurrentIndex(0); return; } - QStringList encodings = NodeHelper::supportedEncodings(false); + QStringList encodings = MimeTreeParser::NodeHelper::supportedEncodings(false); encodings.prepend(i18n("Auto")); QStringList::ConstIterator it(encodings.constBegin()); const QStringList::ConstIterator end(encodings.constEnd()); int i = 0; for (; it != end; ++it) { - if (NodeHelper::encodingForName(*it) == currentOverrideEncoding) { + if (MimeTreeParser::NodeHelper::encodingForName(*it) == currentOverrideEncoding) { d->mSettingsUi->overrideCharacterEncoding->setCurrentIndex(i); break; } diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/htmlstatusbar.cpp kf5-messagelib-16.12.3/messageviewer/src/widgets/htmlstatusbar.cpp --- kf5-messagelib-16.04.3/messageviewer/src/widgets/htmlstatusbar.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/htmlstatusbar.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -45,7 +45,7 @@ HtmlStatusBar::HtmlStatusBar(QWidget *parent) : QLabel(parent), - mMode(Util::Normal) + mMode(MimeTreeParser::Util::Normal) { setAlignment(Qt::AlignHCenter | Qt::AlignTop); setAutoFillBackground(true); @@ -54,29 +54,29 @@ HtmlStatusBar::~HtmlStatusBar() {} -Util::HtmlMode HtmlStatusBar::mode() const +MimeTreeParser::Util::HtmlMode HtmlStatusBar::mode() const { return mMode; } bool HtmlStatusBar::isHtml() const { - return mode() == Util::Html; + return mode() == MimeTreeParser::Util::Html; } bool HtmlStatusBar::isNormal() const { - return mode() == Util::Normal; + return mode() == MimeTreeParser::Util::Normal; } bool HtmlStatusBar::isMultipartHtml() const { - return mode() == Util::MultipartHtml; + return mode() == MimeTreeParser::Util::MultipartHtml; } bool HtmlStatusBar::isMultipartPlain() const { - return mode() == Util::MultipartPlain; + return mode() == MimeTreeParser::Util::MultipartPlain; } void HtmlStatusBar::update() @@ -91,25 +91,35 @@ void HtmlStatusBar::setNormalMode() { - setMode(Util::Normal); + setMode(MimeTreeParser::Util::Normal); } void HtmlStatusBar::setHtmlMode() { - setMode(Util::Html); + setMode(MimeTreeParser::Util::Html); } void HtmlStatusBar::setMultipartPlainMode() { - setMode(Util::MultipartPlain); + setMode(MimeTreeParser::Util::MultipartPlain); } void HtmlStatusBar::setMultipartHtmlMode() { - setMode(Util::MultipartHtml); + setMode(MimeTreeParser::Util::MultipartHtml); } -void HtmlStatusBar::setMode(Util::HtmlMode m, UpdateMode mode) +void HtmlStatusBar::setAvailableModes(const QList &availableModes) +{ + mAvailableModes = availableModes; +} + +const QList< MimeTreeParser::Util::HtmlMode > &HtmlStatusBar::availableModes() +{ + return mAvailableModes; +} + +void HtmlStatusBar::setMode(MimeTreeParser::Util::HtmlMode m, UpdateMode mode) { if (mMode != m) { mMode = m; @@ -129,20 +139,24 @@ QString HtmlStatusBar::message() const { switch (mode()) { - case Util::Html: // bold: "HTML Message" - case Util::MultipartHtml: + case MimeTreeParser::Util::Html: // bold: "HTML Message" + case MimeTreeParser::Util::MultipartHtml: return i18nc("'HTML Message' with html linebreaks between each letter and in bold text.", "
H
T
M
L
" "
M
e
s
s
a
g
e
"); - case Util::Normal: // normal: "No HTML Message" + case MimeTreeParser::Util::Normal: // normal: "No HTML Message" return i18nc("'No HTML Message' with html linebreaks between each letter.", "
N
o
" "
H
T
M
L
" "
M
e
s
s
a
g
e
"); - case Util::MultipartPlain: // normal: "Plain Message" + case MimeTreeParser::Util::MultipartPlain: // normal: "Plain Message" return i18nc("'Plain Message' with html linebreaks between each letter.", "
P
l
a
i
n
" "
M
e
s
s
a
g
e
"); + case MimeTreeParser::Util::MultipartIcal: // normal: "Calendar Message" + return i18nc("'Calendar Message' with html linebreaks between each letter.", + "
C
a
l
e
n
d
a
r
" + "
M
e
s
s
a
g
e
"); default: return QString(); } @@ -151,12 +165,13 @@ QString HtmlStatusBar::toolTip() const { switch (mode()) { - case Util::Html: - case Util::MultipartHtml: - case Util::MultipartPlain: - return i18n("Click to toggle between HTML and plain text."); + case MimeTreeParser::Util::Html: + case MimeTreeParser::Util::MultipartHtml: + case MimeTreeParser::Util::MultipartPlain: + case MimeTreeParser::Util::MultipartIcal: + return i18n("Click to toggle between HTML, plain text and calendar."); default: - case Util::Normal: + case MimeTreeParser::Util::Normal: break; } @@ -168,16 +183,17 @@ KConfigGroup conf(MessageViewer::MessageViewerSettings::self()->config(), "Reader"); QColor defaultColor, color; switch (mode()) { - case Util::Html: - case Util::MultipartHtml: + case MimeTreeParser::Util::Html: + case MimeTreeParser::Util::MultipartHtml: defaultColor = Qt::white; color = defaultColor; if (!MessageCore::MessageCoreSettings::self()->useDefaultColors()) { color = conf.readEntry("ColorbarForegroundHTML", defaultColor); } return color; - case Util::Normal: - case Util::MultipartPlain: + case MimeTreeParser::Util::Normal: + case MimeTreeParser::Util::MultipartPlain: + case MimeTreeParser::Util::MultipartIcal: defaultColor = Qt::black; color = defaultColor; if (!MessageCore::MessageCoreSettings::self()->useDefaultColors()) { @@ -195,16 +211,17 @@ QColor defaultColor, color; switch (mode()) { - case Util::Html: - case Util::MultipartHtml: + case MimeTreeParser::Util::Html: + case MimeTreeParser::Util::MultipartHtml: defaultColor = Qt::black; color = defaultColor; if (!MessageCore::MessageCoreSettings::self()->useDefaultColors()) { color = conf.readEntry("ColorbarBackgroundHTML", defaultColor); } return color; - case Util::Normal: - case Util::MultipartPlain: + case MimeTreeParser::Util::Normal: + case MimeTreeParser::Util::MultipartPlain: + case MimeTreeParser::Util::MultipartIcal: defaultColor = Qt::lightGray; color = defaultColor; if (!MessageCore::MessageCoreSettings::self()->useDefaultColors()) { diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/htmlstatusbar.h kf5-messagelib-16.12.3/messageviewer/src/widgets/htmlstatusbar.h --- kf5-messagelib-16.04.3/messageviewer/src/widgets/htmlstatusbar.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/htmlstatusbar.h 2017-03-06 12:30:37.000000000 +0000 @@ -32,7 +32,9 @@ #ifndef _MESSAGEVIEWER_HTMLSTATUSBAR_H_ #define _MESSAGEVIEWER_HTMLSTATUSBAR_H_ +#include #include "messageviewer/messageviewerutil.h" + #include class QMouseEvent; @@ -73,7 +75,7 @@ ~HtmlStatusBar(); /** @return current mode. */ - Util::HtmlMode mode() const; + MimeTreeParser::Util::HtmlMode mode() const; bool isHtml() const; bool isNormal() const; bool isMultipartHtml() const; @@ -82,6 +84,9 @@ // Update the status bar, for example when the color scheme changed. void update(); + void setAvailableModes(const QList &availableModes); + const QList &availableModes(); + public Q_SLOTS: void setHtmlMode(); /** Switch to "normal mode". */ @@ -91,7 +96,7 @@ /** Switch to "multipart plain mode". */ void setMultipartPlainMode(); /** Switch to mode @p m */ - void setMode(Util::HtmlMode m, UpdateMode mode = Update); + void setMode(MimeTreeParser::Util::HtmlMode m, UpdateMode mode = Update); Q_SIGNALS: /** The user has clicked the status bar. */ @@ -106,7 +111,8 @@ QColor bgColor() const; QColor fgColor() const; - Util::HtmlMode mMode; + MimeTreeParser::Util::HtmlMode mMode; + QList mAvailableModes; }; } diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/invitationsettings.cpp kf5-messagelib-16.12.3/messageviewer/src/widgets/invitationsettings.cpp --- kf5-messagelib-16.04.3/messageviewer/src/widgets/invitationsettings.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/invitationsettings.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -60,39 +60,29 @@ d->mInvitationUi->mDeleteInvitations->setText( i18n(MessageViewer::MessageViewerSettings::self()-> - deleteInvitationEmailsAfterSendingReplyItem()->label().toUtf8())); + deleteInvitationEmailsAfterSendingReplyItem()->label().toUtf8().constData())); d->mInvitationUi->mDeleteInvitations->setWhatsThis( i18n(MessageViewer::MessageViewerSettings::self()-> - deleteInvitationEmailsAfterSendingReplyItem()->whatsThis().toUtf8())); + deleteInvitationEmailsAfterSendingReplyItem()->whatsThis().toUtf8().constData())); connect(d->mInvitationUi->mDeleteInvitations, &QCheckBox::toggled, this, &InvitationSettings::changed); d->mInvitationUi->mLegacyMangleFromTo->setWhatsThis( - i18n(MessageViewer::MessageViewerSettings::self()->legacyMangleFromToHeadersItem()->whatsThis().toUtf8())); + i18n(MessageViewer::MessageViewerSettings::self()->legacyMangleFromToHeadersItem()->whatsThis().toUtf8().constData())); connect(d->mInvitationUi->mLegacyMangleFromTo, &QCheckBox::stateChanged, this, &InvitationSettings::changed); d->mInvitationUi->mLegacyBodyInvites->setWhatsThis( - i18n(MessageViewer::MessageViewerSettings::self()->legacyBodyInvitesItem()->whatsThis().toUtf8())); + i18n(MessageViewer::MessageViewerSettings::self()->legacyBodyInvitesItem()->whatsThis().toUtf8().constData())); connect(d->mInvitationUi->mLegacyBodyInvites, &QCheckBox::toggled, this, &InvitationSettings::slotLegacyBodyInvitesToggled); connect(d->mInvitationUi->mLegacyBodyInvites, &QCheckBox::stateChanged, this, &InvitationSettings::changed); d->mInvitationUi->mExchangeCompatibleInvitations->setWhatsThis( - i18n(MessageViewer::MessageViewerSettings::self()->exchangeCompatibleInvitationsItem()->whatsThis().toUtf8())); + i18n(MessageViewer::MessageViewerSettings::self()->exchangeCompatibleInvitationsItem()->whatsThis().toUtf8().constData())); connect(d->mInvitationUi->mExchangeCompatibleInvitations, &QCheckBox::stateChanged, this, &InvitationSettings::changed); - d->mInvitationUi->mOutlookCompatibleInvitationComments->setWhatsThis( - i18n(MessageViewer::MessageViewerSettings::self()-> - outlookCompatibleInvitationReplyCommentsItem()->whatsThis().toUtf8())); - connect(d->mInvitationUi->mOutlookCompatibleInvitationComments, &QCheckBox::stateChanged, this, &InvitationSettings::changed); - - d->mInvitationUi->mOutlookCompatibleInvitationComparisons->setWhatsThis( - i18n(MessageViewer::MessageViewerSettings::self()-> - outlookCompatibleInvitationComparisonsItem()->whatsThis().toUtf8())); - connect(d->mInvitationUi->mOutlookCompatibleInvitationComparisons, &QCheckBox::stateChanged, this, &InvitationSettings::changed); - //Laurent BUG:257723: in kmail2 it's not possible to not send automatically. d->mInvitationUi->mAutomaticSending->hide(); d->mInvitationUi->mAutomaticSending->setWhatsThis( - i18n(MessageViewer::MessageViewerSettings::self()->automaticSendingItem()->whatsThis().toUtf8())); + i18n(MessageViewer::MessageViewerSettings::self()->automaticSendingItem()->whatsThis().toUtf8().constData())); connect(d->mInvitationUi->mAutomaticSending, &QCheckBox::stateChanged, this, &InvitationSettings::changed); } @@ -129,8 +119,6 @@ loadWidget(d->mInvitationUi->mLegacyBodyInvites, MessageViewer::MessageViewerSettings::self()->legacyBodyInvitesItem()); d->mInvitationUi->mLegacyBodyInvites->blockSignals(false); loadWidget(d->mInvitationUi->mExchangeCompatibleInvitations, MessageViewer::MessageViewerSettings::self()->exchangeCompatibleInvitationsItem()); - loadWidget(d->mInvitationUi->mOutlookCompatibleInvitationComments, MessageViewer::MessageViewerSettings::self()->outlookCompatibleInvitationReplyCommentsItem()); - loadWidget(d->mInvitationUi->mOutlookCompatibleInvitationComparisons, MessageViewer::MessageViewerSettings::self()->outlookCompatibleInvitationComparisonsItem()); loadWidget(d->mInvitationUi->mAutomaticSending, MessageViewer::MessageViewerSettings::self()->automaticSendingItem()); //TODO verify it d->mInvitationUi->mAutomaticSending->setEnabled(!d->mInvitationUi->mLegacyBodyInvites->isChecked()); @@ -142,8 +130,6 @@ saveCheckBox(d->mInvitationUi->mLegacyMangleFromTo, MessageViewer::MessageViewerSettings::self()->legacyMangleFromToHeadersItem()); saveCheckBox(d->mInvitationUi->mLegacyBodyInvites, MessageViewer::MessageViewerSettings::self()->legacyBodyInvitesItem()); saveCheckBox(d->mInvitationUi->mExchangeCompatibleInvitations, MessageViewer::MessageViewerSettings::self()->exchangeCompatibleInvitationsItem()); - saveCheckBox(d->mInvitationUi->mOutlookCompatibleInvitationComments, MessageViewer::MessageViewerSettings::self()->outlookCompatibleInvitationReplyCommentsItem()); - saveCheckBox(d->mInvitationUi->mOutlookCompatibleInvitationComparisons, MessageViewer::MessageViewerSettings::self()->outlookCompatibleInvitationComparisonsItem()); saveCheckBox(d->mInvitationUi->mAutomaticSending, MessageViewer::MessageViewerSettings::self()->automaticSendingItem()); saveCheckBox(d->mInvitationUi->mDeleteInvitations, MessageViewer::MessageViewerSettings::self()->deleteInvitationEmailsAfterSendingReplyItem()); } @@ -161,8 +147,6 @@ loadWidget(d->mInvitationUi->mLegacyBodyInvites, MessageViewer::MessageViewerSettings::self()->legacyBodyInvitesItem()); d->mInvitationUi->mLegacyBodyInvites->blockSignals(false); loadWidget(d->mInvitationUi->mExchangeCompatibleInvitations, MessageViewer::MessageViewerSettings::self()->exchangeCompatibleInvitationsItem()); - loadWidget(d->mInvitationUi->mOutlookCompatibleInvitationComments, MessageViewer::MessageViewerSettings::self()->outlookCompatibleInvitationReplyCommentsItem()); - loadWidget(d->mInvitationUi->mOutlookCompatibleInvitationComparisons, MessageViewer::MessageViewerSettings::self()->outlookCompatibleInvitationComparisonsItem()); loadWidget(d->mInvitationUi->mAutomaticSending, MessageViewer::MessageViewerSettings::self()->automaticSendingItem()); //TODO verify it d->mInvitationUi->mAutomaticSending->setEnabled(!d->mInvitationUi->mLegacyBodyInvites->isChecked()); diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/invitationsettings.h kf5-messagelib-16.12.3/messageviewer/src/widgets/invitationsettings.h --- kf5-messagelib-16.04.3/messageviewer/src/widgets/invitationsettings.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/invitationsettings.h 2017-03-06 12:30:37.000000000 +0000 @@ -46,13 +46,11 @@ void doLoadFromGlobalSettings(); void doResetToDefaultsOther(); -private Q_SLOTS: - void slotLegacyBodyInvitesToggled(bool on); - Q_SIGNALS: void changed(); private: + void slotLegacyBodyInvitesToggled(bool on); InvitationSettingsPrivate *const d; }; diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/mailsourceviewer.cpp kf5-messagelib-16.12.3/messageviewer/src/widgets/mailsourceviewer.cpp --- kf5-messagelib-16.04.3/messageviewer/src/widgets/mailsourceviewer.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/mailsourceviewer.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,209 +0,0 @@ -/* - * - * This file is part of KMail, the KDE mail client. - * - * Copyright (c) 2002-2003 Carsten Pfeiffer - * Copyright (c) 2003 Zack Rusin - * - * KMail is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License, version 2, as - * published by the Free Software Foundation. - * - * KMail is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * In addition, as a special exception, the copyright holders give - * permission to link the code of this program with any edition of - * the Qt library by Trolltech AS, Norway (or with modified versions - * of Qt that use the same license as Qt), and distribute linked - * combinations including the two. You must obey the GNU General - * Public License in all respects for all of the code used other than - * Qt. If you modify this file, you may extend this exception to - * your version of the file, but you are not obligated to do so. If - * you do not wish to do so, delete this exception statement from - * your version. - */ - -#include "mailsourceviewer.h" -#include "mailsourceviewtextbrowserwidget.h" -#include "messageviewer/messageviewerutil.h" -#include "findbar/findbarsourceview.h" -#include -#include "kpimtextedit/slidecontainer.h" -#include "PimCommon/PimUtil" -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -namespace MessageViewer -{ - -MailSourceViewer::MailSourceViewer(QWidget *parent) - : QDialog(parent), - mFindBar(Q_NULLPTR) -{ - setAttribute(Qt::WA_DeleteOnClose); - QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); - QWidget *mainWidget = new QWidget(this); - QVBoxLayout *mainLayout = new QVBoxLayout; - setLayout(mainLayout); - mainLayout->addWidget(mainWidget); - connect(buttonBox, &QDialogButtonBox::rejected, this, &MailSourceViewer::reject); - - QVBoxLayout *layout = new QVBoxLayout(mainWidget); - layout->setMargin(0); - connect(buttonBox->button(QDialogButtonBox::Close), &QPushButton::clicked, this, &MailSourceViewer::close); - - mRawBrowser = new MailSourceViewTextBrowserWidget(); - -#ifndef NDEBUG - mTabWidget = new QTabWidget; - layout->addWidget(mTabWidget); - - mTabWidget->addTab(mRawBrowser, i18nc("Unchanged mail message", "Raw Source")); - mTabWidget->setTabToolTip(0, i18n("Raw, unmodified mail as it is stored on the filesystem or on the server")); - - mHtmlBrowser = new MailSourceViewTextBrowserWidget(); - mTabWidget->addTab(mHtmlBrowser, i18nc("Mail message as shown, in HTML format", "HTML Source")); - mTabWidget->setTabToolTip(1, i18n("HTML code for displaying the message to the user")); - new KPIMTextEdit::HtmlHighlighter(mHtmlBrowser->textBrowser()->document()); - - mTabWidget->setCurrentIndex(0); -#else - layout->addWidget(mRawBrowser); -#endif - - // combining the shortcuts in one qkeysequence() did not work... - QShortcut *shortcut = new QShortcut(this); - shortcut->setKey(Qt::Key_Escape); - connect(shortcut, &QShortcut::activated, this, &MailSourceViewer::close); - shortcut = new QShortcut(this); - shortcut->setKey(Qt::Key_W + Qt::CTRL); - connect(shortcut, &QShortcut::activated, this, &MailSourceViewer::close); - - KWindowSystem::setIcons(winId(), - qApp->windowIcon().pixmap(IconSize(KIconLoader::Desktop), - IconSize(KIconLoader::Desktop)), - qApp->windowIcon().pixmap(IconSize(KIconLoader::Small), - IconSize(KIconLoader::Small))); - new MailSourceHighlighter(mRawBrowser->textBrowser()->document()); - mRawBrowser->textBrowser()->setFocus(); - mainLayout->addWidget(buttonBox); -} - -MailSourceViewer::~MailSourceViewer() -{ -} - -void MailSourceViewer::setRawSource(const QString &source) -{ - mRawBrowser->setText(source); -} - -void MailSourceViewer::setDisplayedSource(const QString &source) -{ -#ifndef NDEBUG - mHtmlBrowser->setPlainText(reformat(source)); -#else - Q_UNUSED(source); -#endif -} - -void MailSourceViewer::setFixedFont() -{ - mRawBrowser->setFixedFont(); -#ifndef NDEBUG - mHtmlBrowser->setFixedFont(); -#endif -} - -QString MailSourceViewer::reformat(const QString &src) -{ - const QRegExp cleanLeadingWhitespace(QStringLiteral("(?:\\n)+\\w*")); - QStringList tmpSource; - QString source(src); - int pos = 0; - QString indent; - // Best to be really verbose about this one... - const static QRegExp htmlTagRegExp(QStringLiteral("<" - "(/)?" //Captures the / if this is an end tag. - "(\\w+)" //Captures TagName - "(?:" //Groups tag contents - "(?:\\s+" //Groups attributes - "(?:\\w+)" //Attribute name - "(?:" //groups =value portion. - "\\s*=\\s*" // = - "(?:" //Groups attribute "value" portion. - "\\\"(?:[^\\\"]*)\\\"" // attVal='double quoted' - "|'(?:[^']*)'" // attVal='single quoted' - "|(?:[^'"">\\s]+)" // attVal=urlnospaces - ")" - ")?" //end optional att value portion. - ")+\\s*" //One or more attribute pairs - "|\\s*" //Some white space. - ")" - "(/)?>" //Captures the "/" if this is a complete tag. - )); - - //First make sure that each tag is surrounded by newlines - while ((pos = htmlTagRegExp.indexIn(source, pos)) != -1) { - source.insert(pos, QLatin1Char('\n')); - pos += htmlTagRegExp.matchedLength() + 1; - source.insert(pos, QLatin1Char('\n')); - ++pos; - } - - // Then split the source on newlines skiping empty parts. - // Now a line is either a tag or pure data. - tmpSource = source.split(QLatin1Char('\n'), QString::SkipEmptyParts); - - // Then clean any leading whitespace - for (int i = 0; i != tmpSource.length(); ++i) { - tmpSource[i] = tmpSource[i].remove(cleanLeadingWhitespace); - } - - // Then indent as appropriate - for (int i = 0; i != tmpSource.length(); ++i) { - if (htmlTagRegExp.indexIn(tmpSource.at(i)) != -1) { // A tag - if (htmlTagRegExp.cap(3) == QLatin1String("/") || - htmlTagRegExp.cap(2) == QLatin1String("img") || - htmlTagRegExp.cap(2) == QLatin1String("br")) { - //Self closing tag or no closure needed - continue; - } - if (htmlTagRegExp.cap(1) == QLatin1String("/")) { - // End tag - indent.chop(2); - tmpSource[i].prepend(indent); - continue; - } - // start tag - tmpSource[i].prepend(indent); - indent.append(QStringLiteral(" ")); - continue; - } - // Data - tmpSource[i].prepend(indent); - } - - // Finally reassemble and return :) - return tmpSource.join(QStringLiteral("\n")); -} - -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/mailsourceviewer.h kf5-messagelib-16.12.3/messageviewer/src/widgets/mailsourceviewer.h --- kf5-messagelib-16.04.3/messageviewer/src/widgets/mailsourceviewer.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/mailsourceviewer.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -/* - * - * This file is part of KMail, the KDE mail client. - * - * Copyright (c) 2002-2003 Carsten Pfeiffer - * Copyright (c) 2003 Zack Rusin - * - * KMail is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License, version 2, as - * published by the Free Software Foundation. - * - * KMail is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * In addition, as a special exception, the copyright holders give - * permission to link the code of this program with any edition of - * the Qt library by Trolltech AS, Norway (or with modified versions - * of Qt that use the same license as Qt), and distribute linked - * combinations including the two. You must obey the GNU General - * Public License in all respects for all of the code used other than - * Qt. If you modify this file, you may extend this exception to - * your version of the file, but you are not obligated to do so. If - * you do not wish to do so, delete this exception statement from - * your version. - */ -#ifndef MAILSOURCEVIEWER_H -#define MAILSOURCEVIEWER_H - -#include -class QTabWidget; -namespace MessageViewer -{ -class FindBarSourceView; -class MailSourceViewTextBrowserWidget; -class MailSourceViewer : public QDialog -{ - Q_OBJECT -public: - explicit MailSourceViewer(QWidget *parent = Q_NULLPTR); - ~MailSourceViewer(); - - void setRawSource(const QString &source); - void setDisplayedSource(const QString &source); - void setFixedFont(); -private: - QString reformat(const QString &src); - MailSourceViewTextBrowserWidget *mRawBrowser; - FindBarSourceView *mFindBar; -#ifndef NDEBUG - QTabWidget *mTabWidget; - MailSourceViewTextBrowserWidget *mHtmlBrowser; -#endif -}; - -} -#endif // MAILSOURCEVIEWER_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/mailsourceviewtextbrowserwidget.cpp kf5-messagelib-16.12.3/messageviewer/src/widgets/mailsourceviewtextbrowserwidget.cpp --- kf5-messagelib-16.04.3/messageviewer/src/widgets/mailsourceviewtextbrowserwidget.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/mailsourceviewtextbrowserwidget.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -33,7 +33,6 @@ #include "mailsourceviewtextbrowserwidget.h" #include "messageviewer/messageviewerutil.h" #include "findbar/findbarsourceview.h" -#include #include "kpimtextedit/slidecontainer.h" #include "PimCommon/PimUtil" #include "kpimtextedit/texttospeechwidget.h" @@ -59,8 +58,7 @@ MailSourceViewTextBrowserWidget::MailSourceViewTextBrowserWidget(QWidget *parent) : QWidget(parent) { - QVBoxLayout *lay = new QVBoxLayout; - setLayout(lay); + QVBoxLayout *lay = new QVBoxLayout(this); lay->setMargin(0); mTextToSpeechWidget = new KPIMTextEdit::TextToSpeechWidget; mTextToSpeechWidget->setObjectName(QStringLiteral("texttospeech")); @@ -127,17 +125,17 @@ QMenu *popup = createStandardContextMenu(); if (popup) { popup->addSeparator(); - popup->addAction(KStandardAction::find(this, SIGNAL(findText()), this)); + popup->addAction(KStandardAction::find(this, &MailSourceViewTextBrowser::findText, this)); //Code from KTextBrowser KIconTheme::assignIconsToContextMenu(isReadOnly() ? KIconTheme::ReadOnlyText : KIconTheme::TextEditor, popup->actions()); if (mTextToSpeechInterface->isReady()) { popup->addSeparator(); - popup->addAction(QIcon::fromTheme(QStringLiteral("preferences-desktop-text-to-speech")), i18n("Speak Text"), this, SLOT(slotSpeakText())); + popup->addAction(QIcon::fromTheme(QStringLiteral("preferences-desktop-text-to-speech")), i18n("Speak Text"), this, &MailSourceViewTextBrowser::slotSpeakText); } popup->addSeparator(); - popup->addAction(KStandardAction::saveAs(this, SLOT(slotSaveAs()), this)); + popup->addAction(KStandardAction::saveAs(this, &MailSourceViewTextBrowser::slotSaveAs, this)); popup->exec(event->globalPos()); delete popup; diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/mailsourceviewtextbrowserwidget.h kf5-messagelib-16.12.3/messageviewer/src/widgets/mailsourceviewtextbrowserwidget.h --- kf5-messagelib-16.04.3/messageviewer/src/widgets/mailsourceviewtextbrowserwidget.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/mailsourceviewtextbrowserwidget.h 2017-03-06 12:30:37.000000000 +0000 @@ -56,6 +56,7 @@ class MailSourceViewTextBrowser; class MailSourceHighlighter : public QSyntaxHighlighter { + Q_OBJECT public: explicit MailSourceHighlighter(QTextDocument *textdocument) : QSyntaxHighlighter(textdocument) @@ -74,9 +75,8 @@ void setPlainText(const QString &text); void setFixedFont(); MessageViewer::MailSourceViewTextBrowser *textBrowser() const; -private Q_SLOTS: - void slotFind(); private: + void slotFind(); MailSourceViewTextBrowser *mTextBrowser; FindBarSourceView *mFindBar; KPIMTextEdit::SlideContainer *mSliderContainer; @@ -91,12 +91,11 @@ explicit MailSourceViewTextBrowser(KPIMTextEdit::TextToSpeechInterface *textToSpeechInterface, QWidget *parent = Q_NULLPTR); protected: void contextMenuEvent(QContextMenuEvent *event) Q_DECL_OVERRIDE; -private Q_SLOTS: - void slotSpeakText(); - void slotSaveAs(); Q_SIGNALS: void findText(); private: + void slotSpeakText(); + void slotSaveAs(); KPIMTextEdit::TextToSpeechInterface *mTextToSpeechInterface; }; diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/mailsourcewebengineviewer.cpp kf5-messagelib-16.12.3/messageviewer/src/widgets/mailsourcewebengineviewer.cpp --- kf5-messagelib-16.04.3/messageviewer/src/widgets/mailsourcewebengineviewer.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/mailsourcewebengineviewer.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2016 Montel Laurent + Copyright (C) 2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "mailsourcewebengineviewer.h" @@ -22,8 +24,12 @@ #include "mailsourceviewtextbrowserwidget.h" #include "messageviewer/messageviewerutil.h" #include "findbar/findbarsourceview.h" -#include #include "kpimtextedit/slidecontainer.h" + +#include +#include +#include + #include "PimCommon/PimUtil" #include #include @@ -46,34 +52,32 @@ mFindBar(Q_NULLPTR) { setAttribute(Qt::WA_DeleteOnClose); - QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); - QWidget *mainWidget = new QWidget(this); - QVBoxLayout *mainLayout = new QVBoxLayout; - setLayout(mainLayout); - mainLayout->addWidget(mainWidget); - connect(buttonBox, &QDialogButtonBox::rejected, this, &MailSourceWebEngineViewer::reject); - - QVBoxLayout *layout = new QVBoxLayout(mainWidget); - layout->setMargin(0); - connect(buttonBox->button(QDialogButtonBox::Close), &QPushButton::clicked, this, &MailSourceWebEngineViewer::close); + QVBoxLayout *mainLayout = new QVBoxLayout(this); - mRawBrowser = new MailSourceViewTextBrowserWidget(); + mRawBrowser = new MailSourceViewTextBrowserWidget(this); #ifndef NDEBUG - mTabWidget = new QTabWidget; - layout->addWidget(mTabWidget); + mTabWidget = new QTabWidget(this); + mainLayout->addWidget(mTabWidget); mTabWidget->addTab(mRawBrowser, i18nc("Unchanged mail message", "Raw Source")); mTabWidget->setTabToolTip(0, i18n("Raw, unmodified mail as it is stored on the filesystem or on the server")); - mHtmlBrowser = new MailSourceViewTextBrowserWidget(); + mHtmlBrowser = new MailSourceViewTextBrowserWidget(this); mTabWidget->addTab(mHtmlBrowser, i18nc("Mail message as shown, in HTML format", "HTML Source")); mTabWidget->setTabToolTip(1, i18n("HTML code for displaying the message to the user")); - new KPIMTextEdit::HtmlHighlighter(mHtmlBrowser->textBrowser()->document()); + KSyntaxHighlighting::Definition def; + def = mRepo.definitionForName(QStringLiteral("HTML")); + + KSyntaxHighlighting::SyntaxHighlighter *hl = new KSyntaxHighlighting::SyntaxHighlighter(mHtmlBrowser->textBrowser()->document()); + hl->setTheme((palette().color(QPalette::Base).lightness() < 128) + ? mRepo.defaultTheme(KSyntaxHighlighting::Repository::DarkTheme) + : mRepo.defaultTheme(KSyntaxHighlighting::Repository::LightTheme)); + hl->setDefinition(def); mTabWidget->setCurrentIndex(0); #else - layout->addWidget(mRawBrowser); + mainLayout->addWidget(mRawBrowser); #endif // combining the shortcuts in one qkeysequence() did not work... @@ -91,6 +95,10 @@ IconSize(KIconLoader::Small))); new MailSourceHighlighter(mRawBrowser->textBrowser()->document()); mRawBrowser->textBrowser()->setFocus(); + QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, this); + connect(buttonBox, &QDialogButtonBox::rejected, this, &MailSourceWebEngineViewer::reject); + connect(buttonBox->button(QDialogButtonBox::Close), &QPushButton::clicked, this, &MailSourceWebEngineViewer::close); + mainLayout->addWidget(buttonBox); } @@ -103,23 +111,14 @@ mRawBrowser->setText(source); } -struct SetPlainTextFunctor { - MailSourceViewTextBrowserWidget *textEdit; - explicit SetPlainTextFunctor(MailSourceViewTextBrowserWidget *textEdit) - : textEdit(textEdit) - { - } - void operator()(const QString &result) - { - textEdit->setPlainText(result); - } -}; - void MailSourceWebEngineViewer::setDisplayedSource(QWebEnginePage *page) { #ifndef NDEBUG if (page) { - page->toHtml(SetPlainTextFunctor(mHtmlBrowser)); + MailSourceViewTextBrowserWidget *browser = mHtmlBrowser; + page->toHtml([browser](const QString & result) { + browser->setPlainText(result); + }); } #else Q_UNUSED(page); @@ -134,75 +133,3 @@ #endif } -QString MailSourceWebEngineViewer::reformat(const QString &src) -{ - const QRegExp cleanLeadingWhitespace(QStringLiteral("(?:\\n)+\\w*")); - QStringList tmpSource; - QString source(src); - int pos = 0; - QString indent; - // Best to be really verbose about this one... - const static QRegExp htmlTagRegExp(QStringLiteral("<" - "(/)?" //Captures the / if this is an end tag. - "(\\w+)" //Captures TagName - "(?:" //Groups tag contents - "(?:\\s+" //Groups attributes - "(?:\\w+)" //Attribute name - "(?:" //groups =value portion. - "\\s*=\\s*" // = - "(?:" //Groups attribute "value" portion. - "\\\"(?:[^\\\"]*)\\\"" // attVal='double quoted' - "|'(?:[^']*)'" // attVal='single quoted' - "|(?:[^'"">\\s]+)" // attVal=urlnospaces - ")" - ")?" //end optional att value portion. - ")+\\s*" //One or more attribute pairs - "|\\s*" //Some white space. - ")" - "(/)?>" //Captures the "/" if this is a complete tag. - )); - - //First make sure that each tag is surrounded by newlines - while ((pos = htmlTagRegExp.indexIn(source, pos)) != -1) { - source.insert(pos, QLatin1Char('\n')); - pos += htmlTagRegExp.matchedLength() + 1; - source.insert(pos, QLatin1Char('\n')); - ++pos; - } - - // Then split the source on newlines skiping empty parts. - // Now a line is either a tag or pure data. - tmpSource = source.split(QLatin1Char('\n'), QString::SkipEmptyParts); - - // Then clean any leading whitespace - for (int i = 0; i != tmpSource.length(); ++i) { - tmpSource[i] = tmpSource[i].remove(cleanLeadingWhitespace); - } - - // Then indent as appropriate - for (int i = 0; i != tmpSource.length(); ++i) { - if (htmlTagRegExp.indexIn(tmpSource.at(i)) != -1) { // A tag - if (htmlTagRegExp.cap(3) == QLatin1String("/") || - htmlTagRegExp.cap(2) == QLatin1String("img") || - htmlTagRegExp.cap(2) == QLatin1String("br")) { - //Self closing tag or no closure needed - continue; - } - if (htmlTagRegExp.cap(1) == QLatin1String("/")) { - // End tag - indent.chop(2); - tmpSource[i].prepend(indent); - continue; - } - // start tag - tmpSource[i].prepend(indent); - indent.append(QStringLiteral(" ")); - continue; - } - // Data - tmpSource[i].prepend(indent); - } - - // Finally reassemble and return :) - return tmpSource.join(QStringLiteral("\n")); -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/mailsourcewebengineviewer.h kf5-messagelib-16.12.3/messageviewer/src/widgets/mailsourcewebengineviewer.h --- kf5-messagelib-16.04.3/messageviewer/src/widgets/mailsourcewebengineviewer.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/mailsourcewebengineviewer.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,26 +1,32 @@ /* - Copyright (c) 2016 Montel Laurent + Copyright (C) 2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef MAILSOURCEWEBENGINEVIEWER_H #define MAILSOURCEWEBENGINEVIEWER_H #include +#include "config-messageviewer.h" class QTabWidget; class QWebEnginePage; + +#include + namespace MessageViewer { class FindBarSourceView; @@ -36,7 +42,7 @@ void setDisplayedSource(QWebEnginePage *page); void setFixedFont(); private: - QString reformat(const QString &src); + KSyntaxHighlighting::Repository mRepo; MailSourceViewTextBrowserWidget *mRawBrowser; FindBarSourceView *mFindBar; #ifndef NDEBUG diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/openattachmentfolderwidget.cpp kf5-messagelib-16.12.3/messageviewer/src/widgets/openattachmentfolderwidget.cpp --- kf5-messagelib-16.04.3/messageviewer/src/widgets/openattachmentfolderwidget.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/openattachmentfolderwidget.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. + This library 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. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This library 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 General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #include "openattachmentfolderwidget.h" diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/openattachmentfolderwidget.h kf5-messagelib-16.12.3/messageviewer/src/widgets/openattachmentfolderwidget.h --- kf5-messagelib-16.04.3/messageviewer/src/widgets/openattachmentfolderwidget.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/openattachmentfolderwidget.h 2017-03-06 12:30:37.000000000 +0000 @@ -1,18 +1,20 @@ /* - Copyright (c) 2014-2016 Montel Laurent + Copyright (C) 2014-2016 Laurent Montel - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef OPENATTACHMENTFOLDERWIDGET_H @@ -36,11 +38,10 @@ void slotShowWarning(); void slotHideWarning(); -private Q_SLOTS: +private: void slotOpenAttachmentFolder(); void slotTimeOut(); void slotExplicitlyClosed(); -private: QUrl mUrl; QTimer *mTimer; }; diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/submittedformwarningwidget.cpp kf5-messagelib-16.12.3/messageviewer/src/widgets/submittedformwarningwidget.cpp --- kf5-messagelib-16.04.3/messageviewer/src/widgets/submittedformwarningwidget.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/submittedformwarningwidget.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,45 @@ +/* + Copyright (c) 2016 Montel Laurent + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + +*/ + +#include "submittedformwarningwidget.h" + +#include +#include + +using namespace MessageViewer; + +SubmittedFormWarningWidget::SubmittedFormWarningWidget(QWidget *parent) + : KMessageWidget(parent) +{ + setVisible(false); + setCloseButtonVisible(true); + setMessageType(Warning); + setWordWrap(true); + setText(i18n("Submit form is not allowed in mailer. Please open url in a browser.")); +} + +SubmittedFormWarningWidget::~SubmittedFormWarningWidget() +{ +} + +void SubmittedFormWarningWidget::slotShowWarning() +{ + animatedShow(); +} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/submittedformwarningwidget.h kf5-messagelib-16.12.3/messageviewer/src/widgets/submittedformwarningwidget.h --- kf5-messagelib-16.04.3/messageviewer/src/widgets/submittedformwarningwidget.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/submittedformwarningwidget.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,43 @@ +/* + Copyright (c) 2016 Montel Laurent + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + +*/ + +#ifndef SUBMITTEDFORMWARNINGWIDGET_H +#define SUBMITTEDFORMWARNINGWIDGET_H + +#include "messageviewer_export.h" + +#include + +namespace MessageViewer +{ +class SubmittedFormWarningWidgetPrivate; +class MESSAGEVIEWER_EXPORT SubmittedFormWarningWidget : public KMessageWidget +{ + Q_OBJECT +public: + explicit SubmittedFormWarningWidget(QWidget *parent = Q_NULLPTR); + ~SubmittedFormWarningWidget(); + +public Q_SLOTS: + void slotShowWarning(); +}; +} + +#endif // SUBMITTEDFORMWARNINGWIDGET_H diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/vcardviewer.h kf5-messagelib-16.12.3/messageviewer/src/widgets/vcardviewer.h --- kf5-messagelib-16.04.3/messageviewer/src/widgets/vcardviewer.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/vcardviewer.h 2017-03-06 12:30:37.000000000 +0000 @@ -23,11 +23,6 @@ #include #include -namespace Akonadi -{ -class ContactViewer; -} - namespace KAddressBookGrantlee { class GrantleeContactViewer; @@ -43,12 +38,10 @@ explicit VCardViewer(QWidget *parent, const QByteArray &vCard); ~VCardViewer(); -private Q_SLOTS: +private: void slotUser1(); void slotUser2(); void slotUser3(); - -private: void readConfig(); void writeConfig(); KAddressBookGrantlee::GrantleeContactViewer *mContactViewer; @@ -57,7 +50,6 @@ int mAddresseeListIndex; QPushButton *mUser2Button; QPushButton *mUser3Button; - }; } diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/zoomactionmenu.cpp kf5-messagelib-16.12.3/messageviewer/src/widgets/zoomactionmenu.cpp --- kf5-messagelib-16.04.3/messageviewer/src/widgets/zoomactionmenu.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/zoomactionmenu.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,192 +0,0 @@ -/* - Copyright (c) 2015-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "zoomactionmenu.h" -#include -#include -#include - -using namespace MessageViewer; -namespace -{ -qreal zoomBy() -{ - return 20; -} -} - -class MessageViewer::ZoomActionMenuPrivate -{ -public: - ZoomActionMenuPrivate(KActionMenu *qq) - : mZoomFactor(100), - mZoomTextOnlyAction(Q_NULLPTR), - mZoomInAction(Q_NULLPTR), - mZoomOutAction(Q_NULLPTR), - mZoomResetAction(Q_NULLPTR), - mActionCollection(Q_NULLPTR), - mZoomTextOnly(false), - q(qq) - { - - } - void createMenu(); - qreal mZoomFactor; - KToggleAction *mZoomTextOnlyAction; - QAction *mZoomInAction; - QAction *mZoomOutAction; - QAction *mZoomResetAction; - KActionCollection *mActionCollection; - bool mZoomTextOnly; - KActionMenu *q; -}; - -ZoomActionMenu::ZoomActionMenu(QObject *parent) - : KActionMenu(parent), - d(new MessageViewer::ZoomActionMenuPrivate(this)) -{ -} - -ZoomActionMenu::~ZoomActionMenu() -{ - delete d; -} - -void ZoomActionMenu::setActionCollection(KActionCollection *ac) -{ - d->mActionCollection = ac; -} - -void ZoomActionMenu::createZoomActions() -{ - // Zoom actions - d->mZoomTextOnlyAction = new KToggleAction(i18n("Zoom Text Only"), this); - d->mActionCollection->addAction(QStringLiteral("toggle_zoomtextonly"), d->mZoomTextOnlyAction); - connect(d->mZoomTextOnlyAction, &QAction::triggered, this, &ZoomActionMenu::slotZoomTextOnly); - - d->mZoomInAction = new QAction(QIcon::fromTheme(QStringLiteral("zoom-in")), i18n("&Zoom In"), this); - d->mActionCollection->addAction(QStringLiteral("zoom_in"), d->mZoomInAction); - connect(d->mZoomInAction, &QAction::triggered, this, &ZoomActionMenu::slotZoomIn); - d->mActionCollection->setDefaultShortcut(d->mZoomInAction, QKeySequence(Qt::CTRL | Qt::Key_Plus)); - - d->mZoomOutAction = new QAction(QIcon::fromTheme(QStringLiteral("zoom-out")), i18n("Zoom &Out"), this); - d->mActionCollection->addAction(QStringLiteral("zoom_out"), d->mZoomOutAction); - connect(d->mZoomOutAction, &QAction::triggered, this, &ZoomActionMenu::slotZoomOut); - d->mActionCollection->setDefaultShortcut(d->mZoomOutAction, QKeySequence(Qt::CTRL | Qt::Key_Minus)); - - d->mZoomResetAction = new QAction(i18n("Reset"), this); - d->mActionCollection->addAction(QStringLiteral("zoom_reset"), d->mZoomResetAction); - connect(d->mZoomResetAction, &QAction::triggered, this, &ZoomActionMenu::slotZoomReset); - d->mActionCollection->setDefaultShortcut(d->mZoomResetAction, QKeySequence(Qt::CTRL | Qt::Key_0)); - d->createMenu(); -} - -KToggleAction *ZoomActionMenu::zoomTextOnlyAction() const -{ - return d->mZoomTextOnlyAction; -} - -QAction *ZoomActionMenu::zoomInAction() const -{ - return d->mZoomInAction; -} - -QAction *ZoomActionMenu::zoomOutAction() const -{ - return d->mZoomOutAction; -} - -QAction *ZoomActionMenu::zoomResetAction() const -{ - return d->mZoomResetAction; -} - -void ZoomActionMenu::setZoomFactor(qreal zoomFactor) -{ - d->mZoomFactor = zoomFactor; -} - -void ZoomActionMenu::setWebViewerZoomFactor(qreal zoomFactor) -{ - Q_EMIT zoomChanged(zoomFactor); -} - -void ZoomActionMenu::slotZoomIn() -{ - if (d->mZoomFactor >= 300) { - return; - } - d->mZoomFactor += zoomBy(); - if (d->mZoomFactor > 300) { - d->mZoomFactor = 300; - } - Q_EMIT zoomChanged(d->mZoomFactor / 100.0); -} - -void ZoomActionMenu::slotZoomOut() -{ - if (d->mZoomFactor <= 10) { - return; - } - d->mZoomFactor -= zoomBy(); - if (d->mZoomFactor < 10) { - d->mZoomFactor = 10; - } - Q_EMIT zoomChanged(d->mZoomFactor / 100.0); -} - -void ZoomActionMenu::setZoomTextOnly(bool textOnly) -{ - d->mZoomTextOnly = textOnly; - if (d->mZoomTextOnlyAction) { - d->mZoomTextOnlyAction->setChecked(d->mZoomTextOnly); - } - Q_EMIT zoomTextOnlyChanged(d->mZoomTextOnly); -} - -void ZoomActionMenu::slotZoomTextOnly() -{ - setZoomTextOnly(!d->mZoomTextOnly); -} - -void ZoomActionMenu::slotZoomReset() -{ - d->mZoomFactor = 100; - Q_EMIT zoomChanged(1.0); -} - -bool ZoomActionMenu::zoomTextOnly() const -{ - return d->mZoomTextOnly; -} - -qreal ZoomActionMenu::zoomFactor() const -{ - return d->mZoomFactor; -} - -void ZoomActionMenuPrivate::createMenu() -{ - q->setText(i18n("Zoom")); - q->addAction(mZoomInAction); - q->addAction(mZoomOutAction); - q->addSeparator(); - q->addAction(mZoomResetAction); - q->addSeparator(); - q->addAction(mZoomTextOnlyAction); - mActionCollection->addAction(QStringLiteral("zoom_menu"), q); -} diff -Nru kf5-messagelib-16.04.3/messageviewer/src/widgets/zoomactionmenu.h kf5-messagelib-16.12.3/messageviewer/src/widgets/zoomactionmenu.h --- kf5-messagelib-16.04.3/messageviewer/src/widgets/zoomactionmenu.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/src/widgets/zoomactionmenu.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -/* - Copyright (c) 2015-2016 Montel Laurent - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License, version 2, as - published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef ZOOMACTIONMENU_H -#define ZOOMACTIONMENU_H - -#include -#include "messageviewer_export.h" -class KToggleAction; -class KActionCollection; -namespace MessageViewer -{ -class ZoomActionMenuPrivate; -class MESSAGEVIEWER_EXPORT ZoomActionMenu : public KActionMenu -{ - Q_OBJECT -public: - explicit ZoomActionMenu(QObject *parent = Q_NULLPTR); - ~ZoomActionMenu(); - - void createZoomActions(); - KToggleAction *zoomTextOnlyAction() const; - - QAction *zoomInAction() const; - - QAction *zoomOutAction() const; - - QAction *zoomResetAction() const; - - void setActionCollection(KActionCollection *ac); - - void setZoomFactor(qreal zoomFactor); - qreal zoomFactor() const; - - void setWebViewerZoomFactor(qreal zoomFactor); - bool zoomTextOnly() const; - -Q_SIGNALS: - void zoomChanged(qreal value); - void zoomTextOnlyChanged(bool b); - -public Q_SLOTS: - void slotZoomIn(); - void slotZoomOut(); - void setZoomTextOnly(bool textOnly); - void slotZoomTextOnly(); - void slotZoomReset(); - -private: - ZoomActionMenuPrivate *const d; -}; -} - -#endif // ZOOMACTIONMENU_H diff -Nru kf5-messagelib-16.04.3/messageviewer/tests/CMakeLists.txt kf5-messagelib-16.12.3/messageviewer/tests/CMakeLists.txt --- kf5-messagelib-16.04.3/messageviewer/tests/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/tests/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -4,9 +4,10 @@ ) add_executable(viewertest_gui ${viewertest_gui_SRCS}) target_link_libraries(viewertest_gui - Qt5::WebKitWidgets KF5::Mime KF5::MessageViewer KF5::GrantleeTheme + KF5::I18n + KF5::XmlGui ) diff -Nru kf5-messagelib-16.04.3/messageviewer/tests/viewertest_gui.cpp kf5-messagelib-16.12.3/messageviewer/tests/viewertest_gui.cpp --- kf5-messagelib-16.04.3/messageviewer/tests/viewertest_gui.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/messageviewer/tests/viewertest_gui.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -21,6 +21,7 @@ #include "messageviewer/headerstylepluginmanager.h" #include #include +#include #include #include @@ -44,16 +45,18 @@ parser.addVersionOption(); parser.addHelpOption(); parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("+[file]"), i18n("File containing an email"))); - parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("headerstyleplugin"), i18n("Header Style Plugin"), QStringLiteral("headerstyleplugin"))); - QCommandLineOption pluginlistnameOption(QStringList() << QStringLiteral("list"), QStringLiteral("Show list of plugin installed.")); - parser.addOption(pluginlistnameOption); + QCommandLineOption headerStylePluginOption(QStringList() << QStringLiteral("headerstyleplugin"), i18n("Header Style Plugin"), QStringLiteral("headerstyleplugin")); + parser.addOption(headerStylePluginOption); + + QCommandLineOption listOption(QStringList() << QStringLiteral("list"), QStringLiteral("Show list of plugins installed.")); + parser.addOption(listOption); aboutData.setupCommandLine(&parser); parser.process(app); aboutData.processCommandLine(&parser); - if (parser.isSet(pluginlistnameOption)) { + if (parser.isSet(listOption)) { qDebug() << "List of Plugin :" << MessageViewer::HeaderStylePluginManager::self()->pluginListName(); return 0; } @@ -83,11 +86,16 @@ } msg->parse(); - Viewer *viewer = new Viewer(0); - viewer->setPluginName(parser.value(QStringLiteral("headerstyleplugin"))); + Viewer *viewer = new Viewer(0, 0, new KActionCollection(&app)); + if (parser.isSet(headerStylePluginOption)) { + viewer->setPluginName(parser.value(headerStylePluginOption)); + } viewer->setMessage(KMime::Message::Ptr(msg)); viewer->show(); - return app.exec(); + const int ret = app.exec(); + + delete viewer; + return ret; } diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/attachmenttest.cpp kf5-messagelib-16.12.3/mimetreeparser/autotests/attachmenttest.cpp --- kf5-messagelib-16.04.3/mimetreeparser/autotests/attachmenttest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/attachmenttest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,68 @@ +/* + Copyright (c) 2015 Volker Krause + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ +#include "viewer/objecttreeparser.h" +#include "util.h" + +#include "setupenv.h" + +#include + +using namespace MimeTreeParser; + +class AttachmentTest : public QObject +{ + Q_OBJECT +private Q_SLOTS: + void initTestCase(); + void testEncryptedAttachment_data(); + void testEncryptedAttachment(); +}; + +QTEST_MAIN(AttachmentTest) + +void AttachmentTest::initTestCase() +{ + MimeTreeParser::Test::setupEnv(); +} + +void AttachmentTest::testEncryptedAttachment_data() +{ + QTest::addColumn("mbox"); + QTest::newRow("encrypted") << "openpgp-encrypted-two-attachments.mbox"; + QTest::newRow("signed") << "openpgp-signed-two-attachments.mbox"; + QTest::newRow("signed+encrypted") << "openpgp-signed-encrypted-two-attachments.mbox"; + QTest::newRow("encrypted+partial signed") << "openpgp-encrypted-partially-signed-attachments.mbox"; +} + +void AttachmentTest::testEncryptedAttachment() +{ + QFETCH(QString, mbox); + auto msg = readAndParseMail(mbox); + NodeHelper nodeHelper; + Test::TestObjectTreeSource testSource(Q_NULLPTR); + testSource.setAllowDecryption(true); + ObjectTreeParser otp(&testSource, &nodeHelper); + otp.parseObjectTree(msg.data()); + + auto attachments = msg->attachments(); + auto encAtts = nodeHelper.attachmentsOfExtraContents(); + QCOMPARE(attachments.size() + encAtts.size(), 2); +} + +#include "attachmenttest.moc" diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/CMakeLists.txt kf5-messagelib-16.12.3/mimetreeparser/autotests/CMakeLists.txt --- kf5-messagelib-16.04.3/mimetreeparser/autotests/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,41 @@ +set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}) +add_definitions( -DMAIL_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data" ) + +include(${CMAKE_SOURCE_DIR}/cmake/modules/kdepim_add_gpg_crypto_test.cmake) + +# convenience macro to add qtest unit tests +macro(add_mimetreeparser_unittest _source) + get_filename_component(_name ${_source} NAME_WE) + ecm_add_test(${_source} util.cpp setupenv.cpp + TEST_NAME ${_name} + NAME_PREFIX "mimetreeparser-" + LINK_LIBRARIES KF5::MimeTreeParser Qt5::Test KF5::Mime Gpgmepp + ) +endmacro () + +macro(add_mimetreeparser_class_unittest _source _additionalSource) + get_filename_component(_name ${_source} NAME_WE) + ecm_add_test(${_source} ${_additionalSource} + TEST_NAME ${_name} + NAME_PREFIX "mimetreeparser-" + LINK_LIBRARIES KF5::MimeTreeParser Qt5::Test KF5::Mime Gpgmepp + ) +endmacro () + +macro(add_mimetreeparser_crypto_unittest _source) + set(_test ${_source} util.cpp) + get_filename_component(_name ${_source} NAME_WE) + add_executable( ${_name} ${_test} setupenv.cpp) + ecm_mark_as_test(mimetreeparser-${_name}) + target_link_libraries( ${_name} + KF5::MimeTreeParser + Qt5::Test + KF5::Mime + Gpgmepp + ) + add_gpg_crypto_test(${_name} mimetreeparser-${_name}) +endmacro () + +add_mimetreeparser_crypto_unittest(attachmenttest.cpp) +add_mimetreeparser_unittest(nodehelpertest.cpp) +add_mimetreeparser_class_unittest( cryptohelpertest.cpp "../src/viewer/cryptohelper.cpp") diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/cryptohelpertest.cpp kf5-messagelib-16.12.3/mimetreeparser/autotests/cryptohelpertest.cpp --- kf5-messagelib-16.04.3/mimetreeparser/autotests/cryptohelpertest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/cryptohelpertest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,144 @@ +/* Copyright 2015 Sandro Knauß + + 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) version 3 or any later version + accepted by the membership of KDE e.V. (or its successor approved + by the membership of KDE e.V.), which shall act as a proxy + defined in Section 14 of version 3 of the license. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#include "cryptohelpertest.h" + +#include "viewer/cryptohelper.h" + +#include + +using namespace MimeTreeParser; + +void CryptoHelperTest::testPMFDEmpty() +{ + QCOMPARE(prepareMessageForDecryption("").count(), 0); +} + +void CryptoHelperTest::testPMFDWithNoPGPBlock() +{ + const QByteArray text = "testblabla"; + const QList blocks = prepareMessageForDecryption(text); + QCOMPARE(blocks.count(), 1); + QCOMPARE(blocks[0].text(), text); + QCOMPARE(blocks[0].type(), NoPgpBlock); +} + +void CryptoHelperTest::testPGPBlockType() +{ + const QString blockText = QStringLiteral("text"); + const QString preString = QStringLiteral("before\n"); + for (int i = 1; i <= PrivateKeyBlock; ++i) { + QString name; + switch (i) { + case PgpMessageBlock: + name = QStringLiteral("MESSAGE"); + break; + case MultiPgpMessageBlock: + name = QStringLiteral("MESSAGE PART"); + break; + case SignatureBlock: + name = QStringLiteral("SIGNATURE"); + break; + case ClearsignedBlock: + name = QStringLiteral("SIGNED MESSAGE"); + break; + case PublicKeyBlock: + name = QStringLiteral("PUBLIC KEY BLOCK"); + break; + case PrivateKeyBlock: + name = QStringLiteral("PRIVATE KEY BLOCK"); + break; + } + QString text = QLatin1String("-----BEGIN PGP ") + name + QLatin1String("\n") + blockText; + QList blocks = prepareMessageForDecryption(preString.toLatin1() + text.toLatin1()); + QCOMPARE(blocks.count(), 1); + QCOMPARE(blocks[0].type(), UnknownBlock); + + text += QLatin1String("\n-----END PGP ") + name + QLatin1String("\n"); + blocks = prepareMessageForDecryption(preString.toLatin1() + text.toLatin1()); + QCOMPARE(blocks.count(), 2); + QCOMPARE(blocks[1].text(), text.toLatin1()); + QCOMPARE(blocks[1].type(), static_cast(i)); + } +} + +void CryptoHelperTest::testDeterminePGPBlockType() +{ + const QString blockText = QStringLiteral("text"); + for (int i = 1; i <= PrivateKeyBlock; ++i) { + QString name; + switch (i) { + + case PgpMessageBlock: + name = QStringLiteral("MESSAGE"); + break; + case MultiPgpMessageBlock: + name = QStringLiteral("MESSAGE PART"); + break; + case SignatureBlock: + name = QStringLiteral("SIGNATURE"); + break; + case ClearsignedBlock: + name = QStringLiteral("SIGNED MESSAGE"); + break; + case PublicKeyBlock: + name = QStringLiteral("PUBLIC KEY BLOCK"); + break; + case PrivateKeyBlock: + name = QStringLiteral("PRIVATE KEY BLOCK"); + break; + } + const QString text = QLatin1String("-----BEGIN PGP ") + name + QLatin1String("\n") + blockText + QLatin1String("\n"); + const Block block = Block(text.toLatin1()); + QCOMPARE(block.text(), text.toLatin1()); + QCOMPARE(block.type(), static_cast(i)); + } +} + +void CryptoHelperTest::testEmbededPGPBlock() +{ + const QByteArray text = QByteArray("before\n-----BEGIN PGP MESSAGE-----\ncrypted - you see :)\n-----END PGP MESSAGE-----\nafter"); + const QList blocks = prepareMessageForDecryption(text); + QCOMPARE(blocks.count(), 3); + QCOMPARE(blocks[0].text(), QByteArray("before\n")); + QCOMPARE(blocks[1].text(), QByteArray("-----BEGIN PGP MESSAGE-----\ncrypted - you see :)\n-----END PGP MESSAGE-----\n")); + QCOMPARE(blocks[2].text(), QByteArray("after")); +} + +void CryptoHelperTest::testClearSignedMessage() +{ + const QByteArray text = QByteArray("before\n-----BEGIN PGP SIGNED MESSAGE-----\nsigned content\n-----BEGIN PGP SIGNATURE-----\nfancy signature\n-----END PGP SIGNATURE-----\nafter"); + const QList blocks = prepareMessageForDecryption(text); + QCOMPARE(blocks.count(), 3); + QCOMPARE(blocks[0].text(), QByteArray("before\n")); + QCOMPARE(blocks[1].text(), QByteArray("-----BEGIN PGP SIGNED MESSAGE-----\nsigned content\n-----BEGIN PGP SIGNATURE-----\nfancy signature\n-----END PGP SIGNATURE-----\n")); + QCOMPARE(blocks[2].text(), QByteArray("after")); +} + +void CryptoHelperTest::testMultipleBlockMessage() +{ + const QByteArray text = QByteArray("before\n-----BEGIN PGP SIGNED MESSAGE-----\nsigned content\n-----BEGIN PGP SIGNATURE-----\nfancy signature\n-----END PGP SIGNATURE-----\nafter\n-----BEGIN PGP MESSAGE-----\ncrypted - you see :)\n-----END PGP MESSAGE-----\n"); + const QList blocks = prepareMessageForDecryption(text); + QCOMPARE(blocks.count(), 4); + QCOMPARE(blocks[0].text(), QByteArray("before\n")); + QCOMPARE(blocks[1].text(), QByteArray("-----BEGIN PGP SIGNED MESSAGE-----\nsigned content\n-----BEGIN PGP SIGNATURE-----\nfancy signature\n-----END PGP SIGNATURE-----\n")); + QCOMPARE(blocks[2].text(), QByteArray("after\n")); + QCOMPARE(blocks[3].text(), QByteArray("-----BEGIN PGP MESSAGE-----\ncrypted - you see :)\n-----END PGP MESSAGE-----\n")); +} + +QTEST_APPLESS_MAIN(CryptoHelperTest) diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/cryptohelpertest.h kf5-messagelib-16.12.3/mimetreeparser/autotests/cryptohelpertest.h --- kf5-messagelib-16.04.3/mimetreeparser/autotests/cryptohelpertest.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/cryptohelpertest.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,42 @@ +/* Copyright 2009 Thomas McGuire + + 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) version 3 or any later version + accepted by the membership of KDE e.V. (or its successor approved + by the membership of KDE e.V.), which shall act as a proxy + defined in Section 14 of version 3 of the license. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#ifndef CRYPTOHELPERTEST_H +#define CRYPTOHELPERTEST_H + +#include + +namespace MimeTreeParser +{ + +class CryptoHelperTest : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void testPMFDEmpty(); + void testPMFDWithNoPGPBlock(); + void testPGPBlockType(); + void testDeterminePGPBlockType(); + void testEmbededPGPBlock(); + void testClearSignedMessage(); + void testMultipleBlockMessage(); +}; + +} +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/alternative.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/alternative.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/alternative.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/alternative.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,34 @@ +Return-Path: +Date: Wed, 8 Jun 2016 20:34:44 -0700 +From: Konqi +To: konqi@kde.org +Subject: A random subject with alternative contenttype +MIME-Version: 1.0 +Content-Type: multipart/alternative; + boundary="----=_Part_12345678_12345678" + + +------=_Part_12345678_12345678 +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +If you can see this text it means that your email client couldn't display o= +ur newsletter properly. +Please visit this link to view the newsletter on our website: http://www.go= +g.com/newsletter/ + +=2D GOG.com Team + + +------=_Part_12345678_12345678 +Content-Transfer-Encoding: 7Bit +Content-Type: text/html; charset="windows-1252" + + + +

Some HTML text

+ + +------=_Part_12345678_12345678-- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/alternative.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/alternative.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/alternative.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/alternative.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,17 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/alternative.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/alternative.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/alternative.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/alternative.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,2 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::AlternativeMessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/alternative-notext.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/alternative-notext.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/alternative-notext.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/alternative-notext.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,22 @@ +Return-Path: +Date: Wed, 8 Jun 2016 20:34:44 -0700 +From: Konqi +To: konqi@kde.org +Subject: A random subject with a empty text alternative contenttype +MIME-Version: 1.0 +Content-Type: multipart/alternative; + boundary="----=_Part_12345678_12345678" + + +------=_Part_12345678_12345678 +Content-Transfer-Encoding: 7Bit +Content-Type: text/html; charset="windows-1252" + + + +

Some HTML text

+ + +------=_Part_12345678_12345678-- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/alternative-notext.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/alternative-notext.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/alternative-notext.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/alternative-notext.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,17 @@ + + + + +
+ + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/alternative-notext.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/alternative-notext.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/alternative-notext.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/alternative-notext.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,2 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::AlternativeMessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/forward-openpgp-signed-encrypted.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/forward-openpgp-signed-encrypted.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/forward-openpgp-signed-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/forward-openpgp-signed-encrypted.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,84 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-encoded.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-encoded.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-encoded.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-encoded.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,38 @@ + + + + +
+ +
+ + + + + + + + + + +
+ + + + + + + +
Message was signed on 12/21/15 3:46 PM with unknown key 0xE68031D299A6527C.
The validity of the signature cannot be verified.
Status:No public key to verify the signature
+ Hide Details +
+
+
+
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor. Pellentesque auctor nisi id magna consequat sagittis. Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet. Ut convallis libero in urna ultrices accumsan. Donec sed odio eros. Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisi at sem facilisis semper ac in est.
+
+
End of signed message
+
+
+ + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,80 @@ + + + + +
+ + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-encrypted-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,69 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-encrypted-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-encrypted-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-encrypted-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-encrypted-non-encrypted-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,72 @@ + + + + +
+ + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-encrypted-partially-signed-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-encrypted-partially-signed-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-encrypted-partially-signed-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-encrypted-partially-signed-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,102 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-encrypted+signed.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-encrypted+signed.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-encrypted+signed.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-encrypted+signed.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,55 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-inline-charset-encrypted.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-inline-charset-encrypted.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-inline-charset-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-inline-charset-encrypted.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,50 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-inline-signed.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-inline-signed.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-inline-signed.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-inline-signed.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,38 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-signed-base64-mailman-footer.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-signed-base64-mailman-footer.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-signed-base64-mailman-footer.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-signed-base64-mailman-footer.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,81 @@ + + + + +
+ +
+ + + + +
+
+ + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-signed-encrypted.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-signed-encrypted.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-signed-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-signed-encrypted.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,58 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-signed-encrypted-two-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-signed-encrypted-two-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-signed-encrypted-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-signed-encrypted-two-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,91 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-signed-mailinglist.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-signed-mailinglist.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-signed-mailinglist.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-signed-mailinglist.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,68 @@ + + + + +
+ + +
+ + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-signed-mailinglist+old.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-signed-mailinglist+old.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-signed-mailinglist+old.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-signed-mailinglist+old.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,97 @@ + + + + +
+ + +
+ + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-signed-two-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-signed-two-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/openpgp-signed-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/openpgp-signed-two-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,74 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/signed-forward-openpgp-signed-encrypted.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/signed-forward-openpgp-signed-encrypted.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/signed-forward-openpgp-signed-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/signed-forward-openpgp-signed-encrypted.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,111 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/smime-opaque-enc+sign.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/smime-opaque-enc+sign.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/smime-opaque-enc+sign.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/smime-opaque-enc+sign.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,60 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/smime-opaque-sign.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/smime-opaque-sign.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/smime-opaque-sign.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/smime-opaque-sign.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,43 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/smime-signed-encrypted.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/smime-signed-encrypted.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/details/smime-signed-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/details/smime-signed-encrypted.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,58 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/encapsulated-with-attachment.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/encapsulated-with-attachment.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/encapsulated-with-attachment.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/encapsulated-with-attachment.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,53 @@ +From: Thomas McGuire +Subject: Fwd: Test with attachment +Date: Wed, 5 Aug 2009 10:58:27 +0200 +MIME-Version: 1.0 +Content-Type: Multipart/Mixed; + boundary="Boundary-00=_zmUeKB+A8hGfCVZ" + + +--Boundary-00=_zmUeKB+A8hGfCVZ +Content-Type: text/plain; + charset="iso-8859-15" +Content-Transfer-Encoding: 7bit +Content-Disposition: inline + +This is the first encapsulating message. + +--Boundary-00=_zmUeKB+A8hGfCVZ +Content-Type: message/rfc822; + name="forwarded message" +Content-Transfer-Encoding: 7bit +Content-Description: Thomas McGuire : Test with attachment +Content-Disposition: inline + +From: Thomas McGuire +Subject: Test with attachment +Date: Wed, 5 Aug 2009 10:57:58 +0200 +MIME-Version: 1.0 +Content-Type: Multipart/Mixed; + boundary="Boundary-00=_WmUeKQpGb0DHyx1" + +--Boundary-00=_WmUeKQpGb0DHyx1 +Content-Type: text/plain; + charset="us-ascii" +Content-Transfer-Encoding: 7bit +Content-Disposition: inline + + + + +This is the second encapsulated message. + +--Boundary-00=_WmUeKQpGb0DHyx1 +Content-Type: text/plain; + name="attachment.txt" +Content-Transfer-Encoding: 7bit +Content-Disposition: attachment; + filename="attachment.txt" + +This is an attachment. + +--Boundary-00=_WmUeKQpGb0DHyx1-- + +--Boundary-00=_zmUeKB+A8hGfCVZ-- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/encapsulated-with-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/encapsulated-with-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/encapsulated-with-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/encapsulated-with-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,51 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/encapsulated-with-attachment.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/encapsulated-with-attachment.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/encapsulated-with-attachment.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/encapsulated-with-attachment.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,10 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::EncapsulatedRfc822MessagePart + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/forward-openpgp-signed-encrypted.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/forward-openpgp-signed-encrypted.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/forward-openpgp-signed-encrypted.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/forward-openpgp-signed-encrypted.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,69 @@ +From test@kolab.org Wed, 08 Sep 2010 17:52:37 +0200 +From: OpenPGP Test +Subject: Fwd: OpenPGP signed and encrypted +Date: Wed, 08 Sep 2010 17:52:37 +0200 +User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="nextPart2148910.9CGjQOYhYJ" +Content-Transfer-Encoding: 7Bit + + +--nextPart2148910.9CGjQOYhYJ +Content-Transfer-Encoding: 7Bit +Content-Type: text/plain; charset="us-ascii" + +bla bla bla +--nextPart2148910.9CGjQOYhYJ +Content-Type: message/rfc822 +Content-Disposition: inline; filename="forwarded message" +Content-Description: OpenPGP Test : OpenPGP signed and encrypted + +From: OpenPGP Test +To: test@kolab.org +Subject: OpenPGP signed and encrypted +Date: Tue, 07 Sep 2010 18:08:44 +0200 +User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) +MIME-Version: 1.0 +Content-Type: multipart/encrypted; boundary="nextPart25203163.0xtB501Z4V"; protocol="application/pgp-encrypted" +Content-Transfer-Encoding: 7Bit + + +--nextPart25203163.0xtB501Z4V +Content-Type: application/pgp-encrypted +Content-Disposition: attachment + +Version: 1 +--nextPart25203163.0xtB501Z4V +Content-Type: application/octet-stream +Content-Disposition: inline; filename="msg.asc" + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2.0.15 (GNU/Linux) + +hQEMAwzOQ1qnzNo7AQf7BFYWaGiCTGtXY59bSh3LCXNnWZejblYALxIUNXOFEXbm +y/YA95FmQsy3U5HRCAJV/DY1PEaJz1RTm9bcdIpDC3Ab2YzSwmOwV5fcoUOB2df4 +KjX19Q+2F3JxpPQ0N1gHf4dKfIu19LH+CKeFzUN13aJs5J4A5wlj+NjJikxzmxDS +kDtNYndynPmo9DJQcsUFw3gpvx5HaHvx1cT4mAB2M5cd2l+vN1jYbaWb0x5Zq41z +mRNI89aPieC3rcM2289m68fGloNbYvi8mZJu5RrI4Tbi/D7Rjm1y63lHgVV6AN88 +XAzRiedOeF99LoTBulrJdtT8AAgCs8nCetcWpIffdtLpAZiZkzHmYOU7nqGxqpRk +OVeUTrCn9DW2SMmHjaP4IiKnMvzEycu5F4a72+V1LeMIhMSjTRTq+ZE2PTaqH59z +QsMn7Nb6GlOICbTptRKNNtyJKO7xXlpT7YtvNKnCyEOkH2XrYH7GvpYCiuQ0/o+7 +SxV436ZejiYIg6DQDXJCoa2DXimGp0C10Jh0HwX0BixpoNtwEjkGRYcX6P/JzkH0 +oBood4Ly+Tiu6iVDisrK3AVGYpIzCrKkE9qULTw4R/jFKR2tcCqGb7Fxtk2LV7Md +3S+DyOKrvKQ5GNwbp9OE97pwk+Lr1JS3UAvj5f6BR+1PVNcC0i0wWkgwDjPh1eGD +enMQmorE6+N0uHtH2F4fOxo/TbbA3+zhI25kVW3bO03xyUl/cmQZeb52nvfOvtOo +gSb2j6bPkzljDMPEzrtJjbFtGHJbPfUQYJgZv9OE2EQIqpg6goIw279alBq6GLIX +pkO+dRmztzjcDyhcLxMuQ4cTizel/0J/bU7U6lvwHSyZVbT4Ev+opG5K70Hbqbwr +NZcgdWXbSeesxGM/oQaMeSurOevxVl+/zrTVAek61aRRd1baAYqgi2pf2V7y4oK3 +qkdxzmoFpRdNlfrQW65NZWnHOi9rC9XxANIwnVn3kRcDf+t2K4PrFluI157lXM/o +wX91j88fazysbJlQ6TjsApO9ETiPOFEBqouxCTtCZzlUgyVG8jpIjdHWFnagHeXH ++lXNdYjxnTWTjTxMOZC9ySMpXkjWdFI1ecxVwu6Ik6RX51rvBJAAXWP75yUjPKJ4 +rRi5oQl/VLl0QznO7lvgMPtUwgDVNWO/r7Kn9B387h9fAJZ/kWFAEDW2yhAzABqO +rCNKDzBPgfAwCnikCpMoCbOL7SU8BdbzQHD8/Lkv4m0pzliHQ/KkGF710koBzTmF +N7+wk9pwIuvcrEBQj567 +=GV0c +-----END PGP MESSAGE----- + +--nextPart25203163.0xtB501Z4V-- + +--nextPart2148910.9CGjQOYhYJ-- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/forward-openpgp-signed-encrypted.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/forward-openpgp-signed-encrypted.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/forward-openpgp-signed-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/forward-openpgp-signed-encrypted.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,81 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/forward-openpgp-signed-encrypted.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/forward-openpgp-signed-encrypted.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/forward-openpgp-signed-encrypted.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/forward-openpgp-signed-encrypted.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,9 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::EncapsulatedRfc822MessagePart + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,61 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,58 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-non-encrypted-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,61 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-partially-signed-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-partially-signed-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-partially-signed-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-partially-signed-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,84 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-two-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-two-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-encrypted-two-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,34 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-apple.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-apple.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-apple.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-apple.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,50 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-encrypted-two-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-encrypted-two-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-encrypted-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-encrypted-two-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,58 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-mailinglist+additional-children.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-mailinglist+additional-children.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-mailinglist+additional-children.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-mailinglist+additional-children.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,52 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-no-protocol.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-no-protocol.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-no-protocol.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-no-protocol.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,28 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-two-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-two-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/openpgp-signed-two-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,41 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/smime-signed-apple.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/smime-signed-apple.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/headeronly/smime-signed-apple.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/headeronly/smime-signed-apple.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,50 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/encapsulated-with-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/encapsulated-with-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/encapsulated-with-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/encapsulated-with-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,43 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,61 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,58 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-noData.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-noData.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-noData.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-noData.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,10 @@ + + + + +
+ +
+
+ + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-non-encrypted-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,61 @@ + + + + +
+ + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-partially-signed-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-partially-signed-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-partially-signed-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-partially-signed-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,84 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-two-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-two-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-encrypted-two-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,34 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-signed-apple.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-signed-apple.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-signed-apple.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-signed-apple.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,50 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-signed-encrypted-two-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-signed-encrypted-two-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-signed-encrypted-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-signed-encrypted-two-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,58 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-signed-mailinglist+additional-children.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-signed-mailinglist+additional-children.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-signed-mailinglist+additional-children.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-signed-mailinglist+additional-children.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,44 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-signed-no-protocol.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-signed-no-protocol.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-signed-no-protocol.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-signed-no-protocol.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,28 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-signed-two-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-signed-two-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/openpgp-signed-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/openpgp-signed-two-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,41 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/smime-signed-apple.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/smime-signed-apple.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/hidden/smime-signed-apple.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/hidden/smime-signed-apple.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,50 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/html.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/html.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/html.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/html.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,31 @@ +From foo@example.com Thu, 26 May 2011 01:16:54 +0100 +From: Thomas McGuire +Subject: HTML test +Date: Thu, 26 May 2011 01:16:54 +0100 +Message-ID: <1501334.pROlBb7MZF@herrwackelpudding.localhost> +X-KMail-Transport: GMX +X-KMail-Fcc: 28 +X-KMail-Drafts: 7 +X-KMail-Templates: 9 +User-Agent: KMail/4.6 beta5 (Linux/2.6.34.7-0.7-desktop; KDE/4.6.41; x86_64; git-0269848; 2011-04-19) +MIME-Version: 1.0 +Content-Type: multipart/alternative; boundary="nextPart8606278.tpV19BTJKu" +Content-Transfer-Encoding: 7Bit + + +--nextPart8606278.tpV19BTJKu +Content-Transfer-Encoding: 7Bit +Content-Type: text/plain; charset="windows-1252" + +Some HTML text +--nextPart8606278.tpV19BTJKu +Content-Transfer-Encoding: 7Bit +Content-Type: text/html; charset="windows-1252" + + + +

Some HTML text

+--nextPart8606278.tpV19BTJKu-- + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/html.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/html.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/html.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/html.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,17 @@ + + + + +
+ + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/html.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/html.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/html.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/html.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,2 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::AlternativeMessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/htmlonlyexternal.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/htmlonlyexternal.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/htmlonlyexternal.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/htmlonlyexternal.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,21 @@ +From foo@example.com Thu, 26 May 2011 01:16:54 +0100 +From: Thomas McGuire +Subject: HTML test +Date: Thu, 26 May 2011 01:16:54 +0100 +Message-ID: <1501334.pROlBb7MZF@herrwackelpudding.localhost> +X-KMail-Transport: GMX +X-KMail-Fcc: 28 +X-KMail-Drafts: 7 +X-KMail-Templates: 9 +User-Agent: KMail/4.6 beta5 (Linux/2.6.34.7-0.7-desktop; KDE/4.6.41; x86_64; git-0269848; 2011-04-19) +MIME-Version: 1.0 +Content-Type: text/html +Content-Transfer-Encoding: 7Bit + + + + + +SOME HTML text. + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/htmlonly.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/htmlonly.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/htmlonly.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/htmlonly.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,21 @@ +From foo@example.com Thu, 26 May 2011 01:16:54 +0100 +From: Thomas McGuire +Subject: HTML test +Date: Thu, 26 May 2011 01:16:54 +0100 +Message-ID: <1501334.pROlBb7MZF@herrwackelpudding.localhost> +X-KMail-Transport: GMX +X-KMail-Fcc: 28 +X-KMail-Drafts: 7 +X-KMail-Templates: 9 +User-Agent: KMail/4.6 beta5 (Linux/2.6.34.7-0.7-desktop; KDE/4.6.41; x86_64; git-0269848; 2011-04-19) +MIME-Version: 1.0 +Content-Type: text/html +Content-Transfer-Encoding: 7Bit + + + + + +SOME HTML text. + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/htmlonly.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/htmlonly.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/htmlonly.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/htmlonly.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,12 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/htmlonly.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/htmlonly.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/htmlonly.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/htmlonly.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,2 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::HtmlMessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/iconic/openpgp-encrypted-partially-signed-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/iconic/openpgp-encrypted-partially-signed-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/iconic/openpgp-encrypted-partially-signed-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/iconic/openpgp-encrypted-partially-signed-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,92 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/iconic/openpgp-encrypted-two-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/iconic/openpgp-encrypted-two-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/iconic/openpgp-encrypted-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/iconic/openpgp-encrypted-two-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,50 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/iconic/openpgp-signed-encrypted-two-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/iconic/openpgp-signed-encrypted-two-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/iconic/openpgp-signed-encrypted-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/iconic/openpgp-signed-encrypted-two-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,74 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/iconic/openpgp-signed-two-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/iconic/openpgp-signed-two-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/iconic/openpgp-signed-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/iconic/openpgp-signed-two-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,57 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlined/encapsulated-with-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlined/encapsulated-with-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlined/encapsulated-with-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlined/encapsulated-with-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,58 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlined/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlined/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlined/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlined/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,90 @@ + + + + +
+ + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlined/openpgp-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlined/openpgp-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlined/openpgp-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlined/openpgp-encrypted-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,74 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlined/openpgp-encrypted-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlined/openpgp-encrypted-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlined/openpgp-encrypted-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlined/openpgp-encrypted-non-encrypted-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,74 @@ + + + + +
+ + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlined/openpgp-signed-apple.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlined/openpgp-signed-apple.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlined/openpgp-signed-apple.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlined/openpgp-signed-apple.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,63 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlined/openpgp-signed-mailinglist+additional-children.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlined/openpgp-signed-mailinglist+additional-children.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlined/openpgp-signed-mailinglist+additional-children.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlined/openpgp-signed-mailinglist+additional-children.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,67 @@ + + + + +
+ + +
+ + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlined/smime-signed-apple.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlined/smime-signed-apple.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlined/smime-signed-apple.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlined/smime-signed-apple.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,63 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted-appendix.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted-appendix.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted-appendix.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted-appendix.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,33 @@ +From test@kolab.org Wed, 25 May 2011 23:49:40 +0100 +From: OpenPGP Test +To: test@kolab.org +Subject: inlinepgpencrypted +Date: Wed, 25 May 2011 23:49:40 +0100 +Message-ID: <1786696.yKXrOjjflF@herrwackelpudding.localhost> +X-KMail-Transport: GMX +X-KMail-Fcc: 28 +X-KMail-Drafts: 7 +X-KMail-Templates: 9 +User-Agent: KMail/4.6 beta5 (Linux/2.6.34.7-0.7-desktop; KDE/4.6.41; x86_64; git-0269848; 2011-04-19) +MIME-Version: 1.0 +Content-Transfer-Encoding: 7Bit +Content-Type: text/plain; charset="us-ascii" + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2.0.15 (GNU/Linux) + +hQEMAwzOQ1qnzNo7AQf/a3aNTLpQBfcUr+4AKsZQLj4h6z7e7a5AaCW8AG0wrbxN +kBYB7E5jdZh45DX/99gvoZslthWryUCX2kKZ3LtIllxKVjqNuK5hSt+SAuKkwiMR +Xcbf1KFKENKupgGSO9B2NJRbjoExdJ+fC3mGXnO3dT7xJJAo3oLE8Nivu+Bj1peY +E1wCf+vcTwVHFrA7SV8eMRb9Z9wBXmU8Q8e9ekJ7ZsRX3tMeBs6jvscVvfMf6DYY +N14snZBZuGNKT9a3DPny7IC1S0lHcaam34ogWwMi3FxPGJt/Lg52kARlkF5TDhcP +N6H0EB/iqDRjOOUoEVm8um5XOSR1FpEiAdD0DON3y9JPATnrYq7sgYZz3BVImYY+ +N/jV8fEiN0a34pcOq8NQedMuOsJHNBS5MtbQH/kJLq0MXBpXekGlHo4MKw0trISc +Rw3pW6/BFfhPJLni29g9tw== +=fRFW +-----END PGP MESSAGE----- + +_______________________________________________ +test mailing list +test@lists.kde.org +http://kde.org diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted-appendix.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted-appendix.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted-appendix.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted-appendix.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,36 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted-appendix.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted-appendix.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted-appendix.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted-appendix.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::TextMessagePart + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted-error.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted-error.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted-error.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted-error.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,55 @@ +From test@kolab.org Wed, 25 May 2011 23:49:40 +0100 +From: OpenPGP Test +To: test@kolab.org +Subject: inlinepgpencrypted - no seckey +Date: Wed, 25 May 2011 23:49:40 +0100 +Message-ID: <1786696.yKXrOjjflF@herrwackelpudding.localhost> +X-KMail-Transport: GMX +X-KMail-Fcc: 28 +X-KMail-Drafts: 7 +X-KMail-Templates: 9 +User-Agent: KMail/4.6 beta5 (Linux/2.6.34.7-0.7-desktop; KDE/4.6.41; x86_64; git-0269848; 2011-04-19) +MIME-Version: 1.0 +Content-Transfer-Encoding: 7Bit +Content-Type: text/plain; charset="us-ascii" + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hQIMA1U9QmLaS63yAQ/8C8o5D7wQ9LoPHrNCNelku19bwQogTIqxRJSTYzO0b0tr +Pb7Oyxkm1XabYxhg9bxFcNvvAbxcbzmnFJqkVPzCird43N5BDMtwGumiUjNNYVgy +4tD6hs+h8GsmmQ5/J5cmuUwA+Ee20ubrTMH2qkU75WcyuRAG+IFsA80eEKG5qR8y +i2WXjBiImcmjrEVtSA3L+mUHmhuWxz/46EnCelSAJMfhSG8zuTJnK6OFBSDQNkqE +NRJl0PO4DYDeJiSYeXWEB2GTvc9JXtcHm7wIwzHXHSrBlXvQWEj5B8z9GSOJwO0o +JuV29TVU4iDU8d3flfhMGZEJXUkIIwt66/0CtuJNDmIAnqc4wQO9LtXFXOI/YK7x +twidnLY04kmh1bZfQsUBhwdYqLUzr0AXqE2kRTozod4XgVBmphVt6Ytu11L1UFdb +1wKBaQG/qmhOmeMJb7eJX6I66p8LzKiqkfNlTnPQURELMbCmiRwoDCC5wnrDj8g/ +K0zvfNRFbGimbTHeQ01OncoVcRIlXK7njM6dTTqnglzwZagHn1Ph0krkdbnzLJkc +j8v1QLWuM1ttMIgW5xu4R4cjSSuLZKtZNmnlQe1e5rllZbwIFlUVH/SRNblAnRi5 +GUPDJWLZJppfFk2H1pjgze4s9oZljEKXzeOa/pfrfcZ8BVmg7UnKnMyygVH1+4aF +BA4D9uaj0SbGMOAQEACfyo8uFl+Yq9XwFbAJmeSP3/AMG2HhfCNgkGkcjE+EykTm +/jn/Emscw1QyjonX1RcOvtFHbI7VsUblCcJngytfikSgM/5U/NniPtrdqohOhjgO +WJ+TxWhO4K64WaBzq5E5Q+7S2ciZTkz3tlZ2jRI0pjTxuvxVUV5fHwlES7ZfHCUg +F4eGGFU7xz3gxC6Wt6OV2EGP7wa1qf430fa5bmLZ1QsJY7l+ApbqOoWqfDmjhN6o +qf6xEtt+xx41lakdWg05VPYzkhDv7FHb2pGWeLRZpG5Rblg3LVi94lGyXstNcFre +cudq5kM2rPB9/LL65qq54KB2BsXgBSuihvRpryHqv7PSSBw+Gx5wOWZ/DZOS2RvV +UsrpN1M8XqJYUX/AExzSajsABQkbLj3Gw1WRyed7Sokrrus9fXJy25FXQ3AjBEQZ +vl8nrsEFWFQIi8s3NWoHz6IU9jyDWzJp2Twi/PKVfe7r7aMeHGRJJWMvVQbIjPEW +C8GqjyVPZmmGw5Eo6V95kwF1ED6UZaEdEYLdgKIoXwL1epil2mEaX0AuugN1vkHr +35gyHosJC0dWtNRGoSh7nGR4uwEDs6Sf9J87b+QAGbbDgePprH6AAq0qsLxc0SNO +OWFzo8/CeA4KjsYXTCsIOov99TomqI93bP9BrhNBra4RMBxjsfZ5FL2X3cCwKBAA +jPFVgrctgkX3piwu58Zi5OpRbiXOLF6PdPaBjwyD3cFIU+TmdSLU0zGG/uCkwL3U +LSHhHEdf8D5laasulX7Bz72X2DXSKraoHu8tSa2f/gBRrEOSJV86yw6FAxLCn3Lm +NCn/cSKskO/m/J2WGhiHgFSe/4OrFpqx78tWKM+XheAgz6No9vPT9KooEyKqCwlS +lI7QHhLl9eWmT1NPRibfdL9aMzjPfxmE91vaN29NnxQJG2w7KnI7sxXvZljOvuSI +FE9NvGs2uHjRFjO0Vncjuv/fAbdvVvkTCSyLWZLUyOegJa/0KZOU48HtwwBzVxl1 +D9joee2bmQnmxuGomRwelUVbux1GKRhfCtnNuKQNXU7NP3AnNUDAQjrQSD5C1f3e +9tPOi3wRuXnlYfBcmemKUrdYNVpWBpHh+KnJ1rW/NqwNvUtq0ucYIT5//dKaPiIf +HqizKm0MntFbIv4f29TNfw5Wp1GcTXc6Dmt/KSCjLH+IxPtdAgI5ZlrdOfVxlY1B +abIFKjN0csPfkfX7l8g6ekOYgP/NRHQQs7Zyds59Zj7Roi7+uabV8svXRREm0V34 +595ro3cEzABOAnErxErC7Lm/VUI348kdOP/3IAckmwv1qts3P2eDA6CcLYE2V+sz +7mb9UGrUzu8hBxPjbuqIYfi2XOSxGRCvSH0Rmw7XzKfSRwHpusUQjpCbRXyntVqY +Db8+PufLBENx22ipLLEDltP1P9zRuy2KpANd0sggM/HtUC3Bjta7IR9Q3qbVcPDx +3Qu241eOBdb6 +=J3lb +-----END PGP MESSAGE----- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted-error.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted-error.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted-error.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted-error.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,24 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted-error.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted-error.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted-error.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted-error.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,3 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::TextMessagePart + * MimeTreeParser::EncryptedMessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,29 @@ +From test@kolab.org Wed, 25 May 2011 23:49:40 +0100 +From: OpenPGP Test +To: test@kolab.org +Subject: inlinepgpencrypted +Date: Wed, 25 May 2011 23:49:40 +0100 +Message-ID: <1786696.yKXrOjjflF@herrwackelpudding.localhost> +X-KMail-Transport: GMX +X-KMail-Fcc: 28 +X-KMail-Drafts: 7 +X-KMail-Templates: 9 +User-Agent: KMail/4.6 beta5 (Linux/2.6.34.7-0.7-desktop; KDE/4.6.41; x86_64; git-0269848; 2011-04-19) +MIME-Version: 1.0 +Content-Transfer-Encoding: 7Bit +Content-Type: text/plain; charset="us-ascii" + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2.0.15 (GNU/Linux) + +hQEMAwzOQ1qnzNo7AQf/a3aNTLpQBfcUr+4AKsZQLj4h6z7e7a5AaCW8AG0wrbxN +kBYB7E5jdZh45DX/99gvoZslthWryUCX2kKZ3LtIllxKVjqNuK5hSt+SAuKkwiMR +Xcbf1KFKENKupgGSO9B2NJRbjoExdJ+fC3mGXnO3dT7xJJAo3oLE8Nivu+Bj1peY +E1wCf+vcTwVHFrA7SV8eMRb9Z9wBXmU8Q8e9ekJ7ZsRX3tMeBs6jvscVvfMf6DYY +N14snZBZuGNKT9a3DPny7IC1S0lHcaam34ogWwMi3FxPGJt/Lg52kARlkF5TDhcP +N6H0EB/iqDRjOOUoEVm8um5XOSR1FpEiAdD0DON3y9JPATnrYq7sgYZz3BVImYY+ +N/jV8fEiN0a34pcOq8NQedMuOsJHNBS5MtbQH/kJLq0MXBpXekGlHo4MKw0trISc +Rw3pW6/BFfhPJLni29g9tw== +=fRFW +-----END PGP MESSAGE----- + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,26 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted.mbox.inProgress.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted.mbox.inProgress.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted.mbox.inProgress.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted.mbox.inProgress.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,24 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/inlinepgpencrypted.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/inlinepgpencrypted.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,3 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::TextMessagePart + * MimeTreeParser::EncryptedMessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/mailheader.css kf5-messagelib-16.12.3/mimetreeparser/autotests/data/mailheader.css --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/mailheader.css 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/mailheader.css 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,512 @@ +div.header { + margin-bottom: 10pt ! important; +} + +table.textAtm { + margin-top: 10pt ! important; + margin-bottom: 10pt ! important; +} + +tr.textAtmH, +tr.textAtmB, +tr.rfc822B { + font-weight: normal ! important; +} + +tr.signInProgressH, +tr.rfc822H, +tr.encrH, +tr.signOkKeyOkH, +tr.signOkKeyBadH, +tr.signWarnH, +tr.signErrH { + font-weight: bold ! important; +} + +tr.textAtmH td, +tr.textAtmB td { + padding: 3px ! important; +} + +table.rfc822 { + width: 100% ! important; + border: solid 1px black ! important; + margin-top: 10pt ! important; + margin-bottom: 10pt ! important; +} + +table.textAtm, +table.encr, +table.signWarn, +table.signErr, +table.signOkKeyBad, +table.signOkKeyOk, +table.signInProgress, +div.fancy.header table { + width: 100% ! important; + border-width: 0px ! important; + line-height: normal; +} + +div.htmlWarn { + margin: 0px 5% ! important; + padding: 10px ! important; + text-align: left ! important; + line-height: normal; +} + +div.fancy.header > div { + font-weight: bold ! important; + padding: 4px ! important; + line-height: normal; +} + +div.fancy.header table { + padding: 2px ! important; + text-align: left ! important; + border-collapse: separate ! important; +} + +div.fancy.header table th { + font-family: "Sans Serif" ! important; + font-size: 0px ! important; + + padding: 0px ! important; + white-space: nowrap ! important; + border-spacing: 0px ! important; + text-align: left ! important; + vertical-align: top ! important; + background-color: #d6d2d0 ! important; + color: #221f1e ! important; + border: 1px ! important; +} + +div.fancy.header table td { + font-family: "Sans Serif" ! important; + font-size: 0px ! important; + + padding: 0px ! important; + border-spacing: 0px ! important; + text-align: left ! important; + vertical-align: top ! important; + width: 100% ! important; + background-color: #d6d2d0 ! important; + color: #221f1e ! important; + border: 1px ! important; +} + +div.fancy.header table a:hover { + background-color: transparent ! important; +} + +span.pimsmileytext { + position: absolute; + top: 0px; + left: 0px; + visibility: hidden; +} + +img.pimsmileyimg { +} + +div.quotelevelmark { + position: absolute; + margin-left:-10px; +} + +@media screen { + +body { + font-family: "Sans Serif" ! important; + font-size: 0px ! important; + color: #1f1c1b ! important; + background-color: #ffffff ! important; +} + +a { + color: #0057ae ! important; + text-decoration: none ! important; +} + +a.white { + color: white ! important; +} + +a.black { + color: black ! important; +} + +table.textAtm { background-color: #1f1c1b ! important; } + +tr.textAtmH { + background-color: #ffffff ! important; + font-family: "Sans Serif" ! important; + font-size: 0px ! important; +} + +tr.textAtmB { + background-color: #ffffff ! important; +} + +table.signInProgress, +table.rfc822 { + background-color: #ffffff ! important; +} + +tr.signInProgressH, +tr.rfc822H { + font-family: "Sans Serif" ! important; + font-size: 0px ! important; +} + +table.encr { + background-color: #0069cc ! important; +} + +tr.encrH { + background-color: #0080ff ! important; + color: #ffffff ! important; + font-family: "Sans Serif" ! important; + font-size: 0px ! important; +} + +tr.encrB { background-color: #e0f0ff ! important; } + +table.signOkKeyOk { + background-color: #33cc33 ! important; +} + +tr.signOkKeyOkH { + background-color: #40ff40 ! important; + color: #27ae60 ! important; + font-family: "Sans Serif" ! important; + font-size: 0px ! important; +} + +tr.signOkKeyOkB { background-color: #e8ffe8 ! important; } + +table.signOkKeyBad { + background-color: #cccc33 ! important; +} + +tr.signOkKeyBadH { + background-color: #ffff40 ! important; + color: #f67400 ! important; + font-family: "Sans Serif" ! important; + font-size: 0px ! important; +} + +tr.signOkKeyBadB { background-color: #ffffe8 ! important; } + +table.signWarn { + background-color: #cccc33 ! important; +} + +tr.signWarnH { + background-color: #ffff40 ! important; + color: #f67400 ! important; + font-family: "Sans Serif" ! important; + font-size: 0px ! important; +} + +tr.signWarnB { background-color: #ffffe8 ! important; } + +table.signErr { + background-color: #cc0000 ! important; +} + +tr.signErrH { + background-color: #ff0000 ! important; + color: #da4453 ! important; + font-family: "Sans Serif" ! important; + font-size: 0px ! important; +} + +tr.signErrB { background-color: #ffe0e0 ! important; } + +div.htmlWarn { + border: 2px solid #ff4040 ! important; + line-height: normal; +} + +div.header { + font-family: "Sans Serif" ! important; + font-size: 0px ! important; +} + +div.fancy.header > div { + background-color: #43ace8 ! important; + color: #ffffff ! important; + border: solid #221f1e 1px ! important; + line-height: normal; +} + +div.fancy.header > div a[href] { color: #ffffff ! important; } + +div.fancy.header > div a[href]:hover { text-decoration: underline ! important; } + +div.fancy.header > div.spamheader { + background-color: #cdcdcd ! important; + border-top: 0px ! important; + padding: 3px ! important; + color: black ! important; + font-weight: bold ! important; + font-size: smaller ! important; +} + +div.fancy.header > table.outer { + background-color: #d6d2d0 ! important; + color: #221f1e ! important; + border-bottom: solid #221f1e 1px ! important; + border-left: solid #221f1e 1px ! important; + border-right: solid #221f1e 1px ! important; +} + +div.senderpic{ + padding: 0px ! important; + font-size:0.8em ! important; + border:1px solid #b3aba7 ! important; + background-color:#d6d2d0 ! important; +} + +div.senderstatus{ + text-align:center ! important; +} + +div.quotelevel1 { + color: #008000 ! important; + font-style: italic ! important; +} + +div.quotelevel2 { + color: #007000 ! important; + font-style: italic ! important; +} + +div.quotelevel3 { + color: #006000 ! important; + font-style: italic ! important; +} + +div.deepquotelevel1 { + color: #008000 ! important; + font-style: italic ! important; +} + +div.deepquotelevel2 { + color: #007000 ! important; + font-style: italic ! important; +} + +div.deepquotelevel3 { + color: #006000 ! important; + font-style: italic ! important; +} + +blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #008000; + unicode-bidi: -webkit-plaintext +} + +blockquote blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #007000; + unicode-bidi: -webkit-plaintext +} + +blockquote blockquote blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #006000; + unicode-bidi: -webkit-plaintext +} + +blockquote blockquote blockquote blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #008000; + unicode-bidi: -webkit-plaintext +} + +blockquote blockquote blockquote blockquote blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #007000; + unicode-bidi: -webkit-plaintext +} + +blockquote blockquote blockquote blockquote blockquote blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #006000; + unicode-bidi: -webkit-plaintext +} + +blockquote blockquote blockquote blockquote blockquote blockquote blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #008000; + unicode-bidi: -webkit-plaintext +} + +blockquote blockquote blockquote blockquote blockquote blockquote blockquote blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #007000; + unicode-bidi: -webkit-plaintext +} + +blockquote blockquote blockquote blockquote blockquote blockquote blockquote blockquote blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #006000; + unicode-bidi: -webkit-plaintext +} + +.quotemarks{ + color:transparent; + font-size:0px; +} + +} +@media print { + +body { + font-family: "Sans Serif" ! important; + font-size: 9pt ! important; + color: #000000 ! important; + background-color: #ffffff ! important +} + +tr.textAtmH, +tr.signInProgressH, +tr.rfc822H, +tr.encrH, +tr.signOkKeyOkH, +tr.signOkKeyBadH, +tr.signWarnH, +tr.signErrH, +div.header { + font-family: "Sans Serif" ! important; + font-size: 9pt ! important; +} + +div.fancy.header > div { + background-color: #d6d2d0 ! important; + color: #221f1e ! important; + padding: 4px ! important; + border: solid #221f1e 1px ! important; + line-height: normal; +} + +div.fancy.header > div a[href] { color: #221f1e ! important; } + +div.fancy.header > table.outer{ + background-color: #d6d2d0 ! important; + color: #221f1e ! important; + border-bottom: solid #221f1e 1px ! important; + border-left: solid #221f1e 1px ! important; + border-right: solid #221f1e 1px ! important; +} + +div.spamheader { + display:none ! important; +} + +div.htmlWarn { + border: 2px solid #ffffff ! important; + line-height: normal; +} + +div.senderpic{ + font-size:0.8em ! important; + border:1px solid black ! important; + background-color:#d6d2d0 ! important; +} + +div.senderstatus{ + text-align:center ! important; +} + +div.noprint { + display:none ! important; +} + +blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #008000; + unicode-bidi: -webkit-plaintext +} + +blockquote blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #007000; + unicode-bidi: -webkit-plaintext +} + +blockquote blockquote blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #006000; + unicode-bidi: -webkit-plaintext +} + +blockquote blockquote blockquote blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #008000; + unicode-bidi: -webkit-plaintext +} + +blockquote blockquote blockquote blockquote blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #007000; + unicode-bidi: -webkit-plaintext +} + +blockquote blockquote blockquote blockquote blockquote blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #006000; + unicode-bidi: -webkit-plaintext +} + +blockquote blockquote blockquote blockquote blockquote blockquote blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #008000; + unicode-bidi: -webkit-plaintext +} + +blockquote blockquote blockquote blockquote blockquote blockquote blockquote blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #007000; + unicode-bidi: -webkit-plaintext +} + +blockquote blockquote blockquote blockquote blockquote blockquote blockquote blockquote blockquote { + margin: 4pt 0 4pt 0; + padding: 0 0 0 1em; + border-left: 2px solid #006000; + unicode-bidi: -webkit-plaintext +} + +.quotemarks{ + color:transparent; + font-size:0px; +} + +.quotemarksemptyline{ + color:transparent; + font-size:0px; + line-height: 12pt; +} + +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/no-content-type.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/no-content-type.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/no-content-type.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/no-content-type.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,7 @@ +From: hans@example.com +To: karl@example.com +Subject: Simple Mail Without Content-Type Header +Date: Sat, 15 May 2010 10:52:24 +0200 +MIME-Version: 1.0 + +asdfasdf \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/no-content-type.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/no-content-type.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/no-content-type.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/no-content-type.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,14 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/no-content-type.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/no-content-type.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/no-content-type.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/no-content-type.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,3 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encoded.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encoded.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encoded.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encoded.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,33 @@ +Content-Type: text/plain; charset="us-ascii" +Content-Transfer-Encoding: 7bit + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +owGdk31MlVUcx5G3jClvI1JH7GiOil0uYJATBW8FK6HkDtBJI93heQ6Xk8/L9Tnn +XExALDfJQaJutl4UzUoCIxDwos0XTLktqJaJkJE5QAU3yMKpkRqdc+GC/dsfz/bs +ec7v+/v+Pr/v2TnbxytgxvUt8T99cCirZEa9zw/5fopuIHX1xsjjr4gXgO2EqUDW ++WdAMAVQRdQEJF0jSKKIMgNAGdsxkbBmA0jB1AxSdQ1JAAIZQxUo/BgjZpCN5Kn6 +SVEVMgPzX69CJCENEqFqYwgo2MYUCKAENjCu4MAOZBgQCNH/9NUoAoVIkw1kTLfl +6qquKJhMeDYDqwERQRoVf9yOkI2/KTgfGbp4J5R3ViGlvGTKoANTiABk3I4ZrORF +FGsSlhmXmTSJNKyaAKPArhsUAjc1oECOAcOHbXp8samehJOAhsSAAxViSUzKFGpg +CSPCoWm6BiiXFNb/9waeRxqCmuhpM6ADy5P+zGAVBbyAHwYF/CQxATtTHFiDXIP7 +Uu3IEPZMDytieYokUhQOEpENTLCRuEegYYLFERXatMm5+dIoINCGBVIzeJEZMB8L +mzK043xG3OimUQvHwF4IDUT5kqc5FyBmw1yJd1AAFtZkjKh7BN7GAd07nkSK+ayG +5gEpOEoSUwnUPPQFc13GfOGGTjwfPcFSMQ8aF3OnbRoIDxJUEGGQ43PvyyjUNYm5 +R+L+dQnzGg1SXeCw8wDTiemoG4YIIH/s0OCjY5E/VRfsTLyESO61GVgW++c1qlBd +oQGDUYNre9xPB0NcEnFZJoPppi4o83gU8MxxFCK9Ewvk94bz4Lk2B2z3jvD1mhHg +5e/nLW60V8CjwZ7LTpKCxjNIzhNRXcER/6RVXUzaGdocqGY3vd+5LO7+qSV3pdFP ++s6tv3Jp8EZg+V9qza9zKhf4b3xn4MfVSYOW+qaihPsHrc3O5hpzXCV77sROqxWw +vbfaOrpClvTszr8+8pVc/ELc0aeOm+856kqfDYNZmUXt33+Y1nLT4nvH0tomz47f +tfzP+dlpQW8vRj3v+qcXyXpef3Hvldy2gfECZ3LMGdMomlsR8fQm42zMcLh3eW1N +Xszwqt5dLXimuVk6vb+/etNN8xgeuhoWeb79myzXg9jUv11xbQ8OR9/wnXP7QGzj +kWN+v+RpX58qa2dbTr2VeMn/aPJrOZ3ZYS0dW7s6dhcu/3lzT1DdhS8zGgIrynIH +tjkf21tmXtZ8pOjj/a7xsahsEGKxLG4h+St9Oj9ace1kn1+vdWl06+nEvhPlOWnh +5OVrw1nzTv6+pjo3K9Vr3YFZeZmu6K1jA2OW7M96Bs85ChL23ck95Cx5/bfuHeX3 +wktCXYN1/fvWpxxIfyk2/pm0N4bCRyrfS8z13VPNMr6rckbuP1YS2rp0z27X/FEy +FPHm4OHHv7iXsuaPg5dpg6XWN9B/SG/81Bq8tv5WwMjFRVUZId6Rn+sL68uudls3 +z+vMvLwwrdw5t+Pb5ISuppDUVkvmme4nTahhwYX7setmpdxt29ZeO5MFPFK6Pep2 ++nlHdfFa78ZFpSMV/Q1n/wU= +=zzr4 +-----END PGP MESSAGE----- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encoded.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encoded.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encoded.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encoded.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,35 @@ + + + + +
+ +
+ + + + + + + + + + +
+ + + + + +
Not enough information to check signature validity. + Show Details +
+
+
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor. Pellentesque auctor nisi id magna consequat sagittis. Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet. Ut convallis libero in urna ultrices accumsan. Donec sed odio eros. Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisi at sem facilisis semper ac in est.
+
+
End of signed message
+
+
+ + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encoded.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encoded.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encoded.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encoded.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::TextMessagePart + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::SignedMessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-applemail.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-applemail.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-applemail.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-applemail.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,52 @@ +Received: from konqi +From: "Konqui" +To: "Bird" +Subject: gpg problem 1/2 +Date: Tue, 22 Mar 2016 17:09:18 +0100 +Message-ID: <123456@example.org> +Accept-Language: de-DE, en-US +Content-Language: en-US +Content-Type: multipart/mixed; + boundary="_003_55514CDCA78D430384C5F0810DF10C7Adsmpgde_" +MIME-Version: 1.0 + + +--_003_55514CDCA78D430384C5F0810DF10C7Adsmpgde_ +Content-Type: text/plain; charset="us-ascii" + + +--_003_55514CDCA78D430384C5F0810DF10C7Adsmpgde_ +Content-Type: application/pgp-encrypted; + name="PGPMIME Versions Identification" +Content-Description: PGP/MIME Versions Identification +Content-Disposition: attachment; filename="PGPMIME Versions Identification"; + size=77; creation-date="Tue, 22 Mar 2016 16:09:18 GMT"; + modification-date="Tue, 22 Mar 2016 16:09:18 GMT" +Content-ID: +Content-Transfer-Encoding: base64 + +VmVyc2lvbjogMQ0NCg== + +--_003_55514CDCA78D430384C5F0810DF10C7Adsmpgde_ +Content-Type: application/octet-stream; name="encrypted.asc" +Content-Description: OpenPGP encrypted message.asc +Content-Disposition: attachment; filename="encrypted.asc"; size=872; + creation-date="Tue, 22 Mar 2016 16:09:18 GMT"; + modification-date="Tue, 22 Mar 2016 16:09:18 GMT" +Content-ID: <58A712E65AB1824AB726904A6449178F@example.org> +Content-Transfer-Encoding: base64 + +LS0tLS1CRUdJTiBQR1AgTUVTU0FHRS0tLS0tClZlcnNpb246IEdudVBHIHYxCkNvbW1lbnQ6IFVz +aW5nIEdudVBHIHdpdGggSWNlZG92ZSAtIGh0dHA6Ly93d3cuZW5pZ21haWwubmV0LwoKaEl3REdK +bHRoVFQ3b3EwQkEvOU50TExYYmlJSlZTNnBPeW53RWVTem5yUUs3a1lWbGE4Uk00My8vSkVDQ2tH +SgphekVhU0J6bmFiQnY2ZXBhRm1RdFZITE1YbENiWm5NbVc5bG95cVBCZk1vQW1zNmtLS0JkRy9q +cWh1czg5aVhFCitzZVhuZ0MyMzNWYS9nWk1iMkR4T3FJb2tWTmZqOXRwUjd4UTh3Uy9qSFREaUxO +YzFHT1FDN2t1NDJ6MmJOTEEKSVFGUkQvcWJCRno4OWhVNHdQNGNZb0F5c09uRURvakZyc3JuQ2lk +VEhKT0pybmRNNlBQVXRIL2pRQ3lmci9FRwoydFNwSndZS3ZtVDZseTN5cWFHTEJ0UlBJeGl2K2RN +ZSs3eXcwdDQwcWJqdnZhVEdhdkVyRUJKRUtYNWVXYlROCi9zamFqSHBVSHFzNlNJaU1oZUg5ZHIr +V2Z6Rk9OdFZiUEVnR1JtT0VSaGxnVGwvbkxvODZBWnBqSnJvSUdLSkoKdFRIQ2NvUUdBV0crTjd3 +ckNFMVJ4UjBra01zNG5Sb3pqMFRMdTZaeVhNcytIMDYzTWV3VFBOeE5BaVFUMU5iaQp1ZEtXbWZM +Qmx4bjA2cCtKRHpVS3hqOFBGd09iZGJ4VHZBQ3piQXZCWTFhSE1RPT0KPW1MbDMKLS0tLS1FTkQg +UEdQIE1FU1NBR0UtLS0tLQoK + +--_003_55514CDCA78D430384C5F0810DF10C7Adsmpgde_-- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-applemail.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-applemail.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-applemail.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-applemail.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,39 @@ + + + + +
+ + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-applemail.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-applemail.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-applemail.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-applemail.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,7 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,115 @@ +From test@kolab.org Fri May 01 15:12:47 2015 +From: testkey +To: you@you.com +Subject: enc & non enc attachment +Date: Fri, 01 May 2015 17:12:47 +0200 +Message-ID: <13897561.XENKdJMSlR@tabin.local> +X-KMail-Identity: 1197256126 +User-Agent: KMail/4.13.0.1 (Linux/3.19.1-towo.1-siduction-amd64; KDE/4.14.2; x86_64; git-cd33034; 2015-04-11) +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="nextPart1939768.sIoLGH0PD8" +Content-Transfer-Encoding: 7Bit + +This is a multi-part message in MIME format. + +--nextPart1939768.sIoLGH0PD8 +Content-Type: multipart/encrypted; boundary="nextPart2814166.CHKktCGlQ3"; protocol="application/pgp-encrypted" + + +--nextPart2814166.CHKktCGlQ3 +Content-Type: application/pgp-encrypted +Content-Disposition: attachment +Content-Transfer-Encoding: 7Bit + +Version: 1 +--nextPart2814166.CHKktCGlQ3 +Content-Type: application/octet-stream +Content-Disposition: inline; filename="msg.asc" +Content-Transfer-Encoding: 7Bit + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hIwDGJlthTT7oq0BA/9cXFQ6mN9Vxnc2B9M10odS3/6z1tsIY9oJdsiOjpfxqapX +P7nOzR/jNWdFQanXoG1SjAcY2FeZEN0c3SkxEM6R5QVF1vMh/Xsni1clI+peZyVT +Z4OSU74YCfYLg+cgDnPCF3kyNPVe6Z1pnfWOCZNCG3rpApw6UVLN63ScWC6eQIUB +DAMMzkNap8zaOwEIANKHn1svvj+hBOIZYf8R+q2Bw7cd4xEChiJ7uQLnD98j0Fh1 +85v7/8JbZx6rEDDenPp1mCciDodb0aCmi0XLuzJz2ANGTVflfq+ZA+v1pwLksWCs +0YcHLEjOJzjr3KKmvu6wqnun5J2yV69K3OW3qTTGhNvcYZulqQ617pPa48+sFCgh +nM8TMAD0ElVEwmMtrS3AWoJz52Af+R3YzpAnX8NzV317/JG+b6e2ksl3tR7TWp1q +2FOqC1sXAxuv+DIz4GgRfaK1+xYr2ckkg+H/3HJqa5LmJ7rGCyv+Epfp9u+OvdBG +PBvuCtO3tm0crmnttMw57Gy35BKutRf/8MpBj/nS6QFX0t7XOLeL4Me7/a2H20wz +HZsuRGDXMCh0lL0FYCBAwdbbYvvy0gz/5iaNvoADtaIu+VtbFNrTUN0SwuL+AIFS ++WIiaSbFt4Ng3t9YmqL6pqB7fjxI10S+PK0s7ABqe4pgbzUWWt1yzBcxfk8l/47Q +JrlvcE7HuDOhNOHfZIgUP2Dbeu+pVvHIJbmLsNWpl4s+nHhoxc9HrVhYG/MTZtQ3 +kkUWviegO6mwEZjQvgBxjWib7090sCxkO847b8A93mfQNHnuy2ZEEJ+9xyk7nIWs +4RsiNR8pYc/SMvdocyAvQMH/qSvmn/IFJ+jHhtT8UJlXJ0bHvXTHjHMqBp6fP69z +Jh1ERadWQdMaTkzQ+asl+kl/x3p6RZP8MEVbZIl/3pcV+xiFCYcFu2TETKMtbW+b +NYOlrltFxFDvyu3WeNNp0g9k0nFpD/T1OXHRBRcbUDWE4QF6NWTm6NO9wy2UYHCi +7QTSecBWgMaw7cUdwvnW6chIVoov1pm69BI9D0PoV76zCI7KzpiDsTFxdilKwbQf +K/PDnv9Adx3ERh0/F8llBHrj2UGsRs4aHSEBDBJIHDCp8+lqtsRcINQBKEU3qIjt +wf5vizdaVIgQnsD2z8QmBQ7QCCipI0ur6GKl+YWDDOSDLDUs9dK4A6xo/4Q0bsnI +rH63ti5HslGq6uArfFkewH2MWff/8Li3uGEqzpK5NhP5UpbArelK+QaQQP5SdsmW +XFwUqDS4QTCKNJXw/5SQMl8UE10l2Xaav3TkiOYTcBcvPNDovYgnMyRff/tTeFa8 +83STkvpGtkULkCntp22fydv5rg6DZ7eJrYfC2oZXdM87hHhUALUO6Y/VtVmNdNYw +F3Uim4PDuLIKt+mFqRtFqnWm+5X/AslC31qLkjH+Fbb83TY+mC9gbIn7CZGJRCjn +zzzMX2h15V/VHzNUgx9V/h28T0/z25FxoozZiJxpmhOtqoxMHp+y6nXXfMoIAD1D +963Pc7u1HS0ny54A7bqc6KKd4W9IF7HkXn3SoBwCyn0IOPoKQTDD8mW3lbBI6+h9 +vP+MAQpfD8s+3VZ9r7OKYCVmUv47ViTRlf428Co6WT7rTHjGM09tqz826fTOXA== +=6Eu9 +-----END PGP MESSAGE----- + +--nextPart2814166.CHKktCGlQ3-- + +--nextPart1939768.sIoLGH0PD8 +Content-Disposition: attachment; filename="image.png" +Content-Transfer-Encoding: base64 +Content-Type: image/png; name="image.png" + +iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAlwSFlzAAAb +rwAAG68BXhqRHAAAAAd0SU1FB9gHFg8aNG8uqeIAAAAGYktHRAD/AP8A/6C9p5MAAAkqSURBVHja +5VV7cFTVGf/OPefeu3fv3t1NdhMSCHkKASEpyEsaGwalWEWntLV1Wu0fdOxAx9Iq0xntAwac6ehY +p+rwKLbjjLRFh9JadURKRGgFQTTECCYQE9nNgzzYZDe7m33d1+l3tpOOU61T2tF/+s1s7pzn9/t+ +v993Av/3QT6FO6WdO/d+M55Il8rMOdrT0x3Zt++3+c8EgM/nozseeviJiYmpe1zOQdM8BOOCIku/ +lIj1VrQ/0r9n9+78xwLgeAA3w4fHXV1d5Omnn6aapumlJSVVqalUJJvJZRdcu0RSfZQsaW7mjfPm +cbF9+/btEIlEaq6Z03whXyhIjDFuGIZEKSP5fMFRVcVNT2Vf0jzsmMxYGtel9rff/vM/M8bjcZpM +Jp1XX32VNDc3e7ovRP3JyZGVNdXVd1FGGwKBQEM8njiWTKV36IHgEACwibGx62LjU/cBd01Zljoc +p9DHmLbHsmyK1UuKooJt24IMcLE+y3L45eEYLS8LgWH4YXR0bAPZtGmTVFvfoBZMEzKpFKmqqmqp +qane4DhOteH3L1FkWZVlGSzLAtd1Oe4773C4LxoZvDWXh82OY2MtwAuFvCvSyDIFXdelYDDIvF4d +xPzA0AgXFStMcWPxBPGoKvXpPh6JDG5hK1Zcv1H36Xc6tsMs21EMQ69CLSts2wGkDygTyW2CP8gX +TKLIyvx0OrdDUXyLKXVUkdSne4QKtFAwuWmabjAYkDyqAgG/jziORh1EKaonkkQt2yRZRC5JHEGn +L7OKyopNqqo2IbWQjqWgLOwFBFKsuGDa4PVyIssMk1sCACCjimXbrbquYKW41zJJOpXkeARyeZNQ +SUKwHEqCKnBuAybkZeFSmssVSDKdhlBpCRgIcnQsdvKPB19sY4rMNIaH0BhQUVHKvXgpIiQF0wK/ +4QORnOEayoDzOSBMXK4BSgpeTcMECqiqTDKZHDKmct3LCI55Kp0mQgK/3yDYkgIc3kNhfHzCkRk9 +p6nk+yPD3SmWzeZiKNkciUrg2g5BjQWdSBchiEvQjzoWAFkUYPDrCjBFUEJ8AhSIRyl2jcfjEL9h +AFJODL8B6H7IZrNIt2g3B1mysShdQhmbT58+ExRdx3L5/PNomGU4kJkuA9ILYn+JP4CXOoDUoWO9 +IBhCSBCLTYCK+rqOg8CKvY6JPQhGxjkX1zyAdwrgAhTKWBDmxTUTC7Tcy5dHBiilL7cdaTsNGAwP +7o32D4Q9HnWTrvsCiqIgdWgqDkJfkKgDU1MZcBGMhbKgj2B0LIle8eNhgiBsoMwFEY7rQDqVwlo5 +esUE/AAR81gUYIUT8UR2//4/rK+pLjs3MhIFEVJN9WwXK2oM+P1BREpQO0hjwkw+BzJWY1oOXB5L +w9DIOGTQvYS4UFqigR9ZwUqEXFghVop059AjonqcAIZrqCKg31AS3OU66Adf4sabWqKvvHIYpoNh +y+Vj4xMHVEW93eUuo0izhT4oRbcSIoALbRle4AVVkfBup6g9thwCzRX1VRQmdMeqLVETEIkW2ZNx +H8oqzqAfXCGJEQ6XBQEgNQ2A7tq1C1a1tvaattOOrVFOqVSLCQhqU6QPx+DTsOU0GavLYUV20Qv4 +rEIymYNQuB48Wkg8QTA0NIQeYKB6NGTgH90jIcJEMikAi1dRRo9NLV583ek33jjpFAGIPw8++IAj +e9SIRGm5wliraVosnTWLmmemUugBkTiPSS3AtgV8VQA9A8LxdfULYXBoEKv2wMhIn2BHGFR0DZ6d +glQ6hUDT6A/RWVSSmfx5DjxRV1vzVkdHBzDAWLNmDezc+aQVqqz5dSY52Z63nLn9A33lI9myLXNL +xv0Fq3gWutMN0BToxcso+AN+cKmOXI5A9P12mKDzYNXcZXDq1F+h+IboFgzb1VAhDULeJpxwC19G +g/uMgOXVfXW1tbWCYM6mtdi8+YfiM4m/Y1UrHzkergyXz/3czImCnRjuHiW3qxpPqGFPy6SpHJC9 +IR+Sm+2N8i/dcMOMZdGeshcrS/S58+c3zU2Z8oVD50cbVfP8M4pGkymoUxLxsUzOVhtmQ+5432Rg +oj6QOLFj28/caQk+EjMXraUV1eW+8dH06StQZnlnNbQefGTD92pWfu3I6TOT8oY7brv4hWUt3xiw +2OrlDVVdRslsd2Fd469Q8sUB3c8uOW49SdHX1rbcePhoz3B7feuqlt5oZtBTv+ioSdXc7q3fHQaM +fwtg6Vd/dEvn8Qssnzg/0Ns56jRcO6Nw4d1Af+/RH0/cdv+O/fRK7KnmBXPWGsQeDPhK9oWC6hdd +R3pdUcg88Tx7U7Ej1y1qMjreGwjt/cnaF2YtvCXQe7bzxLkj+/sunT0Ry00OwHRI8DERLqeNmqGV +JZJVC6Yu7UxMOfLFlV9pWQcYp57/013rb1u9ua29b0Ch4bsl4tKLY5P1sgxNJzsHDj136KzS3NTk +9mTNusPvXJLrbnjUe/b16FDfsZ/3xC8d4/HoCQ4Anwzg91vWPL7+3pvvDM806sTY4IVyMxfrojO3 +BVubbyJMhnVVM3y+l187/nChIJ2ZpSs9hMD4qC6t6x6+0gkAoRC33/Sb8RdmXj9nzvWraivhP47g +AyHxKb1mfWkRYHCjMb30nafeeWzerU9963w3L3/02c4f7D0y0NXTx3f3D/JTb7bzxpeODu55+PGT +yy5F+ZmeD/iSrh5efeJd/hGZP5GBux+6cysY3w7H+16IVy65V6trnn3P9JqVjQ3JuSsdHhWW6hIL +NuhyUpJgEF/ofSVBeLBuVtVjd3y55SHXhQ8UBht0DR4r98Fs+IRg/zrxlz2/2A7p5yYBY93Gu+4f +H5xojLwOxfjd/WufOHhQ/IcD7eYVC5YyCjFMfkVV4NpMFvpTachoZeDaNryLnliOczsUCv1XBWD8 +YjF5MWJ9kcT757qenR7vf4bDoqWwHCvUUfPNsQQMWSZAZTlsw7nxYQQTcuDrjgQuPn7z/D7YivNt +nPPfEDzwqcU75/j6SD/f8uG5vXs5dL7Hjb+d4gp8mnF8nAOabjcac+OBAxyuNiT4HyNwGZYgu0RW +IDt/Icz4zAC0tXE4183rQ6XwU9uBXgLQ5Teg7GIv1+EqgsF/GY4DtCQALZMp2ITttmqoHzpWr756 +o/0d59+Lh3Y1HHcAAAAASUVORK5CYII= + +--nextPart1939768.sIoLGH0PD8-- + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,77 @@ + + + + +
+ + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,11 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,57 @@ +From test@kolab.org Fri May 01 15:13:18 2015 +From: testkey +To: you@you.com +Subject: enc attachment +Date: Fri, 01 May 2015 17:13:18 +0200 +Message-ID: <2401407.XhOc2XYoOt@tabin.local> +X-KMail-Identity: 1197256126 +User-Agent: KMail/4.13.0.1 (Linux/3.19.1-towo.1-siduction-amd64; KDE/4.14.2; x86_64; git-cd33034; 2015-04-11) +MIME-Version: 1.0 +Content-Type: multipart/encrypted; boundary="nextPart4793536.cjk9hKXLQ5"; protocol="application/pgp-encrypted" + + +--nextPart4793536.cjk9hKXLQ5 +Content-Type: application/pgp-encrypted +Content-Disposition: attachment +Content-Transfer-Encoding: 7Bit + +Version: 1 +--nextPart4793536.cjk9hKXLQ5 +Content-Type: application/octet-stream +Content-Disposition: inline; filename="msg.asc" +Content-Transfer-Encoding: 7Bit + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hIwDGJlthTT7oq0BBACLMnR5Mln6JGCccvqZCgM3qUkFWZ7a33b7Nl2g5lSOLX6q +dlGOr/0jAuqdkRwCDTom3hsrH2vf1kARTSST+5cewngS2CgBTAwwc8JymEagTkKf +VK/tTnM6G7puMVkwuafpuRggyJAUYvjktgUKOUaXtuxX71g0NagAFQGqlvGuq4UB +DAMMzkNap8zaOwEH+wWSs5xdV1x37T11EnUvkhoOMu+uId2U7NEx2JdQ/FGJZdti +mtqfM9GKTtQlGVcn3ISH7Wmrw3x0bsOLuW7oxkU4xIS3tVvibxaaWdmponN5TUai +Dr4LCTEmG7+jLNopF6V4zPmpQ9YxMwQOm8ITml+auNOg9EtHxavwr3Xd1hOYA92N +1bkOiHzmb9hQtUy1GfRRk91tRqtRPoaamczLxWV9yROFDRNuSSbZ8oBU/K4YgSTL +D+/FhCt6MxV0DQzp+UCSL7ZsMx+ldPnZK44Udd17+U3xQDDUffo6cSg6FAF425Rh +v3ZQP0j7LtSIwDh2Rxc+Is4DuSmfZksL5nLPH5nS6QGJnsVEqVcZgQPktl1Zaeil +x/6WaWruuJm92G2fd9x2/giTLZnk918BVi/n00xR/n4bnSQmmFhXVqAVjGlG6Tr9 +dxej8dSiFdxO8ZjFe5tguQw76xlCu/9MxmSXTP7Mfvm4jqdcjUOINwHOzR/h2T62 +ZlrmqoxMHm4RN0PQ334tSzQXD4gcoUHL+xq62ATt7/jx0p0pIXPmPVUFopCk8k1E +m2ErPLnyfGLd4LNZRL03oP0jCjX6Q/LFWLTjCIdU6+aM6nT26CZy98yZV0SRGyhu +qYxN0aVW+RatmDRWWtouOJllQouQ7ZaqmjHLgyOj32/oT8cYUWWdFswSsnMhJjxb +r6iajUeAZgiN+zqwgf6j1Z8/mMvb+yirP+Rn9ME1fq3XSYHlnIOxKNBa+St8DdaP +/ZvrkwNTpVp1GmaZLBXdqdeLmflJ4U/X7wphZGR3sgjOwj0oYotX1Zb8OrtlP5WC +VXhhrt40e7Ilt2B0x7Xe9DWKByDCqrQUhwxwTS3miiKH9G1VEcHko70O98RjKJQ3 +I4VW6e/Gqv2zAMiiOu1MBTeGfPQItca4bUrVzhKjm27twtZD4wLSQDTQECxrCWHC +BFAdzvsIry0FIXoO6Vh16Hojq+YZ8tpmknGfpg0pnuRvAdDWU+0uuECXDE0UZFWC +2g3Bs2Dn2BYYyrI6X92swHz8qP3JvdxN0dpsYMkMdHN4yWXJogNSfXzy2udf0A4P +NNZMOonhlwH+DBRfcWS0A/j0/fdDCDzR5Ca5dbX7lL4EscbBeoCP1JJyVoOp6DUc +ICuHJGGrnpNdG9DMa97tqpyGRHTAwI3lJXPKTDEHN9v9XobIyndFgi/tcPLZ7QWz +9mN94NKLmeYWjrMiRbNQk8BYXR9K17SHb4BkIMdBxRsJjgMEC8qniUH64Nnf8/x4 +yaRCuUo0bkHDE3AqCzZE1R0he66dDkfOIz+mLwcpG8jZWjFm7sXAflBe3jvIc0lm +NyWQ1WnMkP83fWm/+YqrLLf+tTQtievRPeS1Dd/7v9yqUWEmQ0pUOj3MNf9Ej2KI +vu5ap7fHIevcBn42BPwQgSnp4YmXEY0ir5Ccwogusnt7QliNSRmkN6Jap4AF +=AVJ4 +-----END PGP MESSAGE----- + +--nextPart4793536.cjk9hKXLQ5-- + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-attachment.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,8 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-enigmail1.6.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-enigmail1.6.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-enigmail1.6.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-enigmail1.6.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,48 @@ +From you@you.com Sat, 29 Mar 2014 15:04:21 +0100 +FCC: imap://hefee%40netzguerilla.net@mail.netzguerilla.net/Sent +X-Identity-Key: id1 +X-Account-Key: account4 +Message-ID: <5336D2E5.6010602@you.com> +Date: Sat, 29 Mar 2014 15:04:21 +0100 +From: you +X-Mozilla-Draft-Info: internal/draft; vcard=0; receipt=0; DSN=0; uuencode=0 +User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Icedove/24.4.0 +MIME-Version: 1.0 +To: test@kolab.com +Subject: test +X-Enigmail-Version: 1.6 +X-Enigmail-Draft-Status: 515 +X-Enigmail-Draft-Status: 739 +Content-Type: multipart/encrypted; + protocol="application/pgp-encrypted"; + boundary="23VWJ4jAoB40SD17lh6TOBXK3fQSEGNu5" + +This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156) +--23VWJ4jAoB40SD17lh6TOBXK3fQSEGNu5 +Content-Type: application/pgp-encrypted +Content-Description: PGP/MIME version identification + +Version: 1 + +--23VWJ4jAoB40SD17lh6TOBXK3fQSEGNu5 +Content-Type: application/octet-stream; name="encrypted.asc" +Content-Description: OpenPGP encrypted message +Content-Disposition: inline; filename="encrypted.asc" + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v1 +Comment: Using GnuPG with Icedove - http://www.enigmail.net/ + +hIwDGJlthTT7oq0BA/9NtLLXbiIJVS6pOynwEeSznrQK7kYVla8RM43//JECCkGJ +azEaSBznabBv6epaFmQtVHLMXlCbZnMmW9loyqPBfMoAms6kKKBdG/jqhus89iXE ++seXngC233Va/gZMb2DxOqIokVNfj9tpR7xQ8wS/jHTDiLNc1GOQC7ku42z2bNLA +IQFRD/qbBFz89hU4wP4cYoAysOnEDojFrsrnCidTHJOJrndM6PPUtH/jQCyfr/EG +2tSpJwYKvmT6ly3yqaGLBtRPIxiv+dMe+7yw0t40qbjvvaTGavErEBJEKX5eWbTN +/sjajHpUHqs6SIiMheH9dr+WfzFONtVbPEgGRmOERhlgTl/nLo86AZpjJroIGKJJ +tTHCcoQGAWG+N7wrCE1RxR0kkMs4nRozj0TLu6ZyXMs+H063MewTPNxNAiQT1Nbi +udKWmfLBlxn06p+JDzUKxj8PFwObdbxTvACzbAvBY1aHMQ== +=mLl3 +-----END PGP MESSAGE----- + +--23VWJ4jAoB40SD17lh6TOBXK3fQSEGNu5-- + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-enigmail1.6.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-enigmail1.6.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-enigmail1.6.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-enigmail1.6.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,34 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-enigmail1.6.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-enigmail1.6.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-enigmail1.6.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-enigmail1.6.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,5 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,36 @@ +From test@kolab.org Wed, 08 Sep 2010 17:02:52 +0200 +From: OpenPGP Test +To: test@kolab.org +Subject: OpenPGP encrypted +Date: Wed, 08 Sep 2010 17:02:52 +0200 +User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) +MIME-Version: 1.0 +Content-Type: multipart/encrypted; boundary="nextPart1357031.ppLHckZtsp"; protocol="application/pgp-encrypted" +Content-Transfer-Encoding: 7Bit + + +--nextPart1357031.ppLHckZtsp +Content-Type: application/pgp-encrypted +Content-Disposition: attachment + +Version: 1 +--nextPart1357031.ppLHckZtsp +Content-Type: application/octet-stream +Content-Disposition: inline; filename="msg.asc" + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2.0.15 (GNU/Linux) + +hQEMAwzOQ1qnzNo7AQgAtWfDWWI2JUGuptpackiIxpWViEEpGAeruETubiIPwxNb +DNmXrMDhbm/zIbPntIGWJDgUMfABZCUgmlJLWhsceDTt+tXnWGha2VYrN2/WsF6/ +Pqs/TavTvMIJQHDaIH5yDDCaMoq/mGSbcu7go2H8Sw7aBEYlM8jGlqc1HziXnZ1q +3vDiA+4qWfvbNoSRo1kb9Pcq997yg6WqZXH2hJ7cp+hIQ4uTP1/+qgYHMvfPlzQk +XcDguGbIer88ELhuR5622unGBAB4dqp+5w6n9c6rrCH81qhV4W0nqSEvj1tBj78S +ZTi6VBAo5eS0e3iOJqMpwUZz6hQUpJw2wnNRGvLgI9KZAag0HkgPdMeANowg7vpE +L4nU7B0ybhswA2Y7QT/wwCDZu9N1JGeBmy0dgy4sA38Ki27rn2/lIaP0j14JycwM +RTJ1uwI+ZuQiwXlyYtdFZJWe8nraWARch0oKqhaR7aSsxGWo63eiGEQhkQCBFBb3 +Vg0nNCZRBauEqIESEW5EV2zrJqdfNYcz+f9IP125dnQEKgLZ6FxTt3+v +=mhNl +-----END PGP MESSAGE----- + +--nextPart1357031.ppLHckZtsp-- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,31 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted.mbox.inProgress.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted.mbox.inProgress.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted.mbox.inProgress.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted.mbox.inProgress.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,24 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-noData.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-noData.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-noData.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-noData.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,17 @@ +From test@kolab.org Wed, 08 Sep 2010 17:02:52 +0200 +From: OpenPGP Test +To: test@kolab.org +Subject: OpenPGP encrypted +Date: Wed, 08 Sep 2010 17:02:52 +0200 +User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) +MIME-Version: 1.0 +Content-Type: multipart/encrypted; boundary="nextPart1357031.ppLHckZtsp"; protocol="application/pgp-encrypted" +Content-Transfer-Encoding: 7Bit + +--nextPart1357031.ppLHckZtsp +Content-Type: application/pgp-encrypted +Content-Disposition: attachment + +Version: 1 + +--nextPart1357031.ppLHckZtsp-- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-noData.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-noData.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-noData.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-noData.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,19 @@ + + + + +
+ + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-noData.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-noData.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-noData.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-noData.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,114 @@ +From test@kolab.org Fri May 01 15:13:51 2015 +From: testkey +To: you@you.com +Subject: non enc attachment +Date: Fri, 01 May 2015 17:13:51 +0200 +Message-ID: <20157069.RcaNBhWVXx@tabin.local> +X-KMail-Identity: 1197256126 +User-Agent: KMail/4.13.0.1 (Linux/3.19.1-towo.1-siduction-amd64; KDE/4.14.2; x86_64; git-cd33034; 2015-04-11) +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="nextPart1612969.Xqz3IcFXZ3" +Content-Transfer-Encoding: 7Bit + +This is a multi-part message in MIME format. + +--nextPart1612969.Xqz3IcFXZ3 +Content-Type: multipart/encrypted; boundary="nextPart2213427.hvfAsaxZ1O"; protocol="application/pgp-encrypted" + + +--nextPart2213427.hvfAsaxZ1O +Content-Type: application/pgp-encrypted +Content-Disposition: attachment +Content-Transfer-Encoding: 7Bit + +Version: 1 +--nextPart2213427.hvfAsaxZ1O +Content-Type: application/octet-stream +Content-Disposition: inline; filename="msg.asc" +Content-Transfer-Encoding: 7Bit + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hIwDGJlthTT7oq0BBACdvp3PFrRx6vxZhxt06LqyaO7+SWBbVUr7GOa3QaYCCBm+ +/KTUZEfhPuGVcsVpJKZbPsUKVhYfvYpDAsZu3TehmKflobWAV/cCIK2BkQB744pd +oaCtTj7pmCO05Zt5Uo/tXbrgceuW+/huwn2DO2fk4MUBsluH3fMbvccZJnR3yoUB +DAMMzkNap8zaOwEIAOTKI8Bh3NhfuJdWDsjv+UT6E4kf/zg3D95mJ+3gK8kHFXdd +YyEKaMsYx64kSwm1KcjsJ4gWykJlB34YDDfcIrnbgO2QRss9GhgOcUtLr0KNcY+0 +OJ4sbNmI8I3XssMb4rHtDrcXc0ODd0v/C/Lw2VfUdN+bBY4EetG096OPiZ4R41kF +Rj95nhO8tpoJx9VltegCdZI2AxtykOYvUaLFyYqCoKMmQwqGjdaUv1CeMnxUIPsn +A/x6TQ0AjpZ5IfMqO7QmOv3ACFo5/Ur93NauOK6szg/zdih9OxUL0Qid3nZQQwqA +J9ZChTcUgdjQo8EjpWLy0oXR9uLSHcLwRo3OdRzS6QEz7Dus6hmpEal3zTZFj2NR +mK38tpp+eWhzSAFAx8tyImz8SU2N2o7xQHlEdlWYGeIQg0embMnmMv6WJVWhYahb +x5OTfHCGwHFsLhZDmtaNhAVMlYdqxKXoR45H9cmGNPpU5kN5Ckjr6I+I51cfgAOE +1vF54jYHXd1btfGrwAyKWBfFVQFPWjuIUdsEl8zDjNTmcCCbA77tEGohSqDi+WWL +LyYw5g/uwwZ+5OzeRdjAJ+9xtJ+WXhnDUffG8GgGgZWBQD+S2Ix4lZ2NcAeyLPt/ +cXeDHkPUXj7cjm0hl7SvBKzR6X4EEWO/hh19mxngd4+e19q6Qm4K2QMfTwQQyNED +whBkRXhcXcRxWlb/ICwFDIgxKLJko5HVTknBJDllNdm6l2C4Y9/IY2imqXni8xZX +zQfAkDOBlfouUrHbPuBCRdCLmp7BgbanCaJDvgYGBvXEgjMKpV3bezTfm4Ugwiyk +dJfMu/4XftZy7XqoFuDheNXuQ5JobpvVDaiTQ0EWHpHeX3TZ0xa8i1FO6ANLakUp +aVFWzYl91bxbNHIcPh278neyi+LNWWT6TvkCwcbUYUfuIySOwfSUJAHDIJOx50Ha +If0fNQDtF4o9mDFwXDwVf8e2zx5NjheqgYX/qIWjFE2cCCkUM4UkNrkYBOiwnh9F +RJz4M6wKPhZT34MBlTKgwDbypDp+XYnM2HunzIDXCAigYsD/AuLNeFwsIPiXWJ47 +oXamEJxyqS9G0t/iy7+1mbNiFct7pvHt6QUKZ9aXSXj3MkQuWjjVNvMz6KocTSyL +AeWQNYuvA5NkyZOA5+VU1ma3wn7IAXYkgw+OMvcz9VNevXNg956ZnGbb47Fqppp+ +MjK2ptM1UzIEnHxXtq3KFrXG1AzzhyFnKIjsiDpFTlMGTT9pRGnK8zyYXYPEgpwW +874A5auLFOvhwPSNMhMai+XSoE3P+zZDqhXMYU8c49O+SeOtISg3Iy5tXuIPlIps +7k0KA60hPulMYBQLtZ/yDO/gXhkeWaw= +=EJZ6 +-----END PGP MESSAGE----- + +--nextPart2213427.hvfAsaxZ1O-- + +--nextPart1612969.Xqz3IcFXZ3 +Content-Disposition: attachment; filename="image.png" +Content-Transfer-Encoding: base64 +Content-Type: image/png; name="image.png" + +iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAlwSFlzAAAb +rwAAG68BXhqRHAAAAAd0SU1FB9gHFg8aNG8uqeIAAAAGYktHRAD/AP8A/6C9p5MAAAkqSURBVHja +5VV7cFTVGf/OPefeu3fv3t1NdhMSCHkKASEpyEsaGwalWEWntLV1Wu0fdOxAx9Iq0xntAwac6ehY +p+rwKLbjjLRFh9JadURKRGgFQTTECCYQE9nNgzzYZDe7m33d1+l3tpOOU61T2tF/+s1s7pzn9/t+ +v993Av/3QT6FO6WdO/d+M55Il8rMOdrT0x3Zt++3+c8EgM/nozseeviJiYmpe1zOQdM8BOOCIku/ +lIj1VrQ/0r9n9+78xwLgeAA3w4fHXV1d5Omnn6aapumlJSVVqalUJJvJZRdcu0RSfZQsaW7mjfPm +cbF9+/btEIlEaq6Z03whXyhIjDFuGIZEKSP5fMFRVcVNT2Vf0jzsmMxYGtel9rff/vM/M8bjcZpM +Jp1XX32VNDc3e7ovRP3JyZGVNdXVd1FGGwKBQEM8njiWTKV36IHgEACwibGx62LjU/cBd01Zljoc +p9DHmLbHsmyK1UuKooJt24IMcLE+y3L45eEYLS8LgWH4YXR0bAPZtGmTVFvfoBZMEzKpFKmqqmqp +qane4DhOteH3L1FkWZVlGSzLAtd1Oe4773C4LxoZvDWXh82OY2MtwAuFvCvSyDIFXdelYDDIvF4d +xPzA0AgXFStMcWPxBPGoKvXpPh6JDG5hK1Zcv1H36Xc6tsMs21EMQ69CLSts2wGkDygTyW2CP8gX +TKLIyvx0OrdDUXyLKXVUkdSne4QKtFAwuWmabjAYkDyqAgG/jziORh1EKaonkkQt2yRZRC5JHEGn +L7OKyopNqqo2IbWQjqWgLOwFBFKsuGDa4PVyIssMk1sCACCjimXbrbquYKW41zJJOpXkeARyeZNQ +SUKwHEqCKnBuAybkZeFSmssVSDKdhlBpCRgIcnQsdvKPB19sY4rMNIaH0BhQUVHKvXgpIiQF0wK/ +4QORnOEayoDzOSBMXK4BSgpeTcMECqiqTDKZHDKmct3LCI55Kp0mQgK/3yDYkgIc3kNhfHzCkRk9 +p6nk+yPD3SmWzeZiKNkciUrg2g5BjQWdSBchiEvQjzoWAFkUYPDrCjBFUEJ8AhSIRyl2jcfjEL9h +AFJODL8B6H7IZrNIt2g3B1mysShdQhmbT58+ExRdx3L5/PNomGU4kJkuA9ILYn+JP4CXOoDUoWO9 +IBhCSBCLTYCK+rqOg8CKvY6JPQhGxjkX1zyAdwrgAhTKWBDmxTUTC7Tcy5dHBiilL7cdaTsNGAwP +7o32D4Q9HnWTrvsCiqIgdWgqDkJfkKgDU1MZcBGMhbKgj2B0LIle8eNhgiBsoMwFEY7rQDqVwlo5 +esUE/AAR81gUYIUT8UR2//4/rK+pLjs3MhIFEVJN9WwXK2oM+P1BREpQO0hjwkw+BzJWY1oOXB5L +w9DIOGTQvYS4UFqigR9ZwUqEXFghVop059AjonqcAIZrqCKg31AS3OU66Adf4sabWqKvvHIYpoNh +y+Vj4xMHVEW93eUuo0izhT4oRbcSIoALbRle4AVVkfBup6g9thwCzRX1VRQmdMeqLVETEIkW2ZNx +H8oqzqAfXCGJEQ6XBQEgNQ2A7tq1C1a1tvaattOOrVFOqVSLCQhqU6QPx+DTsOU0GavLYUV20Qv4 +rEIymYNQuB48Wkg8QTA0NIQeYKB6NGTgH90jIcJEMikAi1dRRo9NLV583ek33jjpFAGIPw8++IAj +e9SIRGm5wliraVosnTWLmmemUugBkTiPSS3AtgV8VQA9A8LxdfULYXBoEKv2wMhIn2BHGFR0DZ6d +glQ6hUDT6A/RWVSSmfx5DjxRV1vzVkdHBzDAWLNmDezc+aQVqqz5dSY52Z63nLn9A33lI9myLXNL +xv0Fq3gWutMN0BToxcso+AN+cKmOXI5A9P12mKDzYNXcZXDq1F+h+IboFgzb1VAhDULeJpxwC19G +g/uMgOXVfXW1tbWCYM6mtdi8+YfiM4m/Y1UrHzkergyXz/3czImCnRjuHiW3qxpPqGFPy6SpHJC9 +IR+Sm+2N8i/dcMOMZdGeshcrS/S58+c3zU2Z8oVD50cbVfP8M4pGkymoUxLxsUzOVhtmQ+5432Rg +oj6QOLFj28/caQk+EjMXraUV1eW+8dH06StQZnlnNbQefGTD92pWfu3I6TOT8oY7brv4hWUt3xiw +2OrlDVVdRslsd2Fd469Q8sUB3c8uOW49SdHX1rbcePhoz3B7feuqlt5oZtBTv+ioSdXc7q3fHQaM +fwtg6Vd/dEvn8Qssnzg/0Ns56jRcO6Nw4d1Af+/RH0/cdv+O/fRK7KnmBXPWGsQeDPhK9oWC6hdd +R3pdUcg88Tx7U7Ej1y1qMjreGwjt/cnaF2YtvCXQe7bzxLkj+/sunT0Ry00OwHRI8DERLqeNmqGV +JZJVC6Yu7UxMOfLFlV9pWQcYp57/013rb1u9ua29b0Ch4bsl4tKLY5P1sgxNJzsHDj136KzS3NTk +9mTNusPvXJLrbnjUe/b16FDfsZ/3xC8d4/HoCQ4Anwzg91vWPL7+3pvvDM806sTY4IVyMxfrojO3 +BVubbyJMhnVVM3y+l187/nChIJ2ZpSs9hMD4qC6t6x6+0gkAoRC33/Sb8RdmXj9nzvWraivhP47g +AyHxKb1mfWkRYHCjMb30nafeeWzerU9963w3L3/02c4f7D0y0NXTx3f3D/JTb7bzxpeODu55+PGT +yy5F+ZmeD/iSrh5efeJd/hGZP5GBux+6cysY3w7H+16IVy65V6trnn3P9JqVjQ3JuSsdHhWW6hIL +NuhyUpJgEF/ofSVBeLBuVtVjd3y55SHXhQ8UBht0DR4r98Fs+IRg/zrxlz2/2A7p5yYBY93Gu+4f +H5xojLwOxfjd/WufOHhQ/IcD7eYVC5YyCjFMfkVV4NpMFvpTachoZeDaNryLnliOczsUCv1XBWD8 +YjF5MWJ9kcT757qenR7vf4bDoqWwHCvUUfPNsQQMWSZAZTlsw7nxYQQTcuDrjgQuPn7z/D7YivNt +nPPfEDzwqcU75/j6SD/f8uG5vXs5dL7Hjb+d4gp8mnF8nAOabjcac+OBAxyuNiT4HyNwGZYgu0RW +IDt/Icz4zAC0tXE4183rQ6XwU9uBXgLQ5Teg7GIv1+EqgsF/GY4DtCQALZMp2ITttmqoHzpWr756 +o/0d59+Lh3Y1HHcAAAAASUVORK5CYII= + +--nextPart1612969.Xqz3IcFXZ3-- + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,69 @@ + + + + +
+ + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-non-encrypted-attachment.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,9 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,91 @@ +From: firstname.lastname@example.com +To: test@kolab.org +Subject: OpenPGP encrypted one signed and one unsigned attachment +Date: Sun, 30 Aug 2015 12:08:40 +0200 +Message-ID: <1737262.ESByPkoaL9@vkpc5> +X-KMail-Identity: 402312391 +X-KMail-Dictionary: en_US +User-Agent: KMail/5.0.42 pre (Linux/3.16.6-2-desktop; KDE/5.14.0; x86_64; ; ) +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="nextPart2760349.k2GQmrcl5a" +Content-Transfer-Encoding: 7Bit + +This is a multi-part message in MIME format. + +--nextPart2760349.k2GQmrcl5a +Content-Type: multipart/encrypted; boundary="nextPart2260160.XvshVD34ka"; protocol="application/pgp-encrypted" + +--nextPart2260160.XvshVD34ka +Content-Type: application/pgp-encrypted +Content-Disposition: attachment +Content-Transfer-Encoding: 7Bit + +Version: 1 +--nextPart2260160.XvshVD34ka +Content-Type: application/octet-stream +Content-Disposition: inline; filename="msg.asc" +Content-Transfer-Encoding: 7Bit + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hQEMAwzOQ1qnzNo7AQgAooa+Peu1t5aiX4WvssEnRlapkr62/49/Dbz5assvshdr +o9zOC+89Qr5P/ea+tC1MO7ek/DfyL9C4EzOMp/r08GeInLqWMc9qLZO//YaT2JUp +0IZFbpUQ4C2zjXMRuy/PMrltHuCfsvhvHX1YAHp/xjRsKpQoE3mSDzz5sc8/Hj9n +2eoKoCEW1rgt2qHtV4DD6lvUPo42LMZclJ9GqfoD7WLoEH9ebRLhXr3D00j6xBfy +//nooAhzQSW8b7GZth4Qc7DKAZMhuEly/kp07nhuPd1fMJDEAB/zh9EYlgnn3STb +MCdtFs6kMC24uA2eDCH330Bn9OzzWnsVU9ae4XiKnNLpAeactSFRKKvGytBQaloq +Gvn1+D0Xmw6OsSmRJ84DzKqG4E6bzE+XhMEMnLlqDvZDsOtU/sCGvMK0MM3y5B7M +ONqWLN3ng3zrGPec5gqfvnWgKpANUrbJkzS8LNjv4hwoKh0tFpghWQiefG0Z9Hw1 +UaYbFwvaFgXcm72oBkynDCleWjQ2vnDE4P38PldqZbAW/Pw1q6Yq8m9MhS1VpbI5 +WBjuRQhgQvMG0LY0gR/3Qor5tX9ASllWnPfWYVuOiSOAe5Hsp7BmELXkWftHii7k +YW0Qim7jleDaY1MGfFr0vrO/PiYxGTb+4IUyUgEBYEpxa9ozUoeftF6JbHPuEZI0 +ENX8aIVJ9FnpssrR5HlpXieF12ec9ZFeV7mAwcucJ3RXuDcQHQTHgEbfnzTsaEpL +Hxs+6euOCJXhKOYVrsAlB4IxK0OQm4XHiZ7WBp5Jp7rlSHltdxFpSnHIfqngyCA4 +L+c/gsUEVbNI++iOOhOKVT47XIf+s/xa1Y4XghGbHIA3/pQphYo4U5dTeLoX0OWI +64tPxliQTKuJ+NAv9Km2bDgvlvn83jsc94THi5u+fIdDEGp7pgoQNXR69Lkz1bsA +Hh9xqKzVloHu4SsT3OGX+bfTO3jUh8ieU/4tflZMrJ9RkEfE08PzTnopT08FppFx +QWpHv/fwyJf6Cw1IevM5pVLAShg0sbCPF/xsYTjSyWNib1wFtxkmv5MToCFwkxi5 +b1yT23BNlV5RV6wcjmrum7p2fMwPjbt8X6z+pgUtkD7zImBWeYddMjgSjOFuFEjF +gpfVoV3OIvMPZMe2jqWsjnjujHJr2z5IZn3A7WI0b4SIDP0sGwsTBiogKqcBNWpn +O4MKUq9JwC0K/MY7yS1MCLoHfwU18z19Es/flaAgwtXk8IWIcjkkumAwNl+y8Q+I ++8AFGdiXTKld9QVwCKnMS3QivHPuFNL8rfcWKsr1nOhOEhaO+zD94eOOiCbwiXGr +E6WsewNCVQUN4bxAXl2vRi+9WRctLy7bsuIL5dgUz0CMYkQ+dDmrBflD0nyC +=TGNA +-----END PGP MESSAGE----- + +--nextPart2260160.XvshVD34ka-- + +--nextPart2760349.k2GQmrcl5a +Content-Type: multipart/encrypted; boundary="nextPart22530242.iRl14SoP0Q"; protocol="application/pgp-encrypted" + +--nextPart22530242.iRl14SoP0Q +Content-Type: application/pgp-encrypted +Content-Disposition: attachment +Content-Transfer-Encoding: 7Bit + +Version: 1 +--nextPart22530242.iRl14SoP0Q +Content-Type: application/octet-stream +Content-Disposition: inline; filename="msg.asc" +Content-Transfer-Encoding: 7Bit + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hQEMAwzOQ1qnzNo7AQgAtA94bBRwgpo64zcyh+4dzt0Pr2pmNjiS4ZX+a/xzYCmD +oS1a26s/LVZH+aJYC13l1kEu+6YjKn+ruQvMfhihOxglHBLjmUO17TPFC05AReSn +amMqPbgS6mOwhlBJHrBa/SVwkxmbMaNBUJ/KxRXFtTW/V4pPWImRvI9mnmpo8fHy +ZLvVAI3hGe7vPG5Vbdi5/Iu/JzqwlglVsP82gYpLlx7HhWGF4gmTGc6YBwFtzEvS +eqFtKRDqN60bo4HnNLOEnMaWlYPTpt3QibLWWIbtpA1Gb0Q/1NvDnn3Lyj8H+0WV +8H6Ks9/cvAuoAMOad6y4gDJb+K/AS7Ha+08/3lMYG9LAAgGe8Qocxg1W3ha1o0Ph +YSfV2ooebsLiHjwspjYpsX5ijnRj6uNGp5Dt28EIo1ANF+oDiSKEwAMGPBtcnqaO +FWXy39dP3VXE73nsO+dyTidaATFBlYg+IpPTDSFTgsk7XDV973EpdXvOkBEp/vBv +EZknuZFOkS0v5QHk9Y/hhlSLACTIEWQpBiFGOwUVSZFXLEY5zQNTbQdRbz3ZYcE9 +mIFzD9Ujw6tIJIOFazhwr9SxxyeaAygWeg4ifmmdhAsmFYum +=WsAv +-----END PGP MESSAGE----- + +--nextPart22530242.iRl14SoP0Q-- + +--nextPart2760349.k2GQmrcl5a-- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,99 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-partially-signed-attachments.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,12 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted+signed.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted+signed.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted+signed.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted+signed.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,46 @@ +From test@kolab.org Wed, 08 Sep 2010 17:02:52 +0200 +From: OpenPGP Test +To: test@kolab.org +Subject: OpenPGP encrypted +Date: Wed, 08 Sep 2010 17:02:52 +0200 +User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) +MIME-Version: 1.0 +Content-Type: multipart/encrypted; boundary="nextPart1357031.ppLHckZtsp"; protocol="application/pgp-encrypted" +Content-Transfer-Encoding: 7Bit + + +--nextPart1357031.ppLHckZtsp +Content-Type: application/pgp-encrypted +Content-Disposition: attachment + +Version: 1 +--nextPart1357031.ppLHckZtsp +Content-Type: application/octet-stream +Content-Disposition: inline; filename="msg.asc" + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hQEMAwzOQ1qnzNo7AQgAkQI925mOOybpzcGcjUE7jmfMVoUvJW6Br9Zx9UEtko5H +fdmnrrUhFDyhBdwcg2E6AChipNcJjZhdX17lNAO0kI2IoPJAEkX9lyhjoiVEH/M8 +xmJEKFRejYzefx0S8esKyqqtfAmMKfsA5HmKRY8iDmQnI5d/FKhkcqLTJYo7fQyL +rEEycdr5PU5OJbMtE5+8+kbmG8PywjiCCad68FXakXIEFyWX1A99W/0ScWtqrqDB +kuQSdxJs4aAZWopxGKxDobt/qVyG6W6+PUnLx3eg80KytcWNxLJRV7WEJMj4OYCU +JdHrh4J1DTTRbuRmqx9de3fBDFHNNZpJP43UJYJWtoSMAxiZbYU0+6KtAQQAnRxD +XNwzBSmPk9NG3HYf/RleTAS8/fMp3D973Y3VF5JV72ljWqZO/1o/3RIpD0pl5nSE +nI0wPyncmPvAgQl5EAKTdYonKLuMCTbQ4eT7vkOdfA/HUxgaoE8ppH/OYXDDiqz/ +2GlNCCHcaQcVWwkHbWWgyhd/VvB7Mt9PVqPgTsHSwQ4BZf/JDwWe3MDAg21Raryf +dN4ZmWUzd3osDIRyy8H2hZL9vgZ3r0auIP6DMyYrPf3yTj9ApZeBiIpgBvqMwvR/ +8si6r1JaXr48KRCxAkn9fIXe2jMwQE2bk5tYDrTXY868V3DA5iKq1dgXUSn0tzG3 +0x9pjaOFkwxm0wtlpwnhZREJ9/ieIY7hy6p7CDpq4ZGRh8jQta4tWrjxN0wly+Dh +a9TjzHzgTh9BTh7vjcDLitOQFL5NcCQtK717FQ5Z1DRnkHDVLPoyPnW+5sllOVr9 +UcqNXwrPbrtElFjHULL5Y1pem1+AE6nCAtlvCAc7cil6QDsU508sOXW7BhTWATIU +tGHg/nIC0qVs24LR3MyYrwvfXL2JOkN/IK/g+0bbs6DMYVYaEOjcjqtidxWuLsE5 +aFEwlUFzcTcSauW+AOKwH+YFihRnlh9+4taaZxGZeutb12D5u8eEk+3nyVcsdogY +k/nT6ElN8i/Z2vgcxL6ABvB+g/bZmp/eCJphDNYc00lP8NMC4EEJvTZL438ThJ3j +wz0Qo4PlV0/OMXYxP2iZup2/rCe+pkmc9Gyz3Mkal4/9bBtIgP9cWBR7JZLMrK50 +KO4+NtrZYEY4JXRJlAo= +=1lYB +-----END PGP MESSAGE----- + +--nextPart1357031.ppLHckZtsp-- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted+signed.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted+signed.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted+signed.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted+signed.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,52 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted+signed.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted+signed.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted+signed.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted+signed.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,5 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-two-attachments.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-two-attachments.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-two-attachments.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-two-attachments.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,42 @@ +From: firstname.lastname@example.com +To: test@kolab.org +Subject: OpenPGP encrypted with 2 text attachments +Date: Sun, 30 Aug 2015 12:05:17 +0200 +Message-ID: <1505824.VT0nqpAGu0@vkpc5> +X-KMail-Identity: 402312391 +X-KMail-Dictionary: en_US +User-Agent: KMail/5.0.42 pre (Linux/3.16.6-2-desktop; KDE/5.14.0; x86_64; ; ) +MIME-Version: 1.0 +Content-Type: multipart/encrypted; boundary="nextPart3335835.KxmPgziKxd"; protocol="application/pgp-encrypted" + +--nextPart3335835.KxmPgziKxd +Content-Type: application/pgp-encrypted +Content-Disposition: attachment +Content-Transfer-Encoding: 7Bit + +Version: 1 +--nextPart3335835.KxmPgziKxd +Content-Type: application/octet-stream +Content-Disposition: inline; filename="msg.asc" +Content-Transfer-Encoding: 7Bit + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hQEMAwzOQ1qnzNo7AQgA6tTJs017mI+xuhjcSTr3F5X/rJghq0oaXbjk1K0W33p+ +jsEyPTbuUIvI2a+5xHJ3BV+gnnO0Xosz57tGTF/eVAySnGiMse5cu2RQR9b/9EkC +uzt3tIChyub3GUODG3yzXqkhSiwIImvedWgnJYTJ7eeBkWdizVT0b0byiG2d7Hjq +hzYzyPJRwuoE36hryDsFycAhPfSsQAirxDJXk4HTsfBCmz7tzJhtt4wKc7z5m8fq +y+jddnDADq5+tykJS6zemJOzgU3AOQyVJbmsx2vTV1CJdpKPHvTTgghpAaSuVbg0 +tR9BX1nPnA/bgX/V7C+3PwuCvB0ZKmv5d8kaGaTwO9LAhQGaWTfhG1cyy+MJhXdR +rH63PMkZh/lrvj7qJYofI5iVoe1CiMaX44BiwKVclGf7bEFdzc2NSRvvTSzisN3T +nSzydEttuEY5jGagQQNT1l1l4I8HAtUgwGtkKZVTAUL6iKHYAqzB77sRs33UJy4k +ZSIWFnSY8l+HLG+MYKsYCGsvJHkxEHnMiS1EZcmpUFhxOGQpiF2rJ4qnL2jbFWbA +9N1O5N1N/DJ/YKjwgy/jVVj6AOCrBZrxvKKt2mtG/wVX0F/KSKiEd8mgrLIx1udw +tibiDAJmDxUk8K0lAdOHBrzBChvysiT/QxCJFcSY6FE99Rral+BWjeyAIQQWvc2B +cEceZCtzjCOrwvoJwl2uEX+51nmMp+z1EoeyyhmUZZ4y65yOg4P6KGXGcLmIjSbH +IhsSls1jRkSrypf/wcEd6o7KZdeYbfA= +=Sud3 +-----END PGP MESSAGE----- + +--nextPart3335835.KxmPgziKxd-- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-two-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-two-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-two-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,64 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-two-attachments.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-two-attachments.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-encrypted-two-attachments.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-encrypted-two-attachments.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,9 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-charset-encrypted.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-charset-encrypted.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-charset-encrypted.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-charset-encrypted.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,40 @@ +From test@example.com Thu, 17 Oct 2013 02:13:03 +0200 +Return-Path: +Delivered-To: you@you.com +Received: from localhost (localhost [127.0.0.1]) + by test@example.com (Postfix) with ESMTP id B30D8120030 + for ; Thu, 17 Oct 2013 02:13:05 +0200 (CEST) +From: test +To: you@you.com +Subject: charset +Date: Thu, 17 Oct 2013 02:13:03 +0200 +Message-ID: <4081645.yGjUJ4o4Se@example.local> +User-Agent: KMail/4.12 pre (Linux/3.11-4.towo-siduction-amd64; KDE/4.11.2; x86_64; git-f7f14e3; 2013-10-15) +MIME-Version: 1.0 +Content-Transfer-Encoding: 7Bit +Content-Type: text/plain; charset="ISO-8859-15" + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2.0.22 (GNU/Linux) + +hIwDGJlthTT7oq0BBACbaRZudMigMTetPZNRgkfEXv4QQowR1jborw0dcgKKqMQ1 +6o67NkpxvmXKGJTfTVCLBX3nk6FKYo6NwlPCyU7X9X0DDk8hvaBdR9wGfrdm5YWX +GKOzcqJY1EypiMsspXeZvjzEW7O8I956c3vBb/2pM3xqYEK1kh8+d9bVH+cjf4UB +DAMMzkNap8zaOwEH/1rPShyYL8meJN+/GGgS8+Nf1BW5pSHdAPCg0dnX4QCLEx7u +GkBU6N4JGYayaCBofibOLacQPhYZdnR5Xb/Pvrx03GrzyzyDp0WyeI9nGNfkani7 +sCRWbzlMPsEvGEvJVnMLNRSk4xhPIWumL4APkw+Mgi6mf+Br8z0RhfnGwyMA53Mr +pG9VQKlq3v7/aaN40pMjAsxiytcHS515jXrb3Ko4pWbTlAr/eytOEfkLRJgSOpQT +BY7lWs+UQJqiG8Yn65vS9LMDNJgX9EOGx77Z4u9wvv4ZieOxzgbHGg5kYCoae7ba +hxZeNjYKscH+E6epbOxM/wlTdr4UTiiW9dMsH0zSwMUB891gToeXq+LDGEPTKVSX +tsJm4HS/kISJBwrCI4EUqWZML6xQ427NkZGmF2z/sD3kmL66GjspIKnb4zHmXacp +84n2KrI9s7p6AnKnQjsxvB/4/lpXPCIY5GH7KjySEJiMsHECzeN1dJSL6keykBsx +DtmYDA+dhZ6UWbwzx/78+mjNREhyp/UiSAmLzlJh89OH/xelAPvKcIosYwz4cY9N +wjralTmL+Y0aHKeZJOeqPLaXADcPFiZrCNPCH65Ey5GEtDpjLpEbjVbykPV9+YkK +7JKW6bwMraOl5zmAoR77PWMo3IoYb9q4GuqDr1V2ZGlb7eMH1gj1nfgfVintKC1X +3jFfy7aK6LIQDVKEwbi0SxVXTKStuliVUy5oX4woDOxmTEotJf1QlKZpn5oF20UP +tumYrp0SPoP8Bo4EVRVaLupduI5cYce1q/kFj9Iho/wk56MoG9PxMMfsH7oKg3AA +CqQ6/kM4oJNdN5xIf1EH5HeaNFkDy1jlLznnhwVAZKPo/9ffpg== +=bPqu +-----END PGP MESSAGE----- + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-charset-encrypted.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-charset-encrypted.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-charset-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-charset-encrypted.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,47 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-charset-encrypted.mbox.inProgress.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-charset-encrypted.mbox.inProgress.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-charset-encrypted.mbox.inProgress.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-charset-encrypted.mbox.inProgress.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,24 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-charset-encrypted.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-charset-encrypted.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-charset-encrypted.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-charset-encrypted.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::TextMessagePart + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::SignedMessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-signed-broken.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-signed-broken.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-signed-broken.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-signed-broken.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,26 @@ +From: test +To: you@you.de +Subject: test +Date: Tue, 25 Aug 2015 16:47:10 +0200 +Message-ID: <1662097.O9NVKTC5pT@11b508545ba2> +X-KMail-Identity: 1428848833 +User-Agent: KMail/4.13.0.3 (Linux/4.1.0-rc5-siduction-amd64; KDE/4.14.3; x86_64; git-7c86098; 2015-08-23) +MIME-Version: 1.0 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/plain; charset="iso-8859-1" + +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +ohno break it =F6=E4=FC +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2 + +iQEcBAEBCAAGBQJV3H/vAAoJEI2YYMWPJG3mEZQH/2mbCDa60risTUsomEecasc7 +kIc8Ch+OjZwlEQWKEiFbpLCMVjMwf0oGFcpc/dqnIyIqeVvF6Em+v7iqKuyAaihu +7ZxxC816tDDI7UIpmyWu39McqGB/2hoA/q+QAMgBiaIuMwYJK9Aw08hXzoCds6O7 +Uor2Y6kMSwEiRnTSYvQHdoaZY3F9SFTLPgjvwfSu7scvp7xvH7bAVIqGGfkLjXpP +OFkDhEqUI7ORwD5cvvzEu57XmbGB7Nj5LRCGcTq6IlaGeN6Pw5+hOdd6MQ4iISwy +870msP9NvktURnfXYC3fYnJaK/eUln7LYCBl/k04Z/3Um6dMYyQGh63oGv/2qxQ=3D +=3D4ctb +-----END PGP SIGNATURE----- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-signed.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-signed.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-signed.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-signed.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,26 @@ +From: test +To: you@you.de +Subject: test +Date: Tue, 25 Aug 2015 16:47:10 +0200 +Message-ID: <1662097.O9NVKTC5pT@11b508545ba2> +X-KMail-Identity: 1428848833 +User-Agent: KMail/4.13.0.3 (Linux/4.1.0-rc5-siduction-amd64; KDE/4.14.3; x86_64; git-7c86098; 2015-08-23) +MIME-Version: 1.0 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/plain; charset="iso-8859-1" + +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +ohno =F6=E4=FC +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2 + +iQEcBAEBCAAGBQJV3H/vAAoJEI2YYMWPJG3mEZQH/2mbCDa60risTUsomEecasc7 +kIc8Ch+OjZwlEQWKEiFbpLCMVjMwf0oGFcpc/dqnIyIqeVvF6Em+v7iqKuyAaihu +7ZxxC816tDDI7UIpmyWu39McqGB/2hoA/q+QAMgBiaIuMwYJK9Aw08hXzoCds6O7 +Uor2Y6kMSwEiRnTSYvQHdoaZY3F9SFTLPgjvwfSu7scvp7xvH7bAVIqGGfkLjXpP +OFkDhEqUI7ORwD5cvvzEu57XmbGB7Nj5LRCGcTq6IlaGeN6Pw5+hOdd6MQ4iISwy +870msP9NvktURnfXYC3fYnJaK/eUln7LYCBl/k04Z/3Um6dMYyQGh63oGv/2qxQ=3D +=3D4ctb +-----END PGP SIGNATURE----- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-signed.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-signed.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-signed.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-signed.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,35 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-signed.mbox.inProgress.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-signed.mbox.inProgress.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-signed.mbox.inProgress.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-signed.mbox.inProgress.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,22 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-signed.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-signed.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-signed.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-signed.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,3 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::TextMessagePart + * MimeTreeParser::SignedMessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-wrong-charset-encrypted.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-wrong-charset-encrypted.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-wrong-charset-encrypted.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-wrong-charset-encrypted.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,34 @@ +From t.glaser@tarent.de Mon Aug 18 10:59:01 2014 +Return-Path: +Received: from tgwrk.ig42.org (tgwrk.ig42.org. + [2a01:238:4200:4342:321e:80ff:fe12:4223]) by mx.google.com with ESMTPSA id + pe6sm40660135wjb.38.2014.08.18.01.59.01 for + (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 18 + Aug 2014 01:59:01 -0700 (PDT) +Date: Mon, 18 Aug 2014 10:59:00 +0200 (CEST) +From: Thorsten Glaser +X-X-Sender: tglase@tglase.lan.tarent.de +To: Thorsten Glaser +Subject: Test for Mozilla bug#1054187 +Message-ID: +User-Agent: Alpine 2.11 (DEB 23 2013-08-11) +MIME-Version: 1.0 +Content-Type: TEXT/PLAIN; charset=US-ASCII + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hIwDTFSKP3rBSXcBBAClcHW9/6kw8i+XkMes47vcmGBCjIC0UysqkVYyNqT2Y6tb +s7pdfZFQPVWbdYoxP0WLzGgNFEWttlojWJmaTNiDVLOP22hFuJL3LUxesC1cWE+6 +foCkENDI2YnkAw4o5HTrmHoBlG7N/Nzzu3+1kfUVANSoAhgWd5WJDsXyvPMoD9LA +7gHZZmq4bK5OwTHvAvdUOstCGd6Wqj5zkVXT59WOfYxYLcrGZ8I62lBS1/90TlJe +iEolBoaufZT7K2YW7k/+DPYgRIzvWISTccPWpcS7OOyifvK4zOFJeGsVq/DowP52 +Zt1xQj1En5CVUT/MkpvS1rB4BfSuhJETZdtUGveUe0HhcAzbnbIJULdK0p1XAo4O +q84vmOVD0BtKJVy/+rIW7h4aOr8C66HNDKLiUzWtdEaG97GQwhpQZ05JNsulG9tV +wyP6UWmDMY/5YuRoVHOYx8NXORHX4E5P151Tr5Fted9TpXI/gOTHHyPK5AiiDG6U +ja4fgkO6hYnjHxqqooxfGj+pg5atynnbMTALfWoXxmqyKrIB+SKqnsw+sCL3ro2x +j54EGZZ9wM6AYDQ48lJV5beWgQ55r28HxlhPNl/driNkMZHUazAdsubWo5NqJPXl +HrHQ4lv53ZUohbpVvdkmsldWhA5me7yRhQHytTQMMfadmSiYZVsy53siQ/5gEhUv +DQ4ggpUjf8twqR+5TLue5/r/fRXkGfKr5U1w4qcMcFcGwEIbwE+qtIDY0Cw/+xU= +=Ecl0 +-----END PGP MESSAGE----- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-wrong-charset-encrypted.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-wrong-charset-encrypted.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-wrong-charset-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-wrong-charset-encrypted.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,47 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-wrong-charset-encrypted.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-wrong-charset-encrypted.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-inline-wrong-charset-encrypted.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-inline-wrong-charset-encrypted.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::TextMessagePart + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::SignedMessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-apple.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-apple.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-apple.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-apple.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,129 @@ +Return-Path: +Sender: sender@example.org +From: Quonk +X-Pgp-Agent: GPGMail +Content-Type: multipart/signed; boundary="Apple-Mail=_12345678-1234-1234-1234-12345678"; protocol="application/pgp-signature"; micalg=pgp-sha512 +Subject: PDF +Date: Mon, 16 Jan 2017 15:14:51 +0100 +Message-Id: <199E2891-3080-42B6-ABCD-1230B78EBABC@example.org> +To: Konqi +Mime-Version: 1.0 (Mac OS X Mail 9.3 \(3124\)) + + +--Apple-Mail=_12345678-1234-1234-1234-12345678 +Content-Type: multipart/alternative; + boundary="Apple-Mail=_23456789-1234-1234-1234-12345678" + + +--Apple-Mail=_23456789-1234-1234-1234-12345678 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/plain; + charset=utf-8 + + + +=E2=80=A6 +Quonk +Klar=C3=A4lvdalens Datakonsult AB, a KDAB Group company +Sweden (HQ) +46-563-540090, Germany +49-30-521325470 +KDAB - The Qt, C++ and OpenGL Experts | www.kdab.com + + +--Apple-Mail=_23456789-1234-1234-1234-12345678 +Content-Type: multipart/mixed; + boundary="Apple-Mail=_34567890-1234-1234-1234-12345678" + + +--Apple-Mail=_34567890-1234-1234-1234-12345678 +Content-Transfer-Encoding: 7bit +Content-Type: text/html; + charset=us-ascii + +
pre attachment
+--Apple-Mail=_34567890-1234-1234-1234-12345678 +Content-Disposition: attachment; filename="image.png" +Content-Transfer-Encoding: base64 +Content-Type: image/png; name="image.png" + +iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAlwSFlzAAAb +rwAAG68BXhqRHAAAAAd0SU1FB9gHFg8aNG8uqeIAAAAGYktHRAD/AP8A/6C9p5MAAAkqSURBVHja +5VV7cFTVGf/OPefeu3fv3t1NdhMSCHkKASEpyEsaGwalWEWntLV1Wu0fdOxAx9Iq0xntAwac6ehY +p+rwKLbjjLRFh9JadURKRGgFQTTECCYQE9nNgzzYZDe7m33d1+l3tpOOU61T2tF/+s1s7pzn9/t+ +v993Av/3QT6FO6WdO/d+M55Il8rMOdrT0x3Zt++3+c8EgM/nozseeviJiYmpe1zOQdM8BOOCIku/ +lIj1VrQ/0r9n9+78xwLgeAA3w4fHXV1d5Omnn6aapumlJSVVqalUJJvJZRdcu0RSfZQsaW7mjfPm +cbF9+/btEIlEaq6Z03whXyhIjDFuGIZEKSP5fMFRVcVNT2Vf0jzsmMxYGtel9rff/vM/M8bjcZpM +Jp1XX32VNDc3e7ovRP3JyZGVNdXVd1FGGwKBQEM8njiWTKV36IHgEACwibGx62LjU/cBd01Zljoc +p9DHmLbHsmyK1UuKooJt24IMcLE+y3L45eEYLS8LgWH4YXR0bAPZtGmTVFvfoBZMEzKpFKmqqmqp +qane4DhOteH3L1FkWZVlGSzLAtd1Oe4773C4LxoZvDWXh82OY2MtwAuFvCvSyDIFXdelYDDIvF4d +xPzA0AgXFStMcWPxBPGoKvXpPh6JDG5hK1Zcv1H36Xc6tsMs21EMQ69CLSts2wGkDygTyW2CP8gX +TKLIyvx0OrdDUXyLKXVUkdSne4QKtFAwuWmabjAYkDyqAgG/jziORh1EKaonkkQt2yRZRC5JHEGn +L7OKyopNqqo2IbWQjqWgLOwFBFKsuGDa4PVyIssMk1sCACCjimXbrbquYKW41zJJOpXkeARyeZNQ +SUKwHEqCKnBuAybkZeFSmssVSDKdhlBpCRgIcnQsdvKPB19sY4rMNIaH0BhQUVHKvXgpIiQF0wK/ +4QORnOEayoDzOSBMXK4BSgpeTcMECqiqTDKZHDKmct3LCI55Kp0mQgK/3yDYkgIc3kNhfHzCkRk9 +p6nk+yPD3SmWzeZiKNkciUrg2g5BjQWdSBchiEvQjzoWAFkUYPDrCjBFUEJ8AhSIRyl2jcfjEL9h +AFJODL8B6H7IZrNIt2g3B1mysShdQhmbT58+ExRdx3L5/PNomGU4kJkuA9ILYn+JP4CXOoDUoWO9 +IBhCSBCLTYCK+rqOg8CKvY6JPQhGxjkX1zyAdwrgAhTKWBDmxTUTC7Tcy5dHBiilL7cdaTsNGAwP +7o32D4Q9HnWTrvsCiqIgdWgqDkJfkKgDU1MZcBGMhbKgj2B0LIle8eNhgiBsoMwFEY7rQDqVwlo5 +esUE/AAR81gUYIUT8UR2//4/rK+pLjs3MhIFEVJN9WwXK2oM+P1BREpQO0hjwkw+BzJWY1oOXB5L +w9DIOGTQvYS4UFqigR9ZwUqEXFghVop059AjonqcAIZrqCKg31AS3OU66Adf4sabWqKvvHIYpoNh +y+Vj4xMHVEW93eUuo0izhT4oRbcSIoALbRle4AVVkfBup6g9thwCzRX1VRQmdMeqLVETEIkW2ZNx +H8oqzqAfXCGJEQ6XBQEgNQ2A7tq1C1a1tvaattOOrVFOqVSLCQhqU6QPx+DTsOU0GavLYUV20Qv4 +rEIymYNQuB48Wkg8QTA0NIQeYKB6NGTgH90jIcJEMikAi1dRRo9NLV583ek33jjpFAGIPw8++IAj +e9SIRGm5wliraVosnTWLmmemUugBkTiPSS3AtgV8VQA9A8LxdfULYXBoEKv2wMhIn2BHGFR0DZ6d +glQ6hUDT6A/RWVSSmfx5DjxRV1vzVkdHBzDAWLNmDezc+aQVqqz5dSY52Z63nLn9A33lI9myLXNL +xv0Fq3gWutMN0BToxcso+AN+cKmOXI5A9P12mKDzYNXcZXDq1F+h+IboFgzb1VAhDULeJpxwC19G +g/uMgOXVfXW1tbWCYM6mtdi8+YfiM4m/Y1UrHzkergyXz/3czImCnRjuHiW3qxpPqGFPy6SpHJC9 +IR+Sm+2N8i/dcMOMZdGeshcrS/S58+c3zU2Z8oVD50cbVfP8M4pGkymoUxLxsUzOVhtmQ+5432Rg +oj6QOLFj28/caQk+EjMXraUV1eW+8dH06StQZnlnNbQefGTD92pWfu3I6TOT8oY7brv4hWUt3xiw +2OrlDVVdRslsd2Fd469Q8sUB3c8uOW49SdHX1rbcePhoz3B7feuqlt5oZtBTv+ioSdXc7q3fHQaM +fwtg6Vd/dEvn8Qssnzg/0Ns56jRcO6Nw4d1Af+/RH0/cdv+O/fRK7KnmBXPWGsQeDPhK9oWC6hdd +R3pdUcg88Tx7U7Ej1y1qMjreGwjt/cnaF2YtvCXQe7bzxLkj+/sunT0Ry00OwHRI8DERLqeNmqGV +JZJVC6Yu7UxMOfLFlV9pWQcYp57/013rb1u9ua29b0Ch4bsl4tKLY5P1sgxNJzsHDj136KzS3NTk +9mTNusPvXJLrbnjUe/b16FDfsZ/3xC8d4/HoCQ4Anwzg91vWPL7+3pvvDM806sTY4IVyMxfrojO3 +BVubbyJMhnVVM3y+l187/nChIJ2ZpSs9hMD4qC6t6x6+0gkAoRC33/Sb8RdmXj9nzvWraivhP47g +AyHxKb1mfWkRYHCjMb30nafeeWzerU9963w3L3/02c4f7D0y0NXTx3f3D/JTb7bzxpeODu55+PGT +yy5F+ZmeD/iSrh5efeJd/hGZP5GBux+6cysY3w7H+16IVy65V6trnn3P9JqVjQ3JuSsdHhWW6hIL +NuhyUpJgEF/ofSVBeLBuVtVjd3y55SHXhQ8UBht0DR4r98Fs+IRg/zrxlz2/2A7p5yYBY93Gu+4f +H5xojLwOxfjd/WufOHhQ/IcD7eYVC5YyCjFMfkVV4NpMFvpTachoZeDaNryLnliOczsUCv1XBWD8 +YjF5MWJ9kcT757qenR7vf4bDoqWwHCvUUfPNsQQMWSZAZTlsw7nxYQQTcuDrjgQuPn7z/D7YivNt +nPPfEDzwqcU75/j6SD/f8uG5vXs5dL7Hjb+d4gp8mnF8nAOabjcac+OBAxyuNiT4HyNwGZYgu0RW +IDt/Icz4zAC0tXE4183rQ6XwU9uBXgLQ5Teg7GIv1+EqgsF/GY4DtCQALZMp2ITttmqoHzpWr756 +o/0d59+Lh3Y1HHcAAAAASUVORK5CYII= +--Apple-Mail=_34567890-1234-1234-1234-12345678 +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; + charset=utf-8 + + +

Some HTML text

+ + +--Apple-Mail=_34567890-1234-1234-1234-12345678-- + +--Apple-Mail=_23456789-1234-1234-1234-12345678-- + +--Apple-Mail=_12345678-1234-1234-1234-12345678 +Content-Transfer-Encoding: 7bit +Content-Disposition: attachment; + filename=signature.asc +Content-Type: application/pgp-signature; + name=signature.asc +Content-Description: Message signed with OpenPGP using GPGMail + +-----BEGIN PGP SIGNATURE----- + +iQEzBAEBCAAdFiEEG6Mjkys/qoJhMseejZhgxY8kbeYFAlh/rcwACgkQjZhgxY8k +beYaoQf+Miuj4cnVumYXMopVMHJs6AK6D+uKO4jXHl/XUK3TOg17kFUZDEN/9JFd +SCN9oD5emzpBl4GSmYBbjvLvXTHTLHviVD6In35+wgMlQL+xfAv91Dx56QslCQMo +UhDYGgFPiEAfCY2UozQD/R3KWOHFB9bNdtOM0hdT84D35W2PZhzTlz2q3hpq3bYw +lNhFVebqURh9OEAZglB3Q9oDE13PJDtRLflKquC5ZU8N4Bj23TCOgxv4FzSyyAn/ +XalEKdwYrkZ8p4rRtd0YvAVevDUC4pQNGTgfsXgldoPEGUBXsdlczLPEj2sjLvNu +HX1GMDrZL/+7DZsURYV5DjhsqWzExQ== +=q0F6 +-----END PGP SIGNATURE----- + +--Apple-Mail=_12345678-1234-1234-1234-12345678-- + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-apple.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-apple.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-apple.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-apple.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,58 @@ + + + + +
+ + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-apple.mbox.inProgress.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-apple.mbox.inProgress.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-apple.mbox.inProgress.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-apple.mbox.inProgress.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,49 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-apple.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-apple.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-apple.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-apple.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,3 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::AlternativeMessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-base64-mailman-footer.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-base64-mailman-footer.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-base64-mailman-footer.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-base64-mailman-footer.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,117 @@ +Return-Path: +X-Sieve: CMU Sieve 2.3 +X-Virus-Scanned: amavisd-new at site +Authentication-Results: linux.site (amavisd-new); dkim=pass (1024-bit key) + header.d=kde.org +Received: from postbox.kde.org (localhost.localdomain [127.0.0.1]) + by postbox.kde.org (Postfix) with ESMTP id 867B8BF274; + Sat, 22 Aug 2015 09:32:21 +0000 (UTC) +DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=kde.org; s=default; + t=1440235945; bh=WhGhdxvdvRs04JdzjAkPcBVPmx7putlUE3ka9dvMIoc=; + h=From:To:Date:Subject:Reply-To:List-Id:List-Unsubscribe:List-Post: + List-Help:List-Subscribe:From; + b=mvxeMMGebkZKq7hekRypkPvt6S8lidA/8vQ3AC5Kft8HDmj8lDUpvOo0VXwCF0OG+ + iAOPKxYtxclf8PgYvgK8NIzr56CwcdlNm3/PpoSe20P3I1DGFpDDMFtW5tOD05SSHz + 5L6PCQyb+KFW1GrXgcm+eHshzJh3U8nHcyd8Vw2E= +X-Original-To: kde-pim@kde.org +Delivered-To: kde-pim@localhost.kde.org +X-Virus-Scanned: amavisd-new at site +From: Volker Krause +To: KDEPIM +Date: Sat, 22 Aug 2015 11:31:38 +0200 +Message-ID: <11737387.KAAPH2KlE3@vkpc5> +Organization: KDE +User-Agent: KMail/4.14.3 (Linux/3.16.6-2-desktop; KDE/4.14.7; x86_64; + git-c97b13e; 2014-12-30) +MIME-Version: 1.0 +Subject: [Kde-pim] Phabricator Project Setup +X-BeenThere: kde-pim@kde.org +X-Mailman-Version: 2.1.16 +Precedence: list +Reply-To: KDE PIM +List-Id: KDE PIM +List-Unsubscribe: , + +List-Post: +List-Help: +List-Subscribe: , + +Content-Type: multipart/mixed; boundary="===============1910646461178264940==" +Errors-To: kde-pim-bounces@kde.org +Sender: "kde-pim" + + +--===============1910646461178264940== +Content-Type: multipart/signed; boundary="nextPart2440608.7aDuJBW7cK"; micalg="pgp-sha1"; protocol="application/pgp-signature" + +--nextPart2440608.7aDuJBW7cK +Content-Transfer-Encoding: quoted-printable +Content-Type: text/plain; charset="us-ascii" + +Hi, + +I've talked to Ben, the current Phabricator test setup would actually b= +e=20 +usable for "production" use for task/project management for us, without= +=20 +causing the sysadmins unreasonable trouble when migrating to the full=20= + +production deployment of Phabricator eventually. + +Phabricator project layout it orthogonal to repo layout, so we can stru= +cture=20 +this however we want. Among other teams I see at least the following la= +youts: +- single project for everything +- a project per release +- a project per component/module (ie. close to the repo layout) + +How do we want to structure this? + +I would start with a single project to not fragment this too much, as w= +e have=20 +a relatively small team actually looking into this, so everyone is look= +ing at=20 +most sub-projects anyway. And should we eventually hit scaling limits, = +we can=20 +always expand this I think. + +We of course should also talk about what we actually want to put in the= +re. My=20 +current motivation is having a place to collect the tasks for getting m= +ore of=20 +the former pimlibs into KF5, and anything else I run into on the way th= +ere=20 +that we eventually should clean up/improve. + +regards, +Volker + +--nextPart2440608.7aDuJBW7cK +Content-Type: application/pgp-signature; name="signature.asc" +Content-Description: This is a digitally signed message part. +Content-Transfer-Encoding: 7Bit + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2 + +iD8DBQBV2EF9f5bM1k0S0kcRAk9cAJ4vHEh9JkT3Jy3EfxII7nP9HPmxrQCgjeLF +eYXCyN9NRAyC6CHeNnWZN10= +=Y8W4 +-----END PGP SIGNATURE----- + +--nextPart2440608.7aDuJBW7cK-- + + +--===============1910646461178264940== +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: base64 +Content-Disposition: inline + +X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KS0RFIFBJTSBt +YWlsaW5nIGxpc3Qga2RlLXBpbUBrZGUub3JnCmh0dHBzOi8vbWFpbC5rZGUub3JnL21haWxtYW4v +bGlzdGluZm8va2RlLXBpbQpLREUgUElNIGhvbWUgcGFnZSBhdCBodHRwOi8vcGltLmtkZS5vcmcv + +--===============1910646461178264940==-- + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-base64-mailman-footer.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-base64-mailman-footer.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-base64-mailman-footer.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-base64-mailman-footer.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,78 @@ + + + + +
+ +
+ + + + +
+
+ + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-base64-mailman-footer.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-base64-mailman-footer.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-base64-mailman-footer.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-base64-mailman-footer.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,7 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-encrypted.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-encrypted.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-encrypted.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-encrypted.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,47 @@ +From: OpenPGP Test +To: test@kolab.org +Subject: OpenPGP signed and encrypted +Date: Tue, 07 Sep 2010 18:08:44 +0200 +User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) +MIME-Version: 1.0 +Content-Type: multipart/encrypted; boundary="nextPart25203163.0xtB501Z4V"; protocol="application/pgp-encrypted" +Content-Transfer-Encoding: 7Bit + + +--nextPart25203163.0xtB501Z4V +Content-Type: application/pgp-encrypted +Content-Disposition: attachment + +Version: 1 +--nextPart25203163.0xtB501Z4V +Content-Type: application/octet-stream +Content-Disposition: inline; filename="msg.asc" + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2.0.15 (GNU/Linux) + +hQEMAwzOQ1qnzNo7AQf7BFYWaGiCTGtXY59bSh3LCXNnWZejblYALxIUNXOFEXbm +y/YA95FmQsy3U5HRCAJV/DY1PEaJz1RTm9bcdIpDC3Ab2YzSwmOwV5fcoUOB2df4 +KjX19Q+2F3JxpPQ0N1gHf4dKfIu19LH+CKeFzUN13aJs5J4A5wlj+NjJikxzmxDS +kDtNYndynPmo9DJQcsUFw3gpvx5HaHvx1cT4mAB2M5cd2l+vN1jYbaWb0x5Zq41z +mRNI89aPieC3rcM2289m68fGloNbYvi8mZJu5RrI4Tbi/D7Rjm1y63lHgVV6AN88 +XAzRiedOeF99LoTBulrJdtT8AAgCs8nCetcWpIffdtLpAZiZkzHmYOU7nqGxqpRk +OVeUTrCn9DW2SMmHjaP4IiKnMvzEycu5F4a72+V1LeMIhMSjTRTq+ZE2PTaqH59z +QsMn7Nb6GlOICbTptRKNNtyJKO7xXlpT7YtvNKnCyEOkH2XrYH7GvpYCiuQ0/o+7 +SxV436ZejiYIg6DQDXJCoa2DXimGp0C10Jh0HwX0BixpoNtwEjkGRYcX6P/JzkH0 +oBood4Ly+Tiu6iVDisrK3AVGYpIzCrKkE9qULTw4R/jFKR2tcCqGb7Fxtk2LV7Md +3S+DyOKrvKQ5GNwbp9OE97pwk+Lr1JS3UAvj5f6BR+1PVNcC0i0wWkgwDjPh1eGD +enMQmorE6+N0uHtH2F4fOxo/TbbA3+zhI25kVW3bO03xyUl/cmQZeb52nvfOvtOo +gSb2j6bPkzljDMPEzrtJjbFtGHJbPfUQYJgZv9OE2EQIqpg6goIw279alBq6GLIX +pkO+dRmztzjcDyhcLxMuQ4cTizel/0J/bU7U6lvwHSyZVbT4Ev+opG5K70Hbqbwr +NZcgdWXbSeesxGM/oQaMeSurOevxVl+/zrTVAek61aRRd1baAYqgi2pf2V7y4oK3 +qkdxzmoFpRdNlfrQW65NZWnHOi9rC9XxANIwnVn3kRcDf+t2K4PrFluI157lXM/o +wX91j88fazysbJlQ6TjsApO9ETiPOFEBqouxCTtCZzlUgyVG8jpIjdHWFnagHeXH ++lXNdYjxnTWTjTxMOZC9ySMpXkjWdFI1ecxVwu6Ik6RX51rvBJAAXWP75yUjPKJ4 +rRi5oQl/VLl0QznO7lvgMPtUwgDVNWO/r7Kn9B387h9fAJZ/kWFAEDW2yhAzABqO +rCNKDzBPgfAwCnikCpMoCbOL7SU8BdbzQHD8/Lkv4m0pzliHQ/KkGF710koBzTmF +N7+wk9pwIuvcrEBQj567 +=GV0c +-----END PGP MESSAGE----- + +--nextPart25203163.0xtB501Z4V-- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-encrypted.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-encrypted.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-encrypted.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,55 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-encrypted.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-encrypted.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-encrypted.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-encrypted.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,5 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-encrypted-two-attachments.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-encrypted-two-attachments.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-encrypted-two-attachments.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-encrypted-two-attachments.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,52 @@ +From: firstname.lastname@example.com +To: test@kolab.org +Subject: OpenPGP signed+encrypted with 2 text attachments +Date: Sun, 30 Aug 2015 12:01:20 +0200 +Message-ID: <4368981.7YjI8cQ7Br@vkpc5> +X-KMail-Identity: 402312391 +X-KMail-Dictionary: en_US +User-Agent: KMail/5.0.42 pre (Linux/3.16.6-2-desktop; KDE/5.14.0; x86_64; ; ) +MIME-Version: 1.0 +Content-Type: multipart/encrypted; boundary="nextPart3246504.5GAivIUY6Q"; protocol="application/pgp-encrypted" + +--nextPart3246504.5GAivIUY6Q +Content-Type: application/pgp-encrypted +Content-Disposition: attachment +Content-Transfer-Encoding: 7Bit + +Version: 1 +--nextPart3246504.5GAivIUY6Q +Content-Type: application/octet-stream +Content-Disposition: inline; filename="msg.asc" +Content-Transfer-Encoding: 7Bit + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2 + +hQEMAwzOQ1qnzNo7AQf9Ge9nFjtqLOKSQNhobS+0iCB2GUdLP7LCIWu6gBo9pWa+ +9wCNLxwmhqWOYv37RAk6v5VXjCYUX3/7UF7e7epSqo7YjS7VsUOow0gszQjJqocK +Gd1T1oyNknza6oaRGgVeWPOZVAPb+Gj+3yS8VZa33Aq2ay7F7eI8dvRUN7Z3TuAh +BOVV+itwHHzanfNG8RoCvokcE1vkANfvI3u7R4Q93U8Q+Qmjh1L5ypPe37N5BtAF +UCPCiD9XySHjm5PyXx8ImrJDeUgFs1YhYox4B6NKsCcmm7R8NdYZYGNo1kzR4yKV +FzMu1NUU/bwtvrpRXLe4dBL1pEkO2PpuMYDUR9+WVNLpAafTDbeIHPi/Z8v48seQ +JxscRehfOB3DG1xrvQTMFJc3UJEBqNMkM9gOxLKOQcCcZp79FMsfWB7EjjlPR1Oh +gyA5NR+4HxNw75Q5FpZ7qziWvIrb1Kzwfbsb9Dimx+MmiNMX9kUEPqkPo4pspwZ9 +pLCfjYUnikcnYyQ0b2ojsjQmLotYlz8mK0GH9L40zfFb1+oYfuu4Y9FPzHdPzNjx +aFRY8cJQy1CNkCITsz53kni5rk3zVsapq0+NeBDEBYoUqX815fo0W+HVF7/j/uhT +lPkJhRnJZPwOr5XgzPk3Yk9GlSRLJiqKF4/G8ya/nKyiNIebKM7DTcldWCmZM95B +BIftaRN4hvVBhl0ElFnZg0xLP1AePFuuplRQTDuW8gpaNKrxwXiF3d4XJdVmjh/p +YmnieIhbogUHFXugc3g9rE8c3oHA8b514ajSHUm9DXc0cXqw/DrsxXZtKXb+IDpF +uv9AiM7bSU7I0h/AlaAL5uU0mL58XhkXXFQtaTbMS+u4Rv/Ie1IsnlWR4QSc4m7x +91rfC1fIf/U43wwwnR+UjIRyr2vWcgTTpwnsZFDD8eSoJ8WqinazJRlMud6Sv+L6 +gI2wiCYyEYHrFEHy0WuS2nUSMNl5AWm31zB+erfKSLZr4EIFBIy4dJWZKwYhi46Q +pDbw1Svf7xVdHix+5UkkYy3AY70ipf5bxA7FTJ1geJa86VKShDkqVpU6EtT+YQIJ +7geWCyskT0DTaPp6qc8QpjajmRYssDcjiTke5WiqLQAjm8BIuny0fNm6kNC8KMS7 +eGmaBI2nB92bgrqlAW+LhvW95YB0dfO8beg3jKk8s6OJ4gicGFEFp6hXFfEsEZiv +gi7Q2QCVFvCV11884H8rtZYmMRFGmuVUvm6xh/z1xicmfSy0YUowgkA3jpi7o913 +fqmYOHAwzCxv8Zp7xBf9hLT8DxMXdxqYUnJ+FaEMRcFkJ1MAFBpQ9uDbbqAz5bd5 +F3d6o0JSleOOTDlNH7wpN15HYtaCx9v3mXLN9FY4Y1g4mE8wdU0JZn7sFEmgmAkV +/vj9khHS6eB01GPiCA6sy/u2tSdCQQ== +=1GHi +-----END PGP MESSAGE----- + +--nextPart3246504.5GAivIUY6Q-- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-encrypted-two-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-encrypted-two-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-encrypted-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-encrypted-two-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,88 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-encrypted-two-attachments.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-encrypted-two-attachments.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-encrypted-two-attachments.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-encrypted-two-attachments.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,10 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+additional-children.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+additional-children.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+additional-children.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+additional-children.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,126 @@ +Return-Path: +Delivered-To: einar@heavensinferno.net +Received: from localhost (localhost.localdomain [127.0.0.1]) + by akihabara.dennogumi.org (Postfix) with ESMTP id 15AB75CD846 + for ; Mon, 8 Apr 2013 12:15:03 +0200 (CEST) +Authentication-Results: akihabara.dennogumi.org; dkim=pass + (1024-bit key; insecure key) header.i=@kde.org header.b=vQ0NnJ9g; + dkim-adsp=pass +X-Virus-Scanned: Debian amavisd-new at akihabara.dennogumi.org +X-Spam-Flag: NO +X-Spam-Score: -3.818 +X-Spam-Level: +X-Spam-Status: No, score=-3.818 required=5 tests=[BAYES_50=0.8, + RCVD_IN_DNSWL_MED=-2.3, RP_MATCHES_RCVD=-2.328, T_DKIM_INVALID=0.01] + autolearn=unavailable +Received: from akihabara.dennogumi.org ([127.0.0.1]) + by localhost (akihabara.dennogumi.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id RMAq-XNJ040f for ; + Mon, 8 Apr 2013 12:14:44 +0200 (CEST) +Received: from postbox.kde.org (postbox.kde.org [46.4.96.248]) + by akihabara.dennogumi.org (Postfix) with ESMTP id 321675CD845 + for ; Mon, 8 Apr 2013 12:14:44 +0200 (CEST) +Authentication-Results: akihabara.dennogumi.org; dkim=pass + (1024-bit key; insecure key) header.i=@kde.org header.b=vQ0NnJ9g; + dkim-adsp=pass +Received: from postbox.kde.org (localhost [IPv6:::1]) + by postbox.kde.org (Postfix) with ESMTP id 9F5E1B37F95; + Mon, 8 Apr 2013 10:13:32 +0000 (UTC) +DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=kde.org; s=default; + t=1365416012; bh=ZJtmtbDLoGFwSyJUINdTk4UpuX+xzxcjGp7LSPrKNUs=; + h=From:To:Subject:Date:Message-ID:MIME-Version:Reply-To:List-Id: + List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: + Content-Type:Sender; b=vQ0NnJ9gjeyPLhPbQx6o9UxmILkS9KrhaKG6luAS/GR + 6iR3HKXR3HE0BCkTMD5xmKL5ztFMGcU5e79fz0ch0sd2pnZ0y1WVw7KjCxsv/YtO9HM + OplAHmhwRI5zH8KKQbyvdPULvssI/ISdViAXmHw04hNPsBjsIGkTPgvNbPFuk= +X-Original-To: plasma-devel@kde.org +Delivered-To: plasma-devel@localhost.kde.org +Received: from mail.bddf.ca (unknown [64.141.113.219]) + by postbox.kde.org (Postfix) with ESMTP id 782C6B37BE6 + for ; Mon, 8 Apr 2013 09:51:17 +0000 (UTC) +Received: from freedom.localnet (242.13.24.31.ftth.as8758.net [31.24.13.242]) + (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) + (No client certificate requested) + by mail.bddf.ca (Postfix) with ESMTPSA id 0CB712DC040 + for ; Mon, 8 Apr 2013 03:51:16 -0600 (MDT) +From: "Aaron J. Seigo" +To: plasma-devel@kde.org +Subject: activities_optional branch in kde-workspace +Date: Mon, 08 Apr 2013 11:51:11 +0200 +Message-ID: <4143483.eqrJjo7JEn@freedom> +User-Agent: KMail/4.11 pre (Linux/3.6.3-1-desktop; KDE/4.10.60; i686; + git-da50be0; 2013-03-12) +MIME-Version: 1.0 +X-Scanned-By: MIMEDefang 2.71 on 46.4.96.248 +X-BeenThere: plasma-devel@kde.org +X-Mailman-Version: 2.1.14 +Precedence: list +Reply-To: plasma-devel@kde.org +List-Id: +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +Content-Type: multipart/mixed; boundary="===============6664737512143839854==" +Errors-To: plasma-devel-bounces@kde.org +Sender: plasma-devel-bounces@kde.org + + +--===============6664737512143839854== +Content-Type: multipart/signed; boundary="nextPart1996263.NlFDv9GTkA"; micalg="pgp-sha1"; protocol="application/pgp-signature" + + +--nextPart1996263.NlFDv9GTkA +Content-Transfer-Encoding: 7Bit +Content-Type: text/plain; charset="us-ascii" + +hi.. + +i noticed a new branch when i pulled kde-workspace today (finally!): +activities_optional + +the lone commit in it was pushed on april 1, so maybe it's an april fools +joke, but if it isn't, it looks like someone is trying to do something that +makes no sense (and has no chance of being merged into master). so if this is +a "for reals" branch, perhaps the motivation behind it can be shared? + +-- +Aaron J. Seigo +--nextPart1996263.NlFDv9GTkA +Content-Type: application/pgp-signature; name="signature.asc" +Content-Description: This is a digitally signed message part. +Content-Transfer-Encoding: 7Bit + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2.0.19 (GNU/Linux) + +iEUEABECAAYFAlFikxAACgkQ1rcusafx20MHbwCfeXOgTDwtR81XJwAdcQB40Lt7 +t2IAmJpIZxdU+SSruySeEfbQs3VXq/8= +=BQPF +-----END PGP SIGNATURE----- +--nextPart1996263.NlFDv9GTkA +Content-Type: text/plain; name="broken.attachment" +Content-Transfer-Encoding: 7Bit + +Let's break a signed message - This messageblock should not be here :D + +--nextPart1996263.NlFDv9GTkA-- + + +--===============6664737512143839854== +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Content-Disposition: inline + +_______________________________________________ +Plasma-devel mailing list +Plasma-devel@kde.org +https://mail.kde.org/mailman/listinfo/plasma-devel + +--===============6664737512143839854==-- + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+additional-children.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+additional-children.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+additional-children.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+additional-children.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,60 @@ + + + + +
+ + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+additional-children.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+additional-children.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+additional-children.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+additional-children.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,10 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,121 @@ +Return-Path: +Delivered-To: einar@heavensinferno.net +Received: from localhost (localhost.localdomain [127.0.0.1]) + by akihabara.dennogumi.org (Postfix) with ESMTP id 15AB75CD846 + for ; Mon, 8 Apr 2013 12:15:03 +0200 (CEST) +Authentication-Results: akihabara.dennogumi.org; dkim=pass + (1024-bit key; insecure key) header.i=@kde.org header.b=vQ0NnJ9g; + dkim-adsp=pass +X-Virus-Scanned: Debian amavisd-new at akihabara.dennogumi.org +X-Spam-Flag: NO +X-Spam-Score: -3.818 +X-Spam-Level: +X-Spam-Status: No, score=-3.818 required=5 tests=[BAYES_50=0.8, + RCVD_IN_DNSWL_MED=-2.3, RP_MATCHES_RCVD=-2.328, T_DKIM_INVALID=0.01] + autolearn=unavailable +Received: from akihabara.dennogumi.org ([127.0.0.1]) + by localhost (akihabara.dennogumi.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id RMAq-XNJ040f for ; + Mon, 8 Apr 2013 12:14:44 +0200 (CEST) +Received: from postbox.kde.org (postbox.kde.org [46.4.96.248]) + by akihabara.dennogumi.org (Postfix) with ESMTP id 321675CD845 + for ; Mon, 8 Apr 2013 12:14:44 +0200 (CEST) +Authentication-Results: akihabara.dennogumi.org; dkim=pass + (1024-bit key; insecure key) header.i=@kde.org header.b=vQ0NnJ9g; + dkim-adsp=pass +Received: from postbox.kde.org (localhost [IPv6:::1]) + by postbox.kde.org (Postfix) with ESMTP id 9F5E1B37F95; + Mon, 8 Apr 2013 10:13:32 +0000 (UTC) +DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=kde.org; s=default; + t=1365416012; bh=ZJtmtbDLoGFwSyJUINdTk4UpuX+xzxcjGp7LSPrKNUs=; + h=From:To:Subject:Date:Message-ID:MIME-Version:Reply-To:List-Id: + List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: + Content-Type:Sender; b=vQ0NnJ9gjeyPLhPbQx6o9UxmILkS9KrhaKG6luAS/GR + 6iR3HKXR3HE0BCkTMD5xmKL5ztFMGcU5e79fz0ch0sd2pnZ0y1WVw7KjCxsv/YtO9HM + OplAHmhwRI5zH8KKQbyvdPULvssI/ISdViAXmHw04hNPsBjsIGkTPgvNbPFuk= +X-Original-To: plasma-devel@kde.org +Delivered-To: plasma-devel@localhost.kde.org +Received: from mail.bddf.ca (unknown [64.141.113.219]) + by postbox.kde.org (Postfix) with ESMTP id 782C6B37BE6 + for ; Mon, 8 Apr 2013 09:51:17 +0000 (UTC) +Received: from freedom.localnet (242.13.24.31.ftth.as8758.net [31.24.13.242]) + (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) + (No client certificate requested) + by mail.bddf.ca (Postfix) with ESMTPSA id 0CB712DC040 + for ; Mon, 8 Apr 2013 03:51:16 -0600 (MDT) +From: "Aaron J. Seigo" +To: plasma-devel@kde.org +Subject: activities_optional branch in kde-workspace +Date: Mon, 08 Apr 2013 11:51:11 +0200 +Message-ID: <4143483.eqrJjo7JEn@freedom> +User-Agent: KMail/4.11 pre (Linux/3.6.3-1-desktop; KDE/4.10.60; i686; + git-da50be0; 2013-03-12) +MIME-Version: 1.0 +X-Scanned-By: MIMEDefang 2.71 on 46.4.96.248 +X-BeenThere: plasma-devel@kde.org +X-Mailman-Version: 2.1.14 +Precedence: list +Reply-To: plasma-devel@kde.org +List-Id: +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +Content-Type: multipart/mixed; boundary="===============6664737512143839854==" +Errors-To: plasma-devel-bounces@kde.org +Sender: plasma-devel-bounces@kde.org + + +--===============6664737512143839854== +Content-Type: multipart/signed; boundary="nextPart1996263.NlFDv9GTkA"; micalg="pgp-sha1"; protocol="application/pgp-signature" + + +--nextPart1996263.NlFDv9GTkA +Content-Transfer-Encoding: 7Bit +Content-Type: text/plain; charset="us-ascii" + +hi.. + +i noticed a new branch when i pulled kde-workspace today (finally!): +activities_optional + +the lone commit in it was pushed on april 1, so maybe it's an april fools +joke, but if it isn't, it looks like someone is trying to do something that +makes no sense (and has no chance of being merged into master). so if this is +a "for reals" branch, perhaps the motivation behind it can be shared? + +-- +Aaron J. Seigo +--nextPart1996263.NlFDv9GTkA +Content-Type: application/pgp-signature; name="signature.asc" +Content-Description: This is a digitally signed message part. +Content-Transfer-Encoding: 7Bit + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2.0.19 (GNU/Linux) + +iEUEABECAAYFAlFikxAACgkQ1rcusafx20MHbwCfeXOgTDwtR81XJwAdcQB40Lt7 +t2IAmJpIZxdU+SSruySeEfbQs3VXq/8= +=BQPF +-----END PGP SIGNATURE----- + +--nextPart1996263.NlFDv9GTkA-- + + +--===============6664737512143839854== +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Content-Disposition: inline + +_______________________________________________ +Plasma-devel mailing list +Plasma-devel@kde.org +https://mail.kde.org/mailman/listinfo/plasma-devel + +--===============6664737512143839854==-- + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,65 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist.mbox.inProgress.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist.mbox.inProgress.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist.mbox.inProgress.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist.mbox.inProgress.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,56 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,7 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+old.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+old.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+old.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+old.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,67 @@ +Return-Path: +Delivered-To: einar@heavensinferno.net +From: "Aaron J. Seigo" +To: plasma-devel@kde.org +Subject: activities_optional branch in kde-workspace +Date: Mon, 08 Apr 2013 11:51:11 +0200 +Message-ID: <4143483.eqrJjo7JEn@freedom> +User-Agent: KMail/4.11 pre (Linux/3.6.3-1-desktop; KDE/4.10.60; i686; + git-da50be0; 2013-03-12) +X-Mailman-Version: 2.1.14 +Precedence: list +Reply-To: plasma-devel@kde.org +List-Id: +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +Errors-To: plasma-devel-bounces@kde.org +Sender: plasma-devel-bounces@kde.org + +Oh man a header :) + +--__--__-- + +Message: +MIME-Version: 1.0 +Content-Type: multipart/signed; boundary="nextPart1996263.NlFDv9GTkA"; micalg="pgp-sha1"; protocol="application/pgp-signature" + + +--nextPart1996263.NlFDv9GTkA +Content-Transfer-Encoding: 7Bit +Content-Type: text/plain; charset="us-ascii" + +hi.. + +i noticed a new branch when i pulled kde-workspace today (finally!): +activities_optional + +the lone commit in it was pushed on april 1, so maybe it's an april fools +joke, but if it isn't, it looks like someone is trying to do something that +makes no sense (and has no chance of being merged into master). so if this is +a "for reals" branch, perhaps the motivation behind it can be shared? + +-- +Aaron J. Seigo +--nextPart1996263.NlFDv9GTkA +Content-Type: application/pgp-signature; name="signature.asc" +Content-Description: This is a digitally signed message part. +Content-Transfer-Encoding: 7Bit + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2.0.19 (GNU/Linux) + +iEUEABECAAYFAlFikxAACgkQ1rcusafx20MHbwCfeXOgTDwtR81XJwAdcQB40Lt7 +t2IAmJpIZxdU+SSruySeEfbQs3VXq/8= +=BQPF +-----END PGP SIGNATURE----- + +--__--__-- + +_______________________________________________ +Plasma-devel mailing list +Plasma-devel@kde.org +https://mail.kde.org/mailman/listinfo/plasma-devel \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+old.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+old.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+old.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+old.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,94 @@ + + + + +
+ + +
+ + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+old.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+old.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+old.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-mailinglist+old.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,13 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::MessagePartList + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::EncapsulatedRfc822MessagePart + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-no-protocol.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-no-protocol.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-no-protocol.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-no-protocol.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,35 @@ +Return-Path: +Delivered-To: einar@heavensinferno.net +Content-Type: multipart/signed; boundary="nextPart1996263.NlFDv9GTkA"; micalg="pgp-sha1"; protocol="application/broken-signature" + + +--nextPart1996263.NlFDv9GTkA +Content-Transfer-Encoding: 7Bit +Content-Type: text/plain; charset="us-ascii" + +hi.. + +i noticed a new branch when i pulled kde-workspace today (finally!): +activities_optional + +the lone commit in it was pushed on april 1, so maybe it's an april fools +joke, but if it isn't, it looks like someone is trying to do something that +makes no sense (and has no chance of being merged into master). so if this is +a "for reals" branch, perhaps the motivation behind it can be shared? + +-- +Aaron J. Seigo +--nextPart1996263.NlFDv9GTkA +Content-Type: application/broken-signature; name="signature.asc" +Content-Description: This is a digitally signed message part. +Content-Transfer-Encoding: 7Bit + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2.0.19 (GNU/Linux) + +iEUEABECAAYFAlFikxAACgkQ1rcusafx20MHbwCfeXOgTDwtR81XJwAdcQB40Lt7 +t2IAmJpIZxdU+SSruySeEfbQs3VXq/8= +=BQPF +-----END PGP SIGNATURE----- + +--nextPart1996263.NlFDv9GTkA-- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-no-protocol.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-no-protocol.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-no-protocol.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-no-protocol.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,36 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-no-protocol.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-no-protocol.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-no-protocol.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-no-protocol.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,5 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::AttachmentMessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-two-attachments.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-two-attachments.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-two-attachments.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-two-attachments.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,54 @@ +From: firstname.lastname@example.com +To: test@kolab.org +Subject: OpenPGP signed with 2 text attachments +Date: Sun, 30 Aug 2015 12:02:56 +0200 +Message-ID: <2033829.IGepAdxqt9@vkpc5> +X-KMail-Identity: 402312391 +X-KMail-Dictionary: en_US +User-Agent: KMail/5.0.42 pre (Linux/3.16.6-2-desktop; KDE/5.14.0; x86_64; ; ) +MIME-Version: 1.0 +Content-Type: multipart/signed; boundary="nextPart3682207.KLrp2sxpbf"; micalg="pgp-sha1"; protocol="application/pgp-signature" + +--nextPart3682207.KLrp2sxpbf +Content-Type: multipart/mixed; boundary="nextPart2397422.QDHKUNdbyg" +Content-Transfer-Encoding: 7Bit + +This is a multi-part message in MIME format. + +--nextPart2397422.QDHKUNdbyg +Content-Transfer-Encoding: 7Bit +Content-Type: text/plain; charset="us-ascii" + +this is the main body text +--nextPart2397422.QDHKUNdbyg +Content-Disposition: inline; filename="attachment1.txt" +Content-Transfer-Encoding: 7Bit +Content-Type: text/plain; charset="utf-8"; name="attachment1.txt" + +this is attachment one +--nextPart2397422.QDHKUNdbyg +Content-Disposition: inline; filename="attachment2.txt" +Content-Transfer-Encoding: 7Bit +Content-Type: text/plain; charset="utf-8"; name="attachment2.txt" + +this is attachment two +--nextPart2397422.QDHKUNdbyg-- + +--nextPart3682207.KLrp2sxpbf +Content-Type: application/pgp-signature; name="signature.asc" +Content-Description: This is a digitally signed message part. +Content-Transfer-Encoding: 7Bit + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2 + +iQEVAwUAVeLU0I2YYMWPJG3mAQL/fgf+LXmO7bKafdd4g5OOVHHyXRprVmX/6hBq +mZoor29KLIHkvAH9OJi4qBy/ZKwqqKLfttLzHb2UaAfl5kn4f0ckmnwUhU7u32Sm +JZ0Q50SxrRVFRyvTvPG22ho9IwQUO1YSZrL4wO9v8ZBQ3vkfpmAiUQVxPQMINc8L +i68xQEm4y1Dtoc+DTUkoIMeOOPnEl6PTMPrwn906K0r30hI4788fEGRn6uOXb+vD +G/ISlXu+JHIxxf/J5/jVjKNbra+trrfSPzB3piJIjBLEPO5FvLx8SgQFJcJHt/kw +ps8D5YULj/MVMLlsPtXDdZmbOi/G9pN0tr05MKcXsO5Ywe7n2BhASw== +=2Nzb +-----END PGP SIGNATURE----- + +--nextPart3682207.KLrp2sxpbf-- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-two-attachments.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-two-attachments.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-two-attachments.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-two-attachments.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,71 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-two-attachments.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-two-attachments.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/openpgp-signed-two-attachments.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/openpgp-signed-two-attachments.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,9 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/signed-forward-openpgp-signed-encrypted.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/signed-forward-openpgp-signed-encrypted.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/signed-forward-openpgp-signed-encrypted.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/signed-forward-openpgp-signed-encrypted.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,92 @@ +From test@kolab.org Wed, 08 Sep 2010 17:53:29 +0200 +From: OpenPGP Test +Subject: Signed Fwd: OpenPGP signed and encrypted +Date: Wed, 08 Sep 2010 17:53:29 +0200 +User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) +MIME-Version: 1.0 +Content-Type: multipart/signed; boundary="nextPart4350242.cT7m6ulPOV"; micalg="pgp-sha1"; protocol="application/pgp-signature" +Content-Transfer-Encoding: 7Bit + + +--nextPart4350242.cT7m6ulPOV +Content-Type: multipart/mixed; boundary="nextPart1512490.WQBKYaOrt8" +Content-Transfer-Encoding: 7Bit + + +--nextPart1512490.WQBKYaOrt8 +Content-Transfer-Encoding: 7Bit +Content-Type: text/plain; charset="us-ascii" + +bla bla bla +--nextPart1512490.WQBKYaOrt8 +Content-Type: message/rfc822 +Content-Disposition: inline; filename="forwarded message" +Content-Description: OpenPGP Test : OpenPGP signed and encrypted + +From: OpenPGP Test +To: test@kolab.org +Subject: OpenPGP signed and encrypted +Date: Tue, 07 Sep 2010 18:08:44 +0200 +User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) +MIME-Version: 1.0 +Content-Type: multipart/encrypted; boundary="nextPart25203163.0xtB501Z4V"; protocol="application/pgp-encrypted" +Content-Transfer-Encoding: 7Bit + + +--nextPart25203163.0xtB501Z4V +Content-Type: application/pgp-encrypted +Content-Disposition: attachment + +Version: 1 +--nextPart25203163.0xtB501Z4V +Content-Type: application/octet-stream +Content-Disposition: inline; filename="msg.asc" + +-----BEGIN PGP MESSAGE----- +Version: GnuPG v2.0.15 (GNU/Linux) + +hQEMAwzOQ1qnzNo7AQf7BFYWaGiCTGtXY59bSh3LCXNnWZejblYALxIUNXOFEXbm +y/YA95FmQsy3U5HRCAJV/DY1PEaJz1RTm9bcdIpDC3Ab2YzSwmOwV5fcoUOB2df4 +KjX19Q+2F3JxpPQ0N1gHf4dKfIu19LH+CKeFzUN13aJs5J4A5wlj+NjJikxzmxDS +kDtNYndynPmo9DJQcsUFw3gpvx5HaHvx1cT4mAB2M5cd2l+vN1jYbaWb0x5Zq41z +mRNI89aPieC3rcM2289m68fGloNbYvi8mZJu5RrI4Tbi/D7Rjm1y63lHgVV6AN88 +XAzRiedOeF99LoTBulrJdtT8AAgCs8nCetcWpIffdtLpAZiZkzHmYOU7nqGxqpRk +OVeUTrCn9DW2SMmHjaP4IiKnMvzEycu5F4a72+V1LeMIhMSjTRTq+ZE2PTaqH59z +QsMn7Nb6GlOICbTptRKNNtyJKO7xXlpT7YtvNKnCyEOkH2XrYH7GvpYCiuQ0/o+7 +SxV436ZejiYIg6DQDXJCoa2DXimGp0C10Jh0HwX0BixpoNtwEjkGRYcX6P/JzkH0 +oBood4Ly+Tiu6iVDisrK3AVGYpIzCrKkE9qULTw4R/jFKR2tcCqGb7Fxtk2LV7Md +3S+DyOKrvKQ5GNwbp9OE97pwk+Lr1JS3UAvj5f6BR+1PVNcC0i0wWkgwDjPh1eGD +enMQmorE6+N0uHtH2F4fOxo/TbbA3+zhI25kVW3bO03xyUl/cmQZeb52nvfOvtOo +gSb2j6bPkzljDMPEzrtJjbFtGHJbPfUQYJgZv9OE2EQIqpg6goIw279alBq6GLIX +pkO+dRmztzjcDyhcLxMuQ4cTizel/0J/bU7U6lvwHSyZVbT4Ev+opG5K70Hbqbwr +NZcgdWXbSeesxGM/oQaMeSurOevxVl+/zrTVAek61aRRd1baAYqgi2pf2V7y4oK3 +qkdxzmoFpRdNlfrQW65NZWnHOi9rC9XxANIwnVn3kRcDf+t2K4PrFluI157lXM/o +wX91j88fazysbJlQ6TjsApO9ETiPOFEBqouxCTtCZzlUgyVG8jpIjdHWFnagHeXH ++lXNdYjxnTWTjTxMOZC9ySMpXkjWdFI1ecxVwu6Ik6RX51rvBJAAXWP75yUjPKJ4 +rRi5oQl/VLl0QznO7lvgMPtUwgDVNWO/r7Kn9B387h9fAJZ/kWFAEDW2yhAzABqO +rCNKDzBPgfAwCnikCpMoCbOL7SU8BdbzQHD8/Lkv4m0pzliHQ/KkGF710koBzTmF +N7+wk9pwIuvcrEBQj567 +=GV0c +-----END PGP MESSAGE----- + +--nextPart25203163.0xtB501Z4V-- + +--nextPart1512490.WQBKYaOrt8-- + +--nextPart4350242.cT7m6ulPOV +Content-Type: application/pgp-signature; name="signature.asc" +Content-Description: This is a digitally signed message part. + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2.0.15 (GNU/Linux) + +iQEcBAABAgAGBQJMh7F5AAoJEI2YYMWPJG3mOB0IALeHfwg8u7wK0tDKtKqxQSqC +2Bbk4pTLuLw/VniQNauDG+kc1eUc5RJk/R31aB1ysiQCV5Q8ucI8c9vCDDMbd+s4 +t2bZUEzMpXrw/aFiHgYGXFAY+tpqZqDGNVRNHWsPYJKtx8cci9E5DLnBJcVXVqib +3iiHlr9AQOok3PUmpPk1a61q2L0kk8wqRenC0yZXNw5qFn5WW/hFeCOfYB+t+s5N +IuE6ihFCJIlvGborrvl6VgPJTCyUQ3XgI90vS6ABN8TFlCNr3grXOWUePc2a20or +xFgh38cnSR64WJajU5K1nUL9/RgfIcs+PvyHuJaRf/iUFkj1jiMEuaSi9jVFco0= +=bArV +-----END PGP SIGNATURE----- + +--nextPart4350242.cT7m6ulPOV-- diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/signed-forward-openpgp-signed-encrypted.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/signed-forward-openpgp-signed-encrypted.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/signed-forward-openpgp-signed-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/signed-forward-openpgp-signed-encrypted.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,105 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/signed-forward-openpgp-signed-encrypted.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/signed-forward-openpgp-signed-encrypted.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/signed-forward-openpgp-signed-encrypted.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/signed-forward-openpgp-signed-encrypted.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,10 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart + * MimeTreeParser::EncapsulatedRfc822MessagePart + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-cert.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-cert.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-cert.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-cert.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,24 @@ +From test@example.com Sat, 13 Apr 2013 01:54:30 +0200 +From: test +To: you@you.com +Subject: test +Date: Sat, 13 Apr 2013 01:54:30 +0200 +Message-ID: <1576646.QQxzHWx8dA@tabin> +X-KMail-Identity: 505942601 +User-Agent: KMail/4.10.2 (Linux/3.9.0-rc4-experimental-amd64; KDE/4.10.60; x86_64; git-fc9b82c; 2013-04-11) +MIME-Version: 1.0 +Content-Type: application/pkcs7-mime; name="smime.crt"; smime-type="certs-only" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.crt" + +asdfasdfasdfasdfasdfasdfasdfasdf +asdfasdfadsfsadfasdf +asdfasdf +sadfas +dfasdf +sadf +sadf +adsf +adsf +asdf + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-cert.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-cert.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-cert.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-cert.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,10 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-cert.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-cert.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-cert.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-cert.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,2 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::CertMessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-encrypted.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-encrypted.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-encrypted.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-encrypted.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,22 @@ +From test@example.com Sat, 13 Apr 2013 01:54:30 +0200 +From: test +To: you@you.com +Subject: test +Date: Sat, 13 Apr 2013 01:54:30 +0200 +Message-ID: <1576646.QQxzHWx8dA@tabin> +X-KMail-Identity: 505942601 +User-Agent: KMail/4.10.2 (Linux/3.9.0-rc4-experimental-amd64; KDE/4.10.60; x86_64; git-fc9b82c; 2013-04-11) +MIME-Version: 1.0 +Content-Type: application/pkcs7-mime; name="smime.p7m"; smime-type="enveloped-data" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7m" + +MIAGCSqGSIb3DQEHA6CAMIACAQAxgfwwgfkCAQAwYjBVMQswCQYDVQQGEwJVUzENMAsGA1UECgwE +S0RBQjEWMBQGA1UEAwwNdW5pdHRlc3QgY2VydDEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxl +LmNvbQIJANNFIDoYY4XJMA0GCSqGSIb3DQEBAQUABIGAJwmmaOeidXUHSQGOf2OBIsPYafVqdORe +y54pEXbXiAfSVUWgI4a9CsiWwcDX8vlaX9ZLLr+L2VmOfr6Yc5214yxzausZVvnUFjy6LUXotuEX +tSar4EW7XI9DjaZc1l985naMsTx9JUa5GyQ9J6PGqhosAKpKMGgKkFAHaOwE1/IwgAYJKoZIhvcN +AQcBMBQGCCqGSIb3DQMHBAieDfmz3WGbN6CABHgEpsLrNn0PAZTDUfNomDypvSCl5bQH+9cKm80m +upMV2r8RBiXS7OaP4SpCxq18afDTTPatvboHIoEX92taTbq8soiAgEs6raSGtEYZNvFL0IYqm7MA +o5HCOmjiEcInyPf14lL3HnPk10FaP3hh58qTHUh4LPYtL7UECOZELYnUfUVhAAAAAAAAAAAAAA== + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-encrypted.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-encrypted.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-encrypted.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,31 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-encrypted.mbox.inProgress.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-encrypted.mbox.inProgress.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-encrypted.mbox.inProgress.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-encrypted.mbox.inProgress.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,24 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-encrypted.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-encrypted.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-encrypted.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-encrypted.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-encrypted-octet-stream.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-encrypted-octet-stream.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-encrypted-octet-stream.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-encrypted-octet-stream.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,23 @@ +From test@example.com Sat, 13 Apr 2013 01:54:30 +0200 +From: test +To: you@you.com +Subject: test +Date: Sat, 13 Apr 2013 01:54:30 +0200 +Message-ID: <1576646.QQxzHWx8dA@tabin> +X-KMail-Identity: 505942601 +User-Agent: KMail/4.10.2 (Linux/3.9.0-rc4-experimental-amd64; KDE/4.10.60; x86_64; git-fc9b82c; 2013-04-11) +MIME-Version: 1.0 +Content-Type: application/octet-stream; + name="smime.p7m" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7m" + +MIAGCSqGSIb3DQEHA6CAMIACAQAxgfwwgfkCAQAwYjBVMQswCQYDVQQGEwJVUzENMAsGA1UECgwE +S0RBQjEWMBQGA1UEAwwNdW5pdHRlc3QgY2VydDEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxl +LmNvbQIJANNFIDoYY4XJMA0GCSqGSIb3DQEBAQUABIGAJwmmaOeidXUHSQGOf2OBIsPYafVqdORe +y54pEXbXiAfSVUWgI4a9CsiWwcDX8vlaX9ZLLr+L2VmOfr6Yc5214yxzausZVvnUFjy6LUXotuEX +tSar4EW7XI9DjaZc1l985naMsTx9JUa5GyQ9J6PGqhosAKpKMGgKkFAHaOwE1/IwgAYJKoZIhvcN +AQcBMBQGCCqGSIb3DQMHBAieDfmz3WGbN6CABHgEpsLrNn0PAZTDUfNomDypvSCl5bQH+9cKm80m +upMV2r8RBiXS7OaP4SpCxq18afDTTPatvboHIoEX92taTbq8soiAgEs6raSGtEYZNvFL0IYqm7MA +o5HCOmjiEcInyPf14lL3HnPk10FaP3hh58qTHUh4LPYtL7UECOZELYnUfUVhAAAAAAAAAAAAAA== + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-encrypted-octet-stream.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-encrypted-octet-stream.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-encrypted-octet-stream.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-encrypted-octet-stream.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,31 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-encrypted-octet-stream.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-encrypted-octet-stream.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-encrypted-octet-stream.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-encrypted-octet-stream.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-opaque-enc+sign.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-opaque-enc+sign.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-opaque-enc+sign.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-opaque-enc+sign.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,37 @@ +From test@example.com Fri Sep 11 10:18:48 2015 +From: test +To: you@you.com +Subject: enc+sign +Date: Fri, 11 Sep 2015 12:18:48 +0200 +Message-ID: <49743203.WFa6qKaG4S@tabin.local> +X-KMail-Identity: 792434561 +User-Agent: KMail/4.13.0.1 (Linux/4.1.5-towo.1-siduction-amd64; KDE/4.14.2; x86_64; ; ) +MIME-Version: 1.0 +Content-Type: application/pkcs7-mime; name="smime.p7m"; smime-type="enveloped-data" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7m" + +MIAGCSqGSIb3DQEHA6CAMIACAQAxgfwwgfkCAQAwYjBVMQswCQYDVQQGEwJVUzENMAsGA1UECgwE +S0RBQjEWMBQGA1UEAwwNdW5pdHRlc3QgY2VydDEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxl +LmNvbQIJANNFIDoYY4XJMA0GCSqGSIb3DQEBAQUABIGAkttyRl8OyZkRGfs3CMfzYchrG4rRMfbE +WIkAFIXf64yAzPZfo6cCn0Il/6q4793FeKUrsJUvzP21KBLp4u1t5qLL5iPAmAzBdLg0teoEzLZe +CEZHinM+WSMdz2wEV8lgAt8x/3yhXmDMB09FEapUaBCK5NhbLAFkpI2mFg66zxcwgAYJKoZIhvcN +AQcBMB0GCWCGSAFlAwQBAgQQ6DSjjkXJNm5cXQNek9eozqCABIIDsI7lufqw58g/uVM2gymkldmb +BOgdimxshJkYznbbG5sfQPNM9ROhXKRUOc8hfzgmZ9dOZvtAyzepROMHrcL1mFFx7c1vgyT85fai +PLEqRs8FRoztXJ0I3q57r+sPW4BtYJp9WCBSerdLSrBFK1zvKpVQtSCYbbDCc3462KnSsBrE4XTf +BiiLWkpok4fNIdqYG1aWPLgRbp7wwLiXcq5RxYCail1tlyAty6dWBrYE1+ABZoqnKUqNqbghxJUd +X9t3EziUnzw7c0Hq03sJEShzbXI9BxOTs8ZZ+1Ktx3rdh6RhZZ7XfJ7XIuN0yYhusBeOgC8AuILN +lYojgmXMin52VPFmz9siI8jnKaqsr1uUqVfMLNc+mLhZEjuOu99eAHwdJUS95BKWm9J8DBe/lpz3 +s09Oz2oOoiQx0WxKmQZ4GXW/UI9OwykfNLqWfmDrbMbGW4Mvq615ucHZixFdp2vf3kU72wfk8hFK +EIU/1Ov85glDj96ELdXErXn02BNvVBQIsRx3DbBGEgj9tz+WHbCR6RjEK4eV5lhInZplFGmYr4Uu +9ALS+MRGTYZnALNPrWu6b1aWprnlJCyKZeeyqUzpQVPoWOh7CfdvBxvQoil4Z9Neb9O0AGCZ0axc +zZ4yYcS/LpHkLgYPC5BphNtpyciQh6ZFeexi8rsZuHRu+YUKnuM+DQyUxtUvDYhiX7CT49MMXIwt +bdyA0IAbIXXb/Us9GGX11gAfz2EFI3QBDHtsyciEgCIlA32OiiJF0T5CnQsku2yu6c3TWC4k+feL +jjTEhm/KPUL6SkksarFeEncJlVt7impW9FlHyBpISwlQF4RAxDYTRX475VTNu7wn3PQx376m8iBN +K20MjdfIM162jcQh9IWnqTZ0nH/gT2kQPYe7GqjFi6XmU3bwdzW9SXR0G9A8juIXaaNR7aXcsB53 +/W4WHPcdJBwRELa0dT1/bPg8z3EV2vM7Flc/Q5ugTWHxk8GHNEPpotArpLq1sEAZu78mSCqzzEDA +TwzEpj9LZYIv4rDYYLCAxUR9YGhiJ5Qm21YnklkE++4zfpsl/KJcwtNsp7SWdzeVuPoUYBNhsgp/ +PZgudzQoOhxcF4ChHMVSNk1f1tlvXZppeXwv9OwpSszz0zZUr46ievpkQwL0Sa1XAfKwAt7bFJwp +i95ae7p58ZdizJVsz0QUhFDxIDL76qiPEYXC7nIf4ZPQ36dzLAfZ6OwWGffluxHpE6oqUoM3l320 +7yQT66xfRKLGl5Cr1Q8UBBABC6aR2dt6RVbsxbR3mB0PAAAAAAAAAAAAAA== + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-opaque-enc+sign.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-opaque-enc+sign.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-opaque-enc+sign.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-opaque-enc+sign.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,57 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-opaque-enc+sign.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-opaque-enc+sign.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-opaque-enc+sign.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-opaque-enc+sign.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,5 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-opaque-signed-encrypted-attachment.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-opaque-signed-encrypted-attachment.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-opaque-signed-encrypted-attachment.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-opaque-signed-encrypted-attachment.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,50 @@ +From test@example.com Thu Jun 09 12:52:44 2016 +From: test@example.com +To: test@example.com +Subject: Opaque S/MIME signed and encrypted message with attachment +Date: Thu, 09 Jun 2016 14:52:44 +0200 +MIME-Version: 1.0 +Content-Type: application/pkcs7-mime; name="smime.p7m"; smime-type="enveloped-data" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7m" + +MIAGCSqGSIb3DQEHA6CAMIACAQAxgfwwgfkCAQAwYjBVMQswCQYDVQQGEwJVUzEN +MAsGA1UECgwES0RBQjEWMBQGA1UEAwwNdW5pdHRlc3QgY2VydDEfMB0GCSqGSIb3 +DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJANNFIDoYY4XJMA0GCSqGSIb3DQEBAQUA +BIGAalG2EoXQOhvVPCef5ru1+++vAfIED/abw8gFPuqWmh1nK2x2Q13U+7I7bv6a +uK2msunHmNwgvNetJ1j4PPMePCU5I0F0jGw5PB8A6lgF8IGzEzU5W9gz1PazKGl4 +PTwxAoJgCeflZwtddGEJvQ86f4OduXEnDmirFg64WUk1jjMwgAYJKoZIhvcNAQcB +MB0GCWCGSAFlAwQBAgQQvthEtJX37uYX68Ri3kURq6CABIIGEOr7cxjOVKzXfAYk +1eBd/HiYcpLlttlNCcwTuQwP0pDpE9YnDA+MfgZn05hxODZDACsOschWFZXBXVY1 +OY/ZTpVYRxAdYXgPymK8+r9fym0A+YiQ5/yKbWjezDmHdOOv6JF03Z+VzBmZtFcL +q/LPr0+EcjiPA9r/EQTA7P1pj+tOAm3krk8s4P+9yDAIQLCQt9yUdbpMsgn1OyJv +Njl7Mq5qcQXdnYYsTF6ODZ9araHOYDS64yP69h+Lh6nsBNWD7W6NvNsS6Hmgkzvg +FK3TNxU+X5x1F7TvKyCSRyWicfV66F/sBXIEo6K8h/rSi978jALahJPZZzNoyQiQ +eaMCjXwuBbeobcChwkRRzU12h07AXhGgZA9AkHIsFAAE4gwnu7yoogLrQqslm/MF +NGlbO68zyw0znK3eqzsOaXDyeLWy1zJcTffOENPhqzbPAPYn4ctyOLucCgSJkRAb +jiKuzgrugxu+J83CBnj5QgOhO++u5gl28UT/hC9eiEbbRZrYt9XCnSOrJiUhH8Gq +i70l/ZQzRGEenc5Oox8gEPT712pBezX4zj1Ow9RibhaU50TPaP+HoCrb3hxX4AMZ ++I9KZucVsgFlezf4IKjtAS/ro4jJLB/u0HhsT5Ury7T5/cobVhK1j2q+q6juKOac +Z7ro/572cTonFqR9zZNOawZTeRpK3f+Dl+Q1S6wid626btg3Li1M1jQAdyGOaRDN +JNcKMFB1XwuE9He4Xs4wvFlNIz4xvoBRwf8EybFmSEyaS3qLbl322Un/z9sCpeZM +fsyUED+YaTHqJhi+XTjWAxy5VfycFu2Ev6EKNItnkkjXOoAXl0Fg7nrnVijKgo+a +4C4RO3nu4IouJlel3Lt9YyFW6CqOb2sARjJHOZtirMHUORm2aAlCnmvcPlBT8s1/ +GaG6e5heeoCMRwD37+rWauAjCvMyMc5JsFF7EUECvQB/7nGQb4JZoPsTW1cQRXDE +mY+horsIpVrXsnsdvYco7itilJAvQUz6YGsyGirMwdHktA8YClVrNArP/HfyLUu1 +uHAhDa0TG6/bouuReHQjrI0CL1k6J7dEfxXgQbAy1FH17/8JgvNT6R+TkL+KcgW6 +VV6tPsmivsZI7mCz1np/uXZX4+t4/6Ei5+kJCLsF1TmEd0mfBioJw7Mqd0Asr+bw +BasZKQG4gVHRjg6EXdSjQ9RoGhR8Q+R2hsb+Pj/z6GVtJTg4dVYRRjRP52tOb3Qx +W4XlzJR/lGjExe4h0D/x2vZnWlE5JvDPPq2Ni2yBeoX2+wgtFYqKGH1f319OMRXs +/BSk/bF7wdeeGn9FDSiQHlvfKJpToC86Yt25ZjGmGH0gbvrFLAd+a5y1046iHauz +mf9cQVM6NJJKngSDUK0JgDLQgdAvZCcqPp/vCfdKC0fzMTDXkkV6eqKTexHQ1oTu +ryWYHdGA+qzQO3OKDwlXTaCLnPN0Ke8BaAB7CJw9hR5t0cdw5e2nSzY96BK97tZy +qOlRKGbuSzv9GGp5RS6qFj9o8GrqCnZZTuDz2+D++yjT4Cg1QfL7Dp/YzpCeZ9vA +v5DMnjM6NUePYX145NgNtVm6y+ThAx4hBm42+B8nZ94GmCXf2MZModpcsnpTZlPe +4F7Hd/rBJG8MkEFPXgxuYF0B5HTlbr/33IsGtXYBEu1ucO19TBUi4ZDil3vl9/+1 +bYX+jn/wnOjtdM+kBj4TV9aCytdBV0my+mkv1nwTK0fiKFHsUG52mbGqq88A9Mmd +Z3grDaR2Rsb5AgLaABFCMoooFDVQtmt7xl1U3t4UZtDqny17wcXRolxXY5+tfI3Y +jWMqfO0QsBKHjfT4At5ToSDX5yjt4Q7UyhRKKprUyyVRYZv4EQZDqi2Hdx0wNDGr +yOQkK/LvXep0r5AEYcMkLO1x4hReaKdnSEPFRdXF/x7daAlRMTkUe5i4zLeYYhvI +Qsl3aErcSP/DWVUyQ2XbHkrG9suPbmLBou7BHNRWXdnFib0+jASQnVKuhVLGykUr +wzTNpGrn7Axna1P3uMwSnlJgA0vSrkR2dONzyq0hzoMmAjfC3Eh1D7tYbb6Cswx7 +5/Emq2cEEGtbyTJ5Q6+omALrsoybx4YAAAAAAAAAAAAA diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-opaque-sign.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-opaque-sign.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-opaque-sign.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-opaque-sign.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,25 @@ +From test@example.com Fri Sep 11 10:16:06 2015 +From: test +To: you@you.com +Subject: sign only +Date: Fri, 11 Sep 2015 12:16:06 +0200 +Message-ID: <3182420.pXWeMPZlAJ@tabin.local> +X-KMail-Identity: 792434561 +User-Agent: KMail/4.13.0.1 (Linux/4.1.5-towo.1-siduction-amd64; KDE/4.14.2; x86_64; ; ) +MIME-Version: 1.0 +Content-Type: application/pkcs7-mime; name="smime.p7m"; smime-type="signed-data" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7m" + +MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAaCAJIAEZUNvbnRl +bnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdCaXQKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy +c2V0PSJ1dGYtOCIKCkEgc2ltcGxlIHNpZ25lZCBvbmx5IHRlc3QuAAAAAAAAMYIBkjCCAY4CAQEw +YjBVMQswCQYDVQQGEwJVUzENMAsGA1UECgwES0RBQjEWMBQGA1UEAwwNdW5pdHRlc3QgY2VydDEf +MB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbQIJANNFIDoYY4XJMAkGBSsOAwIaBQCggYcw +GAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTMwMTEwMTU0ODEyWjAj +BgkqhkiG9w0BCQQxFgQUvJ5zI7oyv5fNx1H1wabIa6atsdcwKAYJKoZIhvcNAQkPMRswGTALBglg +hkgBZQMEAQIwCgYIKoZIhvcNAwcwDQYJKoZIhvcNAQEBBQAEgYAHFCw88FPy1n2lu5ql5sD2J4Yi +2/N9gUQvNQF5F/kd48HncdihLPZRs7eEX7IzDZNeylTmyp2WIiGEwQrIHbxtqU32NRouc09Zv4bu +iUwUoz1SM2s7qipikwayQMD3d5zWNhszNLBsw8z48uXAzjZAejBCfPP0/w3z7DZDJC2R2QAAAAAA +AA== + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-opaque-sign.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-opaque-sign.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-opaque-sign.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-opaque-sign.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,40 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-opaque-sign.mbox.inProgress.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-opaque-sign.mbox.inProgress.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-opaque-sign.mbox.inProgress.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-opaque-sign.mbox.inProgress.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,22 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-opaque-sign.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-opaque-sign.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-opaque-sign.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-opaque-sign.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-signed-apple.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-signed-apple.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-signed-apple.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-signed-apple.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,197 @@ +From: Quack +Content-Type: multipart/signed; boundary="Apple-Mail=_607FF8D2-30E0-4FC3-86D9-1234567890AB"; protocol="application/pkcs7-signature"; micalg=sha1 +Message-Id: <468684BD-9CBD-48CF-B1BD-2824000F9541@example.org> +Mime-Version: 1.0 (Mac OS X Mail 9.3 \(3124\)) +Subject: Re: PDF bug - modified mail, signature is not valid! +Date: Fri, 20 Jan 2017 11:51:41 +0100 +To: Konqui + + +--Apple-Mail=_607FF8D2-30E0-4FC3-86D9-1234567890AB +Content-Type: multipart/alternative; + boundary="Apple-Mail=_C5F90221-8F52-4623-99DF-1234567890AB" + + +--Apple-Mail=_C5F90221-8F52-4623-99DF-1234567890AB +Content-Transfer-Encoding: quoted-printable +Content-Type: text/plain; + charset=utf-8 + +Ol=C3=A1 Konqui, + +Here is the pdf you asked for! +Cheers, + +Quaak + +=E2=80=A6 +Quack | UX/UI Designer +Klar=C3=A4lvdalens Datakonsult AB, a KDAB Group company +Sweden (HQ) +46-563-540090, Germany +49-30-521325470 +KDAB - The Qt, C++ and OpenGL Experts | www.kdab.com + + +--Apple-Mail=_C5F90221-8F52-4623-99DF-1234567890AB +Content-Type: multipart/mixed; + boundary="Apple-Mail=_1C4D1EDB-36C5-40D7-9AB6-1234567890AB" + + +--Apple-Mail=_1C4D1EDB-36C5-40D7-9AB6-1234567890AB +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; + charset=utf-8 + +Ol=C3=A1 Konqui,
= + +--Apple-Mail=_1C4D1EDB-36C5-40D7-9AB6-1234567890AB +Content-Disposition: attachment; filename="image.png" +Content-Transfer-Encoding: base64 +Content-Type: image/png; name="image.png" + +iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAlwSFlzAAAb +rwAAG68BXhqRHAAAAAd0SU1FB9gHFg8aNG8uqeIAAAAGYktHRAD/AP8A/6C9p5MAAAkqSURBVHja +5VV7cFTVGf/OPefeu3fv3t1NdhMSCHkKASEpyEsaGwalWEWntLV1Wu0fdOxAx9Iq0xntAwac6ehY +p+rwKLbjjLRFh9JadURKRGgFQTTECCYQE9nNgzzYZDe7m33d1+l3tpOOU61T2tF/+s1s7pzn9/t+ +v993Av/3QT6FO6WdO/d+M55Il8rMOdrT0x3Zt++3+c8EgM/nozseeviJiYmpe1zOQdM8BOOCIku/ +lIj1VrQ/0r9n9+78xwLgeAA3w4fHXV1d5Omnn6aapumlJSVVqalUJJvJZRdcu0RSfZQsaW7mjfPm +cbF9+/btEIlEaq6Z03whXyhIjDFuGIZEKSP5fMFRVcVNT2Vf0jzsmMxYGtel9rff/vM/M8bjcZpM +Jp1XX32VNDc3e7ovRP3JyZGVNdXVd1FGGwKBQEM8njiWTKV36IHgEACwibGx62LjU/cBd01Zljoc +p9DHmLbHsmyK1UuKooJt24IMcLE+y3L45eEYLS8LgWH4YXR0bAPZtGmTVFvfoBZMEzKpFKmqqmqp +qane4DhOteH3L1FkWZVlGSzLAtd1Oe4773C4LxoZvDWXh82OY2MtwAuFvCvSyDIFXdelYDDIvF4d +xPzA0AgXFStMcWPxBPGoKvXpPh6JDG5hK1Zcv1H36Xc6tsMs21EMQ69CLSts2wGkDygTyW2CP8gX +TKLIyvx0OrdDUXyLKXVUkdSne4QKtFAwuWmabjAYkDyqAgG/jziORh1EKaonkkQt2yRZRC5JHEGn +L7OKyopNqqo2IbWQjqWgLOwFBFKsuGDa4PVyIssMk1sCACCjimXbrbquYKW41zJJOpXkeARyeZNQ +SUKwHEqCKnBuAybkZeFSmssVSDKdhlBpCRgIcnQsdvKPB19sY4rMNIaH0BhQUVHKvXgpIiQF0wK/ +4QORnOEayoDzOSBMXK4BSgpeTcMECqiqTDKZHDKmct3LCI55Kp0mQgK/3yDYkgIc3kNhfHzCkRk9 +p6nk+yPD3SmWzeZiKNkciUrg2g5BjQWdSBchiEvQjzoWAFkUYPDrCjBFUEJ8AhSIRyl2jcfjEL9h +AFJODL8B6H7IZrNIt2g3B1mysShdQhmbT58+ExRdx3L5/PNomGU4kJkuA9ILYn+JP4CXOoDUoWO9 +IBhCSBCLTYCK+rqOg8CKvY6JPQhGxjkX1zyAdwrgAhTKWBDmxTUTC7Tcy5dHBiilL7cdaTsNGAwP +7o32D4Q9HnWTrvsCiqIgdWgqDkJfkKgDU1MZcBGMhbKgj2B0LIle8eNhgiBsoMwFEY7rQDqVwlo5 +esUE/AAR81gUYIUT8UR2//4/rK+pLjs3MhIFEVJN9WwXK2oM+P1BREpQO0hjwkw+BzJWY1oOXB5L +w9DIOGTQvYS4UFqigR9ZwUqEXFghVop059AjonqcAIZrqCKg31AS3OU66Adf4sabWqKvvHIYpoNh +y+Vj4xMHVEW93eUuo0izhT4oRbcSIoALbRle4AVVkfBup6g9thwCzRX1VRQmdMeqLVETEIkW2ZNx +H8oqzqAfXCGJEQ6XBQEgNQ2A7tq1C1a1tvaattOOrVFOqVSLCQhqU6QPx+DTsOU0GavLYUV20Qv4 +rEIymYNQuB48Wkg8QTA0NIQeYKB6NGTgH90jIcJEMikAi1dRRo9NLV583ek33jjpFAGIPw8++IAj +e9SIRGm5wliraVosnTWLmmemUugBkTiPSS3AtgV8VQA9A8LxdfULYXBoEKv2wMhIn2BHGFR0DZ6d +glQ6hUDT6A/RWVSSmfx5DjxRV1vzVkdHBzDAWLNmDezc+aQVqqz5dSY52Z63nLn9A33lI9myLXNL +xv0Fq3gWutMN0BToxcso+AN+cKmOXI5A9P12mKDzYNXcZXDq1F+h+IboFgzb1VAhDULeJpxwC19G +g/uMgOXVfXW1tbWCYM6mtdi8+YfiM4m/Y1UrHzkergyXz/3czImCnRjuHiW3qxpPqGFPy6SpHJC9 +IR+Sm+2N8i/dcMOMZdGeshcrS/S58+c3zU2Z8oVD50cbVfP8M4pGkymoUxLxsUzOVhtmQ+5432Rg +oj6QOLFj28/caQk+EjMXraUV1eW+8dH06StQZnlnNbQefGTD92pWfu3I6TOT8oY7brv4hWUt3xiw +2OrlDVVdRslsd2Fd469Q8sUB3c8uOW49SdHX1rbcePhoz3B7feuqlt5oZtBTv+ioSdXc7q3fHQaM +fwtg6Vd/dEvn8Qssnzg/0Ns56jRcO6Nw4d1Af+/RH0/cdv+O/fRK7KnmBXPWGsQeDPhK9oWC6hdd +R3pdUcg88Tx7U7Ej1y1qMjreGwjt/cnaF2YtvCXQe7bzxLkj+/sunT0Ry00OwHRI8DERLqeNmqGV +JZJVC6Yu7UxMOfLFlV9pWQcYp57/013rb1u9ua29b0Ch4bsl4tKLY5P1sgxNJzsHDj136KzS3NTk +9mTNusPvXJLrbnjUe/b16FDfsZ/3xC8d4/HoCQ4Anwzg91vWPL7+3pvvDM806sTY4IVyMxfrojO3 +BVubbyJMhnVVM3y+l187/nChIJ2ZpSs9hMD4qC6t6x6+0gkAoRC33/Sb8RdmXj9nzvWraivhP47g +AyHxKb1mfWkRYHCjMb30nafeeWzerU9963w3L3/02c4f7D0y0NXTx3f3D/JTb7bzxpeODu55+PGT +yy5F+ZmeD/iSrh5efeJd/hGZP5GBux+6cysY3w7H+16IVy65V6trnn3P9JqVjQ3JuSsdHhWW6hIL +NuhyUpJgEF/ofSVBeLBuVtVjd3y55SHXhQ8UBht0DR4r98Fs+IRg/zrxlz2/2A7p5yYBY93Gu+4f +H5xojLwOxfjd/WufOHhQ/IcD7eYVC5YyCjFMfkVV4NpMFvpTachoZeDaNryLnliOczsUCv1XBWD8 +YjF5MWJ9kcT757qenR7vf4bDoqWwHCvUUfPNsQQMWSZAZTlsw7nxYQQTcuDrjgQuPn7z/D7YivNt +nPPfEDzwqcU75/j6SD/f8uG5vXs5dL7Hjb+d4gp8mnF8nAOabjcac+OBAxyuNiT4HyNwGZYgu0RW +IDt/Icz4zAC0tXE4183rQ6XwU9uBXgLQ5Teg7GIv1+EqgsF/GY4DtCQALZMp2ITttmqoHzpWr756 +o/0d59+Lh3Y1HHcAAAAASUVORK5CYII= +--Apple-Mail=_1C4D1EDB-36C5-40D7-9AB6-1234567890AB +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; + charset=utf-8 + += +
+
= += + +--Apple-Mail=_1C4D1EDB-36C5-40D7-9AB6-1234567890AB-- + +--Apple-Mail=_C5F90221-8F52-4623-99DF-1234567890AB-- + +--Apple-Mail=_607FF8D2-30E0-4FC3-86D9-1234567890AB +Content-Disposition: attachment; + filename=smime.p7s +Content-Type: application/pkcs7-signature; + name=smime.p7s +Content-Transfer-Encoding: base64 + +MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIILdTCCBRow +ggQCoAMCAQICEG0Z6qcZT2ozIuYiMnqqcd4wDQYJKoZIhvcNAQEFBQAwga4xCzAJBgNVBAYTAlVT +MQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRoZSBVU0VS +VFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMTYwNAYDVQQD +Ey1VVE4tVVNFUkZpcnN0LUNsaWVudCBBdXRoZW50aWNhdGlvbiBhbmQgRW1haWwwHhcNMTEwNDI4 +MDAwMDAwWhcNMjAwNTMwMTA0ODM4WjCBkzELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIg +TWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQx +OTA3BgNVBAMTMENPTU9ETyBDbGllbnQgQXV0aGVudGljYXRpb24gYW5kIFNlY3VyZSBFbWFpbCBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJKEhFtLV5jUXi+LpOFAyKNTWF9mZfEy +TvefMn1V0HhMVbdClOD5J3EHxcZppLkyxPFAGpDMJ1Zifxe1cWmu5SAb5MtjXmDKokH2auGj/7jf +H0htZUOMKi4rYzh337EXrMLaggLW1DJq1GdvIBOPXDX65VSAr9hxCh03CgJQU2yVHakQFLSZlVkS +Mf8JotJM3FLb3uJAAVtIaN3FSrTg7SQfOq9xXwfjrL8UO7AlcWg99A/WF1hGFYE8aIuLgw9teiFX +5jSw2zJ+40rhpVJyZCaRTqWSD//gsWD9Gm9oUZljjRqLpcxCm5t9ImPTqaD8zp6Q30QZ9FxbNboW +86eb/8ECAwEAAaOCAUswggFHMB8GA1UdIwQYMBaAFImCZ33EnSZwAEu0UEh83j2uBG59MB0GA1Ud +DgQWBBR6E04AdFvGeGNkJ8Ev4qBbvHnFezAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB +/wIBADARBgNVHSAECjAIMAYGBFUdIAAwWAYDVR0fBFEwTzBNoEugSYZHaHR0cDovL2NybC51c2Vy +dHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtQ2xpZW50QXV0aGVudGljYXRpb25hbmRFbWFpbC5jcmww +dAYIKwYBBQUHAQEEaDBmMD0GCCsGAQUFBzAChjFodHRwOi8vY3J0LnVzZXJ0cnVzdC5jb20vVVRO +QWRkVHJ1c3RDbGllbnRfQ0EuY3J0MCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1c3Qu +Y29tMA0GCSqGSIb3DQEBBQUAA4IBAQCF1r54V1VtM39EUv5C1QaoAQOAivsNsv1Kv/avQUn1G1rF +0q0bc24+6SZ85kyYwTAo38v7QjyhJT4KddbQPTmGZtGhm7VNm2+vKGwdr+XqdFqo2rHA8XV6L566 +k3nK/uKRHlZ0sviN0+BDchvtj/1gOSBH+4uvOmVIPJg9pSW/ve9g4EnlFsjrP0OD8ODuDcHTzTNf +m9C9YGqzO/761Mk6PB/tm/+bSTO+Qik5g+4zaS6CnUVNqGnagBsePdIaXXxHmaWbCG0SmYbWXVcH +G6cwvktJRLiQfsrReTjrtDP6oDpdJlieYVUYtCHVmdXgQ0BCML7qpeeU0rD+83X5f27nMIIGUzCC +BTugAwIBAgIQMFPel8s+Gckd6L+iGIwbpTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxOTA3BgNVBAMTMENPTU9ETyBDbGllbnQgQXV0aGVudGljYXRpb24g +YW5kIFNlY3VyZSBFbWFpbCBDQTAeFw0xNDA2MDIwMDAwMDBaFw0xNzA2MDEyMzU5NTlaMIIBXzEL +MAkGA1UEBhMCU0UxDzANBgNVBBETBjY4MyAzMTESMBAGA1UECBMJVmFlcm1sYW5kMRAwDgYDVQQH +EwdIYWdmb3JzMRgwFgYDVQQJEw9Ob3JyaW5ncyB2YWVnIDIxDzANBgNVBBITBkJveCAzMDEmMCQG +A1UECgwdS2xhcsOkbHZkYWxlbnMgRGF0YWtvbnN1bHQgQUIxHTAbBgNVBAsTFEEgS0RBQiBHcm91 +cCBDb21wYW55MUMwQQYDVQQLDDpJc3N1ZWQgdGhyb3VnaCBLbGFyw6RsdmRhbGVucyBEYXRha29u +c3VsdCBBQiBFLVBLSSBNYW5hZ2VyMR8wHQYDVQQLExZDb3Jwb3JhdGUgU2VjdXJlIEVtYWlsMRgw +FgYDVQQDEw9EaWFuYSBHb25jYWx2ZXMxJzAlBgkqhkiG9w0BCQEWGGRpYW5hLmdvbmNhbHZlc0Br +ZGFiLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALrHSvWD6MR2tvF9A+wayTDg +PvK3DahuvHWHzGQsd1p8bEh6qqupqgph2xO73P+ibM6EmNbCtZ+eQtW7l7iIyiC4IGsyEb5RSAtV +zGAyebsO7SPHokbGIV5SVobaRQiJ+1gOvWUbqHSQ0T9ZPvMX2nNGIKZpqAfocRreZr36AZWRo4AF +0uf6wz5aLEtq912u2rTWVsM1F966lexaepo0cZB9fdnnD8/pQX3zroj+vBTFNAkZXxxVwGMO24Pz +92d/B6K8o1SP1ArqV4sxVYIxyQTmfW4X3iV/6bcbLfEcpcUNt6MUsjFulqr6a+j51alpyT3vNuJ9 +V1UI9jz3t/daQr0CAwEAAaOCAdIwggHOMB8GA1UdIwQYMBaAFHoTTgB0W8Z4Y2QnwS/ioFu8ecV7 +MB0GA1UdDgQWBBRIYj+FxAEGllaHmLL+EMhopIEOQjAOBgNVHQ8BAf8EBAMCBaAwDAYDVR0TAQH/ +BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDBAYIKwYBBQUHAwIwRgYDVR0gBD8wPTA7BgwrBgEEAbIx +AQIBAwUwKzApBggrBgEFBQcCARYdaHR0cHM6Ly9zZWN1cmUuY29tb2RvLm5ldC9DUFMwVwYDVR0f +BFAwTjBMoEqgSIZGaHR0cDovL2NybC5jb21vZG9jYS5jb20vQ09NT0RPQ2xpZW50QXV0aGVudGlj +YXRpb25hbmRTZWN1cmVFbWFpbENBLmNybDCBiAYIKwYBBQUHAQEEfDB6MFIGCCsGAQUFBzAChkZo +dHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9DT01PRE9DbGllbnRBdXRoZW50aWNhdGlvbmFuZFNlY3Vy +ZUVtYWlsQ0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wIwYDVR0R +BBwwGoEYZGlhbmEuZ29uY2FsdmVzQGtkYWIuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQACzCCZ4ppg +H7nXnCwisxjGLIgQMdwKPB6lnWk39YT0gEqvn85tDaXIZwGiRda7O1HWdWh7RoncolX3yHQ6p/BJ +8RWkpxoc4es1wXSPmWMpspnglvtqYlfu7NZ/CqI6bvgqoy0w3KSv+GnVkiQ6SVKU4fV6itr5VG9q +X0JYXAbKO8hOIP3NO3MVacPgzSIv83B9eLpfi/BlG6q6XKxVf4581lYbLL0F7cKQt1UYPiDsmPJG ++5SEHT6ZOBiLgqQVhAw4Di+6wymUHONBRuH2bH3cjfFlkCCjiFF/cS7Oharro2RFnWQ6beZ3EzCG +FJILmq/dVMGsBFWme23hLYwtLJSXMYIDqzCCA6cCAQEwgagwgZMxCzAJBgNVBAYTAkdCMRswGQYD +VQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9E +TyBDQSBMaW1pdGVkMTkwNwYDVQQDEzBDT01PRE8gQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBT +ZWN1cmUgRW1haWwgQ0ECEDBT3pfLPhnJHei/ohiMG6UwCQYFKw4DAhoFAKCCAdcwGAYJKoZIhvcN +AQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTcwMTIwMTA1MTQxWjAjBgkqhkiG9w0B +CQQxFgQU/AV0Tj17RqaDDCeGXWhe4epgX6gwgbkGCSsGAQQBgjcQBDGBqzCBqDCBkzELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxOTA3BgNVBAMTMENPTU9ETyBDbGllbnQgQXV0aGVudGlj +YXRpb24gYW5kIFNlY3VyZSBFbWFpbCBDQQIQMFPel8s+Gckd6L+iGIwbpTCBuwYLKoZIhvcNAQkQ +AgsxgauggagwgZMxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO +BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMTkwNwYDVQQDEzBDT01P +RE8gQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBTZWN1cmUgRW1haWwgQ0ECEDBT3pfLPhnJHei/ +ohiMG6UwDQYJKoZIhvcNAQEBBQAEggEAEIfTyPoqjyJwrpYmZWRF6OY5ZCFdpw1UUfSXYUU2IdbL +ph8QkMCc9uv5wk2IeE/9UxxvUR44J67Bu8hv/PCaeyMSh1j2peOlFG487SwyTjf5wIL+GEs8zvHo +4+Dd2IPhAExt1Bjhmt6O7caF9LVrGQ/wlI6ZGN8MgjSgdrK4F3Ig4LbMuyTTcy3hDTvb+qzaQ4YI +E+F4tnwhXG8FGEBnlng6nB4iXhoWSvBsjc1qF6eHEHzsOIZeNL7K6Imn7oKHJg+THGwHxC1TZGFt +G92u6zV7Sc/i4ENH2MNzXT75mp8Gq/k6gpRz9nw8UVuLN/rDIb6esnEgVH9ad3awD154HAAAAAAA +AA== +--Apple-Mail=_607FF8D2-30E0-4FC3-86D9-1234567890AB-- + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-signed-apple.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-signed-apple.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-signed-apple.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-signed-apple.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,58 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-signed-apple.mbox.inProgress.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-signed-apple.mbox.inProgress.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-signed-apple.mbox.inProgress.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-signed-apple.mbox.inProgress.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,49 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-signed-apple.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-signed-apple.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-signed-apple.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-signed-apple.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,3 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::AlternativeMessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-signed-encrypted.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-signed-encrypted.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-signed-encrypted.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-signed-encrypted.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,38 @@ +From test@example.com Wed, 08 Sep 2010 17:51:32 +0200 +From: S/MIME Test +To: test@example.com +Subject: S/MIME signed and encrypted +Date: Wed, 08 Sep 2010 17:51:32 +0200 +User-Agent: KMail/4.6 pre (Linux/2.6.34-rc2-2-default; KDE/4.5.60; x86_64; ; ) +MIME-Version: 1.0 +Content-Type: application/pkcs7-mime; name="smime.p7m"; smime-type="enveloped-data" +Content-Disposition: attachment; filename="smime.p7m" +Content-Transfer-Encoding: base64 + +MIAGCSqGSIb3DQEHA6CAMIACAQAxgfwwgfkCAQAwYjBVMQswCQYDVQQGEwJVUzENMAsGA1UECgwE +S0RBQjEWMBQGA1UEAwwNdW5pdHRlc3QgY2VydDEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxl +LmNvbQIJANNFIDoYY4XJMA0GCSqGSIb3DQEBAQUABIGAl7xMheBEpCAwYsr64BE1WY6ohFTuoxV4 +/F8NXDyH+RZqpdpF6ltEThAgZBsYlhx2olMHIINfifsnzkxYiSwvuZkD94KMcegdn1XGPAYTQnR6 +8IK+grfHM5kWYW36XAbZmHNgl1lTh1/tqCyqDCI+Yah6UtBaJbR4gflMmGM5f+IwgAYJKoZIhvcN +AQcBMBQGCCqGSIb3DQMHBAhWM773SZc7KaCABIIEmKhZSl2YtYYlvthLk4/hEmyK5c2xx/MCqIxM +hh3vbaDK2TWspQwtbBm/96xQbCDzZU9NeNv0rmjRAELK3AgqUVTnbi3Ozf6MLrEUsuXvlR214OPs +sv374AF1ZoLJRaHyRo8/RkcwEbCMZbRPT56qM58tQQ54G7lTmWAHhV6zRx9B7ODgikt6CjgQr7Wn +EAV33Pei17sM6Pa+mtZhz+tlUOQBRuZI6EOgbG1hixSaClgPnyphLxpwjiN3pym2tiVqsQxnSJ3f +XRCx9E/kSWrJelME3aEU6++RXTuxbGJceDweo9SWQsXobU3Ot71pCIcZC7Tfv6qnICHsTAxc3Igw +xHGHufnVoU7HZCXLi5AbhHvZYdLftEX2/6eA6/efEn4Jnrn9EMzOeLnySEaW5mE0AW8d27LDK62J ++Mag1TTC2BivRhKRY0/GZCSiT8LepPb0DVYxb5vc2D5COVjG4ZhnDd0JbO2YnXoxfsi92M1CmssN +YjBlB7R+HAFOoFGE+xuSGZZr+Ox4Q8+l7/cebLHjXcAsJ81fRlcWZNVreh4b5x3vZm9vRLNiHsqB +h5wXeu5jV1zQ7okhT4mKGp5RbIVYOaBic0mg7+Z2iF4gn37tisU1yahboj2YMYP3pPVYgwuSnv3H +308EAyFRu5/a5gGhj5ze2L5+vDgE5jk2REDYt9EH1kNtllDn8vN8e/6YfLBqDHQE+Hv5iC3YAygI +mVNdSL0V8xMrUbqqmXXx23URwic1BetW6L4oDQpPhuMf4wrwXYwmQtCZj9EGZq+NpFxb6xSIvvRG +n5mAT07HmI69EYnx4SbZq1YhWsY2AQHpxIFtLD2olW5SDISjbUKyxtcCdTuwk0ykajaxYHOC3t9E +wQ7GreQAGY+kBIyDhB/L8sD46gPmmP+hO7QVXKESyOIfTnbo2rWVhToXPGMVD2dr/GJOP6DUmRj8 +3ba/9l1bFKMxWFBYm/MgdNN5H/SOWlhN1N+Fl820HYCXZTSWLTUH6Bq8kf3FuKz+MJDwbl417ctL ++ojLATnLgKu+x/B6H1sOd2E6KY73SlCoKG/AfzSelbVPUZbbUU7kOECvzKWY/Zx/a55FBkF6ASm9 +6CgFk5VVuyG2VbncLtesluJJOTTYEHl20RaiGYJNUL22tTe5nCIdIrKzOI4xMXQBAZcPSdojlNIj +bSRRX+9jJIRUIExncNZvWn7VtsD1v7gLFD+BN98Cy5E7n/1NByQTOpoislrVi/sMRJQ9bPs/j5sL +B2tzVR08ODQYfdWWT+1ynbvegBx4wi8I2Orc5BEW+0NjUdnUHTFORBEnq8CjSRgHyckcsJMJommM +m4wvkQj7YX/cps8QqCPzEKAdykU2hsd6sEycKtxi3gW6uDIOMwzapkxZSH7IcMriWBDXRsMebHsv ++R0A8eT7dC09cgQw+kScSe+cYgRZk0R/26eqhukprECaf9SptYll10GQ0eLcIpX4deXr0ZNmAHYy ++5D7yoysVFNyC5QE3tAhS1HapixB8lPeJUndifGfbt3u8lpFb7lodnJIj2oHgo5MUNkxhPchHW0t +GJMpP9esdvIZxwQInpSuNeUy6Z8AAAAAAAAAAAAA diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-signed-encrypted.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-signed-encrypted.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-signed-encrypted.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-signed-encrypted.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,55 @@ + + + + + + + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-signed-encrypted.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-signed-encrypted.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/smime-signed-encrypted.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/smime-signed-encrypted.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,5 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::EncryptedMessagePart + * MimeTreeParser::SignedMessagePart + * MimeTreeParser::TextMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/text+html-maillinglist.mbox kf5-messagelib-16.12.3/mimetreeparser/autotests/data/text+html-maillinglist.mbox --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/text+html-maillinglist.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/text+html-maillinglist.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,163 @@ +Return-Path: +Received: from kolab01.kolabsys.com ([unix socket]) + by kolab01.kolabsys.com (Cyrus v2.4.17-Kolab-2.4.17-1.el6.kolab_3.0) with LMTPA; + Thu, 11 Apr 2013 09:03:01 +0200 +X-Sieve: CMU Sieve 2.4 +Received: from ext-mx01.kolabsys.com (unknown [10.10.20.253]) + by kolab01.kolabsys.com (Postfix) with ESMTP id 3D8A9C0AE3 + for ; Thu, 11 Apr 2013 09:03:01 +0200 (CEST) +Received: from localhost (localhost [127.0.0.1]) + by ext-mx01.kolabsys.com (Postfix) with ESMTP id 89D4E10057E + for ; Thu, 11 Apr 2013 09:02:38 +0200 (CEST) +X-Virus-Scanned: amavisd-new at example.com +X-Amavis-Alert: BAD HEADER SECTION, Duplicate header field: "MIME-Version" +Received: from ext-mx01.kolabsys.com ([127.0.0.1]) + by localhost (fw01.kolabsys.com [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id BJxrh9Yst1Ac + for ; + Thu, 11 Apr 2013 09:02:38 +0200 (CEST) +Received: from lists.kolabsys.com (static.253.32.46.78.clients.your-server.de [78.46.32.253]) + by ext-mx01.kolabsys.com (Postfix) with ESMTP id 609821004A7 + for ; Thu, 11 Apr 2013 09:02:38 +0200 (CEST) +Received: from localhost (localhost [127.0.0.1]) + by lists.kolabsys.com (Postfix) with ESMTP id BFA6941D4EAD; + Thu, 11 Apr 2013 09:03:00 +0200 (CEST) +X-Virus-Scanned: Debian amavisd-new at lists.kolabsys.com +X-Amavis-Alert: BAD HEADER SECTION, Duplicate header field: "MIME-Version" +Received: from lists.kolabsys.com ([127.0.0.1]) + by localhost (lists.kolabsys.com [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id TYU5eAMK5J6T; Thu, 11 Apr 2013 09:02:58 +0200 (CEST) +Received: from lists.kolabsys.com (localhost [127.0.0.1]) + by lists.kolabsys.com (Postfix) with ESMTP id 182FC41D2A3B; + Thu, 11 Apr 2013 09:02:58 +0200 (CEST) +Received: from localhost (localhost [127.0.0.1]) + by lists.kolabsys.com (Postfix) with ESMTP id A2B3641D4EC2 + for ; + Thu, 11 Apr 2013 09:02:56 +0200 (CEST) +X-Virus-Scanned: Debian amavisd-new at lists.kolabsys.com +Received: from lists.kolabsys.com ([127.0.0.1]) + by localhost (lists.kolabsys.com [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id cyO-CNB3vFwu for ; + Thu, 11 Apr 2013 09:02:54 +0200 (CEST) +Received: from ext-mx02.kolabsys.com (ext-mx02.kolabsys.com [94.230.208.222]) + by lists.kolabsys.com (Postfix) with ESMTP id 1640E41D2A3B + for ; + Thu, 11 Apr 2013 09:02:54 +0200 (CEST) +Received: from localhost (localhost [127.0.0.1]) + by ext-mx01.kolabsys.com (Postfix) with ESMTP id 58CBC160522 + for ; + Thu, 11 Apr 2013 10:02:44 +0200 (CEST) +X-Virus-Scanned: amavisd-new at example.com +Received: from ext-mx02.kolabsys.com ([127.0.0.1]) + by localhost (fw02.kolabsys.com [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id 4VjnHg6Y6jo7 for ; + Thu, 11 Apr 2013 10:02:42 +0200 (CEST) +Received: from app04.kolabsys.com (unknown [10.10.20.16]) + by ext-mx02.kolabsys.com (Postfix) with ESMTP id 062DF160521 + for ; + Thu, 11 Apr 2013 10:02:42 +0200 (CEST) +Received: by app04.kolabsys.com (Postfix, from userid 48) + id 8E7524048C; Thu, 11 Apr 2013 09:02:51 +0200 (CEST) +From: Kolab Bugzilla +To: bugzilla@lists.kolabsys.com +Subject: [Bug 1741] Standard folder name configuration ignored on creating + new users +Date: Thu, 11 Apr 2013 07:02:43 +0000 +X-Bugzilla-Reason: GlobalWatcher +X-Bugzilla-Type: changed +X-Bugzilla-Watch-Reason: None +X-Bugzilla-Product: UCS +X-Bugzilla-Component: roundcube +X-Bugzilla-Keywords: +X-Bugzilla-Severity: normal +X-Bugzilla-Who: wickert@kolabsys.com +X-Bugzilla-Status: NEW +X-Bugzilla-Priority: P3 +X-Bugzilla-Assigned-To: machniak@kolabsys.com +X-Bugzilla-Target-Milestone: 3.1-next +X-Bugzilla-Changed-Fields: +Message-ID: +In-Reply-To: +References: +X-Bugzilla-URL: http://issues.kolab.org/ +Auto-Submitted: auto-generated +MIME-Version: 1.0 +X-BeenThere: bugzilla@lists.kolabsys.com +X-Mailman-Version: 2.1.11 +Precedence: list +Reply-To: server-team@lists.kolabsys.com +List-Id: All Bugzilla email notifications +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +Content-Type: multipart/mixed; boundary="===============1778809852==" +Mime-version: 1.0 +Sender: bugzilla-bounces@lists.kolabsys.com +Errors-To: bugzilla-bounces@lists.kolabsys.com + + +--===============1778809852== +Content-Type: multipart/alternative; boundary="1365663771.ec4d382.10226"; charset="us-ascii" + + +--1365663771.ec4d382.10226 +Date: Thu, 11 Apr 2013 09:02:51 +0200 +MIME-Version: 1.0 +Content-Type: text/plain; charset="UTF-8" + +https://issues.kolab.org/show_bug.cgi?id=1741 + +--- Comment #4 from Christoph Wickert --- +You can get everything you need on test93-18. + +-- +You are receiving this mail because: +You are watching all bug changes. + +--1365663771.ec4d382.10226 +Date: Thu, 11 Apr 2013 09:02:51 +0200 +MIME-Version: 1.0 +Content-Type: text/html; charset="UTF-8" + + + + + + + Comment # 4 + on bug 1741 + from + +
You can get everything you need on test93-18.
+ You are receiving this mail because: +
    +
  • You are watching all bug changes.
  • +
+ + + +--1365663771.ec4d382.10226-- + +--===============1778809852== +Content-Type: text/plain; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Content-Disposition: inline + +_______________________________________________ +bugzilla mailing list +bugzilla@lists.kolabsys.com +https://lists.kolabsys.com/mailman/listinfo/bugzilla + +--===============1778809852==-- + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/text+html-maillinglist.mbox.html kf5-messagelib-16.12.3/mimetreeparser/autotests/data/text+html-maillinglist.mbox.html --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/text+html-maillinglist.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/text+html-maillinglist.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,38 @@ + + + + +
+ +
+ +
+ +
+
+ Comment # 4on bug 1741from +
You can get everything you need on test93-18.
+ You are receiving this mail because: +
    +
  • You are watching all bug changes.
  • +
+
+
+
+ + +
+
+ + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/data/text+html-maillinglist.mbox.tree kf5-messagelib-16.12.3/mimetreeparser/autotests/data/text+html-maillinglist.mbox.tree --- kf5-messagelib-16.04.3/mimetreeparser/autotests/data/text+html-maillinglist.mbox.tree 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/data/text+html-maillinglist.mbox.tree 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,5 @@ + * MimeTreeParser::MessagePartList + * MimeTreeParser::MimeMessagePart + * MimeTreeParser::AlternativeMessagePart + * MimeTreeParser::AttachmentMessagePart + * MimeTreeParser::MessagePart diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/nodehelpertest.cpp kf5-messagelib-16.12.3/mimetreeparser/autotests/nodehelpertest.cpp --- kf5-messagelib-16.04.3/mimetreeparser/autotests/nodehelpertest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/nodehelpertest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,226 @@ +/* Copyright 2015 Sandro Knauß + + 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) version 3 or any later version + accepted by the membership of KDE e.V. (or its successor approved + by the membership of KDE e.V.), which shall act as a proxy + defined in Section 14 of version 3 of the license. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#include "nodehelpertest.h" + +#include "viewer/nodehelper.h" + +#include + +using namespace MimeTreeParser; + +NodeHelperTest::NodeHelperTest() + : QObject() +{ + +} + +void NodeHelperTest::testPersistentIndex() +{ + NodeHelper helper; + + KMime::Content *node = new KMime::Content(); + KMime::Content *node2 = new KMime::Content(); + KMime::Content *node2Extra = new KMime::Content(); + KMime::Content *subNode = new KMime::Content(); + KMime::Content *subsubNode = new KMime::Content(), *subsubNode2 = new KMime::Content(); + KMime::Content *node2ExtraSubNode = new KMime::Content(); + KMime::Content *node2ExtraSubsubNode = new KMime::Content(); + KMime::Content *node2ExtraSubsubNode2 = new KMime::Content(); + KMime::Content *extra = new KMime::Content(), *extra2 = new KMime::Content(); + KMime::Content *subExtra = new KMime::Content(); + KMime::Content *subsubExtra = new KMime::Content(); + KMime::Content *subsubExtraNode = new KMime::Content(); + + subNode->addContent(subsubNode); + subNode->addContent(subsubNode2); + node->addContent(subNode); + subsubExtra->addContent(subsubExtraNode); + helper.attachExtraContent(node, extra); + helper.attachExtraContent(node, extra2); + helper.attachExtraContent(subNode, subExtra); + helper.attachExtraContent(subsubNode2, subsubExtra); + + // This simulates Opaque S/MIME signed and encrypted message with attachment + // (attachment is node2SubsubNode2) + node2Extra->addContent(node2ExtraSubNode); + node2ExtraSubNode->addContent(node2ExtraSubsubNode); + node2ExtraSubNode->addContent(node2ExtraSubsubNode2); + helper.attachExtraContent(node2, node2Extra); + + /* all content has a internal first child, so indexes starts at 2 + * node "" + * -> subNode "2" + * -> subsubNode "2.2" + * -> subsubNode2 "2.3" + * + * node "" + * -> extra "e0" + * -> extra2 "e1" + * + * subNode "2" + * -> subExtra "2:e0" + * + * subsubNode2 "2.3" + * -> subsubExtra "2.3:e0" + * -> subsubExtraNode "2.3:e0:2" + * + * node2 "" + * + * node2 "" + * -> node2Extra "e0" + * -> node2ExtraSubNode "e0:2" + * -> node2ExtraSubsubNode "e0:2.2" + * -> node2ExtraSubsubNode2 "e0:2.3" + */ + + QCOMPARE(helper.persistentIndex(node), QStringLiteral("")); + QCOMPARE(helper.contentFromIndex(node, QStringLiteral("")), node); + + QCOMPARE(helper.persistentIndex(node->contents()[0]), QStringLiteral("1")); + QCOMPARE(helper.contentFromIndex(node, QStringLiteral("1")), node->contents()[0]); + + QCOMPARE(helper.persistentIndex(subNode), QStringLiteral("2")); + QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2")), subNode); + + QCOMPARE(helper.persistentIndex(subsubNode), QStringLiteral("2.2")); + QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2.2")), subsubNode); + + QCOMPARE(helper.persistentIndex(subsubNode2), QStringLiteral("2.3")); + QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2.3")), subsubNode2); + + QCOMPARE(helper.persistentIndex(extra), QStringLiteral("e0")); + QCOMPARE(helper.contentFromIndex(node, QStringLiteral("e0")), extra); + + QCOMPARE(helper.persistentIndex(extra2), QStringLiteral("e1")); + QCOMPARE(helper.contentFromIndex(node, QStringLiteral("e1")), extra2); + + QCOMPARE(helper.persistentIndex(subExtra), QStringLiteral("2:e0")); + QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2:e0")), subExtra); + + QCOMPARE(helper.persistentIndex(subsubExtra), QStringLiteral("2.3:e0")); + QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2.3:e0")), subsubExtra); + + QCOMPARE(helper.persistentIndex(subsubExtraNode), QStringLiteral("2.3:e0:2")); + QCOMPARE(helper.contentFromIndex(node, QStringLiteral("2.3:e0:2")), subsubExtraNode); + + QCOMPARE(helper.persistentIndex(node2ExtraSubsubNode2), QStringLiteral("e0:2.3")); + QCOMPARE(helper.contentFromIndex(node2, QStringLiteral("e0:2.3")), node2ExtraSubsubNode2); + + delete node; +} + +void NodeHelperTest::testHREF() +{ + NodeHelper helper; + KMime::Message::Ptr msg(new KMime::Message); + QUrl url; + + KMime::Content *node = msg->topLevel(); + KMime::Content *subNode = new KMime::Content(); + KMime::Content *subsubNode = new KMime::Content(), *subsubNode2 = new KMime::Content(); + KMime::Content *extra = new KMime::Content(), *extra2 = new KMime::Content(); + KMime::Content *subExtra = new KMime::Content(); + KMime::Content *subsubExtra = new KMime::Content(); + KMime::Content *subsubExtraNode = new KMime::Content(); + + subNode->addContent(subsubNode); + subNode->addContent(subsubNode2); + node->addContent(subNode); + subsubExtra->addContent(subsubExtraNode); + helper.attachExtraContent(node, extra); + helper.attachExtraContent(node, extra2); + helper.attachExtraContent(subNode, subExtra); + helper.attachExtraContent(subsubNode2, subsubExtra); + + url = QUrl(QStringLiteral("")); + QCOMPARE(helper.fromHREF(msg, url), node); + + url = QUrl(QStringLiteral("attachment:e0?place=body")); + QCOMPARE(helper.fromHREF(msg, url), extra); + + url = QUrl(QStringLiteral("attachment:2.2?place=body")); + QCOMPARE(helper.fromHREF(msg, url), subsubNode); + + url = QUrl(QStringLiteral("attachment:2.3:e0:2?place=body")); + QCOMPARE(helper.fromHREF(msg, url), subsubExtraNode); + + QCOMPARE(helper.asHREF(node, QStringLiteral("body")), QStringLiteral("attachment:?place=body")); + QCOMPARE(helper.asHREF(extra, QStringLiteral("body")), QStringLiteral("attachment:e0?place=body")); + QCOMPARE(helper.asHREF(subsubNode, QStringLiteral("body")), QStringLiteral("attachment:2.2?place=body")); + QCOMPARE(helper.asHREF(subsubExtraNode, QStringLiteral("body")), QStringLiteral("attachment:2.3:e0:2?place=body")); +} + +void NodeHelperTest::testLocalFiles() +{ + NodeHelper helper; + KMime::Message::Ptr msg(new KMime::Message); + + KMime::Content *node = msg->topLevel(); + KMime::Content *subNode = new KMime::Content(); + KMime::Content *subsubNode = new KMime::Content(), *subsubNode2 = new KMime::Content(); + KMime::Content *extra = new KMime::Content(), *extra2 = new KMime::Content(); + KMime::Content *subExtra = new KMime::Content(); + KMime::Content *subsubExtra = new KMime::Content(); + KMime::Content *subsubExtraNode = new KMime::Content(); + + subNode->addContent(subsubNode); + subNode->addContent(subsubNode2); + node->addContent(subNode); + subsubExtra->addContent(subsubExtraNode); + helper.attachExtraContent(node, extra); + helper.attachExtraContent(node, extra2); + helper.attachExtraContent(subNode, subExtra); + helper.attachExtraContent(subsubNode2, subsubExtra); + + helper.writeNodeToTempFile(node); + QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(node)), node); + helper.writeNodeToTempFile(subNode); + QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subNode)), subNode); + helper.writeNodeToTempFile(subsubNode); + QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subsubNode)), subsubNode); + helper.writeNodeToTempFile(subsubNode2); + QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subsubNode2)), subsubNode2); + helper.writeNodeToTempFile(extra); + QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(extra)), extra); + helper.writeNodeToTempFile(subExtra); + QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subExtra)), subExtra); + helper.writeNodeToTempFile(subsubExtra); + QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subsubExtra)), subsubExtra); + helper.writeNodeToTempFile(subsubExtraNode); + QCOMPARE(helper.fromHREF(msg, helper.tempFileUrlFromNode(subsubExtraNode)), subsubExtraNode); +} + +void NodeHelperTest::testCreateTempDir() +{ + QString path; + { + NodeHelper helper; + path = helper.createTempDir(QStringLiteral("foo")); + + QVERIFY(path.endsWith(QStringLiteral(".index.foo"))); + QVERIFY(QDir(path).exists()); + QVERIFY(QFile(path).permissions() & QFileDevice::WriteUser); + QVERIFY(QFile(path).permissions() & QFileDevice::ExeUser); + QVERIFY(QFile(path).permissions() & QFileDevice::ReadUser); + } + QVERIFY(!QDir(path).exists()); +} + +QTEST_GUILESS_MAIN(NodeHelperTest) + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/nodehelpertest.h kf5-messagelib-16.12.3/mimetreeparser/autotests/nodehelpertest.h --- kf5-messagelib-16.04.3/mimetreeparser/autotests/nodehelpertest.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/nodehelpertest.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,44 @@ +/* Copyright 2015 Sandro Knauß + + 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) version 3 or any later version + accepted by the membership of KDE e.V. (or its successor approved + by the membership of KDE e.V.), which shall act as a proxy + defined in Section 14 of version 3 of the license. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#ifndef NODEHELPERTEST_H +#define NODEHELPERTEST_H + +#include + +#include + +namespace MimeTreeParser +{ + +class NodeHelperTest : public QObject +{ + Q_OBJECT + +public: + NodeHelperTest(); + +private Q_SLOTS: + void testPersistentIndex(); + void testLocalFiles(); + void testHREF(); + void testCreateTempDir(); +}; + +} +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/setupenv.cpp kf5-messagelib-16.12.3/mimetreeparser/autotests/setupenv.cpp --- kf5-messagelib-16.04.3/mimetreeparser/autotests/setupenv.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/setupenv.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,34 @@ +/* + Copyright (C) 2010 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com + Copyright (c) 2010 Leo Franchi + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "setupenv.h" + +#include + +#include +#include + +void MimeTreeParser::Test::setupEnv() +{ + setenv("LC_ALL", "C", 1); + setenv("KDEHOME", QFile::encodeName(QDir::homePath() + QString::fromLatin1("/.qttest")).constData(), 1); + QStandardPaths::setTestModeEnabled(true); +} + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/setupenv.h kf5-messagelib-16.12.3/mimetreeparser/autotests/setupenv.h --- kf5-messagelib-16.04.3/mimetreeparser/autotests/setupenv.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/setupenv.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,175 @@ +/* + Copyright (C) 2010 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com + Copyright (c) 2010 Leo Franchi + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef MESSAGECORE_TESTS_UTIL_H +#define MESSAGECORE_TESTS_UTIL_H + +#include +#include +#include +#include +#include +#include + +namespace MimeTreeParser +{ + +namespace Test +{ + +/** +* setup a environment variables for tests: +* * set LC_ALL to C +* * set KDEHOME +*/ +void setupEnv(); + +// We can't use EmptySource, since we need to control some emelnets of the source for tests to also test +// loadExternal and htmlMail. +class TestObjectTreeSource : public MimeTreeParser::Interface::ObjectTreeSource +{ +public: + TestObjectTreeSource(MimeTreeParser::HtmlWriter *writer) + : mWriter(writer) + , mAttachmentStrategy(QStringLiteral("smart")) + , mPreferredMode(Util::Html) + , mHtmlLoadExternal(false) + , mDecryptMessage(false) + { + } + + MimeTreeParser::HtmlWriter *htmlWriter() Q_DECL_OVERRIDE { + return mWriter; + } + + bool htmlLoadExternal() const Q_DECL_OVERRIDE + { + return mHtmlLoadExternal; + } + + void setHtmlLoadExternal(bool loadExternal) + { + mHtmlLoadExternal = loadExternal; + } + + void setAttachmentStrategy(QString strategy) + { + mAttachmentStrategy = strategy; + } + + const AttachmentStrategy *attachmentStrategy() Q_DECL_OVERRIDE { + return AttachmentStrategy::create(mAttachmentStrategy); + } + + bool autoImportKeys() const Q_DECL_OVERRIDE + { + return true; + } + + bool showEmoticons() const Q_DECL_OVERRIDE + { + return false; + } + + bool showExpandQuotesMark() const Q_DECL_OVERRIDE + { + return false; + } + + const BodyPartFormatterBaseFactory *bodyPartFormatterFactory() Q_DECL_OVERRIDE { + return &mBodyPartFormatterBaseFactory; + } + + bool decryptMessage() const Q_DECL_OVERRIDE + { + return mDecryptMessage; + } + + void setAllowDecryption(bool allowDecryption) + { + mDecryptMessage = allowDecryption; + } + + void setShowSignatureDetails(bool showSignatureDetails) + { + mShowSignatureDetails = showSignatureDetails; + } + + bool showSignatureDetails() const Q_DECL_OVERRIDE + { + return mShowSignatureDetails; + } + + void setHtmlMode(MimeTreeParser::Util::HtmlMode mode, const QList &availableModes) Q_DECL_OVERRIDE { + Q_UNUSED(mode); + Q_UNUSED(availableModes); + } + + MimeTreeParser::Util::HtmlMode preferredMode() const Q_DECL_OVERRIDE + { + return mPreferredMode; + } + + void setPreferredMode(MimeTreeParser::Util::HtmlMode mode) + { + mPreferredMode = mode; + } + + int levelQuote() const Q_DECL_OVERRIDE + { + return 1; + } + + const QTextCodec *overrideCodec() Q_DECL_OVERRIDE { + return Q_NULLPTR; + } + + QString createMessageHeader(KMime::Message *message) Q_DECL_OVERRIDE { + Q_UNUSED(message); + return QString(); //do nothing + } + + QObject *sourceObject() Q_DECL_OVERRIDE { + return Q_NULLPTR; + } + + Interface::MessagePartRenderer::Ptr messagePartTheme(Interface::MessagePart::Ptr msgPart) Q_DECL_OVERRIDE { + Q_UNUSED(msgPart); + return Interface::MessagePartRenderer::Ptr(); + } + bool isPrinting() const Q_DECL_OVERRIDE + { + return false; + } +private: + MimeTreeParser::HtmlWriter *mWriter; + QString mAttachmentStrategy; + BodyPartFormatterBaseFactory mBodyPartFormatterBaseFactory; + MimeTreeParser::Util::HtmlMode mPreferredMode; + bool mHtmlLoadExternal; + bool mDecryptMessage; + bool mShowSignatureDetails; +}; + +} + +} + +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/testcsshelper.cpp kf5-messagelib-16.12.3/mimetreeparser/autotests/testcsshelper.cpp --- kf5-messagelib-16.04.3/mimetreeparser/autotests/testcsshelper.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/testcsshelper.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,106 @@ +/* + testcsshelper.cpp + + This file is part of KMail, the KDE mail client. + Copyright (c) 2013 Sandro Knauß + + KMail is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#include "testcsshelper.h" + +#include +#include +#include +#include + +namespace MimeTreeParser +{ + +TestCSSHelper::TestCSSHelper(const QPaintDevice *pd) : + CSSHelperBase(pd) +{ + mRecycleQuoteColors = false; + mBackgroundColor = QColor(0xff, 0xff, 0xff); + mForegroundColor = QColor(0x1f, 0x1c, 0x1b); + mLinkColor = QColor(0x00, 0x57, 0xae); + cPgpEncrH = QColor(0x00, 0x80, 0xff); + cPgpOk1H = QColor(0x40, 0xff, 0x40); + cPgpOk0H = QColor(0xff, 0xff, 0x40); + cPgpWarnH = QColor(0xff, 0xff, 0x40); + cPgpErrH = QColor(0xff, 0x00, 0x00); + + cPgpEncrHT = QColor(0xff, 0xff, 0xff); + cPgpOk1HT = QColor(0x27, 0xae, 0x60); + cPgpOk0HT = QColor(0xf6, 0x74, 0x00); + cPgpWarnHT = QColor(0xf6, 0x74, 0x00); + cPgpErrHT = QColor(0xda, 0x44, 0x53); + + cHtmlWarning = QColor(0xff, 0x40, 0x40); + for (int i = 0; i < 3; ++i) { + mQuoteColor[i] = QColor(0x00, 0x80 - i * 0x10, 0x00); + } + + QFont defaultFont = QFont(QStringLiteral("Sans Serif"), 9); + mBodyFont = defaultFont; + mPrintFont = defaultFont; + mFixedFont = defaultFont; + mFixedPrintFont = defaultFont; + defaultFont.setItalic(true); + for (int i = 0; i < 3; ++i) { + mQuoteFont[i] = defaultFont; + } + + mShrinkQuotes = false; + + QPalette pal; + + pal.setColor(QPalette::Background, QColor(0xd6, 0xd2, 0xd0)); + pal.setColor(QPalette::Foreground, QColor(0x22, 0x1f, 0x1e)); + pal.setColor(QPalette::Highlight, QColor(0x43, 0xac, 0xe8)); + pal.setColor(QPalette::HighlightedText, QColor(0xff, 0xff, 0xff)); + pal.setColor(QPalette::Mid, QColor(0xb3, 0xab, 0xa7)); + + QApplication::setPalette(pal); + + recalculatePGPColors(); +} + +TestCSSHelper::~TestCSSHelper() +{ + +} + +QString TestCSSHelper::htmlHead(bool fixed) const +{ + Q_UNUSED(fixed); + return + QStringLiteral("\n" + "\n" + "\n"); +} + +} + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/testcsshelper.h kf5-messagelib-16.12.3/mimetreeparser/autotests/testcsshelper.h --- kf5-messagelib-16.04.3/mimetreeparser/autotests/testcsshelper.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/testcsshelper.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,50 @@ +/* -*- c++ -*- + testcsshelper.h + + This file is part of KMail, the KDE mail client. + Copyright (c) 2013 Sandro Knauß + + KMail is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#ifndef __MIMETREEPARSER_TESTCSSHELPER_H__ +#define __MIMETREEPARSER_TESTCSSHELPER_H__ + +#include "viewer/csshelperbase.h" + +namespace MimeTreeParser +{ + +class TestCSSHelper : public CSSHelperBase +{ +public: + explicit TestCSSHelper(const QPaintDevice *pd); + virtual ~TestCSSHelper(); + QString htmlHead(bool fixed) const Q_DECL_OVERRIDE; +}; + +} + +#endif // __MIMETREEPARSER_TESTCSSHELPER_H__ diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/util.cpp kf5-messagelib-16.12.3/mimetreeparser/autotests/util.cpp --- kf5-messagelib-16.04.3/mimetreeparser/autotests/util.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/util.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,34 @@ +/* + Copyright (c) 2010 Thomas McGuire + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ +#include "util.h" + +#include + +KMime::Message::Ptr readAndParseMail(const QString &mailFile) +{ + QFile file(QLatin1String(MAIL_DATA_DIR) + QLatin1Char('/') + mailFile); + file.open(QIODevice::ReadOnly); + Q_ASSERT(file.isOpen()); + const QByteArray data = KMime::CRLFtoLF(file.readAll()); + Q_ASSERT(!data.isEmpty()); + KMime::Message::Ptr msg(new KMime::Message); + msg->setContent(data); + msg->parse(); + return msg; +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/autotests/util.h kf5-messagelib-16.12.3/mimetreeparser/autotests/util.h --- kf5-messagelib-16.04.3/mimetreeparser/autotests/util.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/autotests/util.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,43 @@ +/* + Copyright (c) 2010 Thomas McGuire + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ +#include "interfaces/htmlwriter.h" + +#include + +class TestHtmlWriter : public MimeTreeParser::HtmlWriter +{ +public: + explicit TestHtmlWriter() {} + virtual ~TestHtmlWriter() {} + + void begin(const QString &) Q_DECL_OVERRIDE {} + void write(const QString &) Q_DECL_OVERRIDE {} + void end() Q_DECL_OVERRIDE {} + void reset() Q_DECL_OVERRIDE {} + void queue(const QString &str) Q_DECL_OVERRIDE { + html.append(str); + } + void flush() Q_DECL_OVERRIDE {} + void embedPart(const QByteArray &, const QString &) Q_DECL_OVERRIDE {} + void extraHead(const QString &) Q_DECL_OVERRIDE {} + + QString html; +}; + +KMime::Message::Ptr readAndParseMail(const QString &mailFile); diff -Nru kf5-messagelib-16.04.3/mimetreeparser/CMakeLists.txt kf5-messagelib-16.12.3/mimetreeparser/CMakeLists.txt --- kf5-messagelib-16.04.3/mimetreeparser/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,41 @@ +project(MimeTreeParser) + +ecm_setup_version(${MESSAGELIB_LIB_VERSION} VARIABLE_PREFIX MIMETREEPARSER + VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/mimetreeparser_version.h" + PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF5MimeTreeParserConfigVersion.cmake" + SOVERSION 5 + ) + + +########### Targets ########### + +add_definitions("-DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII") + +set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF5MimeTreeParser") + +ecm_configure_package_config_file( + "${CMAKE_CURRENT_SOURCE_DIR}/KF5MimeTreeParserConfig.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/KF5MimeTreeParserConfig.cmake" + INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} + ) + +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/KF5MimeTreeParserConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/KF5MimeTreeParserConfigVersion.cmake" + DESTINATION "${CMAKECONFIG_INSTALL_DIR}" + COMPONENT Devel + ) + +install(EXPORT KF5MimeTreeParserTargets DESTINATION "${CMAKECONFIG_INSTALL_DIR}" FILE KF5MimeTreeParserTargets.cmake NAMESPACE KF5::) + +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/mimetreeparser_version.h + DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5} COMPONENT Devel + ) + +add_subdirectory(src) +if (BUILD_TESTING) + add_subdirectory(autotests) + add_subdirectory(src/temporaryfile/autotests) +endif() + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/KF5MimeTreeParserConfig.cmake.in kf5-messagelib-16.12.3/mimetreeparser/KF5MimeTreeParserConfig.cmake.in --- kf5-messagelib-16.04.3/mimetreeparser/KF5MimeTreeParserConfig.cmake.in 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/KF5MimeTreeParserConfig.cmake.in 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,5 @@ +@PACKAGE_INIT@ + +find_dependency(KF5Mime "@KMIME_LIB_VERSION@") + +include("${CMAKE_CURRENT_LIST_DIR}/KF5MimeTreeParserTargets.cmake") diff -Nru kf5-messagelib-16.04.3/mimetreeparser/Messages.sh kf5-messagelib-16.12.3/mimetreeparser/Messages.sh --- kf5-messagelib-16.04.3/mimetreeparser/Messages.sh 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/Messages.sh 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,2 @@ +#! /bin/sh +$XGETTEXT `find . -name '*.cpp' -o -name '*.h' | grep -v '/tests/' | grep -v '/autotests/'` -o $podir/libmimetreeparser.pot \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/applicationpgpencrypted.cpp kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/applicationpgpencrypted.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/applicationpgpencrypted.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/applicationpgpencrypted.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,98 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "applicationpgpencrypted.h" + +#include "utils.h" + +#include "viewer/objecttreeparser.h" +#include "viewer/messagepart.h" + +#include + +#include + +#include "mimetreeparser_debug.h" + +using namespace MimeTreeParser; + +const ApplicationPGPEncryptedBodyPartFormatter *ApplicationPGPEncryptedBodyPartFormatter::self; + +const Interface::BodyPartFormatter *ApplicationPGPEncryptedBodyPartFormatter::create() +{ + if (!self) { + self = new ApplicationPGPEncryptedBodyPartFormatter(); + } + return self; +} + +Interface::BodyPartFormatter::Result ApplicationPGPEncryptedBodyPartFormatter::format(Interface::BodyPart *part, HtmlWriter *writer) const +{ + Q_UNUSED(writer) + const auto p = process(*part); + const auto mp = static_cast(p.data()); + if (mp) { + mp->html(false); + return Ok; + } + return Failed; +} + +Interface::MessagePart::Ptr ApplicationPGPEncryptedBodyPartFormatter::process(Interface::BodyPart &part) const +{ + KMime::Content *node(part.content()); + + if (node->decodedContent().trimmed() != "Version: 1") { + qCWarning(MIMETREEPARSER_LOG) << "Unknown PGP Version String:" << node->decodedContent().trimmed(); + } + + if (!part.content()->parent()) { + return MessagePart::Ptr(); + } + + KMime::Content *data = findTypeInDirectChilds(part.content()->parent(), "application/octet-stream"); + + if (!data) { + return MessagePart::Ptr(); //new MimeMessagePart(part.objectTreeParser(), node, false)); + } + + part.nodeHelper()->setEncryptionState(node, KMMsgFullyEncrypted); + + EncryptedMessagePart::Ptr mp(new EncryptedMessagePart(part.objectTreeParser(), + data->decodedText(), QGpgME::openpgp(), + NodeHelper::fromAsString(data), node)); + mp->setIsEncrypted(true); + mp->setDecryptMessage(part.source()->decryptMessage()); + PartMetaData *messagePart(mp->partMetaData()); + if (!part.source()->decryptMessage()) { + part.nodeHelper()->setNodeProcessed(data, false); // Set the data node to done to prevent it from being processed + } else if (KMime::Content *newNode = part.nodeHelper()->decryptedNodeForContent(data)) { + // if we already have a decrypted node for this encrypted node, don't do the decryption again + return MessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), newNode, part.objectTreeParser()->showOnlyOneMimePart())); + } else { + mp->startDecryption(data); + if (!messagePart->inProgress) { + part.nodeHelper()->setNodeProcessed(data, false); // Set the data node to done to prevent it from being processed + if (messagePart->isDecryptable && messagePart->isSigned) { + part.nodeHelper()->setSignatureState(node, KMMsgFullySigned); + } + } + } + return mp; +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/applicationpgpencrypted.h kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/applicationpgpencrypted.h --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/applicationpgpencrypted.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/applicationpgpencrypted.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,41 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_BODYFORAMATTER_APPLICATIONPGPENCYPTED_H__ +#define __MIMETREEPARSER_BODYFORAMATTER_APPLICATIONPGPENCYPTED_H__ + +#include "interfaces/bodypartformatter.h" +#include "interfaces/bodypart.h" + +namespace MimeTreeParser +{ + +class ApplicationPGPEncryptedBodyPartFormatter : public Interface::BodyPartFormatter +{ + static const ApplicationPGPEncryptedBodyPartFormatter *self; +public: + Interface::MessagePart::Ptr process(Interface::BodyPart &part) const Q_DECL_OVERRIDE; + Interface::BodyPartFormatter::Result format(Interface::BodyPart *, HtmlWriter *) const Q_DECL_OVERRIDE; + using Interface::BodyPartFormatter::format; + static const Interface::BodyPartFormatter *create(); +}; + +} + +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/applicationpkcs7mime.cpp kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/applicationpkcs7mime.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/applicationpkcs7mime.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/applicationpkcs7mime.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,178 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "applicationpkcs7mime.h" + +#include "utils.h" + +#include "viewer/attachmentstrategy.h" +#include "viewer/objecttreeparser.h" +#include "viewer/messagepart.h" + +#include + +#include + +#include + +#include "mimetreeparser_debug.h" + +using namespace MimeTreeParser; + +const ApplicationPkcs7MimeBodyPartFormatter *ApplicationPkcs7MimeBodyPartFormatter::self; + +const Interface::BodyPartFormatter *ApplicationPkcs7MimeBodyPartFormatter::create() +{ + if (!self) { + self = new ApplicationPkcs7MimeBodyPartFormatter(); + } + return self; +} +Interface::BodyPartFormatter::Result ApplicationPkcs7MimeBodyPartFormatter::format(Interface::BodyPart *part, HtmlWriter *writer) const +{ + Q_UNUSED(writer) + const auto p = process(*part); + const auto mp = static_cast(p.data()); + if (mp) { + mp->html(false); + return Ok; + } + return Failed; +} + +Interface::MessagePart::Ptr ApplicationPkcs7MimeBodyPartFormatter::process(Interface::BodyPart &part) const +{ + KMime::Content *node = part.content(); + + if (node->head().isEmpty()) { + return MessagePart::Ptr(); + } + + const auto smimeCrypto = QGpgME::smime(); + if (!smimeCrypto) { + return MessagePart::Ptr(); + } + + const QString smimeType = node->contentType()->parameter(QStringLiteral("smime-type")).toLower(); + + if (smimeType == QLatin1String("certs-only")) { + part.processResult()->setNeverDisplayInline(true); + + CertMessagePart::Ptr mp(new CertMessagePart(part.objectTreeParser(), node, smimeCrypto, part.source()->autoImportKeys())); + return mp; + } + + bool isSigned = (smimeType == QLatin1String("signed-data")); + bool isEncrypted = (smimeType == QLatin1String("enveloped-data")); + + // Analyze "signTestNode" node to find/verify a signature. + // If zero part.objectTreeParser() verification was successfully done after + // decrypting via recursion by insertAndParseNewChildNode(). + KMime::Content *signTestNode = isEncrypted ? 0 : node; + + // We try decrypting the content + // if we either *know* that it is an encrypted message part + // or there is neither signed nor encrypted parameter. + MessagePart::Ptr mp; + if (!isSigned) { + if (isEncrypted) { + qCDebug(MIMETREEPARSER_LOG) << "pkcs7 mime == S/MIME TYPE: enveloped (encrypted) data"; + } else { + qCDebug(MIMETREEPARSER_LOG) << "pkcs7 mime - type unknown - enveloped (encrypted) data ?"; + } + + auto _mp = EncryptedMessagePart::Ptr(new EncryptedMessagePart(part.objectTreeParser(), + node->decodedText(), smimeCrypto, + NodeHelper::fromAsString(node), node)); + mp = _mp; + _mp->setIsEncrypted(true); + _mp->setDecryptMessage(part.source()->decryptMessage()); + PartMetaData *messagePart(_mp->partMetaData()); + if (!part.source()->decryptMessage()) { + isEncrypted = true; + signTestNode = 0; // PENDING(marc) to be abs. sure, we'd need to have to look at the content + } else { + _mp->startDecryption(); + if (messagePart->isDecryptable) { + qCDebug(MIMETREEPARSER_LOG) << "pkcs7 mime - encryption found - enveloped (encrypted) data !"; + isEncrypted = true; + part.nodeHelper()->setEncryptionState(node, KMMsgFullyEncrypted); + signTestNode = 0; + + } else { + // decryption failed, which could be because the part was encrypted but + // decryption failed, or because we didn't know if it was encrypted, tried, + // and failed. If the message was not actually encrypted, we continue + // assuming it's signed + if (_mp->passphraseError() || (smimeType.isEmpty() && messagePart->isEncrypted)) { + isEncrypted = true; + signTestNode = 0; + } + + if (isEncrypted) { + qCDebug(MIMETREEPARSER_LOG) << "pkcs7 mime - ERROR: COULD NOT DECRYPT enveloped data !"; + } else { + qCDebug(MIMETREEPARSER_LOG) << "pkcs7 mime - NO encryption found"; + } + } + } + + if (isEncrypted) { + part.nodeHelper()->setEncryptionState(node, KMMsgFullyEncrypted); + } + } + + // We now try signature verification if necessarry. + if (signTestNode) { + if (isSigned) { + qCDebug(MIMETREEPARSER_LOG) << "pkcs7 mime == S/MIME TYPE: opaque signed data"; + } else { + qCDebug(MIMETREEPARSER_LOG) << "pkcs7 mime - type unknown - opaque signed data ?"; + } + + const QTextCodec *aCodec(part.objectTreeParser()->codecFor(signTestNode)); + const QByteArray signaturetext = signTestNode->decodedContent(); + auto _mp = SignedMessagePart::Ptr(new SignedMessagePart(part.objectTreeParser(), + aCodec->toUnicode(signaturetext), smimeCrypto, + NodeHelper::fromAsString(node), signTestNode)); + mp = _mp; + //mp->setDecryptMessage(part.source()->decryptMessage()); + PartMetaData *messagePart(mp->partMetaData()); + if (smimeCrypto) { + _mp->startVerificationDetached(signaturetext, 0, QByteArray()); + } else { + messagePart->auditLogError = GpgME::Error(GPG_ERR_NOT_IMPLEMENTED); + } + + if (_mp->isSigned()) { + if (!isSigned) { + qCDebug(MIMETREEPARSER_LOG) << "pkcs7 mime - signature found - opaque signed data !"; + isSigned = true; + } + + if (signTestNode != node) { + part.nodeHelper()->setSignatureState(node, KMMsgFullySigned); + } + } else { + qCDebug(MIMETREEPARSER_LOG) << "pkcs7 mime - NO signature found :-("; + } + } + + return mp; +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/applicationpkcs7mime.h kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/applicationpkcs7mime.h --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/applicationpkcs7mime.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/applicationpkcs7mime.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,41 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_BODYFORAMATTER_APPLICATIONPKCS7MIME_H__ +#define __MIMETREEPARSER_BODYFORAMATTER_APPLICATIONPKCS7MIME_H__ + +#include "interfaces/bodypartformatter.h" +#include "interfaces/bodypart.h" + +namespace MimeTreeParser +{ + +class ApplicationPkcs7MimeBodyPartFormatter : public Interface::BodyPartFormatter +{ + static const ApplicationPkcs7MimeBodyPartFormatter *self; +public: + Interface::MessagePart::Ptr process(Interface::BodyPart &part) const Q_DECL_OVERRIDE; + Interface::BodyPartFormatter::Result format(Interface::BodyPart *, HtmlWriter *) const Q_DECL_OVERRIDE; + using Interface::BodyPartFormatter::format; + static const Interface::BodyPartFormatter *create(); +}; + +} + +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/mailman.cpp kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/mailman.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/mailman.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/mailman.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,183 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "mailman.h" + +#include "utils.h" + +#include "viewer/objecttreeparser.h" +#include "viewer/messagepart.h" + +#include + +#include "mimetreeparser_debug.h" + +using namespace MimeTreeParser; + +const MailmanBodyPartFormatter *MailmanBodyPartFormatter::self; + +const Interface::BodyPartFormatter *MailmanBodyPartFormatter::create() +{ + if (!self) { + self = new MailmanBodyPartFormatter(); + } + return self; +} +Interface::BodyPartFormatter::Result MailmanBodyPartFormatter::format(Interface::BodyPart *part, HtmlWriter *writer) const +{ + Q_UNUSED(writer) + const auto p = process(*part); + const auto mp = static_cast(p.data()); + if (mp) { + mp->html(false); + return Ok; + } + return Failed; +} + +bool MailmanBodyPartFormatter::isMailmanMessage(KMime::Content *curNode) const +{ + if (!curNode || curNode->head().isEmpty()) { + return false; + } + if (curNode->hasHeader("X-Mailman-Version")) { + return true; + } + if (KMime::Headers::Base *header = curNode->headerByType("X-Mailer")) { + if (header->asUnicodeString().contains(QStringLiteral("MAILMAN"), Qt::CaseInsensitive)) { + return true; + } + } + return false; +} + +Interface::MessagePart::Ptr MailmanBodyPartFormatter::process(Interface::BodyPart &part) const +{ + KMime::Content *curNode = part.content(); + + if (!isMailmanMessage(curNode)) { + return MessagePart::Ptr(); + } + + const QString str = QString::fromLatin1(curNode->decodedContent()); + + //### + const QLatin1String delim1("--__--__--\n\nMessage:"); + const QLatin1String delim2("--__--__--\r\n\r\nMessage:"); + const QLatin1String delimZ2("--__--__--\n\n_____________"); + const QLatin1String delimZ1("--__--__--\r\n\r\n_____________"); + QString partStr, digestHeaderStr; + int thisDelim = str.indexOf(delim1, Qt::CaseInsensitive); + if (thisDelim == -1) { + thisDelim = str.indexOf(delim2, Qt::CaseInsensitive); + } + if (thisDelim == -1) { + return MessagePart::Ptr(); + } + + int nextDelim = str.indexOf(delim1, thisDelim + 1, Qt::CaseInsensitive); + if (-1 == nextDelim) { + nextDelim = str.indexOf(delim2, thisDelim + 1, Qt::CaseInsensitive); + } + if (-1 == nextDelim) { + nextDelim = str.indexOf(delimZ1, thisDelim + 1, Qt::CaseInsensitive); + } + if (-1 == nextDelim) { + nextDelim = str.indexOf(delimZ2, thisDelim + 1, Qt::CaseInsensitive); + } + if (nextDelim < 0) { + return MessagePart::Ptr(); + } + + //if ( curNode->mRoot ) + // curNode = curNode->mRoot; + + // at least one message found: build a mime tree + digestHeaderStr = QStringLiteral("Content-Type: text/plain\nContent-Description: digest header\n\n"); + digestHeaderStr += str.midRef(0, thisDelim); + + MessagePartList::Ptr mpl(new MessagePartList(part.objectTreeParser())); + mpl->appendSubPart(createAndParseTempNode(part, part.topLevelContent(), digestHeaderStr.toLatin1().constData(), "Digest Header")); + //mReader->queueHtml("


"); + // temporarily change curent node's Content-Type + // to get our embedded RfC822 messages properly inserted + curNode->contentType()->setMimeType("multipart/digest"); + while (-1 < nextDelim) { + int thisEoL = str.indexOf(QLatin1String("\nMessage:"), thisDelim, Qt::CaseInsensitive); + if (-1 < thisEoL) { + thisDelim = thisEoL + 1; + } else { + thisEoL = str.indexOf(QLatin1String("\n_____________"), thisDelim, Qt::CaseInsensitive); + if (-1 < thisEoL) { + thisDelim = thisEoL + 1; + } + } + thisEoL = str.indexOf(QLatin1Char('\n'), thisDelim); + if (-1 < thisEoL) { + thisDelim = thisEoL + 1; + } else { + thisDelim = thisDelim + 1; + } + //while( thisDelim < cstr.size() && '\n' == cstr[thisDelim] ) + // ++thisDelim; + + partStr = QStringLiteral("Content-Type: message/rfc822\nContent-Description: embedded message\n\n"); + partStr += str.midRef(thisDelim, nextDelim - thisDelim); + QString subject = QStringLiteral("embedded message"); + QString subSearch = QStringLiteral("\nSubject:"); + int subPos = partStr.indexOf(subSearch, 0, Qt::CaseInsensitive); + if (-1 < subPos) { + subject = partStr.mid(subPos + subSearch.length()); + thisEoL = subject.indexOf(QLatin1Char('\n')); + if (-1 < thisEoL) { + subject.truncate(thisEoL); + } + } + qCDebug(MIMETREEPARSER_LOG) << " embedded message found: \"" << subject; + mpl->appendSubPart(createAndParseTempNode(part, part.topLevelContent(), partStr.toLatin1().constData(), subject.toLatin1().constData())); + //mReader->queueHtml("


"); + thisDelim = nextDelim + 1; + nextDelim = str.indexOf(delim1, thisDelim, Qt::CaseInsensitive); + if (-1 == nextDelim) { + nextDelim = str.indexOf(delim2, thisDelim, Qt::CaseInsensitive); + } + if (-1 == nextDelim) { + nextDelim = str.indexOf(delimZ1, thisDelim, Qt::CaseInsensitive); + } + if (-1 == nextDelim) { + nextDelim = str.indexOf(delimZ2, thisDelim, Qt::CaseInsensitive); + } + } + // reset curent node's Content-Type + curNode->contentType()->setMimeType("text/plain"); + int thisEoL = str.indexOf(QLatin1String("_____________"), thisDelim); + if (-1 < thisEoL) { + thisDelim = thisEoL; + thisEoL = str.indexOf(QLatin1Char('\n'), thisDelim); + if (-1 < thisEoL) { + thisDelim = thisEoL + 1; + } + } else { + thisDelim = thisDelim + 1; + } + partStr = QStringLiteral("Content-Type: text/plain\nContent-Description: digest footer\n\n"); + partStr += str.midRef(thisDelim); + mpl->appendSubPart(createAndParseTempNode(part, part.topLevelContent(), partStr.toLatin1().constData(), "Digest Footer")); + return mpl; +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/mailman.h kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/mailman.h --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/mailman.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/mailman.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,44 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_BODYFORAMATTER_MAILMAN_H__ +#define __MIMETREEPARSER_BODYFORAMATTER_MAILMAN_H__ + +#include "interfaces/bodypartformatter.h" +#include "interfaces/bodypart.h" + +namespace MimeTreeParser +{ + +class MailmanBodyPartFormatter : public Interface::BodyPartFormatter +{ + static const MailmanBodyPartFormatter *self; +public: + Interface::MessagePart::Ptr process(Interface::BodyPart &part) const Q_DECL_OVERRIDE; + Interface::BodyPartFormatter::Result format(Interface::BodyPart *, HtmlWriter *) const Q_DECL_OVERRIDE; + using Interface::BodyPartFormatter::format; + static const Interface::BodyPartFormatter *create(); + +private: + bool isMailmanMessage(KMime::Content *curNode) const; +}; + +} + +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/multipartalternative.cpp kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/multipartalternative.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/multipartalternative.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/multipartalternative.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,94 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "multipartalternative.h" + +#include "utils.h" + +#include "viewer/objecttreeparser.h" +#include "viewer/messagepart.h" + +#include + +#include "mimetreeparser_debug.h" + +using namespace MimeTreeParser; + +const MultiPartAlternativeBodyPartFormatter *MultiPartAlternativeBodyPartFormatter::self; + +const Interface::BodyPartFormatter *MultiPartAlternativeBodyPartFormatter::create() +{ + if (!self) { + self = new MultiPartAlternativeBodyPartFormatter(); + } + return self; +} +Interface::BodyPartFormatter::Result MultiPartAlternativeBodyPartFormatter::format(Interface::BodyPart *part, HtmlWriter *writer) const +{ + Q_UNUSED(writer) + const auto p = process(*part); + const auto mp = static_cast(p.data()); + if (mp) { + mp->html(false); + return Ok; + } + return Failed; +} + +Interface::MessagePart::Ptr MultiPartAlternativeBodyPartFormatter::process(Interface::BodyPart &part) const +{ + KMime::Content *node = part.content(); + if (node->contents().isEmpty()) { + return MessagePart::Ptr(); + } + + auto preferredMode = part.source()->preferredMode(); + AlternativeMessagePart::Ptr mp(new AlternativeMessagePart(part.objectTreeParser(), node, preferredMode)); + if (mp->mChildNodes.isEmpty()) { + MimeMessagePart::Ptr _mp(new MimeMessagePart(part.objectTreeParser(), node->contents().at(0), false)); + return _mp; + } + + KMime::Content *dataIcal = mp->mChildNodes.contains(Util::MultipartIcal) ? mp->mChildNodes[Util::MultipartIcal] : Q_NULLPTR; + KMime::Content *dataHtml = mp->mChildNodes.contains(Util::MultipartHtml) ? mp->mChildNodes[Util::MultipartHtml] : Q_NULLPTR; + KMime::Content *dataPlain = mp->mChildNodes.contains(Util::MultipartPlain) ? mp->mChildNodes[Util::MultipartPlain] : Q_NULLPTR; + + // Make sure that in default ical is prefered over html and plain text + if (dataIcal && ((preferredMode != Util::MultipartHtml && preferredMode != Util::MultipartPlain))) { + if (dataHtml) { + part.nodeHelper()->setNodeProcessed(dataHtml, false); + } + if (dataPlain) { + part.nodeHelper()->setNodeProcessed(dataPlain, false); + } + preferredMode = Util::MultipartIcal; + } else if ((dataHtml && (preferredMode == Util::MultipartHtml || preferredMode == Util::Html)) || + (dataHtml && dataPlain && dataPlain->body().isEmpty())) { + if (dataPlain) { + part.nodeHelper()->setNodeProcessed(dataPlain, false); + } + preferredMode = Util::MultipartHtml; + } else if (!(preferredMode == Util::MultipartHtml) && dataPlain) { + part.nodeHelper()->setNodeProcessed(dataHtml, false); + preferredMode = Util::MultipartPlain; + } + part.source()->setHtmlMode(preferredMode, mp->availableModes()); + mp->mPreferredMode = preferredMode; + return mp; +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/multipartalternative.h kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/multipartalternative.h --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/multipartalternative.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/multipartalternative.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,41 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_BODYFORAMATTER_MULTIPARTALTERNATIVE_H__ +#define __MIMETREEPARSER_BODYFORAMATTER_MULTIPARTALTERNATIVE_H__ + +#include "interfaces/bodypartformatter.h" +#include "interfaces/bodypart.h" + +namespace MimeTreeParser +{ + +class MultiPartAlternativeBodyPartFormatter : public Interface::BodyPartFormatter +{ + static const MultiPartAlternativeBodyPartFormatter *self; +public: + Interface::MessagePart::Ptr process(Interface::BodyPart &part) const Q_DECL_OVERRIDE; + Interface::BodyPartFormatter::Result format(Interface::BodyPart *, HtmlWriter *) const Q_DECL_OVERRIDE; + using Interface::BodyPartFormatter::format; + static const Interface::BodyPartFormatter *create(); +}; + +} + +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/multipartencrypted.cpp kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/multipartencrypted.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/multipartencrypted.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/multipartencrypted.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,111 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "multipartencrypted.h" + +#include "utils.h" + +#include "viewer/objecttreeparser.h" +#include "viewer/messagepart.h" + +#include + +#include + +#include "mimetreeparser_debug.h" + +using namespace MimeTreeParser; + +const MultiPartEncryptedBodyPartFormatter *MultiPartEncryptedBodyPartFormatter::self; + +const Interface::BodyPartFormatter *MultiPartEncryptedBodyPartFormatter::create() +{ + if (!self) { + self = new MultiPartEncryptedBodyPartFormatter(); + } + return self; +} +Interface::BodyPartFormatter::Result MultiPartEncryptedBodyPartFormatter::format(Interface::BodyPart *part, HtmlWriter *writer) const +{ + Q_UNUSED(writer) + const auto p = process(*part); + const auto mp = static_cast(p.data()); + if (mp) { + mp->html(false); + return Ok; + } + return Failed; +} + +Interface::MessagePart::Ptr MultiPartEncryptedBodyPartFormatter::process(Interface::BodyPart &part) const +{ + KMime::Content *node = part.content(); + + if (node->contents().isEmpty()) { + Q_ASSERT(false); + return MessagePart::Ptr(); + } + + const QGpgME::Protocol *useThisCryptProto = Q_NULLPTR; + + /* + ATTENTION: This code is to be replaced by the new 'auto-detect' feature. -------------------------------------- + */ + KMime::Content *data = findTypeInDirectChilds(node, "application/octet-stream"); + if (data) { + useThisCryptProto = QGpgME::openpgp(); + } + if (!data) { + data = findTypeInDirectChilds(node, "application/pkcs7-mime"); + if (data) { + useThisCryptProto = QGpgME::smime(); + } + } + /* + --------------------------------------------------------------------------------------------------------------- + */ + + if (!data) { + return MessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), node->contents().at(0), false)); + } + + part.nodeHelper()->setEncryptionState(node, KMMsgFullyEncrypted); + + EncryptedMessagePart::Ptr mp(new EncryptedMessagePart(part.objectTreeParser(), + data->decodedText(), useThisCryptProto, + NodeHelper::fromAsString(data), node)); + mp->setIsEncrypted(true); + mp->setDecryptMessage(part.source()->decryptMessage()); + PartMetaData *messagePart(mp->partMetaData()); + if (!part.source()->decryptMessage()) { + part.nodeHelper()->setNodeProcessed(data, false); // Set the data node to done to prevent it from being processed + } else if (KMime::Content *newNode = part.nodeHelper()->decryptedNodeForContent(data)) { + // if we already have a decrypted node for part.objectTreeParser() encrypted node, don't do the decryption again + return MessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), newNode, true)); + } else { + mp->startDecryption(data); + + qCDebug(MIMETREEPARSER_LOG) << "decrypted, signed?:" << messagePart->isSigned; + + if (!messagePart->inProgress) { + part.nodeHelper()->setNodeProcessed(data, false); // Set the data node to done to prevent it from being processed + } + } + return mp; +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/multipartencrypted.h kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/multipartencrypted.h --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/multipartencrypted.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/multipartencrypted.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,41 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_BODYFORAMATTER_MULTIPARTENCRYPTED_H__ +#define __MIMETREEPARSER_BODYFORAMATTER_MULTIPARTENCRYPTED_H__ + +#include "interfaces/bodypartformatter.h" +#include "interfaces/bodypart.h" + +namespace MimeTreeParser +{ + +class MultiPartEncryptedBodyPartFormatter : public Interface::BodyPartFormatter +{ + static const MultiPartEncryptedBodyPartFormatter *self; +public: + Interface::MessagePart::Ptr process(Interface::BodyPart &part) const Q_DECL_OVERRIDE; + Interface::BodyPartFormatter::Result format(Interface::BodyPart *, HtmlWriter *) const Q_DECL_OVERRIDE; + using Interface::BodyPartFormatter::format; + static const Interface::BodyPartFormatter *create(); +}; + +} + +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/multipartmixed.cpp kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/multipartmixed.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/multipartmixed.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/multipartmixed.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,61 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "multipartmixed.h" + +#include "viewer/objecttreeparser.h" +#include "viewer/messagepart.h" + +#include + +#include "mimetreeparser_debug.h" + +using namespace MimeTreeParser; + +const MultiPartMixedBodyPartFormatter *MultiPartMixedBodyPartFormatter::self; + +const Interface::BodyPartFormatter *MultiPartMixedBodyPartFormatter::create() +{ + if (!self) { + self = new MultiPartMixedBodyPartFormatter(); + } + return self; +} +Interface::BodyPartFormatter::Result MultiPartMixedBodyPartFormatter::format(Interface::BodyPart *part, HtmlWriter *writer) const +{ + Q_UNUSED(writer) + const auto p = process(*part); + const auto mp = static_cast(p.data()); + if (mp) { + mp->html(false); + return Ok; + } + return Failed; +} + +Interface::MessagePart::Ptr MultiPartMixedBodyPartFormatter::process(Interface::BodyPart &part) const +{ + if (part.content()->contents().isEmpty()) { + return MessagePart::Ptr(); + } + + // normal treatment of the parts in the mp/mixed container + MimeMessagePart::Ptr mp(new MimeMessagePart(part.objectTreeParser(), part.content()->contents().at(0), false)); + return mp; +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/multipartmixed.h kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/multipartmixed.h --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/multipartmixed.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/multipartmixed.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,41 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_BODYFORAMATTER_MULTIPARTMIXED_H__ +#define __MIMETREEPARSER_BODYFORAMATTER_MULTIPARTMIXED_H__ + +#include "interfaces/bodypartformatter.h" +#include "interfaces/bodypart.h" + +namespace MimeTreeParser +{ + +class MultiPartMixedBodyPartFormatter : public Interface::BodyPartFormatter +{ + static const MultiPartMixedBodyPartFormatter *self; +public: + Interface::MessagePart::Ptr process(Interface::BodyPart &part) const Q_DECL_OVERRIDE; + Interface::BodyPartFormatter::Result format(Interface::BodyPart *, HtmlWriter *) const Q_DECL_OVERRIDE; + using Interface::BodyPartFormatter::format; + static const Interface::BodyPartFormatter *create(); +}; + +} + +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/multipartsigned.cpp kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/multipartsigned.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/multipartsigned.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/multipartsigned.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,114 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "multipartsigned.h" + +#include "viewer/objecttreeparser.h" +#include "viewer/messagepart.h" + +#include + +#include + +#include "mimetreeparser_debug.h" + +#include + +using namespace MimeTreeParser; + +const MultiPartSignedBodyPartFormatter *MultiPartSignedBodyPartFormatter::self; + +const Interface::BodyPartFormatter *MultiPartSignedBodyPartFormatter::create() +{ + if (!self) { + self = new MultiPartSignedBodyPartFormatter(); + } + return self; +} +Interface::BodyPartFormatter::Result MultiPartSignedBodyPartFormatter::format(Interface::BodyPart *part, HtmlWriter *writer) const +{ + Q_UNUSED(writer) + const auto p = process(*part); + const auto mp = static_cast(p.data()); + if (mp) { + mp->html(false); + return Ok; + } + return Failed; +} + +Interface::MessagePart::Ptr MultiPartSignedBodyPartFormatter::process(Interface::BodyPart &part) const +{ + KMime::Content *node = part.content(); + if (node->contents().size() != 2) { + qCDebug(MIMETREEPARSER_LOG) << "mulitpart/signed must have exactly two child parts!" << endl + << "processing as multipart/mixed"; + if (!node->contents().isEmpty()) { + return MessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), node->contents().at(0), false)); + } else { + return MessagePart::Ptr(); + } + } + + KMime::Content *signedData = node->contents().at(0); + KMime::Content *signature = node->contents().at(1); + Q_ASSERT(signedData); + Q_ASSERT(signature); + + QString protocolContentType = node->contentType()->parameter(QStringLiteral("protocol")).toLower(); + const QString signatureContentType = QLatin1String(signature->contentType()->mimeType().toLower()); + if (protocolContentType.isEmpty()) { + qCWarning(MIMETREEPARSER_LOG) << "Message doesn't set the protocol for the multipart/signed content-type, " + "using content-type of the signature:" << signatureContentType; + protocolContentType = signatureContentType; + } + + const QGpgME::Protocol *protocol = Q_NULLPTR; + if (protocolContentType == QLatin1String("application/pkcs7-signature") || + protocolContentType == QLatin1String("application/x-pkcs7-signature")) { + protocol = QGpgME::smime(); + } else if (protocolContentType == QLatin1String("application/pgp-signature") || + protocolContentType == QLatin1String("application/x-pgp-signature")) { + protocol = QGpgME::openpgp(); + } + + if (!protocol) { + return MessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), signedData, false)); + } + + part.nodeHelper()->setNodeProcessed(signature, true); + + part.nodeHelper()->setSignatureState(node, KMMsgFullySigned); + + const QByteArray cleartext = KMime::LFtoCRLF(signedData->encodedContent()); + const QTextCodec *aCodec(part.objectTreeParser()->codecFor(signedData)); + + SignedMessagePart::Ptr mp(new SignedMessagePart(part.objectTreeParser(), + aCodec->toUnicode(cleartext), protocol, + NodeHelper::fromAsString(node), signature)); + PartMetaData *messagePart(mp->partMetaData()); + + if (protocol) { + mp->startVerificationDetached(cleartext, signedData, signature->decodedContent()); + } else { + messagePart->auditLogError = GpgME::Error(GPG_ERR_NOT_IMPLEMENTED); + } + + return mp; +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/multipartsigned.h kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/multipartsigned.h --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/multipartsigned.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/multipartsigned.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,41 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_BODYFORAMATTER_MULTIPARTSIGNED_H__ +#define __MIMETREEPARSER_BODYFORAMATTER_MULTIPARTSIGNED_H__ + +#include "interfaces/bodypartformatter.h" +#include "interfaces/bodypart.h" + +namespace MimeTreeParser +{ + +class MultiPartSignedBodyPartFormatter : public Interface::BodyPartFormatter +{ + static const MultiPartSignedBodyPartFormatter *self; +public: + Interface::MessagePart::Ptr process(Interface::BodyPart &part) const Q_DECL_OVERRIDE; + Interface::BodyPartFormatter::Result format(Interface::BodyPart *, HtmlWriter *) const Q_DECL_OVERRIDE; + using Interface::BodyPartFormatter::format; + static const Interface::BodyPartFormatter *create(); +}; + +} + +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/texthtml.cpp kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/texthtml.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/texthtml.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/texthtml.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,58 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "texthtml.h" + +#include "viewer/attachmentstrategy.h" +#include "viewer/objecttreeparser.h" +#include "viewer/messagepart.h" + +#include + +#include "mimetreeparser_debug.h" + +using namespace MimeTreeParser; + +const TextHtmlBodyPartFormatter *TextHtmlBodyPartFormatter::self; + +const Interface::BodyPartFormatter *TextHtmlBodyPartFormatter::create() +{ + if (!self) { + self = new TextHtmlBodyPartFormatter(); + } + return self; +} +Interface::BodyPartFormatter::Result TextHtmlBodyPartFormatter::format(Interface::BodyPart *part, HtmlWriter *writer) const +{ + Q_UNUSED(writer) + const auto p = process(*part); + const auto mp = static_cast(p.data()); + if (mp) { + mp->html(false); + return Ok; + } + return Failed; +} + +Interface::MessagePart::Ptr TextHtmlBodyPartFormatter::process(Interface::BodyPart &part) const +{ + KMime::Content *node = part.content(); + HtmlMessagePart::Ptr mp(new HtmlMessagePart(part.objectTreeParser(), node, part.source())); + return mp; +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/texthtml.h kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/texthtml.h --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/texthtml.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/texthtml.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,41 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_BODYFORAMATTER_TEXTHTML_H__ +#define __MIMETREEPARSER_BODYFORAMATTER_TEXTHTML_H__ + +#include "interfaces/bodypartformatter.h" +#include "interfaces/bodypart.h" + +namespace MimeTreeParser +{ + +class TextHtmlBodyPartFormatter : public Interface::BodyPartFormatter +{ + static const TextHtmlBodyPartFormatter *self; +public: + Interface::MessagePart::Ptr process(Interface::BodyPart &part) const Q_DECL_OVERRIDE; + Interface::BodyPartFormatter::Result format(Interface::BodyPart *, HtmlWriter *) const Q_DECL_OVERRIDE; + using Interface::BodyPartFormatter::format; + static const Interface::BodyPartFormatter *create(); +}; + +} + +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/textplain.cpp kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/textplain.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/textplain.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/textplain.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,78 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "textplain.h" + +#include "viewer/attachmentstrategy.h" +#include "viewer/objecttreeparser.h" +#include "viewer/messagepart.h" + +#include + +#include "mimetreeparser_debug.h" + +using namespace MimeTreeParser; + +const TextPlainBodyPartFormatter *TextPlainBodyPartFormatter::self; + +const Interface::BodyPartFormatter *TextPlainBodyPartFormatter::create() +{ + if (!self) { + self = new TextPlainBodyPartFormatter(); + } + return self; +} +Interface::BodyPartFormatter::Result TextPlainBodyPartFormatter::format(Interface::BodyPart *part, HtmlWriter *writer) const +{ + Q_UNUSED(writer) + const auto p = process(*part); + const auto mp = static_cast(p.data()); + if (mp) { + mp->html(false); + return Ok; + } + return Failed; +} + +Interface::MessagePart::Ptr TextPlainBodyPartFormatter::process(Interface::BodyPart &part) const +{ + KMime::Content *node = part.content(); + const bool isFirstTextPart = (node->topLevel()->textContent() == node); + + QString label = NodeHelper::fileName(node); + + const bool bDrawFrame = !isFirstTextPart + && !part.objectTreeParser()->showOnlyOneMimePart() + && !label.isEmpty(); + const QString fileName = part.nodeHelper()->writeNodeToTempFile(node); + + TextMessagePart::Ptr mp; + if (isFirstTextPart) { + mp = TextMessagePart::Ptr(new TextMessagePart(part.objectTreeParser(), node, bDrawFrame, fileName.isEmpty(), part.source()->decryptMessage())); + } else { + mp = TextMessagePart::Ptr(new AttachmentMessagePart(part.objectTreeParser(), node, bDrawFrame, fileName.isEmpty(), part.source()->decryptMessage())); + } + + part.processResult()->setInlineSignatureState(mp->signatureState()); + part.processResult()->setInlineEncryptionState(mp->encryptionState()); + + part.nodeHelper()->setNodeDisplayedEmbedded(node, true); + + return mp; +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/textplain.h kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/textplain.h --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/textplain.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/textplain.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,41 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_BODYFORAMATTER_TEXTPLAIN_H__ +#define __MIMETREEPARSER_BODYFORAMATTER_TEXTPLAIN_H__ + +#include "interfaces/bodypartformatter.h" +#include "interfaces/bodypart.h" + +namespace MimeTreeParser +{ + +class TextPlainBodyPartFormatter : public Interface::BodyPartFormatter +{ + static const TextPlainBodyPartFormatter *self; +public: + Interface::MessagePart::Ptr process(Interface::BodyPart &part) const Q_DECL_OVERRIDE; + Interface::BodyPartFormatter::Result format(Interface::BodyPart *, HtmlWriter *) const Q_DECL_OVERRIDE; + using Interface::BodyPartFormatter::format; + static const Interface::BodyPartFormatter *create(); +}; + +} + +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/utils.cpp kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/utils.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/utils.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/utils.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,70 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "utils.h" + +using namespace MimeTreeParser; + +MimeMessagePart::Ptr MimeTreeParser::createAndParseTempNode(Interface::BodyPart &part, KMime::Content *parentNode, const char *content, const char *cntDesc) +{ + KMime::Content *newNode = new KMime::Content(); + newNode->setContent(KMime::CRLFtoLF(content)); + newNode->parse(); + + if (!newNode->head().isEmpty()) { + newNode->contentDescription()->from7BitString(cntDesc); + } + part.nodeHelper()->attachExtraContent(parentNode, newNode); + + return MimeMessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), newNode, false)); +} + +KMime::Content *MimeTreeParser::findTypeInDirectChilds(KMime::Content *content, const QByteArray &mimeType) +{ + if (mimeType.isEmpty()) { + return content; + } + + foreach (auto child, content->contents()) { + if ((!child->contentType()->isEmpty()) + && (mimeType == child->contentType()->mimeType())) { + return child; + } + } + return Q_NULLPTR; +} + +MessagePart::Ptr MimeTreeParser::toplevelTextNode(MessagePart::Ptr messageTree) +{ + foreach (const auto &mp, messageTree->subParts()) { + auto text = mp.dynamicCast(); + auto attach = mp.dynamicCast(); + if (text && !attach) { + return text; + } else if (const auto alternative = mp.dynamicCast()) { + return alternative; + } else if (const auto m = mp.dynamicCast()) { + auto ret = toplevelTextNode(m); + if (ret) { + return ret; + } + } + } + return MessagePart::Ptr(); +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/utils.h kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/utils.h --- kf5-messagelib-16.04.3/mimetreeparser/src/bodyformatter/utils.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/bodyformatter/utils.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,42 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_BODYFORAMATTER_UTILS_H__ +#define __MIMETREEPARSER_BODYFORAMATTER_UTILS_H__ + +#include "interfaces/bodypart.h" +#include "viewer/messagepart.h" + +#include + +namespace MimeTreeParser +{ +/** + 1. Create a new partNode using 'content' data and Content-Description + found in 'cntDesc'. + 2. Parse the 'node' to display the content. +*/ +MimeMessagePart::Ptr createAndParseTempNode(Interface::BodyPart &part, KMime::Content *parentNode, const char *content, const char *cntDesc); + +KMime::Content *findTypeInDirectChilds(KMime::Content *content, const QByteArray &mimeType); + +MessagePart::Ptr toplevelTextNode(MessagePart::Ptr messageTree); +} + +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/CMakeLists.txt kf5-messagelib-16.12.3/mimetreeparser/src/CMakeLists.txt --- kf5-messagelib-16.04.3/mimetreeparser/src/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,185 @@ + +add_definitions( -DQT_NO_CAST_FROM_ASCII ) +add_definitions( -DQT_NO_CAST_TO_ASCII ) + + +add_definitions(-DTRANSLATION_DOMAIN=\"libmimetreeparser\") + +# target_include_directories does not handle empty include paths +include_directories(${GPGME_INCLUDES}) + +set(libmimetreeparser_main_SRCS + bodyformatter/applicationpgpencrypted.cpp + bodyformatter/applicationpkcs7mime.cpp + bodyformatter/mailman.cpp + bodyformatter/multipartalternative.cpp + bodyformatter/multipartencrypted.cpp + bodyformatter/multipartmixed.cpp + bodyformatter/multipartsigned.cpp + bodyformatter/textplain.cpp + bodyformatter/texthtml.cpp + bodyformatter/utils.cpp + interfaces/bodypartformatter.cpp + interfaces/objecttreesource.cpp + interfaces/bodypart.cpp + interfaces/htmlwriter.cpp + interfaces/messagepartrenderer.cpp + job/qgpgmejobexecutor.cpp + utils/util.cpp + viewer/attachmentstrategy.cpp + viewer/bodypartformatter.cpp + viewer/bodypartformatterbasefactory.cpp + viewer/cryptohelper.cpp + viewer/nodehelper.cpp + viewer/objecttreeparser.cpp + viewer/messagepart.cpp + viewer/partnodebodypart.cpp + viewer/memento/cryptobodypartmemento.cpp + viewer/memento/decryptverifybodypartmemento.cpp + viewer/memento/verifydetachedbodypartmemento.cpp + viewer/memento/verifyopaquebodypartmemento.cpp + ) + +set(libmimetreeparser_extra_SRCS + #HTML Writer + htmlwriter/filehtmlwriter.cpp + htmlwriter/queuehtmlwriter.cpp + ) + +set(mimetreeparser_temporaryfile_SRCS + temporaryfile/attachmenttemporaryfilesdirs.cpp + ) + +ecm_generate_headers(MimeTreeParser_Camelcaseviewer_HEADERS + HEADER_NAMES + AttachmentStrategy + BodyPartFormatterBaseFactory + Enums + MessagePart + NodeHelper + ObjectTreeParser + PartMetaData + PartNodeBodyPart + REQUIRED_HEADERS MimeTreeParser_viewer_HEADERS + PREFIX MimeTreeParser + RELATIVE viewer + ) + +ecm_generate_headers(MimeTreeParser_Camelcaseutils_HEADERS + HEADER_NAMES + Util + REQUIRED_HEADERS MimeTreeParser_utils_HEADERS + PREFIX MimeTreeParser + RELATIVE utils + ) + +ecm_generate_headers(MimeTreeParser_Camelcaseinterfaces_HEADERS + HEADER_NAMES + BodyPartFormatter + BodyPart + HtmlWriter + MessagePartRenderer + ObjectTreeSource + REQUIRED_HEADERS MimeTreeParser_interfaces_HEADERS + PREFIX MimeTreeParser + RELATIVE interfaces + ) + +ecm_generate_headers(MimeTreeParser_Camelcasehtmlwriter_HEADERS + HEADER_NAMES + FileHtmlWriter + QueueHtmlWriter + REQUIRED_HEADERS MimeTreeParser_htmlwriter_HEADERS + PREFIX MimeTreeParser + RELATIVE htmlwriter + ) + +ecm_generate_headers(MimeTreeParser_Camelcasetemporaryfile_HEADERS + HEADER_NAMES + AttachmentTemporaryFilesDirs + REQUIRED_HEADERS MimeTreeParser_temporaryfile_HEADERS + PREFIX MimeTreeParser + RELATIVE temporaryfile + ) + +install(FILES + ${MimeTreeParser_Camelcasehtmlwriter_HEADERS} + ${MimeTreeParser_Camelcaseutils_HEADERS} + ${MimeTreeParser_Camelcaseinterfaces_HEADERS} + ${MimeTreeParser_Camelcaseviewer_HEADERS} + ${MimeTreeParser_Camelcasetemporaryfile_HEADERS} + DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/MimeTreeParser + COMPONENT Devel + ) + +install(FILES + ${MimeTreeParser_htmlwriter_HEADERS} + ${MimeTreeParser_utils_HEADERS} + ${MimeTreeParser_interfaces_HEADERS} + ${MimeTreeParser_viewer_HEADERS} + ${MimeTreeParser_temporaryfile_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/mimetreeparser_export.h + ${CMAKE_CURRENT_BINARY_DIR}/mimetreeparser_debug.h + + DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/mimetreeparser + COMPONENT Devel + ) + +ecm_generate_pri_file(BASE_NAME MimeTreeParser + LIB_NAME KF5MimeTreeParser + FILENAME_VAR PRI_FILENAME INCLUDE_INSTALL_DIR ${KDE_INSTALL_INCLUDEDIR_KF5}/MimeTreeParser + ) + +install(FILES + ${PRI_FILENAME} + DESTINATION ${ECM_MKSPECS_INSTALL_DIR} + ) + +set(libmimetreeparser_SRCS + ${libmimetreeparser_main_SRCS} + ${libmimetreeparser_extra_SRCS} + ${mimetreeparser_temporaryfile_SRCS} + ) + +ecm_qt_declare_logging_category(libmimetreeparser_SRCS HEADER mimetreeparser_debug.h IDENTIFIER MIMETREEPARSER_LOG CATEGORY_NAME org.kde.pim.mimetreeparser) + +add_library(KF5MimeTreeParser + ${libmimetreeparser_SRCS} + ) + +generate_export_header(KF5MimeTreeParser BASE_NAME mimetreeparser) +add_library(KF5::MimeTreeParser ALIAS KF5MimeTreeParser) + +set(mimetreeparser_LINK_LIBRARIES + QGpgme + KF5::Codecs + KF5::I18n + KF5::Mime + Qt5::Gui + ) + +if (${QGpgme_VERSION} VERSION_LESS "1.7.2" OR NOT ${MIMETREEPARSER_ONLY_BUILD}) + set(mimetreeparser_LINK_LIBRARIES + KF5::Libkleo + ${mimetreeparser_LINK_LIBRARIES} + ) +endif() + +target_link_libraries(KF5MimeTreeParser + PRIVATE + ${mimetreeparser_LINK_LIBRARIES} + ) + +install(TARGETS + KF5MimeTreeParser + EXPORT KF5MimeTreeParserTargets ${KF5_INSTALL_TARGETS_DEFAULT_ARGS} ${LIBRARY_NAMELINK} + ) + +set_target_properties(KF5MimeTreeParser PROPERTIES + VERSION ${MIMETREEPARSER_VERSION_STRING} + SOVERSION ${MIMETREEPARSER_SOVERSION} + EXPORT_NAME MimeTreeParser + ) + +target_include_directories(KF5MimeTreeParser INTERFACE "$") +target_include_directories(KF5MimeTreeParser PUBLIC "$") diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/htmlwriter/filehtmlwriter.cpp kf5-messagelib-16.12.3/mimetreeparser/src/htmlwriter/filehtmlwriter.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/htmlwriter/filehtmlwriter.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/htmlwriter/filehtmlwriter.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,119 @@ +/* -*- c++ -*- + filehtmlwriter.cpp + + This file is part of KMail, the KDE mail client. + Copyright (c) 2003 Marc Mutz + + KMail is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#include "filehtmlwriter.h" + +#include "mimetreeparser_debug.h" + +namespace MimeTreeParser +{ + +FileHtmlWriter::FileHtmlWriter(const QString &filename) + : HtmlWriter(), + mFile(filename.isEmpty() ? QStringLiteral("filehtmlwriter.out") : filename) +{ +} + +FileHtmlWriter::~FileHtmlWriter() +{ + if (mFile.isOpen()) { + qCWarning(MIMETREEPARSER_LOG) << "FileHtmlWriter: file still open!"; + mStream.setDevice(0); + mFile.close(); + } +} + +void FileHtmlWriter::begin(const QString &css) +{ + openOrWarn(); + if (!css.isEmpty()) { + write(QLatin1String("\n")); + } +} + +void FileHtmlWriter::end() +{ + flush(); + mStream.setDevice(0); + mFile.close(); +} + +void FileHtmlWriter::reset() +{ + if (mFile.isOpen()) { + mStream.setDevice(0); + mFile.close(); + } +} + +void FileHtmlWriter::write(const QString &str) +{ + mStream << str; + flush(); +} + +void FileHtmlWriter::queue(const QString &str) +{ + write(str); +} + +void FileHtmlWriter::flush() +{ + mStream.flush(); + mFile.flush(); +} + +void FileHtmlWriter::openOrWarn() +{ + if (mFile.isOpen()) { + qCWarning(MIMETREEPARSER_LOG) << "FileHtmlWriter: file still open!"; + mStream.setDevice(0); + mFile.close(); + } + if (!mFile.open(QIODevice::WriteOnly)) { + qCWarning(MIMETREEPARSER_LOG) << "FileHtmlWriter: Cannot open file" << mFile.fileName(); + } else { + mStream.setDevice(&mFile); + mStream.setCodec("UTF-8"); + } +} + +void FileHtmlWriter::embedPart(const QByteArray &contentId, const QString &url) +{ + mStream << "" << endl; + flush(); +} +void FileHtmlWriter::extraHead(const QString &) +{ + +} + +} // diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/htmlwriter/filehtmlwriter.h kf5-messagelib-16.12.3/mimetreeparser/src/htmlwriter/filehtmlwriter.h --- kf5-messagelib-16.04.3/mimetreeparser/src/htmlwriter/filehtmlwriter.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/htmlwriter/filehtmlwriter.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,70 @@ +/* -*- c++ -*- + filehtmlwriter.h + + This file is part of KMail, the KDE mail client. + Copyright (c) 2003 Marc Mutz + + KMail is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#ifndef __MIMETREEPARSER_FILEHTMLWRITER_H__ +#define __MIMETREEPARSER_FILEHTMLWRITER_H__ + +#include "mimetreeparser_export.h" +#include "mimetreeparser/htmlwriter.h" + +#include +#include + +class QString; + +namespace MimeTreeParser +{ + +class MIMETREEPARSER_EXPORT FileHtmlWriter : public HtmlWriter +{ +public: + explicit FileHtmlWriter(const QString &filename); + virtual ~FileHtmlWriter(); + + void begin(const QString &cssDefs) Q_DECL_OVERRIDE; + void end() Q_DECL_OVERRIDE; + void reset() Q_DECL_OVERRIDE; + void write(const QString &str) Q_DECL_OVERRIDE; + void queue(const QString &str) Q_DECL_OVERRIDE; + void flush() Q_DECL_OVERRIDE; + void embedPart(const QByteArray &contentId, const QString &url) Q_DECL_OVERRIDE; + void extraHead(const QString &str) Q_DECL_OVERRIDE; +private: + void openOrWarn(); + +private: + QFile mFile; + QTextStream mStream; +}; + +} // namespace MimeTreeParser + +#endif // __MIMETREEPARSER_FILEHTMLWRITER_H__ diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/htmlwriter/queuehtmlwriter.cpp kf5-messagelib-16.12.3/mimetreeparser/src/htmlwriter/queuehtmlwriter.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/htmlwriter/queuehtmlwriter.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/htmlwriter/queuehtmlwriter.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,136 @@ +/* + Copyright (c) 2015 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "queuehtmlwriter.h" + +#include "mimetreeparser_debug.h" + +#include +#include + +using namespace MimeTreeParser; + +QueueHtmlWriter::QueueHtmlWriter(HtmlWriter *base) + : HtmlWriter() + , mBase(base) +{ +} + +QueueHtmlWriter::~QueueHtmlWriter() +{ +} + +void QueueHtmlWriter::setBase(HtmlWriter *base) +{ + mBase = base; +} + +void QueueHtmlWriter::begin(const QString &css) +{ + Command cmd; + cmd.type = Command::Begin; + cmd.s = css; + mQueue.append(cmd); +} + +void QueueHtmlWriter::end() +{ + Command cmd; + cmd.type = Command::End; + mQueue.append(cmd); +} + +void QueueHtmlWriter::reset() +{ + Command cmd; + cmd.type = Command::Reset; + mQueue.append(cmd); +} + +void QueueHtmlWriter::write(const QString &str) +{ + Command cmd; + cmd.type = Command::Write; + cmd.s = str; + mQueue.append(cmd); +} + +void QueueHtmlWriter::queue(const QString &str) +{ + Command cmd; + cmd.type = Command::Queue; + cmd.s = str; + mQueue.append(cmd); +} + +void QueueHtmlWriter::flush() +{ + Command cmd; + cmd.type = Command::Flush; + mQueue.append(cmd); +} + +void QueueHtmlWriter::replay() +{ + foreach (auto entry, mQueue) { + switch (entry.type) { + case Command::Begin: + mBase->begin(entry.s); + break; + case Command::End: + mBase->end(); + break; + case Command::Reset: + mBase->reset(); + break; + case Command::Write: + mBase->write(entry.s); + break; + case Command::Queue: + mBase->queue(entry.s); + break; + case Command::Flush: + mBase->flush(); + break; + case Command::EmbedPart: + mBase->embedPart(entry.b, entry.s); + break; + case Command::ExtraHead: + mBase->extraHead(entry.s); + break; + } + } +} + +void QueueHtmlWriter::embedPart(const QByteArray &contentId, const QString &url) +{ + Command cmd; + cmd.type = Command::EmbedPart; + cmd.s = url; + cmd.b = contentId; + mQueue.append(cmd); +} +void QueueHtmlWriter::extraHead(const QString &extra) +{ + Command cmd; + cmd.type = Command::ExtraHead; + cmd.s = extra; + mQueue.append(cmd); +} + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/htmlwriter/queuehtmlwriter.h kf5-messagelib-16.12.3/mimetreeparser/src/htmlwriter/queuehtmlwriter.h --- kf5-messagelib-16.04.3/mimetreeparser/src/htmlwriter/queuehtmlwriter.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/htmlwriter/queuehtmlwriter.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,76 @@ +/* + Copyright (c) 2015 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_QUEUEHTMLWRITER_H__ +#define __MIMETREEPARSER_QUEUEHTMLWRITER_H__ + +#include "mimetreeparser_export.h" +#include "mimetreeparser/htmlwriter.h" + +#include +#include + +class QString; +class QByteArray; + +namespace MimeTreeParser +{ +/** +\brief Cache HTML output and not write them directy. + +This class is needed to make it possible to first process the mime tree and +afterwards render the HTML. + +Please do not use this class - it is only added to make it possible to slowly +move ObjectTreeParser to a process fist / render later. + +*/ +struct Command { + enum { Begin, End, Reset, Write, Queue, Flush, EmbedPart, ExtraHead } type; + QString s; + QByteArray b; +}; + +class MIMETREEPARSER_DEPRECATED_EXPORT QueueHtmlWriter : public HtmlWriter +{ +public: + explicit QueueHtmlWriter(MimeTreeParser::HtmlWriter *base); + virtual ~QueueHtmlWriter(); + + void setBase(HtmlWriter *base); + + void begin(const QString &cssDefs) Q_DECL_OVERRIDE; + void end() Q_DECL_OVERRIDE; + void reset() Q_DECL_OVERRIDE; + void write(const QString &str) Q_DECL_OVERRIDE; + void queue(const QString &str) Q_DECL_OVERRIDE; + void flush() Q_DECL_OVERRIDE; + void embedPart(const QByteArray &contentId, const QString &url) Q_DECL_OVERRIDE; + void extraHead(const QString &str) Q_DECL_OVERRIDE; + + void replay(); + +private: + HtmlWriter *mBase; + QVector mQueue; +}; + +} // namespace MimeTreeParser + +#endif // __MIMETREEPARSER_QUEUEHTMLWRITER_H__ diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/bodypart.cpp kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/bodypart.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/bodypart.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/bodypart.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,41 @@ +/* + This file is part of KMail's plugin interface. + Copyright (c) 2004 Marc Mutz , + Ingo Kloecker + + KMail 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. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#include "bodypart.h" + +MimeTreeParser::Interface::BodyPartMemento::~BodyPartMemento() +{ +} + +MimeTreeParser::Interface::BodyPart::~BodyPart() +{ +} + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/bodypartformatter.cpp kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/bodypartformatter.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/bodypartformatter.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/bodypartformatter.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,147 @@ +/* -*- mode: C++; c-file-style: "gnu" -*- + bodypartformatter.cpp + + This file is part of KMail's plugin interface. + Copyright (c) 2016 Sandro Knauß + + KMail 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. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#include "bodypartformatter.h" + +#include "bodypart.h" +#include "htmlwriter/queuehtmlwriter.h" +#include "viewer/objecttreeparser.h" + +using namespace MimeTreeParser::Interface; + +namespace MimeTreeParser +{ +namespace Interface +{ + +class MessagePartPrivate +{ +public: + MessagePartPrivate(const BodyPart *part) + : mHtmlWriter(Q_NULLPTR) + , mPart(part) + , mParentPart(Q_NULLPTR) + , mCreatedWriter(false) + { + } + + ~MessagePartPrivate() + { + if (mCreatedWriter) { + delete mHtmlWriter; + } + } + + MimeTreeParser::HtmlWriter *htmlWriter() + { + if (!mHtmlWriter && mPart) { + mHtmlWriter = mPart->objectTreeParser()->htmlWriter(); + } + return mHtmlWriter; + } + + MimeTreeParser::HtmlWriter *mHtmlWriter; + const BodyPart *mPart; + MessagePart *mParentPart; + bool mCreatedWriter; + +}; +} +} + +MessagePart::MessagePart() + : QObject() + , d(new MessagePartPrivate(Q_NULLPTR)) +{ +} + +MessagePart::MessagePart(const BodyPart &part) + : QObject() + , d(new MessagePartPrivate(&part)) +{ +} + +MessagePart::~MessagePart() +{ + delete d; +} + +void MessagePart::html(bool decorate) +{ + Q_UNUSED(decorate); + static_cast(d->mHtmlWriter)->replay(); +} + +QString MessagePart::text() const +{ + return QString(); +} + +MessagePart *MessagePart::parentPart() const +{ + return d->mParentPart; +} + +void MessagePart::setParentPart(MessagePart *parentPart) +{ + d->mParentPart = parentPart; +} + +QString MessagePart::htmlContent() const +{ + return text(); +} + +QString MessagePart::plaintextContent() const +{ + return text(); +} + +MimeTreeParser::HtmlWriter *MessagePart::htmlWriter() const +{ + return d->htmlWriter(); +} + +void MessagePart::setHtmlWriter(MimeTreeParser::HtmlWriter *htmlWriter) const +{ + if (d->mHtmlWriter) { + d->mHtmlWriter = htmlWriter; + } +} + +MessagePart::Ptr BodyPartFormatter::process(BodyPart &part) const +{ + auto mp = MessagePart::Ptr(new MessagePart(part)); + mp->setHtmlWriter(new QueueHtmlWriter(mp->htmlWriter())); + mp->d->mCreatedWriter = true; + return mp; +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/bodypartformatter.h kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/bodypartformatter.h --- kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/bodypartformatter.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/bodypartformatter.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,151 @@ +/* -*- mode: C++; c-file-style: "gnu" -*- + bodypartformatter.h + + This file is part of KMail's plugin interface. + Copyright (c) 2004 Marc Mutz , + Ingo Kloecker + + KMail 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. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#ifndef __MIMETREEPARSER_INTERFACE_BODYPARTFORMATTER_H__ +#define __MIMETREEPARSER_INTERFACE_BODYPARTFORMATTER_H__ + +#include "mimetreeparser_export.h" + +#include +#include + +#include "mimetreeparser/objecttreeparser.h" + +namespace MimeTreeParser +{ +class HtmlWriter; + +namespace Interface +{ + +class BodyPartURLHandler; +class BodyPart; +class MessagePartPrivate; + +class MIMETREEPARSER_EXPORT MessagePart : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString plaintextContent READ plaintextContent) + Q_PROPERTY(QString htmlContent READ htmlContent) +public: + typedef QSharedPointer Ptr; + explicit MessagePart(); + explicit MessagePart(const BodyPart &part); + virtual ~MessagePart(); + + virtual void html(bool decorate); + virtual QString text() const; + + void setParentPart(MessagePart *parentPart); + MessagePart *parentPart() const; + + virtual QString plaintextContent() const; + virtual QString htmlContent() const; + + virtual MimeTreeParser::HtmlWriter *htmlWriter() const; + virtual void setHtmlWriter(MimeTreeParser::HtmlWriter *htmlWriter) const; +private: + MessagePartPrivate *d; + + friend class BodyPartFormatter; +}; + +class MIMETREEPARSER_EXPORT BodyPartFormatter +{ +public: + virtual ~BodyPartFormatter() {} + + /** + @li Ok returned when format() generated some HTML + @li NeedContent returned when format() needs the body of the part + @li AsIcon returned when the part should be shown iconified + @li Failed returned when formatting failed. Currently equivalent to Ok + */ + enum Result { Ok, NeedContent, AsIcon, Failed }; + + /** + Format body part \a part by generating some HTML and writing + that to \a writer. + + @return the result code (see above) + */ + virtual Result format(BodyPart *part, MimeTreeParser::HtmlWriter *writer) const = 0; + + /** + Variant of format that allows implementors to hook notifications up to + a listener interested in the result, for async operations. + + @return the result code (see above) + */ + virtual Result format(BodyPart *part, MimeTreeParser::HtmlWriter *writer, QObject *asyncResultObserver) const + { + Q_UNUSED(asyncResultObserver); + return format(part, writer); + } + + virtual void adaptProcessResult(ProcessResult &result) const + { + Q_UNUSED(result); + } + virtual MessagePart::Ptr process(BodyPart &part) const; +}; + +/** + @short interface for BodyPartFormatter plugins + + The interface is queried by for types, subtypes, and the + corresponding bodypart formatter, and the result inserted into + the bodypart formatter factory. + + Subtype alone or both type and subtype may be "*", which is + taken as a wildcard, so that e.g. type=text subtype=* matches + any text subtype, but with lesser specificity than a concrete + mimetype such as text/plain. type=* is only allowed when + subtype=*, too. +*/ +class BodyPartFormatterPlugin +{ +public: + virtual ~BodyPartFormatterPlugin() {} + + virtual const BodyPartFormatter *bodyPartFormatter(int idx) const = 0; + virtual const char *type(int idx) const = 0; + virtual const char *subtype(int idx) const = 0; + + virtual const BodyPartURLHandler *urlHandler(int idx) const = 0; +}; + +} // namespace Interface + +} +#endif // __MIMETREEPARSER_INTERFACE_BODYPARTFORMATTER_H__ diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/bodypart.h kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/bodypart.h --- kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/bodypart.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/bodypart.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,211 @@ +/* -*- mode: C++; c-file-style: "gnu" -*- + bodypart.h + + This file is part of KMail's plugin interface. + Copyright (c) 2004 Marc Mutz , + Ingo Kloecker + + KMail 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. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#ifndef __MIMETREEPARSER_INTERFACES_BODYPART_H__ +#define __MIMETREEPARSER_INTERFACES_BODYPART_H__ + +#include "mimetreeparser_export.h" + +#include +#include + +namespace KMime +{ +class Content; +} + +namespace MimeTreeParser +{ +class NodeHelper; +class ObjectTreeParser; +class ProcessResult; + +namespace Interface +{ + +class ObjectTreeSource; + +/*FIXME(Andras) review, port + class Observer; + class Observable; +*/ +/** + @short interface of classes that implement status for BodyPartFormatters. +*/ +class MIMETREEPARSER_EXPORT BodyPartMemento +{ +public: + virtual ~BodyPartMemento(); + + virtual void detach() = 0; +#if 0 +//FIXME(Andras) review, port + /** If your BodyPartMemento implementation also implements the + Observer interface, simply implement these as + return this;, else as return + 0;. This is needed to avoid forcing a dependency of + plugins on internal KMail classes. + */ + virtual Observer *asObserver() = 0; + + /** If your BodyPartMemento implementation also implements the + Observable interface, simply implement these as + return this;, else as return + 0;. This is needed to avoid forcing a dependency of + plugins on internal KMail classes. + */ + virtual Observable *asObservable() = 0; +#endif +}; + +/** + @short interface of message body parts. +*/ +class MIMETREEPARSER_EXPORT BodyPart +{ +public: + virtual ~BodyPart(); + + /** + @return a string respresentation of an URL that can be used + to invoke a BodyPartURLHandler for this body part. + */ + virtual QString makeLink(const QString &path) const = 0; + + /** + @return the decoded (CTE, canonicalisation, and charset + encoding undone) text contained in the body part, or + QString(), it the body part is not of type "text". + */ + virtual QString asText() const = 0; + + /** + @return the decoded (CTE undone) content of the body part, or + a null array if this body part instance is of type text. + */ + virtual QByteArray asBinary() const = 0; + + /** + @return the value of the content-type header field parameter + with name \a parameter, or QString(), if that that + parameter is not present in the body's content-type header + field. RFC 2231 encoding is removed first. + + Note that this method will suppress queries to certain + standard parameters (most notably "charset") to keep plugins + decent. + + Note2 that this method preserves the case of the parameter + value returned. So, if the parameter you want to use defines + the value to be case-insensitive (such as the smime-type + parameter), you need to make sure you do the casemap yourself + before comparing to a reference value. + */ + virtual QString contentTypeParameter(const char *parameter) const = 0; + + /** + @return the content of the content-description header field, + or QString() if that header is not present in this body + part. RFC 2047 encoding is decoded first. + */ + virtual QString contentDescription() const = 0; + + //virtual int contentDisposition() const = 0; + /** + @return the value of the content-disposition header field + parameter with name \a parameter, or QString() if that + parameter is not present in the body's content-disposition + header field. RFC 2231 encoding is removed first. + + The notes made for contentTypeParameter() above apply here as + well. + */ + virtual QString contentDispositionParameter(const char *parameter) const = 0; + + /** + @return whether this part already has it's complete body + fetched e.g. from an IMAP server. + */ + virtual bool hasCompleteBody() const = 0; + + /** + @return the BodyPartMemento set for this part, or null, if + none is set. + */ + virtual BodyPartMemento *memento() const = 0; + + /** + @return register an implementation of the BodyPartMemento + interface as a status object with this part. + */ + virtual void setBodyPartMemento(BodyPartMemento *) = 0; + + enum Display { None, AsIcon, Inline }; + /** + @return whether this body part should be displayed iconic or inline + */ + virtual Display defaultDisplay() const = 0; + + /** Returns the KMime::Content node represented here. Makes most of the above obsolete + and probably should be used in the interfaces in the first place. + */ + virtual KMime::Content *content() const = 0; + + /** + * Returns the top-level content. + * Note that this is _not_ necessarily the same as content()->topLevel(), for example the later + * will not work for "extra nodes", i.e. nodes in encrypted parts of the mail. + * topLevelContent() will return the correct result in this case. Also note that + * topLevelContent() + */ + virtual KMime::Content *topLevelContent() const = 0; + + /** + * Ok, this is ugly, exposing the node helper here, but there is too much useful stuff in there + * for real-world plugins. Still, there should be a nicer way for this. + */ + virtual MimeTreeParser::NodeHelper *nodeHelper() const = 0; + + /** + * For making it easier to refactor, add objectTreeParser + */ + virtual MimeTreeParser::ObjectTreeParser *objectTreeParser() const = 0; + virtual MimeTreeParser::Interface::ObjectTreeSource *source() const = 0; + virtual MimeTreeParser::ProcessResult *processResult() const = 0; +}; + +} // namespace Interface + +} + +#endif // __MIMETREEPARSER_INTERFACES_BODYPART_H__ diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/htmlwriter.cpp kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/htmlwriter.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/htmlwriter.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/htmlwriter.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,40 @@ +/* + This file is part of KMail's plugin interface. + Copyright (c) 2003 Marc Mutz + + KMail 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. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#include "htmlwriter.h" + +MimeTreeParser::Interface::HtmlWriter::~HtmlWriter() +{ +} + +MimeTreeParser::HtmlWriter::~HtmlWriter() +{ +} + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/htmlwriter.h kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/htmlwriter.h --- kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/htmlwriter.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/htmlwriter.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,127 @@ +/* -*- c++ -*- + interfaces/htmlwriter.h + + This file is part of KMail's plugin interface. + Copyright (c) 2003 Marc Mutz + + KMail 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. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#ifndef __MIMETREEPARSER_INTERFACES_HTMLWRITER_H__ +#define __MIMETREEPARSER_INTERFACES_HTMLWRITER_H__ + +#include "mimetreeparser_export.h" + +class QByteArray; +class QString; + +namespace MimeTreeParser +{ +/** + * @short An interface for HTML sinks. + * @author Marc Mutz + * + */ +namespace Interface +{ +class MIMETREEPARSER_EXPORT HtmlWriter +{ +public: + virtual ~HtmlWriter(); + + /** Signal the begin of stuff to write, and give the CSS definitions */ + virtual void begin(const QString &cssDefinitions) = 0; + /** Write out a chunk of text. No HTML escaping is performed. */ + virtual void write(const QString &html) = 0; + /** Signal the end of stuff to write. */ + virtual void end() = 0; +}; +} + +/** + * @short An interface to HTML sinks + * @author Marc Mutz + * + * @deprecated KMail should be ported to Interface::HtmlWriter. This + * interface exposes internal working models. The queuing + * vs. writing() issues exposed here should be hidden by using two + * different implementations of KHTMLPartHtmlWriter: one for + * queuing, and one for writing. This should be fixed before the + * release, so we an keep the plugin interface stable. + * + * Operate this interface in one and only one of the following two + * modes: + * + * @section Sync Mode + * + * In sync mode, use #begin() to initiate a session, then + * #write() some chunks of HTML code and finally #end() the session. + * + * @section Async Mode + * + * In async mode, use #begin() to initialize a session, then + * #queue() some chunks of HTML code and finally end the + * session by calling #flush(). + * + * Queued HTML code is fed to the html sink using a timer. For this + * to work, control must return to the event loop so timer events + * are delivered. + * + * @section Combined mode + * + * You may combine the two modes in the following way only. Any + * number of #write() calls can precede #queue() calls, + * but once a chunk has been queued, you @em must @em not + * #write() more data, only #queue() it. + * + * Naturally, whenever you queued data in a given session, that + * session must be ended by calling #flush(), not #end(). + */ +class MIMETREEPARSER_EXPORT HtmlWriter : public Interface::HtmlWriter +{ +public: + virtual ~HtmlWriter(); + + /** Stop all possibly pending processing in order to be able to + * call #begin() again. */ + virtual void reset() = 0; + + virtual void queue(const QString &str) = 0; + /** (Start) flushing internal buffers, if any. */ + virtual void flush() = 0; + + /** + * Embed a part with Content-ID @p contentId, using url @p url. + */ + virtual void embedPart(const QByteArray &contentId, const QString &url) = 0; + + virtual void extraHead(const QString &str) = 0; +}; + +} + +#endif // __MIMETREEPARSER_INTERFACES_HTMLWRITER_H__ + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/messagepartrenderer.cpp kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/messagepartrenderer.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/messagepartrenderer.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/messagepartrenderer.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,23 @@ +/* + Copyright (C) 2016 Sandro Knauß + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "messagepartrenderer.h" + +MimeTreeParser::Interface::MessagePartRenderer::~MessagePartRenderer() +{ +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/messagepartrenderer.h kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/messagepartrenderer.h --- kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/messagepartrenderer.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/messagepartrenderer.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,45 @@ +/* + Copyright (C) 2016 Sandro Knauß + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_MESSAGEPARTRENDERER_IF_H__ +#define __MIMETREEPARSER_MESSAGEPARTRENDERER_IF_H__ + +#include "mimetreeparser_export.h" + +#include + +namespace MimeTreeParser +{ +namespace Interface +{ +/** +* Interface for rendering messageparts to html. +* @author Andras Mantia +*/ +class MIMETREEPARSER_EXPORT MessagePartRenderer +{ +public: + typedef QSharedPointer Ptr; + + virtual ~MessagePartRenderer(); + + virtual QString html() const = 0; +}; +} +} +#endif \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/objecttreesource.cpp kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/objecttreesource.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/objecttreesource.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/objecttreesource.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,28 @@ +/* + Copyright (C) 2009 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.net + Copyright (c) 2009 Andras Mantia + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "objecttreesource.h" +#include "bodypartformatter.h" +#include "viewer/messagepart.h" + +using namespace MimeTreeParser; + +Interface::ObjectTreeSource::~ObjectTreeSource() +{ +} \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/objecttreesource.h kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/objecttreesource.h --- kf5-messagelib-16.04.3/mimetreeparser/src/interfaces/objecttreesource.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/interfaces/objecttreesource.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,110 @@ +/* + Copyright (C) 2009 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.net + Copyright (c) 2009 Andras Mantia + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_OBJECTTREESOURCE_IF_H__ +#define __MIMETREEPARSER_OBJECTTREESOURCE_IF_H__ + +#include "mimetreeparser_export.h" +#include + +#include + +#include +class QTextCodec; + +namespace MimeTreeParser +{ +class HtmlWriter; +class AttachmentStrategy; +class BodyPartFormatterBaseFactory; +namespace Interface +{ +class MessagePart; +typedef QSharedPointer MessagePartPtr; +class MessagePartRenderer; +typedef QSharedPointer MessagePartRendererPtr; +} +} + +namespace MimeTreeParser +{ +namespace Interface +{ + +/** + * Interface for object tree sources. + * @author Andras Mantia + */ +class MIMETREEPARSER_EXPORT ObjectTreeSource +{ + +public: + virtual ~ObjectTreeSource(); + + /** + * Sets the type of mail that is currently displayed. Applications can display this + * information to the user, for example KMail displays a HTML status bar. + * Note: This is not called when the mode is "Normal". + */ + virtual void setHtmlMode(MimeTreeParser::Util::HtmlMode mode, const QList &availableModes) = 0; + + /** Return the mode that is the preferred to display */ + virtual MimeTreeParser::Util::HtmlMode preferredMode() const = 0; + + /** Return true if an encrypted mail should be decrypted */ + virtual bool decryptMessage() const = 0; + + /** Return true if external sources should be loaded in a html mail */ + virtual bool htmlLoadExternal() const = 0; + + /** Return true to include the signature details in the generated html */ + virtual bool showSignatureDetails() const = 0; + + virtual int levelQuote() const = 0; + + /** The override codec that should be used for the mail */ + virtual const QTextCodec *overrideCodec() = 0; + + virtual QString createMessageHeader(KMime::Message *message) = 0; + + /** Return the wanted attachment startegy */ + virtual const AttachmentStrategy *attachmentStrategy() = 0; + + /** Return the html write object */ + virtual HtmlWriter *htmlWriter() = 0; + + /** The source object behind the interface. */ + virtual QObject *sourceObject() = 0; + + /** should keys be imported automatically **/ + virtual bool autoImportKeys() const = 0; + + virtual bool showEmoticons() const = 0; + + virtual bool showExpandQuotesMark() const = 0; + + virtual const BodyPartFormatterBaseFactory *bodyPartFormatterFactory() = 0; + + virtual MessagePartRendererPtr messagePartTheme(MessagePartPtr msgPart) = 0; + + virtual bool isPrinting() const = 0; +}; +} +} +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/job/qgpgmejobexecutor.cpp kf5-messagelib-16.12.3/mimetreeparser/src/job/qgpgmejobexecutor.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/job/qgpgmejobexecutor.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/job/qgpgmejobexecutor.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,158 @@ +/* + Copyright (c) 2008 Volker Krause + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "qgpgmejobexecutor.h" +#include "mimetreeparser_debug.h" + +#include +#include +#include +#include + +#include + +#include + +using namespace GpgME; +using namespace MimeTreeParser; + +QGpgMEJobExecutor::QGpgMEJobExecutor(QObject *parent) : QObject(parent) +{ + setObjectName(QStringLiteral("KleoJobExecutor")); + mEventLoop = new QEventLoop(this); +} + +GpgME::VerificationResult QGpgMEJobExecutor::exec( + QGpgME::VerifyDetachedJob *job, + const QByteArray &signature, + const QByteArray &signedData) +{ + qCDebug(MIMETREEPARSER_LOG) << "Starting detached verification job"; + connect(job, SIGNAL(result(GpgME::VerificationResult)), SLOT(verificationResult(GpgME::VerificationResult))); + GpgME::Error err = job->start(signature, signedData); + if (err) { + return VerificationResult(err); + } + mEventLoop->exec(QEventLoop::ExcludeUserInputEvents); + return mVerificationResult; +} + +GpgME::VerificationResult QGpgMEJobExecutor::exec( + QGpgME::VerifyOpaqueJob *job, + const QByteArray &signedData, + QByteArray &plainText) +{ + qCDebug(MIMETREEPARSER_LOG) << "Starting opaque verification job"; + connect(job, SIGNAL(result(GpgME::VerificationResult,QByteArray)), SLOT(verificationResult(GpgME::VerificationResult,QByteArray))); + GpgME::Error err = job->start(signedData); + if (err) { + plainText.clear(); + return VerificationResult(err); + } + mEventLoop->exec(QEventLoop::ExcludeUserInputEvents); + plainText = mData; + return mVerificationResult; +} + +std::pair< GpgME::DecryptionResult, GpgME::VerificationResult > QGpgMEJobExecutor::exec( + QGpgME::DecryptVerifyJob *job, + const QByteArray &cipherText, + QByteArray &plainText) +{ + qCDebug(MIMETREEPARSER_LOG) << "Starting decryption job"; + connect(job, &QGpgME::DecryptVerifyJob::result, this, &QGpgMEJobExecutor::decryptResult); + GpgME::Error err = job->start(cipherText); + if (err) { + plainText.clear(); + return std::make_pair(DecryptionResult(err), VerificationResult(err)); + } + mEventLoop->exec(QEventLoop::ExcludeUserInputEvents); + plainText = mData; + return std::make_pair(mDecryptResult, mVerificationResult); +} + +GpgME::ImportResult QGpgMEJobExecutor::exec(QGpgME::ImportJob *job, const QByteArray &certData) +{ + connect(job, SIGNAL(result(GpgME::ImportResult)), SLOT(importResult(GpgME::ImportResult))); + GpgME::Error err = job->start(certData); + if (err) { + return ImportResult(err); + } + mEventLoop->exec(QEventLoop::ExcludeUserInputEvents); + return mImportResult; +} + +Error QGpgMEJobExecutor::auditLogError() const +{ + return mAuditLogError; +} + +void QGpgMEJobExecutor::verificationResult(const GpgME::VerificationResult &result) +{ + qCDebug(MIMETREEPARSER_LOG) << "Detached verification job finished"; + QGpgME::Job *job = qobject_cast(sender()); + assert(job); + mVerificationResult = result; + mAuditLogError = job->auditLogError(); + mAuditLog = job->auditLogAsHtml(); + mEventLoop->quit(); +} + +void QGpgMEJobExecutor::verificationResult(const GpgME::VerificationResult &result, const QByteArray &plainText) +{ + qCDebug(MIMETREEPARSER_LOG) << "Opaque verification job finished"; + QGpgME::Job *job = qobject_cast(sender()); + assert(job); + mVerificationResult = result; + mData = plainText; + mAuditLogError = job->auditLogError(); + mAuditLog = job->auditLogAsHtml(); + mEventLoop->quit(); +} + +void QGpgMEJobExecutor::decryptResult( + const GpgME::DecryptionResult &decryptionresult, + const GpgME::VerificationResult &verificationresult, + const QByteArray &plainText) +{ + qCDebug(MIMETREEPARSER_LOG) << "Decryption job finished"; + QGpgME::Job *job = qobject_cast(sender()); + assert(job); + mVerificationResult = verificationresult; + mDecryptResult = decryptionresult; + mData = plainText; + mAuditLogError = job->auditLogError(); + mAuditLog = job->auditLogAsHtml(); + mEventLoop->quit(); +} + +void QGpgMEJobExecutor::importResult(const GpgME::ImportResult &result) +{ + QGpgME::Job *job = qobject_cast(sender()); + assert(job); + mImportResult = result; + mAuditLogError = job->auditLogError(); + mAuditLog = job->auditLogAsHtml(); + mEventLoop->quit(); +} + +QString QGpgMEJobExecutor::auditLogAsHtml() const +{ + return mAuditLog; +} + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/job/qgpgmejobexecutor.h kf5-messagelib-16.12.3/mimetreeparser/src/job/qgpgmejobexecutor.h --- kf5-messagelib-16.04.3/mimetreeparser/src/job/qgpgmejobexecutor.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/job/qgpgmejobexecutor.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,86 @@ +/* + Copyright (c) 2008 Volker Krause + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_KLEOJOBEXECUTOR_H__ +#define __MIMETREEPARSER_KLEOJOBEXECUTOR_H__ + +#include +#include +#include + +#include + +#include + +class QEventLoop; + +namespace QGpgME +{ +class DecryptVerifyJob; +class ImportJob; +class VerifyDetachedJob; +class VerifyOpaqueJob; +} + +namespace MimeTreeParser +{ + +/** + Helper class for synchronous execution of Kleo crypto jobs. +*/ +class QGpgMEJobExecutor : public QObject +{ + Q_OBJECT +public: + explicit QGpgMEJobExecutor(QObject *parent = Q_NULLPTR); + + GpgME::VerificationResult exec(QGpgME::VerifyDetachedJob *job, + const QByteArray &signature, + const QByteArray &signedData); + GpgME::VerificationResult exec(QGpgME::VerifyOpaqueJob *job, + const QByteArray &signedData, + QByteArray &plainText); + std::pair exec(QGpgME::DecryptVerifyJob *job, + const QByteArray &cipherText, + QByteArray &plainText); + GpgME::ImportResult exec(QGpgME::ImportJob *job, const QByteArray &certData); + + GpgME::Error auditLogError() const; + QString auditLogAsHtml() const; + +private Q_SLOTS: + void verificationResult(const GpgME::VerificationResult &result); + void verificationResult(const GpgME::VerificationResult &result, const QByteArray &plainText); + void decryptResult(const GpgME::DecryptionResult &decryptionresult, + const GpgME::VerificationResult &verificationresult, + const QByteArray &plainText); + void importResult(const GpgME::ImportResult &result); + +private: + QEventLoop *mEventLoop; + GpgME::VerificationResult mVerificationResult; + GpgME::DecryptionResult mDecryptResult; + GpgME::ImportResult mImportResult; + QByteArray mData; + GpgME::Error mAuditLogError; + QString mAuditLog; +}; + +} + +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/temporaryfile/attachmenttemporaryfilesdirs.cpp kf5-messagelib-16.12.3/mimetreeparser/src/temporaryfile/attachmenttemporaryfilesdirs.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/temporaryfile/attachmenttemporaryfilesdirs.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/temporaryfile/attachmenttemporaryfilesdirs.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,108 @@ +/* + Copyright (c) 2013-2016 Montel Laurent + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + +*/ + +#include "attachmenttemporaryfilesdirs.h" + +#include +#include +#include + +using namespace MimeTreeParser; + +class MimeTreeParser::AttachmentTemporaryFilesDirsPrivate +{ +public: + AttachmentTemporaryFilesDirsPrivate() + : mDelayRemoveAll(10000) + { + + } + QStringList mTempFiles; + QStringList mTempDirs; + int mDelayRemoveAll; +}; + +AttachmentTemporaryFilesDirs::AttachmentTemporaryFilesDirs(QObject *parent) + : QObject(parent), + d(new AttachmentTemporaryFilesDirsPrivate) +{ + +} + +AttachmentTemporaryFilesDirs::~AttachmentTemporaryFilesDirs() +{ + delete d; +} + +void AttachmentTemporaryFilesDirs::setDelayRemoveAllInMs(int ms) +{ + d->mDelayRemoveAll = (ms < 0) ? 0 : ms; +} + +void AttachmentTemporaryFilesDirs::removeTempFiles() +{ + QTimer::singleShot(d->mDelayRemoveAll, this, &AttachmentTemporaryFilesDirs::slotRemoveTempFiles); +} + +void AttachmentTemporaryFilesDirs::forceCleanTempFiles() +{ + QStringList::ConstIterator end = d->mTempFiles.constEnd(); + for (QStringList::ConstIterator it = d->mTempFiles.constBegin(); it != end; ++it) { + QFile::remove(*it); + } + d->mTempFiles.clear(); + end = d->mTempDirs.constEnd(); + for (QStringList::ConstIterator it = d->mTempDirs.constBegin(); it != end; ++it) { + QDir(*it).rmdir(*it); + } + d->mTempDirs.clear(); +} + +void AttachmentTemporaryFilesDirs::slotRemoveTempFiles() +{ + forceCleanTempFiles(); + //Delete it after cleaning + deleteLater(); +} + +void AttachmentTemporaryFilesDirs::addTempFile(const QString &file) +{ + if (!d->mTempFiles.contains(file)) { + d->mTempFiles.append(file); + } +} + +void AttachmentTemporaryFilesDirs::addTempDir(const QString &dir) +{ + if (!d->mTempDirs.contains(dir)) { + d->mTempDirs.append(dir); + } +} + +QStringList AttachmentTemporaryFilesDirs::temporaryFiles() const +{ + return d->mTempFiles; +} + +QStringList AttachmentTemporaryFilesDirs::temporaryDirs() const +{ + return d->mTempDirs; +} + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/temporaryfile/attachmenttemporaryfilesdirs.h kf5-messagelib-16.12.3/mimetreeparser/src/temporaryfile/attachmenttemporaryfilesdirs.h --- kf5-messagelib-16.04.3/mimetreeparser/src/temporaryfile/attachmenttemporaryfilesdirs.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/temporaryfile/attachmenttemporaryfilesdirs.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,58 @@ +/* + Copyright (c) 2013-2016 Montel Laurent + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + +*/ + +#ifndef ATTACHMENTTEMPORARYFILESDIRS_H +#define ATTACHMENTTEMPORARYFILESDIRS_H + +#include +#include +#include "mimetreeparser_export.h" + +namespace MimeTreeParser +{ +class AttachmentTemporaryFilesDirsPrivate; + +class MIMETREEPARSER_EXPORT AttachmentTemporaryFilesDirs : public QObject +{ + Q_OBJECT +public: + explicit AttachmentTemporaryFilesDirs(QObject *parent = Q_NULLPTR); + ~AttachmentTemporaryFilesDirs(); + + void addTempFile(const QString &file); + void addTempDir(const QString &dir); + QStringList temporaryFiles() const; + void removeTempFiles(); + void forceCleanTempFiles(); + + QStringList temporaryDirs() const; + + void setDelayRemoveAllInMs(int ms); + +private Q_SLOTS: + void slotRemoveTempFiles(); + +private: + AttachmentTemporaryFilesDirsPrivate *const d; +}; + +} + +#endif // ATTACHMENTTEMPORARYFILESDIRS_H diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/temporaryfile/autotests/attachmenttemporaryfilesdirstest.cpp kf5-messagelib-16.12.3/mimetreeparser/src/temporaryfile/autotests/attachmenttemporaryfilesdirstest.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/temporaryfile/autotests/attachmenttemporaryfilesdirstest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/temporaryfile/autotests/attachmenttemporaryfilesdirstest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,156 @@ +/* + Copyright (c) 2014-2016 Montel Laurent + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + +*/ + +#include "attachmenttemporaryfilesdirstest.h" +#include "../attachmenttemporaryfilesdirs.h" +#include +#include +#include + +using namespace MimeTreeParser; + +AttachmentTemporaryFilesDirsTest::AttachmentTemporaryFilesDirsTest(QObject *parent) + : QObject(parent) +{ + +} + +AttachmentTemporaryFilesDirsTest::~AttachmentTemporaryFilesDirsTest() +{ + +} + +void AttachmentTemporaryFilesDirsTest::shouldHaveDefaultValue() +{ + AttachmentTemporaryFilesDirs attachmentDir; + QVERIFY(attachmentDir.temporaryFiles().isEmpty()); + QVERIFY(attachmentDir.temporaryDirs().isEmpty()); +} + +void AttachmentTemporaryFilesDirsTest::shouldAddTemporaryFiles() +{ + AttachmentTemporaryFilesDirs attachmentDir; + attachmentDir.addTempFile(QStringLiteral("foo")); + QCOMPARE(attachmentDir.temporaryFiles().count(), 1); + attachmentDir.addTempFile(QStringLiteral("foo1")); + QCOMPARE(attachmentDir.temporaryFiles().count(), 2); +} + +void AttachmentTemporaryFilesDirsTest::shouldAddTemporaryDirs() +{ + AttachmentTemporaryFilesDirs attachmentDir; + attachmentDir.addTempDir(QStringLiteral("foo")); + QCOMPARE(attachmentDir.temporaryDirs().count(), 1); + attachmentDir.addTempDir(QStringLiteral("foo1")); + QCOMPARE(attachmentDir.temporaryDirs().count(), 2); +} + +void AttachmentTemporaryFilesDirsTest::shouldNotAddSameFiles() +{ + AttachmentTemporaryFilesDirs attachmentDir; + attachmentDir.addTempFile(QStringLiteral("foo")); + QCOMPARE(attachmentDir.temporaryFiles().count(), 1); + attachmentDir.addTempFile(QStringLiteral("foo")); + QCOMPARE(attachmentDir.temporaryFiles().count(), 1); +} + +void AttachmentTemporaryFilesDirsTest::shouldNotAddSameDirs() +{ + AttachmentTemporaryFilesDirs attachmentDir; + attachmentDir.addTempDir(QStringLiteral("foo")); + QCOMPARE(attachmentDir.temporaryDirs().count(), 1); + attachmentDir.addTempDir(QStringLiteral("foo")); + QCOMPARE(attachmentDir.temporaryDirs().count(), 1); +} + +void AttachmentTemporaryFilesDirsTest::shouldForceRemoveTemporaryDirs() +{ + AttachmentTemporaryFilesDirs attachmentDir; + attachmentDir.addTempDir(QStringLiteral("foo")); + attachmentDir.addTempDir(QStringLiteral("foo1")); + QCOMPARE(attachmentDir.temporaryDirs().count(), 2); + attachmentDir.forceCleanTempFiles(); + QCOMPARE(attachmentDir.temporaryDirs().count(), 0); + QCOMPARE(attachmentDir.temporaryFiles().count(), 0); +} + +void AttachmentTemporaryFilesDirsTest::shouldForceRemoveTemporaryFiles() +{ + AttachmentTemporaryFilesDirs attachmentDir; + attachmentDir.addTempFile(QStringLiteral("foo")); + attachmentDir.addTempFile(QStringLiteral("foo2")); + QCOMPARE(attachmentDir.temporaryFiles().count(), 2); + attachmentDir.forceCleanTempFiles(); + QCOMPARE(attachmentDir.temporaryFiles().count(), 0); + QCOMPARE(attachmentDir.temporaryDirs().count(), 0); +} + +void AttachmentTemporaryFilesDirsTest::shouldCreateDeleteTemporaryFiles() +{ + QTemporaryDir tmpDir; + QVERIFY(tmpDir.isValid()); + QFile file(tmpDir.path() + QStringLiteral("/foo")); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + qDebug() << "Can open file"; + return; + } + tmpDir.setAutoRemove(false); + file.close(); + QVERIFY(file.exists()); + AttachmentTemporaryFilesDirs attachmentDir; + attachmentDir.addTempDir(tmpDir.path()); + attachmentDir.addTempFile(file.fileName()); + QVERIFY(!attachmentDir.temporaryFiles().isEmpty()); + QCOMPARE(attachmentDir.temporaryFiles().first(), file.fileName()); + const QString path = tmpDir.path(); + attachmentDir.forceCleanTempFiles(); + QCOMPARE(attachmentDir.temporaryFiles().count(), 0); + QCOMPARE(attachmentDir.temporaryDirs().count(), 0); + QVERIFY(!QDir(path).exists()); +} + +void AttachmentTemporaryFilesDirsTest::shouldRemoveTemporaryFilesAfterTime() +{ + QTemporaryDir tmpDir; + QVERIFY(tmpDir.isValid()); + QFile file(tmpDir.path() + QStringLiteral("/foo")); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + qDebug() << "Can open file"; + return; + } + tmpDir.setAutoRemove(false); + file.close(); + QVERIFY(file.exists()); + AttachmentTemporaryFilesDirs attachmentDir; + attachmentDir.addTempDir(tmpDir.path()); + attachmentDir.addTempFile(file.fileName()); + QVERIFY(!attachmentDir.temporaryFiles().isEmpty()); + QCOMPARE(attachmentDir.temporaryFiles().first(), file.fileName()); + attachmentDir.setDelayRemoveAllInMs(500); + QTest::qSleep(1000); + attachmentDir.removeTempFiles(); + const QString path = tmpDir.path(); + attachmentDir.forceCleanTempFiles(); + QCOMPARE(attachmentDir.temporaryFiles().count(), 0); + QCOMPARE(attachmentDir.temporaryDirs().count(), 0); + QVERIFY(!QDir(path).exists()); +} + +QTEST_GUILESS_MAIN(AttachmentTemporaryFilesDirsTest) diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/temporaryfile/autotests/attachmenttemporaryfilesdirstest.h kf5-messagelib-16.12.3/mimetreeparser/src/temporaryfile/autotests/attachmenttemporaryfilesdirstest.h --- kf5-messagelib-16.04.3/mimetreeparser/src/temporaryfile/autotests/attachmenttemporaryfilesdirstest.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/temporaryfile/autotests/attachmenttemporaryfilesdirstest.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,44 @@ +/* + Copyright (c) 2014-2016 Montel Laurent + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + +*/ + +#ifndef ATTACHMENTTEMPORARYFILESDIRSTEST_H +#define ATTACHMENTTEMPORARYFILESDIRSTEST_H + +#include + +class AttachmentTemporaryFilesDirsTest : public QObject +{ + Q_OBJECT +public: + explicit AttachmentTemporaryFilesDirsTest(QObject *parent = Q_NULLPTR); + ~AttachmentTemporaryFilesDirsTest(); +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldAddTemporaryFiles(); + void shouldAddTemporaryDirs(); + void shouldNotAddSameFiles(); + void shouldNotAddSameDirs(); + void shouldForceRemoveTemporaryDirs(); + void shouldForceRemoveTemporaryFiles(); + void shouldCreateDeleteTemporaryFiles(); + void shouldRemoveTemporaryFilesAfterTime(); +}; + +#endif // ATTACHMENTTEMPORARYFILESDIRSTEST_H diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/temporaryfile/autotests/CMakeLists.txt kf5-messagelib-16.12.3/mimetreeparser/src/temporaryfile/autotests/CMakeLists.txt --- kf5-messagelib-16.04.3/mimetreeparser/src/temporaryfile/autotests/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/temporaryfile/autotests/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4 @@ +ecm_add_test(attachmenttemporaryfilesdirstest.cpp + NAME_PREFIX "mimeptreeparser-temporaryfile-" + LINK_LIBRARIES Qt5::Test KF5::MimeTreeParser +) diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/utils/util.cpp kf5-messagelib-16.12.3/mimetreeparser/src/utils/util.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/utils/util.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/utils/util.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,135 @@ +/* + Copyright (c) 2016 Sandro Knauß + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "util.h" + +#include "mimetreeparser_debug.h" + +#include "viewer/nodehelper.h" + +#include + +#include +#include + +using namespace MimeTreeParser::Util; + +bool MimeTreeParser::Util::isTypeBlacklisted(KMime::Content *node) +{ + bool typeBlacklisted = node->contentType()->mediaType().toLower() == "multipart"; + if (!typeBlacklisted) { + typeBlacklisted = KMime::isCryptoPart(node); + } + typeBlacklisted = typeBlacklisted || node == node->topLevel(); + const bool firstTextChildOfEncapsulatedMsg = + node->contentType()->mediaType().toLower() == "text" && + node->contentType()->subType().toLower() == "plain" && + node->parent() && node->parent()->contentType()->mediaType().toLower() == "message"; + return typeBlacklisted || firstTextChildOfEncapsulatedMsg; +} + +QString MimeTreeParser::Util::labelForContent(KMime::Content *node) +{ + const QString name = node->contentType()->name(); + QString label = name.isEmpty() ? NodeHelper::fileName(node) : name; + if (label.isEmpty()) { + label = node->contentDescription()->asUnicodeString(); + } + return label; +} + +QMimeType MimeTreeParser::Util::mimetype(const QString &name) +{ + QMimeDatabase db; + // consider the filename if mimetype cannot be found by content-type + auto mimeTypes = db.mimeTypesForFileName(name); + foreach (const auto &mt, mimeTypes) { + if (mt.name() != QLatin1String("application/octet-stream")) { + return mt; + } + } + + // consider the attachment's contents if neither the Content-Type header + // nor the filename give us a clue + return db.mimeTypeForFile(name); +} + +QString MimeTreeParser::Util::iconNameForMimetype(const QString &mimeType, + const QString &fallbackFileName1, + const QString &fallbackFileName2) +{ + QString fileName; + QString tMimeType = mimeType; + + // convert non-registered types to registered types + if (mimeType == QLatin1String("application/x-vnd.kolab.contact")) { + tMimeType = QStringLiteral("text/x-vcard"); + } else if (mimeType == QLatin1String("application/x-vnd.kolab.event")) { + tMimeType = QStringLiteral("application/x-vnd.akonadi.calendar.event"); + } else if (mimeType == QLatin1String("application/x-vnd.kolab.task")) { + tMimeType = QStringLiteral("application/x-vnd.akonadi.calendar.todo"); + } else if (mimeType == QLatin1String("application/x-vnd.kolab.journal")) { + tMimeType = QStringLiteral("application/x-vnd.akonadi.calendar.journal"); + } else if (mimeType == QLatin1String("application/x-vnd.kolab.note")) { + tMimeType = QStringLiteral("application/x-vnd.akonadi.note"); + } else if (mimeType == QLatin1String("image/jpg")) { + tMimeType = QStringLiteral("image/jpeg"); + } + QMimeDatabase mimeDb; + auto mime = mimeDb.mimeTypeForName(tMimeType); + if (mime.isValid()) { + fileName = mime.iconName(); + } else { + fileName = QStringLiteral("unknown"); + if (!tMimeType.isEmpty()) { + qCWarning(MIMETREEPARSER_LOG) << "unknown mimetype" << tMimeType; + } + } + //WorkAround for #199083 + if (fileName == QLatin1String("text-vcard")) { + fileName = QStringLiteral("text-x-vcard"); + } + + if (fileName.isEmpty()) { + fileName = fallbackFileName1; + if (fileName.isEmpty()) { + fileName = fallbackFileName2; + } + if (!fileName.isEmpty()) { + fileName = mimeDb.mimeTypeForFile(QLatin1String("/tmp/") + fileName).iconName(); + } + } + + return fileName; +} + +QString MimeTreeParser::Util::iconNameForContent(KMime::Content *node) +{ + if (!node) { + return QString(); + } + + QByteArray mimeType = node->contentType()->mimeType(); + if (mimeType.isNull() || mimeType == "application/octet-stream") { + const QString mime = mimetype(node->contentDisposition()->filename()).name(); + mimeType = mime.toLatin1(); + } + mimeType = mimeType.toLower(); + return iconNameForMimetype(QLatin1String(mimeType), node->contentDisposition()->filename(), + node->contentType()->name()); +} \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/utils/util.h kf5-messagelib-16.12.3/mimetreeparser/src/utils/util.h --- kf5-messagelib-16.04.3/mimetreeparser/src/utils/util.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/utils/util.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,69 @@ +/* + Copyright (c) 2016 Sandro Knauß + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_UTILS_UTIL_H__ +#define __MIMETREEPARSER_UTILS_UTIL_H__ + +#include "mimetreeparser_export.h" + +#include + +class QMimeType; + +namespace KMime +{ +class Content; +} + +namespace MimeTreeParser +{ + +/** + * The Util namespace contains a collection of helper functions use in + * various places. + */ +namespace Util +{ + +/** + * Describes the type of the displayed message. This depends on the MIME structure + * of the mail and on whether HTML mode is enabled (which is decided by htmlMail()) + */ +enum HtmlMode { + Normal, ///< A normal plaintext message, non-multipart + Html, ///< A HTML message, non-multipart + MultipartPlain, ///< A multipart/alternative message, the plain text part is currently displayed + MultipartHtml, ///< A multipart/altervative message, the HTML part is currently displayed + MultipartIcal ///< A multipart/altervative message, the ICal part is currently displayed +}; + +bool MIMETREEPARSER_EXPORT isTypeBlacklisted(KMime::Content *node); + +QString MIMETREEPARSER_EXPORT labelForContent(KMime::Content *node); + +QMimeType MIMETREEPARSER_EXPORT mimetype(const QString &name); + +QString MIMETREEPARSER_EXPORT iconNameForMimetype(const QString &mimeType, + const QString &fallbackFileName1 = QString(), + const QString &fallbackFileName2 = QString()); + +QString MIMETREEPARSER_EXPORT iconNameForContent(KMime::Content *node); +} +} + +#endif \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/attachmentstrategy.cpp kf5-messagelib-16.12.3/mimetreeparser/src/viewer/attachmentstrategy.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/attachmentstrategy.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/attachmentstrategy.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,343 @@ +/* -*- c++ -*- + attachmentstrategy.cpp + + This file is part of KMail, the KDE mail client. + Copyright (c) 2003 Marc Mutz + Copyright (C) 2009 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.net + Copyright (c) 2009 Andras Mantia + + KMail is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#include "attachmentstrategy.h" + +#include "nodehelper.h" +#include "utils/util.h" + +#include + +#include + +#include "mimetreeparser_debug.h" + +using namespace MimeTreeParser; + +static AttachmentStrategy::Display smartDisplay(KMime::Content *node) +{ + const auto cd = node->contentDisposition(false); + + if (cd && cd->disposition() == KMime::Headers::CDinline) + // explict "inline" disposition: + { + return AttachmentStrategy::Inline; + } + if (cd && cd->disposition() == KMime::Headers::CDattachment) + // explicit "attachment" disposition: + { + return AttachmentStrategy::AsIcon; + } + + const auto ct = node->contentType(false); + if (ct && ct->isText() && ct->name().trimmed().isEmpty() && + (!cd || cd->filename().trimmed().isEmpty())) + // text/* w/o filename parameter: + { + return AttachmentStrategy::Inline; + } + return AttachmentStrategy::AsIcon; +} + +// +// IconicAttachmentStrategy: +// show everything but the first text/plain body as icons +// + +class IconicAttachmentStrategy : public AttachmentStrategy +{ + friend class AttachmentStrategy; +protected: + IconicAttachmentStrategy() : AttachmentStrategy() {} + virtual ~IconicAttachmentStrategy() {} + +public: + const char *name() const Q_DECL_OVERRIDE + { + return "iconic"; + } + + bool inlineNestedMessages() const Q_DECL_OVERRIDE + { + return false; + } + Display defaultDisplay(KMime::Content *node) const Q_DECL_OVERRIDE + { + if (node->contentType()->isText() && + node->contentDisposition()->filename().trimmed().isEmpty() && + node->contentType()->name().trimmed().isEmpty()) + // text/* w/o filename parameter: + { + return Inline; + } + return AsIcon; + } +}; + +// +// SmartAttachmentStrategy: +// in addition to Iconic, show all body parts +// with content-disposition == "inline" and +// all text parts without a filename or name parameter inline +// + +class SmartAttachmentStrategy : public AttachmentStrategy +{ + friend class AttachmentStrategy; +protected: + SmartAttachmentStrategy() : AttachmentStrategy() {} + virtual ~SmartAttachmentStrategy() {} + +public: + const char *name() const Q_DECL_OVERRIDE + { + return "smart"; + } + + bool inlineNestedMessages() const Q_DECL_OVERRIDE + { + return true; + } + Display defaultDisplay(KMime::Content *node) const Q_DECL_OVERRIDE + { + return smartDisplay(node); + } +}; + +// +// InlinedAttachmentStrategy: +// show everything possible inline +// + +class InlinedAttachmentStrategy : public AttachmentStrategy +{ + friend class AttachmentStrategy; +protected: + InlinedAttachmentStrategy() : AttachmentStrategy() {} + virtual ~InlinedAttachmentStrategy() {} + +public: + const char *name() const Q_DECL_OVERRIDE + { + return "inlined"; + } + + bool inlineNestedMessages() const Q_DECL_OVERRIDE + { + return true; + } + Display defaultDisplay(KMime::Content *) const Q_DECL_OVERRIDE + { + return Inline; + } +}; + +// +// HiddenAttachmentStrategy +// show nothing except the first text/plain body part _at all_ +// + +class HiddenAttachmentStrategy : public AttachmentStrategy +{ + friend class AttachmentStrategy; +protected: + HiddenAttachmentStrategy() : AttachmentStrategy() {} + virtual ~HiddenAttachmentStrategy() {} + +public: + const char *name() const Q_DECL_OVERRIDE + { + return "hidden"; + } + + bool inlineNestedMessages() const Q_DECL_OVERRIDE + { + return false; + } + Display defaultDisplay(KMime::Content *node) const Q_DECL_OVERRIDE + { + if (node->contentType()->isText() && + node->contentDisposition()->filename().trimmed().isEmpty() && + node->contentType()->name().trimmed().isEmpty()) + // text/* w/o filename parameter: + { + return Inline; + } + if (!node->parent()) { + return Inline; + } + + if (node->parent() && node->parent()->contentType()->isMultipart() && + node->parent()->contentType()->subType() == "related") { + return Inline; + } + + return None; + } +}; + +class HeaderOnlyAttachmentStrategy : public AttachmentStrategy +{ + friend class AttachmentStrategy; +protected: + HeaderOnlyAttachmentStrategy() : AttachmentStrategy() {} + virtual ~HeaderOnlyAttachmentStrategy() {} + +public: + const char *name() const Q_DECL_OVERRIDE + { + return "headerOnly"; + } + + bool inlineNestedMessages() const Q_DECL_OVERRIDE + { + return true; + } + + Display defaultDisplay(KMime::Content *node) const Q_DECL_OVERRIDE + { + if (NodeHelper::isInEncapsulatedMessage(node)) { + return smartDisplay(node); + } + + if (!Util::labelForContent(node).isEmpty() && QIcon::hasThemeIcon(Util::iconNameForContent(node)) && ! Util::isTypeBlacklisted(node)) { + return None; + } + return smartDisplay(node); + } + + bool requiresAttachmentListInHeader() const Q_DECL_OVERRIDE + { + return true; + } +}; + +// +// AttachmentStrategy abstract base: +// + +AttachmentStrategy::AttachmentStrategy() +{ + +} + +AttachmentStrategy::~AttachmentStrategy() +{ + +} + +const AttachmentStrategy *AttachmentStrategy::create(Type type) +{ + switch (type) { + case Iconic: return iconic(); + case Smart: return smart(); + case Inlined: return inlined(); + case Hidden: return hidden(); + case HeaderOnly: return headerOnly(); + } + qCCritical(MIMETREEPARSER_LOG) << "Unknown attachment startegy ( type ==" + << (int)type << ") requested!"; + return 0; // make compiler happy +} + +const AttachmentStrategy *AttachmentStrategy::create(const QString &type) +{ + const QString lowerType = type.toLower(); + if (lowerType == QLatin1String("iconic")) { + return iconic(); + } + //if ( lowerType == "smart" ) return smart(); // not needed, see below + if (lowerType == QLatin1String("inlined")) { + return inlined(); + } + if (lowerType == QLatin1String("hidden")) { + return hidden(); + } + if (lowerType == QLatin1String("headeronly")) { + return headerOnly(); + } + // don't kFatal here, b/c the strings are user-provided + // (KConfig), so fail gracefully to the default: + return smart(); +} + +static const AttachmentStrategy *iconicStrategy = 0; +static const AttachmentStrategy *smartStrategy = 0; +static const AttachmentStrategy *inlinedStrategy = 0; +static const AttachmentStrategy *hiddenStrategy = 0; +static const AttachmentStrategy *headerOnlyStrategy = 0; + +const AttachmentStrategy *AttachmentStrategy::iconic() +{ + if (!iconicStrategy) { + iconicStrategy = new IconicAttachmentStrategy(); + } + return iconicStrategy; +} + +const AttachmentStrategy *AttachmentStrategy::smart() +{ + if (!smartStrategy) { + smartStrategy = new SmartAttachmentStrategy(); + } + return smartStrategy; +} + +const AttachmentStrategy *AttachmentStrategy::inlined() +{ + if (!inlinedStrategy) { + inlinedStrategy = new InlinedAttachmentStrategy(); + } + return inlinedStrategy; +} + +const AttachmentStrategy *AttachmentStrategy::hidden() +{ + if (!hiddenStrategy) { + hiddenStrategy = new HiddenAttachmentStrategy(); + } + return hiddenStrategy; +} + +const AttachmentStrategy *AttachmentStrategy::headerOnly() +{ + if (!headerOnlyStrategy) { + headerOnlyStrategy = new HeaderOnlyAttachmentStrategy(); + } + return headerOnlyStrategy; +} + +bool AttachmentStrategy::requiresAttachmentListInHeader() const +{ + return false; +} \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/attachmentstrategy.h kf5-messagelib-16.12.3/mimetreeparser/src/viewer/attachmentstrategy.h --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/attachmentstrategy.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/attachmentstrategy.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,88 @@ +/* -*- c++ -*- + attachmentstrategy.h + + This file is part of KMail, the KDE mail client. + Copyright (c) 2003 Marc Mutz + Copyright (C) 2009 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.net + Copyright (c) 2009 Andras Mantia + + KMail is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#ifndef __MIMETREEPARSER_ATTACHMENTSTRATEGY_H__ +#define __MIMETREEPARSER_ATTACHMENTSTRATEGY_H__ + +#include "mimetreeparser_export.h" + +class QString; +namespace KMime +{ +class Content; +} + +namespace MimeTreeParser +{ + +class MIMETREEPARSER_EXPORT AttachmentStrategy +{ +protected: + AttachmentStrategy(); + virtual ~AttachmentStrategy(); + +public: + // + // Factory methods: + // + enum Type { Iconic, Smart, Inlined, Hidden, HeaderOnly }; + + static const AttachmentStrategy *create(Type type); + static const AttachmentStrategy *create(const QString &type); + + static const AttachmentStrategy *iconic(); + static const AttachmentStrategy *smart(); + static const AttachmentStrategy *inlined(); + static const AttachmentStrategy *hidden(); + static const AttachmentStrategy *headerOnly(); + + // + // Navigation methods: + // + + virtual const char *name() const = 0; + + // + // Bahavioural: + // + + enum Display { None, AsIcon, Inline }; + + virtual bool inlineNestedMessages() const = 0; + virtual Display defaultDisplay(KMime::Content *node) const = 0; + virtual bool requiresAttachmentListInHeader() const; +}; + +} + +#endif // __MIMETREEPARSER_ATTACHMENTSTRATEGY_H__ diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/bodypartformatterbasefactory.cpp kf5-messagelib-16.12.3/mimetreeparser/src/viewer/bodypartformatterbasefactory.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/bodypartformatterbasefactory.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/bodypartformatterbasefactory.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,179 @@ +/* + bodypartformatterfactory.cpp + + This file is part of KMail, the KDE mail client. + Copyright (c) 2004 Marc Mutz , + Ingo Kloecker + + KMail 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. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#include "bodypartformatterbasefactory.h" +#include "bodypartformatterbasefactory_p.h" +#include "mimetreeparser_debug.h" + +// Qt + +#include + +using namespace MimeTreeParser; + +BodyPartFormatterBaseFactoryPrivate::BodyPartFormatterBaseFactoryPrivate(BodyPartFormatterBaseFactory *factory) + : q(factory) + , all(0) +{ +} + +BodyPartFormatterBaseFactoryPrivate::~BodyPartFormatterBaseFactoryPrivate() +{ + if (all) { + delete all; + all = 0; + } +} + +void BodyPartFormatterBaseFactoryPrivate::setup() +{ + if (!all) { + all = new TypeRegistry(); + messageviewer_create_builtin_bodypart_formatters(); + q->loadPlugins(); + } +} + +void BodyPartFormatterBaseFactoryPrivate::insert(const char *type, const char *subtype, const Interface::BodyPartFormatter *formatter) +{ + if (!type || !*type || !subtype || !*subtype || !formatter || !all) { + return; + } + + TypeRegistry::iterator type_it = all->find(type); + if (type_it == all->end()) { + qCDebug(MIMETREEPARSER_LOG) << "BodyPartFormatterBaseFactory: instantiating new Subtype Registry for \"" + << type << "\""; + type_it = all->insert(std::make_pair(type, SubtypeRegistry())).first; + assert(type_it != all->end()); + } + + SubtypeRegistry &subtype_reg = type_it->second; + + subtype_reg.insert(std::make_pair(subtype, formatter)); +} + +BodyPartFormatterBaseFactory::BodyPartFormatterBaseFactory() + : d(new BodyPartFormatterBaseFactoryPrivate(this)) +{ +} + +BodyPartFormatterBaseFactory::~BodyPartFormatterBaseFactory() +{ + delete d; +} + +void BodyPartFormatterBaseFactory::insert(const char *type, const char *subtype, const Interface::BodyPartFormatter *formatter) +{ + d->insert(type, subtype, formatter); +} + +const SubtypeRegistry &BodyPartFormatterBaseFactory::subtypeRegistry(const char *type) const +{ + if (!type || !*type) { + type = "*"; //krazy:exclude=doublequote_chars + } + + d->setup(); + assert(d->all); + + static SubtypeRegistry emptyRegistry; + if (d->all->empty()) { + return emptyRegistry; + } + + TypeRegistry::const_iterator type_it = d->all->find(type); + if (type_it == d->all->end()) { + type_it = d->all->find("*"); + } + if (type_it == d->all->end()) { + return emptyRegistry; + } + + const SubtypeRegistry &subtype_reg = type_it->second; + if (subtype_reg.empty()) { + return emptyRegistry; + } + return subtype_reg; +} + +SubtypeRegistry::const_iterator BodyPartFormatterBaseFactory::createForIterator(const char *type, const char *subtype) const +{ + if (!type || !*type) { + type = "*"; //krazy:exclude=doublequote_chars + } + if (!subtype || !*subtype) { + subtype = "*"; //krazy:exclude=doublequote_chars + } + + d->setup(); + assert(d->all); + + if (d->all->empty()) { + return SubtypeRegistry::const_iterator(); + } + + TypeRegistry::const_iterator type_it = d->all->find(type); + if (type_it == d->all->end()) { + type_it = d->all->find("*"); + } + if (type_it == d->all->end()) { + return SubtypeRegistry::const_iterator(); + } + + const SubtypeRegistry &subtype_reg = type_it->second; + if (subtype_reg.empty()) { + return SubtypeRegistry::const_iterator(); + } + + SubtypeRegistry::const_iterator subtype_it = subtype_reg.find(subtype); + qCWarning(MIMETREEPARSER_LOG) << type << subtype << subtype_reg.size(); + if (subtype_it == subtype_reg.end()) { + subtype_it = subtype_reg.find("*"); + } + if (subtype_it == subtype_reg.end()) { + return SubtypeRegistry::const_iterator(); + } + + if (!(*subtype_it).second) { + qCWarning(MIMETREEPARSER_LOG) << "BodyPartFormatterBaseFactory: a null bodypart formatter sneaked in for \"" + << type << "/" << subtype << "\"!"; + } + + return subtype_it; +} + +void BodyPartFormatterBaseFactory::loadPlugins() +{ + qCDebug(MIMETREEPARSER_LOG) << "plugin loading is not enabled in libmimetreeparser"; +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/bodypartformatterbasefactory.h kf5-messagelib-16.12.3/mimetreeparser/src/viewer/bodypartformatterbasefactory.h --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/bodypartformatterbasefactory.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/bodypartformatterbasefactory.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,87 @@ +/* + bodypartformatterfactory.h + + This file is part of KMail, the KDE mail client. + Copyright (c) 2004 Marc Mutz , + Ingo Kloecker + + KMail 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. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#ifndef __MIMETREEPARSER_BODYPARTFORMATTERBASEFACTORY_H__ +#define __MIMETREEPARSER_BODYPARTFORMATTERBASEFACTORY_H__ + +#include "mimetreeparser_export.h" + +#include +#include + +namespace MimeTreeParser +{ + +namespace Interface +{ +class BodyPartFormatter; +} + +struct ltstr { + bool operator()(const char *s1, const char *s2) const + { + return qstricmp(s1, s2) < 0; + } +}; + +typedef std::multimap SubtypeRegistry; +typedef std::map TypeRegistry; + +class BodyPartFormatterBaseFactoryPrivate; + +class MIMETREEPARSER_EXPORT BodyPartFormatterBaseFactory +{ +public: + BodyPartFormatterBaseFactory(); + virtual ~BodyPartFormatterBaseFactory(); + + SubtypeRegistry::const_iterator createForIterator(const char *type, const char *subtype) const; + const SubtypeRegistry &subtypeRegistry(const char *type) const; + +protected: + void insert(const char *type, const char *subtype, const Interface::BodyPartFormatter *formatter); + virtual void loadPlugins(); +private: + static BodyPartFormatterBaseFactory *mSelf; + + BodyPartFormatterBaseFactoryPrivate *d; + friend class BodyPartFormatterBaseFactoryPrivate; +private: + // disabled + const BodyPartFormatterBaseFactory &operator=(const BodyPartFormatterBaseFactory &); + BodyPartFormatterBaseFactory(const BodyPartFormatterBaseFactory &); +}; + +} + +#endif // __MIMETREEPARSER_BODYPARTFORMATTERFACTORY_H__ diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/bodypartformatterbasefactory_p.h kf5-messagelib-16.12.3/mimetreeparser/src/viewer/bodypartformatterbasefactory_p.h --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/bodypartformatterbasefactory_p.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/bodypartformatterbasefactory_p.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,57 @@ +/* -*- mode: C++; c-file-style: "gnu" -*- + bodypartformatterfactory.h + + This file is part of KMail, the KDE mail client. + Copyright (c) 2004 Marc Mutz , + Ingo Kloecker + + KMail 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. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#ifndef __MIMETREEPARSER_BODYPARTFORMATTERBASEFACTORY_P_H__ +#define __MIMETREEPARSER_BODYPARTFORMATTERBASEFACTORY_P_H__ + +namespace MimeTreeParser +{ +class BodyPartFormatterBaseFactory; + +class BodyPartFormatterBaseFactoryPrivate +{ +public: + BodyPartFormatterBaseFactoryPrivate(BodyPartFormatterBaseFactory *factory); + ~BodyPartFormatterBaseFactoryPrivate(); + + void setup(); + void messageviewer_create_builtin_bodypart_formatters(); //defined in bodypartformatter.cpp + void insert(const char *type, const char *subtype, const Interface::BodyPartFormatter *formatter); + + BodyPartFormatterBaseFactory *q; + TypeRegistry *all; +}; + +} + +#endif // __MIMETREEPARSER_BODYPARTFORMATTERFACTORY_P_H__ diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/bodypartformatter.cpp kf5-messagelib-16.12.3/mimetreeparser/src/viewer/bodypartformatter.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/bodypartformatter.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/bodypartformatter.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,193 @@ +/* -*- c++ -*- + bodypartformatter.cpp + + This file is part of KMail, the KDE mail client. + Copyright (c) 2003 Marc Mutz + + KMail is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#include "mimetreeparser_debug.h" + +#include "bodyformatter/applicationpgpencrypted.h" +#include "bodyformatter/applicationpkcs7mime.h" +#include "bodyformatter/mailman.h" +#include "bodyformatter/multipartalternative.h" +#include "bodyformatter/multipartmixed.h" +#include "bodyformatter/multipartencrypted.h" +#include "bodyformatter/multipartsigned.h" +#include "bodyformatter/texthtml.h" +#include "bodyformatter/textplain.h" + +#include "interfaces/bodypartformatter.h" +#include "interfaces/bodypart.h" + +#include "viewer/bodypartformatterbasefactory.h" +#include "viewer/bodypartformatterbasefactory_p.h" + +#include "viewer/attachmentstrategy.h" +#include "viewer/objecttreeparser.h" +#include "viewer/messagepart.h" + +#include + +using namespace MimeTreeParser; + +namespace +{ +class AnyTypeBodyPartFormatter + : public MimeTreeParser::Interface::BodyPartFormatter +{ + static const AnyTypeBodyPartFormatter *self; +public: + Result format(Interface::BodyPart *, HtmlWriter *) const Q_DECL_OVERRIDE + { + qCDebug(MIMETREEPARSER_LOG) << "Acting as a Interface::BodyPartFormatter!"; + return AsIcon; + } + + // unhide the overload with three arguments + using MimeTreeParser::Interface::BodyPartFormatter::format; + + void adaptProcessResult(ProcessResult &result) const Q_DECL_OVERRIDE + { + result.setNeverDisplayInline(true); + } + static const MimeTreeParser::Interface::BodyPartFormatter *create() + { + if (!self) { + self = new AnyTypeBodyPartFormatter(); + } + return self; + } +}; + +const AnyTypeBodyPartFormatter *AnyTypeBodyPartFormatter::self = 0; + +class ImageTypeBodyPartFormatter + : public MimeTreeParser::Interface::BodyPartFormatter +{ + static const ImageTypeBodyPartFormatter *self; +public: + Result format(Interface::BodyPart *, HtmlWriter *) const Q_DECL_OVERRIDE + { + return AsIcon; + } + + // unhide the overload with three arguments + using MimeTreeParser::Interface::BodyPartFormatter::format; + + void adaptProcessResult(ProcessResult &result) const Q_DECL_OVERRIDE + { + result.setNeverDisplayInline(false); + result.setIsImage(true); + } + static const MimeTreeParser::Interface::BodyPartFormatter *create() + { + if (!self) { + self = new ImageTypeBodyPartFormatter(); + } + return self; + } +}; + +const ImageTypeBodyPartFormatter *ImageTypeBodyPartFormatter::self = 0; + +class MessageRfc822BodyPartFormatter + : public MimeTreeParser::Interface::BodyPartFormatter +{ + static const MessageRfc822BodyPartFormatter *self; +public: + Interface::MessagePart::Ptr process(Interface::BodyPart &) const Q_DECL_OVERRIDE; + MimeTreeParser::Interface::BodyPartFormatter::Result format(Interface::BodyPart *, HtmlWriter *) const Q_DECL_OVERRIDE; + using MimeTreeParser::Interface::BodyPartFormatter::format; + static const MimeTreeParser::Interface::BodyPartFormatter *create(); +}; + +const MessageRfc822BodyPartFormatter *MessageRfc822BodyPartFormatter::self; + +const MimeTreeParser::Interface::BodyPartFormatter *MessageRfc822BodyPartFormatter::create() +{ + if (!self) { + self = new MessageRfc822BodyPartFormatter(); + } + return self; +} + +Interface::MessagePart::Ptr MessageRfc822BodyPartFormatter::process(Interface::BodyPart &part) const +{ + const KMime::Message::Ptr message = part.content()->bodyAsMessage(); + return MessagePart::Ptr(new EncapsulatedRfc822MessagePart(part.objectTreeParser(), part.content(), message)); +} + +Interface::BodyPartFormatter::Result MessageRfc822BodyPartFormatter::format(Interface::BodyPart *part, HtmlWriter *writer) const +{ + Q_UNUSED(writer) + const ObjectTreeParser *otp = part->objectTreeParser(); + const auto p = process(*part); + const auto mp = static_cast(p.data()); + if (mp) { + if (!otp->attachmentStrategy()->inlineNestedMessages() && !otp->showOnlyOneMimePart()) { + return Failed; + } else { + mp->html(true); + return Ok; + } + } else { + return Failed; + } +} + +typedef TextPlainBodyPartFormatter ApplicationPgpBodyPartFormatter; + +} // anon namespace + +void BodyPartFormatterBaseFactoryPrivate::messageviewer_create_builtin_bodypart_formatters() +{ + insert("application", "octet-stream", AnyTypeBodyPartFormatter::create()); + insert("application", "pgp", ApplicationPgpBodyPartFormatter::create()); + insert("application", "pkcs7-mime", ApplicationPkcs7MimeBodyPartFormatter::create()); + insert("application", "x-pkcs7-mime", ApplicationPkcs7MimeBodyPartFormatter::create()); + insert("application", "pgp-encrypted", ApplicationPGPEncryptedBodyPartFormatter::create()); + insert("application", "*", AnyTypeBodyPartFormatter::create()); + + insert("text", "html", TextHtmlBodyPartFormatter::create()); + insert("text", "rtf", AnyTypeBodyPartFormatter::create()); + insert("text", "plain", MailmanBodyPartFormatter::create()); + insert("text", "plain", TextPlainBodyPartFormatter::create()); + insert("text", "*", MailmanBodyPartFormatter::create()); + insert("text", "*", TextPlainBodyPartFormatter::create()); + + insert("image", "*", ImageTypeBodyPartFormatter::create()); + + insert("message", "rfc822", MessageRfc822BodyPartFormatter::create()); + insert("message", "*", AnyTypeBodyPartFormatter::create()); + + insert("multipart", "alternative", MultiPartAlternativeBodyPartFormatter::create()); + insert("multipart", "encrypted", MultiPartEncryptedBodyPartFormatter::create()); + insert("multipart", "signed", MultiPartSignedBodyPartFormatter::create()); + insert("multipart", "*", MultiPartMixedBodyPartFormatter::create()); + insert("*", "*", AnyTypeBodyPartFormatter::create()); +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/cryptohelper.cpp kf5-messagelib-16.12.3/mimetreeparser/src/viewer/cryptohelper.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/cryptohelper.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/cryptohelper.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,150 @@ +/* + Copyright (C) 2015 Sandro Knauß + Copyright (C) 2001,2002 the KPGP authors + See file AUTHORS.kpgp for details + + Kmail 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. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "cryptohelper.h" + +using namespace MimeTreeParser; + +PGPBlockType Block::determineType() const +{ + const QByteArray data = text(); + if (data.startsWith("-----BEGIN PGP SIGNED")) { + return ClearsignedBlock; + } else if (data.startsWith("-----BEGIN PGP SIGNATURE")) { + return SignatureBlock; + } else if (data.startsWith("-----BEGIN PGP PUBLIC")) { + return PublicKeyBlock; + } else if (data.startsWith("-----BEGIN PGP PRIVATE") + || data.startsWith("-----BEGIN PGP SECRET")) { + return PrivateKeyBlock; + } else if (data.startsWith("-----BEGIN PGP MESSAGE")) { + if (data.startsWith("-----BEGIN PGP MESSAGE PART")) { + return MultiPgpMessageBlock; + } else { + return PgpMessageBlock; + } + } else if (data.startsWith("-----BEGIN PGP ARMORED FILE")) { + return PgpMessageBlock; + } else if (data.startsWith("-----BEGIN PGP ")) { + return UnknownBlock; + } else { + return NoPgpBlock; + } +} + +QList MimeTreeParser::prepareMessageForDecryption(const QByteArray &msg) +{ + PGPBlockType pgpBlock = NoPgpBlock; + QList blocks; + int start = -1; // start of the current PGP block + int lastEnd = -1; // end of the last PGP block + const int length = msg.length(); + + if (msg.isEmpty()) { + return blocks; + } + + if (msg.startsWith("-----BEGIN PGP ")) { + start = 0; + } else { + start = msg.indexOf("\n-----BEGIN PGP ") + 1; + if (start == 0) { + blocks.append(Block(msg, NoPgpBlock)); + return blocks; + } + } + + while (start != -1) { + int nextEnd, nextStart; + + // is the PGP block a clearsigned block? + if (!strncmp(msg.constData() + start + 15, "SIGNED", 6)) { + pgpBlock = ClearsignedBlock; + } else { + pgpBlock = UnknownBlock; + } + + nextEnd = msg.indexOf("\n-----END PGP ", start + 15); + nextStart = msg.indexOf("\n-----BEGIN PGP ", start + 15); + + if (nextEnd == -1) { // Missing END PGP line + if (lastEnd != -1) { + blocks.append(Block(msg.mid(lastEnd + 1), UnknownBlock)); + } else { + blocks.append(Block(msg.mid(start), UnknownBlock)); + } + break; + } + + if ((nextStart == -1) || (nextEnd < nextStart) || (pgpBlock == ClearsignedBlock)) { + // most likely we found a PGP block (but we don't check if it's valid) + + // store the preceding non-PGP block + if (start - lastEnd - 1 > 0) { + blocks.append(Block(msg.mid(lastEnd + 1, start - lastEnd - 1), NoPgpBlock)); + } + + lastEnd = msg.indexOf("\n", nextEnd + 14); + if (lastEnd == -1) { + if (start < length) { + blocks.append(Block(msg.mid(start))); + } + break; + } else { + blocks.append(Block(msg.mid(start, lastEnd + 1 - start))); + if ((nextStart != -1) && (nextEnd > nextStart)) { + nextStart = msg.indexOf("\n-----BEGIN PGP ", lastEnd + 1); + } + } + } + + start = nextStart; + + if (start == -1) { + if (lastEnd + 1 < length) { + //rest of mail is no PGP Block + blocks.append(Block(msg.mid(lastEnd + 1), NoPgpBlock)); + } + break; + } else { + start++; // move start behind the '\n' + } + } + + return blocks; +} + +Block::Block(const QByteArray &m) + : msg(m) +{ + mType = determineType(); +} + +Block::Block(const QByteArray &m, PGPBlockType t) + : msg(m) + , mType(t) +{ + +} + +QByteArray MimeTreeParser::Block::text() const +{ + return msg; +} + +PGPBlockType Block::type() const +{ + return mType; +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/cryptohelper.h kf5-messagelib-16.12.3/mimetreeparser/src/viewer/cryptohelper.h --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/cryptohelper.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/cryptohelper.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,62 @@ +/* + cryptohelper.h + + Copyright (C) 2015 Sandro Knauß + Copyright (C) 2001,2002 the KPGP authors + See file AUTHORS.kpgp for details + + KMail 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. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __MIMETREEPARSER_CRYPTOHELPER_H__ +#define __MIMETREEPARSER_CRYPTOHELPER_H__ + +#include +#include + +namespace MimeTreeParser +{ + +enum PGPBlockType { + UnknownBlock = -1, // BEGIN PGP ??? + NoPgpBlock = 0, + PgpMessageBlock = 1, // BEGIN PGP MESSAGE + MultiPgpMessageBlock = 2, // BEGIN PGP MESSAGE, PART X[/Y] + SignatureBlock = 3, // BEGIN PGP SIGNATURE + ClearsignedBlock = 4, // BEGIN PGP SIGNED MESSAGE + PublicKeyBlock = 5, // BEGIN PGP PUBLIC KEY BLOCK + PrivateKeyBlock = 6 // BEGIN PGP PRIVATE KEY BLOCK (PGP 2.x: ...SECRET...) +}; + +class Block +{ +public: + Block(const QByteArray &m); + + Block(const QByteArray &m, PGPBlockType t); + + QByteArray text() const; + PGPBlockType type() const; + PGPBlockType determineType() const; + + QByteArray msg; + PGPBlockType mType; +}; + +/** Parses the given message and splits it into OpenPGP blocks and + Non-OpenPGP blocks. +*/ +QList prepareMessageForDecryption(const QByteArray &msg); + +} // namespace MimeTreeParser + +Q_DECLARE_TYPEINFO(MimeTreeParser::Block, Q_MOVABLE_TYPE); + +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/enums.h kf5-messagelib-16.12.3/mimetreeparser/src/viewer/enums.h --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/enums.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/enums.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,54 @@ +/* + Copyright (c) 2016 Sandro Knauß + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_ENUMS_H__ +#define __MIMETREEPARSER_ENUMS_H__ + +namespace MimeTreeParser +{ + +/** + * The display update mode: Force updates the display immediately, Delayed updates + * after some time (150ms by default) + */ +enum UpdateMode { + Force = 0, + Delayed +}; + +/** Flags for the encryption state. */ +typedef enum { + KMMsgEncryptionStateUnknown = ' ', + KMMsgNotEncrypted = 'N', + KMMsgPartiallyEncrypted = 'P', + KMMsgFullyEncrypted = 'F', + KMMsgEncryptionProblematic = 'X' +} KMMsgEncryptionState; + +/** Flags for the signature state. */ +typedef enum { + KMMsgSignatureStateUnknown = ' ', + KMMsgNotSigned = 'N', + KMMsgPartiallySigned = 'P', + KMMsgFullySigned = 'F', + KMMsgSignatureProblematic = 'X' +} KMMsgSignatureState; + +} + +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/memento/cryptobodypartmemento.cpp kf5-messagelib-16.12.3/mimetreeparser/src/viewer/memento/cryptobodypartmemento.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/memento/cryptobodypartmemento.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/memento/cryptobodypartmemento.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,56 @@ +/* + Copyright (c) 2014-2016 Montel Laurent + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "cryptobodypartmemento.h" + +using namespace GpgME; +using namespace MimeTreeParser; + +CryptoBodyPartMemento::CryptoBodyPartMemento() + : QObject(0), + Interface::BodyPartMemento(), + m_running(false) +{ + +} + +CryptoBodyPartMemento::~CryptoBodyPartMemento() +{ + +} + +bool CryptoBodyPartMemento::isRunning() const +{ + return m_running; +} + +void CryptoBodyPartMemento::setAuditLog(const Error &err, const QString &log) +{ + m_auditLogError = err; + m_auditLog = log; +} + +void CryptoBodyPartMemento::setRunning(bool running) +{ + m_running = running; +} + +void CryptoBodyPartMemento::detach() +{ + disconnect(this, SIGNAL(update(MimeTreeParser::UpdateMode)), 0, 0); +} + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/memento/cryptobodypartmemento.h kf5-messagelib-16.12.3/mimetreeparser/src/viewer/memento/cryptobodypartmemento.h --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/memento/cryptobodypartmemento.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/memento/cryptobodypartmemento.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,75 @@ +/* + Copyright (c) 2014-2016 Montel Laurent + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef __MIMETREEPARSER_CRYPTOBODYPARTMEMENTO_H__ +#define __MIMETREEPARSER_CRYPTOBODYPARTMEMENTO_H__ + +#include + +#include +#include + +#include "interfaces/bodypart.h" +#include "viewer/enums.h" + +namespace MimeTreeParser +{ + +class CryptoBodyPartMemento + : public QObject, + public Interface::BodyPartMemento +{ + Q_OBJECT +public: + CryptoBodyPartMemento(); + ~CryptoBodyPartMemento(); + + virtual bool start() = 0; + virtual void exec() = 0; + bool isRunning() const; + + const QString &auditLogAsHtml() const + { + return m_auditLog; + } + GpgME::Error auditLogError() const + { + return m_auditLogError; + } + + void detach() Q_DECL_OVERRIDE; + +Q_SIGNALS: + void update(MimeTreeParser::UpdateMode); + +protected Q_SLOTS: + void notify() + { + Q_EMIT update(MimeTreeParser::Force); + } + +protected: + void setAuditLog(const GpgME::Error &err, const QString &log); + void setRunning(bool running); + +private: + bool m_running; + QString m_auditLog; + GpgME::Error m_auditLogError; +}; +} +#endif // __MIMETREEPARSER_CRYPTOBODYPARTMEMENTO_H__ diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/memento/decryptverifybodypartmemento.cpp kf5-messagelib-16.12.3/mimetreeparser/src/viewer/memento/decryptverifybodypartmemento.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/memento/decryptverifybodypartmemento.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/memento/decryptverifybodypartmemento.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,86 @@ +/* + Copyright (c) 2014-2016 Montel Laurent + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "decryptverifybodypartmemento.h" + +#include + +#include + +using namespace QGpgME; +using namespace GpgME; +using namespace MimeTreeParser; + +DecryptVerifyBodyPartMemento::DecryptVerifyBodyPartMemento(DecryptVerifyJob *job, const QByteArray &cipherText) + : CryptoBodyPartMemento(), + m_cipherText(cipherText), + m_job(job) +{ + Q_ASSERT(m_job); +} + +DecryptVerifyBodyPartMemento::~DecryptVerifyBodyPartMemento() +{ + if (m_job) { + m_job->slotCancel(); + } +} + +bool DecryptVerifyBodyPartMemento::start() +{ + Q_ASSERT(m_job); + if (const Error err = m_job->start(m_cipherText)) { + m_dr = DecryptionResult(err); + return false; + } + connect(m_job.data(), &DecryptVerifyJob::result, + this, &DecryptVerifyBodyPartMemento::slotResult); + setRunning(true); + return true; +} + +void DecryptVerifyBodyPartMemento::exec() +{ + Q_ASSERT(m_job); + QByteArray plainText; + setRunning(true); + const std::pair p = m_job->exec(m_cipherText, plainText); + saveResult(p.first, p.second, plainText); + m_job->deleteLater(); // exec'ed jobs don't delete themselves + m_job = 0; +} + +void DecryptVerifyBodyPartMemento::saveResult(const DecryptionResult &dr, + const VerificationResult &vr, + const QByteArray &plainText) +{ + Q_ASSERT(m_job); + setRunning(false); + m_dr = dr; + m_vr = vr; + m_plainText = plainText; + setAuditLog(m_job->auditLogError(), m_job->auditLogAsHtml()); +} + +void DecryptVerifyBodyPartMemento::slotResult(const DecryptionResult &dr, + const VerificationResult &vr, + const QByteArray &plainText) +{ + saveResult(dr, vr, plainText); + m_job = 0; + notify(); +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/memento/decryptverifybodypartmemento.h kf5-messagelib-16.12.3/mimetreeparser/src/viewer/memento/decryptverifybodypartmemento.h --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/memento/decryptverifybodypartmemento.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/memento/decryptverifybodypartmemento.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,81 @@ +/* + Copyright (c) 2014-2016 Montel Laurent + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef __MIMETREEPARSER_DECRYPTVERIFYBODYPARTMEMENTO_H__ +#define __MIMETREEPARSER_DECRYPTVERIFYBODYPARTMEMENTO_H__ + +#include "cryptobodypartmemento.h" + +#include +#include + +#include + +#include "interfaces/bodypart.h" + +namespace QGpgME +{ +class DecryptVerifyJob; +} + +namespace MimeTreeParser +{ + +class DecryptVerifyBodyPartMemento + : public CryptoBodyPartMemento +{ + Q_OBJECT +public: + DecryptVerifyBodyPartMemento(QGpgME::DecryptVerifyJob *job, const QByteArray &cipherText); + ~DecryptVerifyBodyPartMemento(); + + bool start() Q_DECL_OVERRIDE; + void exec() Q_DECL_OVERRIDE; + + const QByteArray &plainText() const + { + return m_plainText; + } + const GpgME::DecryptionResult &decryptResult() const + { + return m_dr; + } + const GpgME::VerificationResult &verifyResult() const + { + return m_vr; + } + +private Q_SLOTS: + void slotResult(const GpgME::DecryptionResult &dr, + const GpgME::VerificationResult &vr, + const QByteArray &plainText); + +private: + void saveResult(const GpgME::DecryptionResult &, + const GpgME::VerificationResult &, + const QByteArray &); +private: + // input: + const QByteArray m_cipherText; + QPointer m_job; + // output: + GpgME::DecryptionResult m_dr; + GpgME::VerificationResult m_vr; + QByteArray m_plainText; +}; +} +#endif // __MIMETREEPARSER_DECRYPTVERIFYBODYPARTMEMENTO_H__ diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/memento/verifydetachedbodypartmemento.cpp kf5-messagelib-16.12.3/mimetreeparser/src/viewer/memento/verifydetachedbodypartmemento.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/memento/verifydetachedbodypartmemento.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/memento/verifydetachedbodypartmemento.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,177 @@ +/* + Copyright (c) 2014-2016 Montel Laurent + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "verifydetachedbodypartmemento.h" +#include "mimetreeparser_debug.h" + +#include +#include + +#include + +#include + +#include + +using namespace QGpgME; +using namespace GpgME; +using namespace MimeTreeParser; + +VerifyDetachedBodyPartMemento::VerifyDetachedBodyPartMemento(VerifyDetachedJob *job, + KeyListJob *klj, + const QByteArray &signature, + const QByteArray &plainText) + : CryptoBodyPartMemento(), + m_signature(signature), + m_plainText(plainText), + m_job(job), + m_keylistjob(klj) +{ + assert(m_job); +} + +VerifyDetachedBodyPartMemento::~VerifyDetachedBodyPartMemento() +{ + if (m_job) { + m_job->slotCancel(); + } + if (m_keylistjob) { + m_keylistjob->slotCancel(); + } +} + +bool VerifyDetachedBodyPartMemento::start() +{ + assert(m_job); +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento started"; +#endif + connect(m_job, SIGNAL(result(GpgME::VerificationResult)), + this, SLOT(slotResult(GpgME::VerificationResult))); + if (const Error err = m_job->start(m_signature, m_plainText)) { + m_vr = VerificationResult(err); +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento stopped with error"; +#endif + return false; + } + setRunning(true); + return true; +} + +void VerifyDetachedBodyPartMemento::exec() +{ + assert(m_job); + setRunning(true); +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento execed"; +#endif + saveResult(m_job->exec(m_signature, m_plainText)); + m_job->deleteLater(); // exec'ed jobs don't delete themselves + m_job = 0; +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento after execed"; +#endif + if (canStartKeyListJob()) { + std::vector keys; + m_keylistjob->exec(keyListPattern(), /*secretOnly=*/false, keys); + if (!keys.empty()) { + m_key = keys.back(); + } + } + if (m_keylistjob) { + m_keylistjob->deleteLater(); // exec'ed jobs don't delete themselves + } + m_keylistjob = 0; + setRunning(false); +} + +bool VerifyDetachedBodyPartMemento::canStartKeyListJob() const +{ + if (!m_keylistjob) { + return false; + } + const char *const fpr = m_vr.signature(0).fingerprint(); + return fpr && *fpr; +} + +QStringList VerifyDetachedBodyPartMemento::keyListPattern() const +{ + assert(canStartKeyListJob()); + return QStringList(QString::fromLatin1(m_vr.signature(0).fingerprint())); +} + +void VerifyDetachedBodyPartMemento::saveResult(const VerificationResult &vr) +{ + assert(m_job); +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento::saveResult called"; +#endif + m_vr = vr; + setAuditLog(m_job->auditLogError(), m_job->auditLogAsHtml()); +} + +void VerifyDetachedBodyPartMemento::slotResult(const VerificationResult &vr) +{ +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento::slotResult called"; +#endif + saveResult(vr); + m_job = 0; + if (canStartKeyListJob() && startKeyListJob()) { +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento: canStartKeyListJob && startKeyListJob"; +#endif + return; + } + if (m_keylistjob) { + m_keylistjob->deleteLater(); + } + m_keylistjob = 0; + setRunning(false); + notify(); +} + +bool VerifyDetachedBodyPartMemento::startKeyListJob() +{ + assert(canStartKeyListJob()); + if (const GpgME::Error err = m_keylistjob->start(keyListPattern())) { + return false; + } + connect(m_keylistjob, SIGNAL(done()), this, SLOT(slotKeyListJobDone())); + connect(m_keylistjob, SIGNAL(nextKey(GpgME::Key)), + this, SLOT(slotNextKey(GpgME::Key))); + return true; +} + +void VerifyDetachedBodyPartMemento::slotNextKey(const GpgME::Key &key) +{ +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento::slotNextKey called"; +#endif + m_key = key; +} + +void VerifyDetachedBodyPartMemento::slotKeyListJobDone() +{ +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento::slotKeyListJobDone called"; +#endif + m_keylistjob = 0; + setRunning(false); + notify(); +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/memento/verifydetachedbodypartmemento.h kf5-messagelib-16.12.3/mimetreeparser/src/viewer/memento/verifydetachedbodypartmemento.h --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/memento/verifydetachedbodypartmemento.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/memento/verifydetachedbodypartmemento.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,87 @@ +/* + Copyright (c) 2014-2016 Montel Laurent + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef __MIMETREEPARSER_VERIFYDETACHEDBODYPARTMEMENTO_H__ +#define __MIMETREEPARSER_VERIFYDETACHEDBODYPARTMEMENTO_H__ + +#include "cryptobodypartmemento.h" +#include +#include + +#include +#include + +#include "interfaces/bodypart.h" + +namespace QGpgME +{ +class VerifyDetachedJob; +class KeyListJob; +} + +class QStringList; + +namespace MimeTreeParser +{ + +class VerifyDetachedBodyPartMemento + : public CryptoBodyPartMemento +{ + Q_OBJECT +public: + VerifyDetachedBodyPartMemento(QGpgME::VerifyDetachedJob *job, + QGpgME::KeyListJob *klj, + const QByteArray &signature, + const QByteArray &plainText); + ~VerifyDetachedBodyPartMemento(); + + bool start() Q_DECL_OVERRIDE; + void exec() Q_DECL_OVERRIDE; + + const GpgME::VerificationResult &verifyResult() const + { + return m_vr; + } + const GpgME::Key &signingKey() const + { + return m_key; + } + +private Q_SLOTS: + void slotResult(const GpgME::VerificationResult &vr); + void slotKeyListJobDone(); + void slotNextKey(const GpgME::Key &); + +private: + void saveResult(const GpgME::VerificationResult &); + bool canStartKeyListJob() const; + QStringList keyListPattern() const; + bool startKeyListJob(); +private: + // input: + const QByteArray m_signature; + const QByteArray m_plainText; + QPointer m_job; + QPointer m_keylistjob; + // output: + GpgME::VerificationResult m_vr; + GpgME::Key m_key; +}; + +} + +#endif // __MIMETREEPARSER_VERIFYDETACHEDBODYPARTMEMENTO_H__ diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/memento/verifyopaquebodypartmemento.cpp kf5-messagelib-16.12.3/mimetreeparser/src/viewer/memento/verifyopaquebodypartmemento.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/memento/verifyopaquebodypartmemento.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/memento/verifyopaquebodypartmemento.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,179 @@ +/* + Copyright (c) 2014-2016 Montel Laurent + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "verifyopaquebodypartmemento.h" +#include "mimetreeparser_debug.h" + +#include +#include + +#include + +#include + +#include + +using namespace QGpgME; +using namespace GpgME; +using namespace MimeTreeParser; + +VerifyOpaqueBodyPartMemento::VerifyOpaqueBodyPartMemento(VerifyOpaqueJob *job, + KeyListJob *klj, + const QByteArray &signature) + : CryptoBodyPartMemento(), + m_signature(signature), + m_job(job), + m_keylistjob(klj) +{ + assert(m_job); +} + +VerifyOpaqueBodyPartMemento::~VerifyOpaqueBodyPartMemento() +{ + if (m_job) { + m_job->slotCancel(); + } + if (m_keylistjob) { + m_keylistjob->slotCancel(); + } +} + +bool VerifyOpaqueBodyPartMemento::start() +{ + assert(m_job); +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyOpaqueBodyPartMemento started"; +#endif + if (const Error err = m_job->start(m_signature)) { + m_vr = VerificationResult(err); +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyOpaqueBodyPartMemento stopped with error"; +#endif + return false; + } + connect(m_job, SIGNAL(result(GpgME::VerificationResult,QByteArray)), + this, SLOT(slotResult(GpgME::VerificationResult,QByteArray))); + setRunning(true); + return true; +} + +void VerifyOpaqueBodyPartMemento::exec() +{ + assert(m_job); + setRunning(true); + QByteArray plainText; +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyOpaqueBodyPartMemento execed"; +#endif + saveResult(m_job->exec(m_signature, plainText), plainText); +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyOpaqueBodyPartMemento after execed"; +#endif + m_job->deleteLater(); // exec'ed jobs don't delete themselves + m_job = 0; + if (canStartKeyListJob()) { + std::vector keys; + m_keylistjob->exec(keyListPattern(), /*secretOnly=*/false, keys); + if (!keys.empty()) { + m_key = keys.back(); + } + } + if (m_keylistjob) { + m_keylistjob->deleteLater(); // exec'ed jobs don't delete themselves + } + m_keylistjob = 0; + setRunning(false); +} + +bool VerifyOpaqueBodyPartMemento::canStartKeyListJob() const +{ + if (!m_keylistjob) { + return false; + } + const char *const fpr = m_vr.signature(0).fingerprint(); + return fpr && *fpr; +} + +QStringList VerifyOpaqueBodyPartMemento::keyListPattern() const +{ + assert(canStartKeyListJob()); + return QStringList(QString::fromLatin1(m_vr.signature(0).fingerprint())); +} + +void VerifyOpaqueBodyPartMemento::saveResult(const VerificationResult &vr, + const QByteArray &plainText) +{ + assert(m_job); +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyOpaqueBodyPartMemento::saveResult called"; +#endif + m_vr = vr; + m_plainText = plainText; + setAuditLog(m_job->auditLogError(), m_job->auditLogAsHtml()); +} + +void VerifyOpaqueBodyPartMemento::slotResult(const VerificationResult &vr, + const QByteArray &plainText) +{ +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyOpaqueBodyPartMemento::slotResult called"; +#endif + saveResult(vr, plainText); + m_job = 0; + if (canStartKeyListJob() && startKeyListJob()) { +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyOpaqueBodyPartMemento: canStartKeyListJob && startKeyListJob"; +#endif + return; + } + if (m_keylistjob) { + m_keylistjob->deleteLater(); + } + m_keylistjob = 0; + setRunning(false); + notify(); +} + +bool VerifyOpaqueBodyPartMemento::startKeyListJob() +{ + assert(canStartKeyListJob()); + if (const GpgME::Error err = m_keylistjob->start(keyListPattern())) { + return false; + } + connect(m_keylistjob, SIGNAL(done()), this, SLOT(slotKeyListJobDone())); + connect(m_keylistjob, SIGNAL(nextKey(GpgME::Key)), + this, SLOT(slotNextKey(GpgME::Key))); + return true; +} + +void VerifyOpaqueBodyPartMemento::slotNextKey(const GpgME::Key &key) +{ +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyOpaqueBodyPartMemento::slotNextKey called"; +#endif + m_key = key; +} + +void VerifyOpaqueBodyPartMemento::slotKeyListJobDone() +{ +#ifdef DEBUG_SIGNATURE + qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyOpaqueBodyPartMemento::slotKeyListJobDone called"; +#endif + m_keylistjob = 0; + setRunning(false); + notify(); +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/memento/verifyopaquebodypartmemento.h kf5-messagelib-16.12.3/mimetreeparser/src/viewer/memento/verifyopaquebodypartmemento.h --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/memento/verifyopaquebodypartmemento.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/memento/verifyopaquebodypartmemento.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,93 @@ +/* + Copyright (c) 2014-2016 Montel Laurent + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef __MIMETREEPARSER_VERIFYOPAQUEBODYPARTMEMENTO_H__ +#define __MIMETREEPARSER_VERIFYOPAQUEBODYPARTMEMENTO_H__ + +#include "cryptobodypartmemento.h" +#include +#include +#include + +#include +#include + +#include "interfaces/bodypart.h" + +namespace QGpgME +{ +class VerifyOpaqueJob; +class KeyListJob; +} + +class QStringList; + +namespace MimeTreeParser +{ + +class VerifyOpaqueBodyPartMemento + : public CryptoBodyPartMemento +{ + Q_OBJECT +public: + VerifyOpaqueBodyPartMemento(QGpgME::VerifyOpaqueJob *job, + QGpgME::KeyListJob *klj, + const QByteArray &signature); + ~VerifyOpaqueBodyPartMemento(); + + bool start() Q_DECL_OVERRIDE; + void exec() Q_DECL_OVERRIDE; + + const QByteArray &plainText() const + { + return m_plainText; + } + const GpgME::VerificationResult &verifyResult() const + { + return m_vr; + } + const GpgME::Key &signingKey() const + { + return m_key; + } + +private Q_SLOTS: + void slotResult(const GpgME::VerificationResult &vr, + const QByteArray &plainText); + void slotKeyListJobDone(); + void slotNextKey(const GpgME::Key &); + +private: + void saveResult(const GpgME::VerificationResult &, + const QByteArray &); + bool canStartKeyListJob() const; + QStringList keyListPattern() const; + bool startKeyListJob(); +private: + // input: + const QByteArray m_signature; + QPointer m_job; + QPointer m_keylistjob; + // output: + GpgME::VerificationResult m_vr; + QByteArray m_plainText; + GpgME::Key m_key; +}; + +} + +#endif // __MIMETREEPARSER_VERIFYOPAQUEBODYPARTMEMENTO_H__ diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/messagepart.cpp kf5-messagelib-16.12.3/mimetreeparser/src/viewer/messagepart.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/messagepart.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/messagepart.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,1360 @@ +/* + Copyright (c) 2015 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#include "messagepart.h" +#include "mimetreeparser_debug.h" +#include "attachmentstrategy.h" +#include "cryptohelper.h" +#include "objecttreeparser.h" +#include "interfaces/htmlwriter.h" +#include "job/qgpgmejobexecutor.h" +#include "memento/cryptobodypartmemento.h" +#include "memento/decryptverifybodypartmemento.h" +#include "memento/verifydetachedbodypartmemento.h" +#include "memento/verifyopaquebodypartmemento.h" + +#include "bodyformatter/utils.h" + +#include + +#include + +#if GPGME_VERSION_NUMBER < 0x010702 + #include +#else + #include +#endif +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include + +using namespace MimeTreeParser; + +//------MessagePart----------------------- +MessagePart::MessagePart(ObjectTreeParser *otp, + const QString &text) + : mText(text) + , mOtp(otp) + , mAttachmentNode(Q_NULLPTR) + , mRoot(false) +{ +} + +MessagePart::~MessagePart() +{ +} + +PartMetaData *MessagePart::partMetaData() +{ + return &mMetaData; +} + +void MessagePart::setAttachmentFlag(KMime::Content *node) +{ + mAttachmentNode = node; +} + +bool MessagePart::isAttachment() const +{ + return mAttachmentNode; +} + +KMime::Content *MessagePart::attachmentNode() const +{ + return mAttachmentNode; +} + +void MessagePart::setIsRoot(bool root) +{ + mRoot = root; +} + +bool MessagePart::isRoot() const +{ + return mRoot; +} + +QString MessagePart::text() const +{ + return mText; +} + +void MessagePart::setText(const QString &text) +{ + mText = text; +} + +bool MessagePart::isHtml() const +{ + return false; +} + +bool MessagePart::isHidden() const +{ + return false; +} + +Interface::ObjectTreeSource *MessagePart::source() const +{ + Q_ASSERT(mOtp); + return mOtp->mSource; +} + +HtmlWriter *MessagePart::htmlWriter() const +{ + Q_ASSERT(mOtp); + return mOtp->htmlWriter(); +} + +void MessagePart::setHtmlWriter(HtmlWriter *htmlWriter) const +{ + mOtp->mHtmlWriter = htmlWriter; +} + +void MessagePart::parseInternal(KMime::Content *node, bool onlyOneMimePart) +{ + auto subMessagePart = mOtp->parseObjectTreeInternal(node, onlyOneMimePart); + mRoot = subMessagePart->isRoot(); + foreach (auto part, subMessagePart->subParts()) { + appendSubPart(part); + } +} + +QString MessagePart::renderInternalText() const +{ + QString text; + foreach (const auto &mp, subParts()) { + text += mp->text(); + } + return text; +} + +void MessagePart::copyContentFrom() const +{ + foreach (const auto &mp, subParts()) { + const auto m = mp.dynamicCast(); + if (m) { + m->copyContentFrom(); + } + } +} + +void MessagePart::fix() const +{ + foreach (const auto &mp, subParts()) { + const auto m = mp.dynamicCast(); + if (m) { + m->fix(); + } + } +} + +void MessagePart::appendSubPart(const Interface::MessagePart::Ptr &messagePart) +{ + messagePart->setParentPart(this); + mBlocks.append(messagePart); +} + +const QVector &MessagePart::subParts() const +{ + return mBlocks; +} + +bool MessagePart::hasSubParts() const +{ + return !mBlocks.isEmpty(); +} + +//-----MessagePartList---------------------- +MessagePartList::MessagePartList(ObjectTreeParser *otp) + : MessagePart(otp, QString()) +{ +} + +MessagePartList::~MessagePartList() +{ + +} + +QString MessagePartList::text() const +{ + return renderInternalText(); +} + +QString MessagePartList::plaintextContent() const +{ + return QString(); +} + +QString MessagePartList::htmlContent() const +{ + return QString(); +} + +//-----TextMessageBlock---------------------- + +TextMessagePart::TextMessagePart(ObjectTreeParser *otp, KMime::Content *node, bool drawFrame, bool showLink, bool decryptMessage) + : MessagePartList(otp) + , mNode(node) + , mDrawFrame(drawFrame) + , mShowLink(showLink) + , mDecryptMessage(decryptMessage) + , mIsHidden(false) +{ + if (!mNode) { + qCWarning(MIMETREEPARSER_LOG) << "not a valid node"; + return; + } + + mIsHidden = mOtp->nodeHelper()->isNodeDisplayedHidden(mNode); + + parseContent(); +} + +TextMessagePart::~TextMessagePart() +{ + +} + +bool TextMessagePart::decryptMessage() const +{ + return mDecryptMessage; +} + +void TextMessagePart::parseContent() +{ + const auto aCodec = mOtp->codecFor(mNode); + const QString &fromAddress = NodeHelper::fromAsString(mNode); + mSignatureState = KMMsgNotSigned; + mEncryptionState = KMMsgNotEncrypted; + const auto blocks = prepareMessageForDecryption(mNode->decodedContent()); + + const auto cryptProto = QGpgME::openpgp(); + + if (!blocks.isEmpty()) { + + /* The (overall) signature/encrypted status is broken + * if one unencrypted part is at the beginning or in the middle + * because mailmain adds an unencrypted part at the end this should not break the overall status + * + * That's why we first set the tmp status and if one crypted/signed block comes afterwards, than + * the status is set to unencryped + */ + bool fullySignedOrEncrypted = true; + bool fullySignedOrEncryptedTmp = true; + + Q_FOREACH (const auto &block, blocks) { + + if (!fullySignedOrEncryptedTmp) { + fullySignedOrEncrypted = false; + } + + if (block.type() == NoPgpBlock && !block.text().trimmed().isEmpty()) { + fullySignedOrEncryptedTmp = false; + appendSubPart(MessagePart::Ptr(new MessagePart(mOtp, aCodec->toUnicode(block.text())))); + } else if (block.type() == PgpMessageBlock) { + EncryptedMessagePart::Ptr mp(new EncryptedMessagePart(mOtp, QString(), cryptProto, fromAddress, Q_NULLPTR)); + mp->setDecryptMessage(decryptMessage()); + mp->setIsEncrypted(true); + appendSubPart(mp); + if (!decryptMessage()) { + continue; + } + mp->startDecryption(block.text(), aCodec); + if (mp->partMetaData()->inProgress) { + continue; + } + } else if (block.type() == ClearsignedBlock) { + SignedMessagePart::Ptr mp(new SignedMessagePart(mOtp, QString(), cryptProto, fromAddress, Q_NULLPTR)); + appendSubPart(mp); + mp->startVerification(block.text(), aCodec); + } else { + continue; + } + + const auto mp = subParts().last().staticCast(); + const PartMetaData *messagePart(mp->partMetaData()); + + if (!messagePart->isEncrypted && !messagePart->isSigned && !block.text().trimmed().isEmpty()) { + mp->setText(aCodec->toUnicode(block.text())); + } + + if (messagePart->isEncrypted) { + mEncryptionState = KMMsgPartiallyEncrypted; + } + + if (messagePart->isSigned) { + mSignatureState = KMMsgPartiallySigned; + } + } + + //Do we have an fully Signed/Encrypted Message? + if (fullySignedOrEncrypted) { + if (mSignatureState == KMMsgPartiallySigned) { + mSignatureState = KMMsgFullySigned; + } + if (mEncryptionState == KMMsgPartiallyEncrypted) { + mEncryptionState = KMMsgFullyEncrypted; + } + } + } +} + +KMMsgEncryptionState TextMessagePart::encryptionState() const +{ + return mEncryptionState; +} + +KMMsgSignatureState TextMessagePart::signatureState() const +{ + return mSignatureState; +} + +bool TextMessagePart::isHidden() const +{ + return mIsHidden; +} + +bool TextMessagePart::showLink() const +{ + return mShowLink; +} + +bool TextMessagePart::showTextFrame() const +{ + return mDrawFrame; +} + +//-----AttachmentMessageBlock---------------------- + +AttachmentMessagePart::AttachmentMessagePart(ObjectTreeParser *otp, KMime::Content *node, bool drawFrame, bool showLink, bool decryptMessage) + : TextMessagePart(otp, node, drawFrame, showLink, decryptMessage) + , mIsImage(false) + , mNeverDisplayInline(false) +{ + +} + +AttachmentMessagePart::~AttachmentMessagePart() +{ + +} + +bool AttachmentMessagePart::neverDisplayInline() const +{ + return mNeverDisplayInline; +} + +void AttachmentMessagePart::setNeverDisplayInline(bool displayInline) +{ + mNeverDisplayInline = displayInline; +} + +bool AttachmentMessagePart::isImage() const +{ + return mIsImage; +} + +void AttachmentMessagePart::setIsImage(bool image) +{ + mIsImage = image; +} + +IconType AttachmentMessagePart::asIcon() const +{ + const AttachmentStrategy *const as = mOtp->attachmentStrategy(); + const bool defaultHidden(as && as->defaultDisplay(mNode) == AttachmentStrategy::None); + const bool showOnlyOneMimePart(mOtp->showOnlyOneMimePart()); + auto preferredMode = source()->preferredMode(); + bool isHtmlPreferred = (preferredMode == Util::Html) || (preferredMode == Util::MultipartHtml); + + QByteArray mediaType("text"); + QByteArray subType("plain"); + if (mNode->contentType(false) && !mNode->contentType()->mediaType().isEmpty() && + !mNode->contentType()->subType().isEmpty()) { + mediaType = mNode->contentType()->mediaType(); + subType = mNode->contentType()->subType(); + } + const bool isTextPart = (mediaType == QByteArray("text")); + + bool defaultAsIcon = true; + if (!neverDisplayInline()) { + if (as) { + defaultAsIcon = as->defaultDisplay(mNode) == AttachmentStrategy::AsIcon; + } + } + if (isImage() && showOnlyOneMimePart && !neverDisplayInline()) { + defaultAsIcon = false; + } + + // neither image nor text -> show as icon + if (!isImage() && !isTextPart) { + defaultAsIcon = true; + } + + if (isTextPart) { + if (as && as->defaultDisplay(mNode) != AttachmentStrategy::Inline) { + return MimeTreeParser::IconExternal; + } + return MimeTreeParser::NoIcon; + } else { + if (isImage() && isHtmlPreferred && + mNode->parent() && mNode->parent()->contentType()->subType() == "related") { + return MimeTreeParser::IconInline; + } + + if (defaultHidden && !showOnlyOneMimePart && mNode->parent()) { + return MimeTreeParser::IconInline; + } + + if (defaultAsIcon) { + return MimeTreeParser::IconExternal; + } else if (isImage()) { + return MimeTreeParser::IconInline; + } else { + return MimeTreeParser::NoIcon; + } + } +} + +bool AttachmentMessagePart::isHidden() const +{ + const AttachmentStrategy *const as = mOtp->attachmentStrategy(); + const bool defaultHidden(as && as->defaultDisplay(mNode) == AttachmentStrategy::None); + const bool showOnlyOneMimePart(mOtp->showOnlyOneMimePart()); + auto preferredMode = source()->preferredMode(); + bool isHtmlPreferred = (preferredMode == Util::Html) || (preferredMode == Util::MultipartHtml); + + QByteArray mediaType("text"); + QByteArray subType("plain"); + if (mNode->contentType(false) && !mNode->contentType()->mediaType().isEmpty() && + !mNode->contentType()->subType().isEmpty()) { + mediaType = mNode->contentType()->mediaType(); + subType = mNode->contentType()->subType(); + } + const bool isTextPart = (mediaType == QByteArray("text")); + + bool defaultAsIcon = true; + if (!neverDisplayInline()) { + if (as) { + defaultAsIcon = as->defaultDisplay(mNode) == AttachmentStrategy::AsIcon; + } + } + if (isImage() && showOnlyOneMimePart && !neverDisplayInline()) { + defaultAsIcon = false; + } + + // neither image nor text -> show as icon + if (!isImage() && !isTextPart) { + defaultAsIcon = true; + } + + bool hidden(false); + if (isTextPart) { + hidden = defaultHidden && !showOnlyOneMimePart; + } else { + if (isImage() && isHtmlPreferred && + mNode->parent() && mNode->parent()->contentType()->subType() == "related") { + hidden = true; + } else { + hidden = defaultHidden && !showOnlyOneMimePart && mNode->parent(); + hidden |= defaultAsIcon && (defaultHidden || showOnlyOneMimePart); + } + } + mOtp->nodeHelper()->setNodeDisplayedHidden(mNode, hidden); + return hidden; +} + +//-----HtmlMessageBlock---------------------- + +HtmlMessagePart::HtmlMessagePart(ObjectTreeParser *otp, KMime::Content *node, Interface::ObjectTreeSource *source) + : MessagePart(otp, QString()) + , mNode(node) + , mSource(source) +{ + if (!mNode) { + qCWarning(MIMETREEPARSER_LOG) << "not a valid node"; + return; + } + + const QByteArray partBody(mNode->decodedContent()); + mBodyHTML = mOtp->codecFor(mNode)->toUnicode(partBody); + mCharset = NodeHelper::charset(mNode); +} + +HtmlMessagePart::~HtmlMessagePart() +{ +} + +void HtmlMessagePart::fix() const +{ + mOtp->mHtmlContent += mBodyHTML; + mOtp->mHtmlContentCharset = mCharset; +} + +QString HtmlMessagePart::text() const +{ + return mBodyHTML; +} + +bool HtmlMessagePart::isHtml() const +{ + return true; +} + +//-----MimeMessageBlock---------------------- + +MimeMessagePart::MimeMessagePart(ObjectTreeParser *otp, KMime::Content *node, bool onlyOneMimePart) + : MessagePart(otp, QString()) + , mNode(node) + , mOnlyOneMimePart(onlyOneMimePart) +{ + if (!mNode) { + qCWarning(MIMETREEPARSER_LOG) << "not a valid node"; + return; + } + + parseInternal(mNode, mOnlyOneMimePart); +} + +MimeMessagePart::~MimeMessagePart() +{ + +} + +QString MimeMessagePart::text() const +{ + return renderInternalText(); +} + +QString MimeMessagePart::plaintextContent() const +{ + return QString(); +} + +QString MimeMessagePart::htmlContent() const +{ + return QString(); +} + +//-----AlternativeMessagePart---------------------- + +AlternativeMessagePart::AlternativeMessagePart(ObjectTreeParser *otp, KMime::Content *node, Util::HtmlMode preferredMode) + : MessagePart(otp, QString()) + , mNode(node) + , mPreferredMode(preferredMode) +{ + KMime::Content *dataIcal = findTypeInDirectChilds(mNode, "text/calendar"); + KMime::Content *dataHtml = findTypeInDirectChilds(mNode, "text/html"); + KMime::Content *dataText = findTypeInDirectChilds(mNode, "text/plain"); + + if (!dataHtml) { + // If we didn't find the HTML part as the first child of the multipart/alternative, it might + // be that this is a HTML message with images, and text/plain and multipart/related are the + // immediate children of this multipart/alternative node. + // In this case, the HTML node is a child of multipart/related. + dataHtml = findTypeInDirectChilds(mNode, "multipart/related"); + + // Still not found? Stupid apple mail actually puts the attachments inside of the + // multipart/alternative, which is wrong. Therefore we also have to look for multipart/mixed + // here. + // Do this only when prefering HTML mail, though, since otherwise the attachments are hidden + // when displaying plain text. + if (!dataHtml) { + dataHtml = findTypeInDirectChilds(mNode, "multipart/mixed"); + } + } + + if (dataIcal) { + mChildNodes[Util::MultipartIcal] = dataIcal; + } + + if (dataText) { + mChildNodes[Util::MultipartPlain] = dataText; + } + + if (dataHtml) { + mChildNodes[Util::MultipartHtml] = dataHtml; + } + + if (mChildNodes.isEmpty()) { + qCWarning(MIMETREEPARSER_LOG) << "no valid nodes"; + return; + } + + QMapIterator i(mChildNodes); + while (i.hasNext()) { + i.next(); + mChildParts[i.key()] = MimeMessagePart::Ptr(new MimeMessagePart(mOtp, i.value(), true)); + } +} + +AlternativeMessagePart::~AlternativeMessagePart() +{ + +} + +Util::HtmlMode AlternativeMessagePart::preferredMode() const +{ + return mPreferredMode; +} + +QList AlternativeMessagePart::availableModes() +{ + return mChildParts.keys(); +} + +QString AlternativeMessagePart::text() const +{ + if (mChildParts.contains(Util::MultipartPlain)) { + return mChildParts[Util::MultipartPlain]->text(); + } + return QString(); +} + +void AlternativeMessagePart::fix() const +{ + if (mChildParts.contains(Util::MultipartPlain)) { + mChildParts[Util::MultipartPlain]->fix(); + } + + const auto mode = preferredMode(); + if (mode != Util::MultipartPlain && mChildParts.contains(mode)) { + mChildParts[mode]->fix(); + } +} + +void AlternativeMessagePart::copyContentFrom() const +{ + if (mChildParts.contains(Util::MultipartPlain)) { + mChildParts[Util::MultipartPlain]->copyContentFrom(); + } + + const auto mode = preferredMode(); + if (mode != Util::MultipartPlain && mChildParts.contains(mode)) { + mChildParts[mode]->copyContentFrom(); + } +} + +bool AlternativeMessagePart::isHtml() const +{ + return mChildParts.contains(Util::MultipartHtml); +} + +QString AlternativeMessagePart::plaintextContent() const +{ + return text(); +} + +QString AlternativeMessagePart::htmlContent() const +{ + if (mChildParts.contains(Util::MultipartHtml)) { + return mChildParts[Util::MultipartHtml]->text(); + } else { + return plaintextContent(); + } +} + +//-----CertMessageBlock---------------------- + +CertMessagePart::CertMessagePart(ObjectTreeParser *otp, KMime::Content *node, const QGpgME::Protocol *cryptoProto, bool autoImport) + : MessagePart(otp, QString()) + , mNode(node) + , mAutoImport(autoImport) + , mCryptoProto(cryptoProto) +{ + if (!mNode) { + qCWarning(MIMETREEPARSER_LOG) << "not a valid node"; + return; + } + + if (!mAutoImport) { + return; + } + + const QByteArray certData = node->decodedContent(); + + QGpgME::ImportJob *import = mCryptoProto->importJob(); + QGpgMEJobExecutor executor; + mImportResult = executor.exec(import, certData); +} + +CertMessagePart::~CertMessagePart() +{ + +} + +QString CertMessagePart::text() const +{ + return QString(); +} + +//-----SignedMessageBlock--------------------- +SignedMessagePart::SignedMessagePart(ObjectTreeParser *otp, + const QString &text, + const QGpgME::Protocol *cryptoProto, + const QString &fromAddress, + KMime::Content *node) + : MessagePart(otp, text) + , mCryptoProto(cryptoProto) + , mFromAddress(fromAddress) + , mNode(node) +{ + mMetaData.technicalProblem = (mCryptoProto == 0); + mMetaData.isSigned = true; + mMetaData.isGoodSignature = false; + mMetaData.keyTrust = GpgME::Signature::Unknown; + mMetaData.status = i18n("Wrong Crypto Plug-In."); + mMetaData.status_code = GPGME_SIG_STAT_NONE; +} + +SignedMessagePart::~SignedMessagePart() +{ + +} + +void SignedMessagePart::setIsSigned(bool isSigned) +{ + mMetaData.isSigned = isSigned; +} + +bool SignedMessagePart::isSigned() const +{ + return mMetaData.isSigned; +} + +bool SignedMessagePart::okVerify(const QByteArray &data, const QByteArray &signature, KMime::Content *textNode) +{ + NodeHelper *nodeHelper = mOtp->nodeHelper(); + Interface::ObjectTreeSource *_source = source(); + + mMetaData.isSigned = false; + mMetaData.technicalProblem = (mCryptoProto == 0); + mMetaData.keyTrust = GpgME::Signature::Unknown; + mMetaData.status = i18n("Wrong Crypto Plug-In."); + mMetaData.status_code = GPGME_SIG_STAT_NONE; + + const QByteArray mementoName = "verification"; + + CryptoBodyPartMemento *m = dynamic_cast(nodeHelper->bodyPartMemento(mNode, mementoName)); + Q_ASSERT(!m || mCryptoProto); //No CryptoPlugin and having a bodyPartMemento -> there is something completely wrong + + if (!m && mCryptoProto) { + if (!signature.isEmpty()) { + QGpgME::VerifyDetachedJob *job = mCryptoProto->verifyDetachedJob(); + if (job) { + m = new VerifyDetachedBodyPartMemento(job, mCryptoProto->keyListJob(), signature, data); + } + } else { + QGpgME::VerifyOpaqueJob *job = mCryptoProto->verifyOpaqueJob(); + if (job) { + m = new VerifyOpaqueBodyPartMemento(job, mCryptoProto->keyListJob(), data); + } + } + if (m) { + if (mOtp->allowAsync()) { + QObject::connect(m, &CryptoBodyPartMemento::update, + nodeHelper, &NodeHelper::update); + QObject::connect(m, SIGNAL(update(MimeTreeParser::UpdateMode)), + _source->sourceObject(), SLOT(update(MimeTreeParser::UpdateMode))); + + if (m->start()) { + mMetaData.inProgress = true; + mOtp->mHasPendingAsyncJobs = true; + } + } else { + m->exec(); + } + nodeHelper->setBodyPartMemento(mNode, mementoName, m); + } + } else if (m->isRunning()) { + mMetaData.inProgress = true; + mOtp->mHasPendingAsyncJobs = true; + } else { + mMetaData.inProgress = false; + mOtp->mHasPendingAsyncJobs = false; + } + + if (m && !mMetaData.inProgress) { + if (!signature.isEmpty()) { + mVerifiedText = data; + } + setVerificationResult(m, textNode); + } + + if (!m && !mMetaData.inProgress) { + QString errorMsg; + QString cryptPlugLibName; + QString cryptPlugDisplayName; + if (mCryptoProto) { + cryptPlugLibName = mCryptoProto->name(); + cryptPlugDisplayName = mCryptoProto->displayName(); + } + + if (!mCryptoProto) { + if (cryptPlugDisplayName.isEmpty()) { + errorMsg = i18n("No appropriate crypto plug-in was found."); + } else { + errorMsg = i18nc("%1 is either 'OpenPGP' or 'S/MIME'", + "No %1 plug-in was found.", + cryptPlugDisplayName); + } + } else { + errorMsg = i18n("Crypto plug-in \"%1\" cannot verify signatures.", + cryptPlugLibName); + } + mMetaData.errorText = i18n("The message is signed, but the " + "validity of the signature cannot be " + "verified.
" + "Reason: %1", + errorMsg); + } + + return mMetaData.isSigned; +} + +static int signatureToStatus(const GpgME::Signature &sig) +{ + switch (sig.status().code()) { + case GPG_ERR_NO_ERROR: + return GPGME_SIG_STAT_GOOD; + case GPG_ERR_BAD_SIGNATURE: + return GPGME_SIG_STAT_BAD; + case GPG_ERR_NO_PUBKEY: + return GPGME_SIG_STAT_NOKEY; + case GPG_ERR_NO_DATA: + return GPGME_SIG_STAT_NOSIG; + case GPG_ERR_SIG_EXPIRED: + return GPGME_SIG_STAT_GOOD_EXP; + case GPG_ERR_KEY_EXPIRED: + return GPGME_SIG_STAT_GOOD_EXPKEY; + default: + return GPGME_SIG_STAT_ERROR; + } +} + +QString prettifyDN(const char *uid) +{ +#if GPGME_VERSION_NUMBER < 0x010702 + return Kleo::DN(uid).prettyDN(); +#else + return QGpgME::DN(uid).prettyDN(); +#endif +} + +void SignedMessagePart::sigStatusToMetaData() +{ + GpgME::Key key; + if (mMetaData.isSigned) { + GpgME::Signature signature = mSignatures.front(); + mMetaData.status_code = signatureToStatus(signature); + mMetaData.isGoodSignature = mMetaData.status_code & GPGME_SIG_STAT_GOOD; + // save extended signature status flags + mMetaData.sigSummary = signature.summary(); + + if (mMetaData.isGoodSignature && !key.keyID()) { + // Search for the key by it's fingerprint so that we can check for + // trust etc. + QGpgME::KeyListJob *job = mCryptoProto->keyListJob(false); // local, no sigs + if (!job) { + qCDebug(MIMETREEPARSER_LOG) << "The Crypto backend does not support listing keys. "; + } else { + std::vector found_keys; + // As we are local it is ok to make this synchronous + GpgME::KeyListResult res = job->exec(QStringList(QLatin1String(signature.fingerprint())), false, found_keys); + if (res.error()) { + qCDebug(MIMETREEPARSER_LOG) << "Error while searching key for Fingerprint: " << signature.fingerprint(); + } + if (found_keys.size() > 1) { + // Should not Happen + qCDebug(MIMETREEPARSER_LOG) << "Oops: Found more then one Key for Fingerprint: " << signature.fingerprint(); + } + if (found_keys.size() != 1) { + // Should not Happen at this point + qCDebug(MIMETREEPARSER_LOG) << "Oops: Found no Key for Fingerprint: " << signature.fingerprint(); + } else { + key = found_keys[0]; + } + } + } + + if (key.keyID()) { + mMetaData.keyId = key.keyID(); + } + if (mMetaData.keyId.isEmpty()) { + mMetaData.keyId = signature.fingerprint(); + } + mMetaData.keyTrust = signature.validity(); + if (key.numUserIDs() > 0 && key.userID(0).id()) { + mMetaData.signer = prettifyDN(key.userID(0).id()); + } + for (uint iMail = 0; iMail < key.numUserIDs(); ++iMail) { + // The following if /should/ always result in TRUE but we + // won't trust implicitely the plugin that gave us these data. + if (key.userID(iMail).email()) { + QString email = QString::fromUtf8(key.userID(iMail).email()); + // ### work around gpgme 0.3.QString text() const Q_DECL_OVERRIDE;x / cryptplug bug where the + // ### email addresses are specified as angle-addr, not addr-spec: + if (email.startsWith(QLatin1Char('<')) && email.endsWith(QLatin1Char('>'))) { + email = email.mid(1, email.length() - 2); + } + if (!email.isEmpty()) { + mMetaData.signerMailAddresses.append(email); + } + } + } + + if (signature.creationTime()) { + mMetaData.creationTime.setTime_t(signature.creationTime()); + } else { + mMetaData.creationTime = QDateTime(); + } + if (mMetaData.signer.isEmpty()) { + if (key.numUserIDs() > 0 && key.userID(0).name()) { + mMetaData.signer = prettifyDN(key.userID(0).name()); + } + if (!mMetaData.signerMailAddresses.empty()) { + if (mMetaData.signer.isEmpty()) { + mMetaData.signer = mMetaData.signerMailAddresses.front(); + } else { + mMetaData.signer += QLatin1String(" <") + mMetaData.signerMailAddresses.front() + QLatin1Char('>'); + } + } + } + } +} + +void SignedMessagePart::startVerification(const QByteArray &text, const QTextCodec *aCodec) +{ + startVerificationDetached(text, Q_NULLPTR, QByteArray()); + + if (!mNode && mMetaData.isSigned) { + setText(aCodec->toUnicode(mVerifiedText)); + } +} + +void SignedMessagePart::startVerificationDetached(const QByteArray &text, KMime::Content *textNode, const QByteArray &signature) +{ + mMetaData.isEncrypted = false; + mMetaData.isDecryptable = false; + + if (textNode) { + parseInternal(textNode, false); + } + + okVerify(text, signature, textNode); + + if (!mMetaData.isSigned) { + mMetaData.creationTime = QDateTime(); + } +} + +void SignedMessagePart::setVerificationResult(const CryptoBodyPartMemento *m, KMime::Content *textNode) +{ + { + const auto vm = dynamic_cast(m); + if (vm) { + mSignatures = vm->verifyResult().signatures(); + } + } + { + const auto vm = dynamic_cast(m); + if (vm) { + mVerifiedText = vm->plainText(); + mSignatures = vm->verifyResult().signatures(); + } + } + { + const auto vm = dynamic_cast(m); + if (vm) { + mVerifiedText = vm->plainText(); + mSignatures = vm->verifyResult().signatures(); + } + } + mMetaData.auditLogError = m->auditLogError(); + mMetaData.auditLog = m->auditLogAsHtml(); + mMetaData.isSigned = !mSignatures.empty(); + + if (mMetaData.isSigned) { + sigStatusToMetaData(); + if (mNode) { + mOtp->nodeHelper()->setSignatureState(mNode, KMMsgFullySigned); + if (!textNode) { + mOtp->mNodeHelper->setPartMetaData(mNode, mMetaData); + + if (!mVerifiedText.isEmpty()) { + auto tempNode = new KMime::Content(); + tempNode->setContent(KMime::CRLFtoLF(mVerifiedText.constData())); + tempNode->parse(); + + if (!tempNode->head().isEmpty()) { + tempNode->contentDescription()->from7BitString("signed data"); + } + mOtp->mNodeHelper->attachExtraContent(mNode, tempNode); + + parseInternal(tempNode, false); + } + } + } + } +} + +QString SignedMessagePart::plaintextContent() const +{ + if (!mNode) { + return MessagePart::text(); + } else { + return QString(); + } +} + +QString SignedMessagePart::htmlContent() const +{ + if (!mNode) { + return MessagePart::text(); + } else { + return QString(); + } +} + +//-----CryptMessageBlock--------------------- +EncryptedMessagePart::EncryptedMessagePart(ObjectTreeParser *otp, + const QString &text, + const QGpgME::Protocol *cryptoProto, + const QString &fromAddress, + KMime::Content *node) + : MessagePart(otp, text) + , mPassphraseError(false) + , mNoSecKey(false) + , mCryptoProto(cryptoProto) + , mFromAddress(fromAddress) + , mNode(node) + , mDecryptMessage(false) +{ + mMetaData.technicalProblem = (mCryptoProto == 0); + mMetaData.isSigned = false; + mMetaData.isGoodSignature = false; + mMetaData.isEncrypted = false; + mMetaData.isDecryptable = false; + mMetaData.keyTrust = GpgME::Signature::Unknown; + mMetaData.status = i18n("Wrong Crypto Plug-In."); + mMetaData.status_code = GPGME_SIG_STAT_NONE; +} + +EncryptedMessagePart::~EncryptedMessagePart() +{ + +} + +void EncryptedMessagePart::setDecryptMessage(bool decrypt) +{ + mDecryptMessage = decrypt; +} + +bool EncryptedMessagePart::decryptMessage() const +{ + return mDecryptMessage; +} + +void EncryptedMessagePart::setIsEncrypted(bool encrypted) +{ + mMetaData.isEncrypted = encrypted; +} + +bool EncryptedMessagePart::isEncrypted() const +{ + return mMetaData.isEncrypted; +} + +bool EncryptedMessagePart::isDecryptable() const +{ + return mMetaData.isDecryptable; +} + +bool EncryptedMessagePart::passphraseError() const +{ + return mPassphraseError; +} + +void EncryptedMessagePart::startDecryption(const QByteArray &text, const QTextCodec *aCodec) +{ + KMime::Content *content = new KMime::Content; + content->setBody(text); + content->parse(); + + startDecryption(content); + + if (!mMetaData.inProgress && mMetaData.isDecryptable) { + if (hasSubParts()) { + auto _mp = (subParts()[0]).dynamicCast(); + if (_mp) { + _mp->setText(aCodec->toUnicode(mDecryptedData)); + } else { + setText(aCodec->toUnicode(mDecryptedData)); + } + } else { + setText(aCodec->toUnicode(mDecryptedData)); + } + } +} + +bool EncryptedMessagePart::okDecryptMIME(KMime::Content &data) +{ + mPassphraseError = false; + mMetaData.inProgress = false; + mMetaData.errorText.clear(); + mMetaData.auditLogError = GpgME::Error(); + mMetaData.auditLog.clear(); + bool bDecryptionOk = false; + bool cannotDecrypt = false; + Interface::ObjectTreeSource *_source = source(); + NodeHelper *nodeHelper = mOtp->nodeHelper(); + + Q_ASSERT(decryptMessage()); + + // Check whether the memento contains a result from last time: + const DecryptVerifyBodyPartMemento *m + = dynamic_cast(nodeHelper->bodyPartMemento(&data, "decryptverify")); + + Q_ASSERT(!m || mCryptoProto); //No CryptoPlugin and having a bodyPartMemento -> there is something completely wrong + + if (!m && mCryptoProto) { + QGpgME::DecryptVerifyJob *job = mCryptoProto->decryptVerifyJob(); + if (!job) { + cannotDecrypt = true; + } else { + const QByteArray ciphertext = data.decodedContent(); + DecryptVerifyBodyPartMemento *newM + = new DecryptVerifyBodyPartMemento(job, ciphertext); + if (mOtp->allowAsync()) { + QObject::connect(newM, &CryptoBodyPartMemento::update, + nodeHelper, &NodeHelper::update); + QObject::connect(newM, SIGNAL(update(MimeTreeParser::UpdateMode)), _source->sourceObject(), + SLOT(update(MimeTreeParser::UpdateMode))); + if (newM->start()) { + mMetaData.inProgress = true; + mOtp->mHasPendingAsyncJobs = true; + } else { + m = newM; + } + } else { + newM->exec(); + m = newM; + } + nodeHelper->setBodyPartMemento(&data, "decryptverify", newM); + } + } else if (m->isRunning()) { + mMetaData.inProgress = true; + mOtp->mHasPendingAsyncJobs = true; + m = Q_NULLPTR; + } + + if (m) { + const QByteArray &plainText = m->plainText(); + const GpgME::DecryptionResult &decryptResult = m->decryptResult(); + const GpgME::VerificationResult &verifyResult = m->verifyResult(); + mMetaData.isSigned = verifyResult.signatures().size() > 0; + + if (verifyResult.signatures().size() > 0) { + auto subPart = SignedMessagePart::Ptr(new SignedMessagePart(mOtp, MessagePart::text(), mCryptoProto, mFromAddress, mNode)); + subPart->setVerificationResult(m, Q_NULLPTR); + appendSubPart(subPart); + } + + mDecryptRecipients = decryptResult.recipients(); + bDecryptionOk = !decryptResult.error(); +// std::stringstream ss; +// ss << decryptResult << '\n' << verifyResult; +// qCDebug(MIMETREEPARSER_LOG) << ss.str().c_str(); + + if (!bDecryptionOk && mMetaData.isSigned) { + //Only a signed part + mMetaData.isEncrypted = false; + bDecryptionOk = true; + mDecryptedData = plainText; + } else { + mPassphraseError = decryptResult.error().isCanceled() || decryptResult.error().code() == GPG_ERR_NO_SECKEY; + mMetaData.isEncrypted = decryptResult.error().code() != GPG_ERR_NO_DATA; + mMetaData.errorText = QString::fromLocal8Bit(decryptResult.error().asString()); + if (mMetaData.isEncrypted && decryptResult.numRecipients() > 0) { + mMetaData.keyId = decryptResult.recipient(0).keyID(); + } + + if (bDecryptionOk) { + mDecryptedData = plainText; + } else { + mNoSecKey = true; + foreach (const GpgME::DecryptionResult::Recipient &recipient, decryptResult.recipients()) { + mNoSecKey &= (recipient.status().code() == GPG_ERR_NO_SECKEY); + } + if (!mPassphraseError && !mNoSecKey) { // GpgME do not detect passphrase error correctly + mPassphraseError = true; + } + } + } + } + + if (!bDecryptionOk) { + QString cryptPlugLibName; + if (mCryptoProto) { + cryptPlugLibName = mCryptoProto->name(); + } + + if (!mCryptoProto) { + mMetaData.errorText = i18n("No appropriate crypto plug-in was found."); + } else if (cannotDecrypt) { + mMetaData.errorText = i18n("Crypto plug-in \"%1\" cannot decrypt messages.", + cryptPlugLibName); + } else if (!passphraseError()) { + mMetaData.errorText = i18n("Crypto plug-in \"%1\" could not decrypt the data.", cryptPlugLibName) + + QLatin1String("
") + + i18n("Error: %1", mMetaData.errorText); + } + } + return bDecryptionOk; +} + +void EncryptedMessagePart::startDecryption(KMime::Content *data) +{ + if (!mNode && !data) { + return; + } + + if (!data) { + data = mNode; + } + + mMetaData.isEncrypted = true; + + bool bOkDecrypt = okDecryptMIME(*data); + + if (mMetaData.inProgress) { + return; + } + mMetaData.isDecryptable = bOkDecrypt; + + if (!mMetaData.isDecryptable) { + setText(QString::fromUtf8(mDecryptedData.constData())); + } + + if (mMetaData.isEncrypted && !decryptMessage()) { + mMetaData.isDecryptable = true; + } + + if (mNode && !mMetaData.isSigned) { + mOtp->mNodeHelper->setPartMetaData(mNode, mMetaData); + + if (decryptMessage()) { + auto tempNode = new KMime::Content(); + tempNode->setContent(KMime::CRLFtoLF(mDecryptedData.constData())); + tempNode->parse(); + + if (!tempNode->head().isEmpty()) { + tempNode->contentDescription()->from7BitString("encrypted data"); + } + mOtp->mNodeHelper->attachExtraContent(mNode, tempNode); + + parseInternal(tempNode, false); + } + } +} + +QString EncryptedMessagePart::plaintextContent() const +{ + if (!mNode) { + return MessagePart::text(); + } else { + return QString(); + } +} + +QString EncryptedMessagePart::htmlContent() const +{ + if (!mNode) { + return MessagePart::text(); + } else { + return QString(); + } +} + +QString EncryptedMessagePart::text() const +{ + if (hasSubParts()) { + auto _mp = (subParts()[0]).dynamicCast(); + if (_mp) { + return _mp->text(); + } else { + return MessagePart::text(); + } + } else { + return MessagePart::text(); + } +} + +EncapsulatedRfc822MessagePart::EncapsulatedRfc822MessagePart(ObjectTreeParser *otp, KMime::Content *node, const KMime::Message::Ptr &message) + : MessagePart(otp, QString()) + , mMessage(message) + , mNode(node) +{ + mMetaData.isEncrypted = false; + mMetaData.isSigned = false; + mMetaData.isEncapsulatedRfc822Message = true; + + mOtp->nodeHelper()->setNodeDisplayedEmbedded(mNode, true); + mOtp->nodeHelper()->setPartMetaData(mNode, mMetaData); + + if (!mMessage) { + qCWarning(MIMETREEPARSER_LOG) << "Node is of type message/rfc822 but doesn't have a message!"; + return; + } + + // The link to "Encapsulated message" is clickable, therefore the temp file needs to exists, + // since the user can click the link and expect to have normal attachment operations there. + mOtp->nodeHelper()->writeNodeToTempFile(message.data()); + + parseInternal(message.data(), false); +} + +EncapsulatedRfc822MessagePart::~EncapsulatedRfc822MessagePart() +{ + +} + +QString EncapsulatedRfc822MessagePart::text() const +{ + return renderInternalText(); +} + +void EncapsulatedRfc822MessagePart::copyContentFrom() const +{ +} + +void EncapsulatedRfc822MessagePart::fix() const +{ +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/messagepart.h kf5-messagelib-16.12.3/mimetreeparser/src/viewer/messagepart.h --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/messagepart.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/messagepart.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,424 @@ +/* + Copyright (c) 2015 Sandro Knauß + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_MESSAGEPART_H__ +#define __MIMETREEPARSER_MESSAGEPART_H__ + +#include "mimetreeparser_export.h" + +#include "mimetreeparser/bodypartformatter.h" +#include "mimetreeparser/util.h" + +#include + +#include +#include +#include + +#include +#include + +class QTextCodec; +class PartPrivate; + +namespace GpgME +{ +class ImportResult; +} + +namespace QGpgME +{ +class Protocol; +} + +namespace KMime +{ +class Content; +} + +namespace MimeTreeParser +{ +class ObjectTreeParser; +class HtmlWriter; +class HTMLBlock; +typedef QSharedPointer HTMLBlockPtr; +class CryptoBodyPartMemento; +class MultiPartAlternativeBodyPartFormatter; +namespace Interface +{ +class ObjectTreeSource; +} + +class MIMETREEPARSER_EXPORT MessagePart : public Interface::MessagePart +{ + Q_OBJECT + Q_PROPERTY(bool attachment READ isAttachment) + Q_PROPERTY(bool root READ isRoot) + Q_PROPERTY(bool isHtml READ isHtml) + Q_PROPERTY(bool isHidden READ isHidden) +public: + typedef QSharedPointer Ptr; + MessagePart(ObjectTreeParser *otp, + const QString &text); + + virtual ~MessagePart(); + + virtual QString text() const Q_DECL_OVERRIDE; + void setText(const QString &text); + void setAttachmentFlag(KMime::Content *node); + bool isAttachment() const; + + void setIsRoot(bool root); + bool isRoot() const; + + virtual bool isHtml() const; + virtual bool isHidden() const; + + PartMetaData *partMetaData(); + + /* only a function that should be removed if the refactoring is over */ + virtual void fix() const; + virtual void copyContentFrom() const; + + void appendSubPart(const Interface::MessagePart::Ptr &messagePart); + const QVector &subParts() const; + bool hasSubParts() const; + + HtmlWriter *htmlWriter() const Q_DECL_OVERRIDE; + void setHtmlWriter(HtmlWriter *htmlWriter) const Q_DECL_OVERRIDE; + + Interface::ObjectTreeSource *source() const; + KMime::Content *attachmentNode() const; + +protected: + void parseInternal(KMime::Content *node, bool onlyOneMimePart); + QString renderInternalText() const; + + QString mText; + ObjectTreeParser *mOtp; + PartMetaData mMetaData; + +private: + QVector mBlocks; + + KMime::Content *mAttachmentNode; + bool mRoot; +}; + +class MIMETREEPARSER_EXPORT MimeMessagePart : public MessagePart +{ + Q_OBJECT +public: + typedef QSharedPointer Ptr; + MimeMessagePart(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node, bool onlyOneMimePart); + virtual ~MimeMessagePart(); + + QString text() const Q_DECL_OVERRIDE; + + QString plaintextContent() const Q_DECL_OVERRIDE; + QString htmlContent() const Q_DECL_OVERRIDE; +private: + KMime::Content *mNode; + bool mOnlyOneMimePart; + + friend class AlternativeMessagePart; + friend class ::PartPrivate; +}; + +class MIMETREEPARSER_EXPORT MessagePartList : public MessagePart +{ + Q_OBJECT +public: + typedef QSharedPointer Ptr; + MessagePartList(MimeTreeParser::ObjectTreeParser *otp); + virtual ~MessagePartList(); + + QString text() const Q_DECL_OVERRIDE; + + QString plaintextContent() const Q_DECL_OVERRIDE; + QString htmlContent() const Q_DECL_OVERRIDE; +private: +}; + +enum IconType { + NoIcon = 0, + IconExternal, + IconInline +}; + +class MIMETREEPARSER_EXPORT TextMessagePart : public MessagePartList +{ + Q_OBJECT +public: + typedef QSharedPointer Ptr; + TextMessagePart(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node, bool drawFrame, bool showLink, bool decryptMessage); + virtual ~TextMessagePart(); + + KMMsgSignatureState signatureState() const; + KMMsgEncryptionState encryptionState() const; + + bool decryptMessage() const; + + bool isHidden() const Q_DECL_OVERRIDE; + + bool showLink() const; + bool showTextFrame() const; + +protected: + KMime::Content *mNode; + +private: + void parseContent(); + + KMMsgSignatureState mSignatureState; + KMMsgEncryptionState mEncryptionState; + bool mDrawFrame; + bool mShowLink; + bool mDecryptMessage; + bool mIsHidden; + + friend class DefaultRendererPrivate; + friend class ObjectTreeParser; + friend class ::PartPrivate; +}; + +class MIMETREEPARSER_EXPORT AttachmentMessagePart : public TextMessagePart +{ + Q_OBJECT +public: + typedef QSharedPointer Ptr; + AttachmentMessagePart(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node, bool drawFrame, bool showLink, bool decryptMessage); + virtual ~AttachmentMessagePart(); + + IconType asIcon() const; + bool neverDisplayInline() const; + void setNeverDisplayInline(bool displayInline); + bool isImage() const; + void setIsImage(bool image); + + bool isHidden() const Q_DECL_OVERRIDE; + +private: + bool mIsImage; + bool mNeverDisplayInline; +}; + +class MIMETREEPARSER_EXPORT HtmlMessagePart : public MessagePart +{ + Q_OBJECT +public: + typedef QSharedPointer Ptr; + HtmlMessagePart(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node, MimeTreeParser::Interface::ObjectTreeSource *source); + virtual ~HtmlMessagePart(); + + QString text() const Q_DECL_OVERRIDE; + + void fix() const Q_DECL_OVERRIDE; + bool isHtml() const Q_DECL_OVERRIDE; + +private: + KMime::Content *mNode; + Interface::ObjectTreeSource *mSource; + QString mBodyHTML; + QByteArray mCharset; + + friend class DefaultRendererPrivate; + friend class ::PartPrivate; +}; + +class MIMETREEPARSER_EXPORT AlternativeMessagePart : public MessagePart +{ + Q_OBJECT +public: + typedef QSharedPointer Ptr; + AlternativeMessagePart(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node, Util::HtmlMode preferredMode); + virtual ~AlternativeMessagePart(); + + QString text() const Q_DECL_OVERRIDE; + + Util::HtmlMode preferredMode() const; + + bool isHtml() const Q_DECL_OVERRIDE; + + QString plaintextContent() const Q_DECL_OVERRIDE; + QString htmlContent() const Q_DECL_OVERRIDE; + + QList availableModes(); + + void fix() const Q_DECL_OVERRIDE; + void copyContentFrom() const Q_DECL_OVERRIDE; +private: + KMime::Content *mNode; + + Util::HtmlMode mPreferredMode; + + QMap mChildNodes; + QMap mChildParts; + + friend class DefaultRendererPrivate; + friend class ObjectTreeParser; + friend class MultiPartAlternativeBodyPartFormatter; + friend class ::PartPrivate; +}; + +class MIMETREEPARSER_EXPORT CertMessagePart : public MessagePart +{ + Q_OBJECT +public: + typedef QSharedPointer Ptr; + CertMessagePart(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node, const QGpgME::Protocol *cryptoProto, bool autoImport); + virtual ~CertMessagePart(); + + QString text() const Q_DECL_OVERRIDE; + +private: + KMime::Content *mNode; + bool mAutoImport; + GpgME::ImportResult mImportResult; + const QGpgME::Protocol *mCryptoProto; + friend class DefaultRendererPrivate; +}; + +class MIMETREEPARSER_EXPORT EncapsulatedRfc822MessagePart : public MessagePart +{ + Q_OBJECT +public: + typedef QSharedPointer Ptr; + EncapsulatedRfc822MessagePart(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node, const KMime::Message::Ptr &message); + virtual ~EncapsulatedRfc822MessagePart(); + + QString text() const Q_DECL_OVERRIDE; + + void copyContentFrom() const Q_DECL_OVERRIDE; + void fix() const Q_DECL_OVERRIDE; +private: + const KMime::Message::Ptr mMessage; + KMime::Content *mNode; + + friend class DefaultRendererPrivate; +}; + +class MIMETREEPARSER_EXPORT EncryptedMessagePart : public MessagePart +{ + Q_OBJECT + Q_PROPERTY(bool decryptMessage READ decryptMessage WRITE setDecryptMessage) + Q_PROPERTY(bool isEncrypted READ isEncrypted) + Q_PROPERTY(bool passphraseError READ passphraseError) +public: + typedef QSharedPointer Ptr; + EncryptedMessagePart(ObjectTreeParser *otp, + const QString &text, + const QGpgME::Protocol *cryptoProto, + const QString &fromAddress, + KMime::Content *node); + + virtual ~EncryptedMessagePart(); + + QString text() const Q_DECL_OVERRIDE; + + void setDecryptMessage(bool decrypt); + bool decryptMessage() const; + + void setIsEncrypted(bool encrypted); + bool isEncrypted() const; + + bool isDecryptable() const; + + bool passphraseError() const; + + void startDecryption(const QByteArray &text, const QTextCodec *aCodec); + void startDecryption(KMime::Content *data = 0); + + QByteArray mDecryptedData; + + QString plaintextContent() const Q_DECL_OVERRIDE; + QString htmlContent() const Q_DECL_OVERRIDE; + +private: + /** Handles the dectyptioon of a given content + * returns true if the decryption was successfull + * if used in async mode, check if mMetaData.inProgress is true, it inicates a running decryption process. + */ + bool okDecryptMIME(KMime::Content &data); + +protected: + bool mPassphraseError; + bool mNoSecKey; + const QGpgME::Protocol *mCryptoProto; + QString mFromAddress; + KMime::Content *mNode; + bool mDecryptMessage; + QByteArray mVerifiedText; + std::vector mDecryptRecipients; + + friend class DefaultRendererPrivate; + friend class ::PartPrivate; +}; + +class MIMETREEPARSER_EXPORT SignedMessagePart : public MessagePart +{ + Q_OBJECT + Q_PROPERTY(bool isSigned READ isSigned) +public: + typedef QSharedPointer Ptr; + SignedMessagePart(ObjectTreeParser *otp, + const QString &text, + const QGpgME::Protocol *cryptoProto, + const QString &fromAddress, + KMime::Content *node); + + virtual ~SignedMessagePart(); + + void setIsSigned(bool isSigned); + bool isSigned() const; + + void startVerification(const QByteArray &text, const QTextCodec *aCodec); + void startVerificationDetached(const QByteArray &text, KMime::Content *textNode, const QByteArray &signature); + + QByteArray mDecryptedData; + std::vector mSignatures; + + QString plaintextContent() const Q_DECL_OVERRIDE; + QString htmlContent() const Q_DECL_OVERRIDE; + +private: + /** Handles the verification of data + * If signature is empty it is handled as inline signature otherwise as detached signature mode. + * Returns true if the verfication was successfull and the block is signed. + * If used in async mode, check if mMetaData.inProgress is true, it inicates a running verification process. + */ + bool okVerify(const QByteArray &data, const QByteArray &signature, KMime::Content *textNode); + + void sigStatusToMetaData(); + + void setVerificationResult(const CryptoBodyPartMemento *m, KMime::Content *textNode); +protected: + const QGpgME::Protocol *mCryptoProto; + QString mFromAddress; + KMime::Content *mNode; + QByteArray mVerifiedText; + + friend EncryptedMessagePart; + friend class DefaultRendererPrivate; + friend class ::PartPrivate; +}; + +} + +#endif //__MIMETREEPARSER_MESSAGEPART_H__ diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/nodehelper.cpp kf5-messagelib-16.12.3/mimetreeparser/src/viewer/nodehelper.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/nodehelper.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/nodehelper.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,1058 @@ +/* + Copyright (C) 2009 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.net + Copyright (c) 2009 Andras Mantia + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "nodehelper.h" +#include "mimetreeparser_debug.h" +#include "partmetadata.h" +#include "interfaces/bodypart.h" +#include "temporaryfile/attachmenttemporaryfilesdirs.h" + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace MimeTreeParser +{ + +QStringList replySubjPrefixes(QStringList() << QStringLiteral("Re\\s*:") << QStringLiteral("Re\\[\\d+\\]:") << QStringLiteral("Re\\d+:")); +QStringList forwardSubjPrefixes(QStringList() << QStringLiteral("Fwd:") << QStringLiteral("FW:")); + +NodeHelper::NodeHelper() : + mAttachmentFilesDir(new AttachmentTemporaryFilesDirs()) +{ + //TODO(Andras) add methods to modify these prefixes + + mLocalCodec = QTextCodec::codecForLocale(); + + // In the case of Japan. Japanese locale name is "eucjp" but + // The Japanese mail systems normally used "iso-2022-jp" of locale name. + // We want to change locale name from eucjp to iso-2022-jp at KMail only. + + // (Introduction to i18n, 6.6 Limit of Locale technology): + // EUC-JP is the de-facto standard for UNIX systems, ISO 2022-JP + // is the standard for Internet, and Shift-JIS is the encoding + // for Windows and Macintosh. + if (mLocalCodec) { + if (mLocalCodec->name().toLower() == "eucjp" +#if defined Q_OS_WIN || defined Q_OS_MACX + || mLocalCodec->name().toLower() == "shift-jis" // OK? +#endif + ) { + mLocalCodec = QTextCodec::codecForName("jis7"); + // QTextCodec *cdc = QTextCodec::codecForName("jis7"); + // QTextCodec::setCodecForLocale(cdc); + // KLocale::global()->setEncoding(cdc->mibEnum()); + } + } +} + +NodeHelper::~NodeHelper() +{ + if (mAttachmentFilesDir) { + mAttachmentFilesDir->forceCleanTempFiles(); + delete mAttachmentFilesDir; + mAttachmentFilesDir = 0; + } + clear(); +} + +void NodeHelper::setNodeProcessed(KMime::Content *node, bool recurse) +{ + if (!node) { + return; + } + mProcessedNodes.append(node); + qCDebug(MIMETREEPARSER_LOG) << "Node processed: " << node->index().toString() << node->contentType()->as7BitString(); + //<< " decodedContent" << node->decodedContent(); + if (recurse) { + auto contents = node->contents(); + Q_FOREACH (KMime::Content *c, contents) { + setNodeProcessed(c, true); + } + } +} + +void NodeHelper::setNodeUnprocessed(KMime::Content *node, bool recurse) +{ + if (!node) { + return; + } + mProcessedNodes.removeAll(node); + + //avoid double addition of extra nodes, eg. encrypted attachments + const QMap >::iterator it = mExtraContents.find(node); + if (it != mExtraContents.end()) { + Q_FOREACH (KMime::Content *c, it.value()) { + KMime::Content *p = c->parent(); + if (p) { + p->removeContent(c); + } + } + qDeleteAll(it.value()); + qCDebug(MIMETREEPARSER_LOG) << "mExtraContents deleted for" << it.key(); + mExtraContents.erase(it); + } + + qCDebug(MIMETREEPARSER_LOG) << "Node UNprocessed: " << node; + if (recurse) { + auto contents = node->contents(); + Q_FOREACH (KMime::Content *c, contents) { + setNodeUnprocessed(c, true); + } + } +} + +bool NodeHelper::nodeProcessed(KMime::Content *node) const +{ + if (!node) { + return true; + } + return mProcessedNodes.contains(node); +} + +static void clearBodyPartMemento(QMap &bodyPartMementoMap) +{ + for (QMap::iterator + it = bodyPartMementoMap.begin(), end = bodyPartMementoMap.end(); + it != end; ++it) { + Interface::BodyPartMemento *memento = it.value(); + memento->detach(); + delete memento; + } + bodyPartMementoMap.clear(); +} + +void NodeHelper::clear() +{ + mProcessedNodes.clear(); + mEncryptionState.clear(); + mSignatureState.clear(); + mOverrideCodecs.clear(); + std::for_each(mBodyPartMementoMap.begin(), mBodyPartMementoMap.end(), + &clearBodyPartMemento); + mBodyPartMementoMap.clear(); + QMap >::ConstIterator end(mExtraContents.constEnd()); + + for (QMap >::ConstIterator it = mExtraContents.constBegin(); it != end; ++it) { + Q_FOREACH (KMime::Content *c, it.value()) { + KMime::Content *p = c->parent(); + if (p) { + p->removeContent(c); + } + } + qDeleteAll(it.value()); + qCDebug(MIMETREEPARSER_LOG) << "mExtraContents deleted for" << it.key(); + } + mExtraContents.clear(); + mDisplayEmbeddedNodes.clear(); + mDisplayHiddenNodes.clear(); +} + +void NodeHelper::setEncryptionState(const KMime::Content *node, const KMMsgEncryptionState state) +{ + mEncryptionState[node] = state; +} + +KMMsgEncryptionState NodeHelper::encryptionState(const KMime::Content *node) const +{ + return mEncryptionState.value(node, KMMsgNotEncrypted); +} + +void NodeHelper::setSignatureState(const KMime::Content *node, const KMMsgSignatureState state) +{ + mSignatureState[node] = state; +} + +KMMsgSignatureState NodeHelper::signatureState(const KMime::Content *node) const +{ + return mSignatureState.value(node, KMMsgNotSigned); +} + +PartMetaData NodeHelper::partMetaData(KMime::Content *node) +{ + return mPartMetaDatas.value(node, PartMetaData()); +} + +void NodeHelper::setPartMetaData(KMime::Content *node, const PartMetaData &metaData) +{ + mPartMetaDatas.insert(node, metaData); +} + +QString NodeHelper::writeNodeToTempFile(KMime::Content *node) +{ + // If the message part is already written to a file, no point in doing it again. + // This function is called twice actually, once from the rendering of the attachment + // in the body and once for the header. + QUrl existingFileName = tempFileUrlFromNode(node); + if (!existingFileName.isEmpty()) { + return existingFileName.toLocalFile(); + } + + QString fname = createTempDir(persistentIndex(node)); + if (fname.isEmpty()) { + return QString(); + } + + QString fileName = NodeHelper::fileName(node); + // strip off a leading path + int slashPos = fileName.lastIndexOf(QLatin1Char('/')); + if (-1 != slashPos) { + fileName = fileName.mid(slashPos + 1); + } + if (fileName.isEmpty()) { + fileName = QStringLiteral("unnamed"); + } + fname += QLatin1Char('/') + fileName; + + qCDebug(MIMETREEPARSER_LOG) << "Create temp file: " << fname; + QByteArray data = node->decodedContent(); + if (node->contentType()->isText() && !data.isEmpty()) { + // convert CRLF to LF before writing text attachments to disk + data = KMime::CRLFtoLF(data); + } + QFile f(fname); + if (!f.open(QIODevice::ReadWrite)) { + qCWarning(MIMETREEPARSER_LOG) << "Failed to write note to file:" << f.errorString(); + return QString(); + } + f.write(data); + mAttachmentFilesDir->addTempFile(fname); + // make file read-only so that nobody gets the impression that he might + // edit attached files (cf. bug #52813) + f.setPermissions(QFileDevice::ReadUser); + f.close(); + + return fname; +} + +QUrl NodeHelper::tempFileUrlFromNode(const KMime::Content *node) +{ + if (!node) { + return QUrl(); + } + + const QString index = persistentIndex(node); + + foreach (const QString &path, mAttachmentFilesDir->temporaryFiles()) { + const int right = path.lastIndexOf(QLatin1Char('/')); + int left = path.lastIndexOf(QLatin1String(".index."), right); + if (left != -1) { + left += 7; + } + + QStringRef storedIndex(&path, left, right - left); + if (left != -1 && storedIndex == index) { + return QUrl::fromLocalFile(path); + } + } + return QUrl(); +} + +QString NodeHelper::createTempDir(const QString ¶m) +{ + QTemporaryFile *tempFile = new QTemporaryFile(QDir::tempPath() + QLatin1String("/messageviewer_XXXXXX") + QLatin1String(".index.") + param); + tempFile->open(); + const QString fname = tempFile->fileName(); + delete tempFile; + + QFile fFile(fname); + if (!(fFile.permissions() & QFileDevice::WriteUser)) { + // Not there or not writable + if (!QDir().mkpath(fname) || + !fFile.setPermissions(QFileDevice::WriteUser | QFileDevice::ReadUser | QFileDevice::ExeUser)) { + return QString(); //failed create + } + } + + Q_ASSERT(!fname.isNull()); + + mAttachmentFilesDir->addTempDir(fname); + return fname; +} + +void NodeHelper::forceCleanTempFiles() +{ + mAttachmentFilesDir->forceCleanTempFiles(); + delete mAttachmentFilesDir; + mAttachmentFilesDir = 0; +} + +void NodeHelper::removeTempFiles() +{ + //Don't delete it it will delete in class + mAttachmentFilesDir->removeTempFiles(); + mAttachmentFilesDir = new AttachmentTemporaryFilesDirs(); +} + +void NodeHelper::addTempFile(const QString &file) +{ + mAttachmentFilesDir->addTempFile(file); +} + +bool NodeHelper::isInEncapsulatedMessage(KMime::Content *node) +{ + const KMime::Content *const topLevel = node->topLevel(); + const KMime::Content *cur = node; + while (cur && cur != topLevel) { + const bool parentIsMessage = cur->parent() && cur->parent()->contentType(false) && + cur->parent()->contentType()->mimeType().toLower() == "message/rfc822"; + if (parentIsMessage && cur->parent() != topLevel) { + return true; + } + cur = cur->parent(); + } + return false; +} + +QByteArray NodeHelper::charset(KMime::Content *node) +{ + if (node->contentType(false)) { + return node->contentType(false)->charset(); + } else { + return node->defaultCharset(); + } +} + +KMMsgEncryptionState NodeHelper::overallEncryptionState(KMime::Content *node) const +{ + KMMsgEncryptionState myState = KMMsgEncryptionStateUnknown; + if (!node) { + return myState; + } + + KMime::Content *parent = node->parent(); + auto contents = parent ? parent->contents() : KMime::Content::List(); + if (contents.isEmpty()) { + contents.append(node); + } + int i = contents.indexOf(const_cast(node)); + for (; i < contents.size(); ++i) { + auto next = contents.at(i); + KMMsgEncryptionState otherState = encryptionState(next); + + // NOTE: children are tested ONLY when parent is not encrypted + if (otherState == KMMsgNotEncrypted && !next->contents().isEmpty()) { + otherState = overallEncryptionState(next->contents().at(0)); + } + + if (otherState == KMMsgNotEncrypted && !extraContents(next).isEmpty()) { + otherState = overallEncryptionState(extraContents(next).at(0)); + } + + if (next == node) { + myState = otherState; + } + + switch (otherState) { + case KMMsgEncryptionStateUnknown: + break; + case KMMsgNotEncrypted: + if (myState == KMMsgFullyEncrypted) { + myState = KMMsgPartiallyEncrypted; + } else if (myState != KMMsgPartiallyEncrypted) { + myState = KMMsgNotEncrypted; + } + break; + case KMMsgPartiallyEncrypted: + myState = KMMsgPartiallyEncrypted; + break; + case KMMsgFullyEncrypted: + if (myState != KMMsgFullyEncrypted) { + myState = KMMsgPartiallyEncrypted; + } + break; + case KMMsgEncryptionProblematic: + break; + } + } + + qCDebug(MIMETREEPARSER_LOG) << "\n\n KMMsgEncryptionState:" << myState; + + return myState; +} + +KMMsgSignatureState NodeHelper::overallSignatureState(KMime::Content *node) const +{ + KMMsgSignatureState myState = KMMsgSignatureStateUnknown; + if (!node) { + return myState; + } + + KMime::Content *parent = node->parent(); + auto contents = parent ? parent->contents() : KMime::Content::List(); + if (contents.isEmpty()) { + contents.append(node); + } + int i = contents.indexOf(const_cast(node)); + for (; i < contents.size(); ++i) { + auto next = contents.at(i); + KMMsgSignatureState otherState = signatureState(next); + + // NOTE: children are tested ONLY when parent is not encrypted + if (otherState == KMMsgNotSigned && !next->contents().isEmpty()) { + otherState = overallSignatureState(next->contents().at(0)); + } + + if (otherState == KMMsgNotSigned && !extraContents(next).isEmpty()) { + otherState = overallSignatureState(extraContents(next).at(0)); + } + + if (next == node) { + myState = otherState; + } + + switch (otherState) { + case KMMsgSignatureStateUnknown: + break; + case KMMsgNotSigned: + if (myState == KMMsgFullySigned) { + myState = KMMsgPartiallySigned; + } else if (myState != KMMsgPartiallySigned) { + myState = KMMsgNotSigned; + } + break; + case KMMsgPartiallySigned: + myState = KMMsgPartiallySigned; + break; + case KMMsgFullySigned: + if (myState != KMMsgFullySigned) { + myState = KMMsgPartiallySigned; + } + break; + case KMMsgSignatureProblematic: + break; + } + } + + qCDebug(MIMETREEPARSER_LOG) << "\n\n KMMsgSignatureState:" << myState; + + return myState; +} + +void NodeHelper::magicSetType(KMime::Content *node, bool aAutoDecode) +{ + const QByteArray body = (aAutoDecode) ? node->decodedContent() : node->body(); + QMimeDatabase db; + QMimeType mime = db.mimeTypeForData(body); + + QString mimetype = mime.name(); + node->contentType()->setMimeType(mimetype.toLatin1()); +} + +// static +QString NodeHelper::replacePrefixes(const QString &str, + const QStringList &prefixRegExps, + bool replace, + const QString &newPrefix) +{ + bool recognized = false; + // construct a big regexp that + // 1. is anchored to the beginning of str (sans whitespace) + // 2. matches at least one of the part regexps in prefixRegExps + QString bigRegExp = QStringLiteral("^(?:\\s+|(?:%1))+\\s*") + .arg(prefixRegExps.join(QStringLiteral(")|(?:"))); + QRegExp rx(bigRegExp, Qt::CaseInsensitive); + if (!rx.isValid()) { + qCWarning(MIMETREEPARSER_LOG) << "bigRegExp = \"" + << bigRegExp << "\"\n" + << "prefix regexp is invalid!"; + // try good ole Re/Fwd: + recognized = str.startsWith(newPrefix); + } else { // valid rx + QString tmp = str; + if (rx.indexIn(tmp) == 0) { + recognized = true; + if (replace) { + return tmp.replace(0, rx.matchedLength(), newPrefix + QLatin1Char(' ')); + } + } + } + if (!recognized) { + return newPrefix + QLatin1Char(' ') + str; + } else { + return str; + } +} + +QString NodeHelper::cleanSubject(KMime::Message *message) +{ + return cleanSubject(message, replySubjPrefixes + forwardSubjPrefixes, + true, QString()).trimmed(); +} + +QString NodeHelper::cleanSubject(KMime::Message *message, + const QStringList &prefixRegExps, + bool replace, + const QString &newPrefix) +{ + QString cleanStr; + if (message) { + cleanStr = + NodeHelper::replacePrefixes( + message->subject()->asUnicodeString(), prefixRegExps, replace, newPrefix); + } + return cleanStr; +} + +void NodeHelper::setOverrideCodec(KMime::Content *node, const QTextCodec *codec) +{ + if (!node) { + return; + } + + mOverrideCodecs[node] = codec; +} + +const QTextCodec *NodeHelper::codec(KMime::Content *node) +{ + if (! node) { + return mLocalCodec; + } + + const QTextCodec *c = mOverrideCodecs.value(node, 0); + if (!c) { + // no override-codec set for this message, try the CT charset parameter: + QByteArray charset = node->contentType()->charset(); + + // utf-8 is a superset of us-ascii, so we don't loose anything, if we it insead + // utf-8 is nowadays that widely, that it is a good guess to use it to fix issus with broken clients. + if (charset.toLower() == "us-ascii") { + charset = "utf-8"; + } + c = codecForName(charset); + } + if (!c) { + // no charset means us-ascii (RFC 2045), so using local encoding should + // be okay + c = mLocalCodec; + } + return c; +} + +const QTextCodec *NodeHelper::codecForName(const QByteArray &_str) +{ + if (_str.isEmpty()) { + return 0; + } + QByteArray codec = _str.toLower(); + return KCharsets::charsets()->codecForName(QLatin1String(codec)); +} + +QString NodeHelper::fileName(const KMime::Content *node) +{ + QString name = const_cast(node)->contentDisposition()->filename(); + if (name.isEmpty()) { + name = const_cast(node)->contentType()->name(); + } + + name = name.trimmed(); + return name; +} + +//FIXME(Andras) review it (by Marc?) to see if I got it right. This is supposed to be the partNode::internalBodyPartMemento replacement +Interface::BodyPartMemento *NodeHelper::bodyPartMemento(KMime::Content *node, + const QByteArray &which) const +{ + const QMap< QString, QMap >::const_iterator nit + = mBodyPartMementoMap.find(persistentIndex(node)); + if (nit == mBodyPartMementoMap.end()) { + return 0; + } + const QMap::const_iterator it = + nit->find(which.toLower()); + return it != nit->end() ? it.value() : 0; +} + +//FIXME(Andras) review it (by Marc?) to see if I got it right. This is supposed to be the partNode::internalSetBodyPartMemento replacement +void NodeHelper::setBodyPartMemento(KMime::Content *node, const QByteArray &which, + Interface::BodyPartMemento *memento) +{ + QMap &mementos + = mBodyPartMementoMap[persistentIndex(node)]; + + const QMap::iterator it = + mementos.lowerBound(which.toLower()); + + if (it != mementos.end() && it.key() == which.toLower()) { + delete it.value(); + if (memento) { + it.value() = memento; + } else { + mementos.erase(it); + } + } else { + mementos.insert(which.toLower(), memento); + } +} + +bool NodeHelper::isNodeDisplayedEmbedded(KMime::Content *node) const +{ + qCDebug(MIMETREEPARSER_LOG) << "IS NODE: " << mDisplayEmbeddedNodes.contains(node); + return mDisplayEmbeddedNodes.contains(node); +} + +void NodeHelper::setNodeDisplayedEmbedded(KMime::Content *node, bool displayedEmbedded) +{ + qCDebug(MIMETREEPARSER_LOG) << "SET NODE: " << node << displayedEmbedded; + if (displayedEmbedded) { + mDisplayEmbeddedNodes.insert(node); + } else { + mDisplayEmbeddedNodes.remove(node); + } +} + +bool NodeHelper::isNodeDisplayedHidden(KMime::Content *node) const +{ + return mDisplayHiddenNodes.contains(node); +} + +void NodeHelper::setNodeDisplayedHidden(KMime::Content *node, bool displayedHidden) +{ + if (displayedHidden) { + mDisplayHiddenNodes.insert(node); + } else { + mDisplayEmbeddedNodes.remove(node); + } +} + +/*! + Creates a persistent index string that bridges the gap between the + permanent nodes and the temporary ones. + + Used internally for robust indexing. +*/ +QString NodeHelper::persistentIndex(const KMime::Content *node) const +{ + if (!node) { + return QString(); + } + + QString indexStr = node->index().toString(); + if (indexStr.isEmpty()) { + QMapIterator > it(mExtraContents); + while (it.hasNext()) { + it.next(); + const auto &extraNodes = it.value(); + for (int i = 0; i < extraNodes.size(); i++) { + if (extraNodes[i] == node) { + indexStr = QString::fromLatin1("e%1").arg(i); + const QString parentIndex = persistentIndex(it.key()); + if (!parentIndex.isEmpty()) { + indexStr = QString::fromLatin1("%1:%2").arg(parentIndex, indexStr); + } + return indexStr; + } + } + } + } else { + const KMime::Content *const topLevel = node->topLevel(); + //if the node is an extra node, prepend the index of the extra node to the url + QMapIterator > it(mExtraContents); + while (it.hasNext()) { + it.next(); + const QList &extraNodes = extraContents(it.key()); + for (int i = 0; i < extraNodes.size(); ++i) { + KMime::Content *const extraNode = extraNodes[i]; + if (topLevel == extraNode) { + indexStr.prepend(QStringLiteral("e%1:").arg(i)); + const QString parentIndex = persistentIndex(it.key()); + if (!parentIndex.isEmpty()) { + indexStr = QStringLiteral("%1:%2").arg(parentIndex, indexStr); + } + return indexStr; + } + } + } + } + + return indexStr; +} + +KMime::Content *NodeHelper::contentFromIndex(KMime::Content *node, const QString &persistentIndex) const +{ + KMime::Content *c = node->topLevel(); + if (c) { + const QStringList pathParts = persistentIndex.split(QLatin1Char(':'), QString::SkipEmptyParts); + const int pathPartsSize(pathParts.size()); + for (int i = 0; i < pathPartsSize; ++i) { + const QString &path = pathParts[i]; + if (path.startsWith(QLatin1Char('e'))) { + const QList &extraParts = mExtraContents.value(c); + const int idx = path.midRef(1, -1).toInt(); + c = (idx < extraParts.size()) ? extraParts[idx] : Q_NULLPTR; + } else { + c = c->content(KMime::ContentIndex(path)); + } + if (!c) { + break; + } + } + } + return c; +} + +QString NodeHelper::asHREF(const KMime::Content *node, const QString &place) const +{ + return QStringLiteral("attachment:%1?place=%2").arg(persistentIndex(node), place); +} + +KMime::Content *NodeHelper::fromHREF(const KMime::Message::Ptr &mMessage, const QUrl &url) const +{ + if (url.isEmpty()) { + return mMessage.data(); + } + + if (!url.isLocalFile()) { + return contentFromIndex(mMessage.data(), url.adjusted(QUrl::StripTrailingSlash).path()); + } else { + const QString path = url.toLocalFile(); + // extract from //qttestn28554.index.2.3:0:2/unnamed -> "2.3:0:2" + // start of the index is something that is not a number followed by a dot: \D. + // index is only made of numbers,"." and ":": ([0-9.:]+) + // index is the last part of the folder name: / + const QRegExp rIndex(QStringLiteral("\\D\\.([e0-9.:]+)/")); + + //search the occurence at most at the end + if (rIndex.lastIndexIn(path) != -1) { + return contentFromIndex(mMessage.data(), rIndex.cap(1)); + } + return mMessage.data(); + } +} + +QString NodeHelper::fixEncoding(const QString &encoding) +{ + QString returnEncoding = encoding; + // According to http://www.iana.org/assignments/character-sets, uppercase is + // preferred in MIME headers + if (returnEncoding.toUpper().contains(QStringLiteral("ISO "))) { + returnEncoding = returnEncoding.toUpper(); + returnEncoding.replace(QLatin1String("ISO "), QStringLiteral("ISO-")); + } + return returnEncoding; +} + +//----------------------------------------------------------------------------- +QString NodeHelper::encodingForName(const QString &descriptiveName) +{ + QString encoding = KCharsets::charsets()->encodingForName(descriptiveName); + return NodeHelper::fixEncoding(encoding); +} + +QStringList NodeHelper::supportedEncodings(bool usAscii) +{ + QStringList encodingNames = KCharsets::charsets()->availableEncodingNames(); + QStringList encodings; + QMap mimeNames; + QStringList::ConstIterator constEnd(encodingNames.constEnd()); + for (QStringList::ConstIterator it = encodingNames.constBegin(); + it != constEnd; ++it) { + QTextCodec *codec = KCharsets::charsets()->codecForName(*it); + QString mimeName = (codec) ? QString::fromLatin1(codec->name()).toLower() : (*it); + if (!mimeNames.contains(mimeName)) { + encodings.append(KCharsets::charsets()->descriptionForEncoding(*it)); + mimeNames.insert(mimeName, true); + } + } + encodings.sort(); + if (usAscii) { + encodings.prepend(KCharsets::charsets()->descriptionForEncoding(QStringLiteral("us-ascii"))); + } + return encodings; +} + +QString NodeHelper::fromAsString(KMime::Content *node) +{ + KMime::Message *topLevel = dynamic_cast(node->topLevel()); + if (topLevel) { + return topLevel->from()->asUnicodeString(); + } + return QString(); +} + +void NodeHelper::attachExtraContent(KMime::Content *topLevelNode, KMime::Content *content) +{ + qCDebug(MIMETREEPARSER_LOG) << "mExtraContents added for" << topLevelNode << " extra content: " << content; + mExtraContents[topLevelNode].append(content); +} + +QList< KMime::Content * > NodeHelper::extraContents(KMime::Content *topLevelnode) const +{ + return mExtraContents.value(topLevelnode); +} + +void NodeHelper::mergeExtraNodes(KMime::Content *node) +{ + if (!node) { + return; + } + + QList extraNodes = extraContents(node); + Q_FOREACH (KMime::Content *extra, extraNodes) { + if (node->bodyIsMessage()) { + qCWarning(MIMETREEPARSER_LOG) << "Asked to attach extra content to a kmime::message, this does not make sense. Attaching to:" << node << + node->encodedContent() << "\n====== with =======\n" << extra << extra->encodedContent(); + continue; + } + KMime::Content *c = new KMime::Content(node); + c->setContent(extra->encodedContent()); + c->parse(); + node->addContent(c); + } + + Q_FOREACH (KMime::Content *child, node->contents()) { + mergeExtraNodes(child); + } +} + +void NodeHelper::cleanFromExtraNodes(KMime::Content *node) +{ + if (!node) { + return; + } + QList extraNodes = extraContents(node); + Q_FOREACH (KMime::Content *extra, extraNodes) { + QByteArray s = extra->encodedContent(); + auto children = node->contents(); + Q_FOREACH (KMime::Content *c, children) { + if (c->encodedContent() == s) { + node->removeContent(c); + } + } + } + Q_FOREACH (KMime::Content *child, node->contents()) { + cleanFromExtraNodes(child); + } +} + +KMime::Message *NodeHelper::messageWithExtraContent(KMime::Content *topLevelNode) +{ + /*The merge is done in several steps: + 1) merge the extra nodes into topLevelNode + 2) copy the modified (merged) node tree into a new node tree + 3) restore the original node tree in topLevelNode by removing the extra nodes from it + + The reason is that extra nodes are assigned by pointer value to the nodes in the original tree. + */ + if (!topLevelNode) { + return 0; + } + + mergeExtraNodes(topLevelNode); + + KMime::Message *m = new KMime::Message; + m->setContent(topLevelNode->encodedContent()); + m->parse(); + + cleanFromExtraNodes(topLevelNode); +// qCDebug(MIMETREEPARSER_LOG) << "MESSAGE WITH EXTRA: " << m->encodedContent(); +// qCDebug(MIMETREEPARSER_LOG) << "MESSAGE WITHOUT EXTRA: " << topLevelNode->encodedContent(); + + return m; +} + +KMime::Content *NodeHelper::decryptedNodeForContent(KMime::Content *content) const +{ + const QList xc = extraContents(content); + if (!xc.empty()) { + if (xc.size() == 1) { + return xc.front(); + } else { + qCWarning(MIMETREEPARSER_LOG) << "WTF, encrypted node has multiple extra contents?"; + } + } + return 0; +} + +bool NodeHelper::unencryptedMessage_helper(KMime::Content *node, QByteArray &resultingData, bool addHeaders, + int recursionLevel) +{ + bool returnValue = false; + if (node) { + KMime::Content *curNode = node; + KMime::Content *decryptedNode = 0; + const QByteArray type = node->contentType(false) ? QByteArray(node->contentType()->mediaType()).toLower() : "text"; + const QByteArray subType = node->contentType(false) ? node->contentType()->subType().toLower() : "plain"; + const bool isMultipart = node->contentType(false) && node->contentType()->isMultipart(); + bool isSignature = false; + + qCDebug(MIMETREEPARSER_LOG) << "(" << recursionLevel << ") Looking at" << type << "/" << subType; + + if (isMultipart) { + if (subType == "signed") { + isSignature = true; + } else if (subType == "encrypted") { + decryptedNode = decryptedNodeForContent(curNode); + } + } else if (type == "application") { + if (subType == "octet-stream") { + decryptedNode = decryptedNodeForContent(curNode); + } else if (subType == "pkcs7-signature") { + isSignature = true; + } else if (subType == "pkcs7-mime") { + // note: subtype pkcs7-mime can also be signed + // and we do NOT want to remove the signature! + if (encryptionState(curNode) != KMMsgNotEncrypted) { + decryptedNode = decryptedNodeForContent(curNode); + } + } + } + + if (decryptedNode) { + qCDebug(MIMETREEPARSER_LOG) << "Current node has an associated decrypted node, adding a modified header " + "and then processing the children."; + + Q_ASSERT(addHeaders); + KMime::Content headers; + headers.setHead(curNode->head()); + headers.parse(); + if (decryptedNode->contentType(false)) { + headers.contentType()->from7BitString(decryptedNode->contentType()->as7BitString(false)); + } else { + headers.removeHeader(); + } + if (decryptedNode->contentTransferEncoding(false)) { + headers.contentTransferEncoding()->from7BitString(decryptedNode->contentTransferEncoding()->as7BitString(false)); + } else { + headers.removeHeader(); + } + if (decryptedNode->contentDisposition(false)) { + headers.contentDisposition()->from7BitString(decryptedNode->contentDisposition()->as7BitString(false)); + } else { + headers.removeHeader(); + } + if (decryptedNode->contentDescription(false)) { + headers.contentDescription()->from7BitString(decryptedNode->contentDescription()->as7BitString(false)); + } else { + headers.removeHeader(); + } + headers.assemble(); + + resultingData += headers.head() + '\n'; + unencryptedMessage_helper(decryptedNode, resultingData, false, recursionLevel + 1); + + returnValue = true; + } + + else if (isSignature) { + qCDebug(MIMETREEPARSER_LOG) << "Current node is a signature, adding it as-is."; + // We can't change the nodes under the signature, as that would invalidate it. Add the signature + // and its child as-is + if (addHeaders) { + resultingData += curNode->head() + '\n'; + } + resultingData += curNode->encodedBody(); + returnValue = false; + } + + else if (isMultipart) { + qCDebug(MIMETREEPARSER_LOG) << "Current node is a multipart node, adding its header and then processing all children."; + // Normal multipart node, add the header and all of its children + bool somethingChanged = false; + if (addHeaders) { + resultingData += curNode->head() + '\n'; + } + const QByteArray boundary = curNode->contentType()->boundary(); + foreach (KMime::Content *child, curNode->contents()) { + resultingData += "\n--" + boundary + '\n'; + const bool changed = unencryptedMessage_helper(child, resultingData, true, recursionLevel + 1); + if (changed) { + somethingChanged = true; + } + } + resultingData += "\n--" + boundary + "--\n\n"; + returnValue = somethingChanged; + } + + else if (curNode->bodyIsMessage()) { + qCDebug(MIMETREEPARSER_LOG) << "Current node is a message, adding the header and then processing the child."; + if (addHeaders) { + resultingData += curNode->head() + '\n'; + } + + returnValue = unencryptedMessage_helper(curNode->bodyAsMessage().data(), resultingData, true, recursionLevel + 1); + } + + else { + qCDebug(MIMETREEPARSER_LOG) << "Current node is an ordinary leaf node, adding it as-is."; + if (addHeaders) { + resultingData += curNode->head() + '\n'; + } + resultingData += curNode->body(); + returnValue = false; + } + } + + qCDebug(MIMETREEPARSER_LOG) << "(" << recursionLevel << ") done."; + return returnValue; +} + +KMime::Message::Ptr NodeHelper::unencryptedMessage(const KMime::Message::Ptr &originalMessage) +{ + QByteArray resultingData; + const bool messageChanged = unencryptedMessage_helper(originalMessage.data(), resultingData, true); + if (messageChanged) { +#if 0 + qCDebug(MIMETREEPARSER_LOG) << "Resulting data is:" << resultingData; + QFile bla("stripped.mbox"); + bla.open(QIODevice::WriteOnly); + bla.write(resultingData); + bla.close(); +#endif + KMime::Message::Ptr newMessage(new KMime::Message); + newMessage->setContent(resultingData); + newMessage->parse(); + return newMessage; + } else { + return KMime::Message::Ptr(); + } +} + +QVector NodeHelper::attachmentsOfExtraContents() const +{ + QVector result; + for (auto it = mExtraContents.begin(); it != mExtraContents.end(); ++it) { + foreach (auto content, it.value()) { + if (KMime::isAttachment(content)) { + result.push_back(content); + } else { + result += content->attachments(); + } + } + } + return result; +} + +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/nodehelper.h kf5-messagelib-16.12.3/mimetreeparser/src/viewer/nodehelper.h --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/nodehelper.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/nodehelper.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,292 @@ +/* + Copyright (C) 2009 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.net + Copyright (c) 2009 Andras Mantia + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#ifndef __MIMETREEPARSER_NODEHELPER_H__ +#define __MIMETREEPARSER_NODEHELPER_H__ + +#include "mimetreeparser_export.h" + +#include "mimetreeparser/partmetadata.h" +#include "mimetreeparser/enums.h" + +#include + +#include +#include +#include + +class QUrl; +class QTextCodec; + +namespace MimeTreeParser +{ +class AttachmentTemporaryFilesDirs; +namespace Interface +{ +class BodyPartMemento; +} +} + +namespace MimeTreeParser +{ + +/** + * @author Andras Mantia + */ +class MIMETREEPARSER_EXPORT NodeHelper: public QObject +{ + Q_OBJECT +public: + NodeHelper(); + + ~NodeHelper(); + + void setNodeProcessed(KMime::Content *node, bool recurse); + void setNodeUnprocessed(KMime::Content *node, bool recurse); + bool nodeProcessed(KMime::Content *node) const; + void clear(); + void forceCleanTempFiles(); + + void setEncryptionState(const KMime::Content *node, const KMMsgEncryptionState state); + KMMsgEncryptionState encryptionState(const KMime::Content *node) const; + + void setSignatureState(const KMime::Content *node, const KMMsgSignatureState state); + KMMsgSignatureState signatureState(const KMime::Content *node) const; + + KMMsgSignatureState overallSignatureState(KMime::Content *node) const; + KMMsgEncryptionState overallEncryptionState(KMime::Content *node) const; + + void setPartMetaData(KMime::Content *node, const PartMetaData &metaData); + PartMetaData partMetaData(KMime::Content *node); + + /** + * Set the 'Content-Type' by mime-magic from the contents of the body. + * If autoDecode is true the decoded body will be used for mime type + * determination (this does not change the body itself). + */ + void magicSetType(KMime::Content *node, bool autoDecode = true); + + /** + * Return this mails subject, with all "forward" and "reply" + * prefixes removed + */ + static QString cleanSubject(KMime::Message *message); + + /** Attach an extra node to an existing node */ + void attachExtraContent(KMime::Content *topLevelNode, KMime::Content *content); + + /** Get the extra nodes attached to the @param topLevelNode and all sub-nodes of @param topLevelNode */ + QList extraContents(KMime::Content *topLevelNode) const; + + /** Return a modified message (node tree) starting from @param topLevelNode that has the original nodes and the extra nodes. + The caller has the responsibility to delete the new message. + */ + KMime::Message *messageWithExtraContent(KMime::Content *topLevelNode); + + /** Get a QTextCodec suitable for this message part */ + const QTextCodec *codec(KMime::Content *node); + + /** Set the charset the user selected for the message to display */ + void setOverrideCodec(KMime::Content *node, const QTextCodec *codec); + + Interface::BodyPartMemento *bodyPartMemento(KMime::Content *node, const QByteArray &which) const; + + void setBodyPartMemento(KMime::Content *node, const QByteArray &which, + Interface::BodyPartMemento *memento); + + // A flag to remember if the node was embedded. This is useful for attachment nodes, the reader + // needs to know if they were displayed inline or not. + bool isNodeDisplayedEmbedded(KMime::Content *node) const; + void setNodeDisplayedEmbedded(KMime::Content *node, bool displayedEmbedded); + + // Same as above, but this time determines if the node was hidden or not + bool isNodeDisplayedHidden(KMime::Content *node) const; + void setNodeDisplayedHidden(KMime::Content *node, bool displayedHidden); + + /** + * Writes the given message part to a temporary file and returns the + * name of this file or QString() if writing failed. + */ + QString writeNodeToTempFile(KMime::Content *node); + + /** + * Returns the temporary file path and name where this node was saved, or an empty url + * if it wasn't saved yet with writeNodeToTempFile() + */ + QUrl tempFileUrlFromNode(const KMime::Content *node); + + /** + * Creates a temporary dir for saving attachments, etc. + * Will be automatically deleted when another message is viewed. + * @param param Optional part of the directory name. + */ + QString createTempDir(const QString ¶m = QString()); + + /** + * Cleanup the attachment temp files + */ + void removeTempFiles(); + + /** + * Add a file to the list of managed temporary files + */ + void addTempFile(const QString &file); + + // Get a href in the form attachment:?place=, used by ObjectTreeParser and + // UrlHandlerManager. + QString asHREF(const KMime::Content *node, const QString &place) const; + KMime::Content *fromHREF(const KMime::Message::Ptr &mMessage, const QUrl &href) const; + + /** + * @return true if this node is a child or an encapsulated message + */ + static bool isInEncapsulatedMessage(KMime::Content *node); + + /** + * Returns the charset for the given node. If no charset is specified + * for the node, the defaultCharset() is returned. + */ + static QByteArray charset(KMime::Content *node); + + /** + * Check for prefixes @p prefixRegExps in @p str. If none + * is found, @p newPrefix + ' ' is prepended to @p str and the + * resulting string is returned. If @p replace is true, any + * sequence of whitespace-delimited prefixes at the beginning of + * @p str is replaced by @p newPrefix. + */ + static QString replacePrefixes(const QString &str, + const QStringList &prefixRegExps, + bool replace, + const QString &newPrefix); + + /** + * Return a QTextCodec for the specified charset. + * This function is a bit more tolerant, than QTextCodec::codecForName + */ + static const QTextCodec *codecForName(const QByteArray &_str); + + /** + * Returns a usable filename for a node, that can be the filename from the + * content disposition header, or if that one is empty, the name from the + * content type header. + */ + static QString fileName(const KMime::Content *node); + + /** + * Fixes an encoding received by a KDE function and returns the proper, + * MIME-compilant encoding name instead. + * @see encodingForName + */ + static QString fixEncoding(const QString &encoding); //TODO(Andras) move to a utility class? + + /** + * Drop-in replacement for KCharsets::encodingForName(). The problem with + * the KCharsets function is that it returns "human-readable" encoding names + * like "ISO 8859-15" instead of valid encoding names like "ISO-8859-15". + * This function fixes this by replacing whitespace with a hyphen. + */ + static QString encodingForName(const QString &descriptiveName); //TODO(Andras) move to a utility class? + + /** + * Return a list of the supported encodings + * @param usAscii if true, US-Ascii encoding will be prepended to the list. + */ + static QStringList supportedEncodings(bool usAscii); //TODO(Andras) move to a utility class? + + static QString fromAsString(KMime::Content *node); + + KMime::Content *decryptedNodeForContent(KMime::Content *content) const; + + /** + * This function returns the unencrypted message that is based on @p originalMessage. + * All encrypted MIME parts are removed and replaced by their decrypted plain-text versions. + * Encrypted parts that are within signed parts are not replaced, since that would invalidate + * the signature. + * + * This only works if the message was run through ObjectTreeParser::parseObjectTree() with the + * currrent NodeHelper before, because parseObjectTree() actually decrypts the message and stores + * the decrypted nodes by calling attachExtraContent(). + * + * @return the unencrypted message or an invalid pointer if the original message didn't contain + * a part that needed to be modified. + */ + KMime::Message::Ptr unencryptedMessage(const KMime::Message::Ptr &originalMessage); + + /** + * Returns a list of attachments of attached extra content nodes. + * This is mainly useful is order to get attachments of encrypted messages. + * Note that this does not include attachments from the primary node tree. + * @see KMime::Content::attachments(). + */ + QVector attachmentsOfExtraContents() const; + +Q_SIGNALS: + void update(MimeTreeParser::UpdateMode); + +private: + Q_DISABLE_COPY(NodeHelper) + bool unencryptedMessage_helper(KMime::Content *node, QByteArray &resultingData, bool addHeaders, + int recursionLevel = 1); + + /** Check for prefixes @p prefixRegExps in #subject(). If none + is found, @p newPrefix + ' ' is prepended to the subject and the + resulting string is returned. If @p replace is true, any + sequence of whitespace-delimited prefixes at the beginning of + #subject() is replaced by @p newPrefix + **/ + static QString cleanSubject(KMime::Message *message, const QStringList &prefixRegExps, + bool replace, const QString &newPrefix); + + void mergeExtraNodes(KMime::Content *node); + void cleanFromExtraNodes(KMime::Content *node); + + /** Creates a persistent index string that bridges the gap between the + permanent nodes and the temporary ones. + + Used internally for robust indexing. + **/ + QString persistentIndex(const KMime::Content *node) const; + + /** Translates the persistentIndex into a node back + + node: any node of the actually message to what the persistentIndex is interpreded + **/ + KMime::Content *contentFromIndex(KMime::Content *node, const QString &persistentIndex) const; + +private: + QList mProcessedNodes; + QList mNodesUnderProcess; + QMap mEncryptionState; + QMap mSignatureState; + QSet mDisplayEmbeddedNodes; + QSet mDisplayHiddenNodes; + QTextCodec *mLocalCodec; + QMap mOverrideCodecs; + QMap > mBodyPartMementoMap; + QMap mPartMetaDatas; + QMap > mExtraContents; + AttachmentTemporaryFilesDirs *mAttachmentFilesDir; + + friend class NodeHelperTest; +}; + +} + +#endif diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/objecttreeparser.cpp kf5-messagelib-16.12.3/mimetreeparser/src/viewer/objecttreeparser.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/objecttreeparser.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/objecttreeparser.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,495 @@ +/* + objecttreeparser.cpp + + This file is part of KMail, the KDE mail client. + Copyright (c) 2003 Marc Mutz + Copyright (C) 2002-2004 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.net + Copyright (c) 2009 Andras Mantia + Copyright (c) 2015 Sandro Knauß + + KMail is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +// MessageViewer includes + +#include "objecttreeparser.h" + +#include "attachmentstrategy.h" +#include "bodypartformatterbasefactory.h" +#include "nodehelper.h" +#include "messagepart.h" +#include "partnodebodypart.h" + +#include "mimetreeparser_debug.h" + +#include "bodyformatter/utils.h" +#include "interfaces/bodypartformatter.h" +#include "interfaces/htmlwriter.h" +#include "interfaces/messagepartrenderer.h" +#include "utils/util.h" + +#include +#include + +// KDE includes + +// Qt includes +#include +#include +#include + +using namespace MimeTreeParser; + +ObjectTreeParser::ObjectTreeParser(const ObjectTreeParser *topLevelParser, + bool showOnlyOneMimePart, + const AttachmentStrategy *strategy) + : mSource(topLevelParser->mSource), + mNodeHelper(topLevelParser->mNodeHelper), + mHtmlWriter(topLevelParser->mHtmlWriter), + mTopLevelContent(topLevelParser->mTopLevelContent), + mShowOnlyOneMimePart(showOnlyOneMimePart), + mHasPendingAsyncJobs(false), + mAllowAsync(topLevelParser->mAllowAsync), + mAttachmentStrategy(strategy) +{ + init(); +} + +ObjectTreeParser::ObjectTreeParser(Interface::ObjectTreeSource *source, + MimeTreeParser::NodeHelper *nodeHelper, + bool showOnlyOneMimePart, + const AttachmentStrategy *strategy) + : mSource(source), + mNodeHelper(nodeHelper), + mHtmlWriter(Q_NULLPTR), + mTopLevelContent(0), + mShowOnlyOneMimePart(showOnlyOneMimePart), + mHasPendingAsyncJobs(false), + mAllowAsync(false), + mAttachmentStrategy(strategy) +{ + init(); +} + +void ObjectTreeParser::init() +{ + Q_ASSERT(mSource); + if (!attachmentStrategy()) { + mAttachmentStrategy = mSource->attachmentStrategy(); + } + + if (!mNodeHelper) { + mNodeHelper = new NodeHelper(); + mDeleteNodeHelper = true; + } else { + mDeleteNodeHelper = false; + } +} + +ObjectTreeParser::ObjectTreeParser(const ObjectTreeParser &other) + : mSource(other.mSource), + mNodeHelper(other.nodeHelper()), //TODO(Andras) hm, review what happens if mDeleteNodeHelper was true in the source + mHtmlWriter(other.mHtmlWriter), + mTopLevelContent(other.mTopLevelContent), + mShowOnlyOneMimePart(other.showOnlyOneMimePart()), + mHasPendingAsyncJobs(other.hasPendingAsyncJobs()), + mAllowAsync(other.allowAsync()), + mAttachmentStrategy(other.attachmentStrategy()), + mDeleteNodeHelper(false) +{ + +} + +ObjectTreeParser::~ObjectTreeParser() +{ + if (mDeleteNodeHelper) { + delete mNodeHelper; + mNodeHelper = Q_NULLPTR; + } +} + +void ObjectTreeParser::setAllowAsync(bool allow) +{ + Q_ASSERT(!mHasPendingAsyncJobs); + mAllowAsync = allow; +} + +bool ObjectTreeParser::allowAsync() const +{ + return mAllowAsync; +} + +bool ObjectTreeParser::hasPendingAsyncJobs() const +{ + return mHasPendingAsyncJobs; +} + +QString ObjectTreeParser::plainTextContent() const +{ + return mPlainTextContent; +} + +QString ObjectTreeParser::htmlContent() const +{ + return mHtmlContent; +} + +void ObjectTreeParser::copyContentFrom(const ObjectTreeParser *other) +{ + mPlainTextContent += other->plainTextContent(); + mHtmlContent += other->htmlContent(); + if (!other->plainTextContentCharset().isEmpty()) { + mPlainTextContentCharset = other->plainTextContentCharset(); + } + if (!other->htmlContentCharset().isEmpty()) { + mHtmlContentCharset = other->htmlContentCharset(); + } +} + +//----------------------------------------------------------------------------- + +void ObjectTreeParser::parseObjectTree(KMime::Content *node) +{ + mTopLevelContent = node; + mParsedPart = parseObjectTreeInternal(node, showOnlyOneMimePart()); + + if (mParsedPart) { + mParsedPart->fix(); + mParsedPart->copyContentFrom(); + if (auto mp = toplevelTextNode(mParsedPart)) { + if (auto _mp = mp.dynamicCast()) { + extractNodeInfos(_mp->mNode, true); + } else if (auto _mp = mp.dynamicCast()) { + if (_mp->mChildNodes.contains(Util::MultipartPlain)) { + extractNodeInfos(_mp->mChildNodes[Util::MultipartPlain], true); + } + } + setPlainTextContent(mp->text()); + } + + if (htmlWriter()) { + const auto renderer = mSource->messagePartTheme(mParsedPart); + if (renderer) { + mHtmlWriter->queue(renderer->html()); + } + } + } +} + +MessagePartPtr ObjectTreeParser::parsedPart() const +{ + return mParsedPart; +} + +bool ObjectTreeParser::processType(KMime::Content *node, ProcessResult &processResult, const QByteArray &mediaType, const QByteArray &subType, Interface::MessagePartPtr &mpRet, bool onlyOneMimePart) +{ + bool bRendered = false; + const auto sub = mSource->bodyPartFormatterFactory()->subtypeRegistry(mediaType.constData()); + auto range = sub.equal_range(subType.constData()); + for (auto it = range.first; it != range.second; ++it) { + const auto formatter = (*it).second; + if (!formatter) { + continue; + } + PartNodeBodyPart part(this, &processResult, mTopLevelContent, node, mNodeHelper); + // Set the default display strategy for this body part relying on the + // identity of Interface::BodyPart::Display and AttachmentStrategy::Display + part.setDefaultDisplay((Interface::BodyPart::Display) attachmentStrategy()->defaultDisplay(node)); + + mNodeHelper->setNodeDisplayedEmbedded(node, true); + + const Interface::MessagePart::Ptr result = formatter->process(part); + if (!result) { + continue; + } + + if (const auto mp = result.dynamicCast()) { + mp->setAttachmentFlag(node); + mpRet = result; + bRendered = true; + break; + } else if (dynamic_cast(result.data())) { + QObject *asyncResultObserver = allowAsync() ? mSource->sourceObject() : Q_NULLPTR; + const auto r = formatter->format(&part, result->htmlWriter(), asyncResultObserver); + if (r == Interface::BodyPartFormatter::AsIcon) { + processResult.setNeverDisplayInline(true); + formatter->adaptProcessResult(processResult); + mNodeHelper->setNodeDisplayedEmbedded(node, false); + const Interface::MessagePart::Ptr mp = defaultHandling(node, processResult, onlyOneMimePart); + if (mp) { + if (auto _mp = mp.dynamicCast()) { + _mp->setAttachmentFlag(node); + } + mpRet = mp; + } + bRendered = true; + break; + } else if (r == Interface::BodyPartFormatter::Ok) { + processResult.setNeverDisplayInline(true); + formatter->adaptProcessResult(processResult); + mpRet = result; + bRendered = true; + break; + } + continue; + } else { + continue; + } + } + return bRendered; +} + +MessagePart::Ptr ObjectTreeParser::parseObjectTreeInternal(KMime::Content *node, bool onlyOneMimePart) +{ + if (!node) { + return MessagePart::Ptr(); + } + + // reset pending async jobs state (we'll rediscover pending jobs as we go) + mHasPendingAsyncJobs = false; + + // reset "processed" flags for... + if (onlyOneMimePart) { + // ... this node and all descendants + mNodeHelper->setNodeUnprocessed(node, false); + if (!node->contents().isEmpty()) { + mNodeHelper->setNodeUnprocessed(node, true); + } + } else if (!node->parent()) { + // ...this node and all it's siblings and descendants + mNodeHelper->setNodeUnprocessed(node, true); + } + + const bool isRoot = node->isTopLevel(); + auto parsedPart = MessagePart::Ptr(new MessagePartList(this)); + parsedPart->setIsRoot(isRoot); + KMime::Content *parent = node->parent(); + auto contents = parent ? parent->contents() : KMime::Content::List(); + if (contents.isEmpty()) { + contents.append(node); + } + int i = contents.indexOf(const_cast(node)); + for (; i < contents.size(); ++i) { + node = contents.at(i); + if (mNodeHelper->nodeProcessed(node)) { + continue; + } + + ProcessResult processResult(mNodeHelper); + + QByteArray mediaType("text"); + QByteArray subType("plain"); + if (node->contentType(false) && !node->contentType()->mediaType().isEmpty() && + !node->contentType()->subType().isEmpty()) { + mediaType = node->contentType()->mediaType(); + subType = node->contentType()->subType(); + } + + Interface::MessagePartPtr mp; + if (processType(node, processResult, mediaType, subType, mp, onlyOneMimePart)) { + if (mp) { + parsedPart->appendSubPart(mp); + } + } else if (processType(node, processResult, mediaType, "*", mp, onlyOneMimePart)) { + if (mp) { + parsedPart->appendSubPart(mp); + } + } else { + qCWarning(MIMETREEPARSER_LOG) << "THIS SHOULD NO LONGER HAPPEN:" << mediaType << '/' << subType; + const auto mp = defaultHandling(node, processResult, onlyOneMimePart); + if (mp) { + if (auto _mp = mp.dynamicCast()) { + _mp->setAttachmentFlag(node); + } + parsedPart->appendSubPart(mp); + } + } + mNodeHelper->setNodeProcessed(node, false); + + // adjust signed/encrypted flags if inline PGP was found + processResult.adjustCryptoStatesOfNode(node); + + if (onlyOneMimePart) { + break; + } + } + + return parsedPart; +} + +Interface::MessagePart::Ptr ObjectTreeParser::defaultHandling(KMime::Content *node, ProcessResult &result, bool onlyOneMimePart) +{ + Interface::MessagePart::Ptr mp; + ProcessResult processResult(mNodeHelper); + + if (node->contentType()->mimeType() == QByteArray("application/octet-stream") && + (node->contentType()->name().endsWith(QLatin1String("p7m")) || + node->contentType()->name().endsWith(QLatin1String("p7s")) || + node->contentType()->name().endsWith(QLatin1String("p7c")) + ) && + processType(node, processResult, "application", "pkcs7-mime", mp, onlyOneMimePart)) { + return mp; + } + + const auto _mp = AttachmentMessagePart::Ptr(new AttachmentMessagePart(this, node, false, true, mSource->decryptMessage())); + result.setInlineSignatureState(_mp->signatureState()); + result.setInlineEncryptionState(_mp->encryptionState()); + _mp->setNeverDisplayInline(result.neverDisplayInline()); + _mp->setIsImage(result.isImage()); + mp = _mp; + + // always show images in multipart/related when showing in html, not with an additional icon + auto preferredMode = mSource->preferredMode(); + bool isHtmlPreferred = (preferredMode == Util::Html) || (preferredMode == Util::MultipartHtml); + if (result.isImage() && node->parent() && + node->parent()->contentType()->subType() == "related" && isHtmlPreferred && !onlyOneMimePart) { + QString fileName = mNodeHelper->writeNodeToTempFile(node); + QString href = QUrl::fromLocalFile(fileName).url(); + QByteArray cid = node->contentID()->identifier(); + if (htmlWriter()) { + htmlWriter()->embedPart(cid, href); + } + nodeHelper()->setNodeDisplayedEmbedded(node, true); + mNodeHelper->setNodeDisplayedHidden(node, true); + return mp; + } + + // Show it inline if showOnlyOneMimePart(), which means the user clicked the image + // in the message structure viewer manually, and therefore wants to see the full image + if (result.isImage() && onlyOneMimePart && !result.neverDisplayInline()) { + mNodeHelper->setNodeDisplayedEmbedded(node, true); + } + + return mp; +} + +KMMsgSignatureState ProcessResult::inlineSignatureState() const +{ + return mInlineSignatureState; +} + +void ProcessResult::setInlineSignatureState(KMMsgSignatureState state) +{ + mInlineSignatureState = state; +} + +KMMsgEncryptionState ProcessResult::inlineEncryptionState() const +{ + return mInlineEncryptionState; +} + +void ProcessResult::setInlineEncryptionState(KMMsgEncryptionState state) +{ + mInlineEncryptionState = state; +} + +bool ProcessResult::neverDisplayInline() const +{ + return mNeverDisplayInline; +} + +void ProcessResult::setNeverDisplayInline(bool display) +{ + mNeverDisplayInline = display; +} + +bool ProcessResult::isImage() const +{ + return mIsImage; +} + +void ProcessResult::setIsImage(bool image) +{ + mIsImage = image; +} + +void ProcessResult::adjustCryptoStatesOfNode(const KMime::Content *node) const +{ + if ((inlineSignatureState() != KMMsgNotSigned) || + (inlineEncryptionState() != KMMsgNotEncrypted)) { + mNodeHelper->setSignatureState(node, inlineSignatureState()); + mNodeHelper->setEncryptionState(node, inlineEncryptionState()); + } +} + +void ObjectTreeParser::extractNodeInfos(KMime::Content *curNode, bool isFirstTextPart) +{ + if (isFirstTextPart) { + mPlainTextContent += curNode->decodedText(); + mPlainTextContentCharset += NodeHelper::charset(curNode); + } +} + +void ObjectTreeParser::setPlainTextContent(const QString &plainTextContent) +{ + mPlainTextContent = plainTextContent; +} + +const QTextCodec *ObjectTreeParser::codecFor(KMime::Content *node) const +{ + Q_ASSERT(node); + if (mSource->overrideCodec()) { + return mSource->overrideCodec(); + } + return mNodeHelper->codec(node); +} + +QByteArray ObjectTreeParser::plainTextContentCharset() const +{ + return mPlainTextContentCharset; +} + +QByteArray ObjectTreeParser::htmlContentCharset() const +{ + return mHtmlContentCharset; +} + +bool ObjectTreeParser::showOnlyOneMimePart() const +{ + return mShowOnlyOneMimePart; +} + +void ObjectTreeParser::setShowOnlyOneMimePart(bool show) +{ + mShowOnlyOneMimePart = show; +} + +const AttachmentStrategy *ObjectTreeParser::attachmentStrategy() const +{ + return mAttachmentStrategy; +} + +HtmlWriter *ObjectTreeParser::htmlWriter() const +{ + if (mHtmlWriter) { + return mHtmlWriter; + } + return mSource->htmlWriter(); +} + +MimeTreeParser::NodeHelper *ObjectTreeParser::nodeHelper() const +{ + return mNodeHelper; +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/objecttreeparser.h kf5-messagelib-16.12.3/mimetreeparser/src/viewer/objecttreeparser.h --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/objecttreeparser.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/objecttreeparser.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,408 @@ +/* + objecttreeparser.h + + This file is part of KMail, the KDE mail client. + Copyright (c) 2003 Marc Mutz + Copyright (C) 2002-2003, 2009 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.net + Copyright (c) 2009 Andras Mantia + + KMail is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#ifndef __MIMETREEPARSER_OBJECTTREEPARSER_H__ +#define __MIMETREEPARSER_OBJECTTREEPARSER_H__ + +#include "mimetreeparser_export.h" + +#include "mimetreeparser/nodehelper.h" +#include "mimetreeparser/objecttreesource.h" + +#include + +class QString; + +namespace KMime +{ +class Content; +} + +namespace MimeTreeParser +{ + +namespace Interface +{ +class MessagePart; +typedef QSharedPointer MessagePartPtr; +} + +class PartMetaData; +class ViewerPrivate; +class HtmlWriter; +class AttachmentStrategy; +class NodeHelper; +class MessagePart; +class MimeMessagePart; + +typedef QSharedPointer MessagePartPtr; +typedef QSharedPointer MimeMessagePartPtr; + +class MIMETREEPARSER_EXPORT ProcessResult +{ +public: + explicit ProcessResult(NodeHelper *nodeHelper, KMMsgSignatureState inlineSignatureState = KMMsgNotSigned, + KMMsgEncryptionState inlineEncryptionState = KMMsgNotEncrypted, + bool neverDisplayInline = false, + bool isImage = false) + : mInlineSignatureState(inlineSignatureState), + mInlineEncryptionState(inlineEncryptionState), + mNeverDisplayInline(neverDisplayInline), + mIsImage(isImage), + mNodeHelper(nodeHelper) {} + + KMMsgSignatureState inlineSignatureState() const; + void setInlineSignatureState(KMMsgSignatureState state); + + KMMsgEncryptionState inlineEncryptionState() const; + void setInlineEncryptionState(KMMsgEncryptionState state); + + bool neverDisplayInline() const; + void setNeverDisplayInline(bool display); + + bool isImage() const; + void setIsImage(bool image); + + void adjustCryptoStatesOfNode(const KMime::Content *node) const; + +private: + KMMsgSignatureState mInlineSignatureState; + KMMsgEncryptionState mInlineEncryptionState; + bool mNeverDisplayInline : 1; + bool mIsImage : 1; + NodeHelper *mNodeHelper; +}; + +/** +\brief Parses messages and generates HTML display code out of them + +\par Introduction + +First, have a look at the documentation in Mainpage.dox and at the documentation of ViewerPrivate +to understand the broader picture. + +Just a note on the terminology: 'Node' refers to a MIME part here, which in KMime is a +KMime::Content. + +\par Basics + +The ObjectTreeParser basically has two modes: Generating the HTML code for the Viewer, or only +extracting the plainTextContent() for situations where only the message text is needed, for example +when inline forwarding a message. The mode depends on the Interface::ObjectTreeSource passed to the +constructor: If Interface::ObjectTreeSource::htmlWriter() is not 0, then the HTML code generation mode is +used. + +Basically, all the ObjectTreeParser does is going through the tree of MIME parts and operating on +those nodes. Operating here means creating the HTML code for the node or extracting the textual +content from it. This process is started with parseObjectTree(), where we loop over the subnodes +of the current root node. For each of those subnodes, we try to find a BodyPartFormatter that can +handle the type of the node. This can either be an internal function, such as +processMultiPartAlternativeSubtype() or processTextHtmlSubtype(), or it can be an external plugin. +More on external plugins later. When no matching formatter is found, defaultHandling() is called +for that node. + +\par Multipart Nodes + +Those nodes that are of type multipart have subnodes. If one of those children needs to be +processed normally, the processMultipartXXX() functions call stdChildHandling() for the node that +should be handled normally. stdChildHandling() creates its own ObjectTreeParser, which is a clone +of the current ObjectTreeParser, and processes the node. stdChildHandling() is not called for all +children of the multipart node, for example processMultiPartAlternativeSubtype() only calls it on +one of the children, as the other one doesn't need to be displayed. Similary, +processMultiPartSignedSubtype() doesn't call stdChildHandling() for the signature node, only for the +signed node. + +\par Processed and Unprocessed Nodes + +When a BodyPartFormatter has finished processing a node, it is processed. Nodes are set to being +not processed at the beginning of parseObjectTree(). The processed state of a node is saved in a +list in NodeHelper, see NodeHelper::setNodeProcessed(), NodeHelper::nodeProcessed() and the other +related helper functions. + +It is the responsibility of the BodyPartFormatter to correctly call setNodeProcessed() and the +related functions. This is important so that processing the same node twice can be prevented. The +check that prevents duplicate processing is in parseObjectTree(). + +An example where duplicate processing would happen if we didn't check for it is in stdChildHandling(), +which is for example called from processMultiPartAlternativeSubtype(). Let's say the setting is to +prefer HTML over plain text. In this case, processMultiPartAlternativeSubtype() would call +stdChildHandling() on the HTML node, which would create a new ObjectTreeParser and call +parseObjectTree() on it. parseObjectTree() processes the node and all its siblings, and one of the +siblings is the plain text node, which shouldn't be processed! Therefore +processMultiPartAlternativeSubtype() sets the plain text node as been processed already. + +\par Plain Text Output + +Various nodes have plain text that should be displayed. This plain text is usually processed though +writeBodyString() first. That method checks if the provided text is an inline PGP text and decrypts +it if necessary. It also pushes the text through quotedHTML(), which does a number of things like +coloring quoted lines or detecting links and creating real link tags for them. + +\par Modifying the Message + +The ObjectTreeParser does not only parse its message, in some circumstances it also modifies it +before displaying. This is for example the case when displaying a decrypted message: The original +message only contains a binary blob of crypto data, and processMultiPartEncryptedSubtype() decrypts +that blob. After decryption, the current node is replaced with the decrypted node, which happens +in insertAndParseNewChildNode(). + +\par Crypto Operations + +For signature and decryption handling, there are functions which help with generating the HTML code +for the signature header and footer. These are writeDeferredDecryptionBlock(), writeSigstatFooter() +and writeSigstatHeader(). As the name writeDeferredDecryptionBlock() suggests, a setting can cause +the message to not be decrypted unless the user clicks a link. Whether the message should be +decrypted or not can be controlled by Interface::ObjectTreeSource::decryptMessage(). When the user clicks the +decryption link, the URLHandler for 'kmail:' URLs sets that variable to true and triggers an update +of the Viewer, which will cause parseObjectTree() to be called again. + +\par Async Crypto Operations + +The above case describes decryption the message in place. However, decryption and also verifying of +the signature can take a long time, so synchronous decryption and verifing would cause the Viewer to +block. Therefore it is possible to run these operations in async mode, see allowAsync(). +In the first run of the async mode, all the ObjectTreeParser does is starting the decrypt or the +verify job, and informing the user that the operation is in progress with +writeDecryptionInProgressBlock() or with writeSigstatHeader(). Then, it creates and associates a +BodyPartMemento with the current node, for example a VerifyDetachedBodyPartMemento. Each node can +have multiple mementos associated with it, which are differeniated by name. + +NodeHelper::setBodyPartMemento() and NodeHelper::bodyPartMemento() provide means to store and +retrieve these mementos. A memento is basically a thin wrapper around the crypto job, it stores the +job pointer, the job input data and the job result. Mementos can be used for any async situation, +not just for crypto jobs, but I'll describe crypto jobs here. + +So in the first run of decrypting or verifying a message, the BodyPartFormatter only starts the +crypto job, creates the BodyPartMemento and writes the HTML code that tells the user that the +operation is in progress. parseObjectTree() thus finishes without waiting for anything, and the +message is displayed. + +At some point, the crypto jobs then finish, which will cause slotResult() of the BodyPartMemento +to be called. slotResult() then saves the result to some member variable and calls +BodyPartMemento::notify(), which in the end will trigger an update of the Viewer. That update +will, in ViewerPrivate::parseMsg(), create a new ObjectTreeParser and call parseObjectTree() on it. +This is where the second run begins. + +The functions that deal with decrypting of verifying, like processMultiPartSignedSubtype() or +processMultiPartEncryptedSubtype() will look if they find a BodyPartMemento that is associated with +the current node. Now it finds that memento, since it was created in the first run. It checks if the +memento's job has finished, and if so, the result can be written out (either the decrypted data or +the verified signature). + +When dealing with encrypted nodes, new nodes are created with the decrypted data. It is important to +note that the original MIME tree is never modified, and remains the same as the original one. The method +createAndParseTempNode is called with the newly decrypted data, and it generates a new temporary node to +store the decrypted data. When these nodes are created, it is important to keep track of them as otherwise +some mementos that are added to the newly created temporary nodes will be constantly regenerated. As the +regeneration triggers a viewer update when complete, it results in an infinite refresh loop. The function +NodeHelper::linkAsPermanentDecrypted will create a link between the newly created node and the original parent. +Conversely, the function NodeHelper::attachExtraContent will create a link in the other direction, from the parent +node to the newly created temporary node. + +When generating some mementos for nodes that may be temporary nodes (for example, contact photo mementos), the +function NodeHelper::setBodyPartMementoForPermanentParent is used. This will save the given body part memento for +the closest found permanent parent node, rather than the transient node itself. Then when checking for the existence +of a certain memento in a node, NodeHelper::findPermanentParentBodyPartMemento will check to see if any parent of the +given temporary node is a permanent (encrypted) node that has been used to generate the asked-for node. + +To conclude: For async operations, parseObjectTree() is called twice: The first call starts the +crypto operation and creates the BodyPartMemento, the second calls sees that the BodyPartMemento is +there and can use its result for writing out the HTML. + +\par PartMetaData and ProcessResult + +For crypto operations, the class PartMetaData is used a lot, mainly to pass around info about the +crypto state of a node. A PartMetaData can also be associated with a node by using +NodeHelper::setPartMetaData(). The only user of that however is MessageAnalyzer::processPart() of +the Nepomuk E-Mail Feeder, which also uses the ObjectTreeParser to analyze the message. + +You'll notice that a ProcessResult is passed to each formatter. The formatter is supposed to modify +the ProcessResult to tell the callers something about the state of the nodes that were processed. +One example for its use is to tell the caller about the crypto state of the node. + +\par BodyPartFormatter Plugins + +As mentioned way earlier, BodyPartFormatter can either be plugins or be internal. bodypartformatter.cpp +contains some trickery so that the processXXX() methods of the ObjectTreeParser are called from +a BodyPartFormatter associated with them, see the CREATE_BODY_PART_FORMATTER macro. + +The BodyPartFormatter code is work in progress, it was supposed to be refactored, but that has not +yet happened at the time of writing. Therefore the code can seem a bit chaotic. + +External plugins are loaded with loadPlugins() in bodypartformatterfactory.cpp. External plugins +can only use the classes in the interfaces/ directory, they include BodyPart, BodyPartMemento, +BodyPartFormatterPlugin, BodyPartFormatter, BodyPartURLHandler, HtmlWriter and URLHandler. Therefore +external plugins have powerful capabilities, which are needed for example in the iCal formatter or +in the vCard formatter. + +\par Special HTML tags + +As also mentioned in the documentation of ViewerPrivate, the ObjectTreeParser writes out special +links that are only understood by the viewer, for example 'kmail:' URLs or 'attachment:' URLs. +Also, some special HTML tags are created, which the Viewer later uses for post-processing. For +example a div with the id 'attachmentInjectionPoint', or a div with the id 'attachmentDiv', which +is used to mark an attachment in the body with a yellow border when the user clicks the attachment +in the header. Finally, parseObjectTree() creates an anchor with the id 'att%1', which is used in +the Viewer to scroll to the attachment. +*/ +class MIMETREEPARSER_EXPORT ObjectTreeParser +{ + /** + * @internal + * Copies the context of @p other, but not it's rawDecryptedBody, plainTextContent or htmlContent. + */ + ObjectTreeParser(const ObjectTreeParser &other); + +public: + explicit ObjectTreeParser(Interface::ObjectTreeSource *source, + NodeHelper *nodeHelper = Q_NULLPTR, + bool showOneMimePart = false, + const AttachmentStrategy *attachmentStrategy = Q_NULLPTR); + + explicit ObjectTreeParser(const ObjectTreeParser *topLevelParser, + bool showOneMimePart = false, + const AttachmentStrategy *attachmentStrategy = Q_NULLPTR); + virtual ~ObjectTreeParser(); + + void setAllowAsync(bool allow); + bool allowAsync() const; + + bool hasPendingAsyncJobs() const; + + /** + * The text of the message, ie. what would appear in the + * composer's text editor if this was edited or replied to. + * This is usually the content of the first text/plain MIME part. + */ + QString plainTextContent() const; + + /** + * Similar to plainTextContent(), but returns the HTML source of the first text/html MIME part. + * + * Not to be consfused with the HTML code that the message viewer widget displays, that HTML + * is written out by htmlWriter() and a totally different pair of shoes. + */ + QString htmlContent() const; + + /** + * The original charset of MIME part the plain text was extracted from. + * + * If there were more than one text/plain MIME parts in the mail, the this is the charset + * of the last MIME part processed. + */ + QByteArray plainTextContentCharset() const; + QByteArray htmlContentCharset() const; + + bool showOnlyOneMimePart() const; + void setShowOnlyOneMimePart(bool show); + + const AttachmentStrategy *attachmentStrategy() const; + + HtmlWriter *htmlWriter() const; + + NodeHelper *nodeHelper() const; + + /** Parse beginning at a given node and recursively parsing + the children of that node and it's next sibling. */ + void parseObjectTree(KMime::Content *node); + MessagePartPtr parsedPart() const; + +private: + void extractNodeInfos(KMime::Content *curNode, bool isFirstTextPart); + void setPlainTextContent(const QString &plainTextContent); + + /** + * Does the actual work for parseObjectTree. Unlike parseObjectTree(), this does not change the + * top-level content. + */ + MessagePartPtr parseObjectTreeInternal(KMime::Content *node, bool mOnlyOneMimePart); + bool processType(KMime::Content *node, MimeTreeParser::ProcessResult &processResult, const QByteArray &mediaType, const QByteArray &subType, Interface::MessagePartPtr &mpRet, bool onlyOneMimePart); + + Interface::MessagePartPtr defaultHandling(KMime::Content *node, MimeTreeParser::ProcessResult &result, bool onlyOneMimePart); + +private: + + /** ctor helper */ + void init(); + + const QTextCodec *codecFor(KMime::Content *node) const; + + void copyContentFrom(const ObjectTreeParser *other); + +private: + Interface::ObjectTreeSource *mSource; + NodeHelper *mNodeHelper; + HtmlWriter *mHtmlWriter; + QByteArray mPlainTextContentCharset; + QByteArray mHtmlContentCharset; + QString mPlainTextContent; + QString mHtmlContent; + KMime::Content *mTopLevelContent; + MessagePartPtr mParsedPart; + + /// Show only one mime part means that the user has selected some node in the message structure + /// viewer that is not the root, which means the user wants to only see the selected node and its + /// children. If that is the case, this variable is set to true. + /// The code needs to behave differently if this is set. For example, it should not process the + /// siblings. Also, consider inline images: Normally, those nodes are completely hidden, as the + /// HTML node embedds them. However, when showing only the node of the image, one has to show them, + /// as their is no HTML node in which they are displayed. There are many more cases where this + /// variable needs to be obeyed. + /// This variable is set to false again when processing the children in stdChildHandling(), as + /// the children can be completely displayed again. + bool mShowOnlyOneMimePart; + + bool mHasPendingAsyncJobs; + bool mAllowAsync; + const AttachmentStrategy *mAttachmentStrategy; + // DataUrl Icons cache + QString mCollapseIcon; + QString mExpandIcon; + bool mDeleteNodeHelper; + + friend class PartNodeBodyPart; + friend class MessagePart; + friend class EncryptedMessagePart; + friend class SignedMessagePart; + friend class EncapsulatedRfc822MessagePart; + friend class TextMessagePart; + friend class HtmlMessagePart; + friend class TextPlainBodyPartFormatter; + friend class MultiPartSignedBodyPartFormatter; + friend class ApplicationPkcs7MimeBodyPartFormatter; +}; + +} + +#endif // __MIMETREEPARSER_OBJECTTREEPARSER_H__ + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/partmetadata.h kf5-messagelib-16.12.3/mimetreeparser/src/viewer/partmetadata.h --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/partmetadata.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/partmetadata.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,69 @@ +/* -*- c++ -*- + partmetadata.h + + KMail, the KDE mail client. + Copyright (c) 2002-2003 Karl-Heinz Zimmer + Copyright (c) 2003 Marc Mutz + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License, + version 2.0, as published by the Free Software Foundation. + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, US +*/ + +#ifndef __MIMETREEPARSER_PARTMETADATA_H__ +#define __MIMETREEPARSER_PARTMETADATA_H__ + +#include "mimetreeparser_export.h" + +#include +#include + +#include +#include + +namespace MimeTreeParser +{ + +class PartMetaData +{ +public: + PartMetaData() + : sigSummary(GpgME::Signature::None), + isSigned(false), + isGoodSignature(false), + isEncrypted(false), + isDecryptable(false), + inProgress(false), + technicalProblem(false), + isEncapsulatedRfc822Message(false) + { + } + GpgME::Signature::Summary sigSummary; + QString signClass; + QString signer; + QStringList signerMailAddresses; + QByteArray keyId; + GpgME::Signature::Validity keyTrust; + QString status; // to be used for unknown plug-ins + int status_code; // to be used for i18n of OpenPGP and S/MIME CryptPlugs + QString errorText; + QDateTime creationTime; + QString decryptionError; + QString auditLog; + GpgME::Error auditLogError; + bool isSigned : 1; + bool isGoodSignature : 1; + bool isEncrypted : 1; + bool isDecryptable : 1; + bool inProgress : 1; + bool technicalProblem : 1; + bool isEncapsulatedRfc822Message : 1; +}; + +} + +#endif // __MIMETREEPARSER_PARTMETADATA_H__ + diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/partnodebodypart.cpp kf5-messagelib-16.12.3/mimetreeparser/src/viewer/partnodebodypart.cpp --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/partnodebodypart.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/partnodebodypart.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,125 @@ +/* + partnodebodypart.cpp + + This file is part of KMail, the KDE mail client. + Copyright (c) 2004 Marc Mutz , + Ingo Kloecker + + KMail 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. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#include "partnodebodypart.h" +#include "nodehelper.h" +#include "objecttreeparser.h" +#include "mimetreeparser_debug.h" +#include + +#include +#include + +using namespace MimeTreeParser; + +static int serial = 0; + +PartNodeBodyPart::PartNodeBodyPart(ObjectTreeParser *otp, ProcessResult *result, KMime::Content *topLevelContent, KMime::Content *content, + NodeHelper *nodeHelper) + : Interface::BodyPart(), mTopLevelContent(topLevelContent), mContent(content), + mDefaultDisplay(Interface::BodyPart::None), mNodeHelper(nodeHelper) + , mObjectTreeParser(otp) + , mProcessResult(result) +{} + +QString PartNodeBodyPart::makeLink(const QString &path) const +{ + // FIXME: use a PRNG for the first arg, instead of a serial number + return QStringLiteral("x-kmail:/bodypart/%1/%2/%3") + .arg(serial++).arg(mContent->index().toString()) + .arg(QString::fromLatin1(QUrl::toPercentEncoding(path, "/"))); +} + +QString PartNodeBodyPart::asText() const +{ + if (!mContent->contentType()->isText()) { + return QString(); + } + return mContent->decodedText(); +} + +QByteArray PartNodeBodyPart::asBinary() const +{ + return mContent->decodedContent(); +} + +QString PartNodeBodyPart::contentTypeParameter(const char *param) const +{ + return mContent->contentType()->parameter(QString::fromLatin1(param)); +} + +QString PartNodeBodyPart::contentDescription() const +{ + return mContent->contentDescription()->asUnicodeString(); +} + +QString PartNodeBodyPart::contentDispositionParameter(const char *param) const +{ + return mContent->contentDisposition()->parameter(QString::fromLatin1(param)); +} + +bool PartNodeBodyPart::hasCompleteBody() const +{ + qCWarning(MIMETREEPARSER_LOG) << "Sorry, not yet implemented."; + return true; +} + +Interface::BodyPartMemento *PartNodeBodyPart::memento() const +{ + /*TODO(Andras) Volker suggests to use a ContentIndex->Mememnto mapping + Also review if the reader's bodyPartMemento should be returned or the NodeHelper's one + */ + return mNodeHelper->bodyPartMemento(mContent, "__plugin__"); +} + +void PartNodeBodyPart::setBodyPartMemento(Interface::BodyPartMemento *memento) +{ + /*TODO(Andras) Volker suggests to use a ContentIndex->Memento mapping + Also review if the reader's bodyPartMemento should be set or the NodeHelper's one */ + mNodeHelper->setBodyPartMemento(mContent, "__plugin__", memento); +} + +Interface::BodyPart::Display PartNodeBodyPart::defaultDisplay() const +{ + return mDefaultDisplay; +} + +void PartNodeBodyPart::setDefaultDisplay(Interface::BodyPart::Display d) +{ + mDefaultDisplay = d; +} + +Interface::ObjectTreeSource *PartNodeBodyPart::source() const +{ + return mObjectTreeParser->mSource; +} diff -Nru kf5-messagelib-16.04.3/mimetreeparser/src/viewer/partnodebodypart.h kf5-messagelib-16.12.3/mimetreeparser/src/viewer/partnodebodypart.h --- kf5-messagelib-16.04.3/mimetreeparser/src/viewer/partnodebodypart.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/mimetreeparser/src/viewer/partnodebodypart.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,111 @@ +/* + partnodebodypart.h + + This file is part of KMail, the KDE mail client. + Copyright (c) 2004 Marc Mutz , + Ingo Kloecker + + KMail 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. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#ifndef __MIMETREEPARSER_PARTNODEBODYPART_H__ +#define __MIMETREEPARSER_PARTNODEBODYPART_H__ + +#include "mimetreeparser_export.h" +#include "mimetreeparser/bodypart.h" + +class QTextCodec; + +namespace KMime +{ +class Content; +} + +namespace MimeTreeParser +{ +class NodeHelper; +} + +namespace MimeTreeParser +{ + +/** + @short an implementation of the BodyPart interface using KMime::Content's +*/ +class MIMETREEPARSER_EXPORT PartNodeBodyPart : public Interface::BodyPart +{ +public: + explicit PartNodeBodyPart(ObjectTreeParser *otp, ProcessResult *result, KMime::Content *topLevelContent, KMime::Content *content, + NodeHelper *nodeHelper); + + QString makeLink(const QString &path) const Q_DECL_OVERRIDE; + QString asText() const Q_DECL_OVERRIDE; + QByteArray asBinary() const Q_DECL_OVERRIDE; + QString contentTypeParameter(const char *param) const Q_DECL_OVERRIDE; + QString contentDescription() const Q_DECL_OVERRIDE; + QString contentDispositionParameter(const char *param) const Q_DECL_OVERRIDE; + bool hasCompleteBody() const Q_DECL_OVERRIDE; + + Interface::BodyPartMemento *memento() const Q_DECL_OVERRIDE; + void setBodyPartMemento(Interface::BodyPartMemento *memento) Q_DECL_OVERRIDE; + BodyPart::Display defaultDisplay() const Q_DECL_OVERRIDE; + void setDefaultDisplay(BodyPart::Display); + KMime::Content *content() const Q_DECL_OVERRIDE + { + return mContent; + } + KMime::Content *topLevelContent() const Q_DECL_OVERRIDE + { + return mTopLevelContent; + } + NodeHelper *nodeHelper() const Q_DECL_OVERRIDE + { + return mNodeHelper; + } + + ObjectTreeParser *objectTreeParser() const Q_DECL_OVERRIDE + { + return mObjectTreeParser; + } + + ProcessResult *processResult() const Q_DECL_OVERRIDE + { + return mProcessResult; + } + + Interface::ObjectTreeSource *source() const Q_DECL_OVERRIDE; +private: + KMime::Content *mTopLevelContent; + KMime::Content *mContent; + BodyPart::Display mDefaultDisplay; + NodeHelper *mNodeHelper; + ObjectTreeParser *mObjectTreeParser; + ProcessResult *mProcessResult; +}; + +} + +#endif // __MIMETREEPARSER_PARTNODEBODYPART_H__ diff -Nru kf5-messagelib-16.04.3/templateparser/autotests/CMakeLists.txt kf5-messagelib-16.12.3/templateparser/autotests/CMakeLists.txt --- kf5-messagelib-16.04.3/templateparser/autotests/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/autotests/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -15,9 +15,8 @@ KF5::Libkleo KF5::TemplateParser KF5::MessageViewer - KF5::QGpgme + QGpgme Qt5::Test - Qt5::WebKitWidgets KF5::KIOCore KF5::Mime KF5::AkonadiCore diff -Nru kf5-messagelib-16.04.3/templateparser/autotests/data/html-attachment1.mbox kf5-messagelib-16.12.3/templateparser/autotests/data/html-attachment1.mbox --- kf5-messagelib-16.04.3/templateparser/autotests/data/html-attachment1.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/autotests/data/html-attachment1.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,84 @@ +Return-path: +Envelope-to: gunter@ohrner.net +Delivery-date: Mon, 12 Sep 2016 13:38:39 +0200 +Received: from mail.from example.com ([178.251.88.150]) + by luggage.ohrner.net with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:256) + (Exim 4.80) + (envelope-from ) + id 1bjPYi-0000oA-Re + for gunter@ohrner.net; Mon, 12 Sep 2016 13:38:39 +0200 +Received: from example.com.local (172.17.124.205) by from example.com.local + (172.17.124.1) with Microsoft SMTP Server id 14.3.266.1; Mon, 12 Sep 2016 + 13:37:53 +0200 +From: +To: +Message-ID: <8614416.18.1473680273823.JavaMail.sender@example.com> +MIME-Version: 1.0 +Content-Type: multipart/mixed; + boundary="----=_Part_16_9312243.1473680273820" +Date: Mon, 12 Sep 2016 13:37:53 +0200 +X-TM-AS-Product-Ver: SMEX-11.1.0.1278-8.000.1202-22570.004 +X-TM-AS-Result: No--23.664000-5.000000-31 +X-TM-AS-User-Approved-Sender: No +X-TM-AS-User-Blocked-Sender: No +Subject: A Subject Line + +------=_Part_16_9312243.1473680273820 +Content-Type: text/html; charset="utf-8" +Content-Transfer-Encoding: 8bit + +

A Body Text

+------=_Part_16_9312243.1473680273820 +Content-Type: application/octet-stream; + name="Attachment1.pdf" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment + +JVBERi0xLjEKJeLjz9MKMSAwIG9iaiAKPDwKL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDIgMCBSCj4+ +CmVuZG9iaiAKMiAwIG9iaiAKPDwKL0tpZHMgWzMgMCBSXQovVHlwZSAvUGFnZXMKL01lZGlhQm94 +IFswIDAgMzAwIDE0NF0KL0NvdW50IDEKPj4KZW5kb2JqIAozIDAgb2JqIAo8PAovUmVzb3VyY2Vz +IAo8PAovRm9udCAKPDwKL0YxIAo8PAovU3VidHlwZSAvVHlwZTEKL1R5cGUgL0ZvbnQKL0Jhc2VG +b250IC9UaW1lcy1Sb21hbgo+Pgo+Pgo+PgovQ29udGVudHMgNCAwIFIKL1BhcmVudCAyIDAgUgov +VHlwZSAvUGFnZQovTWVkaWFCb3ggWzAgMCAzMDAgMTQ0XQo+PgplbmRvYmogCjQgMCBvYmogCjw8 +Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCi9MZW5ndGggNTIKPj4Kc3RyZWFtCnicU1BwCuFSAAJ9N0MF +QwuFkDQwzwAIQ1LATA2P1JycfIXw/KKcFE2FkCygoGsIACsbDAQKZW5kc3RyZWFtIAplbmRvYmog +eHJlZgowIDUKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAw +NjYgMDAwMDAgbiAKMDAwMDAwMDE0OSAwMDAwMCBuIAowMDAwMDAwMzMxIDAwMDAwIG4gCnRyYWls +ZXIKCjw8Ci9Sb290IDEgMCBSCi9TaXplIDUKPj4Kc3RhcnR4cmVmCjQ1NgolJUVPRgo= + +------=_Part_16_9312243.1473680273820 +Content-Type: application/octet-stream; name="Attachment2.pdf" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment + +JVBERi0xLjEKJeLjz9MKMSAwIG9iaiAKPDwKL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDIgMCBSCj4+ +CmVuZG9iaiAKMiAwIG9iaiAKPDwKL0tpZHMgWzMgMCBSXQovVHlwZSAvUGFnZXMKL01lZGlhQm94 +IFswIDAgMzAwIDE0NF0KL0NvdW50IDEKPj4KZW5kb2JqIAozIDAgb2JqIAo8PAovUmVzb3VyY2Vz +IAo8PAovRm9udCAKPDwKL0YxIAo8PAovU3VidHlwZSAvVHlwZTEKL1R5cGUgL0ZvbnQKL0Jhc2VG +b250IC9UaW1lcy1Sb21hbgo+Pgo+Pgo+PgovQ29udGVudHMgNCAwIFIKL1BhcmVudCAyIDAgUgov +VHlwZSAvUGFnZQovTWVkaWFCb3ggWzAgMCAzMDAgMTQ0XQo+PgplbmRvYmogCjQgMCBvYmogCjw8 +Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCi9MZW5ndGggNTIKPj4Kc3RyZWFtCnicU1BwCuFSAAJ9N0MF +QwuFkDQwzwAIQ1LATA2P1JycfIXw/KKcFE2FkCygoGsIACsbDAQKZW5kc3RyZWFtIAplbmRvYmog +eHJlZgowIDUKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAw +NjYgMDAwMDAgbiAKMDAwMDAwMDE0OSAwMDAwMCBuIAowMDAwMDAwMzMxIDAwMDAwIG4gCnRyYWls +ZXIKCjw8Ci9Sb290IDEgMCBSCi9TaXplIDUKPj4Kc3RhcnR4cmVmCjQ1NgolJUVPRgo= + +------=_Part_16_9312243.1473680273820 +Content-Type: application/octet-stream; name="Attachment3.pdf" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment + +JVBERi0xLjEKJeLjz9MKMSAwIG9iaiAKPDwKL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDIgMCBSCj4+ +CmVuZG9iaiAKMiAwIG9iaiAKPDwKL0tpZHMgWzMgMCBSXQovVHlwZSAvUGFnZXMKL01lZGlhQm94 +IFswIDAgMzAwIDE0NF0KL0NvdW50IDEKPj4KZW5kb2JqIAozIDAgb2JqIAo8PAovUmVzb3VyY2Vz +IAo8PAovRm9udCAKPDwKL0YxIAo8PAovU3VidHlwZSAvVHlwZTEKL1R5cGUgL0ZvbnQKL0Jhc2VG +b250IC9UaW1lcy1Sb21hbgo+Pgo+Pgo+PgovQ29udGVudHMgNCAwIFIKL1BhcmVudCAyIDAgUgov +VHlwZSAvUGFnZQovTWVkaWFCb3ggWzAgMCAzMDAgMTQ0XQo+PgplbmRvYmogCjQgMCBvYmogCjw8 +Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCi9MZW5ndGggNTIKPj4Kc3RyZWFtCnicU1BwCuFSAAJ9N0MF +QwuFkDQwzwAIQ1LATA2P1JycfIXw/KKcFE2FkCygoGsIACsbDAQKZW5kc3RyZWFtIAplbmRvYmog +eHJlZgowIDUKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAw +NjYgMDAwMDAgbiAKMDAwMDAwMDE0OSAwMDAwMCBuIAowMDAwMDAwMzMxIDAwMDAwIG4gCnRyYWls +ZXIKCjw8Ci9Sb290IDEgMCBSCi9TaXplIDUKPj4Kc3RhcnR4cmVmCjQ1NgolJUVPRgo= + +------=_Part_16_9312243.1473680273820-- + diff -Nru kf5-messagelib-16.04.3/templateparser/autotests/data/html-attachment1.mbox.plain.reply kf5-messagelib-16.12.3/templateparser/autotests/data/html-attachment1.mbox.plain.reply --- kf5-messagelib-16.04.3/templateparser/autotests/data/html-attachment1.mbox.plain.reply 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/autotests/data/html-attachment1.mbox.plain.reply 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1 @@ +A Body Text \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/templateparser/autotests/data/html-attachment2.mbox kf5-messagelib-16.12.3/templateparser/autotests/data/html-attachment2.mbox --- kf5-messagelib-16.04.3/templateparser/autotests/data/html-attachment2.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/autotests/data/html-attachment2.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,30 @@ +From maillists@whattf.com Tue Jul 05 19:20:58 2011 +Return-path: +Envelope-to: maillists@whattf.com +Date: Mon, 24 Oct 2016 11:53:00 +0100 +To: maillists@whattf.com +From: maillists@whattf.com +MIME-Version: 1.0 +Subject: Test +Content-Type: multipart/related; boundary="----=_Part_20324_1054669183.1477306380301" +MIME-Version: 1.0 + +------=_Part_20324_1054669183.1477306380301 +Content-Type: text/html; charset="UTF-8" +Content-Transfer-Encoding: 7bit + +HTML Text +------=_Part_20324_1054669183.1477306380301 +Content-Type: image/png +Content-Disposition: attachment; filename="image1.png" +Content-ID: cid1 + +Image1 +------=_Part_20324_1054669183.1477306380301 +Content-Type: image/png +Content-Disposition: attachment; filename="image2.png" +Content-ID: cid2 + +Image2 +------=_Part_20324_1054669183.1477306380301-- + diff -Nru kf5-messagelib-16.04.3/templateparser/autotests/data/html-attachment2.mbox.plain.reply kf5-messagelib-16.12.3/templateparser/autotests/data/html-attachment2.mbox.plain.reply --- kf5-messagelib-16.04.3/templateparser/autotests/data/html-attachment2.mbox.plain.reply 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/autotests/data/html-attachment2.mbox.plain.reply 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1 @@ +HTML Text \ No newline at end of file diff -Nru kf5-messagelib-16.04.3/templateparser/autotests/data/plain-message.mbox.plain.reply kf5-messagelib-16.12.3/templateparser/autotests/data/plain-message.mbox.plain.reply --- kf5-messagelib-16.04.3/templateparser/autotests/data/plain-message.mbox.plain.reply 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/autotests/data/plain-message.mbox.plain.reply 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,5 @@ +This is the message text from Sudhendu Kumar. + +-- +Thanks & Regards +Sudhendu Kumar diff -Nru kf5-messagelib-16.04.3/templateparser/autotests/data/plain-message-timezone.mbox kf5-messagelib-16.12.3/templateparser/autotests/data/plain-message-timezone.mbox --- kf5-messagelib-16.04.3/templateparser/autotests/data/plain-message-timezone.mbox 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/autotests/data/plain-message-timezone.mbox 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,16 @@ +From: Sudhendu Kumar +To: kde +Reply-To: bla@yoohoo.org +Cc: test@yoohoo.org +Subject: Plain Message Test +Date: Sun, 1 Jan 2017 13:31:25 -0600 +Message-ID: <20150@foo.kde.org> +MIME-Version: 1.0 +Content-Type: text/plain; + charset="iso-8859-15" + +This is the message text from Sudhendu Kumar. + +-- +Thanks & Regards +Sudhendu Kumar diff -Nru kf5-messagelib-16.04.3/templateparser/autotests/data/plain-message-timezone.mbox.html kf5-messagelib-16.12.3/templateparser/autotests/data/plain-message-timezone.mbox.html --- kf5-messagelib-16.04.3/templateparser/autotests/data/plain-message-timezone.mbox.html 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/autotests/data/plain-message-timezone.mbox.html 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1 @@ +This is the message text from Sudhendu Kumar<dontspamme@yoohoo.com>.

--
Thanks & Regards
Sudhendu Kumar
diff -Nru kf5-messagelib-16.04.3/templateparser/autotests/data/plain-message-timezone.mbox.plain.reply kf5-messagelib-16.12.3/templateparser/autotests/data/plain-message-timezone.mbox.plain.reply --- kf5-messagelib-16.04.3/templateparser/autotests/data/plain-message-timezone.mbox.plain.reply 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/autotests/data/plain-message-timezone.mbox.plain.reply 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,5 @@ +This is the message text from Sudhendu Kumar. + +-- +Thanks & Regards +Sudhendu Kumar diff -Nru kf5-messagelib-16.04.3/templateparser/autotests/templateparsertest.cpp kf5-messagelib-16.12.3/templateparser/autotests/templateparsertest.cpp --- kf5-messagelib-16.04.3/templateparser/autotests/templateparsertest.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/autotests/templateparsertest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -22,15 +22,16 @@ #include "templateparser.h" #undef protected -#include +#include #include #include #include #include #include +#include -using namespace MessageViewer; +using namespace MimeTreeParser; void TemplateParserTester::test_convertedHtml_data() { @@ -39,10 +40,15 @@ QDir dir(QStringLiteral(MAIL_DATA_DIR)); foreach (const QString &file, dir.entryList(QStringList(QLatin1String("plain*.mbox")), QDir::Files | QDir::Readable | QDir::NoSymLinks)) { - QTest::newRow(file.toLatin1()) << QString(dir.path() + QLatin1Char('/') + file) << QString(dir.path() + QLatin1Char('/') + file + QLatin1String(".html")); + QTest::newRow(file.toLatin1().constData()) << QString(dir.path() + QLatin1Char('/') + file) << QString(dir.path() + QLatin1Char('/') + file + QLatin1String(".html")); } } +void TemplateParserTester::initTestCase() +{ + //QLocale::setDefault(QLocale::Ukrainian); +} + void TemplateParserTester::test_convertedHtml() { QFETCH(QString, mailFileName); @@ -78,6 +84,56 @@ QCOMPARE(convertedHtmlContent, referenceData); } +void TemplateParserTester::test_replyPlain_data() +{ + QTest::addColumn("mailFileName"); + QTest::addColumn("referenceFileName"); + + QDir dir(QStringLiteral(MAIL_DATA_DIR)); + foreach (const QString &file, dir.entryList(QStringList(QLatin1String("*.mbox")), QDir::Files | QDir::Readable | QDir::NoSymLinks)) { + const QString expectedFile = dir.path() + QLatin1Char('/') + file + QStringLiteral(".plain.reply"); + if (!QFile::exists(expectedFile)) { + continue; + } + QTest::newRow(file.toLatin1().constData()) << QString(dir.path() + QLatin1Char('/') + file) << expectedFile; + } +} + +void TemplateParserTester::test_replyPlain() +{ + QFETCH(QString, mailFileName); + QFETCH(QString, referenceFileName); + + // load input mail + QFile mailFile(mailFileName); + QVERIFY(mailFile.open(QIODevice::ReadOnly)); + const QByteArray mailData = KMime::CRLFtoLF(mailFile.readAll()); + QVERIFY(!mailData.isEmpty()); + KMime::Message::Ptr msg(new KMime::Message); + msg->setContent(mailData); + msg->parse(); + + // load expected result + QFile referenceFile(referenceFileName); + QVERIFY(referenceFile.open(QIODevice::ReadOnly)); + const QByteArray referenceRawData = KMime::CRLFtoLF(referenceFile.readAll()); + const QString referenceData = QString::fromLatin1(referenceRawData); +// QVERIFY(!referenceData.isEmpty()); + +// QCOMPARE(msg->subject()->as7BitString(false).constData(), "Plain Message Test"); +// QCOMPARE(msg->contents().size(), 0); + + TemplateParser::TemplateParser parser(msg, TemplateParser::TemplateParser::Reply); + parser.mOtp->parseObjectTree(msg.data()); + parser.mOrigMsg = msg; +// QVERIFY(parser.mOtp->htmlContent().isEmpty()); +// QVERIFY(!parser.mOtp->plainTextContent().isEmpty()); + + const QString convertedHtmlContent = parser.plainMessageText(false, TemplateParser::TemplateParser::NoSelectionAllowed); + + QCOMPARE(convertedHtmlContent, referenceData); +} + void TemplateParserTester::test_processWithTemplatesForBody_data() { QTest::addColumn("command"); @@ -130,15 +186,15 @@ QTest::addColumn("mailFileName"); QTest::addColumn("expectedBody"); QTest::addColumn("hasDictionary"); - + qputenv("TZ", "Europe/Paris"); QDir dir(QStringLiteral(MAIL_DATA_DIR)); const QString file = QStringLiteral("plain-message.mbox"); const QString fileName = QString(dir.path() + QLatin1Char('/') + file); - QTest::newRow("%OTIME") << "%OTIME" << fileName << QLocale::system().toString(QTime(11, 30, 27), QLocale::ShortFormat) << false; - QTest::newRow("%OTIMELONG") << "%OTIMELONG" << fileName << QLocale::system().toString(QTime(11, 30, 27), QLocale::LongFormat) << false; - QTest::newRow("%OTIMELONGEN") << "%OTIMELONGEN" << fileName << QLocale(QLocale::C).toString(QTime(11, 30, 27), QLocale::LongFormat) << false; - QTest::newRow("%ODATE") << "%ODATE" << fileName << QLocale::system().toString(QDate(2011, 8, 7), QLocale::LongFormat) << false; - QTest::newRow("%ODATESHORT") << "%ODATESHORT" << fileName << QLocale::system().toString(QDate(2011, 8, 7), QLocale::ShortFormat) << false; + QTest::newRow("%OTIME") << "%OTIME" << fileName << QLocale().toString(QTime(8, 0, 27), QLocale::ShortFormat) << false; + QTest::newRow("%OTIMELONG") << "%OTIMELONG" << fileName << QLocale().toString(QTime(8, 0, 27), QLocale::LongFormat) << false; + QTest::newRow("%OTIMELONGEN") << "%OTIMELONGEN" << fileName << QLocale(QLocale::C).toString(QTime(8, 0, 27), QLocale::LongFormat) << false; + QTest::newRow("%ODATE") << "%ODATE" << fileName << QLocale().toString(QDate(2011, 8, 7), QLocale::LongFormat) << false; + QTest::newRow("%ODATESHORT") << "%ODATESHORT" << fileName << QLocale().toString(QDate(2011, 8, 7), QLocale::ShortFormat) << false; QTest::newRow("%ODATEEN") << "%ODATEEN" << fileName << QLocale::c().toString(QDate(2011, 8, 7), QLocale::LongFormat) << false; QTest::newRow("%OFULLSUBJ") << "%OFULLSUBJ" << fileName << "Plain Message Test" << false; QTest::newRow("%OFULLSUBJECT") << "%OFULLSUBJECT" << fileName << "Plain Message Test" << false; @@ -151,13 +207,13 @@ QTest::newRow("%OTONAME") << "%OTONAME" << fileName << "kde" << false; QTest::newRow("%OTOLNAME") << "%OTOLNAME" << fileName << "" << false; QTest::newRow("%OTOLIST") << "%OTOLIST" << fileName << "kde " << false; - QTest::newRow("%ODOW") << "%ODOW" << fileName << QLocale::system().dayName(7, QLocale::LongFormat) << false; + QTest::newRow("%ODOW") << "%ODOW" << fileName << QLocale().dayName(7, QLocale::LongFormat) << false; QTest::newRow("%BLANK") << "%BLANK" << fileName << "" << false; QTest::newRow("%NOP") << "%NOP" << fileName << "" << false; QTest::newRow("%DICTIONARYLANGUAGE=\"en\"") << "%DICTIONARYLANGUAGE=\"en\"" << fileName << "" << true; QTest::newRow("%DICTIONARYLANGUAGE=\"\"") << "%DICTIONARYLANGUAGE=\"\"" << fileName << "" << false; - QTest::newRow("%OTIMELONG %OFULLSUBJECT") << "%OTIMELONG %OFULLSUBJECT" << fileName << QLocale::system().toString(QTime(11, 30, 27), QLocale::LongFormat) + QStringLiteral(" Plain Message Test") << false; - QTest::newRow("%OTIMELONG\n%OFULLSUBJECT") << "%OTIMELONG\n%OFULLSUBJECT" << fileName << QLocale::system().toString(QTime(11, 30, 27), QLocale::LongFormat) + QStringLiteral("\nPlain Message Test") << false; + QTest::newRow("%OTIMELONG %OFULLSUBJECT") << "%OTIMELONG %OFULLSUBJECT" << fileName << QLocale().toString(QTime(8, 0, 27), QLocale::LongFormat) + QStringLiteral(" Plain Message Test") << false; + QTest::newRow("%OTIMELONG\n%OFULLSUBJECT") << "%OTIMELONG\n%OFULLSUBJECT" << fileName << QLocale().toString(QTime(8, 0, 27), QLocale::LongFormat) + QStringLiteral("\nPlain Message Test") << false; QTest::newRow("%REM=\"sdfsfsdsdfsdf\"") << "%REM=\"sdfsfsdsdfsdf\"" << fileName << "" << false; QTest::newRow("%CLEAR") << "%CLEAR" << fileName << "" << false; QTest::newRow("FOO foo") << "FOO foo" << fileName << "FOO foo" << false; @@ -176,6 +232,12 @@ QTest::newRow("%OHEADER=\"To\"") << "%OHEADER=\"To\"" << fileName << "kde " << false; //Unknown command QTest::newRow("unknown command") << "%GGGGG" << fileName << "%GGGGG" << false; + + + //Test bug 308444 + const QString file2 = QStringLiteral("plain-message-timezone.mbox"); + const QString fileName2 = QString(dir.path() + QLatin1Char('/') + file2); + QTest::newRow("bug308444-%OTIMELONG") << "%OTIMELONG" << fileName2 << QLocale::system().toString(QTime(20, 31, 25), QLocale::LongFormat) << false; } void TemplateParserTester::test_processWithTemplatesForContent() @@ -202,7 +264,48 @@ QCOMPARE(msg->hasHeader("X-KMail-Dictionary"), hasDictionary); identMan->deleteLater(); - QCOMPARE(QString::fromLatin1(msg->encodedBody()), expectedBody); + QCOMPARE(QString::fromUtf8(msg->encodedBody()), expectedBody); +} + +void TemplateParserTester::test_processWithTemplatesForContentOtherTimeZone_data() +{ + QTest::addColumn("command"); + QTest::addColumn("mailFileName"); + QTest::addColumn("expectedBody"); + QTest::addColumn("hasDictionary"); + qputenv("TZ", "America/New_York"); + QDir dir(QStringLiteral(MAIL_DATA_DIR)); + //Test bug 308444 + const QString file2 = QStringLiteral("plain-message-timezone.mbox"); + const QString fileName2 = QString(dir.path() + QLatin1Char('/') + file2); + QTest::newRow("bug308444-%OTIMELONG") << "%OTIMELONG" << fileName2 << QLocale::system().toString(QTime(14, 31, 25), QLocale::LongFormat) << false; +} + +void TemplateParserTester::test_processWithTemplatesForContentOtherTimeZone() +{ + QFETCH(QString, command); + QFETCH(QString, mailFileName); + QFETCH(QString, expectedBody); + QFETCH(bool, hasDictionary); + + QFile mailFile(mailFileName); + QVERIFY(mailFile.open(QIODevice::ReadOnly)); + const QByteArray mailData = KMime::CRLFtoLF(mailFile.readAll()); + QVERIFY(!mailData.isEmpty()); + KMime::Message::Ptr msg(new KMime::Message); + msg->setContent(mailData); + msg->parse(); + + TemplateParser::TemplateParser parser(msg, TemplateParser::TemplateParser::Reply); + KIdentityManagement::IdentityManager *identMan = new KIdentityManagement::IdentityManager; + parser.setIdentityManager(identMan); + parser.setAllowDecryption(false); + parser.mOrigMsg = msg; + parser.processWithTemplate(command); + QCOMPARE(msg->hasHeader("X-KMail-Dictionary"), hasDictionary); + + identMan->deleteLater(); + QCOMPARE(QString::fromUtf8(msg->encodedBody()), expectedBody); } QTEST_MAIN(TemplateParserTester) diff -Nru kf5-messagelib-16.04.3/templateparser/autotests/templateparsertest.h kf5-messagelib-16.12.3/templateparser/autotests/templateparsertest.h --- kf5-messagelib-16.04.3/templateparser/autotests/templateparsertest.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/autotests/templateparsertest.h 2017-03-06 12:30:37.000000000 +0000 @@ -30,9 +30,15 @@ /** * checks whether text/plain only mails are converted to a valid HTML */ + + void initTestCase(); + void test_convertedHtml(); void test_convertedHtml_data(); + void test_replyPlain(); + void test_replyPlain_data(); + /** * Tests whether templates are returning required body or not */ @@ -41,6 +47,9 @@ void test_processWithTemplatesForContent(); void test_processWithTemplatesForContent_data(); + + void test_processWithTemplatesForContentOtherTimeZone(); + void test_processWithTemplatesForContentOtherTimeZone_data(); }; #endif diff -Nru kf5-messagelib-16.04.3/templateparser/CMakeLists.txt kf5-messagelib-16.12.3/templateparser/CMakeLists.txt --- kf5-messagelib-16.04.3/templateparser/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -7,8 +7,6 @@ SOVERSION 5 ) -remove_definitions( -DQT_NO_CAST_FROM_BYTEARRAY ) - ########### CMake Config Files ########### set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF5TemplateParser") diff -Nru kf5-messagelib-16.04.3/templateparser/KF5TemplateParserConfig.cmake.in kf5-messagelib-16.12.3/templateparser/KF5TemplateParserConfig.cmake.in --- kf5-messagelib-16.04.3/templateparser/KF5TemplateParserConfig.cmake.in 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/KF5TemplateParserConfig.cmake.in 2017-03-06 12:30:37.000000000 +0000 @@ -1,4 +1,3 @@ @PACKAGE_INIT@ -find_dependency(KF5PimCommon "@PIMCOMMON_LIB_VERSION@") include("${CMAKE_CURRENT_LIST_DIR}/KF5TemplateParserTargets.cmake") diff -Nru kf5-messagelib-16.04.3/templateparser/src/CMakeLists.txt kf5-messagelib-16.12.3/templateparser/src/CMakeLists.txt --- kf5-messagelib-16.04.3/templateparser/src/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/src/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -19,7 +19,7 @@ ) -ecm_qt_declare_logging_category(templateparser_LIB_SRCS HEADER templateparser_debug.h IDENTIFIER TEMPLATEPARSER_LOG CATEGORY_NAME log_templateparser) +ecm_qt_declare_logging_category(templateparser_LIB_SRCS HEADER templateparser_debug.h IDENTIFIER TEMPLATEPARSER_LOG CATEGORY_NAME org.kde.pim.templateparser) kconfig_add_kcfg_files(templateparser_LIB_SRCS settings/templatesconfiguration_kfg.kcfgc) @@ -38,8 +38,6 @@ add_library(KF5::TemplateParser ALIAS KF5TemplateParser) target_link_libraries(KF5TemplateParser - PUBLIC - KF5::PimCommon PRIVATE KF5::Mime KF5::AkonadiCore @@ -51,6 +49,8 @@ KF5::IconThemes KF5::Completion KF5::Libkleo + KF5::I18n + KF5::SonnetUi ) set_target_properties(KF5TemplateParser PROPERTIES VERSION ${TEMPLATEPARSER_VERSION_STRING} @@ -83,7 +83,7 @@ ecm_generate_pri_file(BASE_NAME TemplateParser LIB_NAME KF5TemplateParser - DEPS "PimCommon" FILENAME_VAR PRI_FILENAME INCLUDE_INSTALL_DIR ${KDE_INSTALL_INCLUDEDIR_KF5}/TemplateParser + DEPS "" FILENAME_VAR PRI_FILENAME INCLUDE_INSTALL_DIR ${KDE_INSTALL_INCLUDEDIR_KF5}/TemplateParser ) diff -Nru kf5-messagelib-16.04.3/templateparser/src/customtemplates.cpp kf5-messagelib-16.12.3/templateparser/src/customtemplates.cpp --- kf5-messagelib-16.04.3/templateparser/src/customtemplates.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/src/customtemplates.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -125,7 +125,7 @@ void CustomTemplates::slotNameChanged(const QString &text) { - mUi->mAdd->setEnabled(!text.isEmpty()); + mUi->mAdd->setEnabled(!text.trimmed().isEmpty()); } QString CustomTemplates::indexToType(int index) diff -Nru kf5-messagelib-16.04.3/templateparser/src/customtemplatesmenu.cpp kf5-messagelib-16.12.3/templateparser/src/customtemplatesmenu.cpp --- kf5-messagelib-16.04.3/templateparser/src/customtemplatesmenu.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/src/customtemplatesmenu.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -88,16 +88,16 @@ d->mOwnerActionCollection->addAction(QStringLiteral("custom_reply_all"), d->mCustomReplyAllActionMenu); d->mCustomForwardMapper = new QSignalMapper(this); - connect(d->mCustomForwardMapper, SIGNAL(mapped(int)), - this, SLOT(slotForwardSelected(int))); + connect(d->mCustomForwardMapper, static_cast(&QSignalMapper::mapped), + this, &CustomTemplatesMenu::slotForwardSelected); d->mCustomReplyMapper = new QSignalMapper(this); - connect(d->mCustomReplyMapper, SIGNAL(mapped(int)), - this, SLOT(slotReplySelected(int))); + connect(d->mCustomReplyMapper, static_cast(&QSignalMapper::mapped), + this, &CustomTemplatesMenu::slotReplySelected); d->mCustomReplyAllMapper = new QSignalMapper(this); - connect(d->mCustomReplyAllMapper, SIGNAL(mapped(int)), - this, SLOT(slotReplyAllSelected(int))); + connect(d->mCustomReplyAllMapper, static_cast(&QSignalMapper::mapped), + this, &CustomTemplatesMenu::slotReplyAllSelected); update(); } diff -Nru kf5-messagelib-16.04.3/templateparser/src/templateparser.cpp kf5-messagelib-16.12.3/templateparser/src/templateparser.cpp --- kf5-messagelib-16.04.3/templateparser/src/templateparser.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/src/templateparser.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -26,7 +26,7 @@ #include #include -#include +#include #include #include @@ -52,7 +52,7 @@ static const int PipeTimeout = 15 * 1000; -QTextCodec *selectCharset(const QStringList &charsets, const QString &text) +static QTextCodec *selectCharset(const QStringList &charsets, const QString &text) { foreach (const QString &name, charsets) { // We use KCharsets::codecForName() instead of QTextCodec::codecForName() here, because @@ -95,7 +95,7 @@ mEmptySource = new MessageViewer::EmptySource; mEmptySource->setAllowDecryption(mAllowDecryption); - mOtp = new MessageViewer::ObjectTreeParser(mEmptySource); + mOtp = new MimeTreeParser::ObjectTreeParser(mEmptySource); mOtp->setAllowAsync(false); } @@ -129,6 +129,7 @@ TemplateParser::~TemplateParser() { delete mEmptySource; + delete mOtp; } int TemplateParser::parseQuotes(const QString &prefix, const QString &str, @@ -293,7 +294,7 @@ QString plainBody, htmlBody; bool dnl = false; - auto definedLocale = QLocale::system(); + auto definedLocale = QLocale(); for (int i = 0; i < tmpl_len; ++i) { QChar c = tmpl[i]; // qCDebug(TEMPLATEPARSER_LOG) << "Next char: " << c; @@ -351,7 +352,7 @@ QFile file(path); if (file.open(QIODevice::ReadOnly)) { const QByteArray content = file.readAll(); - const QString str = QString::fromLocal8Bit(content, content.size()); + const QString str = QString::fromLocal8Bit(content.constData(), content.size()); plainBody.append(str); const QString body = plainToHtml(str); htmlBody.append(body); @@ -703,10 +704,10 @@ i += len; if (mOrigMsg) { const QString hdr = q; - const QString str = - mOrigMsg->headerByType(hdr.toLocal8Bit()) ? - mOrigMsg->headerByType(hdr.toLocal8Bit())->asUnicodeString() : - QString(); + QString str; + if (auto hrdMsgOrigin = mOrigMsg->headerByType(hdr.toLocal8Bit().constData())) { + str = hrdMsgOrigin->asUnicodeString(); + } plainBody.append(str); const QString body = plainToHtml(str); htmlBody.append(body); @@ -719,10 +720,10 @@ int len = parseQuotes(QStringLiteral("HEADER="), cmd, q); i += len; const QString hdr = q; - const QString str = - mMsg->headerByType(hdr.toLocal8Bit()) ? - mMsg->headerByType(hdr.toLocal8Bit())->asUnicodeString() : - QString(); + QString str; + if (auto hrdMsgOrigin = mOrigMsg->headerByType(hdr.toLocal8Bit().constData())) { + str = hrdMsgOrigin->asUnicodeString(); + } plainBody.append(str); const QString body = plainToHtml(str); htmlBody.append(body); @@ -739,10 +740,10 @@ } else { i += re.matchedLength(); const QString hdr = re.cap(1); - const QString str = - mMsg->headerByType(hdr.toLocal8Bit()) ? - mMsg->headerByType(hdr.toLocal8Bit())->asUnicodeString() : - QString(); + QString str; + if (auto hrdMsgOrigin = mOrigMsg->headerByType(hdr.toLocal8Bit().constData())) { + str = hrdMsgOrigin->asUnicodeString(); + } plainBody.append(str); const QString body = plainToHtml(str); htmlBody.append(body); @@ -982,7 +983,7 @@ qCDebug(TEMPLATEPARSER_LOG) << "Command: ODATEEN"; i += strlen("ODATEEN"); if (mOrigMsg) { - const QDateTime date = mOrigMsg->date()->dateTime(); + const QDateTime date = mOrigMsg->date()->dateTime().toLocalTime(); const QString str = QLocale::c().toString(date.date(), QLocale::LongFormat); plainBody.append(str); const QString body = plainToHtml(str); @@ -993,7 +994,7 @@ qCDebug(TEMPLATEPARSER_LOG) << "Command: ODATESHORT"; i += strlen("ODATESHORT"); if (mOrigMsg) { - const QDateTime date = mOrigMsg->date()->dateTime(); + const QDateTime date = mOrigMsg->date()->dateTime().toLocalTime(); const QString str = definedLocale.toString(date.date(), QLocale::ShortFormat); plainBody.append(str); const QString body = plainToHtml(str); @@ -1004,7 +1005,7 @@ qCDebug(TEMPLATEPARSER_LOG) << "Command: ODATE"; i += strlen("ODATE"); if (mOrigMsg) { - const QDateTime date = mOrigMsg->date()->dateTime(); + const QDateTime date = mOrigMsg->date()->dateTime().toLocalTime(); const QString str = definedLocale.toString(date.date(), QLocale::LongFormat); plainBody.append(str); const QString body = plainToHtml(str); @@ -1015,7 +1016,7 @@ qCDebug(TEMPLATEPARSER_LOG) << "Command: ODOW"; i += strlen("ODOW"); if (mOrigMsg) { - const QDateTime date = mOrigMsg->date()->dateTime(); + const QDateTime date = mOrigMsg->date()->dateTime().toLocalTime(); const QString str = definedLocale.dayName(date.date().dayOfWeek(), QLocale::LongFormat); plainBody.append(str); const QString body = plainToHtml(str); @@ -1026,7 +1027,7 @@ qCDebug(TEMPLATEPARSER_LOG) << "Command: OTIMELONGEN"; i += strlen("OTIMELONGEN"); if (mOrigMsg) { - const QDateTime date = mOrigMsg->date()->dateTime(); + const QDateTime date = mOrigMsg->date()->dateTime().toLocalTime(); QLocale locale(QLocale::C); const QString str = locale.toString(date.time(), QLocale::LongFormat); plainBody.append(str); @@ -1037,7 +1038,7 @@ qCDebug(TEMPLATEPARSER_LOG) << "Command: OTIMELONG"; i += strlen("OTIMELONG"); if (mOrigMsg) { - const QDateTime date = mOrigMsg->date()->dateTime(); + const QDateTime date = mOrigMsg->date()->dateTime().toLocalTime(); const QString str = definedLocale.toString(date.time(), QLocale::LongFormat); plainBody.append(str); const QString body = plainToHtml(str); @@ -1048,7 +1049,7 @@ qCDebug(TEMPLATEPARSER_LOG) << "Command: OTIME"; i += strlen("OTIME"); if (mOrigMsg) { - const QDateTime date = mOrigMsg->date()->dateTime(); + const QDateTime date = mOrigMsg->date()->dateTime().toLocalTime(); const QString str = definedLocale.toString(date.time(), QLocale::ShortFormat); plainBody.append(str); const QString body = plainToHtml(str); @@ -1532,6 +1533,8 @@ QString result = mOtp->plainTextContent(); if (result.isEmpty()) { //HTML-only mails + // QtWebEngine port TODO: QWebEnginePage::toPlainText() exists but is asynchronous + // The easiest solution might be to do that -before- calling the TemplateParser. QWebPage doc; doc.mainFrame()->setHtml(mOtp->htmlContent()); result = doc.mainFrame()->toPlainText(); @@ -1630,8 +1633,8 @@ uint TemplateParser::identityUoid(const KMime::Message::Ptr &msg) const { QString idString; - if (msg->headerByType("X-KMail-Identity")) { - idString = msg->headerByType("X-KMail-Identity")->asUnicodeString().trimmed(); + if (auto hrd = msg->headerByType("X-KMail-Identity")) { + idString = hrd->asUnicodeString().trimmed(); } bool ok = false; int id = idString.toUInt(&ok); diff -Nru kf5-messagelib-16.04.3/templateparser/src/templateparser.h kf5-messagelib-16.12.3/templateparser/src/templateparser.h --- kf5-messagelib-16.04.3/templateparser/src/templateparser.h 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/src/templateparser.h 2017-03-06 12:30:37.000000000 +0000 @@ -32,7 +32,7 @@ class TemplateParserTester; -namespace MessageViewer +namespace MimeTreeParser { class ObjectTreeParser; } @@ -254,7 +254,7 @@ bool mWrap; int mColWrap; QStringList m_charsets; - MessageViewer::ObjectTreeParser *mOtp; + MimeTreeParser::ObjectTreeParser *mOtp; MessageViewer::EmptySource *mEmptySource; QString mHeadElement; Quotes mQuotes; diff -Nru kf5-messagelib-16.04.3/templateparser/src/templatesconfiguration.cpp kf5-messagelib-16.12.3/templateparser/src/templatesconfiguration.cpp --- kf5-messagelib-16.04.3/templateparser/src/templatesconfiguration.cpp 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/src/templatesconfiguration.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -96,6 +96,17 @@ TemplatesConfiguration::~TemplatesConfiguration() { + disconnect(textEdit_new->editor(), &QPlainTextEdit::textChanged, + this, &TemplatesConfiguration::slotTextChanged); + disconnect(textEdit_reply->editor(), &QPlainTextEdit::textChanged, + this, &TemplatesConfiguration::slotTextChanged); + disconnect(textEdit_reply_all->editor(), &QPlainTextEdit::textChanged, + this, &TemplatesConfiguration::slotTextChanged); + disconnect(textEdit_forward->editor(), &QPlainTextEdit::textChanged, + this, &TemplatesConfiguration::slotTextChanged); + disconnect(lineEdit_quote, &QLineEdit::textChanged, + this, &TemplatesConfiguration::slotTextChanged); + delete d; } diff -Nru kf5-messagelib-16.04.3/templateparser/tests/CMakeLists.txt kf5-messagelib-16.12.3/templateparser/tests/CMakeLists.txt --- kf5-messagelib-16.04.3/templateparser/tests/CMakeLists.txt 2016-07-04 11:15:59.000000000 +0000 +++ kf5-messagelib-16.12.3/templateparser/tests/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -5,18 +5,19 @@ set(templateeditor_gui_SRCS templateeditor_gui.cpp) add_executable(templateeditor_gui ${templateeditor_gui_SRCS}) target_link_libraries(templateeditor_gui - Qt5::WebKitWidgets KF5::KIOCore KF5::TemplateParser KF5::PimTextEdit + KF5::I18n + KF5::MessageViewer ) set(templateconfigurewidget_gui_SRCS templateconfigurewidget_gui.cpp) add_executable(templateconfigurewidget_gui ${templateconfigurewidget_gui_SRCS}) target_link_libraries(templateconfigurewidget_gui - Qt5::WebKitWidgets KF5::KIOCore KF5::TemplateParser KF5::I18n KF5::PimTextEdit + KF5::MessageViewer ) diff -Nru kf5-messagelib-16.04.3/webengineviewer/CMakeLists.txt kf5-messagelib-16.12.3/webengineviewer/CMakeLists.txt --- kf5-messagelib-16.04.3/webengineviewer/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,37 @@ +project(WebEngineViewer) + +ecm_setup_version(${MESSAGELIB_LIB_VERSION} VARIABLE_PREFIX WEBENGINEVIEWER + VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/webengineviewer_version.h" + PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF5WebEngineViewerConfigVersion.cmake" + SOVERSION 5 + ) + + +########### Targets ########### +add_definitions("-DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII") + +########### CMake Config Files ########### +set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF5WebEngineViewer") + +ecm_configure_package_config_file( + "${CMAKE_CURRENT_SOURCE_DIR}/KF5WebEngineViewerConfig.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/KF5WebEngineViewerConfig.cmake" + INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} + ) + +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/KF5WebEngineViewerConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/KF5WebEngineViewerConfigVersion.cmake" + DESTINATION "${CMAKECONFIG_INSTALL_DIR}" + COMPONENT Devel + ) + +install(EXPORT KF5WebEngineViewerTargets DESTINATION "${CMAKECONFIG_INSTALL_DIR}" FILE KF5WebEngineViewerTargets.cmake NAMESPACE KF5::) + +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/webengineviewer_version.h + DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5} COMPONENT Devel + ) +include_directories(${Messagelib_BINARY_DIR}) +add_subdirectory(src) + diff -Nru kf5-messagelib-16.04.3/webengineviewer/config-webengineviewer.h.cmake kf5-messagelib-16.12.3/webengineviewer/config-webengineviewer.h.cmake --- kf5-messagelib-16.04.3/webengineviewer/config-webengineviewer.h.cmake 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/config-webengineviewer.h.cmake 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,6 @@ +#ifndef CONFIGWEBENGINEVIEWER_H +#define CONFIGWEBENGINEVIEWER_H + +#cmakedefine WEBENGINEVIEWER_PRINT_SUPPORT 1 + +#endif diff -Nru kf5-messagelib-16.04.3/webengineviewer/KF5WebEngineViewerConfig.cmake.in kf5-messagelib-16.12.3/webengineviewer/KF5WebEngineViewerConfig.cmake.in --- kf5-messagelib-16.04.3/webengineviewer/KF5WebEngineViewerConfig.cmake.in 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/KF5WebEngineViewerConfig.cmake.in 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4 @@ +@PACKAGE_INIT@ + +find_dependency(Qt5WebEngine "@QT_REQUIRED_VERSION@") +include("${CMAKE_CURRENT_LIST_DIR}/KF5WebEngineViewerTargets.cmake") diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/autotests/CMakeLists.txt kf5-messagelib-16.12.3/webengineviewer/src/autotests/CMakeLists.txt --- kf5-messagelib-16.04.3/webengineviewer/src/autotests/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/autotests/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,28 @@ +set(testwebengineviewer_webengine_SRCS) +ecm_qt_declare_logging_category(testwebengineviewer_webengine_SRCS HEADER webengineviewer_debug.h IDENTIFIER WEBENGINEVIEWER_LOG CATEGORY_NAME org.kde.pim.webengineviewer) +include_directories(${Messagelib_BINARY_DIR}) +ecm_add_test(webhittestresulttest.cpp ../webhittestresult.cpp + TEST_NAME webhittestresulttest + NAME_PREFIX "webengineviewer-" + LINK_LIBRARIES Qt5::Test KF5::WebEngineViewer +) + + +ecm_add_test(zoomactionmenutest.cpp + TEST_NAME zoomactionmenutest + NAME_PREFIX "webengineviewer-" + LINK_LIBRARIES Qt5::Test KF5::WebEngineViewer KF5::XmlGui +) + + +ecm_add_test(webengineprintmessageboxtest.cpp ${testwebengineviewer_webengine_SRCS} ../webengineprintmessagebox.cpp ../webengineexporthtmlpagejob.cpp + TEST_NAME webengineprintmessageboxtest + NAME_PREFIX "webengineviewer-" + LINK_LIBRARIES Qt5::Test KF5::WebEngineViewer KF5::I18n +) + +ecm_add_test(webengineexporthtmlpagejobtest.cpp ${testwebengineviewer_webengine_SRCS} ../webengineexporthtmlpagejob.cpp + TEST_NAME webengineexporthtmlpagejobtest + NAME_PREFIX "webengineviewer-" + LINK_LIBRARIES Qt5::Test KF5::WebEngineViewer +) diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/autotests/webengineexporthtmlpagejobtest.cpp kf5-messagelib-16.12.3/webengineviewer/src/autotests/webengineexporthtmlpagejobtest.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/autotests/webengineexporthtmlpagejobtest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/autotests/webengineexporthtmlpagejobtest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,47 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "webengineexporthtmlpagejobtest.h" +#include "../webengineexporthtmlpagejob.h" +#include +#include + +WebEngineExportHtmlPageJobTest::WebEngineExportHtmlPageJobTest(QObject *parent) + : QObject(parent) +{ + +} + +WebEngineExportHtmlPageJobTest::~WebEngineExportHtmlPageJobTest() +{ + +} + +void WebEngineExportHtmlPageJobTest::shouldHaveDefaultValue() +{ + WebEngineViewer::WebEngineExportHtmlPageJob job; + QSignalSpy spyFailed(&job, SIGNAL(failed())); + QSignalSpy spySuccess(&job, SIGNAL(success(QString))); + QVERIFY(!job.engineView()); + job.start(); + QCOMPARE(spyFailed.count(), 1); + QCOMPARE(spySuccess.count(), 0); +} + +QTEST_MAIN(WebEngineExportHtmlPageJobTest) diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/autotests/webengineexporthtmlpagejobtest.h kf5-messagelib-16.12.3/webengineviewer/src/autotests/webengineexporthtmlpagejobtest.h --- kf5-messagelib-16.04.3/webengineviewer/src/autotests/webengineexporthtmlpagejobtest.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/autotests/webengineexporthtmlpagejobtest.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,35 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef WEBENGINEEXPORTHTMLPAGEJOBTEST_H +#define WEBENGINEEXPORTHTMLPAGEJOBTEST_H + +#include + +class WebEngineExportHtmlPageJobTest : public QObject +{ + Q_OBJECT +public: + explicit WebEngineExportHtmlPageJobTest(QObject *parent = Q_NULLPTR); + ~WebEngineExportHtmlPageJobTest(); +private Q_SLOTS: + void shouldHaveDefaultValue(); +}; + +#endif // WEBENGINEEXPORTHTMLPAGEJOBTEST_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/autotests/webengineprintmessageboxtest.cpp kf5-messagelib-16.12.3/webengineviewer/src/autotests/webengineprintmessageboxtest.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/autotests/webengineprintmessageboxtest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/autotests/webengineprintmessageboxtest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,53 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "webengineprintmessageboxtest.h" +#include "../webengineprintmessagebox.h" +#include +#include +#include + +WebEnginePrintMessageBoxTest::WebEnginePrintMessageBoxTest(QObject *parent) + : QObject(parent) +{ +} + +WebEnginePrintMessageBoxTest::~WebEnginePrintMessageBoxTest() +{ + +} + +void WebEnginePrintMessageBoxTest::shouldHaveDefaultValue() +{ + WebEngineViewer::WebEnginePrintMessageBox box; + QPushButton *openInBrowser = box.findChild(QStringLiteral("openinbrowser")); + QVERIFY(openInBrowser); + +} + +void WebEnginePrintMessageBoxTest::shouldEmitOpenInBrowserSignal() +{ + WebEngineViewer::WebEnginePrintMessageBox box; + QSignalSpy spyOpenInPreview(&box, SIGNAL(openInBrowser())); + QPushButton *openInBrowser = box.findChild(QStringLiteral("openinbrowser")); + QTest::mouseClick(openInBrowser, Qt::LeftButton); + QCOMPARE(spyOpenInPreview.count(), 1); +} + +QTEST_MAIN(WebEnginePrintMessageBoxTest) diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/autotests/webengineprintmessageboxtest.h kf5-messagelib-16.12.3/webengineviewer/src/autotests/webengineprintmessageboxtest.h --- kf5-messagelib-16.04.3/webengineviewer/src/autotests/webengineprintmessageboxtest.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/autotests/webengineprintmessageboxtest.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,37 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef WEBENGINEPRINTMESSAGEBOXTEST_H +#define WEBENGINEPRINTMESSAGEBOXTEST_H + +#include + +class WebEnginePrintMessageBoxTest : public QObject +{ + Q_OBJECT +public: + explicit WebEnginePrintMessageBoxTest(QObject *parent = Q_NULLPTR); + ~WebEnginePrintMessageBoxTest(); + +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldEmitOpenInBrowserSignal(); +}; + +#endif // WEBENGINEPRINTMESSAGEBOXTEST_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/autotests/webhittestresulttest.cpp kf5-messagelib-16.12.3/webengineviewer/src/autotests/webhittestresulttest.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/autotests/webhittestresulttest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/autotests/webhittestresulttest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,176 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "webhittestresulttest.h" +#include "../webhittestresult.h" +#include + +WebHitTestResultTest::WebHitTestResultTest(QObject *parent) + : QObject(parent) +{ + +} + +WebHitTestResultTest::~WebHitTestResultTest() +{ + +} + +void WebHitTestResultTest::shouldHaveDefaultValues() +{ + WebEngineViewer::WebHitTestResult result; + QVERIFY(result.alternateText().isEmpty()); + QVERIFY(result.boundingRect().isNull()); + QVERIFY(!result.imageUrl().isValid()); + QVERIFY(!result.isContentEditable()); + QVERIFY(!result.isContentSelected()); + QVERIFY(result.isNull()); + QVERIFY(result.linkTitle().isEmpty()); + QVERIFY(!result.linkUrl().isValid()); + QVERIFY(!result.mediaUrl().isValid()); + QVERIFY(!result.mediaPaused()); + QVERIFY(!result.mediaMuted()); + QVERIFY(result.pos().isNull()); + QVERIFY(result.tagName().isEmpty()); + QVERIFY(!result.pageUrl().isValid()); +} + +void WebHitTestResultTest::shouldAssignPosAndUrl() +{ + QPoint pos(5, 5); + QUrl url(QStringLiteral("http://www.kde.org")); + WebEngineViewer::WebHitTestResult result(pos, url, QVariant()); + QVERIFY(result.alternateText().isEmpty()); + QVERIFY(result.boundingRect().isNull()); + QVERIFY(!result.imageUrl().isValid()); + QVERIFY(!result.isContentEditable()); + QVERIFY(!result.isContentSelected()); + QVERIFY(result.isNull()); + QVERIFY(result.linkTitle().isEmpty()); + QVERIFY(!result.mediaUrl().isValid()); + QVERIFY(!result.mediaPaused()); + QVERIFY(!result.mediaMuted()); + QVERIFY(result.tagName().isEmpty()); + QVERIFY(!result.linkUrl().isValid()); + + QCOMPARE(result.pageUrl(), url); + QCOMPARE(result.pos(), pos); +} + +void WebHitTestResultTest::shouldAssignFromQVariant() +{ + QPoint pos(5, 5); + QUrl pageUrl(QStringLiteral("http://www.kde.org")); + + QVariantMap map; + QString alternateText = QStringLiteral("FOO"); + map.insert(QStringLiteral("alternateText"), alternateText); + bool contentEditable = true; + map.insert(QStringLiteral("contentEditable"), contentEditable); + bool contentSelected = true; + map.insert(QStringLiteral("contentSelected"), contentSelected); + QString linkTitle = QStringLiteral("GGGG"); + map.insert(QStringLiteral("linkTitle"), linkTitle); + QUrl imageUrl(QStringLiteral("https://www.foo.net")); + map.insert(QStringLiteral("imageUrl"), imageUrl); + QUrl linkUrl(QStringLiteral("https://www.linux.org")); + map.insert(QStringLiteral("linkUrl"), linkUrl); + QUrl mediaUrl(QStringLiteral("https://www.media.org")); + map.insert(QStringLiteral("mediaUrl"), mediaUrl); + bool mediaPaused = true; + map.insert(QStringLiteral("mediaPaused"), mediaPaused); + bool mediaMuted = true; + map.insert(QStringLiteral("mediaMuted"), mediaMuted); + QString tagName = QStringLiteral("HHHHHH"); + map.insert(QStringLiteral("tagName"), tagName); + QRect boundingRect(5, 7, 9, 11); + QVariantList lstRect; + lstRect << boundingRect.left() << boundingRect.top() << boundingRect.width() << boundingRect.height(); + map.insert(QStringLiteral("boundingRect"), lstRect); + + WebEngineViewer::WebHitTestResult result(pos, pageUrl, map); + + QCOMPARE(result.alternateText(), alternateText); + QCOMPARE(result.boundingRect(), boundingRect); + QCOMPARE(result.imageUrl(), imageUrl); + QCOMPARE(result.isContentEditable(), contentEditable); + QCOMPARE(result.isContentSelected(), contentSelected); + QCOMPARE(result.isNull(), false); + QCOMPARE(result.linkTitle(), linkTitle); + QCOMPARE(result.linkUrl(), linkUrl); + QCOMPARE(result.mediaUrl(), mediaUrl); + QCOMPARE(result.mediaPaused(), mediaPaused); + QCOMPARE(result.mediaMuted(), mediaMuted); + QCOMPARE(result.pos(), pos); + QCOMPARE(result.tagName(), tagName); + QCOMPARE(result.pageUrl(), pageUrl); +} + +void WebHitTestResultTest::shouldCopyWebHitTestResult() +{ + QPoint pos(5, 5); + QUrl pageUrl(QStringLiteral("http://www.kde.org")); + + QVariantMap map; + QString alternateText = QStringLiteral("FOO"); + map.insert(QStringLiteral("alternateText"), alternateText); + bool contentEditable = true; + map.insert(QStringLiteral("contentEditable"), contentEditable); + bool contentSelected = true; + map.insert(QStringLiteral("contentSelected"), contentSelected); + QString linkTitle = QStringLiteral("GGGG"); + map.insert(QStringLiteral("linkTitle"), linkTitle); + QUrl imageUrl(QStringLiteral("https://www.foo.net")); + map.insert(QStringLiteral("imageUrl"), imageUrl); + QUrl linkUrl(QStringLiteral("https://www.linux.org")); + map.insert(QStringLiteral("linkUrl"), linkUrl); + QUrl mediaUrl(QStringLiteral("https://www.media.org")); + map.insert(QStringLiteral("mediaUrl"), mediaUrl); + bool mediaPaused = true; + map.insert(QStringLiteral("mediaPaused"), mediaPaused); + bool mediaMuted = true; + map.insert(QStringLiteral("mediaMuted"), mediaMuted); + QString tagName = QStringLiteral("HHHHHH"); + map.insert(QStringLiteral("tagName"), tagName); + QRect boundingRect(5, 7, 9, 11); + QVariantList lstRect; + lstRect << boundingRect.left() << boundingRect.top() << boundingRect.width() << boundingRect.height(); + map.insert(QStringLiteral("boundingRect"), lstRect); + + const WebEngineViewer::WebHitTestResult result1(pos, pageUrl, map); + WebEngineViewer::WebHitTestResult result = result1; + + QCOMPARE(result.alternateText(), alternateText); + QCOMPARE(result.boundingRect(), boundingRect); + QCOMPARE(result.imageUrl(), imageUrl); + QCOMPARE(result.isContentEditable(), contentEditable); + QCOMPARE(result.isContentSelected(), contentSelected); + QCOMPARE(result.isNull(), false); + QCOMPARE(result.linkTitle(), linkTitle); + QCOMPARE(result.linkUrl(), linkUrl); + QCOMPARE(result.mediaUrl(), mediaUrl); + QCOMPARE(result.mediaPaused(), mediaPaused); + QCOMPARE(result.mediaMuted(), mediaMuted); + QCOMPARE(result.pos(), pos); + QCOMPARE(result.tagName(), tagName); + QCOMPARE(result.pageUrl(), pageUrl); + +} + +QTEST_MAIN(WebHitTestResultTest) diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/autotests/webhittestresulttest.h kf5-messagelib-16.12.3/webengineviewer/src/autotests/webhittestresulttest.h --- kf5-messagelib-16.04.3/webengineviewer/src/autotests/webhittestresulttest.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/autotests/webhittestresulttest.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,39 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef WEBHITTESTRESULTTEST_H +#define WEBHITTESTRESULTTEST_H + +#include + +class WebHitTestResultTest : public QObject +{ + Q_OBJECT +public: + explicit WebHitTestResultTest(QObject *parent = Q_NULLPTR); + ~WebHitTestResultTest(); +private Q_SLOTS: + void shouldHaveDefaultValues(); + void shouldAssignPosAndUrl(); + void shouldAssignFromQVariant(); + void shouldCopyWebHitTestResult(); + +}; + +#endif // WEBHITTESTRESULTTEST_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/autotests/zoomactionmenutest.cpp kf5-messagelib-16.12.3/webengineviewer/src/autotests/zoomactionmenutest.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/autotests/zoomactionmenutest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/autotests/zoomactionmenutest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,57 @@ +/* + Copyright (C) 2015-2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "zoomactionmenutest.h" +#include "../widgets/zoomactionmenu.h" +#include +#include + +ZoomActionMenuTest::ZoomActionMenuTest(QObject *parent) + : QObject(parent) +{ + +} + +ZoomActionMenuTest::~ZoomActionMenuTest() +{ + +} + +void ZoomActionMenuTest::shouldHaveDefaultValue() +{ + WebEngineViewer::ZoomActionMenu menu(this); + menu.setActionCollection(new KActionCollection(this)); + menu.createZoomActions(); + + QVERIFY(menu.zoomInAction()); + QVERIFY(menu.zoomOutAction()); + QVERIFY(menu.zoomResetAction()); +} + +void ZoomActionMenuTest::shouldAssignZoomFactor() +{ + WebEngineViewer::ZoomActionMenu menu(this); + menu.setActionCollection(new KActionCollection(this)); + menu.createZoomActions(); + const qreal initialValue = 50; + menu.setZoomFactor(initialValue); + QCOMPARE(menu.zoomFactor(), initialValue); +} + +QTEST_MAIN(ZoomActionMenuTest) diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/autotests/zoomactionmenutest.h kf5-messagelib-16.12.3/webengineviewer/src/autotests/zoomactionmenutest.h --- kf5-messagelib-16.04.3/webengineviewer/src/autotests/zoomactionmenutest.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/autotests/zoomactionmenutest.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,36 @@ +/* + Copyright (C) 2015-2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef ZOOMACTIONMENUTEST_H +#define ZOOMACTIONMENUTEST_H + +#include + +class ZoomActionMenuTest : public QObject +{ + Q_OBJECT +public: + explicit ZoomActionMenuTest(QObject *parent = Q_NULLPTR); + ~ZoomActionMenuTest(); +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldAssignZoomFactor(); +}; + +#endif // ZOOMACTIONMENUTEST_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/checkphishingurlfromlocaldatabasejobtest.cpp kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/checkphishingurlfromlocaldatabasejobtest.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/checkphishingurlfromlocaldatabasejobtest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/checkphishingurlfromlocaldatabasejobtest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,35 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "checkphishingurlfromlocaldatabasejobtest.h" +#include "../checkphishingurlfromlocaldatabasejob.h" +#include + +CheckPhishingUrlFromLocalDataBaseJobTest::CheckPhishingUrlFromLocalDataBaseJobTest(QObject *parent) + : QObject(parent) +{ + +} + +CheckPhishingUrlFromLocalDataBaseJobTest::~CheckPhishingUrlFromLocalDataBaseJobTest() +{ + +} + +QTEST_MAIN(CheckPhishingUrlFromLocalDataBaseJobTest) diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/checkphishingurlfromlocaldatabasejobtest.h kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/checkphishingurlfromlocaldatabasejobtest.h --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/checkphishingurlfromlocaldatabasejobtest.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/checkphishingurlfromlocaldatabasejobtest.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,33 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef CHECKPHISHINGURLFROMLOCALDATABASEJOB_H +#define CHECKPHISHINGURLFROMLOCALDATABASEJOB_H + +#include + +class CheckPhishingUrlFromLocalDataBaseJobTest : public QObject +{ + Q_OBJECT +public: + explicit CheckPhishingUrlFromLocalDataBaseJobTest(QObject *parent = Q_NULLPTR); + ~CheckPhishingUrlFromLocalDataBaseJobTest(); +}; + +#endif // CHECKPHISHINGURLFROMLOCALDATABASEJOB_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/checkphishingurljobtest.cpp kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/checkphishingurljobtest.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/checkphishingurljobtest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/checkphishingurljobtest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,64 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "checkphishingurljobtest.h" +#include "../checkphishingurljob.h" + +#include + +CheckPhishingUrlJobTest::CheckPhishingUrlJobTest(QObject *parent) + : QObject(parent) +{ + +} + +CheckPhishingUrlJobTest::~CheckPhishingUrlJobTest() +{ + +} + +void CheckPhishingUrlJobTest::shouldNotBeAbleToStartWithEmptyUrl() +{ + WebEngineViewer::CheckPhishingUrlJob job; + QVERIFY(!job.canStart()); +} + +void CheckPhishingUrlJobTest::shouldCreateRequest_data() +{ + QTest::addColumn("url"); + QTest::addColumn("request"); + QTest::addColumn("canStart"); + QTest::newRow("no url") << QUrl() << QByteArray() << false; + QTest::newRow("value") << QUrl(QStringLiteral("http://www.kde.org")) << QByteArray("{\"client\":{\"clientId\":\"KDE\",\"clientVersion\":\"5.4.0\"},\"threatInfo\":{\"platformTypes\":[\"WINDOWS\"],\"threatEntries\":[{\"url\":\"http://www.kde.org\"}],\"threatEntryTypes\":[\"URL\"],\"threatTypes\":[\"MALWARE\"]}}") << true; +} + +void CheckPhishingUrlJobTest::shouldCreateRequest() +{ + QFETCH(QUrl, url); + QFETCH(QByteArray, request); + QFETCH(bool, canStart); + WebEngineViewer::CheckPhishingUrlJob job; + job.setUrl(url); + QCOMPARE(job.canStart(), canStart); + if (canStart) { + QCOMPARE(job.jsonRequest(), request); + } +} + +QTEST_MAIN(CheckPhishingUrlJobTest) diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/checkphishingurljobtest.h kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/checkphishingurljobtest.h --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/checkphishingurljobtest.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/checkphishingurljobtest.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,37 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef CHECKPHISHINGURLJOBTEST_H +#define CHECKPHISHINGURLJOBTEST_H + +#include + +class CheckPhishingUrlJobTest : public QObject +{ + Q_OBJECT +public: + explicit CheckPhishingUrlJobTest(QObject *parent = Q_NULLPTR); + ~CheckPhishingUrlJobTest(); +private Q_SLOTS: + void shouldNotBeAbleToStartWithEmptyUrl(); + void shouldCreateRequest_data(); + void shouldCreateRequest(); +}; + +#endif // CHECKPHISHINGURLJOBTEST_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/CMakeLists.txt kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/CMakeLists.txt --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,36 @@ +set(testwebengineviewer_webengine_common_SRCS) +ecm_qt_declare_logging_category(testwebengineviewer_webengine_common_SRCS HEADER webengineviewer_debug.h IDENTIFIER WEBENGINEVIEWER_LOG CATEGORY_NAME org.kde.pim.webengineviewer) +add_definitions( -DCHECKPHISHINGURL_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data" ) + +ecm_add_test(checkphishingurljobtest.cpp ../checkphishingurljob.cpp ../checkphishingurlutil.cpp ${testwebengineviewer_webengine_common_SRCS} + TEST_NAME checkphishingurljobtest + NAME_PREFIX "webengineview-checkphishingurl-" + LINK_LIBRARIES Qt5::Test Qt5::WebKitWidgets KF5::WebEngineViewer + ) + +ecm_add_test(checkphishingurlfromlocaldatabasejobtest.cpp ../checkphishingurlutil.cpp ../checkphishingurlfromlocaldatabasejob.cpp ${testwebengineviewer_webengine_common_SRCS} + TEST_NAME checkphishingurlfromlocaldatabasetest + NAME_PREFIX "webengineview-checkphishingurlfromlocaldatabasejob-" + LINK_LIBRARIES Qt5::Test Qt5::WebKitWidgets KF5::WebEngineViewer + ) + + +ecm_add_test(createphishingurldatabasejobtest.cpp ../checkphishingurlutil.cpp ../createphishingurldatabasejob.cpp ${testwebengineviewer_webengine_common_SRCS} + TEST_NAME createphishingurldatabasejobtest + NAME_PREFIX "webengineview-createphishingurldatabasejob-" + LINK_LIBRARIES Qt5::Test Qt5::WebKitWidgets KF5::WebEngineViewer + ) + + + +ecm_add_test(localdatabasemanagertest.cpp ../checkphishingurlutil.cpp ../localdatabasemanager.cpp ${testwebengineviewer_webengine_common_SRCS} + TEST_NAME localdatabasemanagertest + NAME_PREFIX "webengineview-localdatabasemanager-" + LINK_LIBRARIES Qt5::Test Qt5::WebKitWidgets KF5::WebEngineViewer + ) + +ecm_add_test(searchfullhashjobtest.cpp ../checkphishingurlutil.cpp ../searchfullhashjob.cpp ${testwebengineviewer_webengine_common_SRCS} + TEST_NAME searchfullhashjobtest + NAME_PREFIX "webengineview-searchfullhashjob-" + LINK_LIBRARIES Qt5::Test Qt5::WebKitWidgets KF5::WebEngineViewer + ) diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/createphishingurldatabasejobtest.cpp kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/createphishingurldatabasejobtest.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/createphishingurldatabasejobtest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/createphishingurldatabasejobtest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,179 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "createphishingurldatabasejobtest.h" +#include "../createphishingurldatabasejob.h" + +#include +#include + +QByteArray readJsonFile(const QString &jsonFile) +{ + QFile file(QLatin1String(CHECKPHISHINGURL_DATA_DIR) + QLatin1Char('/') + jsonFile); + file.open(QIODevice::ReadOnly); + Q_ASSERT(file.isOpen()); + const QByteArray data = file.readAll(); + Q_ASSERT(!data.isEmpty()); + return data; +} + +CreatePhishingUrlDataBaseJobTest::CreatePhishingUrlDataBaseJobTest(QObject *parent) + : QObject(parent) +{ + +} + +CreatePhishingUrlDataBaseJobTest::~CreatePhishingUrlDataBaseJobTest() +{ + +} + +void CreatePhishingUrlDataBaseJobTest::initTestcase() +{ + qRegisterMetaType(); + qRegisterMetaType(); +} + +void CreatePhishingUrlDataBaseJobTest::shouldClearUpdateDataBaseInfo() +{ + WebEngineViewer::UpdateDataBaseInfo info; + WebEngineViewer::UpdateDataBaseInfo info2; + QCOMPARE(info, info2); + info.clear(); + QCOMPARE(info, info2); + + WebEngineViewer::UpdateDataBaseInfo value; + QVector additionList; + WebEngineViewer::Addition tmp; + tmp.prefixSize = 4; + tmp.hashString = QByteArrayLiteral("rnGLoQ=="); + additionList.append(tmp); + QVector removalList; + WebEngineViewer::Removal tmpRemoval; + tmpRemoval.indexes = QList() << 0 << 2 << 4; + removalList.append(tmpRemoval); + value.minimumWaitDuration = QStringLiteral("593.440s"); + value.threatType = QStringLiteral("MALWARE"); + value.threatEntryType = QStringLiteral("URL"); + value.responseType = WebEngineViewer::UpdateDataBaseInfo::PartialUpdate; + value.platformType = QStringLiteral("WINDOWS"); + value.newClientState = QStringLiteral("ChAIBRADGAEiAzAwMSiAEDABEAFGpqhd"); + value.sha256 = QStringLiteral("YSgoRtsRlgHDqDA3LAhM1gegEpEzs1TjzU33vqsR8iM="); + value.additionList = additionList; + value.removalList = removalList; + + info = value; + QCOMPARE(info, value); + info2 = info; + QCOMPARE(info, info2); + info2.clear(); + info.clear(); + QCOMPARE(info, info2); + +} + +void CreatePhishingUrlDataBaseJobTest::shouldCreateRequest_data() +{ + QTest::addColumn("databasestate"); + QTest::addColumn("downloadtype"); + QTest::addColumn("request"); + QTest::newRow("fulldownload") << QString() << WebEngineViewer::CreatePhishingUrlDataBaseJob::FullDataBase << QByteArray("{\"client\":{\"clientId\":\"KDE\",\"clientVersion\":\"5.4.0\"},\"listUpdateRequests\":[{\"platformType\":\"WINDOWS\",\"state\":\"\",\"threatEntryType\":\"URL\",\"threatType\":\"MALWARE\"}]}"); + QTest::newRow("fulldownloadwithdatabasestate") << QStringLiteral("foo") << WebEngineViewer::CreatePhishingUrlDataBaseJob::FullDataBase << QByteArray("{\"client\":{\"clientId\":\"KDE\",\"clientVersion\":\"5.4.0\"},\"listUpdateRequests\":[{\"platformType\":\"WINDOWS\",\"state\":\"\",\"threatEntryType\":\"URL\",\"threatType\":\"MALWARE\"}]}"); + QTest::newRow("partialdownloadwithdatabasestate") << QStringLiteral("foo") << WebEngineViewer::CreatePhishingUrlDataBaseJob::UpdateDataBase << QByteArray("{\"client\":{\"clientId\":\"KDE\",\"clientVersion\":\"5.4.0\"},\"listUpdateRequests\":[{\"platformType\":\"WINDOWS\",\"state\":\"foo\",\"threatEntryType\":\"URL\",\"threatType\":\"MALWARE\"}]}"); + QTest::newRow("partialdownloadwithoutdatabasestate") << QString() << WebEngineViewer::CreatePhishingUrlDataBaseJob::UpdateDataBase << QByteArray("{\"client\":{\"clientId\":\"KDE\",\"clientVersion\":\"5.4.0\"},\"listUpdateRequests\":[{\"platformType\":\"WINDOWS\",\"state\":\"\",\"threatEntryType\":\"URL\",\"threatType\":\"MALWARE\"}]}"); +} + +void CreatePhishingUrlDataBaseJobTest::shouldCreateRequest() +{ + QFETCH(QString, databasestate); + QFETCH(WebEngineViewer::CreatePhishingUrlDataBaseJob::DataBaseDownloadType, downloadtype); + QFETCH(QByteArray, request); + + WebEngineViewer::CreatePhishingUrlDataBaseJob job; + job.setDataBaseState(databasestate); + job.setDataBaseDownloadNeeded(downloadtype); + job.setUseCompactJson(true); + QCOMPARE(job.jsonRequest(), request); +} + +void CreatePhishingUrlDataBaseJobTest::shouldParseResult_data() +{ + QTest::addColumn("filename"); + QTest::addColumn("parseResult"); + QTest::addColumn("parseInfo"); + QTest::newRow("emptydocument") << QStringLiteral("empty.json") << WebEngineViewer::CreatePhishingUrlDataBaseJob::InvalidData << WebEngineViewer::UpdateDataBaseInfo(); + QTest::newRow("emptydocument2") << QStringLiteral("empty2.json") << WebEngineViewer::CreatePhishingUrlDataBaseJob::InvalidData << WebEngineViewer::UpdateDataBaseInfo(); + WebEngineViewer::UpdateDataBaseInfo value; + QVector additionList; + WebEngineViewer::Addition tmp; + tmp.prefixSize = 4; + tmp.hashString = QByteArrayLiteral("rnGLoQ=="); + additionList.append(tmp); + QVector removalList; + WebEngineViewer::Removal tmpRemoval; + tmpRemoval.indexes = QList() << 0 << 2 << 4; + removalList.append(tmpRemoval); + value.minimumWaitDuration = QStringLiteral("593.440s"); + value.threatType = QStringLiteral("MALWARE"); + value.threatEntryType = QStringLiteral("URL"); + value.responseType = WebEngineViewer::UpdateDataBaseInfo::PartialUpdate; + value.platformType = QStringLiteral("WINDOWS"); + value.newClientState = QStringLiteral("ChAIBRADGAEiAzAwMSiAEDABEAFGpqhd"); + value.sha256 = QStringLiteral("YSgoRtsRlgHDqDA3LAhM1gegEpEzs1TjzU33vqsR8iM="); + value.additionList = additionList; + value.removalList = removalList; + + QTest::newRow("test1") << QStringLiteral("test1.json") << WebEngineViewer::CreatePhishingUrlDataBaseJob::ValidData << value; + + value.clear(); + QVector additionList2; + tmp.prefixSize = 4; + tmp.hashString = QByteArrayLiteral("AAAaxAAAG3QAACdhAAA"); + additionList2.append(tmp); + tmp.prefixSize = 5; + tmp.hashString = QByteArrayLiteral("IL5HqwT2c6bltw=="); + additionList2.append(tmp); + + value.minimumWaitDuration = QStringLiteral("1786.932s"); + value.threatType = QStringLiteral("MALWARE"); + value.threatEntryType = QStringLiteral("URL"); + value.responseType = WebEngineViewer::UpdateDataBaseInfo::FullUpdate; + value.platformType = QStringLiteral("WINDOWS"); + value.newClientState = QStringLiteral("Cg0IARAGGAEiAzAwMTABELmwARoCGAUmgN3G"); + value.sha256 = QStringLiteral("ANcYWR8Umuoir+uNs1AhfxqW0iXEPDkxN6Pp2QF8dSs="); + value.additionList = additionList2; + + QTest::newRow("test2") << QStringLiteral("test2.json") << WebEngineViewer::CreatePhishingUrlDataBaseJob::ValidData << value; +} + +void CreatePhishingUrlDataBaseJobTest::shouldParseResult() +{ + QFETCH(QString, filename); + QFETCH(WebEngineViewer::CreatePhishingUrlDataBaseJob::DataBaseDownloadResult, parseResult); + QFETCH(WebEngineViewer::UpdateDataBaseInfo, parseInfo); + const QByteArray ba = readJsonFile(filename); + WebEngineViewer::CreatePhishingUrlDataBaseJob job; + QSignalSpy spy1(&job, SIGNAL(finished(WebEngineViewer::UpdateDataBaseInfo,WebEngineViewer::CreatePhishingUrlDataBaseJob::DataBaseDownloadResult))); + job.parseResult(ba); + QCOMPARE(spy1.count(), 1); + QCOMPARE(spy1.at(0).at(1).value(), parseResult); + QCOMPARE(spy1.at(0).at(0).value(), parseInfo); +} + +QTEST_MAIN(CreatePhishingUrlDataBaseJobTest) diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/createphishingurldatabasejobtest.h kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/createphishingurldatabasejobtest.h --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/createphishingurldatabasejobtest.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/createphishingurldatabasejobtest.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,42 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef CREATEPHISHINGURLDATABASEJOBTEST_H +#define CREATEPHISHINGURLDATABASEJOBTEST_H + +#include + +class CreatePhishingUrlDataBaseJobTest : public QObject +{ + Q_OBJECT +public: + explicit CreatePhishingUrlDataBaseJobTest(QObject *parent = Q_NULLPTR); + ~CreatePhishingUrlDataBaseJobTest(); +private Q_SLOTS: + void shouldCreateRequest_data(); + void shouldCreateRequest(); + + void shouldParseResult_data(); + void shouldParseResult(); + void initTestcase(); + + void shouldClearUpdateDataBaseInfo(); +}; + +#endif // CREATEPHISHINGURLDATABASEJOBTEST_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/data/empty.json kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/data/empty.json --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/data/empty.json 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/data/empty.json 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,2 @@ +{ +} diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/data/test1.json kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/data/test1.json --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/data/test1.json 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/data/test1.json 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,26 @@ +{ + "listUpdateResponses": [{ + "threatType": "MALWARE", + "threatEntryType": "URL", + "platformType": "WINDOWS", + "responseType" : "PARTIAL_UPDATE", + "additions": [{ + "compressionType": "RAW", + "rawHashes": { + "prefixSize": 4, + "rawHashes": "rnGLoQ==" + } + }], + "removals": [{ + "compressionType": "RAW", + "rawIndices": { + "indices": [0, 2, 4] + } + }], + "newClientState": "ChAIBRADGAEiAzAwMSiAEDABEAFGpqhd", + "checksum": { + "sha256": "YSgoRtsRlgHDqDA3LAhM1gegEpEzs1TjzU33vqsR8iM=" + } + }], + "minimumWaitDuration": "593.440s" +} diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/data/test2.json kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/data/test2.json --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/data/test2.json 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/data/test2.json 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,32 @@ +{ + "listUpdateResponses": [ + { + "threatType": "MALWARE", + "threatEntryType": "URL", + "platformType": "WINDOWS", + "responseType": "FULL_UPDATE", + "additions": [ + { + "compressionType": "RAW", + "rawHashes": { + "prefixSize": 4, + "rawHashes": "AAAaxAAAG3QAACdhAAA" + } + }, + { + "compressionType": "RAW", + "rawHashes": { + "prefixSize": 5, + "rawHashes": "IL5HqwT2c6bltw==" + } + } + ], + "newClientState": "Cg0IARAGGAEiAzAwMTABELmwARoCGAUmgN3G", + "checksum": { + "sha256": "ANcYWR8Umuoir+uNs1AhfxqW0iXEPDkxN6Pp2QF8dSs=" + } + } + ], + "minimumWaitDuration": "1786.932s" +} + diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/localdatabasemanagertest.cpp kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/localdatabasemanagertest.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/localdatabasemanagertest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/localdatabasemanagertest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,65 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "localdatabasemanagertest.h" +#include "../localdatabasemanager.h" + +#include + +class TestLocalDataBaseManager : public WebEngineViewer::LocalDataBaseManager +{ +public: + TestLocalDataBaseManager(QObject *parent) + : WebEngineViewer::LocalDataBaseManager(parent) + { + + } + + void setDownloadInfoSendByServer(const QString &data) { + mDownloadInfoSendByServer = data; + } + + // LocalDataBaseManager interface +protected: + void downloadFullDataBase() Q_DECL_OVERRIDE; + void downloadPartialDataBase() Q_DECL_OVERRIDE; +private: + QString mDownloadInfoSendByServer; +}; + +void TestLocalDataBaseManager::downloadFullDataBase() +{ +} + +void TestLocalDataBaseManager::downloadPartialDataBase() +{ +} + +LocalDataBaseManagerTest::LocalDataBaseManagerTest(QObject *parent) + : QObject(parent) +{ + +} + +LocalDataBaseManagerTest::~LocalDataBaseManagerTest() +{ + +} + +QTEST_MAIN(LocalDataBaseManagerTest) diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/localdatabasemanagertest.h kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/localdatabasemanagertest.h --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/localdatabasemanagertest.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/localdatabasemanagertest.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,33 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef LOCALDATABASEMANAGERTEST_H +#define LOCALDATABASEMANAGERTEST_H + +#include + +class LocalDataBaseManagerTest : public QObject +{ + Q_OBJECT +public: + explicit LocalDataBaseManagerTest(QObject *parent = Q_NULLPTR); + ~LocalDataBaseManagerTest(); +}; + +#endif // LOCALDATABASEMANAGERTEST_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/searchfullhashjobtest.cpp kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/searchfullhashjobtest.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/searchfullhashjobtest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/searchfullhashjobtest.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,69 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "searchfullhashjobtest.h" +#include "../searchfullhashjob.h" +#include + +SearchFullHashJobTest::SearchFullHashJobTest(QObject *parent) + : QObject(parent) +{ + +} + +SearchFullHashJobTest::~SearchFullHashJobTest() +{ + +} + +void SearchFullHashJobTest::shouldNotBeAbleToStartWithEmptyUrl() +{ + WebEngineViewer::SearchFullHashJob job; + QVERIFY(!job.canStart()); +} + +void SearchFullHashJobTest::shouldCreateRequest_data() +{ + QTest::addColumn("hash"); + QTest::addColumn("databaseHash"); + QTest::addColumn("request"); + QTest::addColumn("canStart"); + QTest::newRow("no hash") << QByteArray() << QString() << QByteArray() << false; + QTest::newRow("database hash but not hash") << QByteArray() << QStringLiteral("boo") << QByteArray() << false; + QTest::newRow("database hash and hash") << QByteArrayLiteral("bla") << QStringLiteral("boo") + << QByteArrayLiteral("{\"client\":{\"clientId\":\"KDE\",\"clientVersion\":\"5.4.0\"},\"clientStates\":[\"boo\"],\"threatInfo\":{\"platformTypes\":[\"WINDOWS\"],\"threatEntries\":{\"hash\":\"bla\"},\"threatEntryTypes\":[\"URL\"],\"threatTypes\":[\"MALWARE\"]}}") << true; +} + +void SearchFullHashJobTest::shouldCreateRequest() +{ + QFETCH(QByteArray, hash); + QFETCH(QString, databaseHash); + QFETCH(QByteArray, request); + QFETCH(bool, canStart); + WebEngineViewer::SearchFullHashJob job; + job.setDatabaseState(databaseHash); + job.setSearchHash(hash); + QCOMPARE(job.canStart(), canStart); + if (canStart) { + QCOMPARE(job.jsonRequest(), request); + } +} + + +QTEST_MAIN(SearchFullHashJobTest) diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/searchfullhashjobtest.h kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/searchfullhashjobtest.h --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/autotests/searchfullhashjobtest.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/autotests/searchfullhashjobtest.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,38 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef SEARCHFULLHASHJOBTEST_H +#define SEARCHFULLHASHJOBTEST_H + +#include + +class SearchFullHashJobTest : public QObject +{ + Q_OBJECT +public: + explicit SearchFullHashJobTest(QObject *parent = Q_NULLPTR); + ~SearchFullHashJobTest(); + +private Q_SLOTS: + void shouldNotBeAbleToStartWithEmptyUrl(); + void shouldCreateRequest_data(); + void shouldCreateRequest(); +}; + +#endif // SEARCHFULLHASHJOBTEST_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/checkphishingurlcache.cpp kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/checkphishingurlcache.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/checkphishingurlcache.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/checkphishingurlcache.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,87 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "checkphishingurlcache.h" +#include + +using namespace WebEngineViewer; + +Q_GLOBAL_STATIC(CheckPhishingUrlCache, s_checkPhishingUrlCache) + +class WebEngineViewer::CheckPhishingUrlCachePrivate +{ +public: + CheckPhishingUrlCachePrivate() + { + + } + CheckPhishingUrlCache::UrlStatus urlStatus(const QUrl &url); + void setCheckingUrlResult(const QUrl &url, bool correctUrl); + void clearCache(); +private: + QMap mCacheCheckedUrl; +}; + +void CheckPhishingUrlCachePrivate::clearCache() +{ + mCacheCheckedUrl.clear(); +} + +CheckPhishingUrlCache::UrlStatus CheckPhishingUrlCachePrivate::urlStatus(const QUrl &url) +{ + return mCacheCheckedUrl.value(url, CheckPhishingUrlCache::Unknown); +} + +void CheckPhishingUrlCachePrivate::setCheckingUrlResult(const QUrl &url, bool correctUrl) +{ + mCacheCheckedUrl.insert(url, correctUrl ? CheckPhishingUrlCache::UrlOk : CheckPhishingUrlCache::MalWare); +} + +CheckPhishingUrlCache::CheckPhishingUrlCache(QObject *parent) + : QObject(parent), + d(new CheckPhishingUrlCachePrivate) +{ + +} + +CheckPhishingUrlCache::~CheckPhishingUrlCache() +{ + delete d; +} + +void CheckPhishingUrlCache::setCheckingUrlResult(const QUrl &url, bool correctUrl) +{ + d->setCheckingUrlResult(url, correctUrl); +} + +CheckPhishingUrlCache::UrlStatus CheckPhishingUrlCache::urlStatus(const QUrl &url) +{ + return d->urlStatus(url); +} + +void CheckPhishingUrlCache::clearCache() +{ + d->clearCache(); +} + +CheckPhishingUrlCache *CheckPhishingUrlCache::self() +{ + return s_checkPhishingUrlCache; +} + diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/checkphishingurlcache.h kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/checkphishingurlcache.h --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/checkphishingurlcache.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/checkphishingurlcache.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,64 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef CHECKPHISHINGURLCACHE_H +#define CHECKPHISHINGURLCACHE_H + +#include "webengineviewer_export.h" +#include +#include + +namespace WebEngineViewer +{ +class CheckPhishingUrlCachePrivate; +class WEBENGINEVIEWER_EXPORT CheckPhishingUrlCache: public QObject +{ + Q_OBJECT +public: + static CheckPhishingUrlCache *self(); + + enum UrlStatus { + UrlOk = 0, + MalWare = 1, + Unknown = 2 + }; + + explicit CheckPhishingUrlCache(QObject *parent = Q_NULLPTR); + ~CheckPhishingUrlCache(); + + /** + * @brief setCheckingUrlResult cache url. If @p correctUrl is true we store as UrlOk otherwise MalWare + * @param url + * @param correctUrl + */ + void setCheckingUrlResult(const QUrl &url, bool correctUrl); + /** + * @brief urlStatus Return the status of cached Url. When we didn't stored it it returns Unknown + * @param url + * @return the status of url + */ + CheckPhishingUrlCache::UrlStatus urlStatus(const QUrl &url); + + void clearCache(); +private: + CheckPhishingUrlCachePrivate *const d; +}; +} + +#endif // CHECKPHISHINGURLCACHE_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/checkphishingurlfromlocaldatabasejob.cpp kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/checkphishingurlfromlocaldatabasejob.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/checkphishingurlfromlocaldatabasejob.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/checkphishingurlfromlocaldatabasejob.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,75 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "checkphishingurlfromlocaldatabasejob.h" +#include +#include "localdatabasemanager.h" + +using namespace WebEngineViewer; + +CheckPhishingUrlFromLocalDataBaseJob::CheckPhishingUrlFromLocalDataBaseJob(QObject *parent) + : QObject(parent) +{ + +} + +CheckPhishingUrlFromLocalDataBaseJob::~CheckPhishingUrlFromLocalDataBaseJob() +{ + +} + +void CheckPhishingUrlFromLocalDataBaseJob::setCheckPhisingUrl(const QUrl &url) +{ + mUrl = url; +} + +void CheckPhishingUrlFromLocalDataBaseJob::start() +{ + if (mUrl.isValid()) { + Q_EMIT finished(mUrl, InvalidUrl); + deleteLater(); + } else { + connect(LocalDataBaseManager::self(), &LocalDataBaseManager::checkUrlFinished, this, &CheckPhishingUrlFromLocalDataBaseJob::slotCheckUrlFinished); + LocalDataBaseManager::self()->checkUrl(mUrl); + } +} + +void CheckPhishingUrlFromLocalDataBaseJob::slotCheckUrlFinished(const QUrl &url, WebEngineViewer::LocalDataBaseManager::UrlStatus status) +{ + CheckPhishingUrlFromLocalDataBaseJob::UrlStatus currentStatus(CheckPhishingUrlFromLocalDataBaseJob::Unknown); + switch(status) { + case WebEngineViewer::LocalDataBaseManager::Unknown: + break; + case WebEngineViewer::LocalDataBaseManager::UrlOk: + currentStatus = CheckPhishingUrlFromLocalDataBaseJob::Ok; + break; + case WebEngineViewer::LocalDataBaseManager::Malware: + currentStatus = CheckPhishingUrlFromLocalDataBaseJob::MalWare; + break; + } + + Q_EMIT finished(url, currentStatus); + deleteLater(); +} + + +bool CheckPhishingUrlFromLocalDataBaseJob::canStart() const +{ + return mUrl.isValid(); +} diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/checkphishingurlfromlocaldatabasejob.h kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/checkphishingurlfromlocaldatabasejob.h --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/checkphishingurlfromlocaldatabasejob.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/checkphishingurlfromlocaldatabasejob.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,56 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef CHECKPHISHINGURLFROMLOCALDATABASE_H +#define CHECKPHISHINGURLFROMLOCALDATABASE_H + +#include +#include "webengineviewer_export.h" +#include +#include +namespace WebEngineViewer +{ +class WEBENGINEVIEWER_EXPORT CheckPhishingUrlFromLocalDataBaseJob : public QObject +{ + Q_OBJECT +public: + enum UrlStatus { + Ok = 0, + MalWare, + BrokenNetwork, + InvalidUrl, + Unknown + }; + + explicit CheckPhishingUrlFromLocalDataBaseJob(QObject *parent = Q_NULLPTR); + ~CheckPhishingUrlFromLocalDataBaseJob(); + void setCheckPhisingUrl(const QUrl &url); + + void start(); + bool canStart() const; + +Q_SIGNALS: + void finished(const QUrl &url, WebEngineViewer::CheckPhishingUrlFromLocalDataBaseJob::UrlStatus status); + +private: + void slotCheckUrlFinished(const QUrl &url, WebEngineViewer::LocalDataBaseManager::UrlStatus status); + QUrl mUrl; +}; +} +#endif // CHECKPHISHINGURLFROMLOCALDATABASE_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/checkphishingurljob.cpp kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/checkphishingurljob.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/checkphishingurljob.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/checkphishingurljob.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,163 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "checkphishingurljob.h" +#include "checkphishingurlutil.h" +#include +#include +#include +#include +#include + +using namespace WebEngineViewer; + +CheckPhishingUrlJob::CheckPhishingUrlJob(QObject *parent) + : QObject(parent), + mUseCompactJson(true) +{ + mNetworkAccessManager = new QNetworkAccessManager(this); + connect(mNetworkAccessManager, &QNetworkAccessManager::finished, this, &CheckPhishingUrlJob::slotCheckUrlFinished); + connect(mNetworkAccessManager, &QNetworkAccessManager::sslErrors, this, &CheckPhishingUrlJob::slotSslErrors); +} + +CheckPhishingUrlJob::~CheckPhishingUrlJob() +{ +} + +void CheckPhishingUrlJob::slotSslErrors(QNetworkReply *reply, const QList &error) +{ + qCDebug(WEBENGINEVIEWER_LOG) << " void CheckPhishingUrlJob::slotSslErrors(QNetworkReply *reply, const QList &error)" << error.count(); + reply->ignoreSslErrors(error); +} + +void CheckPhishingUrlJob::setUseCompactJson(bool useCompactJson) +{ + mUseCompactJson = useCompactJson; +} + +void CheckPhishingUrlJob::parse(const QByteArray &replyStr) +{ + QJsonDocument document = QJsonDocument::fromJson(replyStr); + if (document.isNull()) { + Q_EMIT result(WebEngineViewer::CheckPhishingUrlJob::Unknown, mUrl); + } else { + const QVariantMap answer = document.toVariant().toMap(); + if (answer.isEmpty()) { + Q_EMIT result(WebEngineViewer::CheckPhishingUrlJob::Ok, mUrl); + return; + } else { + const QVariantList info = answer.value(QStringLiteral("matches")).toList(); + if (info.count() == 1) { + const QVariantMap map = info.at(0).toMap(); + const QString threatTypeStr = map[QStringLiteral("threatType")].toString(); + if (threatTypeStr == QStringLiteral("MALWARE")) { + const QVariantMap urlMap = map[QStringLiteral("threat")].toMap(); + if (urlMap.count() == 1) { + if (urlMap[QStringLiteral("url")].toString() == mUrl.toString()) { + Q_EMIT result(WebEngineViewer::CheckPhishingUrlJob::MalWare, mUrl); + return; + } + } + } else { + qWarning() << " CheckPhishingUrlJob::parse threatTypeStr : " << threatTypeStr; + } + } + Q_EMIT result(WebEngineViewer::CheckPhishingUrlJob::Unknown, mUrl); + } + } +} + +void CheckPhishingUrlJob::slotCheckUrlFinished(QNetworkReply *reply) +{ + parse(reply->readAll()); + reply->deleteLater(); + deleteLater(); +} + +void CheckPhishingUrlJob::setUrl(const QUrl &url) +{ + mUrl = url; +} + +QByteArray CheckPhishingUrlJob::jsonRequest() const +{ + QVariantMap clientMap; + QVariantMap map; + + clientMap.insert(QStringLiteral("clientId"), QStringLiteral("KDE")); + clientMap.insert(QStringLiteral("clientVersion"), QStringLiteral("5.4.0")); //FIXME + map.insert(QStringLiteral("client"), clientMap); + + QVariantMap threatMap; + const QVariantList platformList = { QStringLiteral("WINDOWS") }; + threatMap.insert(QStringLiteral("platformTypes"), platformList); + + const QVariantList threatTypesList = { QStringLiteral("MALWARE") }; + threatMap.insert(QStringLiteral("threatTypes"), threatTypesList); + const QVariantList threatEntryTypesList = { QStringLiteral("URL") }; + threatMap.insert(QStringLiteral("threatEntryTypes"), threatEntryTypesList); + QVariantList threatEntriesList; + QVariantMap urlMap; + urlMap.insert(QStringLiteral("url"), mUrl.toString()); + threatEntriesList.append(urlMap); + threatMap.insert(QStringLiteral("threatEntries"), threatEntriesList); + + map.insert(QStringLiteral("threatInfo"), threatMap); + + const QJsonDocument postData = QJsonDocument::fromVariant(map); + const QByteArray baPostData = postData.toJson(mUseCompactJson ? QJsonDocument::Compact : QJsonDocument::Indented); + return baPostData; +} + +void CheckPhishingUrlJob::start() +{ + if (!PimCommon::NetworkManager::self()->networkConfigureManager()->isOnline()) { + Q_EMIT result(WebEngineViewer::CheckPhishingUrlJob::BrokenNetwork, mUrl); + deleteLater(); + } else if (canStart()) { + QUrl safeUrl = QUrl(QStringLiteral("https://safebrowsing.googleapis.com/v4/threatMatches:find")); + safeUrl.addQueryItem(QStringLiteral("key"), WebEngineViewer::CheckPhishingUrlUtil::apiKey()); + QNetworkRequest request(safeUrl); + request.setHeader(QNetworkRequest::ContentTypeHeader, QStringLiteral("application/json")); + + const QByteArray baPostData = jsonRequest(); + qCDebug(WEBENGINEVIEWER_LOG) << " postData.toJson()" << baPostData; + Q_EMIT debugJson(baPostData); + //curl -H "Content-Type: application/json" -X POST -d '{"client":{"clientId":"KDE","clientVersion":"5.4.0"},"threatInfo":{"platformTypes":["WINDOWS"],"threatEntries":[{"url":"http://www.kde.org"}],"threatEntryTypes":["URL"],"threatTypes":["MALWARE"]}}' https://safebrowsing.googleapis.com/v4/threatMatches:find?key=AIzaSyBS62pXATjabbH2RM_jO2EzDg1mTMHlnyo + + QNetworkReply *reply = mNetworkAccessManager->post(request, baPostData); + connect(reply, static_cast(&QNetworkReply::error), this, &CheckPhishingUrlJob::slotError); + } else { + Q_EMIT result(WebEngineViewer::CheckPhishingUrlJob::InvalidUrl, mUrl); + deleteLater(); + } +} + +void CheckPhishingUrlJob::slotError(QNetworkReply::NetworkError error) +{ + QNetworkReply *reply = qobject_cast(sender()); + qCWarning(WEBENGINEVIEWER_LOG) << " error " << error << " error string : " << reply->errorString(); + reply->deleteLater(); + deleteLater(); +} + +bool CheckPhishingUrlJob::canStart() const +{ + return mUrl.isValid(); +} diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/checkphishingurljob.h kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/checkphishingurljob.h --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/checkphishingurljob.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/checkphishingurljob.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,70 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef CHECKPHISHINGURLJOB_H +#define CHECKPHISHINGURLJOB_H + +#include +#include +#include +#include "webengineviewer_export.h" +class QNetworkAccessManager; +namespace WebEngineViewer +{ +/* https://developers.google.com/safe-browsing/v4/lookup-api */ +class WEBENGINEVIEWER_EXPORT CheckPhishingUrlJob : public QObject +{ + Q_OBJECT +public: + explicit CheckPhishingUrlJob(QObject *parent = Q_NULLPTR); + ~CheckPhishingUrlJob(); + + enum UrlStatus { + Ok = 0, + MalWare, + BrokenNetwork, + InvalidUrl, + Unknown + }; + + void setUrl(const QUrl &url); + + void start(); + bool canStart() const; + + QByteArray jsonRequest() const; + void parse(const QByteArray &replyStr); + void setUseCompactJson(bool useCompactJson); + +Q_SIGNALS: + void result(WebEngineViewer::CheckPhishingUrlJob::UrlStatus status, const QUrl &url); + void debugJson(const QByteArray &ba); + +private Q_SLOTS: + void slotSslErrors(QNetworkReply *reply, const QList &error); + void slotError(QNetworkReply::NetworkError error); + void slotCheckUrlFinished(QNetworkReply *reply); +private: + QUrl mUrl; + bool mUseCompactJson; + QNetworkAccessManager *mNetworkAccessManager; +}; +} + +#endif // CHECKPHISHINGURLJOB_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/checkphishingurlutil.cpp kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/checkphishingurlutil.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/checkphishingurlutil.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/checkphishingurlutil.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,25 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "checkphishingurlutil.h" +using namespace WebEngineViewer; +QString CheckPhishingUrlUtil::apiKey() +{ + return QStringLiteral("AIzaSyBS62pXATjabbH2RM_jO2EzDg1mTMHlnyo"); +} diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/checkphishingurlutil.h kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/checkphishingurlutil.h --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/checkphishingurlutil.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/checkphishingurlutil.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,32 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef CHECKPHISHINGURLUTIL_H +#define CHECKPHISHINGURLUTIL_H + +#include + +namespace WebEngineViewer +{ +namespace CheckPhishingUrlUtil +{ +QString apiKey(); +} +} +#endif // CHECKPHISHINGURLUTIL_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/createphishingurldatabasejob.cpp kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/createphishingurldatabasejob.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/createphishingurldatabasejob.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/createphishingurldatabasejob.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,406 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "createphishingurldatabasejob.h" +#include "checkphishingurlutil.h" +#include "webengineviewer_debug.h" +#include + +#include +#include + +using namespace WebEngineViewer; + +CreatePhishingUrlDataBaseJob::CreatePhishingUrlDataBaseJob(QObject *parent) + : QObject(parent), + mDataBaseDownloadNeeded(FullDataBase), + mUseCompactJson(true) +{ + mNetworkAccessManager = new QNetworkAccessManager(this); + connect(mNetworkAccessManager, &QNetworkAccessManager::finished, this, &CreatePhishingUrlDataBaseJob::slotDownloadDataBaseFinished); + connect(mNetworkAccessManager, &QNetworkAccessManager::sslErrors, this, &CreatePhishingUrlDataBaseJob::slotSslErrors); +} + +CreatePhishingUrlDataBaseJob::~CreatePhishingUrlDataBaseJob() +{ + +} + +void CreatePhishingUrlDataBaseJob::slotSslErrors(QNetworkReply *reply, const QList &error) +{ + qCDebug(WEBENGINEVIEWER_LOG) << " void CreatePhishingUrlDataBaseJob::slotSslErrors(QNetworkReply *reply, const QList &error)" << error.count(); + reply->ignoreSslErrors(error); +} + +void CreatePhishingUrlDataBaseJob::start() +{ + if (!PimCommon::NetworkManager::self()->networkConfigureManager()->isOnline()) { + Q_EMIT finished(UpdateDataBaseInfo(), BrokenNetwork); + deleteLater(); + } else { + QUrl safeUrl = QUrl(QStringLiteral("https://safebrowsing.googleapis.com/v4/threatListUpdates:fetch")); + safeUrl.addQueryItem(QStringLiteral("key"), WebEngineViewer::CheckPhishingUrlUtil::apiKey()); + //qCDebug(WEBENGINEVIEWER_LOG) << " safeUrl" << safeUrl; + QNetworkRequest request(safeUrl); + request.setHeader(QNetworkRequest::ContentTypeHeader, QStringLiteral("application/json")); + + const QByteArray baPostData = jsonRequest(); + Q_EMIT debugJson(baPostData); + qCDebug(WEBENGINEVIEWER_LOG) << " postData.toJson()" << baPostData; + //curl -H "Content-Type: application/json" -X POST -d '{"client":{"clientId":"KDE","clientVersion":"5.4.0"},"threatInfo":{"platformTypes":["WINDOWS"],"threatEntries":[{"url":"http://www.kde.org"}],"threatEntryTypes":["URL"],"threatTypes":["MALWARE"]}}' https://safebrowsing.googleapis.com/v4/threatMatches:find?key=AIzaSyBS62pXATjabbH2RM_jO2EzDg1mTMHlnyo + QNetworkReply *reply = mNetworkAccessManager->post(request, baPostData); + connect(reply, static_cast(&QNetworkReply::error), this, &CreatePhishingUrlDataBaseJob::slotError); + } +} + +void CreatePhishingUrlDataBaseJob::setDataBaseState(const QString &value) +{ + mDataBaseState = value; +} + +void CreatePhishingUrlDataBaseJob::slotError(QNetworkReply::NetworkError error) +{ + QNetworkReply *reply = qobject_cast(sender()); + qWarning() << " error " << error << " error string : " << reply->errorString(); + reply->deleteLater(); + deleteLater(); +} + +QByteArray CreatePhishingUrlDataBaseJob::jsonRequest() const +{ +#if 0 + { + "client": { + "clientId": "yourcompanyname", + "clientVersion": "1.5.2" + }, + "listUpdateRequests": [{ + "threatType": "MALWARE", + "platformType": "WINDOWS", + "threatEntryType": "URL", + "state": "Gg4IBBADIgYQgBAiAQEoAQ==", + "constraints": { + "maxUpdateEntries": 2048, + "maxDatabaseEntries": 4096, + "region": "US", + "supportedCompressions": ["RAW"] + } + }] + } +#endif + QVariantMap clientMap; + QVariantMap map; + + clientMap.insert(QStringLiteral("clientId"), QStringLiteral("KDE")); + clientMap.insert(QStringLiteral("clientVersion"), QStringLiteral("5.4.0")); //FIXME + map.insert(QStringLiteral("client"), clientMap); + + QVariantList listUpdateRequests; + + QVariantMap threatMap; + threatMap.insert(QStringLiteral("platformType"), QStringLiteral("WINDOWS")); + threatMap.insert(QStringLiteral("threatType"), QStringLiteral("MALWARE")); + threatMap.insert(QStringLiteral("threatEntryType"), QStringLiteral("URL")); + + //Define state when we want to define update database. Empty is full. + switch (mDataBaseDownloadNeeded) { + case FullDataBase: + threatMap.insert(QStringLiteral("state"), QString()); + break; + case UpdateDataBase: + if (mDataBaseState.isEmpty()) { + qWarning() << "Partial Download asked but database set is empty"; + } + threatMap.insert(QStringLiteral("state"), mDataBaseState); + break; + } + + listUpdateRequests.append(threatMap); + //TODO define contraints + + map.insert(QStringLiteral("listUpdateRequests"), listUpdateRequests); + + const QJsonDocument postData = QJsonDocument::fromVariant(map); + const QByteArray baPostData = postData.toJson(mUseCompactJson ? QJsonDocument::Compact : QJsonDocument::Indented); + return baPostData; +} + +void CreatePhishingUrlDataBaseJob::setDataBaseDownloadNeeded(CreatePhishingUrlDataBaseJob::DataBaseDownloadType type) +{ + mDataBaseDownloadNeeded = type; +} + +void CreatePhishingUrlDataBaseJob::slotDownloadDataBaseFinished(QNetworkReply *reply) +{ + const QByteArray returnValue(reply->readAll()); + Q_EMIT debugJsonResult(returnValue); + parseResult(returnValue); + reply->deleteLater(); +} + +QVector CreatePhishingUrlDataBaseJob::parseAdditions(const QVariantList &lst) +{ + QVector additionList; + Q_FOREACH (const QVariant &v, lst) { + if (v.canConvert()) { + QMapIterator mapIt(v.toMap()); + while (mapIt.hasNext()) { + mapIt.next(); + const QString keyStr = mapIt.key(); + if (keyStr == QLatin1String("compressionType")) { + qCDebug(WEBENGINEVIEWER_LOG) << " compression type :" << mapIt.value(); + } else if (keyStr == QLatin1String("riceHashes")) { + qCDebug(WEBENGINEVIEWER_LOG) << " CreatePhishingUrlDataBaseJob::parseAdditions need to implement riceHashes "; + } else if (keyStr == QLatin1String("rawHashes")) { + Addition tmp; + QMapIterator rawHashesIt(mapIt.value().toMap()); + while (rawHashesIt.hasNext()) { + rawHashesIt.next(); + //qCDebug(WEBENGINEVIEWER_LOG) << " rawHashesIt.key() " << rawHashesIt.key() << " rawHashesIt.value()" << rawHashesIt.value(); + const QString key = rawHashesIt.key(); + if (key == QLatin1String("rawHashes")) { + tmp.hashString = rawHashesIt.value().toByteArray(); + } else if (key == QLatin1String("prefixSize")) { + tmp.prefixSize = rawHashesIt.value().toInt(); + } else { + qCDebug(WEBENGINEVIEWER_LOG) << " CreatePhishingUrlDataBaseJob::parseAdditions unknown rawHashes key " << key; + } + } + if (tmp.isValid()) { + additionList.append(tmp); + } + //qCDebug(WEBENGINEVIEWER_LOG)<<" rawHashs " << mapIt.value().typeName(); + } else { + qCDebug(WEBENGINEVIEWER_LOG) << " CreatePhishingUrlDataBaseJob::parseAdditions unknown mapIt.key() " << keyStr; + } + } + } else { + qCDebug(WEBENGINEVIEWER_LOG) << " CreatePhishingUrlDataBaseJob::parseAdditions not parsing type " << v.typeName(); + } + } + return additionList; +} + +void CreatePhishingUrlDataBaseJob::setUseCompactJson(bool useCompactJson) +{ + mUseCompactJson = useCompactJson; +} + +QVector CreatePhishingUrlDataBaseJob::parseRemovals(const QVariantList &lst) +{ + QVector removalList; + Q_FOREACH (const QVariant &v, lst) { + if (v.canConvert()) { + Removal tmp; + QMapIterator mapIt(v.toMap()); + while (mapIt.hasNext()) { + mapIt.next(); + const QString keyStr = mapIt.key(); + if (keyStr == QLatin1String("compressionType")) { + qCDebug(WEBENGINEVIEWER_LOG) << " compression type :" << mapIt.value(); + } else if (keyStr == QLatin1String("riceIndices")) { + //TODO implement it. + qCDebug(WEBENGINEVIEWER_LOG) << " CreatePhishingUrlDataBaseJob::parseRemovals need to implement riceindices "; + } else if (keyStr == QLatin1String("rawIndices")) { + const QVariantMap map = mapIt.value().toMap(); + QMapIterator rawIndicesIt(map); + while (rawIndicesIt.hasNext()) { + rawIndicesIt.next(); + if (rawIndicesIt.key() == QStringLiteral("indices")) { + const QVariantList lst = rawIndicesIt.value().toList(); + QList indexList; + Q_FOREACH (const QVariant &var, lst) { + indexList.append(var.toInt()); + } + tmp.indexes = indexList; + } else { + qCDebug(WEBENGINEVIEWER_LOG) << "rawIndicesIt.key() unknown " << rawIndicesIt.key(); + } + } + } else { + qCDebug(WEBENGINEVIEWER_LOG) << " CreatePhishingUrlDataBaseJob::parseRemovals unknown mapIt.key() " << keyStr; + } + } + if (tmp.isValid()) { + removalList.append(tmp); + } + } else { + qCDebug(WEBENGINEVIEWER_LOG) << " CreatePhishingUrlDataBaseJob::parseRemovals not parsing type " << v.typeName(); + } + } + return removalList; +} + +void CreatePhishingUrlDataBaseJob::parseResult(const QByteArray &value) +{ + UpdateDataBaseInfo databaseInfo; + QJsonDocument document = QJsonDocument::fromJson(value); + if (document.isNull()) { + Q_EMIT finished(databaseInfo, InvalidData); + } else { + const QVariantMap answer = document.toVariant().toMap(); + if (answer.isEmpty()) { + Q_EMIT finished(databaseInfo, InvalidData); + } else { + QMapIterator i(answer); + while (i.hasNext()) { + i.next(); + if (i.key() == QLatin1String("listUpdateResponses")) { + const QVariantList info = i.value().toList(); + if (info.count() == 1) { + const QVariant infoVar = info.at(0); + if (infoVar.canConvert()) { + QMapIterator mapIt(infoVar.toMap()); + while (mapIt.hasNext()) { + mapIt.next(); + const QString mapKey = mapIt.key(); + if (mapKey == QLatin1String("additions")) { + const QVariantList lst = mapIt.value().toList(); + const QVector addList = parseAdditions(lst); + if (!addList.isEmpty()) { + databaseInfo.additionList.append(addList); + } + } else if (mapKey == QLatin1String("removals")) { + const QVariantList lst = mapIt.value().toList(); + const QVector removeList = parseRemovals(lst); + if (!removeList.isEmpty()) { + databaseInfo.removalList.append(removeList); + } + } else if (mapKey == QLatin1String("checksum")) { + QMapIterator mapCheckSum(mapIt.value().toMap()); + while (mapCheckSum.hasNext()) { + mapCheckSum.next(); + if (mapCheckSum.key() == QLatin1String("sha256")) { + databaseInfo.sha256 = mapCheckSum.value().toString(); + } else { + qCDebug(WEBENGINEVIEWER_LOG) << "Invalid checksum key" << mapCheckSum.key(); + } + } + } else if (mapKey == QLatin1String("newClientState")) { + databaseInfo.newClientState = mapIt.value().toString(); + } else if (mapKey == QLatin1String("platformType")) { + databaseInfo.platformType = mapIt.value().toString(); + } else if (mapKey == QLatin1String("responseType")) { + const QString str = mapIt.value().toString(); + if (str == QLatin1String("FULL_UPDATE")) { + databaseInfo.responseType = UpdateDataBaseInfo::FullUpdate; + } else if (str == QLatin1String("PARTIAL_UPDATE")) { + databaseInfo.responseType = UpdateDataBaseInfo::PartialUpdate; + } else { + qCDebug(WEBENGINEVIEWER_LOG) << " unknow responsetype " << str; + databaseInfo.responseType = UpdateDataBaseInfo::Unknown; + } + } else if (mapKey == QLatin1String("threatEntryType")) { + databaseInfo.threatEntryType = mapIt.value().toString(); + } else if (mapKey == QLatin1String("threatType")) { + databaseInfo.threatType = mapIt.value().toString(); + } else { + qCDebug(WEBENGINEVIEWER_LOG) << " unknow key " << mapKey; + } + } + } + } + } else if (i.key() == QLatin1String("minimumWaitDuration")) { + databaseInfo.minimumWaitDuration = i.value().toString(); + } else { + qCDebug(WEBENGINEVIEWER_LOG) << " map key unknown " << i.key(); + } + } + Q_EMIT finished(databaseInfo, ValidData); + + } + } + deleteLater(); +} + +void UpdateDataBaseInfo::clear() +{ + additionList.clear(); + removalList.clear(); + minimumWaitDuration.clear(); + threatType.clear(); + threatEntryType.clear(); + responseType = UpdateDataBaseInfo::Unknown; + platformType.clear(); + newClientState.clear(); + sha256.clear(); + +} + +bool UpdateDataBaseInfo::operator==(const UpdateDataBaseInfo &other) const +{ + const bool val = (additionList == other.additionList) && + (removalList == other.removalList) && + (minimumWaitDuration == other.minimumWaitDuration) && + (threatType == other.threatType) && + (threatEntryType == other.threatEntryType) && + (responseType == other.responseType) && + (platformType == other.platformType) && + (newClientState == other.newClientState) && + (sha256 == other.sha256); + if (!val) { + qCDebug(WEBENGINEVIEWER_LOG) << " sha256 " << sha256 << " other.sha256 " << other.sha256; + qCDebug(WEBENGINEVIEWER_LOG) << " minimumWaitDuration " << minimumWaitDuration << " other.minimumWaitDuration " << other.minimumWaitDuration; + qCDebug(WEBENGINEVIEWER_LOG) << " threatType " << threatType << " other.threatType " << other.threatType; + qCDebug(WEBENGINEVIEWER_LOG) << " threatEntryType " << threatEntryType << " other.threatEntryType " << other.threatEntryType; + qCDebug(WEBENGINEVIEWER_LOG) << " responseType " << responseType << " other.responseType " << other.responseType; + qCDebug(WEBENGINEVIEWER_LOG) << " platformType " << platformType << " other.platformType " << other.platformType; + qCDebug(WEBENGINEVIEWER_LOG) << " newClientState " << newClientState << " other.newClientState " << other.newClientState; + qCDebug(WEBENGINEVIEWER_LOG) << " threatType " << threatType << " other.threatType " << other.threatType; + qCDebug(WEBENGINEVIEWER_LOG) << " removalList" << removalList.count() << " other.removalList " << other.removalList.count(); + qCDebug(WEBENGINEVIEWER_LOG) << " additionList" << additionList.count() << " other.additionList " << other.additionList.count(); + } + return val; +} + +bool Removal::operator==(const Removal &other) const +{ + bool value = (indexes == other.indexes); + if (!value) { + qCDebug(WEBENGINEVIEWER_LOG) << " indexes " << indexes << " other.indexes " << other.indexes; + } + return value; +} + +bool Removal::isValid() const +{ + return !indexes.isEmpty(); +} + +Addition::Addition() + : prefixSize(0) +{ + +} + +bool Addition::isValid() const +{ + return !hashString.isEmpty() && (prefixSize > 0); +} + +bool Addition::operator==(const Addition &other) const +{ + bool value = (hashString == other.hashString) && + (prefixSize == other.prefixSize); + if (!value) { + qCDebug(WEBENGINEVIEWER_LOG) << "hashString " << hashString << " other.hashString " << other.hashString; + qCDebug(WEBENGINEVIEWER_LOG) << "prefixSize " << prefixSize << " other.prefixSize " << other.prefixSize; + } + return value; +} diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/createphishingurldatabasejob.h kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/createphishingurldatabasejob.h --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/createphishingurldatabasejob.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/createphishingurldatabasejob.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,126 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef CREATEPHISHINGURLDATABASEJOB_H +#define CREATEPHISHINGURLDATABASEJOB_H + +#include +#include +#include + +#include "webengineviewer_export.h" +class QNetworkAccessManager; +namespace WebEngineViewer +{ +struct Addition { + Addition(); + bool isValid() const; + bool operator==(const Addition &other) const; + + QByteArray hashString; + int prefixSize; +}; + +struct Removal { + bool operator==(const Removal &other) const; + bool isValid() const; + QList indexes; +}; + +struct UpdateDataBaseInfo { + UpdateDataBaseInfo() + : responseType(Unknown) + { + + } + + enum ResponseType { + Unknown = 0, + FullUpdate = 1, + PartialUpdate = 2 + }; + + QVector additionList; + QVector removalList; + QString minimumWaitDuration; + QString threatType; + QString threatEntryType; + ResponseType responseType; + QString platformType; + QString newClientState; + QString sha256; + void clear(); + bool operator==(const UpdateDataBaseInfo &other) const; +}; + +/* https://developers.google.com/safe-browsing/v4/update-api */ +class WEBENGINEVIEWER_EXPORT CreatePhishingUrlDataBaseJob : public QObject +{ + Q_OBJECT +public: + enum DataBaseDownloadType { + FullDataBase = 0, + UpdateDataBase = 1 + }; + + enum DataBaseDownloadResult { + InvalidData = 0, + ValidData = 1, + UnknownError = 2, + BrokenNetwork = 3 + }; + + explicit CreatePhishingUrlDataBaseJob(QObject *parent = Q_NULLPTR); + ~CreatePhishingUrlDataBaseJob(); + + void start(); + + void setDataBaseState(const QString &value); + + void setDataBaseDownloadNeeded(WebEngineViewer::CreatePhishingUrlDataBaseJob::DataBaseDownloadType type); + + QByteArray jsonRequest() const; + + void setUseCompactJson(bool useCompactJson); + void parseResult(const QByteArray &value); + +Q_SIGNALS: + void finished(const WebEngineViewer::UpdateDataBaseInfo &infoDataBase, WebEngineViewer::CreatePhishingUrlDataBaseJob::DataBaseDownloadResult status); + void debugJsonResult(const QByteArray &ba); + void debugJson(const QByteArray &ba); + +private: + void slotDownloadDataBaseFinished(QNetworkReply *reply); + void slotSslErrors(QNetworkReply *reply, const QList &error); + void slotError(QNetworkReply::NetworkError error); + QVector parseRemovals(const QVariantList &lst); + QVector parseAdditions(const QVariantList &lst); + + QString mDataBaseState; + DataBaseDownloadType mDataBaseDownloadNeeded; + bool mUseCompactJson; + QNetworkAccessManager *mNetworkAccessManager; +}; +} +Q_DECLARE_METATYPE(WebEngineViewer::CreatePhishingUrlDataBaseJob::DataBaseDownloadType) +Q_DECLARE_METATYPE(WebEngineViewer::CreatePhishingUrlDataBaseJob::DataBaseDownloadResult) +Q_DECLARE_METATYPE(WebEngineViewer::UpdateDataBaseInfo) +Q_DECLARE_TYPEINFO(WebEngineViewer::Addition, Q_MOVABLE_TYPE); +Q_DECLARE_TYPEINFO(WebEngineViewer::Removal, Q_MOVABLE_TYPE); +#endif // CREATEPHISHINGURLDATABASEJOB_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/localdatabasefile.cpp kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/localdatabasefile.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/localdatabasefile.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/localdatabasefile.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,58 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "localdatabasefile.h" + +using namespace WebEngineViewer; + +LocalDataBaseFile::LocalDataBaseFile(const QString &filename) + : mFile(filename), + mValid(false) +{ + load(); +} + +LocalDataBaseFile::~LocalDataBaseFile() +{ + +} + +bool LocalDataBaseFile::load() +{ + if (!mFile.open(QIODevice::ReadOnly)) + return false; + mData = mFile.map(0, mFile.size()); + if (mData) { + const int major = getUint16(0); + const int minor = getUint16(2); + mValid = (major == 1 && minor >= 1 && minor <= 2); + } + mMtime = QFileInfo(mFile).lastModified(); + return mValid; +} + +bool LocalDataBaseFile::reload() +{ + mValid = false; + if (mFile.isOpen()) { + mFile.close(); + } + mData = 0; + return load(); +} diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/localdatabasefile.h kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/localdatabasefile.h --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/localdatabasefile.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/localdatabasefile.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,63 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef LOCALDATABASEFILE_H +#define LOCALDATABASEFILE_H + +#include +#include +#include +#include +#include + +namespace WebEngineViewer +{ +class LocalDataBaseFile +{ +public: + LocalDataBaseFile(const QString &filename); + ~LocalDataBaseFile(); + + bool isValid() const { return mValid; } + inline quint16 getUint16(int offset) const + { + return qFromBigEndian(*reinterpret_cast(mData + offset)); + } + inline quint32 getUint32(int offset) const + { + return qFromBigEndian(*reinterpret_cast(mData + offset)); + } + inline const char *getCharStar(int offset) const + { + return reinterpret_cast(mData + offset); + } + + +private: + bool load(); + bool reload(); + + QFile mFile; + uchar *mData; + QDateTime mMtime; + bool mValid; +}; +} + +#endif // LOCALDATABASEFILE_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/localdatabasemanager.cpp kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/localdatabasemanager.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/localdatabasemanager.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/localdatabasemanager.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,275 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ +#include "localdatabasemanager.h" +#include "webengineviewer_debug.h" +#include "checkphishingurlfromlocaldatabasejob.h" +#include "createphishingurldatabasejob.h" + +#include +#include + +#include +#include +#include +#include +#include + +using namespace WebEngineViewer; + +Q_GLOBAL_STATIC(LocalDataBaseManager, s_localDataBaseManager) + +namespace { +inline QString localDataBasePath() { + return QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QStringLiteral("/phishingurl/"); +} +} + +LocalDataBaseManager::LocalDataBaseManager(QObject *parent) + : QObject(parent), + mDataBaseOk(false), + mDownloadProgress(false) +{ + readConfig(); +} + +LocalDataBaseManager::~LocalDataBaseManager() +{ +} + +void LocalDataBaseManager::closeDataBaseAndDeleteIt() +{ + /* + if (mDataBaseOk) { + mDataBase.close(); + QFile f(localDataBasePath() + sqlFileName()); + if (!f.remove()) { + qCWarning(WEBENGINEVIEWER_LOG) << "impossible to remove local database file"; + } + } + */ +} + +void LocalDataBaseManager::readConfig() +{ + KConfig phishingurlKConfig(QStringLiteral("phishingurlrc")); + KConfigGroup grp = phishingurlKConfig.group(QStringLiteral("General")); + mNewClientState = grp.readEntry(QStringLiteral("DataBaseState")); +} + +void LocalDataBaseManager::saveConfig() +{ + KConfig phishingurlKConfig(QStringLiteral("phishingurlrc")); + KConfigGroup grp = phishingurlKConfig.group(QStringLiteral("General")); + grp.writeEntry(QStringLiteral("DataBaseState"), mNewClientState); +} + +void LocalDataBaseManager::downloadPartialDataBase() +{ + setDownloadProgress(true); + WebEngineViewer::CreatePhishingUrlDataBaseJob *job = new WebEngineViewer::CreatePhishingUrlDataBaseJob(this); + job->setDataBaseDownloadNeeded(WebEngineViewer::CreatePhishingUrlDataBaseJob::UpdateDataBase); + job->setDataBaseState(mNewClientState); + connect(job, &CreatePhishingUrlDataBaseJob::finished, this, &LocalDataBaseManager::slotDownloadDataBaseFinished); + job->start(); +} + +void LocalDataBaseManager::downloadFullDataBase() +{ + setDownloadProgress(true); + WebEngineViewer::CreatePhishingUrlDataBaseJob *job = new WebEngineViewer::CreatePhishingUrlDataBaseJob(this); + job->setDataBaseDownloadNeeded(WebEngineViewer::CreatePhishingUrlDataBaseJob::FullDataBase); + connect(job, &CreatePhishingUrlDataBaseJob::finished, this, &LocalDataBaseManager::slotDownloadDataBaseFinished); + job->start(); +} + +void LocalDataBaseManager::initialize() +{ + if (mDownloadProgress) { + return; + } + if (!mDataBaseOk) { + /* + bool initDatabaseSuccess = initializeDataBase(); + if (initDatabaseSuccess) { + if (!mDataBase.tables().contains(tableName())) { + if (createTable()) { + downloadFullDataBase(); + } else { + qCWarning(WEBENGINEVIEWER_LOG) << "Impossible to create Table"; + } + } else { + mDataBaseOk = true; + } + } + */ + } else { + qCWarning(WEBENGINEVIEWER_LOG) << "Database already initialized."; + } + if (mDataBaseOk) { + } +} + +void LocalDataBaseManager::slotCheckDataBase() +{ + if (mDataBaseOk && !mDownloadProgress) { + downloadPartialDataBase(); + } +} + +void LocalDataBaseManager::slotDownloadDataBaseFinished(const WebEngineViewer::UpdateDataBaseInfo &infoDataBase, + WebEngineViewer::CreatePhishingUrlDataBaseJob::DataBaseDownloadResult status) +{ + + qDebug() << "LocalDataBaseManager::slotDownloadFullDataBaseFinished "< &removalList) +{ + Q_FOREACH(const Removal &removeItem, removalList) { + Q_FOREACH (int id, removeItem.indexes) { + //TODO + } + } +} + +void LocalDataBaseManager::addElementToDataBase(const QVector &additionList) +{ + Q_FOREACH(const Addition &add, additionList) { + //qDebug() << " add.size" << add.prefixSize; + //qDebug() << " add.hash" << QByteArray::fromBase64(add.hashString).size(); + const QByteArray uncompressed = QByteArray::fromBase64(add.hashString); + for (int i = 0; i < uncompressed.size();) { + const QByteArray m = uncompressed.mid(i, add.prefixSize); + i += add.prefixSize; + //qDebug() << "m " << m << " m.size" << m.size(); + //TODO add in database + } + } +} + +void LocalDataBaseManager::fullUpdateDataBase(const WebEngineViewer::UpdateDataBaseInfo &infoDataBase) +{ + //Clear DataBase + addElementToDataBase(infoDataBase.additionList); + mNewClientState = infoDataBase.newClientState; + saveConfig(); +} + +void LocalDataBaseManager::partialUpdateDataBase(const WebEngineViewer::UpdateDataBaseInfo &infoDataBase) +{ + removeElementFromDataBase(infoDataBase.removalList); + addElementToDataBase(infoDataBase.additionList); + mNewClientState = infoDataBase.newClientState; + saveConfig(); +} + +LocalDataBaseManager *LocalDataBaseManager::self() +{ + return s_localDataBaseManager; +} + +bool LocalDataBaseManager::initializeDataBase() +{ + /* + mDataBase = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE")); + QDir().mkpath(localDataBasePath()); + mDataBase.setDatabaseName(localDataBasePath() + sqlFileName()); + if (!mDataBase.open()) { + qCWarning(WEBENGINEVIEWER_LOG) << "Impossible to open DataBase: " << mDataBase.lastError().text(); + return false; + } + */ + return true; +} + +void LocalDataBaseManager::setDownloadProgress(bool downloadProgress) +{ + mDownloadProgress = downloadProgress; +} + +void LocalDataBaseManager::checkUrl(const QUrl &url) +{ + if (mDataBaseOk) { + QByteArray hash = createHash(url); + if (malwareFound(hash)) { + Q_EMIT checkUrlFinished(url, WebEngineViewer::LocalDataBaseManager::Malware); + } else { + Q_EMIT checkUrlFinished(url, WebEngineViewer::LocalDataBaseManager::UrlOk); + } + } else { + Q_EMIT checkUrlFinished(url, WebEngineViewer::LocalDataBaseManager::Unknown); + } +} + +QByteArray LocalDataBaseManager::createHash(const QUrl &url) +{ + return QCryptographicHash::hash(QByteArray() /*TODO use url*/, QCryptographicHash::Sha256); +} + +bool LocalDataBaseManager::malwareFound(const QByteArray &hash) +{ + //TODO + return false; +} diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/localdatabasemanager.h kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/localdatabasemanager.h --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/localdatabasemanager.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/localdatabasemanager.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,81 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef LOCALDATABASEMANAGER_H +#define LOCALDATABASEMANAGER_H + +#include +#include "webengineviewer_export.h" +#include +#include "createphishingurldatabasejob.h" +namespace WebEngineViewer +{ +class WEBENGINEVIEWER_EXPORT LocalDataBaseManager : public QObject +{ + Q_OBJECT +public: + enum UrlStatus { + Unknown = 0, + UrlOk = 1, + Malware = 2 + }; + + explicit LocalDataBaseManager(QObject *parent = Q_NULLPTR); + ~LocalDataBaseManager(); + + static LocalDataBaseManager *self(); + + void checkUrl(const QUrl &url); + + void initialize(); + + void closeDataBaseAndDeleteIt(); + + +Q_SIGNALS: + void checkUrlFinished(const QUrl &url, WebEngineViewer::LocalDataBaseManager::UrlStatus status); + +protected: + void setDownloadProgress(bool downloadProgress); + virtual void downloadFullDataBase(); + virtual void downloadPartialDataBase(); + +private: + void readConfig(); + void saveConfig(); + + void fullUpdateDataBase(const WebEngineViewer::UpdateDataBaseInfo &infoDataBase); + void slotDownloadDataBaseFinished(const WebEngineViewer::UpdateDataBaseInfo &infoDataBase, WebEngineViewer::CreatePhishingUrlDataBaseJob::DataBaseDownloadResult status); + void partialUpdateDataBase(const WebEngineViewer::UpdateDataBaseInfo &infoDataBase); + void addElementToDataBase(const QVector &additionList); + void removeElementFromDataBase(const QVector &removalList); + void slotCheckDataBase(); + + bool initializeDataBase(); + QByteArray createHash(const QUrl &url); + void checkDataBase(); + bool malwareFound(const QByteArray &hash); + + QString mNewClientState; + bool mDataBaseOk; + bool mDownloadProgress; +}; +} + +#endif // LOCALDATABASEMANAGER_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/searchfullhashjob.cpp kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/searchfullhashjob.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/searchfullhashjob.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/searchfullhashjob.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,232 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "searchfullhashjob.h" + +#include "checkphishingurlutil.h" +#include +#include +#include +#include +#include + +using namespace WebEngineViewer; + +SearchFullHashJob::SearchFullHashJob(QObject *parent) + : QObject(parent), + mUseCompactJson(true) +{ + mNetworkAccessManager = new QNetworkAccessManager(this); + connect(mNetworkAccessManager, &QNetworkAccessManager::finished, this, &SearchFullHashJob::slotCheckUrlFinished); + connect(mNetworkAccessManager, &QNetworkAccessManager::sslErrors, this, &SearchFullHashJob::slotSslErrors); +} + +SearchFullHashJob::~SearchFullHashJob() +{ +} + +void SearchFullHashJob::slotSslErrors(QNetworkReply *reply, const QList &error) +{ + qCDebug(WEBENGINEVIEWER_LOG) << " void SearchFullHashJob::slotSslErrors(QNetworkReply *reply, const QList &error)" << error.count(); + reply->ignoreSslErrors(error); +} + +void SearchFullHashJob::setUseCompactJson(bool useCompactJson) +{ + mUseCompactJson = useCompactJson; +} + +void SearchFullHashJob::parse(const QByteArray &replyStr) +{ + /* + +{ + "matches": [{ + "threatType": "MALWARE", + "platformType": "WINDOWS", + "threatEntryType": "URL", + "threat": { + "hash": "WwuJdQx48jP-4lxr4y2Sj82AWoxUVcIRDSk1PC9Rf-4=" + }, + "threatEntryMetadata": { + "entries": [{ + "key": "bWFsd2FyZV90aHJlYXRfdHlwZQ==", // base64-encoded "malware_threat_type" + "value": "TEFORElORw==" // base64-encoded "LANDING" + }] + }, + "cacheDuration": "300.000s" + }, { + "threatType": "SOCIAL_ENGINEERING", + "platformType": "WINDOWS", + "threatEntryType": "URL", + "threat": { + "hash": "771MOrRPMn6xPKlCrXx_CrR-wmCk0LgFFoSgGy7zUiA=" + }, + "threatEntryMetadata": { + "entries": [] + }, + "cacheDuration": "300.000s" + }], + "minimumWaitDuration": "300.000s", + "negativeCacheDuration": "300.000s" +} +*/ + QJsonDocument document = QJsonDocument::fromJson(replyStr); + if (document.isNull()) { + Q_EMIT result(WebEngineViewer::SearchFullHashJob::Unknown, mHash); + } else { + const QVariantMap answer = document.toVariant().toMap(); + if (answer.isEmpty()) { + Q_EMIT result(WebEngineViewer::SearchFullHashJob::Ok, mHash); + return; + } else { + const QVariantList info = answer.value(QStringLiteral("matches")).toList(); + //Implement multi match ? + if (info.count() == 1) { + const QVariantMap map = info.at(0).toMap(); + const QString threatTypeStr = map[QStringLiteral("threatType")].toString(); + if (threatTypeStr == QStringLiteral("MALWARE")) { + const QVariantMap urlMap = map[QStringLiteral("threat")].toMap(); + if (urlMap.count() == 1) { + const QString hashStr = urlMap[QStringLiteral("hash")].toString(); + //TODO + /* + if (urlMap[QStringLiteral("hash")].toString() == mHash.toString()) { + Q_EMIT result(WebEngineViewer::SearchFullHashJob::MalWare, mHash); + return; + } + */ + } + } else { + qWarning() << " SearchFullHashJob::parse threatTypeStr : " << threatTypeStr; + } + } + Q_EMIT result(WebEngineViewer::SearchFullHashJob::Unknown, mHash); + } + } +} + +void SearchFullHashJob::slotCheckUrlFinished(QNetworkReply *reply) +{ + parse(reply->readAll()); + reply->deleteLater(); + deleteLater(); +} + +void SearchFullHashJob::setSearchHash(const QByteArray &hash) +{ + mHash = hash; +} + +QByteArray SearchFullHashJob::jsonRequest() const +{ + /* +{ + "client": { + "clientId": "yourcompanyname", + "clientVersion": "1.5.2" + }, + "clientStates": [ + "ChAIARABGAEiAzAwMSiAEDABEAE=", + "ChAIAhABGAEiAzAwMSiAEDABEOgH" + ], + "threatInfo": { + "threatTypes": ["MALWARE", "SOCIAL_ENGINEERING"], + "platformTypes": ["WINDOWS"], + "threatEntryTypes": ["URL"], + "threatEntries": [ + {"hash": "WwuJdQ=="}, + {"hash": "771MOg=="}, + {"hash": "5eOrwQ=="} + ] + } +} + */ + QVariantMap clientMap; + QVariantMap map; + + clientMap.insert(QStringLiteral("clientId"), QStringLiteral("KDE")); + clientMap.insert(QStringLiteral("clientVersion"), QStringLiteral("5.4.0")); //FIXME + map.insert(QStringLiteral("client"), clientMap); + + //clientStates We can support multi database. + const QVariantList clientStatesList = { mDatabaseHash }; + map.insert(QStringLiteral("clientStates"), clientStatesList); + + + QVariantMap threatMap; + const QVariantList platformList = { QStringLiteral("WINDOWS") }; + threatMap.insert(QStringLiteral("platformTypes"), platformList); + + const QVariantList threatTypesList = { QStringLiteral("MALWARE") }; + threatMap.insert(QStringLiteral("threatTypes"), threatTypesList); + const QVariantList threatEntryTypesList = { QStringLiteral("URL") }; + threatMap.insert(QStringLiteral("threatEntryTypes"), threatEntryTypesList); + QVariantMap hashUrlMap; + hashUrlMap.insert(QStringLiteral("hash"), mHash); + threatMap.insert(QStringLiteral("threatEntries"), hashUrlMap); + + map.insert(QStringLiteral("threatInfo"), threatMap); + + const QJsonDocument postData = QJsonDocument::fromVariant(map); + const QByteArray baPostData = postData.toJson(mUseCompactJson ? QJsonDocument::Compact : QJsonDocument::Indented); + return baPostData; +} + +void SearchFullHashJob::start() +{ + if (!PimCommon::NetworkManager::self()->networkConfigureManager()->isOnline()) { + Q_EMIT result(WebEngineViewer::SearchFullHashJob::BrokenNetwork, mHash); + deleteLater(); + } else if (canStart()) { + QUrl safeUrl = QUrl(QStringLiteral("https://safebrowsing.googleapis.com/v4/fullHashes:find")); + safeUrl.addQueryItem(QStringLiteral("key"), WebEngineViewer::CheckPhishingUrlUtil::apiKey()); + QNetworkRequest request(safeUrl); + request.setHeader(QNetworkRequest::ContentTypeHeader, QStringLiteral("application/json")); + + const QByteArray baPostData = jsonRequest(); + qCDebug(WEBENGINEVIEWER_LOG) << " postData.toJson()" << baPostData; + Q_EMIT debugJson(baPostData); + //curl -H "Content-Type: application/json" -X POST -d '{"client":{"clientId":"KDE","clientVersion":"5.4.0"},"threatInfo":{"platformTypes":["WINDOWS"],"threatEntries":[{"url":"http://www.kde.org"}],"threatEntryTypes":["URL"],"threatTypes":["MALWARE"]}}' https://safebrowsing.googleapis.com/v4/threatMatches:find?key=AIzaSyBS62pXATjabbH2RM_jO2EzDg1mTMHlnyo + + QNetworkReply *reply = mNetworkAccessManager->post(request, baPostData); + connect(reply, static_cast(&QNetworkReply::error), this, &SearchFullHashJob::slotError); + } else { + Q_EMIT result(WebEngineViewer::SearchFullHashJob::InvalidUrl, mHash); + deleteLater(); + } +} + +void SearchFullHashJob::slotError(QNetworkReply::NetworkError error) +{ + QNetworkReply *reply = qobject_cast(sender()); + qCWarning(WEBENGINEVIEWER_LOG) << " error " << error << " error string : " << reply->errorString(); + reply->deleteLater(); + deleteLater(); +} + +bool SearchFullHashJob::canStart() const +{ + return !mHash.isEmpty() && !mDatabaseHash.isEmpty(); +} + +void SearchFullHashJob::setDatabaseState(const QString &hash) +{ + mDatabaseHash = hash; +} diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/searchfullhashjob.h kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/searchfullhashjob.h --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/searchfullhashjob.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/searchfullhashjob.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,72 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef SEARCHFULLHASHJOB_H +#define SEARCHFULLHASHJOB_H + +#include +#include +#include +#include "webengineviewer_export.h" +class QNetworkAccessManager; +namespace WebEngineViewer +{ +/* https://developers.google.com/safe-browsing/v4/lookup-api */ +class WEBENGINEVIEWER_EXPORT SearchFullHashJob : public QObject +{ + Q_OBJECT +public: + explicit SearchFullHashJob(QObject *parent = Q_NULLPTR); + ~SearchFullHashJob(); + + enum UrlStatus { + Ok = 0, + MalWare, + BrokenNetwork, + InvalidUrl, + Unknown + }; + + void start(); + bool canStart() const; + + void setDatabaseState(const QString &hash); + + QByteArray jsonRequest() const; + void parse(const QByteArray &replyStr); + void setUseCompactJson(bool useCompactJson); + + void setSearchHash(const QByteArray &hash); +Q_SIGNALS: + void result(WebEngineViewer::SearchFullHashJob::UrlStatus status, const QByteArray &url); + void debugJson(const QByteArray &ba); + +private Q_SLOTS: + void slotSslErrors(QNetworkReply *reply, const QList &error); + void slotError(QNetworkReply::NetworkError error); + void slotCheckUrlFinished(QNetworkReply *reply); +private: + QByteArray mHash; + QString mDatabaseHash; + bool mUseCompactJson; + QNetworkAccessManager *mNetworkAccessManager; +}; +} + +#endif // SEARCHFULLHASHJOB_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/checkphishingurlgui.cpp kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/checkphishingurlgui.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/checkphishingurlgui.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/checkphishingurlgui.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,117 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "checkphishingurlgui.h" + +#include +#include +#include +#include +#include +#include +#include + +CheckPhishingUrlGui::CheckPhishingUrlGui(QWidget *parent) + : QWidget(parent) +{ + QVBoxLayout *layout = new QVBoxLayout(this); + + QHBoxLayout *checkUrlLayout = new QHBoxLayout; + layout->addLayout(checkUrlLayout); + QLabel *lab = new QLabel(QStringLiteral("Url to Check:"), this); + checkUrlLayout->addWidget(lab); + mCheckUrlLineEdit = new QLineEdit(this); + checkUrlLayout->addWidget(mCheckUrlLineEdit); + QPushButton *button = new QPushButton(QStringLiteral("Check"), this); + checkUrlLayout->addWidget(button); + connect(button, &QPushButton::clicked, this, &CheckPhishingUrlGui::slotCheckUrl); + connect(mCheckUrlLineEdit, &QLineEdit::returnPressed, this, &CheckPhishingUrlGui::slotCheckUrl); + + mResult = new QTextEdit(this); + mResult->setReadOnly(true); + mResult->setAcceptRichText(false); + layout->addWidget(mResult); + + mJson = new QTextEdit(this); + mJson->setReadOnly(true); + mJson->setAcceptRichText(false); + layout->addWidget(mJson); + +} + +CheckPhishingUrlGui::~CheckPhishingUrlGui() +{ + +} + +void CheckPhishingUrlGui::slotCheckUrl() +{ + const QString urlStr = mCheckUrlLineEdit->text().trimmed(); + if (urlStr.isEmpty()) { + return; + } + mResult->clear(); + + WebEngineViewer::CheckPhishingUrlJob *job = new WebEngineViewer::CheckPhishingUrlJob(this); + job->setUseCompactJson(false); + connect(job, &WebEngineViewer::CheckPhishingUrlJob::result, this, &CheckPhishingUrlGui::slotGetResult); + connect(job, &WebEngineViewer::CheckPhishingUrlJob::debugJson, this, &CheckPhishingUrlGui::slotJSonDebug); + job->setUrl(QUrl::fromUserInput(urlStr)); + job->start(); +} + +void CheckPhishingUrlGui::slotJSonDebug(const QByteArray &debug) +{ + mJson->setText(QString::fromLatin1(debug)); +} + +void CheckPhishingUrlGui::slotGetResult(WebEngineViewer::CheckPhishingUrlJob::UrlStatus result) +{ + QString resultStr; + switch (result) { + case WebEngineViewer::CheckPhishingUrlJob::Ok: + resultStr = QStringLiteral("Url ok"); + break; + case WebEngineViewer::CheckPhishingUrlJob::MalWare: + resultStr = QStringLiteral("Url MalWare"); + break; + case WebEngineViewer::CheckPhishingUrlJob::Unknown: + resultStr = QStringLiteral("Url Unknow state"); + break; + case WebEngineViewer::CheckPhishingUrlJob::BrokenNetwork: + resultStr = QStringLiteral("Broken Network"); + break; + case WebEngineViewer::CheckPhishingUrlJob::InvalidUrl: + resultStr = QStringLiteral("Invalid Url"); + break; + } + mResult->setText(resultStr); +} + +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + QStandardPaths::setTestModeEnabled(true); + CheckPhishingUrlGui *w = new CheckPhishingUrlGui; + + w->show(); + app.exec(); + delete w; + return 0; +} diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/checkphishingurlgui.h kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/checkphishingurlgui.h --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/checkphishingurlgui.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/checkphishingurlgui.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,43 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef CHECKPHISHINGURLGUI_H +#define CHECKPHISHINGURLGUI_H + +#include +#include "../checkphishingurljob.h" +class QLineEdit; +class QTextEdit; +class CheckPhishingUrlGui : public QWidget +{ + Q_OBJECT +public: + explicit CheckPhishingUrlGui(QWidget *parent = Q_NULLPTR); + ~CheckPhishingUrlGui(); +private Q_SLOTS: + void slotCheckUrl(); + void slotGetResult(WebEngineViewer::CheckPhishingUrlJob::UrlStatus result); + void slotJSonDebug(const QByteArray &debug); +private: + QLineEdit *mCheckUrlLineEdit; + QTextEdit *mJson; + QTextEdit *mResult; +}; + +#endif // CHECKPHISHINGURLGUI_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/CMakeLists.txt kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/CMakeLists.txt --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,44 @@ +set( EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR} ) + +include(ECMAddTests) + +include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/.. ) +set(checkphishingurlgui_SRCS checkphishingurlgui.cpp) +add_executable(checkphishingurlgui ${checkphishingurlgui_SRCS}) +target_link_libraries(checkphishingurlgui + KF5::KIOCore + KF5::WebEngineViewer + Qt5::WebEngine + Qt5::WebEngineWidgets + KF5::I18n + ) + +set(searchfullhashgui_SRCS searchfullhashgui.cpp) +add_executable(searchfullhashgui ${searchfullhashgui_SRCS}) +target_link_libraries(searchfullhashgui + KF5::KIOCore + KF5::WebEngineViewer + Qt5::WebEngine + Qt5::WebEngineWidgets + KF5::I18n + ) + +set(createphishingurldatabasegui_SRCS createphishingurldatabasegui.cpp) +add_executable(createphishingurldatabasegui ${createphishingurldatabasegui_SRCS}) +target_link_libraries(createphishingurldatabasegui + KF5::KIOCore + KF5::WebEngineViewer + Qt5::WebEngine + Qt5::WebEngineWidgets + KF5::I18n + ) + +set(managelocaldatabasegui_SRCS managelocaldatabasegui.cpp) +add_executable(managelocaldatabasegui ${managelocaldatabasegui_SRCS}) +target_link_libraries(managelocaldatabasegui + KF5::KIOCore + KF5::WebEngineViewer + Qt5::WebEngine + Qt5::WebEngineWidgets + KF5::I18n + ) diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/createphishingurldatabasegui.cpp kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/createphishingurldatabasegui.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/createphishingurldatabasegui.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/createphishingurldatabasegui.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,114 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "createphishingurldatabasegui.h" +#include "../createphishingurldatabasejob.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +CreatePhisingUrlDataBaseGui::CreatePhisingUrlDataBaseGui(QWidget *parent) + : QWidget(parent) +{ + QVBoxLayout *layout = new QVBoxLayout(this); + + mResult = new QTextEdit(this); + mResult->setReadOnly(true); + mResult->setAcceptRichText(false); + layout->addWidget(mResult); + + mJson = new QTextEdit(this); + mJson->setReadOnly(true); + mJson->setAcceptRichText(false); + layout->addWidget(mJson); + + QHBoxLayout *buttonLayout = new QHBoxLayout; + layout->addLayout(buttonLayout); + QPushButton *button = new QPushButton(QStringLiteral("DownLoad full database"), this); + connect(button, &QPushButton::clicked, this, &CreatePhisingUrlDataBaseGui::slotDownloadFullDatabase); + buttonLayout->addWidget(button); + + QPushButton *button2 = new QPushButton(QStringLiteral("DownLoad partial database"), this); + connect(button2, &QPushButton::clicked, this, &CreatePhisingUrlDataBaseGui::slotDownloadPartialDatabase); + buttonLayout->addWidget(button2); +} + +CreatePhisingUrlDataBaseGui::~CreatePhisingUrlDataBaseGui() +{ + +} + +void CreatePhisingUrlDataBaseGui::clear() +{ + mJson->clear(); + mResult->clear(); +} + +void CreatePhisingUrlDataBaseGui::slotDownloadPartialDatabase() +{ + const QString newValue = QInputDialog::getText(this, QStringLiteral("Define database newClientState"), QStringLiteral("newClientState:")); + if (!newValue.isEmpty()) { + clear(); + WebEngineViewer::CreatePhishingUrlDataBaseJob *job = new WebEngineViewer::CreatePhishingUrlDataBaseJob(this); + job->setUseCompactJson(false); + job->setDataBaseDownloadNeeded(WebEngineViewer::CreatePhishingUrlDataBaseJob::UpdateDataBase); + job->setDataBaseState(newValue); + connect(job, &WebEngineViewer::CreatePhishingUrlDataBaseJob::debugJsonResult, this, &CreatePhisingUrlDataBaseGui::slotResult); + connect(job, &WebEngineViewer::CreatePhishingUrlDataBaseJob::debugJson, this, &CreatePhisingUrlDataBaseGui::slotDebugJSon); + job->start(); + } +} + +void CreatePhisingUrlDataBaseGui::slotDownloadFullDatabase() +{ + clear(); + WebEngineViewer::CreatePhishingUrlDataBaseJob *job = new WebEngineViewer::CreatePhishingUrlDataBaseJob(this); + job->setUseCompactJson(false); + connect(job, &WebEngineViewer::CreatePhishingUrlDataBaseJob::debugJsonResult, this, &CreatePhisingUrlDataBaseGui::slotResult); + connect(job, &WebEngineViewer::CreatePhishingUrlDataBaseJob::debugJson, this, &CreatePhisingUrlDataBaseGui::slotDebugJSon); + job->start(); +} + +void CreatePhisingUrlDataBaseGui::slotDebugJSon(const QByteArray &data) +{ + mJson->setText(QString::fromLatin1(data)); +} + +void CreatePhisingUrlDataBaseGui::slotResult(const QByteArray &data) +{ + mResult->setText(QString::fromLatin1(data)); +} + +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + QStandardPaths::setTestModeEnabled(true); + CreatePhisingUrlDataBaseGui *w = new CreatePhisingUrlDataBaseGui; + + w->show(); + app.exec(); + delete w; + return 0; +} diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/createphishingurldatabasegui.h kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/createphishingurldatabasegui.h --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/createphishingurldatabasegui.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/createphishingurldatabasegui.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,42 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef CREATEPHISHINGURLDATABASEGUI_H +#define CREATEPHISHINGURLDATABASEGUI_H + +#include +class QTextEdit; +class CreatePhisingUrlDataBaseGui : public QWidget +{ + Q_OBJECT +public: + explicit CreatePhisingUrlDataBaseGui(QWidget *parent = Q_NULLPTR); + ~CreatePhisingUrlDataBaseGui(); +private Q_SLOTS: + void slotResult(const QByteArray &data); + void slotDownloadFullDatabase(); + void slotDebugJSon(const QByteArray &data); + void slotDownloadPartialDatabase(); +private: + void clear(); + QTextEdit *mResult; + QTextEdit *mJson; +}; + +#endif // CREATEPHISHINGURLDATABASEGUI_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/managelocaldatabasegui.cpp kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/managelocaldatabasegui.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/managelocaldatabasegui.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/managelocaldatabasegui.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,68 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "managelocaldatabasegui.h" +#include +#include "../localdatabasemanager.h" + +#include +#include +#include +#include +#include +#include +#include + +ManageLocalDataBaseGui::ManageLocalDataBaseGui(QWidget *parent) + : QWidget(parent) +{ + QVBoxLayout *layout = new QVBoxLayout(this); + + mResult = new QTextEdit(this); + mResult->setReadOnly(true); + mResult->setAcceptRichText(false); + layout->addWidget(mResult); + + QPushButton *button = new QPushButton(QStringLiteral("Create Database"), this); + connect(button, &QPushButton::clicked, this, &ManageLocalDataBaseGui::slotDownloadFullDatabase); + layout->addWidget(button); +} + +ManageLocalDataBaseGui::~ManageLocalDataBaseGui() +{ + +} + +void ManageLocalDataBaseGui::slotDownloadFullDatabase() +{ + WebEngineViewer::LocalDataBaseManager::self()->initialize(); +} + + +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + QStandardPaths::setTestModeEnabled(true); + ManageLocalDataBaseGui *w = new ManageLocalDataBaseGui; + + w->show(); + app.exec(); + delete w; + return 0; +} diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/managelocaldatabasegui.h kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/managelocaldatabasegui.h --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/managelocaldatabasegui.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/managelocaldatabasegui.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,37 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef MANAGELOCALDATABASEGUI_H +#define MANAGELOCALDATABASEGUI_H + +#include +class QTextEdit; +class ManageLocalDataBaseGui : public QWidget +{ + Q_OBJECT +public: + explicit ManageLocalDataBaseGui(QWidget *parent = Q_NULLPTR); + ~ManageLocalDataBaseGui(); +private Q_SLOTS: + void slotDownloadFullDatabase(); +private: + QTextEdit *mResult; +}; + +#endif // MANAGELOCALDATABASEGUI_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/searchfullhashgui.cpp kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/searchfullhashgui.cpp --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/searchfullhashgui.cpp 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/searchfullhashgui.cpp 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,132 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "searchfullhashgui.h" + +#include +#include +#include +#include +#include +#include +#include + +SearchFullHashGui::SearchFullHashGui(QWidget *parent) + : QWidget(parent) +{ + QVBoxLayout *layout = new QVBoxLayout(this); + + QHBoxLayout *checkHashLayout = new QHBoxLayout; + layout->addLayout(checkHashLayout); + QLabel *lab = new QLabel(QStringLiteral("Hash from Url to Check:"), this); + checkHashLayout->addWidget(lab); + mCheckHashLineEdit = new QLineEdit(this); + checkHashLayout->addWidget(mCheckHashLineEdit); + + + QHBoxLayout *databaseHashLayout = new QHBoxLayout; + layout->addLayout(databaseHashLayout); + lab = new QLabel(QStringLiteral("Database hash:"), this); + checkHashLayout->addWidget(lab); + mDataBaseHashLineEdit = new QLineEdit(this); + checkHashLayout->addWidget(mDataBaseHashLineEdit); + + + QPushButton *button = new QPushButton(QStringLiteral("Check"), this); + checkHashLayout->addWidget(button); + connect(button, &QPushButton::clicked, this, &SearchFullHashGui::slotCheckUrl); + connect(mCheckHashLineEdit, &QLineEdit::returnPressed, this, &SearchFullHashGui::slotCheckUrl); + + mResult = new QTextEdit(this); + mResult->setReadOnly(true); + mResult->setAcceptRichText(false); + layout->addWidget(mResult); + + mJson = new QTextEdit(this); + mJson->setReadOnly(true); + mJson->setAcceptRichText(false); + layout->addWidget(mJson); +} + +SearchFullHashGui::~SearchFullHashGui() +{ + +} + +void SearchFullHashGui::slotCheckUrl() +{ + const QString hashStr = mCheckHashLineEdit->text().trimmed(); + if (hashStr.isEmpty()) { + return; + } + const QString databaseHashStr = mDataBaseHashLineEdit->text().trimmed(); + if (databaseHashStr.isEmpty()) { + return; + } + + mResult->clear(); + WebEngineViewer::SearchFullHashJob *job = new WebEngineViewer::SearchFullHashJob(this); + job->setUseCompactJson(false); + connect(job, &WebEngineViewer::SearchFullHashJob::result, this, &SearchFullHashGui::slotGetResult); + connect(job, &WebEngineViewer::SearchFullHashJob::debugJson, this, &SearchFullHashGui::slotJSonDebug); + job->setDatabaseState(databaseHashStr); + job->setSearchHash(hashStr.toLatin1()); + + job->start(); +} + +void SearchFullHashGui::slotJSonDebug(const QByteArray &debug) +{ + mJson->setText(QString::fromLatin1(debug)); +} + +void SearchFullHashGui::slotGetResult(WebEngineViewer::SearchFullHashJob::UrlStatus result) +{ + QString resultStr; + switch (result) { + case WebEngineViewer::SearchFullHashJob::Ok: + resultStr = QStringLiteral("Url ok"); + break; + case WebEngineViewer::SearchFullHashJob::MalWare: + resultStr = QStringLiteral("Url MalWare"); + break; + case WebEngineViewer::SearchFullHashJob::Unknown: + resultStr = QStringLiteral("Url Unknow state"); + break; + case WebEngineViewer::SearchFullHashJob::BrokenNetwork: + resultStr = QStringLiteral("Broken Network"); + break; + case WebEngineViewer::SearchFullHashJob::InvalidUrl: + resultStr = QStringLiteral("Invalid Url"); + break; + } + mResult->setText(resultStr); +} + +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + QStandardPaths::setTestModeEnabled(true); + SearchFullHashGui *w = new SearchFullHashGui; + + w->show(); + app.exec(); + delete w; + return 0; +} diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/searchfullhashgui.h kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/searchfullhashgui.h --- kf5-messagelib-16.04.3/webengineviewer/src/checkphishingurl/tests/searchfullhashgui.h 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/checkphishingurl/tests/searchfullhashgui.h 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,44 @@ +/* + Copyright (C) 2016 Laurent Montel + + This library 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. + + This library 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 this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef CHECKPHISHINGURLGUI_H +#define CHECKPHISHINGURLGUI_H + +#include +#include "../searchfullhashjob.h" +class QLineEdit; +class QTextEdit; +class SearchFullHashGui : public QWidget +{ + Q_OBJECT +public: + explicit SearchFullHashGui(QWidget *parent = Q_NULLPTR); + ~SearchFullHashGui(); +private Q_SLOTS: + void slotCheckUrl(); + void slotGetResult(WebEngineViewer::SearchFullHashJob::UrlStatus result); + void slotJSonDebug(const QByteArray &debug); +private: + QLineEdit *mCheckHashLineEdit; + QLineEdit *mDataBaseHashLineEdit; + QTextEdit *mJson; + QTextEdit *mResult; +}; + +#endif // CHECKPHISHINGURLGUI_H diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/CMakeLists.txt kf5-messagelib-16.12.3/webengineviewer/src/CMakeLists.txt --- kf5-messagelib-16.04.3/webengineviewer/src/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/CMakeLists.txt 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,224 @@ +add_definitions(-DTRANSLATION_DOMAIN=\"libwebengineviewer\") +include_directories(${WebEngineViewer_BINARY_DIR}/src) + +if(BUILD_TESTING) + add_subdirectory(tests) + add_subdirectory(autotests) + add_subdirectory(webengineaccesskey/autotests) + add_subdirectory(findbar/autotests) + add_subdirectory(checkphishingurl/autotests/) + add_subdirectory(checkphishingurl/tests/) +endif() + +if (Qt5WebEngineWidgets_VERSION VERSION_GREATER "5.7.99") + set(WEBENGINEVIEWER_PRINT_SUPPORT true) +endif() + + +configure_file(../config-webengineviewer.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/../config-webengineviewer.h ) + +set(libwebengineviewer_webengine_SRCS + networkmanager/interceptormanager.cpp + webhittestresult.cpp + webhittest.cpp + webenginepage.cpp + webenginescript.cpp + webengineview.cpp + webenginemanagescript.cpp + webengineprintmessagebox.cpp + webengineexporthtmlpagejob.cpp + webenginenavigationrequestinterceptor.cpp + ) + +set(libwebengineviewer_checkphishingurl_SRCS + checkphishingurl/checkphishingurljob.cpp + checkphishingurl/checkphishingurlcache.cpp + checkphishingurl/createphishingurldatabasejob.cpp + checkphishingurl/checkphishingurlfromlocaldatabasejob.cpp + checkphishingurl/localdatabasemanager.cpp + checkphishingurl/checkphishingurlutil.cpp + checkphishingurl/searchfullhashjob.cpp + checkphishingurl/localdatabasefile.cpp + ) + +set(libwebengineviewer_interceptor_SRCS + urlinterceptor/networkurlinterceptor.cpp + urlinterceptor/networkpluginurlinterceptorinterface.cpp + urlinterceptor/networkurlinterceptorpluginmanager.cpp + urlinterceptor/networkpluginurlinterceptor.cpp + urlinterceptor/networkurlinterceptormanager.cpp + urlinterceptor/networkpluginurlinterceptorconfigurewidget.cpp + ) + +set(libwebengineviewer_accesskey_SRCS + webengineaccesskey/webengineaccesskey.cpp + webengineaccesskey/webengineaccesskeyanchor.cpp + webengineaccesskey/webengineaccesskeyutils.cpp + ) + +set(libwebengineviewer_findbar_SRCS + findbar/findbarbase.cpp + findbar/findbarwebengineview.cpp + ) + +set(libwebengineviewer_widgets_SRCS + widgets/zoomactionmenu.cpp + ) + +set(libwebengineviewer_SRCS + ${libwebengineviewer_checkphishingurl_SRCS} + ${libwebengineviewer_interceptor_SRCS} + ${libwebengineviewer_webengine_SRCS} + ${libwebengineviewer_findbar_SRCS} + ${libwebengineviewer_widgets_SRCS} + ${libwebengineviewer_print_SRCS} + ${libwebengineviewer_accesskey_SRCS} + ) + +qt5_add_resources(libwebengineviewer_webengine_SRCS jquery.qrc) + +ecm_qt_declare_logging_category(libwebengineviewer_webengine_SRCS HEADER webengineviewer_debug.h IDENTIFIER WEBENGINEVIEWER_LOG CATEGORY_NAME org.kde.pim.webengineviewer) + + +add_library(KF5WebEngineViewer ${libwebengineviewer_SRCS} ${libwebengineviewer_webengine_SRCS}) +generate_export_header(KF5WebEngineViewer BASE_NAME webengineviewer) +add_library(KF5::WebEngineViewer ALIAS KF5WebEngineViewer) + +target_include_directories(KF5WebEngineViewer INTERFACE "$") +target_include_directories(KF5WebEngineViewer PUBLIC "$") + +target_link_libraries(KF5WebEngineViewer + PUBLIC + Qt5::WebEngineWidgets + KF5::PimCommon + PRIVATE + KF5::CoreAddons + KF5::XmlGui + KF5::Completion + KF5::I18n + KF5::WidgetsAddons + KF5::ConfigCore + ) + +set_target_properties(KF5WebEngineViewer PROPERTIES + VERSION ${WEBENGINEVIEWER_VERSION_STRING} + SOVERSION ${WEBENGINEVIEWER_SOVERSION} + EXPORT_NAME WebEngineViewer + ) + +install(TARGETS + KF5WebEngineViewer + EXPORT KF5WebEngineViewerTargets ${KF5_INSTALL_TARGETS_DEFAULT_ARGS} ${LIBRARY_NAMELINK} + ) + +ecm_generate_headers(WebEngineViewer_Camelfindbar_HEADERS + HEADER_NAMES + FindBarBase + FindBarWebEngineView + REQUIRED_HEADERS WebEngineViewer_findbar_HEADERS + PREFIX WebEngineViewer + RELATIVE findbar + ) + +ecm_generate_headers(WebEngineViewer_Camelcasewebengine_accesskey_HEADERS + HEADER_NAMES + WebEngineAccessKey + + REQUIRED_HEADERS WebEngineViewer_webengine_accesskey_HEADERS + PREFIX WebEngineViewer + RELATIVE webengineaccesskey + ) +ecm_generate_headers(WebEngineViewer_Camelcasewebengine_urlinterceptor_HEADERS + HEADER_NAMES + NetworkUrlInterceptorPluginManager + NetworkUrlInterceptor + NetworkPluginUrlInterceptorInterface + NetworkPluginUrlInterceptor + NetworkPluginUrlInterceptorConfigureWidget + + REQUIRED_HEADERS WebEngineViewer_webengine_urlinterceptor_HEADERS + PREFIX WebEngineViewer + RELATIVE urlinterceptor + ) +ecm_generate_headers(WebEngineViewer_Camelcasewebengine_manager_HEADERS + HEADER_NAMES + InterceptorManager + REQUIRED_HEADERS WebEngineViewer_webengine_manager_HEADERS + PREFIX WebEngineViewer + RELATIVE networkmanager + ) +ecm_generate_headers(WebEngineViewer_Camelcasewebengine_checkurl_HEADERS + HEADER_NAMES + CheckPhishingUrlJob + CheckPhishingUrlCache + CreatePhishingUrlDataBaseJob + CheckPhishingUrlFromLocalDataBaseJob + LocalDataBaseManager + SearchFullHashJob + REQUIRED_HEADERS WebEngineViewer_webengine_checkurl_HEADERS + PREFIX WebEngineViewer + RELATIVE checkphishingurl + ) +ecm_generate_headers(WebEngineViewer_Camelcasewebengine_misc_HEADERS + HEADER_NAMES + WebHitTestResult + WebEnginePage + WebEngineView + WebHitTest + WebEngineScript + WebEngineManageScript + WebEnginePrintMessageBox + WebEngineExportHtmlPageJob + REQUIRED_HEADERS WebEngineViewer_webengine_misc_HEADERS + PREFIX WebEngineViewer + RELATIVE + ) + +ecm_generate_headers(WebEngineViewer_Camelcasewidgets_HEADERS + HEADER_NAMES + ZoomActionMenu + REQUIRED_HEADERS WebEngineViewer_widgets_HEADERS + PREFIX WebEngineViewer + RELATIVE widgets + ) + + + +ecm_generate_pri_file(BASE_NAME WebEngineViewer + LIB_NAME KF5WebEngineViewer + DEPS "" FILENAME_VAR PRI_FILENAME INCLUDE_INSTALL_DIR ${KDE_INSTALL_INCLUDEDIR_KF5}/WebEngineViewer + ) + + +install(FILES + ${WebEngineViewer_Camelcasewebengine_checkurl_HEADERS} + ${WebEngineViewer_Camelcasewebengine_accesskey_HEADERS} + ${WebEngineViewer_Camelcasewebengine_urlinterceptor_HEADERS} + ${WebEngineViewer_Camelcasewebengine_manager_HEADERS} + ${WebEngineViewer_Camelcasewebengine_misc_HEADERS} + ${WebEngineViewer_Camelfindbar_HEADERS} + ${WebEngineViewer_Camelcasewidgets_HEADERS} + ${WebEngineViewer_Camelprint_HEADERS} + DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/WebEngineViewer + COMPONENT Devel + ) + +install(FILES + ${WebEngineViewer_webengine_checkurl_HEADERS} + ${WebEngineViewer_webengine_accesskey_HEADERS} + ${WebEngineViewer_findbar_HEADERS} + ${WebEngineViewer_webengine_urlinterceptor_HEADERS} + ${WebEngineViewer_webengine_manager_HEADERS} + ${WebEngineViewer_webengine_misc_HEADERS} + ${WebEngineViewer_widgets_HEADERS} + ${WebEngineViewer_print_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/../config-webengineviewer.h + ${CMAKE_CURRENT_BINARY_DIR}/webengineviewer_export.h + DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/webengineviewer + COMPONENT Devel + ) + +install(FILES + ${PRI_FILENAME} + DESTINATION ${ECM_MKSPECS_INSTALL_DIR}) + diff -Nru kf5-messagelib-16.04.3/webengineviewer/src/data/jquery.js kf5-messagelib-16.12.3/webengineviewer/src/data/jquery.js --- kf5-messagelib-16.04.3/webengineviewer/src/data/jquery.js 1970-01-01 00:00:00.000000000 +0000 +++ kf5-messagelib-16.12.3/webengineviewer/src/data/jquery.js 2017-03-06 12:30:37.000000000 +0000 @@ -0,0 +1,4376 @@ +/*! + * jQuery JavaScript Library v1.3.2 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) + * Revision: 6246 + */ +(function(){ + +var + // Will speed up references to window, and allows munging its name. + window = this, + // Will speed up references to undefined, and allows munging its name. + undefined, + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + // Map over the $ in case of overwrite + _$ = window.$, + + jQuery = window.jQuery = window.$ = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context ); + }, + + // A simple way to check for HTML strings or ID strings + // (both of which we optimize for) + quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/, + // Is it a simple selector + isSimple = /^.[^:#\[\.,]*$/; + +jQuery.fn = jQuery.prototype = { + init: function( selector, context ) { + // Make sure that a selection was provided + selector = selector || document; + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this[0] = selector; + this.length = 1; + this.context = selector; + return this; + } + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + var match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) + selector = jQuery.clean( [ match[1] ], context ); + + // HANDLE: $("#id") + else { + var elem = document.getElementById( match[3] ); + + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem && elem.id != match[3] ) + return jQuery().find( selector ); + + // Otherwise, we inject the element directly into the jQuery object + var ret = jQuery( elem || [] ); + ret.context = document; + ret.selector = selector; + return ret; + } + + // HANDLE: $(expr, [context]) + // (which is just equivalent to: $(content).find(expr) + } else + return jQuery( context ).find( selector ); + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) + return jQuery( document ).ready( selector ); + + // Make sure that old selector state is passed along + if ( selector.selector && selector.context ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return this.setArray(jQuery.isArray( selector ) ? + selector : + jQuery.makeArray(selector)); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.3.2", + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num === undefined ? + + // Return a 'clean' array + Array.prototype.slice.call( this ) : + + // Return just the object + this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = jQuery( elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) + ret.selector = this.selector + (this.selector ? " " : "") + selector; + else if ( name ) + ret.selector = this.selector + "." + name + "(" + selector + ")"; + + // Return the newly-formed element set + return ret; + }, + + // Force the current matched set of elements to become + // the specified array of elements (destroying the stack in the process) + // You should use pushStack() in order to do this, but maintain the stack + setArray: function( elems ) { + // Resetting the length to 0, then using the native Array push + // is a super-fast way to populate an object with array-like properties + this.length = 0; + Array.prototype.push.apply( this, elems ); + + return this; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem && elem.jquery ? elem[0] : elem + , this ); + }, + + attr: function( name, value, type ) { + var options = name; + + // Look for the case where we're accessing a style value + if ( typeof name === "string" ) + if ( value === undefined ) + return this[0] && jQuery[ type || "attr" ]( this[0], name ); + + else { + options = {}; + options[ name ] = value; + } + + // Check to see if we're setting style values + return this.each(function(i){ + // Set all the styles + for ( name in options ) + jQuery.attr( + type ? + this.style : + this, + name, jQuery.prop( this, options[ name ], type, i, name ) + ); + }); + }, + + css: function( key, value ) { + // ignore negative width and height values + if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) + value = undefined; + return this.attr( key, value, "curCSS" ); + }, + + text: function( text ) { + if ( typeof text !== "object" && text != null ) + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); + + var ret = ""; + + jQuery.each( text || this, function(){ + jQuery.each( this.childNodes, function(){ + if ( this.nodeType != 8 ) + ret += this.nodeType != 1 ? + this.nodeValue : + jQuery.fn.text( [ this ] ); + }); + }); + + return ret; + }, + + wrapAll: function( html ) { + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).clone(); + + if ( this[0].parentNode ) + wrap.insertBefore( this[0] ); + + wrap.map(function(){ + var elem = this; + + while ( elem.firstChild ) + elem = elem.firstChild; + + return elem; + }).append(this); + } + + return this; + }, + + wrapInner: function( html ) { + return this.each(function(){ + jQuery( this ).contents().wrapAll( html ); + }); + }, + + wrap: function( html ) { + return this.each(function(){ + jQuery( this ).wrapAll( html ); + }); + }, + + append: function() { + return this.domManip(arguments, true, function(elem){ + if (this.nodeType == 1) + this.appendChild( elem ); + }); + }, + + prepend: function() { + return this.domManip(arguments, true, function(elem){ + if (this.nodeType == 1) + this.insertBefore( elem, this.firstChild ); + }); + }, + + before: function() { + return this.domManip(arguments, false, function(elem){ + this.parentNode.insertBefore( elem, this ); + }); + }, + + after: function() { + return this.domManip(arguments, false, function(elem){ + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + }, + + end: function() { + return this.prevObject || jQuery( [] ); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: [].push, + sort: [].sort, + splice: [].splice, + + find: function( selector ) { + if ( this.length === 1 ) { + var ret = this.pushStack( [], "find", selector ); + ret.length = 0; + jQuery.find( selector, this[0], ret ); + return ret; + } else { + return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){ + return jQuery.find( selector, elem ); + })), "find", selector ); + } + }, + + clone: function( events ) { + // Do the clone + var ret = this.map(function(){ + if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { + // IE copies events bound via attachEvent when + // using cloneNode. Calling detachEvent on the + // clone will also remove the events from the orignal + // In order to get around this, we use innerHTML. + // Unfortunately, this means some modifications to + // attributes in IE that are actually only stored + // as properties will not be copied (such as the + // the name attribute on an input). + var html = this.outerHTML; + if ( !html ) { + var div = this.ownerDocument.createElement("div"); + div.appendChild( this.cloneNode(true) ); + html = div.innerHTML; + } + + return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0]; + } else + return this.cloneNode(true); + }); + + // Copy the events from the original to the clone + if ( events === true ) { + var orig = this.find("*").andSelf(), i = 0; + + ret.find("*").andSelf().each(function(){ + if ( this.nodeName !== orig[i].nodeName ) + return; + + var events = jQuery.data( orig[i], "events" ); + + for ( var type in events ) { + for ( var handler in events[ type ] ) { + jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data ); + } + } + + i++; + }); + } + + // Return the cloned set + return ret; + }, + + filter: function( selector ) { + return this.pushStack( + jQuery.isFunction( selector ) && + jQuery.grep(this, function(elem, i){ + return selector.call( elem, i ); + }) || + + jQuery.multiFilter( selector, jQuery.grep(this, function(elem){ + return elem.nodeType === 1; + }) ), "filter", selector ); + }, + + closest: function( selector ) { + var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null, + closer = 0; + + return this.map(function(){ + var cur = this; + while ( cur && cur.ownerDocument ) { + if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) { + jQuery.data(cur, "closest", closer); + return cur; + } + cur = cur.parentNode; + closer++; + } + }); + }, + + not: function( selector ) { + if ( typeof selector === "string" ) + // test special case where just one selector is passed in + if ( isSimple.test( selector ) ) + return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector ); + else + selector = jQuery.multiFilter( selector, this ); + + var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; + return this.filter(function() { + return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; + }); + }, + + add: function( selector ) { + return this.pushStack( jQuery.unique( jQuery.merge( + this.get(), + typeof selector === "string" ? + jQuery( selector ) : + jQuery.makeArray( selector ) + ))); + }, + + is: function( selector ) { + return !!selector && jQuery.multiFilter( selector, this ).length > 0; + }, + + hasClass: function( selector ) { + return !!selector && this.is( "." + selector ); + }, + + val: function( value ) { + if ( value === undefined ) { + var elem = this[0]; + + if ( elem ) { + if( jQuery.nodeName( elem, 'option' ) ) + return (elem.attributes.value || {}).specified ? elem.value : elem.text; + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type == "select-one"; + + // Nothing was selected + if ( index < 0 ) + return null; + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + if ( option.selected ) { + // Get the specifc value for the option + value = jQuery(option).val(); + + // We don't need an array for one selects + if ( one ) + return value; + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + } + + // Everything else, we just grab the value + return (elem.value || "").replace(/\r/g, ""); + + } + + return undefined; + } + + if ( typeof value === "number" ) + value += ''; + + return this.each(function(){ + if ( this.nodeType != 1 ) + return; + + if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) ) + this.checked = (jQuery.inArray(this.value, value) >= 0 || + jQuery.inArray(this.name, value) >= 0); + + else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(value); + + jQuery( "option", this ).each(function(){ + this.selected = (jQuery.inArray( this.value, values ) >= 0 || + jQuery.inArray( this.text, values ) >= 0); + }); + + if ( !values.length ) + this.selectedIndex = -1; + + } else + this.value = value; + }); + }, + + html: function( value ) { + return value === undefined ? + (this[0] ? + this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") : + null) : + this.empty().append( value ); + }, + + replaceWith: function( value ) { + return this.after( value ).remove(); + }, + + eq: function( i ) { + return this.slice( i, +i + 1 ); + }, + + slice: function() { + return this.pushStack( Array.prototype.slice.apply( this, arguments ), + "slice", Array.prototype.slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function(elem, i){ + return callback.call( elem, i, elem ); + })); + }, + + andSelf: function() { + return this.add( this.prevObject ); + }, + + domManip: function( args, table, callback ) { + if ( this[0] ) { + var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(), + scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ), + first = fragment.firstChild; + + if ( first ) + for ( var i = 0, l = this.length; i < l; i++ ) + callback.call( root(this[i], first), this.length > 1 || i > 0 ? + fragment.cloneNode(true) : fragment ); + + if ( scripts ) + jQuery.each( scripts, evalScript ); + } + + return this; + + function root( elem, cur ) { + return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ? + (elem.getElementsByTagName("tbody")[0] || + elem.appendChild(elem.ownerDocument.createElement("tbody"))) : + elem; + } + } +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +function evalScript( i, elem ) { + if ( elem.src ) + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + + else + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); + + if ( elem.parentNode ) + elem.parentNode.removeChild( elem ); +} + +function now(){ + return +new Date; +} + +jQuery.extend = jQuery.fn.extend = function() { + // copy reference to target object + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) + target = {}; + + // extend jQuery itself if only one argument is passed + if ( length == i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) + // Extend the base object + for ( var name in options ) { + var src = target[ name ], copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) + continue; + + // Recurse if we're merging object values + if ( deep && copy && typeof copy === "object" && !copy.nodeType ) + target[ name ] = jQuery.extend( deep, + // Never move original objects, clone them + src || ( copy.length != null ? [ ] : { } ) + , copy ); + + // Don't bring in undefined values + else if ( copy !== undefined ) + target[ name ] = copy; + + } + + // Return the modified object + return target; +}; + +// exclude the following css properties to add px +var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, + // cache defaultView + defaultView = document.defaultView || {}, + toString = Object.prototype.toString; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) + window.jQuery = _jQuery; + + return jQuery; + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return toString.call(obj) === "[object Function]"; + }, + + isArray: function( obj ) { + return toString.call(obj) === "[object Array]"; + }, + + // check if an element is in a (or is an) XML document + isXMLDoc: function( elem ) { + return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || + !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument ); + }, + + // Evalulates a script in a global context + globalEval: function( data ) { + if ( data && /\S/.test(data) ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.getElementsByTagName("head")[0] || document.documentElement, + script = document.createElement("script"); + + script.type = "text/javascript"; + if ( jQuery.support.scriptEval ) + script.appendChild( document.createTextNode( data ) ); + else + script.text = data; + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, length = object.length; + + if ( args ) { + if ( length === undefined ) { + for ( name in object ) + if ( callback.apply( object[ name ], args ) === false ) + break; + } else + for ( ; i < length; ) + if ( callback.apply( object[ i++ ], args ) === false ) + break; + + // A special, fast, case for the most common use of each + } else { + if ( length === undefined ) { + for ( name in object ) + if ( callback.call( object[ name ], name, object[ name ] ) === false ) + break; + } else + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} + } + + return object; + }, + + prop: function( elem, value, type, i, name ) { + // Handle executable functions + if ( jQuery.isFunction( value ) ) + value = value.call( elem, i ); + + // Handle passing in a number to a CSS property + return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ? + value + "px" : + value; + }, + + className: { + // internal only, use addClass("class") + add: function( elem, classNames ) { + jQuery.each((classNames || "").split(/\s+/), function(i, className){ + if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) + elem.className += (elem.className ? " " : "") + className; + }); + }, + + // internal only, use removeClass("class") + remove: function( elem, classNames ) { + if (elem.nodeType == 1) + elem.className = classNames !== undefined ? + jQuery.grep(elem.className.split(/\s+/), function(className){ + return !jQuery.className.has( classNames, className ); + }).join(" ") : + ""; + }, + + // internal only, use hasClass("class") + has: function( elem, className ) { + return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; + } + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}; + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( var name in options ) + elem.style[ name ] = old[ name ]; + }, + + css: function( elem, name, force, extra ) { + if ( name == "width" || name == "height" ) { + var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; + + function getWH() { + val = name == "width" ? elem.offsetWidth : elem.offsetHeight; + + if ( extra === "border" ) + return; + + jQuery.each( which, function() { + if ( !extra ) + val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; + if ( extra === "margin" ) + val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0; + else + val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; + }); + } + + if ( elem.offsetWidth !== 0 ) + getWH(); + else + jQuery.swap( elem, props, getWH ); + + return Math.max(0, Math.round(val)); + } + + return jQuery.curCSS( elem, name, force ); + }, + + curCSS: function( elem, name, force ) { + var ret, style = elem.style; + + // We need to handle opacity special in IE + if ( name == "opacity" && !jQuery.support.opacity ) { + ret = jQuery.attr( style, "opacity" ); + + return ret == "" ? + "1" : + ret; + } + + // Make sure we're using the right name for getting the float value + if ( name.match( /float/i ) ) + name = styleFloat; + + if ( !force && style && style[ name ] ) + ret = style[ name ]; + + else if ( defaultView.getComputedStyle ) { + + // Only "float" is needed here + if ( name.match( /float/i ) ) + name = "float"; + + name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); + + var computedStyle = defaultView.getComputedStyle( elem, null ); + + if ( computedStyle ) + ret = computedStyle.getPropertyValue( name ); + + // We should always get a number back from opacity + if ( name == "opacity" && ret == "" ) + ret = "1"; + + } else if ( elem.currentStyle ) { + var camelCase = name.replace(/\-(\w)/g, function(all, letter){ + return letter.toUpperCase(); + }); + + ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { + // Remember the original values + var left = style.left, rsLeft = elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + elem.runtimeStyle.left = elem.currentStyle.left; + style.left = ret || 0; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + elem.runtimeStyle.left = rsLeft; + } + } + + return ret; + }, + + clean: function( elems, context, fragment ) { + context = context || document; + + // !context.createElement fails in IE with an error but returns typeof 'object' + if ( typeof context.createElement === "undefined" ) + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) { + var match = /^<(\w+)\s*\/?>$/.exec(elems[0]); + if ( match ) + return [ context.createElement( match[1] ) ]; + } + + var ret = [], scripts = [], div = context.createElement("div"); + + jQuery.each(elems, function(i, elem){ + if ( typeof elem === "number" ) + elem += ''; + + if ( !elem ) + return; + + // Convert html string into DOM nodes + if ( typeof elem === "string" ) { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ + return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? + all : + front + ">"; + }); + + // Trim whitespace, otherwise indexOf won't work as expected + var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase(); + + var wrap = + // option or optgroup + !tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && + [ 1, "", "
" ] || + + !tags.indexOf("", "" ] || + + // matched above + (!tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + // IE can't serialize and