diff options
Diffstat (limited to 'src/gui/text/qzip.cpp')
-rw-r--r-- | src/gui/text/qzip.cpp | 83 |
1 files changed, 27 insertions, 56 deletions
diff --git a/src/gui/text/qzip.cpp b/src/gui/text/qzip.cpp index 1d621db0e6..31ef8f87be 100644 --- a/src/gui/text/qzip.cpp +++ b/src/gui/text/qzip.cpp @@ -243,11 +243,11 @@ static QFile::Permissions modeToPermissions(quint32 mode) static quint32 permissionsToMode(QFile::Permissions perms) { quint32 mode = 0; - if (mode & (QFile::ReadOwner | QFile::ReadUser)) + if (perms & (QFile::ReadOwner | QFile::ReadUser)) mode |= UnixFileAttributes::ReadUser; - if (mode & (QFile::WriteOwner | QFile::WriteUser)) + if (perms & (QFile::WriteOwner | QFile::WriteUser)) mode |= UnixFileAttributes::WriteUser; - if (mode & (QFile::ExeOwner | QFile::ExeUser)) + if (perms & (QFile::ExeOwner | QFile::ExeUser)) mode |= UnixFileAttributes::WriteUser; if (perms & QFile::ReadGroup) mode |= UnixFileAttributes::ReadGroup; @@ -303,6 +303,7 @@ enum HostOS { HostOS400 = 18, HostOSX = 19 }; +Q_DECLARE_TYPEINFO(HostOS, Q_PRIMITIVE_TYPE); enum GeneralPurposeFlag { Encrypted = 0x01, @@ -314,6 +315,7 @@ enum GeneralPurposeFlag { Utf8Names = 0x0800, CentralDirectoryEncrypted = 0x2000 }; +Q_DECLARE_TYPEINFO(GeneralPurposeFlag, Q_PRIMITIVE_TYPE); enum CompressionMethod { CompressionMethodStored = 0, @@ -340,6 +342,7 @@ enum CompressionMethod { CompressionMethodPPMd = 98, CompressionMethodWzAES = 99 }; +Q_DECLARE_TYPEINFO(CompressionMethod, Q_PRIMITIVE_TYPE); struct LocalFileHeader { @@ -354,6 +357,7 @@ struct LocalFileHeader uchar file_name_length[2]; uchar extra_field_length[2]; }; +Q_DECLARE_TYPEINFO(LocalFileHeader, Q_PRIMITIVE_TYPE); struct DataDescriptor { @@ -361,6 +365,7 @@ struct DataDescriptor uchar compressed_size[4]; uchar uncompressed_size[4]; }; +Q_DECLARE_TYPEINFO(DataDescriptor, Q_PRIMITIVE_TYPE); struct CentralFileHeader { @@ -382,6 +387,7 @@ struct CentralFileHeader uchar offset_local_header[4]; LocalFileHeader toLocalHeader() const; }; +Q_DECLARE_TYPEINFO(CentralFileHeader, Q_PRIMITIVE_TYPE); struct EndOfDirectory { @@ -394,6 +400,7 @@ struct EndOfDirectory uchar dir_start_offset[4]; uchar comment_length[2]; }; +Q_DECLARE_TYPEINFO(EndOfDirectory, Q_PRIMITIVE_TYPE); struct FileHeader { @@ -402,38 +409,7 @@ struct FileHeader QByteArray extra_field; QByteArray file_comment; }; - -QZipReader::FileInfo::FileInfo() - : isDir(false), isFile(false), isSymLink(false), crc(0), size(0) -{ -} - -QZipReader::FileInfo::~FileInfo() -{ -} - -QZipReader::FileInfo::FileInfo(const FileInfo &other) -{ - operator=(other); -} - -QZipReader::FileInfo& QZipReader::FileInfo::operator=(const FileInfo &other) -{ - filePath = other.filePath; - isDir = other.isDir; - isFile = other.isFile; - isSymLink = other.isSymLink; - permissions = other.permissions; - crc = other.crc; - size = other.size; - lastModified = other.lastModified; - return *this; -} - -bool QZipReader::FileInfo::isValid() const -{ - return isDir || isFile || isSymLink; -} +Q_DECLARE_TYPEINFO(FileHeader, Q_MOVABLE_TYPE); class QZipPrivate { @@ -449,18 +425,19 @@ public: delete device; } - void fillFileInfo(int index, QZipReader::FileInfo &fileInfo) const; + QZipReader::FileInfo fillFileInfo(int index) const; QIODevice *device; bool ownDevice; bool dirtyFileTree; - QList<FileHeader> fileHeaders; + QVector<FileHeader> fileHeaders; QByteArray comment; uint start_of_directory; }; -void QZipPrivate::fillFileInfo(int index, QZipReader::FileInfo &fileInfo) const +QZipReader::FileInfo QZipPrivate::fillFileInfo(int index) const { + QZipReader::FileInfo fileInfo; FileHeader header = fileHeaders.at(index); quint32 mode = readUInt(header.h.external_file_attributes); const HostOS hostOS = HostOS(readUShort(header.h.version_made) >> 8); @@ -502,7 +479,7 @@ void QZipPrivate::fillFileInfo(int index, QZipReader::FileInfo &fileInfo) const break; default: qWarning("QZip: Zip entry format at %d is not supported.", index); - return; // we don't support anything else + return fileInfo; // we don't support anything else } ushort general_purpose_bits = readUShort(header.h.general_purpose_bits); @@ -519,6 +496,8 @@ void QZipPrivate::fillFileInfo(int index, QZipReader::FileInfo &fileInfo) const fileInfo.filePath = fileInfo.filePath.mid(1); while (!fileInfo.filePath.isEmpty() && fileInfo.filePath.at(fileInfo.filePath.size() - 1) == QLatin1Char('/')) fileInfo.filePath.chop(1); + + return fileInfo; } class QZipReaderPrivate : public QZipPrivate @@ -816,12 +795,6 @@ void QZipWriterPrivate::addEntry(EntryType type, const QString &fileName, const */ /*! - \variable FileInfo::d - \internal - private pointer. -*/ - -/*! \class QZipReader \internal \since 4.5 @@ -913,15 +886,14 @@ bool QZipReader::exists() const /*! Returns the list of files the archive contains. */ -QList<QZipReader::FileInfo> QZipReader::fileInfoList() const +QVector<QZipReader::FileInfo> QZipReader::fileInfoList() const { d->scanFiles(); - QList<QZipReader::FileInfo> files; - for (int i = 0; i < d->fileHeaders.size(); ++i) { - QZipReader::FileInfo fi; - d->fillFileInfo(i, fi); - files.append(fi); - } + QVector<FileInfo> files; + const int numFileHeaders = d->fileHeaders.size(); + files.reserve(numFileHeaders); + for (int i = 0; i < numFileHeaders; ++i) + files.append(d->fillFileInfo(i)); return files; } @@ -945,10 +917,9 @@ int QZipReader::count() const QZipReader::FileInfo QZipReader::entryInfoAt(int index) const { d->scanFiles(); - QZipReader::FileInfo fi; if (index >= 0 && index < d->fileHeaders.count()) - d->fillFileInfo(index, fi); - return fi; + return d->fillFileInfo(index); + return QZipReader::FileInfo(); } /*! @@ -1044,7 +1015,7 @@ bool QZipReader::extractAll(const QString &destinationDir) const QDir baseDir(destinationDir); // create directories first - QList<FileInfo> allFiles = fileInfoList(); + const QVector<FileInfo> allFiles = fileInfoList(); foreach (const FileInfo &fi, allFiles) { const QString absPath = destinationDir + QDir::separator() + fi.filePath; if (fi.isDir) { |