summaryrefslogtreecommitdiffstats
path: root/src/corelib/io/qfilesystemmetadata_p.h
blob: 3b17ae7d0beea2d6df1e06c82537b1459331bbcd (plain)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
// Copyright (C) 2016 The Qt Company Ltd.// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only#ifndef QFILESYSTEMMETADATA_P_H#define QFILESYSTEMMETADATA_P_H//// W A R N I N G// -------------//// This file is not part of the Qt API. It exists purely as an// implementation detail. This header file may change from version to// version without notice, or even be removed.//// We mean it.//#include"qplatformdefs.h"#include <QtCore/qglobal.h>#include <QtCore/qdatetime.h>#include <QtCore/qtimezone.h>#include <QtCore/private/qabstractfileengine_p.h>// Platform-specific includes#ifdef Q_OS_WIN# include <QtCore/qt_windows.h># ifndef IO_REPARSE_TAG_SYMLINK# define IO_REPARSE_TAG_SYMLINK (0xA000000CL)# endif#endif#ifdef Q_OS_UNIXstruct statx;#endif QT_BEGIN_NAMESPACE class QFileSystemEngine;class Q_AUTOTEST_EXPORT QFileSystemMetaData {public:QFileSystemMetaData():size_(-1){}enum MetaDataFlag {// Permissions, overlaps with QFile::Permissions OtherReadPermission =0x00000004, OtherWritePermission =0x00000002, OtherExecutePermission =0x00000001, GroupReadPermission =0x00000040, GroupWritePermission =0x00000020, GroupExecutePermission =0x00000010, UserReadPermission =0x00000400, UserWritePermission =0x00000200, UserExecutePermission =0x00000100, OwnerReadPermission =0x00004000, OwnerWritePermission =0x00002000, OwnerExecutePermission =0x00001000, OtherPermissions = OtherReadPermission | OtherWritePermission | OtherExecutePermission, GroupPermissions = GroupReadPermission | GroupWritePermission | GroupExecutePermission, UserPermissions = UserReadPermission | UserWritePermission | UserExecutePermission, OwnerPermissions = OwnerReadPermission | OwnerWritePermission | OwnerExecutePermission, ReadPermissions = OtherReadPermission | GroupReadPermission | UserReadPermission | OwnerReadPermission, WritePermissions = OtherWritePermission | GroupWritePermission | UserWritePermission | OwnerWritePermission, ExecutePermissions = OtherExecutePermission | GroupExecutePermission | UserExecutePermission | OwnerExecutePermission, Permissions = OtherPermissions | GroupPermissions | UserPermissions | OwnerPermissions,// Type LinkType =0x00010000, FileType =0x00020000, DirectoryType =0x00040000,#if defined(Q_OS_DARWIN) BundleType =0x00080000, AliasType =0x08000000,#else BundleType =0x0, AliasType =0x0,#endif#if defined(Q_OS_WIN) JunctionType =0x04000000, WinLnkType =0x08000000,// Note: Uses the same position for AliasType on Mac#else JunctionType =0x0, WinLnkType =0x0,#endif SequentialType =0x00800000,// Note: overlaps with QAbstractFileEngine::RootFlag LegacyLinkType = LinkType | AliasType | WinLnkType, Type = LinkType | FileType | DirectoryType | BundleType | SequentialType | AliasType,// Attributes HiddenAttribute =0x00100000, SizeAttribute =0x00200000,// Note: overlaps with QAbstractFileEngine::LocalDiskFlag ExistsAttribute =0x00400000,// For historical reasons, indicates existence of data, not the file#if defined(Q_OS_WIN) WasDeletedAttribute =0x0,#else WasDeletedAttribute =0x40000000,// Indicates the file was deleted#endif Attributes = HiddenAttribute | SizeAttribute | ExistsAttribute | WasDeletedAttribute,// Times - if we know one of them, we know them all AccessTime =0x02000000, BirthTime =0x02000000, MetadataChangeTime =0x02000000, ModificationTime =0x02000000, Times = AccessTime | BirthTime | MetadataChangeTime | ModificationTime,// Owner IDs UserId =0x10000000, GroupId =0x20000000, CaseSensitive =0x80000000, OwnerIds = UserId | GroupId, PosixStatFlags = OtherPermissions | GroupPermissions | OwnerPermissions | FileType | DirectoryType | SequentialType | SizeAttribute | WasDeletedAttribute | Times | OwnerIds,#if defined(Q_OS_WIN) WinStatFlags = FileType | DirectoryType | HiddenAttribute | ExistsAttribute | SizeAttribute | Times,#endif AllMetaDataFlags =0xFFFFFFFF};Q_DECLARE_FLAGS(MetaDataFlags, MetaDataFlag)boolhasFlags(MetaDataFlags flags)const{return((knownFlagsMask & flags) == flags);} MetaDataFlags missingFlags(MetaDataFlags flags){return flags & ~knownFlagsMask;}voidclear(){ knownFlagsMask = {};}voidclearFlags(MetaDataFlags flags = AllMetaDataFlags){ knownFlagsMask &= ~flags;}boolexists()const{return entryFlags.testAnyFlag(ExistsAttribute); }boolisLink()const{return entryFlags.testAnyFlag(LinkType); }boolisFile()const{return entryFlags.testAnyFlag(FileType); }boolisDirectory()const{return entryFlags.testAnyFlag(DirectoryType); }boolisBundle()const;boolisAlias()const;boolisLegacyLink()const{return entryFlags.testAnyFlag(LegacyLinkType); }boolisSequential()const{return entryFlags.testAnyFlag(SequentialType); }boolisHidden()const{return entryFlags.testAnyFlag(HiddenAttribute); }boolwasDeleted()const{return entryFlags.testAnyFlag(WasDeletedAttribute); }#if defined(Q_OS_WIN)boolisLnkFile()const{return entryFlags.testAnyFlag(WinLnkType); }boolisJunction()const{return entryFlags.testAnyFlag(JunctionType); }#elseboolisLnkFile()const{return false; }boolisJunction()const{return false; }#endif qint64 size()const{return size_; }inline QFile::Permissions permissions()const;// Has to be defined after the// Q_DECLARE_OPERATORS_FOR_FLAGS(QFileSystemMetaData::MetaDataFlags) call below.inlinevoidsetPermissions(QFile::Permissions permissions); QDateTime accessTime()const; QDateTime birthTime()const; QDateTime metadataChangeTime()const; QDateTime modificationTime()const; QDateTime fileTime(QFile::FileTime time)const; uint userId()const; uint groupId()const; uint ownerId(QAbstractFileEngine::FileOwner owner)const;boolisReadable()const{returnpermissions().testAnyFlags(QFile::ReadUser); }boolisWritable()const{returnpermissions().testAnyFlags(QFile::WriteUser); }boolisExecutable()const{returnpermissions().testAnyFlags(QFile::ExeUser); }#ifdef Q_OS_UNIXvoidfillFromStatxBuf(const struct statx &statBuffer);voidfillFromStatBuf(const QT_STATBUF &statBuffer);voidfillFromDirEnt(const QT_DIRENT &statBuffer);#endif#if defined(Q_OS_WIN)inlinevoidfillFromFileAttribute(DWORD fileAttribute,bool isDriveRoot =false);inlinevoidfillFromFindData(WIN32_FIND_DATA &findData,bool setLinkType =false,bool isDriveRoot =false);inlinevoidfillFromFindInfo(BY_HANDLE_FILE_INFORMATION &fileInfo);#endifprivate:friend class QFileSystemEngine; MetaDataFlags knownFlagsMask; MetaDataFlags entryFlags; qint64 size_ =0;// Platform-specific data goes here:#if defined(Q_OS_WIN) DWORD fileAttribute_; FILETIME birthTime_; FILETIME changeTime_; FILETIME lastAccessTime_; FILETIME lastWriteTime_;#else// msec precision qint64 accessTime_ =0; qint64 birthTime_ =0; qint64 metadataChangeTime_ =0; qint64 modificationTime_ =0; uint userId_ = (uint) -2; uint groupId_ = (uint) -2;#endif};Q_DECLARE_OPERATORS_FOR_FLAGS(QFileSystemMetaData::MetaDataFlags)inline QFile::Permissions QFileSystemMetaData::permissions()const{returnQFile::Permissions::fromInt((Permissions & entryFlags).toInt()); }voidQFileSystemMetaData::setPermissions(QFile::Permissions permissions){ entryFlags &= ~Permissions; entryFlags |=MetaDataFlag(uint(permissions.toInt())); knownFlagsMask |= Permissions;}#if defined(Q_OS_DARWIN)inlineboolQFileSystemMetaData::isBundle()const{return entryFlags.testAnyFlag(BundleType); }inlineboolQFileSystemMetaData::isAlias()const{return entryFlags.testAnyFlag(AliasType); }#elseinlineboolQFileSystemMetaData::isBundle()const{return false; }inlineboolQFileSystemMetaData::isAlias()const{return false; }#endif#if defined(Q_OS_UNIX) || defined (Q_OS_WIN)inline QDateTime QFileSystemMetaData::fileTime(QFile::FileTime time)const{switch(time) {caseQFile::FileModificationTime:returnmodificationTime();caseQFile::FileAccessTime:returnaccessTime();caseQFile::FileBirthTime:returnbirthTime();caseQFile::FileMetadataChangeTime:returnmetadataChangeTime();}returnQDateTime();}#endif#if defined(Q_OS_UNIX)inline QDateTime QFileSystemMetaData::birthTime()const{return birthTime_ ?QDateTime::fromMSecsSinceEpoch(birthTime_,QTimeZone::UTC):QDateTime();}inline QDateTime QFileSystemMetaData::metadataChangeTime()const{return metadataChangeTime_ ?QDateTime::fromMSecsSinceEpoch(metadataChangeTime_,QTimeZone::UTC):QDateTime();}inline QDateTime QFileSystemMetaData::modificationTime()const{return modificationTime_ ?QDateTime::fromMSecsSinceEpoch(modificationTime_,QTimeZone::UTC):QDateTime();}inline QDateTime QFileSystemMetaData::accessTime()const{return accessTime_ ?QDateTime::fromMSecsSinceEpoch(accessTime_,QTimeZone::UTC):QDateTime();}inline uint QFileSystemMetaData::userId()const{return userId_; }inline uint QFileSystemMetaData::groupId()const{return groupId_; }inline uint QFileSystemMetaData::ownerId(QAbstractFileEngine::FileOwner owner)const{if(owner ==QAbstractFileEngine::OwnerUser)returnuserId();elsereturngroupId();}#endif#if defined(Q_OS_WIN)inline uint QFileSystemMetaData::userId()const{return(uint) -2; }inline uint QFileSystemMetaData::groupId()const{return(uint) -2; }inline uint QFileSystemMetaData::ownerId(QAbstractFileEngine::FileOwner owner)const{if(owner ==QAbstractFileEngine::OwnerUser)returnuserId();elsereturngroupId();}inlinevoidQFileSystemMetaData::fillFromFileAttribute(DWORD fileAttribute,bool isDriveRoot){ fileAttribute_ = fileAttribute;// Ignore the hidden attribute for drives.if(!isDriveRoot && (fileAttribute_ & FILE_ATTRIBUTE_HIDDEN)) entryFlags |= HiddenAttribute; entryFlags |= ((fileAttribute & FILE_ATTRIBUTE_DIRECTORY) ? DirectoryType: FileType); entryFlags |= ExistsAttribute; knownFlagsMask |= FileType | DirectoryType | HiddenAttribute | ExistsAttribute;// this function is never called for a .lnk file knownFlagsMask |= WinLnkType;}inlinevoidQFileSystemMetaData::fillFromFindData(WIN32_FIND_DATA &findData,bool setLinkType,bool isDriveRoot){fillFromFileAttribute(findData.dwFileAttributes, isDriveRoot); birthTime_ = findData.ftCreationTime; lastAccessTime_ = findData.ftLastAccessTime; changeTime_ = lastWriteTime_ = findData.ftLastWriteTime;if(fileAttribute_ & FILE_ATTRIBUTE_DIRECTORY) { size_ =0;}else{ size_ = findData.nFileSizeHigh; size_ <<=32; size_ += findData.nFileSizeLow;} knownFlagsMask |= Times | SizeAttribute;if(setLinkType) { knownFlagsMask |= LinkType; entryFlags &= ~LinkType;if(fileAttribute_ & FILE_ATTRIBUTE_REPARSE_POINT) {if(findData.dwReserved0 == IO_REPARSE_TAG_SYMLINK) { entryFlags |= LinkType;#if defined(IO_REPARSE_TAG_MOUNT_POINT)}else if((fileAttribute_ & FILE_ATTRIBUTE_DIRECTORY)&& (findData.dwReserved0 == IO_REPARSE_TAG_MOUNT_POINT)) { entryFlags |= JunctionType;#endif}}}}inlinevoidQFileSystemMetaData::fillFromFindInfo(BY_HANDLE_FILE_INFORMATION &fileInfo){fillFromFileAttribute(fileInfo.dwFileAttributes); birthTime_ = fileInfo.ftCreationTime; lastAccessTime_ = fileInfo.ftLastAccessTime; changeTime_ = lastWriteTime_ = fileInfo.ftLastWriteTime;if(fileAttribute_ & FILE_ATTRIBUTE_DIRECTORY) { size_ =0;}else{ size_ = fileInfo.nFileSizeHigh; size_ <<=32; size_ += fileInfo.nFileSizeLow;} knownFlagsMask |= Times | SizeAttribute;}#endif// Q_OS_WIN QT_END_NAMESPACE #endif// include guard
close