123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 | // 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 QFILESYSTEMENGINE_P_H#define QFILESYSTEMENGINE_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"qfile.h"#include"qfilesystementry_p.h"#include"qfilesystemmetadata_p.h"#include <QtCore/private/qsystemerror_p.h>#include <memory>#include <optional> QT_BEGIN_NAMESPACE #define Q_RETURN_ON_INVALID_FILENAME(message, result) \ { \ qWarning(message); \ errno = EINVAL; \ return (result); \ }inlineboolqIsFilenameBroken(const QByteArray &name){return name.contains('\0');}inlineboolqIsFilenameBroken(const QString &name){return name.contains(QLatin1Char('\0'));}inlineboolqIsFilenameBroken(const QFileSystemEntry &entry){returnqIsFilenameBroken(entry.nativeFilePath());}#define Q_CHECK_FILE_NAME(name, result) \ do { \ if (Q_UNLIKELY((name).isEmpty())) \ Q_RETURN_ON_INVALID_FILENAME("Empty filename passed to function", (result)); \ if (Q_UNLIKELY(qIsFilenameBroken(name))) \ Q_RETURN_ON_INVALID_FILENAME("Broken filename passed to function", (result)); \ } while (false) Q_CORE_EXPORT boolqt_isCaseSensitive(const QFileSystemEntry &entry, QFileSystemMetaData &data);class Q_AUTOTEST_EXPORT QFileSystemEngine {public:using TriStateResult =QAbstractFileEngine::TriStateResult;static boolisCaseSensitive(const QFileSystemEntry &entry, QFileSystemMetaData &data);static QFileSystemEntry getLinkTarget(const QFileSystemEntry &link, QFileSystemMetaData &data);static QFileSystemEntry getRawLinkPath(const QFileSystemEntry &link, QFileSystemMetaData &data);static QFileSystemEntry getJunctionTarget(const QFileSystemEntry &link, QFileSystemMetaData &data);static QFileSystemEntry canonicalName(const QFileSystemEntry &entry, QFileSystemMetaData &data);static QFileSystemEntry absoluteName(const QFileSystemEntry &entry);static QByteArray id(const QFileSystemEntry &entry);static QString resolveUserName(const QFileSystemEntry &entry, QFileSystemMetaData &data);static QString resolveGroupName(const QFileSystemEntry &entry, QFileSystemMetaData &data);#if defined(Q_OS_UNIX)static QString resolveUserName(uint userId);static QString resolveGroupName(uint groupId);#endif#if defined(Q_OS_DARWIN)static QString bundleName(const QFileSystemEntry &entry);#elsestatic QString bundleName(const QFileSystemEntry &) {returnQString(); }#endifstatic boolfillMetaData(const QFileSystemEntry &entry, QFileSystemMetaData &data,QFileSystemMetaData::MetaDataFlags what);#if defined(Q_OS_UNIX)static TriStateResult cloneFile(int srcfd,int dstfd,const QFileSystemMetaData &knownData);static boolfillMetaData(int fd, QFileSystemMetaData &data);// what = PosixStatFlagsstatic QByteArray id(int fd);static boolsetFileTime(int fd,const QDateTime &newDate,QFile::FileTime whatTime, QSystemError &error);static boolsetPermissions(int fd,QFile::Permissions permissions, QSystemError &error);#endif#if defined(Q_OS_WIN)static QFileSystemEntry junctionTarget(const QFileSystemEntry &link, QFileSystemMetaData &data);static booluncListSharesOnServer(const QString &server, QStringList *list);//Used also by QFSFileEngineIterator::hasNext()static boolfillMetaData(int fd, QFileSystemMetaData &data,QFileSystemMetaData::MetaDataFlags what);static boolfillMetaData(HANDLE fHandle, QFileSystemMetaData &data,QFileSystemMetaData::MetaDataFlags what);static boolfillPermissions(const QFileSystemEntry &entry, QFileSystemMetaData &data,QFileSystemMetaData::MetaDataFlags what);static QByteArray id(HANDLE fHandle);static boolsetFileTime(HANDLE fHandle,const QDateTime &newDate,QFile::FileTime whatTime, QSystemError &error);static QString owner(const QFileSystemEntry &entry,QAbstractFileEngine::FileOwner own);static QString nativeAbsoluteFilePath(const QString &path);static boolisDirPath(const QString &path,bool*existed);#endif//homePath, rootPath and tempPath shall return clean pathsstatic QString homePath();static QString rootPath();static QString tempPath();static boolcreateDirectory(const QFileSystemEntry &entry,bool createParents,std::optional<QFile::Permissions> permissions =std::nullopt){if(createParents)returnmkpath(entry, permissions);returnmkdir(entry, permissions);}static boolmkdir(const QFileSystemEntry &entry,std::optional<QFile::Permissions> permissions =std::nullopt);static boolmkpath(const QFileSystemEntry &entry,std::optional<QFile::Permissions> permissions =std::nullopt);static boolremoveDirectory(const QFileSystemEntry &entry,bool removeEmptyParents){if(removeEmptyParents)returnrmpath(entry);returnrmdir(entry);}static boolrmdir(const QFileSystemEntry &entry);static boolrmpath(const QFileSystemEntry &entry);static boolcreateLink(const QFileSystemEntry &source,const QFileSystemEntry &target, QSystemError &error);static boolcopyFile(const QFileSystemEntry &source,const QFileSystemEntry &target, QSystemError &error);static boolsupportsMoveFileToTrash();static boolmoveFileToTrash(const QFileSystemEntry &source, QFileSystemEntry &newLocation, QSystemError &error);static boolrenameFile(const QFileSystemEntry &source,const QFileSystemEntry &target, QSystemError &error);static boolrenameOverwriteFile(const QFileSystemEntry &source,const QFileSystemEntry &target, QSystemError &error);static boolremoveFile(const QFileSystemEntry &entry, QSystemError &error);static boolsetPermissions(const QFileSystemEntry &entry,QFile::Permissions permissions, QSystemError &error);// unused, therefore not implementedstatic boolsetFileTime(const QFileSystemEntry &entry,const QDateTime &newDate,QFile::FileTime whatTime, QSystemError &error);static boolsetCurrentPath(const QFileSystemEntry &entry);static QFileSystemEntry currentPath();staticstd::unique_ptr<QAbstractFileEngine>createLegacyEngine(QFileSystemEntry &entry, QFileSystemMetaData &data);private:static QString slowCanonicalized(const QString &path);#if defined(Q_OS_WIN)static voidclearWinStatData(QFileSystemMetaData &data);#endif}; QT_END_NAMESPACE #endif// include guard
|