Hello community,

here is the log from the commit of package quazip for openSUSE:Factory checked 
in at 2020-05-15 23:51:59
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/quazip (Old)
 and      /work/SRC/openSUSE:Factory/.quazip.new.2738 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "quazip"

Fri May 15 23:51:59 2020 rev:21 rq:805749 version:0.9

Changes:
--------
--- /work/SRC/openSUSE:Factory/quazip/quazip.changes    2019-06-12 
13:16:52.684654424 +0200
+++ /work/SRC/openSUSE:Factory/.quazip.new.2738/quazip.changes  2020-05-15 
23:52:00.561508617 +0200
@@ -1,0 +2,11 @@
+Fri May  8 12:01:20 UTC 2020 - Luigi Baldoni <aloi...@gmx.com>
+
+- Update to version 0.9
+  * Support for extended timestamps
+  * Various contributed CMake fixes
+- Drop quazip-0.8.1_pkgconfig.patch (merged upstream)
+- Add quazip-0.9-pkgconfig.patch
+- Add quazip-0.9-no_static_library.patch
+- Drop Group tag
+
+-------------------------------------------------------------------

Old:
----
  quazip-0.8.1.tar.gz
  quazip-0.8.1_pkgconfig.patch

New:
----
  quazip-0.9-no_static_library.patch
  quazip-0.9-pkgconfig.patch
  quazip-0.9.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ quazip.spec ++++++
--- /var/tmp/diff_new_pack.Vedwg5/_old  2020-05-15 23:52:01.137509727 +0200
+++ /var/tmp/diff_new_pack.Vedwg5/_new  2020-05-15 23:52:01.137509727 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package quazip
 #
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,15 +18,16 @@
 
 %define so_ver 1
 Name:           quazip
-Version:        0.8.1
+Version:        0.9
 Release:        0
 Summary:        C++ wrapper for ZIP/UNZIP
 License:        GPL-2.0-or-later OR LGPL-2.1-or-later
-Group:          Development/Libraries/C and C++
 URL:            https://github.com/stachenov/quazip
 Source:         
https://github.com/stachenov/quazip/archive/v%{version}.tar.gz#/quazip-%{version}.tar.gz
-# PATCH-FEATURE-UPSTREAM quazip-0.8.1_pkgconfig.patch
-Patch0:         quazip-0.8.1_pkgconfig.patch
+# PATCH-FEATURE-UPSTREAM quazip-0.9-pkgconfig.patch aloi...@gmx.com -- add 
subdir to include path
+Patch1:         quazip-0.9-pkgconfig.patch
+# PATCH-FIX-OPENSUSE quazip-0.9-no_static_library.patch aloi...@gmx.com -- do 
not build static library
+Patch2:         quazip-0.9-no_static_library.patch
 BuildRequires:  cmake
 BuildRequires:  doxygen
 BuildRequires:  fdupes
@@ -42,7 +43,6 @@
 
 %package -n libquazip5-%{so_ver}
 Summary:        C++ wrapper for ZIP/UNZIP
-Group:          Development/Libraries/C and C++
 Provides:       libquazip%{so_ver} = %{version}
 Obsoletes:      libquazip%{so_ver} < %{version}
 
@@ -52,7 +52,6 @@
 
 %package        devel
 Summary:        Development files for %{name}
-Group:          Development/Libraries/C and C++
 Requires:       libquazip5-%{so_ver} = %{version}-%{release}
 Requires:       pkgconfig(Qt5Core)
 Provides:       libquazip-qt5-devel = %{version}
@@ -66,7 +65,6 @@
 
 %package doc
 Summary:        Documentation for quazip, a C++ wrapper for ZIP/UNZIP
-Group:          Documentation/HTML
 Provides:       libquazip-qt5-doc = %{version}
 Obsoletes:      libquazip-qt5-doc < %{version}
 Provides:       quazip-qt5-doc = %{version}
@@ -77,12 +75,11 @@
 Useful to access ZIP archives from Qt5 programs.
 
 %prep
-%setup -q -n quazip-%{version}
-%patch0 -p1
+%autosetup -p1 -n quazip-%{version}
 
 %build
 %cmake
-%make_jobs
+%cmake_build
 cd ..
 
 sed -i 's/HTML_TIMESTAMP\s*= YES/HTML_TIMESTAMP=NO/' Doxyfile
@@ -91,7 +88,6 @@
 
 %install
 %cmake_install
-rm %{buildroot}/%{_libdir}/libquazip5.a
 # install docs
 mkdir -pv %{buildroot}%{_defaultdocdir}/quazip-doc
 cp -r doc/html %{buildroot}%{_defaultdocdir}/quazip-doc/
@@ -107,8 +103,8 @@
 
 %files devel
 %license COPYING*
-%{_datadir}/cmake/Modules/FindQuaZip5.cmake
 %{_includedir}/quazip5/
+%{_libdir}/cmake/QuaZip5
 %{_libdir}/libquazip5.so
 %{_libdir}/pkgconfig/quazip.pc
 

++++++ quazip-0.9-no_static_library.patch ++++++
Index: quazip-0.9/quazip/CMakeLists.txt
===================================================================
--- quazip-0.9.orig/quazip/CMakeLists.txt
+++ quazip-0.9/quazip/CMakeLists.txt
@@ -11,26 +11,17 @@ qt_wrap_cpp(MOC_SRCS ${PUBLIC_HEADERS})
 set(SRCS ${SRCS} ${MOC_SRCS})
 
 add_library(${QUAZIP_LIB_TARGET_NAME} SHARED ${SRCS})
-add_library(quazip_static STATIC ${SRCS})
  
-# Windows uses .lib extension for both static and shared library
-# *nix systems use different extensions for SHARED and STATIC library and by 
convention both libraries have the same name
-if (NOT WIN32)
-       set_target_properties(quazip_static PROPERTIES OUTPUT_NAME 
quazip${QUAZIP_LIB_VERSION_SUFFIX})
-endif ()
-
 if(UNIX AND NOT APPLE)
         configure_file( ${CMAKE_SOURCE_DIR}/quazip.pc.cmakein quazip.pc @ONLY)
        install(FILES ${CMAKE_CURRENT_BINARY_DIR}/quazip.pc DESTINATION 
"${CMAKE_INSTALL_LIBDIR}/pkgconfig")
 endif()
 
 target_include_directories(${QUAZIP_LIB_TARGET_NAME} PUBLIC 
${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${ZLIB_INCLUDE_DIRS})
-target_include_directories(quazip_static PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} 
${CMAKE_CURRENT_BINARY_DIR} ${ZLIB_INCLUDE_DIRS})
-set_target_properties(${QUAZIP_LIB_TARGET_NAME} quazip_static PROPERTIES 
VERSION ${QUAZIP_LIB_VERSION} SOVERSION ${QUAZIP_LIB_SOVERSION} DEBUG_POSTFIX d)
+set_target_properties(${QUAZIP_LIB_TARGET_NAME} PROPERTIES VERSION 
${QUAZIP_LIB_VERSION} SOVERSION ${QUAZIP_LIB_SOVERSION} DEBUG_POSTFIX d)
 
 # Link against ZLIB_LIBRARIES if needed (on Windows this variable is empty)
 target_link_libraries(${QUAZIP_LIB_TARGET_NAME} ${QT_QTMAIN_LIBRARY} 
${QTCORE_LIBRARIES} ${ZLIB_LIBRARIES})
-target_link_libraries(quazip_static ${QT_QTMAIN_LIBRARY} ${QTCORE_LIBRARIES} 
${ZLIB_LIBRARIES})
 
 install(FILES ${PUBLIC_HEADERS} DESTINATION 
include/quazip${QUAZIP_LIB_VERSION_SUFFIX})
-install(TARGETS ${QUAZIP_LIB_TARGET_NAME} quazip_static LIBRARY DESTINATION 
${LIB_DESTINATION} ARCHIVE DESTINATION ${LIB_DESTINATION} RUNTIME DESTINATION 
${LIB_DESTINATION})
+install(TARGETS ${QUAZIP_LIB_TARGET_NAME} LIBRARY DESTINATION 
${LIB_DESTINATION} ARCHIVE DESTINATION ${LIB_DESTINATION} RUNTIME DESTINATION 
${LIB_DESTINATION})
++++++ quazip-0.9-pkgconfig.patch ++++++
Index: quazip-0.9/CMakeLists.txt
===================================================================
--- quazip-0.9.orig/CMakeLists.txt
+++ quazip-0.9/CMakeLists.txt
@@ -47,16 +47,9 @@ set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_D
 
 set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)")
 set(LIB_DESTINATION "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" CACHE STRING 
"Library directory name" FORCE)
-set(INSTALL_PKGCONFIG_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/pkgconfig" 
CACHE STRING "Installation directory for pkgconfig (.pc) files" FORCE)
 set(QUAZIP_LIB_TARGET_NAME quazip${QUAZIP_LIB_VERSION_SUFFIX} CACHE
     INTERNAL "Target name of libquazip" FORCE)
 
 add_subdirectory(quazip)
 
-if(UNIX AND NOT APPLE)
-       configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/quazip.pc.cmakein
-                       ${CMAKE_CURRENT_BINARY_DIR}/quazip.pc @ONLY)
-       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/quazip.pc DESTINATION 
"${INSTALL_PKGCONFIG_DIR}")
-endif()
-
 install(FILES QuaZipConfig.cmake DESTINATION 
${LIB_DESTINATION}/cmake/QuaZip${QUAZIP_LIB_VERSION_SUFFIX} RENAME 
QuaZip${QUAZIP_LIB_VERSION_SUFFIX}Config.cmake)
Index: quazip-0.9/quazip.pc.cmakein
===================================================================
--- quazip-0.9.orig/quazip.pc.cmakein
+++ quazip-0.9/quazip.pc.cmakein
@@ -8,5 +8,5 @@ Name: Quazip
 Description: Quazip Library
 Version: @QUAZIP_LIB_VERSION@
 Libs: -lquazip@QUAZIP_LIB_VERSION_SUFFIX@
-Cflags:
+Cflags: -I${includedir}/quazip@QUAZIP_LIB_VERSION_SUFFIX@
 Requires: Qt5Core
Index: quazip-0.9/quazip/CMakeLists.txt
===================================================================
--- quazip-0.9.orig/quazip/CMakeLists.txt
+++ quazip-0.9/quazip/CMakeLists.txt
@@ -19,6 +19,11 @@ if (NOT WIN32)
        set_target_properties(quazip_static PROPERTIES OUTPUT_NAME 
quazip${QUAZIP_LIB_VERSION_SUFFIX})
 endif ()
 
+if(UNIX AND NOT APPLE)
+        configure_file( ${CMAKE_SOURCE_DIR}/quazip.pc.cmakein quazip.pc @ONLY)
+       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/quazip.pc DESTINATION 
"${CMAKE_INSTALL_LIBDIR}/pkgconfig")
+endif()
+
 target_include_directories(${QUAZIP_LIB_TARGET_NAME} PUBLIC 
${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${ZLIB_INCLUDE_DIRS})
 target_include_directories(quazip_static PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} 
${CMAKE_CURRENT_BINARY_DIR} ${ZLIB_INCLUDE_DIRS})
 set_target_properties(${QUAZIP_LIB_TARGET_NAME} quazip_static PROPERTIES 
VERSION ${QUAZIP_LIB_VERSION} SOVERSION ${QUAZIP_LIB_SOVERSION} DEBUG_POSTFIX d)
++++++ quazip-0.8.1.tar.gz -> quazip-0.9.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/CMakeLists.txt 
new/quazip-0.9/CMakeLists.txt
--- old/quazip-0.8.1/CMakeLists.txt     2019-05-27 06:27:44.000000000 +0200
+++ new/quazip-0.9/CMakeLists.txt       2020-04-29 14:11:37.000000000 +0200
@@ -8,7 +8,7 @@
 
 option(BUILD_WITH_QT4 "Build QuaZip with Qt4 no matter if Qt5 was found" OFF)
 
-if( NOT BUILD_WITH_QT4 )
+if(NOT BUILD_WITH_QT4)
     # try Qt5 first, and prefer that if found
     find_package(Qt5Core QUIET)
 endif()
@@ -40,24 +40,23 @@
 endif()
 
 # Use system zlib on unix and Qt ZLIB on Windows
-if(UNIX OR MINGW)
-    find_package(ZLIB REQUIRED)
-else(UNIX OR MINGW)
-    set(ZLIB_INCLUDE_DIRS "${QT_ROOT}/src/3rdparty/zlib" CACHE STRING "Path to 
ZLIB headers of Qt")
-    set(ZLIB_LIBRARIES "")
-    if(NOT EXISTS "${ZLIB_INCLUDE_DIRS}/zlib.h")
-        message("Please specify a valid zlib include dir")
-    endif(NOT EXISTS "${ZLIB_INCLUDE_DIRS}/zlib.h")
-endif(UNIX OR MINGW)
+find_package(ZLIB REQUIRED)
 
 # All build libraries are moved to this directory
 set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})
 
 set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)")
 set(LIB_DESTINATION "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" CACHE STRING 
"Library directory name" FORCE)
+set(INSTALL_PKGCONFIG_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/pkgconfig" 
CACHE STRING "Installation directory for pkgconfig (.pc) files" FORCE)
 set(QUAZIP_LIB_TARGET_NAME quazip${QUAZIP_LIB_VERSION_SUFFIX} CACHE
     INTERNAL "Target name of libquazip" FORCE)
 
 add_subdirectory(quazip)
 
-install(FILES FindQuaZip.cmake RENAME 
FindQuaZip${QUAZIP_LIB_VERSION_SUFFIX}.cmake DESTINATION share/cmake/Modules)
+if(UNIX AND NOT APPLE)
+       configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/quazip.pc.cmakein
+                       ${CMAKE_CURRENT_BINARY_DIR}/quazip.pc @ONLY)
+       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/quazip.pc DESTINATION 
"${INSTALL_PKGCONFIG_DIR}")
+endif()
+
+install(FILES QuaZipConfig.cmake DESTINATION 
${LIB_DESTINATION}/cmake/QuaZip${QUAZIP_LIB_VERSION_SUFFIX} RENAME 
QuaZip${QUAZIP_LIB_VERSION_SUFFIX}Config.cmake)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/Doxyfile new/quazip-0.9/Doxyfile
--- old/quazip-0.8.1/Doxyfile   2019-05-27 06:27:44.000000000 +0200
+++ new/quazip-0.9/Doxyfile     2020-04-29 14:11:37.000000000 +0200
@@ -31,7 +31,7 @@
 # This could be handy for archiving the generated documentation or
 # if some version control system is used.
 
-PROJECT_NUMBER         = quazip-0-7-6
+PROJECT_NUMBER         = quazip-0-9
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/FindQuaZip.cmake 
new/quazip-0.9/FindQuaZip.cmake
--- old/quazip-0.8.1/FindQuaZip.cmake   2019-05-27 06:27:44.000000000 +0200
+++ new/quazip-0.9/FindQuaZip.cmake     1970-01-01 01:00:00.000000000 +0100
@@ -1,43 +0,0 @@
-# QUAZIP_FOUND               - QuaZip library was found
-# QUAZIP_INCLUDE_DIR         - Path to QuaZip include dir
-# QUAZIP_INCLUDE_DIRS        - Path to QuaZip and zlib include dir (combined 
from QUAZIP_INCLUDE_DIR + ZLIB_INCLUDE_DIR)
-# QUAZIP_LIBRARIES           - List of QuaZip libraries
-# QUAZIP_ZLIB_INCLUDE_DIR    - The include dir of zlib headers
-
-
-IF (QUAZIP_INCLUDE_DIRS AND QUAZIP_LIBRARIES)
-       # in cache already
-       SET(QUAZIP_FOUND TRUE)
-ELSE (QUAZIP_INCLUDE_DIRS AND QUAZIP_LIBRARIES)
-    IF (Qt5Core_FOUND)
-        set(QUAZIP_LIB_VERSION_SUFFIX 5)
-    ENDIF()
-       IF (WIN32)
-               FIND_PATH(QUAZIP_LIBRARY_DIR
-                       WIN32_DEBUG_POSTFIX d
-            NAMES libquazip${QUAZIP_LIB_VERSION_SUFFIX}.dll
-                       HINTS "C:/Programme/" "C:/Program Files"
-                       PATH_SUFFIXES QuaZip/lib
-               )
-        FIND_LIBRARY(QUAZIP_LIBRARIES NAMES 
libquazip${QUAZIP_LIB_VERSION_SUFFIX}.dll HINTS ${QUAZIP_LIBRARY_DIR})
-               FIND_PATH(QUAZIP_INCLUDE_DIR NAMES quazip.h HINTS 
${QUAZIP_LIBRARY_DIR}/../ PATH_SUFFIXES include/quazip)
-               FIND_PATH(QUAZIP_ZLIB_INCLUDE_DIR NAMES zlib.h)
-       ELSE(WIN32)
-               FIND_PACKAGE(PkgConfig)
-#     pkg_check_modules(PC_QCA2 QUIET qca2)
-               pkg_check_modules(PC_QUAZIP quazip)
-               FIND_LIBRARY(QUAZIP_LIBRARIES
-                       WIN32_DEBUG_POSTFIX d
-            NAMES quazip${QUAZIP_LIB_VERSION_SUFFIX}
-                       HINTS /usr/lib /usr/lib64
-               )
-               FIND_PATH(QUAZIP_INCLUDE_DIR quazip.h
-                       HINTS /usr/include /usr/local/include
-                       PATH_SUFFIXES quazip${QUAZIP_LIB_VERSION_SUFFIX}
-               )
-               FIND_PATH(QUAZIP_ZLIB_INCLUDE_DIR zlib.h HINTS /usr/include 
/usr/local/include)
-       ENDIF (WIN32)
-       INCLUDE(FindPackageHandleStandardArgs)
-       SET(QUAZIP_INCLUDE_DIRS ${QUAZIP_INCLUDE_DIR} 
${QUAZIP_ZLIB_INCLUDE_DIR})
-       find_package_handle_standard_args(QUAZIP DEFAULT_MSG  QUAZIP_LIBRARIES 
QUAZIP_INCLUDE_DIR QUAZIP_ZLIB_INCLUDE_DIR QUAZIP_INCLUDE_DIRS)
-ENDIF (QUAZIP_INCLUDE_DIRS AND QUAZIP_LIBRARIES)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/NEWS.txt new/quazip-0.9/NEWS.txt
--- old/quazip-0.8.1/NEWS.txt   2019-05-27 06:27:44.000000000 +0200
+++ new/quazip-0.9/NEWS.txt     2020-04-29 14:11:37.000000000 +0200
@@ -1,5 +1,12 @@
 QuaZIP changes
 
+* 2020-04-29 0.9
+        * Support for extended timestamps
+        * Various contributed CMake fixes
+
+* 2019-05-27 0.8.1
+        * CMake regression fix
+
 * 2019-05-23 0.8
         * Support for UTF-8 in file names and comments (Denis Zavorotnyy)
         * get/setOsCode(), get/setDefaultOsCode()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/QuaZipConfig.cmake 
new/quazip-0.9/QuaZipConfig.cmake
--- old/quazip-0.8.1/QuaZipConfig.cmake 1970-01-01 01:00:00.000000000 +0100
+++ new/quazip-0.9/QuaZipConfig.cmake   2020-04-29 14:11:37.000000000 +0200
@@ -0,0 +1,43 @@
+# QUAZIP_FOUND               - QuaZip library was found
+# QUAZIP_INCLUDE_DIR         - Path to QuaZip include dir
+# QUAZIP_INCLUDE_DIRS        - Path to QuaZip and zlib include dir (combined 
from QUAZIP_INCLUDE_DIR + ZLIB_INCLUDE_DIR)
+# QUAZIP_LIBRARIES           - List of QuaZip libraries
+# QUAZIP_ZLIB_INCLUDE_DIR    - The include dir of zlib headers
+
+
+IF (QUAZIP_INCLUDE_DIRS AND QUAZIP_LIBRARIES)
+       # in cache already
+       SET(QUAZIP_FOUND TRUE)
+ELSE (QUAZIP_INCLUDE_DIRS AND QUAZIP_LIBRARIES)
+    IF (Qt5Core_FOUND)
+        set(QUAZIP_LIB_VERSION_SUFFIX 5)
+    ENDIF()
+       IF (WIN32)
+               FIND_PATH(QUAZIP_LIBRARY_DIR
+                       WIN32_DEBUG_POSTFIX d
+            NAMES libquazip${QUAZIP_LIB_VERSION_SUFFIX}.dll
+                       HINTS "C:/Programme/" "C:/Program Files"
+                       PATH_SUFFIXES QuaZip/lib
+               )
+        FIND_LIBRARY(QUAZIP_LIBRARIES NAMES 
libquazip${QUAZIP_LIB_VERSION_SUFFIX}.dll HINTS ${QUAZIP_LIBRARY_DIR})
+               FIND_PATH(QUAZIP_INCLUDE_DIR NAMES quazip.h HINTS 
${QUAZIP_LIBRARY_DIR}/../ PATH_SUFFIXES 
include/quazip${QUAZIP_LIB_VERSION_SUFFIX})
+               FIND_PATH(QUAZIP_ZLIB_INCLUDE_DIR NAMES zlib.h)
+       ELSE(WIN32)
+               FIND_PACKAGE(PkgConfig)
+#     pkg_check_modules(PC_QCA2 QUIET qca2)
+               pkg_check_modules(PC_QUAZIP quazip)
+               FIND_LIBRARY(QUAZIP_LIBRARIES
+                       WIN32_DEBUG_POSTFIX d
+            NAMES quazip${QUAZIP_LIB_VERSION_SUFFIX}
+                       HINTS /usr/lib /usr/lib64
+               )
+               FIND_PATH(QUAZIP_INCLUDE_DIR quazip.h
+                       HINTS /usr/include /usr/local/include
+                       PATH_SUFFIXES quazip${QUAZIP_LIB_VERSION_SUFFIX}
+               )
+               FIND_PATH(QUAZIP_ZLIB_INCLUDE_DIR zlib.h HINTS /usr/include 
/usr/local/include)
+       ENDIF (WIN32)
+       INCLUDE(FindPackageHandleStandardArgs)
+       SET(QUAZIP_INCLUDE_DIRS ${QUAZIP_INCLUDE_DIR} 
${QUAZIP_ZLIB_INCLUDE_DIR})
+       find_package_handle_standard_args(QUAZIP DEFAULT_MSG  QUAZIP_LIBRARIES 
QUAZIP_INCLUDE_DIR QUAZIP_ZLIB_INCLUDE_DIR QUAZIP_INCLUDE_DIRS)
+ENDIF (QUAZIP_INCLUDE_DIRS AND QUAZIP_LIBRARIES)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/CMakeLists.txt 
new/quazip-0.9/quazip/CMakeLists.txt
--- old/quazip-0.8.1/quazip/CMakeLists.txt      2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/quazip/CMakeLists.txt        2020-04-29 14:11:37.000000000 
+0200
@@ -1,13 +1,9 @@
-# set all include directories for in and out of source builds
-include_directories(
-       ${CMAKE_CURRENT_SOURCE_DIR}
-       ${CMAKE_CURRENT_BINARY_DIR}
-       ${ZLIB_INCLUDE_DIRS}
-)
-
 file(GLOB SRCS "*.c" "*.cpp")
 file(GLOB PUBLIC_HEADERS "*.h")
 
+set(QUAZIP_LIB_VERSION 1.0.0)
+set(QUAZIP_LIB_SOVERSION 1)
+
 # Must be added to enable export macro
 ADD_DEFINITIONS(-DQUAZIP_BUILD)
 
@@ -23,7 +19,10 @@
        set_target_properties(quazip_static PROPERTIES OUTPUT_NAME 
quazip${QUAZIP_LIB_VERSION_SUFFIX})
 endif ()
 
-set_target_properties(${QUAZIP_LIB_TARGET_NAME} quazip_static PROPERTIES 
VERSION 1.0.0 SOVERSION 1 DEBUG_POSTFIX d)
+target_include_directories(${QUAZIP_LIB_TARGET_NAME} PUBLIC 
${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${ZLIB_INCLUDE_DIRS})
+target_include_directories(quazip_static PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} 
${CMAKE_CURRENT_BINARY_DIR} ${ZLIB_INCLUDE_DIRS})
+set_target_properties(${QUAZIP_LIB_TARGET_NAME} quazip_static PROPERTIES 
VERSION ${QUAZIP_LIB_VERSION} SOVERSION ${QUAZIP_LIB_SOVERSION} DEBUG_POSTFIX d)
+
 # Link against ZLIB_LIBRARIES if needed (on Windows this variable is empty)
 target_link_libraries(${QUAZIP_LIB_TARGET_NAME} ${QT_QTMAIN_LIBRARY} 
${QTCORE_LIBRARIES} ${ZLIB_LIBRARIES})
 target_link_libraries(quazip_static ${QT_QTMAIN_LIBRARY} ${QTCORE_LIBRARIES} 
${ZLIB_LIBRARIES})
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/JlCompress.cpp 
new/quazip-0.9/quazip/JlCompress.cpp
--- old/quazip-0.8.1/quazip/JlCompress.cpp      2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/quazip/JlCompress.cpp        2020-04-29 14:11:37.000000000 
+0200
@@ -24,7 +24,6 @@
 */
 
 #include "JlCompress.h"
-#include <QDebug>
 
 static bool copyData(QIODevice &inFile, QIODevice &outFile)
 {
@@ -353,12 +352,18 @@
     return extracted;
 }
 
-QStringList JlCompress::extractDir(QString fileCompressed, QString dir) {
+QStringList JlCompress::extractDir(QString fileCompressed, QTextCodec* 
fileNameCodec, QString dir) {
     // Apro lo zip
     QuaZip zip(fileCompressed);
+    if (fileNameCodec)
+        zip.setFileNameCodec(fileNameCodec);
     return extractDir(zip, dir);
 }
 
+QStringList JlCompress::extractDir(QString fileCompressed, QString dir) {
+    return extractDir(fileCompressed, NULL, dir);
+}
+
 QStringList JlCompress::extractDir(QuaZip &zip, const QString &dir)
 {
     if(!zip.open(QuaZip::mdUnzip)) {
@@ -429,12 +434,19 @@
     return lst;
 }
 
-QStringList JlCompress::extractDir(QIODevice *ioDevice, QString dir)
+QStringList JlCompress::extractDir(QIODevice* ioDevice, QTextCodec* 
fileNameCodec, QString dir)
 {
     QuaZip zip(ioDevice);
+    if (fileNameCodec)
+        zip.setFileNameCodec(fileNameCodec);
     return extractDir(zip, dir);
 }
 
+QStringList JlCompress::extractDir(QIODevice *ioDevice, QString dir)
+{
+    return extractDir(ioDevice, NULL, dir);
+}
+
 QStringList JlCompress::getFileList(QIODevice *ioDevice)
 {
     QuaZip *zip = new QuaZip(ioDevice);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/JlCompress.h 
new/quazip-0.9/quazip/JlCompress.h
--- old/quazip-0.8.1/quazip/JlCompress.h        2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/quazip/JlCompress.h  2020-04-29 14:11:37.000000000 +0200
@@ -29,10 +29,11 @@
 #include "quazip.h"
 #include "quazipfile.h"
 #include "quazipfileinfo.h"
-#include <QString>
-#include <QDir>
-#include <QFileInfo>
-#include <QFile>
+#include <QtCore/QString>
+#include <QtCore/QDir>
+#include <QtCore/QFileInfo>
+#include <QtCore/QFile>
+#include <QtCore/QTextCodec>
 
 /// Utility class for typical operations.
 /**
@@ -152,6 +153,15 @@
       \return The list of the full paths of the files extracted, empty on 
failure.
       */
     static QStringList extractDir(QString fileCompressed, QString dir = 
QString());
+    /// Extract a whole archive.
+    /**
+      \param fileCompressed The name of the archive.
+      \param fileNameCodec The codec to use for file names.
+      \param dir The directory to extract to, the current directory if
+      left empty.
+      \return The list of the full paths of the files extracted, empty on 
failure.
+      */
+    static QStringList extractDir(QString fileCompressed, QTextCodec* 
fileNameCodec, QString dir = QString());
     /// Get the file list.
     /**
       \return The list of the files in the archive, or, more precisely, the
@@ -185,6 +195,15 @@
       \return The list of the full paths of the files extracted, empty on 
failure.
       */
     static QStringList extractDir(QIODevice *ioDevice, QString dir = 
QString());
+    /// Extract a whole archive.
+    /**
+      \param ioDevice pointer to device with compressed data.
+      \param fileNameCodec The codec to use for file names.
+      \param dir The directory to extract to, the current directory if
+      left empty.
+      \return The list of the full paths of the files extracted, empty on 
failure.
+      */
+    static QStringList extractDir(QIODevice* ioDevice, QTextCodec* 
fileNameCodec, QString dir = QString());
     /// Get the file list.
     /**
       \return The list of the files in the archive, or, more precisely, the
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/qioapi.cpp 
new/quazip-0.9/quazip/qioapi.cpp
--- old/quazip-0.8.1/quazip/qioapi.cpp  2019-05-27 06:27:44.000000000 +0200
+++ new/quazip-0.9/quazip/qioapi.cpp    2020-04-29 14:11:37.000000000 +0200
@@ -15,12 +15,12 @@
 
 #include "ioapi.h"
 #include "quazip_global.h"
-#include <QIODevice>
+#include <QtCore/QIODevice>
 #if (QT_VERSION >= 0x050100)
 #define QUAZIP_QSAVEFILE_BUG_WORKAROUND
 #endif
 #ifdef QUAZIP_QSAVEFILE_BUG_WORKAROUND
-#include <QSaveFile>
+#include <QtCore/QSaveFile>
 #endif
 
 /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quaadler32.h 
new/quazip-0.9/quazip/quaadler32.h
--- old/quazip-0.8.1/quazip/quaadler32.h        2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/quazip/quaadler32.h  2020-04-29 14:11:37.000000000 +0200
@@ -26,7 +26,7 @@
 see quazip/(un)zip.h files for details. Basically it's the zlib license.
 */
 
-#include <QByteArray>
+#include <QtCore/QByteArray>
 
 #include "quachecksum32.h"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quachecksum32.h 
new/quazip-0.9/quazip/quachecksum32.h
--- old/quazip-0.8.1/quazip/quachecksum32.h     2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/quazip/quachecksum32.h       2020-04-29 14:11:37.000000000 
+0200
@@ -25,7 +25,7 @@
 see quazip/(un)zip.h files for details. Basically it's the zlib license.
 */
 
-#include <QByteArray>
+#include <QtCore/QByteArray>
 #include "quazip_global.h"
 
 /// Checksum interface.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quagzipfile.cpp 
new/quazip-0.9/quazip/quagzipfile.cpp
--- old/quazip-0.8.1/quazip/quagzipfile.cpp     2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/quazip/quagzipfile.cpp       2020-04-29 14:11:37.000000000 
+0200
@@ -22,7 +22,7 @@
 see quazip/(un)zip.h files for details. Basically it's the zlib license.
 */
 
-#include <QFile>
+#include <QtCore/QFile>
 
 #include "quagzipfile.h"
 
@@ -57,13 +57,13 @@
     char modeString[2];
     modeString[0] = modeString[1] = '\0';
     if ((mode & QIODevice::Append) != 0) {
-        error = QuaGzipFile::trUtf8("QIODevice::Append is not "
+        error = QuaGzipFile::tr("QIODevice::Append is not "
                 "supported for GZIP");
         return false;
     }
     if ((mode & QIODevice::ReadOnly) != 0
             && (mode & QIODevice::WriteOnly) != 0) {
-        error = QuaGzipFile::trUtf8("Opening gzip for both reading"
+        error = QuaGzipFile::tr("Opening gzip for both reading"
             " and writing is not supported");
         return false;
     } else if ((mode & QIODevice::ReadOnly) != 0) {
@@ -71,13 +71,13 @@
     } else if ((mode & QIODevice::WriteOnly) != 0) {
         modeString[0] = 'w';
     } else {
-        error = QuaGzipFile::trUtf8("You can open a gzip either for reading"
+        error = QuaGzipFile::tr("You can open a gzip either for reading"
             " or for writing. Which is it?");
         return false;
     }
     gzd = open(id, modeString);
     if (gzd == NULL) {
-        error = QuaGzipFile::trUtf8("Could not gzopen() file");
+        error = QuaGzipFile::tr("Could not gzopen() file");
         return false;
     }
     return true;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quagzipfile.h 
new/quazip-0.9/quazip/quagzipfile.h
--- old/quazip-0.8.1/quazip/quagzipfile.h       2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/quazip/quagzipfile.h 2020-04-29 14:11:37.000000000 +0200
@@ -25,7 +25,7 @@
 see quazip/(un)zip.h files for details. Basically it's the zlib license.
 */
 
-#include <QIODevice>
+#include <QtCore/QIODevice>
 #include "quazip_global.h"
 
 #include <zlib.h>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quaziodevice.cpp 
new/quazip-0.9/quazip/quaziodevice.cpp
--- old/quazip-0.8.1/quazip/quaziodevice.cpp    2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/quazip/quaziodevice.cpp      2020-04-29 14:11:37.000000000 
+0200
@@ -155,11 +155,11 @@
 // #define QUAZIP_ZIODEVICE_DEBUG_OUTPUT
 // #define QUAZIP_ZIODEVICE_DEBUG_INPUT
 #ifdef QUAZIP_ZIODEVICE_DEBUG_OUTPUT
-#include <QFile>
+#include <QtCore/QFile>
 static QFile debug;
 #endif
 #ifdef QUAZIP_ZIODEVICE_DEBUG_INPUT
-#include <QFile>
+#include <QtCore/QFile>
 static QFile indebug;
 #endif
 
@@ -185,12 +185,12 @@
 bool QuaZIODevice::open(QIODevice::OpenMode mode)
 {
     if ((mode & QIODevice::Append) != 0) {
-        setErrorString(trUtf8("QIODevice::Append is not supported for"
+        setErrorString(tr("QIODevice::Append is not supported for"
                     " QuaZIODevice"));
         return false;
     }
     if ((mode & QIODevice::ReadWrite) == QIODevice::ReadWrite) {
-        setErrorString(trUtf8("QIODevice::ReadWrite is not supported for"
+        setErrorString(tr("QIODevice::ReadWrite is not supported for"
                     " QuaZIODevice"));
         return false;
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quaziodevice.h 
new/quazip-0.9/quazip/quaziodevice.h
--- old/quazip-0.8.1/quazip/quaziodevice.h      2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/quazip/quaziodevice.h        2020-04-29 14:11:37.000000000 
+0200
@@ -25,7 +25,7 @@
 see quazip/(un)zip.h files for details. Basically it's the zlib license.
 */
 
-#include <QIODevice>
+#include <QtCore/QIODevice>
 #include "quazip_global.h"
 
 #include <zlib.h>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quazip.cpp 
new/quazip-0.9/quazip/quazip.cpp
--- old/quazip-0.8.1/quazip/quazip.cpp  2019-05-27 06:27:44.000000000 +0200
+++ new/quazip-0.9/quazip/quazip.cpp    2020-04-29 14:11:37.000000000 +0200
@@ -22,9 +22,9 @@
 quazip/(un)zip.h files for details, basically it's zlib license.
  **/
 
-#include <QFile>
-#include <QFlags>
-#include <QHash>
+#include <QtCore/QFile>
+#include <QtCore/QFlags>
+#include <QtCore/QHash>
 
 #include "quazip.h"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quazip.h 
new/quazip-0.9/quazip/quazip.h
--- old/quazip-0.8.1/quazip/quazip.h    2019-05-27 06:27:44.000000000 +0200
+++ new/quazip-0.9/quazip/quazip.h      2020-04-29 14:11:37.000000000 +0200
@@ -25,9 +25,9 @@
 quazip/(un)zip.h files for details, basically it's zlib license.
  **/
 
-#include <QString>
-#include <QStringList>
-#include <QTextCodec>
+#include <QtCore/QString>
+#include <QtCore/QStringList>
+#include <QtCore/QTextCodec>
 
 #include "zip.h"
 #include "unzip.h"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quazip.pro 
new/quazip-0.9/quazip/quazip.pro
--- old/quazip-0.8.1/quazip/quazip.pro  2019-05-27 06:27:44.000000000 +0200
+++ new/quazip-0.9/quazip/quazip.pro    2020-04-29 14:11:37.000000000 +0200
@@ -29,11 +29,15 @@
 # 2.0, VERSION to 2.0.0.
 # And so on.
 
+greaterThan(QT_MAJOR_VERSION, 4) {
+    # disable all the Qt APIs deprecated before Qt 6.0.0
+    DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000
+}
 
 # This one handles dllimport/dllexport directives.
 DEFINES += QUAZIP_BUILD
-DEFINES+=QT_NO_CAST_FROM_ASCII
-DEFINES+=QT_NO_CAST_TO_ASCII
+DEFINES += QT_NO_CAST_FROM_ASCII
+DEFINES += QT_NO_CAST_TO_ASCII
 # You'll need to define this one manually if using a build system other
 # than qmake or using QuaZIP sources directly in your project.
 CONFIG(staticlib): DEFINES += QUAZIP_STATIC
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quazip_global.h 
new/quazip-0.9/quazip/quazip_global.h
--- old/quazip-0.8.1/quazip/quazip_global.h     2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/quazip/quazip_global.h       2020-04-29 14:11:37.000000000 
+0200
@@ -55,5 +55,9 @@
 
 #define QUAZIP_EXTRA_NTFS_MAGIC 0x000Au
 #define QUAZIP_EXTRA_NTFS_TIME_MAGIC 0x0001u
+#define QUAZIP_EXTRA_EXT_TIME_MAGIC 0x5455u
+#define QUAZIP_EXTRA_EXT_MOD_TIME_FLAG 1
+#define QUAZIP_EXTRA_EXT_AC_TIME_FLAG 2
+#define QUAZIP_EXTRA_EXT_CR_TIME_FLAG 4
 
 #endif // QUAZIP_GLOBAL_H
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quazipdir.cpp 
new/quazip-0.9/quazip/quazipdir.cpp
--- old/quazip-0.8.1/quazip/quazipdir.cpp       2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/quazip/quazipdir.cpp 2020-04-29 14:11:37.000000000 +0200
@@ -24,8 +24,8 @@
 
 #include "quazipdir.h"
 
-#include <QSet>
-#include <QSharedData>
+#include <QtCore/QSet>
+#include <QtCore/QSharedData>
 
 /// \cond internal
 class QuaZipDirPrivate: public QSharedData {
@@ -105,7 +105,7 @@
         }
         QStringList path = dirName.split(QLatin1String("/"), 
QString::SkipEmptyParts);
         for (QStringList::const_iterator i = path.constBegin();
-                i != path.end();
+                i != path.constEnd();
                 ++i) {
             const QString &step = *i;
 #ifdef QUAZIP_QUAZIPDIR_DEBUG
@@ -390,7 +390,11 @@
                 == Qt::CaseInsensitive)
             srt |= QDir::IgnoreCase;
         QuaZipDirComparator lessThan(srt);
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0))
+        std::sort(list.begin(), list.end(), lessThan);
+#else
         qSort(list.begin(), list.end(), lessThan);
+#endif
     }
     QuaZipDir_convertInfoList(list, result);
     return true;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quazipdir.h 
new/quazip-0.9/quazip/quazipdir.h
--- old/quazip-0.8.1/quazip/quazipdir.h 2019-05-27 06:27:44.000000000 +0200
+++ new/quazip-0.9/quazip/quazipdir.h   2020-04-29 14:11:37.000000000 +0200
@@ -29,9 +29,9 @@
 
 #include "quazip.h"
 #include "quazipfileinfo.h"
-#include <QDir>
-#include <QList>
-#include <QSharedDataPointer>
+#include <QtCore/QDir>
+#include <QtCore/QList>
+#include <QtCore/QSharedDataPointer>
 
 /// Provides ZIP archive navigation.
 /**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quazipfile.cpp 
new/quazip-0.9/quazip/quazipfile.cpp
--- old/quazip-0.8.1/quazip/quazipfile.cpp      2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/quazip/quazipfile.cpp        2020-04-29 14:11:37.000000000 
+0200
@@ -24,6 +24,8 @@
 
 #include "quazipfile.h"
 
+#include "quazipfileinfo.h"
+
 using namespace std;
 
 #define QUAZIP_VERSION_MADE_BY 0x1Eu
@@ -539,3 +541,30 @@
 {
     return size() - pos();
 }
+
+QByteArray QuaZipFile::getLocalExtraField()
+{
+    int size = unzGetLocalExtrafield(p->zip->getUnzFile(), NULL, 0);
+    QByteArray extra(size, '\0');
+    int err = unzGetLocalExtrafield(p->zip->getUnzFile(), extra.data(), 
static_cast<uint>(extra.size()));
+    if (err < 0) {
+        p->setZipError(err);
+        return QByteArray();
+    }
+    return extra;
+}
+
+QDateTime QuaZipFile::getExtModTime()
+{
+    return QuaZipFileInfo64::getExtTime(getLocalExtraField(), 
QUAZIP_EXTRA_EXT_MOD_TIME_FLAG);
+}
+
+QDateTime QuaZipFile::getExtAcTime()
+{
+    return QuaZipFileInfo64::getExtTime(getLocalExtraField(), 
QUAZIP_EXTRA_EXT_AC_TIME_FLAG);
+}
+
+QDateTime QuaZipFile::getExtCrTime()
+{
+    return QuaZipFileInfo64::getExtTime(getLocalExtraField(), 
QUAZIP_EXTRA_EXT_CR_TIME_FLAG);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quazipfile.h 
new/quazip-0.9/quazip/quazipfile.h
--- old/quazip-0.8.1/quazip/quazipfile.h        2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/quazip/quazipfile.h  2020-04-29 14:11:37.000000000 +0200
@@ -25,7 +25,7 @@
 quazip/(un)zip.h files for details, basically it's zlib license.
  **/
 
-#include <QIODevice>
+#include <QtCore/QIODevice>
 
 #include "quazip_global.h"
 #include "quazip.h"
@@ -451,6 +451,58 @@
     int getZipError() const;
     /// Returns the number of bytes available for reading.
     virtual qint64 bytesAvailable() const;
+    /// Returns the local extra field
+    /**
+      There are two (optional) local extra fields associated with a file.
+      One is located in the central header and is available along
+      with the rest of the file information in @ref QuaZipFileInfo64::extra.
+      Another is located before the file itself,
+      and is returned by this function. The file must be open first.
+
+      @return the local extra field, or an empty array if there is none
+        (or file is not open)
+      */
+    QByteArray getLocalExtraField();
+    /// Returns the extended modification timestamp
+    /**
+    * The getExt*Time() functions only work if there is an extended timestamp
+    * extra field (ID 0x5455) present. Otherwise, they all return invalid null
+    * timestamps.
+    *
+    * Modification time, but not other times, can also be accessed through
+    * @ref QuaZipFileInfo64 without the need to open the file first.
+    *
+    * @sa dateTime
+    * @sa QuaZipFileInfo64::getExtModTime()
+    * @sa getExtAcTime()
+    * @sa getExtCrTime()
+    * @return The extended modification time, UTC
+    */
+    QDateTime getExtModTime();
+    /// Returns the extended access timestamp
+    /**
+    * The getExt*Time() functions only work if there is an extended timestamp
+    * extra field (ID 0x5455) present. Otherwise, they all return invalid null
+    * timestamps.
+    * @sa dateTime
+    * @sa QuaZipFileInfo64::getExtModTime()
+    * @sa getExtModTime()
+    * @sa getExtCrTime()
+    * @return The extended access time, UTC
+    */
+    QDateTime getExtAcTime();
+    /// Returns the extended creation timestamp
+    /**
+    * The getExt*Time() functions only work if there is an extended timestamp
+    * extra field (ID 0x5455) present. Otherwise, they all return invalid null
+    * timestamps.
+    * @sa dateTime
+    * @sa QuaZipFileInfo64::getExtModTime()
+    * @sa getExtModTime()
+    * @sa getExtAcTime()
+    * @return The extended creation time, UTC
+    */
+    QDateTime getExtCrTime();
 };
 
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quazipfileinfo.cpp 
new/quazip-0.9/quazip/quazipfileinfo.cpp
--- old/quazip-0.8.1/quazip/quazipfileinfo.cpp  2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/quazip/quazipfileinfo.cpp    2020-04-29 14:11:37.000000000 
+0200
@@ -24,6 +24,8 @@
 
 #include "quazipfileinfo.h"
 
+#include <QtCore/QDataStream>
+
 static QFile::Permissions permissionsFromExternalAttr(quint32 externalAttr) {
     quint32 uPerm = (externalAttr & 0xFFFF0000u) >> 16;
     QFile::Permissions perm = 0;
@@ -93,69 +95,30 @@
                              int *fineTicks)
 {
     QDateTime dateTime;
-    for (int i = 0; i <= extra.size() - 4; ) {
-        unsigned type = static_cast<unsigned>(static_cast<unsigned char>(
-                                                  extra.at(i)))
-                | (static_cast<unsigned>(static_cast<unsigned char>(
-                                                  extra.at(i + 1))) << 8);
-        i += 2;
-        unsigned length = static_cast<unsigned>(static_cast<unsigned char>(
-                                                  extra.at(i)))
-                | (static_cast<unsigned>(static_cast<unsigned char>(
-                                                  extra.at(i + 1))) << 8);
-        i += 2;
-        if (type == QUAZIP_EXTRA_NTFS_MAGIC && length >= 32) {
-            i += 4; // reserved
-            while (i <= extra.size() - 4) {
-                unsigned tag = static_cast<unsigned>(
-                            static_cast<unsigned char>(extra.at(i)))
-                        | (static_cast<unsigned>(
-                               static_cast<unsigned char>(extra.at(i + 1)))
-                           << 8);
-                i += 2;
-                int tagsize = static_cast<unsigned>(
-                            static_cast<unsigned char>(extra.at(i)))
-                        | (static_cast<unsigned>(
-                               static_cast<unsigned char>(extra.at(i + 1)))
-                           << 8);
-                i += 2;
-                if (tag == QUAZIP_EXTRA_NTFS_TIME_MAGIC
-                        && tagsize >= position + 8) {
-                    i += position;
-                    quint64 mtime = static_cast<quint64>(
-                                static_cast<unsigned char>(extra.at(i)))
-                        | (static_cast<quint64>(static_cast<unsigned char>(
-                                                 extra.at(i + 1))) << 8)
-                        | (static_cast<quint64>(static_cast<unsigned char>(
-                                                 extra.at(i + 2))) << 16)
-                        | (static_cast<quint64>(static_cast<unsigned char>(
-                                                 extra.at(i + 3))) << 24)
-                        | (static_cast<quint64>(static_cast<unsigned char>(
-                                                 extra.at(i + 4))) << 32)
-                        | (static_cast<quint64>(static_cast<unsigned char>(
-                                                 extra.at(i + 5))) << 40)
-                        | (static_cast<quint64>(static_cast<unsigned char>(
-                                                 extra.at(i + 6))) << 48)
-                        | (static_cast<quint64>(static_cast<unsigned char>(
-                                                 extra.at(i + 7))) << 56);
-                    // the NTFS time is measured from 1601 for whatever reason
-                    QDateTime base(QDate(1601, 1, 1), QTime(0, 0), Qt::UTC);
-                    dateTime = base.addMSecs(mtime / 10000);
-                    if (fineTicks != NULL) {
-                        *fineTicks = static_cast<int>(mtime % 10000);
-                    }
-                    i += tagsize - position;
-                } else {
-                    i += tagsize;
-                }
-
-            }
-        } else {
-            i += length;
-        }
-    }
-    if (fineTicks != NULL && dateTime.isNull()) {
-        *fineTicks = 0;
+    QuaExtraFieldHash extraHash = QuaZipFileInfo64::parseExtraField(extra);
+    QList<QByteArray> ntfsExtraFields = extraHash[QUAZIP_EXTRA_NTFS_MAGIC];
+    if (ntfsExtraFields.isEmpty())
+        return dateTime;
+    QByteArray ntfsExtraField = ntfsExtraFields.at(0);
+    if (ntfsExtraField.length() <= 4)
+        return dateTime;
+    QByteArray ntfsAttributes = ntfsExtraField.mid(4);
+    QuaExtraFieldHash ntfsHash = 
QuaZipFileInfo64::parseExtraField(ntfsAttributes);
+    QList<QByteArray> ntfsTimeAttributes = 
ntfsHash[QUAZIP_EXTRA_NTFS_TIME_MAGIC];
+    if (ntfsTimeAttributes.isEmpty())
+        return dateTime;
+    QByteArray ntfsTimes = ntfsTimeAttributes.at(0);
+    if (ntfsTimes.size() < 24)
+        return dateTime;
+    QDataStream timeReader(ntfsTimes);
+    timeReader.setByteOrder(QDataStream::LittleEndian);
+    timeReader.device()->seek(position);
+    quint64 time;
+    timeReader >> time;
+    QDateTime base(QDate(1601, 1, 1), QTime(0, 0), Qt::UTC);
+    dateTime = base.addMSecs(time / 10000);
+    if (fineTicks != NULL) {
+        *fineTicks = static_cast<int>(time % 10000);
     }
     return dateTime;
 }
@@ -174,3 +137,60 @@
 {
     return getNTFSTime(extra, 16, fineTicks);
 }
+
+QDateTime QuaZipFileInfo64::getExtTime(const QByteArray &extra, int flag)
+{
+    QDateTime dateTime;
+    QuaExtraFieldHash extraHash = QuaZipFileInfo64::parseExtraField(extra);
+    QList<QByteArray> extTimeFields = extraHash[QUAZIP_EXTRA_EXT_TIME_MAGIC];
+    if (extTimeFields.isEmpty())
+        return dateTime;
+    QByteArray extTimeField = extTimeFields.at(0);
+    if (extTimeField.length() < 1)
+        return dateTime;
+    QDataStream input(extTimeField);
+    input.setByteOrder(QDataStream::LittleEndian);
+    quint8 flags;
+    input >> flags;
+    int flagsRemaining = flags;
+    while (!input.atEnd()) {
+        int nextFlag = flagsRemaining & -flagsRemaining;
+        flagsRemaining &= flagsRemaining - 1;
+        qint32 time;
+        input >> time;
+        if (nextFlag == flag) {
+            QDateTime base(QDate(1970, 1, 1), QTime(0, 0), Qt::UTC);
+            dateTime = base.addSecs(time);
+            return dateTime;
+        }
+    }
+    return dateTime;
+}
+
+QDateTime QuaZipFileInfo64::getExtModTime() const
+{
+    return getExtTime(extra, 1);
+}
+
+QuaExtraFieldHash QuaZipFileInfo64::parseExtraField(const QByteArray 
&extraField)
+{
+    QDataStream input(extraField);
+    input.setByteOrder(QDataStream::LittleEndian);
+    QHash<quint16, QList<QByteArray> > result;
+    while (!input.atEnd()) {
+        quint16 id, size;
+        input >> id;
+        if (input.status() == QDataStream::ReadPastEnd)
+            return result;
+        input >> size;
+        if (input.status() == QDataStream::ReadPastEnd)
+            return result;
+        QByteArray data;
+        data.resize(size);
+        int read = input.readRawData(data.data(), data.size());
+        if (read < data.size())
+            return result;
+        result[id] << data;
+    }
+    return result;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quazipfileinfo.h 
new/quazip-0.9/quazip/quazipfileinfo.h
--- old/quazip-0.8.1/quazip/quazipfileinfo.h    2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/quazip/quazipfileinfo.h      2020-04-29 14:11:37.000000000 
+0200
@@ -25,12 +25,16 @@
 see quazip/(un)zip.h files for details. Basically it's the zlib license.
 */
 
-#include <QByteArray>
-#include <QDateTime>
-#include <QFile>
+#include <QtCore/QByteArray>
+#include <QtCore/QDateTime>
+#include <QtCore/QFile>
+#include <QtCore/QHash>
 
 #include "quazip_global.h"
 
+/// The typedef to store extra field parse results
+typedef QHash<quint16, QList<QByteArray> > QuaExtraFieldHash;
+
 /// Information about a file inside archive.
 /**
  * \deprecated Use QuaZipFileInfo64 instead. Not only it supports large files,
@@ -171,8 +175,52 @@
    * @return The NTFS creation time, UTC
    */
   QDateTime getNTFScTime(int *fineTicks = NULL) const;
+  /// Returns the extended modification timestamp
+  /**
+   * The getExt*Time() functions only work if there is an extended timestamp
+   * extra field (ID 0x5455) present. Otherwise, they all return invalid null
+   * timestamps.
+   *
+   * QuaZipFileInfo64 only contains the modification time because it's 
extracted
+   * from @ref extra, which contains the global extra field, and access and
+   * creation time are in the local header which can be accessed through
+   * @ref QuaZipFile.
+   *
+   * @sa dateTime
+   * @sa QuaZipFile::getExtModTime()
+   * @sa QuaZipFile::getExtAcTime()
+   * @sa QuaZipFile::getExtCrTime()
+   * @return The extended modification time, UTC
+   */
+  QDateTime getExtModTime() const;
   /// Checks whether the file is encrypted.
   bool isEncrypted() const {return (flags & 1) != 0;}
+  /// Parses extra field
+  /**
+   * The returned hash table contains a list of data blocks for every header ID
+   * in the provided extra field. The number of data blocks in a hash table 
value
+   * equals to the number of occurrences of the appropriate header id. In most 
cases,
+   * a block with a specific header ID only occurs once, and therefore the 
returned
+   * hash table will contain a list consisting of a single element for that 
header ID.
+   *
+   * @param extraField extra field to parse
+   * @return header id to list of data block hash
+   */
+  static QuaExtraFieldHash parseExtraField(const QByteArray &extraField);
+  /// Extracts extended time from the extra field
+  /**
+   * Utility function used by various getExt*Time() functions, but can be used 
directly
+   * if the extra field is obtained elsewhere (from a third party library, for 
example).
+   *
+   * @param extra the extra field for a file
+   * @param flag 1 - modification time, 2 - access time, 4 - creation time
+   * @return the extracted time or null QDateTime if not present
+   * @sa getExtModTime()
+   * @sa QuaZipFile::getExtModTime()
+   * @sa QuaZipFile::getExtAcTime()
+   * @sa QuaZipFile::getExtCrTime()
+   */
+  static QDateTime getExtTime(const QByteArray &extra, int flag);
 };
 
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quazipnewinfo.cpp 
new/quazip-0.9/quazip/quazipnewinfo.cpp
--- old/quazip-0.8.1/quazip/quazipnewinfo.cpp   2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/quazip/quazipnewinfo.cpp     2020-04-29 14:11:37.000000000 
+0200
@@ -22,7 +22,7 @@
 see quazip/(un)zip.h files for details. Basically it's the zlib license.
 */
 
-#include <QFileInfo>
+#include <QtCore/QFileInfo>
 
 #include "quazipnewinfo.h"
 
@@ -134,7 +134,11 @@
     }
     setFileNTFSmTime(fi.lastModified());
     setFileNTFSaTime(fi.lastRead());
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
+    setFileNTFScTime(fi.birthTime());
+#else
     setFileNTFScTime(fi.created());
+#endif
 }
 
 static void setNTFSTime(QByteArray &extra, const QDateTime &time, int position,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/quazipnewinfo.h 
new/quazip-0.9/quazip/quazipnewinfo.h
--- old/quazip-0.8.1/quazip/quazipnewinfo.h     2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/quazip/quazipnewinfo.h       2020-04-29 14:11:37.000000000 
+0200
@@ -25,9 +25,9 @@
 quazip/(un)zip.h files for details, basically it's zlib license.
  **/
 
-#include <QDateTime>
-#include <QFile>
-#include <QString>
+#include <QtCore/QDateTime>
+#include <QtCore/QFile>
+#include <QtCore/QString>
 
 #include "quazip_global.h"
 
@@ -148,8 +148,9 @@
   /**
    * If the file doesn't exist, a warning is printed to the stderr and nothing
    * is done. Otherwise, all three times, as reported by
-   * QFileInfo::lastModified(), QFileInfo::lastRead() and QFileInfo::created(),
-   * are written to the NTFS extra field record.
+   * QFileInfo::lastModified(), QFileInfo::lastRead() and
+   * QFileInfo::birthTime() (>=Qt5.10) or QFileInfo::created(), are written to
+   * the NTFS extra field record.
    *
    * The NTFS record is written to
    * both the local and the global extra fields, updating the existing record
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip/zip.c new/quazip-0.9/quazip/zip.c
--- old/quazip-0.8.1/quazip/zip.c       2019-05-27 06:27:44.000000000 +0200
+++ new/quazip-0.9/quazip/zip.c 2020-04-29 14:11:37.000000000 +0200
@@ -1742,7 +1742,7 @@
     if (err==ZIP_OK)
         err = add_data_in_datablock(&zi->central_dir, zi->ci.central_header, 
(uLong)zi->ci.size_centralheader);
 
-    free(zi->ci.central_header);
+    TRYFREE(zi->ci.central_header);
 
     if (err==ZIP_OK)
     {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/quazip.pc.cmakein 
new/quazip-0.9/quazip.pc.cmakein
--- old/quazip-0.8.1/quazip.pc.cmakein  1970-01-01 01:00:00.000000000 +0100
+++ new/quazip-0.9/quazip.pc.cmakein    2020-04-29 14:11:37.000000000 +0200
@@ -0,0 +1,12 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=${prefix}
+libdir=${prefix}/lib@LIB_SUFFIX@
+includedir=${prefix}/include
+
+
+Name: Quazip
+Description: Quazip Library
+Version: @QUAZIP_LIB_VERSION@
+Libs: -lquazip@QUAZIP_LIB_VERSION_SUFFIX@
+Cflags:
+Requires: Qt5Core
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/qztest/qztest.pro 
new/quazip-0.9/qztest/qztest.pro
--- old/quazip-0.8.1/qztest/qztest.pro  2019-05-27 06:27:44.000000000 +0200
+++ new/quazip-0.9/qztest/qztest.pro    2020-04-29 14:11:37.000000000 +0200
@@ -12,6 +12,11 @@
     DEFINES += NOMINMAX
 }
 
+greaterThan(QT_MAJOR_VERSION, 4) {
+    # disable all the Qt APIs deprecated before Qt 6.0.0
+    DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000
+}
+
 CONFIG(staticlib): DEFINES += QUAZIP_STATIC
 
 # Input
@@ -47,3 +52,6 @@
 
 INCLUDEPATH += $$PWD/..
 DEPENDPATH += $$PWD/../quazip
+
+RESOURCES += \
+    qztest.qrc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/qztest/qztest.qrc 
new/quazip-0.9/qztest/qztest.qrc
--- old/quazip-0.8.1/qztest/qztest.qrc  1970-01-01 01:00:00.000000000 +0100
+++ new/quazip-0.9/qztest/qztest.qrc    2020-04-29 14:11:37.000000000 +0200
@@ -0,0 +1,5 @@
+<RCC>
+    <qresource prefix="/">
+        <file>test_files/issue43_cant_get_dates.zip</file>
+    </qresource>
+</RCC>
Binary files old/quazip-0.8.1/qztest/test_files/issue43_cant_get_dates.zip and 
new/quazip-0.9/qztest/test_files/issue43_cant_get_dates.zip differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/qztest/testjlcompress.cpp 
new/quazip-0.9/qztest/testjlcompress.cpp
--- old/quazip-0.8.1/qztest/testjlcompress.cpp  2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/qztest/testjlcompress.cpp    2020-04-29 14:11:37.000000000 
+0200
@@ -28,6 +28,7 @@
 
 #include <QDir>
 #include <QFileInfo>
+#include <QTextCodec>
 
 #include <QtTest/QtTest>
 
@@ -154,8 +155,8 @@
     QVERIFY(JlCompress::compressDir(zipName, "compressDir_tmp", true, 
QDir::Hidden));
     // get the file list and check it
     QStringList fileList = JlCompress::getFileList(zipName);
-    qSort(fileList);
-    qSort(expected);
+    fileList.sort();
+    expected.sort();
     QCOMPARE(fileList, expected);
     removeTestFiles(fileNames, "compressDir_tmp");
     curDir.remove(zipName);
@@ -303,17 +304,29 @@
     QTest::addColumn<QString>("zipName");
     QTest::addColumn<QStringList>("fileNames");
     QTest::addColumn<QStringList>("expectedExtracted");
+    QTest::addColumn<QByteArray>("fileNameCodecName");
     QTest::newRow("simple") << "jlextdir.zip"
         << (QStringList() << "test0.txt" << "testdir1/test1.txt"
             << "testdir2/test2.txt" << "testdir2/subdir/test2sub.txt")
         << (QStringList() << "test0.txt" << "testdir1/test1.txt"
-            << "testdir2/test2.txt" << "testdir2/subdir/test2sub.txt");
+            << "testdir2/test2.txt" << "testdir2/subdir/test2sub.txt")
+        << QByteArray();
     QTest::newRow("separate dir") << "sepdir.zip"
         << (QStringList() << "laj/" << "laj/lajfile.txt")
-        << (QStringList() << "laj/" << "laj/lajfile.txt");
+        << (QStringList() << "laj/" << "laj/lajfile.txt")
+        << QByteArray();
     QTest::newRow("Zip Slip") << "zipslip.zip"
         << (QStringList() << "test0.txt" << "../zipslip.txt")
-        << (QStringList() << "test0.txt");
+        << (QStringList() << "test0.txt")
+        << QByteArray();
+    QTest::newRow("Cyrillic") << "cyrillic.zip"
+        << (QStringList() << QString::fromUtf8("Ще не вмерла Україна"))
+        << (QStringList() << QString::fromUtf8("Ще не вмерла Україна"))
+        << QByteArray("KOI8-U");
+    QTest::newRow("Japaneses") << "japanese.zip"
+        << (QStringList() << QString::fromUtf8("日本"))
+        << (QStringList() << QString::fromUtf8("日本"))
+        << QByteArray("UTF-8");
 }
 
 void TestJlCompress::extractDir()
@@ -321,6 +334,10 @@
     QFETCH(QString, zipName);
     QFETCH(QStringList, fileNames);
     QFETCH(QStringList, expectedExtracted);
+    QFETCH(QByteArray, fileNameCodecName);
+    QTextCodec *fileNameCodec = NULL;
+    if (!fileNameCodecName.isEmpty())
+        fileNameCodec = QTextCodec::codecForName(fileNameCodecName);
     QDir curDir;
     if (!curDir.mkpath("jlext/jldir")) {
         QFAIL("Couldn't mkpath jlext/jldir");
@@ -328,12 +345,15 @@
     if (!createTestFiles(fileNames)) {
         QFAIL("Couldn't create test files");
     }
-    if (!createTestArchive(zipName, fileNames)) {
+    if (!createTestArchive(zipName, fileNames, fileNameCodec)) {
         QFAIL("Couldn't create test archive");
     }
     QStringList extracted;
-    QCOMPARE((extracted = JlCompress::extractDir(zipName, "jlext/jldir"))
-        .count(), expectedExtracted.count());
+    if (fileNameCodec == NULL)
+        extracted = JlCompress::extractDir(zipName, "jlext/jldir");
+    else // test both overloads here
+        extracted = JlCompress::extractDir(zipName, fileNameCodec, 
"jlext/jldir");
+    QCOMPARE(extracted.count(), expectedExtracted.count());
     const QString dir = "jlext/jldir/";
     foreach (QString fileName, expectedExtracted) {
         QString fullName = dir + fileName;
@@ -352,8 +372,11 @@
     // now test the QIODevice* overload
     QFile zipFile(zipName);
     QVERIFY(zipFile.open(QIODevice::ReadOnly));
-    QCOMPARE((extracted = JlCompress::extractDir(&zipFile, "jlext/jldir"))
-        .count(), expectedExtracted.count());
+    if (fileNameCodec == NULL)
+        extracted = JlCompress::extractDir(&zipFile, "jlext/jldir");
+    else // test both overloads here
+        extracted = JlCompress::extractDir(&zipFile, fileNameCodec, 
"jlext/jldir");
+    QCOMPARE(extracted.count(), expectedExtracted.count());
     foreach (QString fileName, expectedExtracted) {
         QString fullName = dir + fileName;
         QFileInfo fileInfo(fullName);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/qztest/testquazip.cpp 
new/quazip-0.9/qztest/testquazip.cpp
--- old/quazip-0.8.1/qztest/testquazip.cpp      2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/qztest/testquazip.cpp        2020-04-29 14:11:37.000000000 
+0200
@@ -62,7 +62,7 @@
 {
     QFETCH(QString, zipName);
     QFETCH(QStringList, fileNames);
-    qSort(fileNames);
+    fileNames.sort();
     QDir curDir;
     if (curDir.exists(zipName)) {
         if (!curDir.remove(zipName))
@@ -79,7 +79,7 @@
     QVERIFY(testZip.goToFirstFile());
     QString firstFile = testZip.getCurrentFileName();
     QStringList fileList = testZip.getFileNameList();
-    qSort(fileList);
+    fileList.sort();
     QCOMPARE(fileList, fileNames);
     QHash<QString, QFileInfo> srcInfo;
     foreach (QString fileName, fileNames) {
@@ -178,7 +178,7 @@
     QFETCH(QString, zipName);
     QFETCH(QStringList, fileNames);
     QFETCH(QByteArray, encoding);
-    qSort(fileNames);
+    fileNames.sort();
     QDir curDir;
     if (curDir.exists(zipName)) {
         if (!curDir.remove(zipName))
@@ -194,13 +194,13 @@
     QuaZip testZip(zipName);
     QVERIFY(testZip.open(QuaZip::mdUnzip));
     QStringList fileList = testZip.getFileNameList();
-    qSort(fileList);
+    fileList.sort();
     QVERIFY(fileList[0] != fileNames[0]);
     testZip.close();
     testZip.setFileNameCodec(encoding);
     QVERIFY(testZip.open(QuaZip::mdUnzip));
     fileList = testZip.getFileNameList();
-    qSort(fileList);
+    fileList.sort();
     QCOMPARE(fileList, fileNames);
     testZip.close();
     // clean up
@@ -233,7 +233,7 @@
     checkZip.goToFirstFile();
     QuaZipFileInfo64 fi;
     QVERIFY(checkZip.getCurrentFileInfo(&fi));
-    QCOMPARE(fi.versionCreated >> 8, static_cast<quint16>(osCode));
+    QCOMPARE(static_cast<uint>(fi.versionCreated) >> 8, osCode);
 }
 
 void TestQuaZip::setDataDescriptorWritingEnabled()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/qztest/testquazipfile.cpp 
new/quazip-0.9/qztest/testquazipfile.cpp
--- old/quazip-0.8.1/qztest/testquazipfile.cpp  2019-05-27 06:27:44.000000000 
+0200
+++ new/quazip-0.9/qztest/testquazipfile.cpp    2020-04-29 14:11:37.000000000 
+0200
@@ -466,9 +466,13 @@
                 QFile::WriteOther | QFile::ReadOther | QFile::ExeOther;
         QCOMPARE(info.getPermissions() & usedPermissions,
                  srcInfo.permissions() & usedPermissions);
-        // I really hope Qt 6 will use quint64 for time_t!
+#if QT_VERSION >= QT_VERSION_CHECK(5, 8, 0) // Yay! Finally a way to get time 
as qint64!
+        qint64 newTime = info.dateTime.toSecsSinceEpoch();
+        qint64 oldTime = srcInfo.lastModified().toSecsSinceEpoch();
+#else
         quint64 newTime = info.dateTime.toTime_t();
         quint64 oldTime = srcInfo.lastModified().toTime_t();
+#endif
         // ZIP uses weird format with 2 second precision
         QCOMPARE(newTime / 2, oldTime / 2);
         readFileAttrs.close();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/qztest/testquazipfileinfo.cpp 
new/quazip-0.9/qztest/testquazipfileinfo.cpp
--- old/quazip-0.8.1/qztest/testquazipfileinfo.cpp      2019-05-27 
06:27:44.000000000 +0200
+++ new/quazip-0.9/qztest/testquazipfileinfo.cpp        2020-04-29 
14:11:37.000000000 +0200
@@ -5,6 +5,7 @@
 #include <QByteArray>
 #include <QDir>
 #include <QFileInfo>
+#include <QPair>
 
 #include <QtTest/QtTest>
 
@@ -13,6 +14,11 @@
 #include "quazip/quazipfileinfo.h"
 #include "quazip/quazipnewinfo.h"
 
+#if QT_VERSION < 0x050000
+Q_DECLARE_METATYPE(QList<qint32>);
+Q_DECLARE_METATYPE(QuaExtraFieldHash);
+#endif
+
 TestQuaZipFileInfo::TestQuaZipFileInfo(QObject *parent) :
     QObject(parent)
 {
@@ -41,7 +47,11 @@
         QuaZipFile zipFile(&zip);
         QDateTime lm = fileInfo.lastModified().toUTC();
         QDateTime lr = fileInfo.lastRead().toUTC();
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
+        QDateTime cr = fileInfo.birthTime().toUTC();
+#else
         QDateTime cr = fileInfo.created().toUTC();
+#endif
         mTicks = (static_cast<qint64>(base.date().daysTo(lm.date()))
                 * Q_UINT64_C(86400000)
                 + static_cast<qint64>(base.time().msecsTo(lm.time())))
@@ -101,8 +111,223 @@
         zip.close();
         QCOMPARE(zipFileInfo.getNTFSmTime(), fileInfo.lastModified());
         QCOMPARE(zipFileInfo.getNTFSaTime(), fileInfo.lastRead());
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
+        QCOMPARE(zipFileInfo.getNTFScTime(), fileInfo.birthTime());
+#else
         QCOMPARE(zipFileInfo.getNTFScTime(), fileInfo.created());
+#endif
     }
     removeTestFiles(testFiles);
     curDir.remove(zipName);
 }
+
+void TestQuaZipFileInfo::getExtTime_data()
+{
+    QTest::addColumn<QString>("zipName");
+    QTest::addColumn<quint8>("flags");
+    QTest::addColumn<quint16>("sizeLocal");
+    QTest::addColumn< QList<qint32> >("timesLocal");
+    QTest::addColumn<quint16>("sizeGlobal");
+    QTest::addColumn< QList<qint32> >("timesGlobal");
+    QTest::addColumn<QDateTime>("expectedModTime");
+    QTest::addColumn<QDateTime>("expectedAcTime");
+    QTest::addColumn<QDateTime>("expectedCrTime");
+    QTest::newRow("no times") << QString::fromUtf8("noTimes")
+                              << quint8(0)
+                              << quint16(1)
+                              << QList<qint32>()
+                              << quint16(1)
+                              << QList<qint32>()
+                              << QDateTime()
+                              << QDateTime()
+                              << QDateTime();
+    QTest::newRow("all times") << QString::fromUtf8("allTimes")
+                              << quint8(7)
+                              << quint16(13)
+                              << (QList<qint32>() << 1 << 2 << 3)
+                              << quint16(5)
+                              << (QList<qint32>() << 1)
+                              << QDateTime(QDate(1970, 1, 1), QTime(0, 0, 1), 
Qt::UTC)
+                              << QDateTime(QDate(1970, 1, 1), QTime(0, 0, 2), 
Qt::UTC)
+                              << QDateTime(QDate(1970, 1, 1), QTime(0, 0, 3), 
Qt::UTC);
+    QTest::newRow("no ac time") << QString::fromUtf8("noAcTime")
+                              << quint8(5)
+                              << quint16(9)
+                              << (QList<qint32>() << 1 << 3)
+                              << quint16(5)
+                              << (QList<qint32>() << 1)
+                              << QDateTime(QDate(1970, 1, 1), QTime(0, 0, 1), 
Qt::UTC)
+                              << QDateTime()
+                              << QDateTime(QDate(1970, 1, 1), QTime(0, 0, 3), 
Qt::UTC);
+    QTest::newRow("negativeTime") << QString::fromUtf8("negativeTime")
+                              << quint8(1)
+                              << quint16(5)
+                              << (QList<qint32>() << -1)
+                              << quint16(5)
+                              << (QList<qint32>() << -1)
+                              << QDateTime(QDate(1969, 12, 31), QTime(23, 59, 
59), Qt::UTC)
+                              << QDateTime()
+                              << QDateTime();
+}
+
+static QByteArray makeExtTimeField(quint16 size, quint8 flags, const 
QList<qint32> &times)
+{
+    if (size == 0)
+        return QByteArray();
+    const quint16 EXT_TIME_MAGIC = 0x5455;
+    QBuffer buffer;
+    buffer.open(QBuffer::WriteOnly);
+    QDataStream localStream(&buffer);
+    localStream.setByteOrder(QDataStream::LittleEndian);
+    localStream << EXT_TIME_MAGIC;
+    localStream << size;
+    localStream << flags;
+    Q_FOREACH(qint32 time, times) {
+        localStream << time;
+    }
+    return buffer.buffer();
+}
+
+void TestQuaZipFileInfo::getExtTime()
+{
+    QFETCH(QString, zipName);
+    QFETCH(quint8, flags);
+    QFETCH(quint16, sizeLocal);
+    QFETCH(QList<qint32>, timesLocal);
+    QFETCH(quint16, sizeGlobal);
+    QFETCH(QList<qint32>, timesGlobal);
+    QFETCH(QDateTime, expectedModTime);
+    QFETCH(QDateTime, expectedAcTime);
+    QFETCH(QDateTime, expectedCrTime);
+    QStringList fileNames;
+    QString fileName = QString::fromLatin1("aFile.txt");
+    fileNames << fileName;
+    {
+        createTestFiles(fileNames);
+        QuaZip testZip("tmp/" + zipName);
+        testZip.open(QuaZip::mdCreate);
+        QuaZipFile file(&testZip);
+        QuaZipNewInfo newInfo(fileName, "tmp/" + fileName);
+        newInfo.extraLocal = makeExtTimeField(sizeLocal, flags, timesLocal);
+        newInfo.extraGlobal = makeExtTimeField(sizeGlobal, flags, timesGlobal);
+        file.open(QIODevice::WriteOnly, newInfo);
+        file.close();
+        testZip.close();
+    }
+    removeTestFiles(fileNames);
+    QuaZip zip("tmp/" + zipName);
+    QVERIFY(zip.open(QuaZip::mdUnzip));
+    QVERIFY(zip.goToFirstFile());
+    QuaZipFileInfo64 fileInfo;
+    QVERIFY(zip.getCurrentFileInfo(&fileInfo));
+    QuaZipFile zipFile(&zip);
+    QVERIFY(zipFile.open(QIODevice::ReadOnly));
+    QDateTime actualGlobalModTime = fileInfo.getExtModTime();
+    QDateTime actualLocalModTime = zipFile.getExtModTime();
+    QDateTime actualLocalAcTime = zipFile.getExtAcTime();
+    QDateTime actualLocalCrTime = zipFile.getExtCrTime();
+    zipFile.close();
+    QCOMPARE(actualGlobalModTime, expectedModTime);
+    QCOMPARE(actualLocalModTime, expectedModTime);
+    QCOMPARE(actualLocalAcTime, expectedAcTime);
+    QCOMPARE(actualLocalCrTime, expectedCrTime);
+    zip.close();
+    QDir("tmp").remove(zipName);
+}
+
+void TestQuaZipFileInfo::getExtTime_issue43()
+{
+    // Test original GitHub issue, just in case.
+    // (The test above relies on manual ZIP generation, which isn't perfect.)
+    QuaZip zip(":/test_files/issue43_cant_get_dates.zip");
+    QVERIFY(zip.open(QuaZip::mdUnzip));
+    zip.goToFirstFile();
+    QuaZipFileInfo64 zipFileInfo;
+    QVERIFY(zip.getCurrentFileInfo(&zipFileInfo));
+    zip.goToFirstFile();
+    QuaZipFile zipFile(&zip);
+    QVERIFY(zipFile.open(QIODevice::ReadOnly));
+    QDateTime actualGlobalModTime = zipFileInfo.getExtModTime();
+    QDateTime actualLocalModTime = zipFile.getExtModTime();
+    QDateTime actualLocalAcTime = zipFile.getExtAcTime();
+    QDateTime actualLocalCrTime = zipFile.getExtCrTime();
+    zip.close();
+    QDateTime extModTime(QDate(2019, 7, 2), QTime(15, 43, 47), Qt::UTC);
+    QDateTime extAcTime = extModTime;
+    QDateTime extCrTime = extModTime;
+    QCOMPARE(actualGlobalModTime, extModTime);
+    QCOMPARE(actualLocalModTime, extModTime);
+    QCOMPARE(actualLocalAcTime, extAcTime);
+    QCOMPARE(actualLocalCrTime, extCrTime);
+}
+
+void TestQuaZipFileInfo::parseExtraField_data()
+{
+    QTest::addColumn<QByteArray>("extraField");
+    QTest::addColumn<QuaExtraFieldHash>("expected");
+    QTest::newRow("empty")
+            << QByteArray()
+            << QuaExtraFieldHash();
+    {
+    QuaExtraFieldHash oneZeroIdWithNoData;
+    oneZeroIdWithNoData[0] = QList<QByteArray>() << QByteArray();
+    QTest::newRow("one zero ID with no data")
+            << QByteArray("\x00\x00\x00\x00", 4)
+            << oneZeroIdWithNoData;
+    }
+    {
+    QuaExtraFieldHash oneZeroIdWithData;
+    oneZeroIdWithData[0] = QList<QByteArray>() << QByteArray("DATA", 4);
+    QTest::newRow("one zero ID with data")
+            << QByteArray("\x00\x00\x04\x00" "DATA", 8)
+            << oneZeroIdWithData;
+    }
+    {
+    QuaExtraFieldHash oneNonZeroIdWithData;
+    oneNonZeroIdWithData[1] = QList<QByteArray>() << QByteArray("DATA", 4);
+    QTest::newRow("one non zero ID with data")
+            << QByteArray("\x01\x00\x04\x00" "DATA", 8)
+            << oneNonZeroIdWithData;
+    }
+    {
+    QuaExtraFieldHash severalDifferentIDs;
+    severalDifferentIDs[0] = QList<QByteArray>() << QByteArray("DATA0", 5);
+    severalDifferentIDs[1] = QList<QByteArray>() << QByteArray("DATA1", 5);
+    QTest::newRow("two IDs")
+            << QByteArray("\x00\x00\x05\x00" "DATA0" "\x01\x00\x05\x00" 
"DATA1", 18)
+            << severalDifferentIDs;
+    }
+    {
+    QuaExtraFieldHash repeatedID;
+    repeatedID[0] = QList<QByteArray>() << QByteArray("DATA0", 5) << 
QByteArray("DATA1", 5);
+    QTest::newRow("repeated ID")
+            << QByteArray("\x00\x00\x05\x00" "DATA0" "\x00\x00\x05\x00" 
"DATA1", 18)
+            << repeatedID;
+    }
+    {
+    QuaExtraFieldHash largeID;
+    largeID[0x0102] = QList<QByteArray>() << QByteArray("DATA", 4);
+    QTest::newRow("large ID")
+            << QByteArray("\x02\x01\x04\x00" "DATA", 8)
+            << largeID;
+    }
+    {
+    QuaExtraFieldHash largeData;
+    largeData[0] = QList<QByteArray>() << QByteArray(65535, 'x');
+    QTest::newRow("large ID")
+            << (QByteArray("\x00\x00\xff\xff", 4) + QByteArray(65535, 'x'))
+            << largeData;
+    }
+    QTest::newRow("only 1 byte") << QByteArray("\x00", 1) << 
QuaExtraFieldHash();
+    QTest::newRow("only 2 bytes") << QByteArray("\x00\x00", 2) << 
QuaExtraFieldHash();
+    QTest::newRow("only 3 bytes") << QByteArray("\x00\x00\x00", 3) << 
QuaExtraFieldHash();
+    QTest::newRow("truncated data") << QByteArray("\x00\x00\x02\x00\x00", 5) 
<< QuaExtraFieldHash();
+}
+
+void TestQuaZipFileInfo::parseExtraField()
+{
+    QFETCH(QByteArray, extraField);
+    QFETCH(QuaExtraFieldHash, expected);
+    QuaExtraFieldHash actual = QuaZipFileInfo64::parseExtraField(extraField);
+    QCOMPARE(actual, expected);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/qztest/testquazipfileinfo.h 
new/quazip-0.9/qztest/testquazipfileinfo.h
--- old/quazip-0.8.1/qztest/testquazipfileinfo.h        2019-05-27 
06:27:44.000000000 +0200
+++ new/quazip-0.9/qztest/testquazipfileinfo.h  2020-04-29 14:11:37.000000000 
+0200
@@ -10,6 +10,11 @@
     explicit TestQuaZipFileInfo(QObject *parent = 0);
 private slots:
     void getNTFSTime();
+    void getExtTime_data();
+    void getExtTime();
+    void getExtTime_issue43();
+    void parseExtraField_data();
+    void parseExtraField();
 };
 
 #endif // TESTQUAZIPFILEINFO_H
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/quazip-0.8.1/qztest/testquazipnewinfo.cpp 
new/quazip-0.9/qztest/testquazipnewinfo.cpp
--- old/quazip-0.8.1/qztest/testquazipnewinfo.cpp       2019-05-27 
06:27:44.000000000 +0200
+++ new/quazip-0.9/qztest/testquazipnewinfo.cpp 2020-04-29 14:11:37.000000000 
+0200
@@ -39,7 +39,11 @@
         QFileInfo fileInfo("tmp/test.txt");
         QDateTime lm = fileInfo.lastModified().toUTC();
         QDateTime lr = fileInfo.lastRead().toUTC();
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
+        QDateTime cr = fileInfo.birthTime().toUTC();
+#else
         QDateTime cr = fileInfo.created().toUTC();
+#endif
         mTicks = (static_cast<qint64>(base.date().daysTo(lm.date()))
                 * Q_UINT64_C(86400000)
                 + static_cast<qint64>(base.time().msecsTo(lm.time())))


Reply via email to