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> ×) +{ + 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())))