forked from len0rd/rockbox
rbutil: Update quazip to release 0.9.1.
Update to latest quazip release. Change-Id: I03189ceeadbe3110a9420153d84bd5d33d5b663f
This commit is contained in:
parent
b3a0187416
commit
b0f22620a2
18 changed files with 489 additions and 163 deletions
|
|
@ -3,7 +3,7 @@ These files are distributed under the LGPL v2.1 or later. Only source files
|
||||||
actually used in Rockbox Utility are included, further sources have been left
|
actually used in Rockbox Utility are included, further sources have been left
|
||||||
out. Check the quazip source distribution for those.
|
out. Check the quazip source distribution for those.
|
||||||
|
|
||||||
The source files have been last synced with the projects release 0.7.1 at
|
The source files have been last synced with the projects release 0.9.1 at
|
||||||
http://sourceforge.net/projects/quazip/ on March 8, 2015.
|
https://github.com/stachenov/quazip/ on June 8, 2020.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "zlib.h"
|
#include <zlib.h>
|
||||||
|
|
||||||
#if defined(USE_FILE32API)
|
#if defined(USE_FILE32API)
|
||||||
#define fopen64 fopen
|
#define fopen64 fopen
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* Return the next byte in the pseudo-random sequence
|
* Return the next byte in the pseudo-random sequence
|
||||||
*/
|
*/
|
||||||
static int decrypt_byte(unsigned long* pkeys, const z_crc_t FAR * pcrc_32_tab UNUSED)
|
static int decrypt_byte(unsigned long* pkeys, const z_crc_t FAR * pcrc_32_tab QUAZIP_UNUSED)
|
||||||
{
|
{
|
||||||
//(void) pcrc_32_tab; /* avoid "unused parameter" warning */
|
//(void) pcrc_32_tab; /* avoid "unused parameter" warning */
|
||||||
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
|
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
|
||||||
|
|
@ -11,16 +11,16 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
#include "zlib.h"
|
|
||||||
#include "ioapi.h"
|
#include "ioapi.h"
|
||||||
#include "quazip_global.h"
|
#include "quazip_global.h"
|
||||||
#include <QIODevice>
|
#include <QtCore/QIODevice>
|
||||||
#if (QT_VERSION >= 0x050100)
|
#if (QT_VERSION >= 0x050100)
|
||||||
#define QUAZIP_QSAVEFILE_BUG_WORKAROUND
|
#define QUAZIP_QSAVEFILE_BUG_WORKAROUND
|
||||||
#endif
|
#endif
|
||||||
#ifdef QUAZIP_QSAVEFILE_BUG_WORKAROUND
|
#ifdef QUAZIP_QSAVEFILE_BUG_WORKAROUND
|
||||||
#include <QSaveFile>
|
#include <QtCore/QSaveFile>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
|
/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
|
||||||
|
|
@ -75,6 +75,7 @@ ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @cond internal
|
||||||
struct QIODevice_descriptor {
|
struct QIODevice_descriptor {
|
||||||
// Position only used for writing to sequential devices.
|
// Position only used for writing to sequential devices.
|
||||||
qint64 pos;
|
qint64 pos;
|
||||||
|
|
@ -82,6 +83,7 @@ struct QIODevice_descriptor {
|
||||||
pos(0)
|
pos(0)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
/// @endcond
|
||||||
|
|
||||||
voidpf ZCALLBACK qiodevice_open_file_func (
|
voidpf ZCALLBACK qiodevice_open_file_func (
|
||||||
voidpf opaque,
|
voidpf opaque,
|
||||||
|
|
|
||||||
|
|
@ -22,12 +22,14 @@ Original ZIP package is copyrighted by Gilles Vollant, see
|
||||||
quazip/(un)zip.h files for details, basically it's zlib license.
|
quazip/(un)zip.h files for details, basically it's zlib license.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#include <QFile>
|
#include <QtCore/QFile>
|
||||||
#include <QFlags>
|
#include <QtCore/QFlags>
|
||||||
#include <QHash>
|
#include <QtCore/QHash>
|
||||||
|
|
||||||
#include "quazip.h"
|
#include "quazip.h"
|
||||||
|
|
||||||
|
#define QUAZIP_OS_UNIX 3u
|
||||||
|
|
||||||
/// All the internal stuff for the QuaZip class.
|
/// All the internal stuff for the QuaZip class.
|
||||||
/**
|
/**
|
||||||
\internal
|
\internal
|
||||||
|
|
@ -39,11 +41,12 @@ quazip/(un)zip.h files for details, basically it's zlib license.
|
||||||
class QuaZipPrivate {
|
class QuaZipPrivate {
|
||||||
friend class QuaZip;
|
friend class QuaZip;
|
||||||
private:
|
private:
|
||||||
|
Q_DISABLE_COPY(QuaZipPrivate)
|
||||||
/// The pointer to the corresponding QuaZip instance.
|
/// The pointer to the corresponding QuaZip instance.
|
||||||
QuaZip *q;
|
QuaZip *q;
|
||||||
/// The codec for file names.
|
/// The codec for file names (used when UTF-8 is not enabled).
|
||||||
QTextCodec *fileNameCodec;
|
QTextCodec *fileNameCodec;
|
||||||
/// The codec for comments.
|
/// The codec for comments (used when UTF-8 is not enabled).
|
||||||
QTextCodec *commentCodec;
|
QTextCodec *commentCodec;
|
||||||
/// The archive file name.
|
/// The archive file name.
|
||||||
QString zipName;
|
QString zipName;
|
||||||
|
|
@ -69,6 +72,10 @@ class QuaZipPrivate {
|
||||||
bool zip64;
|
bool zip64;
|
||||||
/// The auto-close flag.
|
/// The auto-close flag.
|
||||||
bool autoClose;
|
bool autoClose;
|
||||||
|
/// The UTF-8 flag.
|
||||||
|
bool utf8;
|
||||||
|
/// The OS code.
|
||||||
|
uint osCode;
|
||||||
inline QTextCodec *getDefaultFileNameCodec()
|
inline QTextCodec *getDefaultFileNameCodec()
|
||||||
{
|
{
|
||||||
if (defaultFileNameCodec == NULL) {
|
if (defaultFileNameCodec == NULL) {
|
||||||
|
|
@ -88,8 +95,12 @@ class QuaZipPrivate {
|
||||||
zipError(UNZ_OK),
|
zipError(UNZ_OK),
|
||||||
dataDescriptorWritingEnabled(true),
|
dataDescriptorWritingEnabled(true),
|
||||||
zip64(false),
|
zip64(false),
|
||||||
autoClose(true)
|
autoClose(true),
|
||||||
|
utf8(false),
|
||||||
|
osCode(defaultOsCode)
|
||||||
{
|
{
|
||||||
|
unzFile_f = NULL;
|
||||||
|
zipFile_f = NULL;
|
||||||
lastMappedDirectoryEntry.num_of_file = 0;
|
lastMappedDirectoryEntry.num_of_file = 0;
|
||||||
lastMappedDirectoryEntry.pos_in_zip_directory = 0;
|
lastMappedDirectoryEntry.pos_in_zip_directory = 0;
|
||||||
}
|
}
|
||||||
|
|
@ -105,14 +116,18 @@ class QuaZipPrivate {
|
||||||
zipError(UNZ_OK),
|
zipError(UNZ_OK),
|
||||||
dataDescriptorWritingEnabled(true),
|
dataDescriptorWritingEnabled(true),
|
||||||
zip64(false),
|
zip64(false),
|
||||||
autoClose(true)
|
autoClose(true),
|
||||||
|
utf8(false),
|
||||||
|
osCode(defaultOsCode)
|
||||||
{
|
{
|
||||||
|
unzFile_f = NULL;
|
||||||
|
zipFile_f = NULL;
|
||||||
lastMappedDirectoryEntry.num_of_file = 0;
|
lastMappedDirectoryEntry.num_of_file = 0;
|
||||||
lastMappedDirectoryEntry.pos_in_zip_directory = 0;
|
lastMappedDirectoryEntry.pos_in_zip_directory = 0;
|
||||||
}
|
}
|
||||||
/// The constructor for the corresponding QuaZip constructor.
|
/// The constructor for the corresponding QuaZip constructor.
|
||||||
inline QuaZipPrivate(QuaZip *q, QIODevice *ioDevice):
|
inline QuaZipPrivate(QuaZip *q, QIODevice *ioDevice):
|
||||||
q(q),
|
q(q),
|
||||||
fileNameCodec(getDefaultFileNameCodec()),
|
fileNameCodec(getDefaultFileNameCodec()),
|
||||||
commentCodec(QTextCodec::codecForLocale()),
|
commentCodec(QTextCodec::codecForLocale()),
|
||||||
ioDevice(ioDevice),
|
ioDevice(ioDevice),
|
||||||
|
|
@ -121,8 +136,12 @@ class QuaZipPrivate {
|
||||||
zipError(UNZ_OK),
|
zipError(UNZ_OK),
|
||||||
dataDescriptorWritingEnabled(true),
|
dataDescriptorWritingEnabled(true),
|
||||||
zip64(false),
|
zip64(false),
|
||||||
autoClose(true)
|
autoClose(true),
|
||||||
|
utf8(false),
|
||||||
|
osCode(defaultOsCode)
|
||||||
{
|
{
|
||||||
|
unzFile_f = NULL;
|
||||||
|
zipFile_f = NULL;
|
||||||
lastMappedDirectoryEntry.num_of_file = 0;
|
lastMappedDirectoryEntry.num_of_file = 0;
|
||||||
lastMappedDirectoryEntry.pos_in_zip_directory = 0;
|
lastMappedDirectoryEntry.pos_in_zip_directory = 0;
|
||||||
}
|
}
|
||||||
|
|
@ -138,9 +157,11 @@ class QuaZipPrivate {
|
||||||
QHash<QString, unz64_file_pos> directoryCaseInsensitive;
|
QHash<QString, unz64_file_pos> directoryCaseInsensitive;
|
||||||
unz64_file_pos lastMappedDirectoryEntry;
|
unz64_file_pos lastMappedDirectoryEntry;
|
||||||
static QTextCodec *defaultFileNameCodec;
|
static QTextCodec *defaultFileNameCodec;
|
||||||
|
static uint defaultOsCode;
|
||||||
};
|
};
|
||||||
|
|
||||||
QTextCodec *QuaZipPrivate::defaultFileNameCodec = NULL;
|
QTextCodec *QuaZipPrivate::defaultFileNameCodec = NULL;
|
||||||
|
uint QuaZipPrivate::defaultOsCode = QUAZIP_OS_UNIX;
|
||||||
|
|
||||||
void QuaZipPrivate::clearDirectoryMap()
|
void QuaZipPrivate::clearDirectoryMap()
|
||||||
{
|
{
|
||||||
|
|
@ -273,6 +294,8 @@ bool QuaZip::open(Mode mode, zlib_filefunc_def* ioApi)
|
||||||
flags |= ZIP_AUTO_CLOSE;
|
flags |= ZIP_AUTO_CLOSE;
|
||||||
if (p->dataDescriptorWritingEnabled)
|
if (p->dataDescriptorWritingEnabled)
|
||||||
flags |= ZIP_WRITE_DATA_DESCRIPTOR;
|
flags |= ZIP_WRITE_DATA_DESCRIPTOR;
|
||||||
|
if (p->utf8)
|
||||||
|
flags |= ZIP_ENCODING_UTF8;
|
||||||
p->zipFile_f=zipOpen3(ioDevice,
|
p->zipFile_f=zipOpen3(ioDevice,
|
||||||
mode==mdCreate?APPEND_STATUS_CREATE:
|
mode==mdCreate?APPEND_STATUS_CREATE:
|
||||||
mode==mdAppend?APPEND_STATUS_CREATEAFTER:
|
mode==mdAppend?APPEND_STATUS_CREATEAFTER:
|
||||||
|
|
@ -334,9 +357,9 @@ void QuaZip::close()
|
||||||
case mdCreate:
|
case mdCreate:
|
||||||
case mdAppend:
|
case mdAppend:
|
||||||
case mdAdd:
|
case mdAdd:
|
||||||
p->zipError=zipClose(p->zipFile_f,
|
p->zipError=zipClose(p->zipFile_f, p->comment.isNull() ? NULL : isUtf8Enabled()
|
||||||
p->comment.isNull() ? NULL
|
? p->comment.toUtf8().constData()
|
||||||
: p->commentCodec->fromUnicode(p->comment).constData());
|
: p->commentCodec->fromUnicode(p->comment).constData());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
qWarning("QuaZip::close(): unknown mode: %d", (int)p->mode);
|
qWarning("QuaZip::close(): unknown mode: %d", (int)p->mode);
|
||||||
|
|
@ -402,7 +425,9 @@ QString QuaZip::getComment()const
|
||||||
if((fakeThis->p->zipError=unzGetGlobalComment(p->unzFile_f, comment.data(), comment.size())) < 0)
|
if((fakeThis->p->zipError=unzGetGlobalComment(p->unzFile_f, comment.data(), comment.size())) < 0)
|
||||||
return QString();
|
return QString();
|
||||||
fakeThis->p->zipError = UNZ_OK;
|
fakeThis->p->zipError = UNZ_OK;
|
||||||
return p->commentCodec->toUnicode(comment);
|
unsigned flags = 0;
|
||||||
|
return (unzGetFileFlags(p->unzFile_f, &flags) == UNZ_OK) && (flags & UNZ_ENCODING_UTF8)
|
||||||
|
? QString::fromUtf8(comment) : p->commentCodec->toUnicode(comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QuaZip::setCurrentFile(const QString& fileName, CaseSensitivity cs)
|
bool QuaZip::setCurrentFile(const QString& fileName, CaseSensitivity cs)
|
||||||
|
|
@ -537,8 +562,8 @@ bool QuaZip::getCurrentFileInfo(QuaZipFileInfo64 *info)const
|
||||||
info->diskNumberStart=info_z.disk_num_start;
|
info->diskNumberStart=info_z.disk_num_start;
|
||||||
info->internalAttr=info_z.internal_fa;
|
info->internalAttr=info_z.internal_fa;
|
||||||
info->externalAttr=info_z.external_fa;
|
info->externalAttr=info_z.external_fa;
|
||||||
info->name=p->fileNameCodec->toUnicode(fileName);
|
info->name=(info->flags & UNZ_ENCODING_UTF8) ? QString::fromUtf8(fileName) : p->fileNameCodec->toUnicode(fileName);
|
||||||
info->comment=p->commentCodec->toUnicode(comment);
|
info->comment=(info->flags & UNZ_ENCODING_UTF8) ? QString::fromUtf8(comment) : p->commentCodec->toUnicode(comment);
|
||||||
info->extra=extra;
|
info->extra=extra;
|
||||||
info->dateTime=QDateTime(
|
info->dateTime=QDateTime(
|
||||||
QDate(info_z.tmu_date.tm_year, info_z.tmu_date.tm_mon+1, info_z.tmu_date.tm_mday),
|
QDate(info_z.tmu_date.tm_year, info_z.tmu_date.tm_mon+1, info_z.tmu_date.tm_mday),
|
||||||
|
|
@ -558,10 +583,13 @@ QString QuaZip::getCurrentFileName()const
|
||||||
}
|
}
|
||||||
if(!isOpen()||!hasCurrentFile()) return QString();
|
if(!isOpen()||!hasCurrentFile()) return QString();
|
||||||
QByteArray fileName(MAX_FILE_NAME_LENGTH, 0);
|
QByteArray fileName(MAX_FILE_NAME_LENGTH, 0);
|
||||||
if((fakeThis->p->zipError=unzGetCurrentFileInfo64(p->unzFile_f, NULL, fileName.data(), fileName.size(),
|
unz_file_info64 file_info;
|
||||||
|
if((fakeThis->p->zipError=unzGetCurrentFileInfo64(p->unzFile_f, &file_info, fileName.data(), fileName.size(),
|
||||||
NULL, 0, NULL, 0))!=UNZ_OK)
|
NULL, 0, NULL, 0))!=UNZ_OK)
|
||||||
return QString();
|
return QString();
|
||||||
QString result = p->fileNameCodec->toUnicode(fileName.constData());
|
fileName.resize(file_info.size_filename);
|
||||||
|
QString result = (file_info.flag & UNZ_ENCODING_UTF8)
|
||||||
|
? QString::fromUtf8(fileName) : p->fileNameCodec->toUnicode(fileName);
|
||||||
if (result.isEmpty())
|
if (result.isEmpty())
|
||||||
return result;
|
return result;
|
||||||
// Add to directory map
|
// Add to directory map
|
||||||
|
|
@ -576,7 +604,17 @@ void QuaZip::setFileNameCodec(QTextCodec *fileNameCodec)
|
||||||
|
|
||||||
void QuaZip::setFileNameCodec(const char *fileNameCodecName)
|
void QuaZip::setFileNameCodec(const char *fileNameCodecName)
|
||||||
{
|
{
|
||||||
p->fileNameCodec=QTextCodec::codecForName(fileNameCodecName);
|
p->fileNameCodec=QTextCodec::codecForName(fileNameCodecName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QuaZip::setOsCode(uint osCode)
|
||||||
|
{
|
||||||
|
p->osCode = osCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint QuaZip::getOsCode() const
|
||||||
|
{
|
||||||
|
return p->osCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
QTextCodec *QuaZip::getFileNameCodec()const
|
QTextCodec *QuaZip::getFileNameCodec()const
|
||||||
|
|
@ -747,7 +785,7 @@ QList<QuaZipFileInfo64> QuaZip::getFileInfoList64() const
|
||||||
Qt::CaseSensitivity QuaZip::convertCaseSensitivity(QuaZip::CaseSensitivity cs)
|
Qt::CaseSensitivity QuaZip::convertCaseSensitivity(QuaZip::CaseSensitivity cs)
|
||||||
{
|
{
|
||||||
if (cs == csDefault) {
|
if (cs == csDefault) {
|
||||||
#ifdef Q_WS_WIN
|
#ifdef Q_OS_WIN
|
||||||
return Qt::CaseInsensitive;
|
return Qt::CaseInsensitive;
|
||||||
#else
|
#else
|
||||||
return Qt::CaseSensitive;
|
return Qt::CaseSensitive;
|
||||||
|
|
@ -767,6 +805,16 @@ void QuaZip::setDefaultFileNameCodec(const char *codecName)
|
||||||
setDefaultFileNameCodec(QTextCodec::codecForName(codecName));
|
setDefaultFileNameCodec(QTextCodec::codecForName(codecName));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QuaZip::setDefaultOsCode(uint osCode)
|
||||||
|
{
|
||||||
|
QuaZipPrivate::defaultOsCode = osCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint QuaZip::getDefaultOsCode()
|
||||||
|
{
|
||||||
|
return QuaZipPrivate::defaultOsCode;
|
||||||
|
}
|
||||||
|
|
||||||
void QuaZip::setZip64Enabled(bool zip64)
|
void QuaZip::setZip64Enabled(bool zip64)
|
||||||
{
|
{
|
||||||
p->zip64 = zip64;
|
p->zip64 = zip64;
|
||||||
|
|
@ -777,6 +825,16 @@ bool QuaZip::isZip64Enabled() const
|
||||||
return p->zip64;
|
return p->zip64;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QuaZip::setUtf8Enabled(bool utf8)
|
||||||
|
{
|
||||||
|
p->utf8 = utf8;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QuaZip::isUtf8Enabled() const
|
||||||
|
{
|
||||||
|
return p->utf8;
|
||||||
|
}
|
||||||
|
|
||||||
bool QuaZip::isAutoClose() const
|
bool QuaZip::isAutoClose() const
|
||||||
{
|
{
|
||||||
return p->autoClose;
|
return p->autoClose;
|
||||||
|
|
|
||||||
|
|
@ -25,9 +25,9 @@ Original ZIP package is copyrighted by Gilles Vollant, see
|
||||||
quazip/(un)zip.h files for details, basically it's zlib license.
|
quazip/(un)zip.h files for details, basically it's zlib license.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#include <QString>
|
#include <QtCore/QString>
|
||||||
#include <QStringList>
|
#include <QtCore/QStringList>
|
||||||
#include <QTextCodec>
|
#include <QtCore/QTextCodec>
|
||||||
|
|
||||||
#include "zip.h"
|
#include "zip.h"
|
||||||
#include "unzip.h"
|
#include "unzip.h"
|
||||||
|
|
@ -227,6 +227,14 @@ class QUAZIP_EXPORT QuaZip {
|
||||||
* Equivalent to calling setFileNameCodec(QTextCodec::codecForName(codecName));
|
* Equivalent to calling setFileNameCodec(QTextCodec::codecForName(codecName));
|
||||||
**/
|
**/
|
||||||
void setFileNameCodec(const char *fileNameCodecName);
|
void setFileNameCodec(const char *fileNameCodecName);
|
||||||
|
/// Sets the OS code (highest 8 bits of the “version made by” field) for new files.
|
||||||
|
/** There is currently no way to specify this for each file individually,
|
||||||
|
except by calling this function before opening each file. If this function is not called,
|
||||||
|
then the default OS code will be used. The default code is set by calling
|
||||||
|
setDefaultOsCode(). The default value at the moment of QuaZip creation will be used. */
|
||||||
|
void setOsCode(uint osCode);
|
||||||
|
/// Returns the OS code for new files.
|
||||||
|
uint getOsCode() const;
|
||||||
/// Returns the codec used to encode/decode comments inside archive.
|
/// Returns the codec used to encode/decode comments inside archive.
|
||||||
QTextCodec* getFileNameCodec() const;
|
QTextCodec* getFileNameCodec() const;
|
||||||
/// Sets the codec used to encode/decode comments inside archive.
|
/// Sets the codec used to encode/decode comments inside archive.
|
||||||
|
|
@ -502,6 +510,28 @@ class QUAZIP_EXPORT QuaZip {
|
||||||
* \sa setZip64Enabled()
|
* \sa setZip64Enabled()
|
||||||
*/
|
*/
|
||||||
bool isZip64Enabled() const;
|
bool isZip64Enabled() const;
|
||||||
|
/// Enables the use of UTF-8 encoding for file names and comments text.
|
||||||
|
/**
|
||||||
|
* @param utf8 If \c true, the UTF-8 mode is enabled, disabled otherwise.
|
||||||
|
*
|
||||||
|
* Once this is enabled, the names of all new files and comments text (until
|
||||||
|
* the mode is disabled again) will be encoded in UTF-8 encoding, and the
|
||||||
|
* version to extract will be set to 6.3 (63) in ZIP header. By default,
|
||||||
|
* the UTF-8 mode is off due to compatibility reasons.
|
||||||
|
*
|
||||||
|
* Note that when extracting ZIP archives, the UTF-8 mode is determined from
|
||||||
|
* ZIP file header, not from this flag.
|
||||||
|
*
|
||||||
|
* \sa isUtf8Enabled()
|
||||||
|
*/
|
||||||
|
void setUtf8Enabled(bool utf8);
|
||||||
|
/// Returns whether the UTF-8 encoding mode is enabled.
|
||||||
|
/**
|
||||||
|
* @return \c true if and only if the UTF-8 mode is enabled.
|
||||||
|
*
|
||||||
|
* \sa setUtf8Enabled()
|
||||||
|
*/
|
||||||
|
bool isUtf8Enabled() const;
|
||||||
/// Returns the auto-close flag.
|
/// Returns the auto-close flag.
|
||||||
/**
|
/**
|
||||||
@sa setAutoClose()
|
@sa setAutoClose()
|
||||||
|
|
@ -563,9 +593,19 @@ class QUAZIP_EXPORT QuaZip {
|
||||||
/**
|
/**
|
||||||
* @overload
|
* @overload
|
||||||
* Equivalent to calling
|
* Equivalent to calling
|
||||||
* setDefltFileNameCodec(QTextCodec::codecForName(codecName)).
|
* setDefaultFileNameCodec(QTextCodec::codecForName(codecName)).
|
||||||
*/
|
*/
|
||||||
static void setDefaultFileNameCodec(const char *codecName);
|
static void setDefaultFileNameCodec(const char *codecName);
|
||||||
|
/// Sets default OS code.
|
||||||
|
/**
|
||||||
|
* @sa setOsCode()
|
||||||
|
*/
|
||||||
|
static void setDefaultOsCode(uint osCode);
|
||||||
|
/// Returns default OS code.
|
||||||
|
/**
|
||||||
|
* @sa getOsCode()
|
||||||
|
*/
|
||||||
|
static uint getDefaultOsCode();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ SOURCES += \
|
||||||
$$PWD/zip.c \
|
$$PWD/zip.c \
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
$$PWD/crypt.h \
|
$$PWD/minizip_crypt.h \
|
||||||
$$PWD/ioapi.h \
|
$$PWD/ioapi.h \
|
||||||
$$PWD/quazipfile.h \
|
$$PWD/quazipfile.h \
|
||||||
$$PWD/quazipfileinfo.h \
|
$$PWD/quazipfileinfo.h \
|
||||||
|
|
|
||||||
|
|
@ -48,12 +48,16 @@ see quazip/(un)zip.h files for details. Basically it's the zlib license.
|
||||||
#endif // QUAZIP_STATIC
|
#endif // QUAZIP_STATIC
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
#define UNUSED __attribute__((__unused__))
|
#define QUAZIP_UNUSED __attribute__((__unused__))
|
||||||
#else
|
#else
|
||||||
#define UNUSED
|
#define QUAZIP_UNUSED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define QUAZIP_EXTRA_NTFS_MAGIC 0x000Au
|
#define QUAZIP_EXTRA_NTFS_MAGIC 0x000Au
|
||||||
#define QUAZIP_EXTRA_NTFS_TIME_MAGIC 0x0001u
|
#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
|
#endif // QUAZIP_GLOBAL_H
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,12 @@ quazip/(un)zip.h files for details, basically it's zlib license.
|
||||||
|
|
||||||
#include "quazipfile.h"
|
#include "quazipfile.h"
|
||||||
|
|
||||||
|
#include "quazipfileinfo.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
#define QUAZIP_VERSION_MADE_BY 0x1Eu
|
||||||
|
|
||||||
/// The implementation class for QuaZip.
|
/// The implementation class for QuaZip.
|
||||||
/**
|
/**
|
||||||
\internal
|
\internal
|
||||||
|
|
@ -37,6 +41,7 @@ technique known as the Pimpl (private implementation) idiom.
|
||||||
class QuaZipFilePrivate {
|
class QuaZipFilePrivate {
|
||||||
friend class QuaZipFile;
|
friend class QuaZipFile;
|
||||||
private:
|
private:
|
||||||
|
Q_DISABLE_COPY(QuaZipFilePrivate)
|
||||||
/// The pointer to the associated QuaZipFile instance.
|
/// The pointer to the associated QuaZipFile instance.
|
||||||
QuaZipFile *q;
|
QuaZipFile *q;
|
||||||
/// The QuaZip object to work with.
|
/// The QuaZip object to work with.
|
||||||
|
|
@ -76,27 +81,55 @@ class QuaZipFilePrivate {
|
||||||
void setZipError(int zipError) const;
|
void setZipError(int zipError) const;
|
||||||
/// The constructor for the corresponding QuaZipFile constructor.
|
/// The constructor for the corresponding QuaZipFile constructor.
|
||||||
inline QuaZipFilePrivate(QuaZipFile *q):
|
inline QuaZipFilePrivate(QuaZipFile *q):
|
||||||
q(q), zip(NULL), internal(true), zipError(UNZ_OK) {}
|
q(q),
|
||||||
|
zip(NULL),
|
||||||
|
caseSensitivity(QuaZip::csDefault),
|
||||||
|
raw(false),
|
||||||
|
writePos(0),
|
||||||
|
uncompressedSize(0),
|
||||||
|
crc(0),
|
||||||
|
internal(true),
|
||||||
|
zipError(UNZ_OK) {}
|
||||||
/// The constructor for the corresponding QuaZipFile constructor.
|
/// The constructor for the corresponding QuaZipFile constructor.
|
||||||
inline QuaZipFilePrivate(QuaZipFile *q, const QString &zipName):
|
inline QuaZipFilePrivate(QuaZipFile *q, const QString &zipName):
|
||||||
q(q), internal(true), zipError(UNZ_OK)
|
q(q),
|
||||||
|
caseSensitivity(QuaZip::csDefault),
|
||||||
|
raw(false),
|
||||||
|
writePos(0),
|
||||||
|
uncompressedSize(0),
|
||||||
|
crc(0),
|
||||||
|
internal(true),
|
||||||
|
zipError(UNZ_OK)
|
||||||
{
|
{
|
||||||
zip=new QuaZip(zipName);
|
zip=new QuaZip(zipName);
|
||||||
}
|
}
|
||||||
/// The constructor for the corresponding QuaZipFile constructor.
|
/// The constructor for the corresponding QuaZipFile constructor.
|
||||||
inline QuaZipFilePrivate(QuaZipFile *q, const QString &zipName, const QString &fileName,
|
inline QuaZipFilePrivate(QuaZipFile *q, const QString &zipName, const QString &fileName,
|
||||||
QuaZip::CaseSensitivity cs):
|
QuaZip::CaseSensitivity cs):
|
||||||
q(q), internal(true), zipError(UNZ_OK)
|
q(q),
|
||||||
|
raw(false),
|
||||||
|
writePos(0),
|
||||||
|
uncompressedSize(0),
|
||||||
|
crc(0),
|
||||||
|
internal(true),
|
||||||
|
zipError(UNZ_OK)
|
||||||
{
|
{
|
||||||
zip=new QuaZip(zipName);
|
zip=new QuaZip(zipName);
|
||||||
this->fileName=fileName;
|
this->fileName=fileName;
|
||||||
if (this->fileName.startsWith('/'))
|
if (this->fileName.startsWith(QLatin1String("/")))
|
||||||
this->fileName = this->fileName.mid(1);
|
this->fileName = this->fileName.mid(1);
|
||||||
this->caseSensitivity=cs;
|
this->caseSensitivity=cs;
|
||||||
}
|
}
|
||||||
/// The constructor for the QuaZipFile constructor accepting a file name.
|
/// The constructor for the QuaZipFile constructor accepting a file name.
|
||||||
inline QuaZipFilePrivate(QuaZipFile *q, QuaZip *zip):
|
inline QuaZipFilePrivate(QuaZipFile *q, QuaZip *zip):
|
||||||
q(q), zip(zip), internal(false), zipError(UNZ_OK) {}
|
q(q),
|
||||||
|
zip(zip),
|
||||||
|
raw(false),
|
||||||
|
writePos(0),
|
||||||
|
uncompressedSize(0),
|
||||||
|
crc(0),
|
||||||
|
internal(false),
|
||||||
|
zipError(UNZ_OK) {}
|
||||||
/// The destructor.
|
/// The destructor.
|
||||||
inline ~QuaZipFilePrivate()
|
inline ~QuaZipFilePrivate()
|
||||||
{
|
{
|
||||||
|
|
@ -203,7 +236,7 @@ void QuaZipFile::setFileName(const QString& fileName, QuaZip::CaseSensitivity cs
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
p->fileName=fileName;
|
p->fileName=fileName;
|
||||||
if (p->fileName.startsWith('/'))
|
if (p->fileName.startsWith(QLatin1String("/")))
|
||||||
p->fileName = p->fileName.mid(1);
|
p->fileName = p->fileName.mid(1);
|
||||||
p->caseSensitivity=cs;
|
p->caseSensitivity=cs;
|
||||||
}
|
}
|
||||||
|
|
@ -310,14 +343,22 @@ bool QuaZipFile::open(OpenMode mode, const QuaZipNewInfo& info,
|
||||||
zipSetFlags(p->zip->getZipFile(), ZIP_WRITE_DATA_DESCRIPTOR);
|
zipSetFlags(p->zip->getZipFile(), ZIP_WRITE_DATA_DESCRIPTOR);
|
||||||
else
|
else
|
||||||
zipClearFlags(p->zip->getZipFile(), ZIP_WRITE_DATA_DESCRIPTOR);
|
zipClearFlags(p->zip->getZipFile(), ZIP_WRITE_DATA_DESCRIPTOR);
|
||||||
p->setZipError(zipOpenNewFileInZip3_64(p->zip->getZipFile(),
|
p->setZipError(zipOpenNewFileInZip4_64(p->zip->getZipFile(),
|
||||||
p->zip->getFileNameCodec()->fromUnicode(info.name).constData(), &info_z,
|
p->zip->isUtf8Enabled()
|
||||||
|
? info.name.toUtf8().constData()
|
||||||
|
: p->zip->getFileNameCodec()->fromUnicode(info.name).constData(),
|
||||||
|
&info_z,
|
||||||
info.extraLocal.constData(), info.extraLocal.length(),
|
info.extraLocal.constData(), info.extraLocal.length(),
|
||||||
info.extraGlobal.constData(), info.extraGlobal.length(),
|
info.extraGlobal.constData(), info.extraGlobal.length(),
|
||||||
p->zip->getCommentCodec()->fromUnicode(info.comment).constData(),
|
p->zip->isUtf8Enabled()
|
||||||
|
? info.comment.toUtf8().constData()
|
||||||
|
: p->zip->getCommentCodec()->fromUnicode(info.comment).constData(),
|
||||||
method, level, (int)raw,
|
method, level, (int)raw,
|
||||||
windowBits, memLevel, strategy,
|
windowBits, memLevel, strategy,
|
||||||
password, (uLong)crc, p->zip->isZip64Enabled()));
|
password, (uLong)crc,
|
||||||
|
(p->zip->getOsCode() << 8) | QUAZIP_VERSION_MADE_BY,
|
||||||
|
0,
|
||||||
|
p->zip->isZip64Enabled()));
|
||||||
if(p->zipError==UNZ_OK) {
|
if(p->zipError==UNZ_OK) {
|
||||||
p->writePos=0;
|
p->writePos=0;
|
||||||
setOpenMode(mode);
|
setOpenMode(mode);
|
||||||
|
|
@ -353,7 +394,7 @@ qint64 QuaZipFile::pos()const
|
||||||
// QIODevice::pos() is broken for sequential devices,
|
// QIODevice::pos() is broken for sequential devices,
|
||||||
// but thankfully bytesAvailable() returns the number of
|
// but thankfully bytesAvailable() returns the number of
|
||||||
// bytes buffered, so we know how far ahead we are.
|
// bytes buffered, so we know how far ahead we are.
|
||||||
return unztell(p->zip->getUnzFile()) - QIODevice::bytesAvailable();
|
return unztell64(p->zip->getUnzFile()) - QIODevice::bytesAvailable();
|
||||||
else
|
else
|
||||||
return p->writePos;
|
return p->writePos;
|
||||||
}
|
}
|
||||||
|
|
@ -500,3 +541,30 @@ qint64 QuaZipFile::bytesAvailable() const
|
||||||
{
|
{
|
||||||
return size() - pos();
|
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);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ Original ZIP package is copyrighted by Gilles Vollant, see
|
||||||
quazip/(un)zip.h files for details, basically it's zlib license.
|
quazip/(un)zip.h files for details, basically it's zlib license.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#include <QIODevice>
|
#include <QtCore/QIODevice>
|
||||||
|
|
||||||
#include "quazip_global.h"
|
#include "quazip_global.h"
|
||||||
#include "quazip.h"
|
#include "quazip.h"
|
||||||
|
|
@ -451,6 +451,58 @@ class QUAZIP_EXPORT QuaZipFile: public QIODevice {
|
||||||
int getZipError() const;
|
int getZipError() const;
|
||||||
/// Returns the number of bytes available for reading.
|
/// Returns the number of bytes available for reading.
|
||||||
virtual qint64 bytesAvailable() const;
|
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
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,8 @@ see quazip/(un)zip.h files for details. Basically it's the zlib license.
|
||||||
|
|
||||||
#include "quazipfileinfo.h"
|
#include "quazipfileinfo.h"
|
||||||
|
|
||||||
|
#include <QtCore/QDataStream>
|
||||||
|
|
||||||
static QFile::Permissions permissionsFromExternalAttr(quint32 externalAttr) {
|
static QFile::Permissions permissionsFromExternalAttr(quint32 externalAttr) {
|
||||||
quint32 uPerm = (externalAttr & 0xFFFF0000u) >> 16;
|
quint32 uPerm = (externalAttr & 0xFFFF0000u) >> 16;
|
||||||
QFile::Permissions perm = QFile::Permissions();
|
QFile::Permissions perm = QFile::Permissions();
|
||||||
|
|
@ -93,69 +95,30 @@ static QDateTime getNTFSTime(const QByteArray &extra, int position,
|
||||||
int *fineTicks)
|
int *fineTicks)
|
||||||
{
|
{
|
||||||
QDateTime dateTime;
|
QDateTime dateTime;
|
||||||
for (int i = 0; i <= extra.size() - 4; ) {
|
QuaExtraFieldHash extraHash = QuaZipFileInfo64::parseExtraField(extra);
|
||||||
unsigned type = static_cast<unsigned>(static_cast<unsigned char>(
|
QList<QByteArray> ntfsExtraFields = extraHash[QUAZIP_EXTRA_NTFS_MAGIC];
|
||||||
extra.at(i)))
|
if (ntfsExtraFields.isEmpty())
|
||||||
| (static_cast<unsigned>(static_cast<unsigned char>(
|
return dateTime;
|
||||||
extra.at(i + 1))) << 8);
|
QByteArray ntfsExtraField = ntfsExtraFields.at(0);
|
||||||
i += 2;
|
if (ntfsExtraField.length() <= 4)
|
||||||
unsigned length = static_cast<unsigned>(static_cast<unsigned char>(
|
return dateTime;
|
||||||
extra.at(i)))
|
QByteArray ntfsAttributes = ntfsExtraField.mid(4);
|
||||||
| (static_cast<unsigned>(static_cast<unsigned char>(
|
QuaExtraFieldHash ntfsHash = QuaZipFileInfo64::parseExtraField(ntfsAttributes);
|
||||||
extra.at(i + 1))) << 8);
|
QList<QByteArray> ntfsTimeAttributes = ntfsHash[QUAZIP_EXTRA_NTFS_TIME_MAGIC];
|
||||||
i += 2;
|
if (ntfsTimeAttributes.isEmpty())
|
||||||
if (type == QUAZIP_EXTRA_NTFS_MAGIC && length >= 32) {
|
return dateTime;
|
||||||
i += 4; // reserved
|
QByteArray ntfsTimes = ntfsTimeAttributes.at(0);
|
||||||
while (i <= extra.size() - 4) {
|
if (ntfsTimes.size() < 24)
|
||||||
unsigned tag = static_cast<unsigned>(
|
return dateTime;
|
||||||
static_cast<unsigned char>(extra.at(i)))
|
QDataStream timeReader(ntfsTimes);
|
||||||
| (static_cast<unsigned>(
|
timeReader.setByteOrder(QDataStream::LittleEndian);
|
||||||
static_cast<unsigned char>(extra.at(i + 1)))
|
timeReader.device()->seek(position);
|
||||||
<< 8);
|
quint64 time;
|
||||||
i += 2;
|
timeReader >> time;
|
||||||
int tagsize = static_cast<unsigned>(
|
QDateTime base(QDate(1601, 1, 1), QTime(0, 0), Qt::UTC);
|
||||||
static_cast<unsigned char>(extra.at(i)))
|
dateTime = base.addMSecs(time / 10000);
|
||||||
| (static_cast<unsigned>(
|
if (fineTicks != NULL) {
|
||||||
static_cast<unsigned char>(extra.at(i + 1)))
|
*fineTicks = static_cast<int>(time % 10000);
|
||||||
<< 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;
|
|
||||||
}
|
}
|
||||||
return dateTime;
|
return dateTime;
|
||||||
}
|
}
|
||||||
|
|
@ -174,3 +137,60 @@ QDateTime QuaZipFileInfo64::getNTFScTime(int *fineTicks) const
|
||||||
{
|
{
|
||||||
return getNTFSTime(extra, 16, fineTicks);
|
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;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,12 +25,16 @@ Original ZIP package is copyrighted by Gilles Vollant and contributors,
|
||||||
see quazip/(un)zip.h files for details. Basically it's the zlib license.
|
see quazip/(un)zip.h files for details. Basically it's the zlib license.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <QByteArray>
|
#include <QtCore/QByteArray>
|
||||||
#include <QDateTime>
|
#include <QtCore/QDateTime>
|
||||||
#include <QFile>
|
#include <QtCore/QFile>
|
||||||
|
#include <QtCore/QHash>
|
||||||
|
|
||||||
#include "quazip_global.h"
|
#include "quazip_global.h"
|
||||||
|
|
||||||
|
/// The typedef to store extra field parse results
|
||||||
|
typedef QHash<quint16, QList<QByteArray> > QuaExtraFieldHash;
|
||||||
|
|
||||||
/// Information about a file inside archive.
|
/// Information about a file inside archive.
|
||||||
/**
|
/**
|
||||||
* \deprecated Use QuaZipFileInfo64 instead. Not only it supports large files,
|
* \deprecated Use QuaZipFileInfo64 instead. Not only it supports large files,
|
||||||
|
|
@ -171,8 +175,52 @@ struct QUAZIP_EXPORT QuaZipFileInfo64 {
|
||||||
* @return The NTFS creation time, UTC
|
* @return The NTFS creation time, UTC
|
||||||
*/
|
*/
|
||||||
QDateTime getNTFScTime(int *fineTicks = NULL) const;
|
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.
|
/// Checks whether the file is encrypted.
|
||||||
bool isEncrypted() const {return (flags & 1) != 0;}
|
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
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -22,16 +22,25 @@ Original ZIP package is copyrighted by Gilles Vollant and contributors,
|
||||||
see quazip/(un)zip.h files for details. Basically it's the zlib license.
|
see quazip/(un)zip.h files for details. Basically it's the zlib license.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <QFileInfo>
|
#include <QtCore/QFileInfo>
|
||||||
|
|
||||||
#include "quazipnewinfo.h"
|
#include "quazipnewinfo.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
static void QuaZipNewInfo_setPermissions(QuaZipNewInfo *info,
|
static void QuaZipNewInfo_setPermissions(QuaZipNewInfo *info,
|
||||||
QFile::Permissions perm, bool isDir)
|
QFile::Permissions perm, bool isDir, bool isSymLink = false)
|
||||||
{
|
{
|
||||||
quint32 uPerm = isDir ? 0040000 : 0100000;
|
quint32 uPerm = isDir ? 0040000 : 0100000;
|
||||||
|
|
||||||
|
if ( isSymLink ) {
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
uPerm = 0200000;
|
||||||
|
#else
|
||||||
|
uPerm = 0120000;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
if ((perm & QFile::ReadOwner) != 0)
|
if ((perm & QFile::ReadOwner) != 0)
|
||||||
uPerm |= 0400;
|
uPerm |= 0400;
|
||||||
if ((perm & QFile::WriteOwner) != 0)
|
if ((perm & QFile::WriteOwner) != 0)
|
||||||
|
|
@ -91,7 +100,7 @@ QuaZipNewInfo::QuaZipNewInfo(const QString& name, const QString& file):
|
||||||
dateTime = QDateTime::currentDateTime();
|
dateTime = QDateTime::currentDateTime();
|
||||||
} else {
|
} else {
|
||||||
dateTime = lm;
|
dateTime = lm;
|
||||||
QuaZipNewInfo_setPermissions(this, info.permissions(), info.isDir());
|
QuaZipNewInfo_setPermissions(this, info.permissions(), info.isDir(), info.isSymLink());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -107,12 +116,12 @@ void QuaZipNewInfo::setFilePermissions(const QString &file)
|
||||||
{
|
{
|
||||||
QFileInfo info = QFileInfo(file);
|
QFileInfo info = QFileInfo(file);
|
||||||
QFile::Permissions perm = info.permissions();
|
QFile::Permissions perm = info.permissions();
|
||||||
QuaZipNewInfo_setPermissions(this, perm, info.isDir());
|
QuaZipNewInfo_setPermissions(this, perm, info.isDir(), info.isSymLink());
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuaZipNewInfo::setPermissions(QFile::Permissions permissions)
|
void QuaZipNewInfo::setPermissions(QFile::Permissions permissions)
|
||||||
{
|
{
|
||||||
QuaZipNewInfo_setPermissions(this, permissions, name.endsWith('/'));
|
QuaZipNewInfo_setPermissions(this, permissions, name.endsWith(QLatin1String("/")));
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuaZipNewInfo::setFileNTFSTimes(const QString &fileName)
|
void QuaZipNewInfo::setFileNTFSTimes(const QString &fileName)
|
||||||
|
|
@ -125,7 +134,11 @@ void QuaZipNewInfo::setFileNTFSTimes(const QString &fileName)
|
||||||
}
|
}
|
||||||
setFileNTFSmTime(fi.lastModified());
|
setFileNTFSmTime(fi.lastModified());
|
||||||
setFileNTFSaTime(fi.lastRead());
|
setFileNTFSaTime(fi.lastRead());
|
||||||
|
#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
|
||||||
|
setFileNTFScTime(fi.birthTime());
|
||||||
|
#else
|
||||||
setFileNTFScTime(fi.created());
|
setFileNTFScTime(fi.created());
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setNTFSTime(QByteArray &extra, const QDateTime &time, int position,
|
static void setNTFSTime(QByteArray &extra, const QDateTime &time, int position,
|
||||||
|
|
|
||||||
|
|
@ -25,9 +25,9 @@ Original ZIP package is copyrighted by Gilles Vollant, see
|
||||||
quazip/(un)zip.h files for details, basically it's zlib license.
|
quazip/(un)zip.h files for details, basically it's zlib license.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#include <QDateTime>
|
#include <QtCore/QDateTime>
|
||||||
#include <QFile>
|
#include <QtCore/QFile>
|
||||||
#include <QString>
|
#include <QtCore/QString>
|
||||||
|
|
||||||
#include "quazip_global.h"
|
#include "quazip_global.h"
|
||||||
|
|
||||||
|
|
@ -70,7 +70,7 @@ struct QUAZIP_EXPORT QuaZipNewInfo {
|
||||||
*/
|
*/
|
||||||
quint32 externalAttr;
|
quint32 externalAttr;
|
||||||
/// File comment.
|
/// File comment.
|
||||||
/** Will be encoded using QuaZip::getCommentCodec().
|
/** Will be encoded in UTF-8 encoding.
|
||||||
**/
|
**/
|
||||||
QString comment;
|
QString comment;
|
||||||
/// File local extra field.
|
/// File local extra field.
|
||||||
|
|
@ -148,8 +148,9 @@ struct QUAZIP_EXPORT QuaZipNewInfo {
|
||||||
/**
|
/**
|
||||||
* If the file doesn't exist, a warning is printed to the stderr and nothing
|
* If the file doesn't exist, a warning is printed to the stderr and nothing
|
||||||
* is done. Otherwise, all three times, as reported by
|
* is done. Otherwise, all three times, as reported by
|
||||||
* QFileInfo::lastModified(), QFileInfo::lastRead() and QFileInfo::created(),
|
* QFileInfo::lastModified(), QFileInfo::lastRead() and
|
||||||
* are written to the NTFS extra field record.
|
* QFileInfo::birthTime() (>=Qt5.10) or QFileInfo::created(), are written to
|
||||||
|
* the NTFS extra field record.
|
||||||
*
|
*
|
||||||
* The NTFS record is written to
|
* The NTFS record is written to
|
||||||
* both the local and the global extra fields, updating the existing record
|
* both the local and the global extra fields, updating the existing record
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,8 @@
|
||||||
|
|
||||||
For more info read MiniZip_info.txt
|
For more info read MiniZip_info.txt
|
||||||
|
|
||||||
|
Modifications for static code analysis report
|
||||||
|
Copyright (C) 2016 Intel Deutschland GmbH
|
||||||
|
|
||||||
------------------------------------------------------------------------------------
|
------------------------------------------------------------------------------------
|
||||||
Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of
|
Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of
|
||||||
|
|
@ -28,7 +30,7 @@
|
||||||
If, for some reason, all these files are missing, the Info-ZIP license
|
If, for some reason, all these files are missing, the Info-ZIP license
|
||||||
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
||||||
|
|
||||||
crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h]
|
crypt.c (full version) by Info-ZIP. Last revised: [see minizip_crypt.h]
|
||||||
|
|
||||||
The encryption/decryption parts of this source code (as opposed to the
|
The encryption/decryption parts of this source code (as opposed to the
|
||||||
non-echoing password parts) were originally written in Europe. The
|
non-echoing password parts) were originally written in Europe. The
|
||||||
|
|
@ -71,7 +73,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "zlib.h"
|
#include <zlib.h>
|
||||||
#if (ZLIB_VERNUM < 0x1270)
|
#if (ZLIB_VERNUM < 0x1270)
|
||||||
typedef uLongf z_crc_t;
|
typedef uLongf z_crc_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -197,7 +199,7 @@ typedef struct
|
||||||
|
|
||||||
|
|
||||||
#ifndef NOUNCRYPT
|
#ifndef NOUNCRYPT
|
||||||
#include "crypt.h"
|
#include "minizip_crypt.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
|
|
@ -856,6 +858,17 @@ extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info
|
||||||
pglobal_info32->size_comment = s->gi.size_comment;
|
pglobal_info32->size_comment = s->gi.size_comment;
|
||||||
return UNZ_OK;
|
return UNZ_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern int ZEXPORT unzGetFileFlags (unzFile file, unsigned* pflags)
|
||||||
|
{
|
||||||
|
unz64_s* s;
|
||||||
|
if (file==NULL)
|
||||||
|
return UNZ_PARAMERROR;
|
||||||
|
s=(unz64_s*)file;
|
||||||
|
*pflags = s->flags;
|
||||||
|
return UNZ_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Translate date/time from Dos format to tm_unz (readable more easilty)
|
Translate date/time from Dos format to tm_unz (readable more easilty)
|
||||||
*/
|
*/
|
||||||
|
|
@ -1198,6 +1211,8 @@ extern int ZEXPORT unzGoToFirstFile (unzFile file)
|
||||||
&s->cur_file_info_internal,
|
&s->cur_file_info_internal,
|
||||||
NULL,0,NULL,0,NULL,0);
|
NULL,0,NULL,0,NULL,0);
|
||||||
s->current_file_ok = (err == UNZ_OK);
|
s->current_file_ok = (err == UNZ_OK);
|
||||||
|
if (s->cur_file_info.flag & UNZ_ENCODING_UTF8)
|
||||||
|
unzSetFlags(file, UNZ_ENCODING_UTF8);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1594,6 +1609,7 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method,
|
||||||
pfile_in_zip_read_info->stream_initialised=Z_DEFLATED;
|
pfile_in_zip_read_info->stream_initialised=Z_DEFLATED;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
TRYFREE(pfile_in_zip_read_info->read_buffer);
|
||||||
TRYFREE(pfile_in_zip_read_info);
|
TRYFREE(pfile_in_zip_read_info);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
@ -1845,38 +1861,30 @@ extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len)
|
||||||
} /* end Z_BZIP2ED */
|
} /* end Z_BZIP2ED */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ZPOS64_T uTotalOutBefore,uTotalOutAfter;
|
uInt uAvailOutBefore,uAvailOutAfter;
|
||||||
const Bytef *bufBefore;
|
const Bytef *bufBefore;
|
||||||
ZPOS64_T uOutThis;
|
uInt uOutThis;
|
||||||
int flush=Z_SYNC_FLUSH;
|
int flush=Z_SYNC_FLUSH;
|
||||||
|
|
||||||
uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
|
uAvailOutBefore = pfile_in_zip_read_info->stream.avail_out;
|
||||||
bufBefore = pfile_in_zip_read_info->stream.next_out;
|
bufBefore = pfile_in_zip_read_info->stream.next_out;
|
||||||
|
|
||||||
/*
|
|
||||||
if ((pfile_in_zip_read_info->rest_read_uncompressed ==
|
|
||||||
pfile_in_zip_read_info->stream.avail_out) &&
|
|
||||||
(pfile_in_zip_read_info->rest_read_compressed == 0))
|
|
||||||
flush = Z_FINISH;
|
|
||||||
*/
|
|
||||||
err=inflate(&pfile_in_zip_read_info->stream,flush);
|
err=inflate(&pfile_in_zip_read_info->stream,flush);
|
||||||
|
|
||||||
if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL))
|
if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL))
|
||||||
err = Z_DATA_ERROR;
|
err = Z_DATA_ERROR;
|
||||||
|
|
||||||
uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
|
uAvailOutAfter = pfile_in_zip_read_info->stream.avail_out;
|
||||||
uOutThis = uTotalOutAfter-uTotalOutBefore;
|
uOutThis = uAvailOutBefore - uAvailOutAfter;
|
||||||
|
|
||||||
pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
|
pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
|
||||||
|
|
||||||
pfile_in_zip_read_info->crc32 =
|
pfile_in_zip_read_info->crc32
|
||||||
crc32(pfile_in_zip_read_info->crc32,bufBefore,
|
= crc32(pfile_in_zip_read_info->crc32,bufBefore, uOutThis);
|
||||||
(uInt)(uOutThis));
|
|
||||||
|
|
||||||
pfile_in_zip_read_info->rest_read_uncompressed -=
|
pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis;
|
||||||
uOutThis;
|
|
||||||
|
|
||||||
iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
|
iRead += uAvailOutBefore - uAvailOutAfter;
|
||||||
|
|
||||||
if (err==Z_STREAM_END)
|
if (err==Z_STREAM_END)
|
||||||
return (iRead==0) ? UNZ_EOF : iRead;
|
return (iRead==0) ? UNZ_EOF : iRead;
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _ZLIB_H
|
#ifndef _ZLIB_H
|
||||||
#include "zlib.h"
|
#include <zlib.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _ZLIBIOAPI_H
|
#ifndef _ZLIBIOAPI_H
|
||||||
|
|
@ -87,6 +87,7 @@ typedef voidp unzFile;
|
||||||
|
|
||||||
#define UNZ_AUTO_CLOSE 0x01u
|
#define UNZ_AUTO_CLOSE 0x01u
|
||||||
#define UNZ_DEFAULT_FLAGS UNZ_AUTO_CLOSE
|
#define UNZ_DEFAULT_FLAGS UNZ_AUTO_CLOSE
|
||||||
|
#define UNZ_ENCODING_UTF8 0x0800u
|
||||||
|
|
||||||
/* tm_unz contain date/time info */
|
/* tm_unz contain date/time info */
|
||||||
typedef struct tm_unz_s
|
typedef struct tm_unz_s
|
||||||
|
|
@ -227,6 +228,8 @@ extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
|
||||||
|
|
||||||
extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file,
|
extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file,
|
||||||
unz_global_info64 *pglobal_info));
|
unz_global_info64 *pglobal_info));
|
||||||
|
|
||||||
|
extern int ZEXPORT unzGetFileFlags OF((unzFile file, unsigned* pflags));
|
||||||
/*
|
/*
|
||||||
Write info about the ZipFile in the *pglobal_info structure.
|
Write info about the ZipFile in the *pglobal_info structure.
|
||||||
No preparation of the structure is needed
|
No preparation of the structure is needed
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,9 @@
|
||||||
Modifications for QIODevice support and other QuaZIP fixes
|
Modifications for QIODevice support and other QuaZIP fixes
|
||||||
Copyright (C) 2005-2014 Sergey A. Tachenov
|
Copyright (C) 2005-2014 Sergey A. Tachenov
|
||||||
|
|
||||||
|
Fixing static code analysis issues
|
||||||
|
Copyright (C) 2016 Intel Deutschland GmbH
|
||||||
|
|
||||||
Changes
|
Changes
|
||||||
Oct-2009 - Mathias Svensson - Remove old C style function prototypes
|
Oct-2009 - Mathias Svensson - Remove old C style function prototypes
|
||||||
Oct-2009 - Mathias Svensson - Added Zip64 Support when creating new file archives
|
Oct-2009 - Mathias Svensson - Added Zip64 Support when creating new file archives
|
||||||
|
|
@ -29,7 +32,8 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "zlib.h"
|
|
||||||
|
#include <zlib.h>
|
||||||
#if (ZLIB_VERNUM < 0x1270)
|
#if (ZLIB_VERNUM < 0x1270)
|
||||||
typedef uLongf z_crc_t;
|
typedef uLongf z_crc_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -192,7 +196,7 @@ typedef struct
|
||||||
|
|
||||||
#ifndef NOCRYPT
|
#ifndef NOCRYPT
|
||||||
#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED
|
#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED
|
||||||
#include "crypt.h"
|
#include "minizip_crypt.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
local linkedlist_datablock_internal* allocate_new_datablock()
|
local linkedlist_datablock_internal* allocate_new_datablock()
|
||||||
|
|
@ -527,13 +531,14 @@ local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f
|
||||||
if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
|
if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
for (i=(int)uReadSize-3; (i--)>0;)
|
for (i=(int)uReadSize-3; (i--)>0;){
|
||||||
if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
|
if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
|
||||||
((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
|
((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
|
||||||
{
|
{
|
||||||
uPosFound = uReadPos+i;
|
uPosFound = uReadPos+i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (uPosFound!=0)
|
if (uPosFound!=0)
|
||||||
break;
|
break;
|
||||||
|
|
@ -988,7 +993,9 @@ int Write_LocalFileHeader(zip64_internal* zi, const char* filename,
|
||||||
|
|
||||||
if (err==ZIP_OK)
|
if (err==ZIP_OK)
|
||||||
{
|
{
|
||||||
if(zi->ci.zip64)
|
if(zi->ci.flag & ZIP_ENCODING_UTF8)
|
||||||
|
err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)63,2);/* Version 6.3 is required for Unicode support */
|
||||||
|
else if(zi->ci.zip64)
|
||||||
err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);/* version needed to extract */
|
err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);/* version needed to extract */
|
||||||
else
|
else
|
||||||
err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)version_to_extract,2);
|
err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)version_to_extract,2);
|
||||||
|
|
@ -1146,6 +1153,8 @@ extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename,
|
||||||
}
|
}
|
||||||
|
|
||||||
zi->ci.flag = flagBase;
|
zi->ci.flag = flagBase;
|
||||||
|
if (zi->flags & ZIP_ENCODING_UTF8)
|
||||||
|
zi->ci.flag |= ZIP_ENCODING_UTF8;
|
||||||
if ((level==8) || (level==9))
|
if ((level==8) || (level==9))
|
||||||
zi->ci.flag |= 2;
|
zi->ci.flag |= 2;
|
||||||
if (level==2)
|
if (level==2)
|
||||||
|
|
@ -1171,6 +1180,9 @@ extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename,
|
||||||
zi->ci.size_centralExtraFree = 32; /* Extra space we have reserved in case we need to add ZIP64 extra info data */
|
zi->ci.size_centralExtraFree = 32; /* Extra space we have reserved in case we need to add ZIP64 extra info data */
|
||||||
|
|
||||||
zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader + zi->ci.size_centralExtraFree);
|
zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader + zi->ci.size_centralExtraFree);
|
||||||
|
if(!zi->ci.central_header) {
|
||||||
|
return (Z_MEM_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
zi->ci.size_centralExtra = size_extrafield_global;
|
zi->ci.size_centralExtra = size_extrafield_global;
|
||||||
zip64local_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4);
|
zip64local_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4);
|
||||||
|
|
@ -1509,15 +1521,9 @@ extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned in
|
||||||
|
|
||||||
if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
|
if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
|
||||||
{
|
{
|
||||||
uLong uTotalOutBefore = zi->ci.stream.total_out;
|
uInt uAvailOutBefore = zi->ci.stream.avail_out;
|
||||||
err=deflate(&zi->ci.stream, Z_NO_FLUSH);
|
err=deflate(&zi->ci.stream, Z_NO_FLUSH);
|
||||||
if(uTotalOutBefore > zi->ci.stream.total_out)
|
zi->ci.pos_in_buffered_data += uAvailOutBefore - zi->ci.stream.avail_out;
|
||||||
{
|
|
||||||
int bBreak = 0;
|
|
||||||
bBreak++;
|
|
||||||
}
|
|
||||||
|
|
||||||
zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -1571,7 +1577,7 @@ extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_s
|
||||||
{
|
{
|
||||||
while (err==ZIP_OK)
|
while (err==ZIP_OK)
|
||||||
{
|
{
|
||||||
uLong uTotalOutBefore;
|
uLong uAvailOutBefore;
|
||||||
if (zi->ci.stream.avail_out == 0)
|
if (zi->ci.stream.avail_out == 0)
|
||||||
{
|
{
|
||||||
if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
|
if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
|
||||||
|
|
@ -1579,9 +1585,9 @@ extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_s
|
||||||
zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
|
zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
|
||||||
zi->ci.stream.next_out = zi->ci.buffered_data;
|
zi->ci.stream.next_out = zi->ci.buffered_data;
|
||||||
}
|
}
|
||||||
uTotalOutBefore = zi->ci.stream.total_out;
|
uAvailOutBefore = zi->ci.stream.avail_out;
|
||||||
err=deflate(&zi->ci.stream, Z_FINISH);
|
err=deflate(&zi->ci.stream, Z_FINISH);
|
||||||
zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
|
zi->ci.pos_in_buffered_data += uAvailOutBefore - zi->ci.stream.avail_out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw))
|
else if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw))
|
||||||
|
|
@ -1654,8 +1660,7 @@ extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_s
|
||||||
/*version Made by*/
|
/*version Made by*/
|
||||||
zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)45,2);
|
zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)45,2);
|
||||||
/*version needed*/
|
/*version needed*/
|
||||||
zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)45,2);
|
zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)((zi->ci.flag & ZIP_ENCODING_UTF8) ? 63 : 45),2);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
zip64local_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/
|
zip64local_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/
|
||||||
|
|
@ -1737,7 +1742,7 @@ extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_s
|
||||||
if (err==ZIP_OK)
|
if (err==ZIP_OK)
|
||||||
err = add_data_in_datablock(&zi->central_dir, zi->ci.central_header, (uLong)zi->ci.size_centralheader);
|
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)
|
if (err==ZIP_OK)
|
||||||
{
|
{
|
||||||
|
|
@ -1849,7 +1854,7 @@ int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centra
|
||||||
err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);
|
err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);
|
||||||
|
|
||||||
if (err==ZIP_OK) /* version needed */
|
if (err==ZIP_OK) /* version needed */
|
||||||
err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);
|
err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)((zi->ci.flag & ZIP_ENCODING_UTF8) ? 63 : 45),2);
|
||||||
|
|
||||||
if (err==ZIP_OK) /* number of this disk */
|
if (err==ZIP_OK) /* number of this disk */
|
||||||
err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4);
|
err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4);
|
||||||
|
|
@ -2031,6 +2036,9 @@ extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHe
|
||||||
return ZIP_PARAMERROR;
|
return ZIP_PARAMERROR;
|
||||||
|
|
||||||
pNewHeader = (char*)ALLOC(*dataLen);
|
pNewHeader = (char*)ALLOC(*dataLen);
|
||||||
|
if(!pNewHeader) {
|
||||||
|
return Z_MEM_ERROR;
|
||||||
|
}
|
||||||
pTmp = pNewHeader;
|
pTmp = pNewHeader;
|
||||||
|
|
||||||
while(p < (pData + *dataLen))
|
while(p < (pData + *dataLen))
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ extern "C" {
|
||||||
//#define HAVE_BZIP2
|
//#define HAVE_BZIP2
|
||||||
|
|
||||||
#ifndef _ZLIB_H
|
#ifndef _ZLIB_H
|
||||||
#include "zlib.h"
|
#include <zlib.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _ZLIBIOAPI_H
|
#ifndef _ZLIBIOAPI_H
|
||||||
|
|
@ -85,6 +85,7 @@ typedef voidp zipFile;
|
||||||
#define ZIP_WRITE_DATA_DESCRIPTOR 0x8u
|
#define ZIP_WRITE_DATA_DESCRIPTOR 0x8u
|
||||||
#define ZIP_AUTO_CLOSE 0x1u
|
#define ZIP_AUTO_CLOSE 0x1u
|
||||||
#define ZIP_SEQUENTIAL 0x2u
|
#define ZIP_SEQUENTIAL 0x2u
|
||||||
|
#define ZIP_ENCODING_UTF8 0x0800u
|
||||||
#define ZIP_DEFAULT_FLAGS (ZIP_AUTO_CLOSE | ZIP_WRITE_DATA_DESCRIPTOR)
|
#define ZIP_DEFAULT_FLAGS (ZIP_AUTO_CLOSE | ZIP_WRITE_DATA_DESCRIPTOR)
|
||||||
|
|
||||||
#ifndef DEF_MEM_LEVEL
|
#ifndef DEF_MEM_LEVEL
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue