// Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #pragma once #include "hostosinfo.h" #include "utils_global.h" #include "filepath.h" class tst_unixdevicefileaccess; // For testing. namespace Utils { class CommandLine; class RunResult; class TextEncoding; // Base class including dummy implementation usable as fallback. class QTCREATOR_UTILS_EXPORT DeviceFileAccess : public std::enable_shared_from_this { public: DeviceFileAccess(); virtual ~DeviceFileAccess(); virtual Result deviceEnvironment() const; protected: friend class FilePath; friend class ::tst_unixdevicefileaccess; // For testing. virtual QString mapToDevicePath(const QString &hostPath) const; virtual Result isExecutableFile(const FilePath &filePath) const; virtual Result isReadableFile(const FilePath &filePath) const; virtual Result isWritableFile(const FilePath &filePath) const; virtual Result isReadableDirectory(const FilePath &filePath) const; virtual Result isWritableDirectory(const FilePath &filePath) const; virtual Result isFile(const FilePath &filePath) const; virtual Result isDirectory(const FilePath &filePath) const; virtual Result isSymLink(const FilePath &filePath) const; virtual Result hasHardLinks(const FilePath &filePath) const; virtual Result<> ensureWritableDirectory(const FilePath &filePath) const; virtual Result<> ensureExistingFile(const FilePath &filePath) const; virtual Result<> createDirectory(const FilePath &filePath) const; virtual Result exists(const FilePath &filePath) const; virtual Result<> removeFile(const FilePath &filePath) const; virtual Result<> removeRecursively(const FilePath &filePath) const; virtual Result<> copyFile(const FilePath &filePath, const FilePath &target) const; virtual Result<> createSymLink(const FilePath &filePath, const FilePath &symLink) const; virtual Result<> copyRecursively(const FilePath &filePath, const FilePath &target) const; virtual Result<> renameFile(const FilePath &filePath, const FilePath &target) const; virtual Result symLinkTarget(const FilePath &filePath) const; virtual Result filePathInfo(const FilePath &filePath) const; virtual Result lastModified(const FilePath &filePath) const; virtual Result permissions(const FilePath &filePath) const; virtual Result<> setPermissions(const FilePath &filePath, QFile::Permissions) const; virtual Result fileSize(const FilePath &filePath) const; virtual Result owner(const FilePath &filePath) const; virtual Result ownerId(const FilePath &filePath) const; virtual Result group(const FilePath &filePath) const; virtual Result groupId(const FilePath &filePath) const; virtual Result bytesAvailable(const FilePath &filePath) const; virtual Result fileId(const FilePath &filePath) const; virtual Result> refersToExecutableFile( const FilePath &filePath, FilePath::MatchScope matchScope) const; virtual Result<> iterateDirectory( const FilePath &filePath, const FilePath::IterateDirCallback &callBack, const FileFilter &filter) const; virtual Result fileContents(const FilePath &filePath, qint64 limit, qint64 offset) const; virtual Result writeFileContents(const FilePath &filePath, const QByteArray &data) const; virtual Result createTempFile(const FilePath &filePath); virtual Result createTempDir(const FilePath &filePath); virtual std::vector>> watch(const FilePaths &paths) const; virtual TextEncoding processStdOutEncoding(const FilePath &executable) const; virtual TextEncoding processStdErrEncoding(const FilePath &executable) const; }; class QTCREATOR_UTILS_EXPORT DesktopDeviceFileAccess : public DeviceFileAccess { public: DesktopDeviceFileAccess(); ~DesktopDeviceFileAccess() override; static DeviceFileAccessPtr instance(); protected: Result isExecutableFile(const FilePath &filePath) const override; Result isReadableFile(const FilePath &filePath) const override; Result isWritableFile(const FilePath &filePath) const override; Result isReadableDirectory(const FilePath &filePath) const override; Result isWritableDirectory(const FilePath &filePath) const override; Result isFile(const FilePath &filePath) const override; Result isDirectory(const FilePath &filePath) const override; Result isSymLink(const FilePath &filePath) const override; Result hasHardLinks(const FilePath &filePath) const override; Result<> ensureExistingFile(const FilePath &filePath) const override; Result<> createDirectory(const FilePath &filePath) const override; Result exists(const FilePath &filePath) const override; Result<> removeFile(const FilePath &filePath) const override; Result<> removeRecursively(const FilePath &filePath) const override; Result<> copyFile(const FilePath &filePath, const FilePath &target) const override; Result<> createSymLink(const FilePath &filePath, const FilePath &symLink) const override; Result<> renameFile(const FilePath &filePath, const FilePath &target) const override; Result symLinkTarget(const FilePath &filePath) const override; Result filePathInfo(const FilePath &filePath) const override; Result lastModified(const FilePath &filePath) const override; Result permissions(const FilePath &filePath) const override; Result<> setPermissions(const FilePath &filePath, QFile::Permissions) const override; Result fileSize(const FilePath &filePath) const override; Result owner(const FilePath &filePath) const override; Result ownerId(const FilePath &filePath) const override; Result group(const FilePath &filePath) const override; Result groupId(const FilePath &filePath) const override; Result bytesAvailable(const FilePath &filePath) const override; Result fileId(const FilePath &filePath) const override; Result> refersToExecutableFile( const FilePath &filePath, FilePath::MatchScope matchScope) const override; Result<> iterateDirectory( const FilePath &filePath, const FilePath::IterateDirCallback &callBack, const FileFilter &filter) const override; Result deviceEnvironment() const override; Result fileContents(const FilePath &filePath, qint64 limit, qint64 offset) const override; Result writeFileContents(const FilePath &filePath, const QByteArray &data) const override; Result createTempFile(const FilePath &filePath) override; Result createTempDir(const FilePath &filePath) override; std::vector>> watch( const FilePaths &paths) const override; TextEncoding processStdOutEncoding(const FilePath &executable) const override; TextEncoding processStdErrEncoding(const FilePath &executable) const override; }; class QTCREATOR_UTILS_EXPORT UnixDeviceFileAccess : public DeviceFileAccess { public: ~UnixDeviceFileAccess() override; protected: virtual Result runInShellImpl(const CommandLine &cmdLine, const QByteArray &inputData = {}) const = 0; Result runInShell(const CommandLine &cmdLine, const QByteArray &stdInData = {}) const; Result runInShellSuccess(const CommandLine &cmdLine, const QByteArray &stdInData = {}) const; Result isExecutableFile(const FilePath &filePath) const override; Result isReadableFile(const FilePath &filePath) const override; Result isWritableFile(const FilePath &filePath) const override; Result isReadableDirectory(const FilePath &filePath) const override; Result isWritableDirectory(const FilePath &filePath) const override; Result isFile(const FilePath &filePath) const override; Result isDirectory(const FilePath &filePath) const override; Result isSymLink(const FilePath &filePath) const override; Result hasHardLinks(const FilePath &filePath) const override; Result<> ensureExistingFile(const FilePath &filePath) const override; Result<> createDirectory(const FilePath &filePath) const override; Result exists(const FilePath &filePath) const override; Result<> removeFile(const FilePath &filePath) const override; Result<> removeRecursively(const FilePath &filePath) const override; Result<> copyFile(const FilePath &filePath, const FilePath &target) const override; Result<> createSymLink(const FilePath &filePath, const FilePath &symLink) const override; Result<> renameFile(const FilePath &filePath, const FilePath &target) const override; Result filePathInfo(const FilePath &filePath) const override; Result symLinkTarget(const FilePath &filePath) const override; Result lastModified(const FilePath &filePath) const override; Result permissions(const FilePath &filePath) const override; Result<> setPermissions(const FilePath &filePath, QFile::Permissions) const override; Result fileSize(const FilePath &filePath) const override; Result owner(const FilePath &filePath) const override; Result ownerId(const FilePath &filePath) const override; Result group(const FilePath &filePath) const override; Result groupId(const FilePath &filePath) const override; Result bytesAvailable(const FilePath &filePath) const override; Result fileId(const FilePath &filePath) const override; Result<> iterateDirectory( const FilePath &filePath, const FilePath::IterateDirCallback &callBack, const FileFilter &filter) const override; Result deviceEnvironment() const override; Result fileContents(const FilePath &filePath, qint64 limit, qint64 offset) const override; Result writeFileContents(const FilePath &filePath, const QByteArray &data) const override; Result createTempFile(const FilePath &filePath) override; Result createTempDir(const FilePath &filePath) override; Result<> findUsingLs(const QString ¤t, const FileFilter &filter, QStringList *found, const QString &start) const; private: Result createTempPath(const FilePath &filePath, bool createDir); Result<> iterateWithFind(const FilePath &filePath, const FileFilter &filter, const FilePath::IterateDirCallback &callBack) const; QStringList statArgs(const FilePath &filePath, const QString &linuxFormat, const QString &macFormat) const; mutable bool m_tryUseFind = true; mutable std::optional m_hasMkTemp; }; } // Utils