1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtCore module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #ifndef QFILESYSTEMENGINE_P_H
41 #define QFILESYSTEMENGINE_P_H
42 
43 //
44 //  W A R N I N G
45 //  -------------
46 //
47 // This file is not part of the Qt API.  It exists purely as an
48 // implementation detail.  This header file may change from version to
49 // version without notice, or even be removed.
50 //
51 // We mean it.
52 //
53 
54 #include "qfile.h"
55 #include "qfilesystementry_p.h"
56 #include "qfilesystemmetadata_p.h"
57 #include <QtCore/private/qsystemerror_p.h>
58 
59 QT_BEGIN_NAMESPACE
60 
61 #define Q_RETURN_ON_INVALID_FILENAME(message, result) \
62     { \
63         QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).warning(message); \
64         errno = EINVAL; \
65         return (result); \
66     }
67 
qIsFilenameBroken(const QByteArray & name)68 inline bool qIsFilenameBroken(const QByteArray &name)
69 {
70     return name.contains('\0');
71 }
72 
qIsFilenameBroken(const QString & name)73 inline bool qIsFilenameBroken(const QString &name)
74 {
75     return name.contains(QLatin1Char('\0'));
76 }
77 
qIsFilenameBroken(const QFileSystemEntry & entry)78 inline bool qIsFilenameBroken(const QFileSystemEntry &entry)
79 {
80     return qIsFilenameBroken(entry.nativeFilePath());
81 }
82 
83 #define Q_CHECK_FILE_NAME(name, result) \
84     do { \
85         if (Q_UNLIKELY((name).isEmpty())) \
86             Q_RETURN_ON_INVALID_FILENAME("Empty filename passed to function", (result)); \
87         if (Q_UNLIKELY(qIsFilenameBroken(name))) \
88             Q_RETURN_ON_INVALID_FILENAME("Broken filename passed to function", (result)); \
89     } while (false)
90 
91 class Q_AUTOTEST_EXPORT QFileSystemEngine
92 {
93 public:
isCaseSensitive()94     static bool isCaseSensitive()
95     {
96 #ifndef Q_OS_WIN
97         return true;
98 #else
99         return false;
100 #endif
101     }
102 
103     static QFileSystemEntry getLinkTarget(const QFileSystemEntry &link, QFileSystemMetaData &data);
104     static QFileSystemEntry canonicalName(const QFileSystemEntry &entry, QFileSystemMetaData &data);
105     static QFileSystemEntry absoluteName(const QFileSystemEntry &entry);
106     static QByteArray id(const QFileSystemEntry &entry);
107     static QString resolveUserName(const QFileSystemEntry &entry, QFileSystemMetaData &data);
108     static QString resolveGroupName(const QFileSystemEntry &entry, QFileSystemMetaData &data);
109 
110 #if defined(Q_OS_UNIX)
111     static QString resolveUserName(uint userId);
112     static QString resolveGroupName(uint groupId);
113 #endif
114 
115 #if defined(Q_OS_DARWIN)
116     static QString bundleName(const QFileSystemEntry &entry);
117 #else
bundleName(const QFileSystemEntry & entry)118     static QString bundleName(const QFileSystemEntry &entry) { Q_UNUSED(entry) return QString(); }
119 #endif
120 
121     static bool fillMetaData(const QFileSystemEntry &entry, QFileSystemMetaData &data,
122                              QFileSystemMetaData::MetaDataFlags what);
123 #if defined(Q_OS_UNIX)
124     static bool cloneFile(int srcfd, int dstfd, const QFileSystemMetaData &knownData);
125     static bool fillMetaData(int fd, QFileSystemMetaData &data); // what = PosixStatFlags
126     static QByteArray id(int fd);
127     static bool setFileTime(int fd, const QDateTime &newDate,
128                             QAbstractFileEngine::FileTime whatTime, QSystemError &error);
129     static bool setPermissions(int fd, QFile::Permissions permissions, QSystemError &error,
130                                QFileSystemMetaData *data = nullptr);
131 #endif
132 #if defined(Q_OS_WIN)
133 
134     static bool uncListSharesOnServer(const QString &server, QStringList *list); //Used also by QFSFileEngineIterator::hasNext()
135     static bool fillMetaData(int fd, QFileSystemMetaData &data,
136                              QFileSystemMetaData::MetaDataFlags what);
137     static bool fillMetaData(HANDLE fHandle, QFileSystemMetaData &data,
138                              QFileSystemMetaData::MetaDataFlags what);
139     static bool fillPermissions(const QFileSystemEntry &entry, QFileSystemMetaData &data,
140                                 QFileSystemMetaData::MetaDataFlags what);
141     static QByteArray id(HANDLE fHandle);
142     static bool setFileTime(HANDLE fHandle, const QDateTime &newDate,
143                             QAbstractFileEngine::FileTime whatTime, QSystemError &error);
144     static QString owner(const QFileSystemEntry &entry, QAbstractFileEngine::FileOwner own);
145     static QString nativeAbsoluteFilePath(const QString &path);
146 #endif
147     //homePath, rootPath and tempPath shall return clean paths
148     static QString homePath();
149     static QString rootPath();
150     static QString tempPath();
151 
152     static bool createDirectory(const QFileSystemEntry &entry, bool createParents);
153     static bool removeDirectory(const QFileSystemEntry &entry, bool removeEmptyParents);
154 
155     static bool createLink(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
156 
157     static bool copyFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
158     static bool moveFileToTrash(const QFileSystemEntry &source, QFileSystemEntry &newLocation, QSystemError &error);
159     static bool renameFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
160     static bool renameOverwriteFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
161     static bool removeFile(const QFileSystemEntry &entry, QSystemError &error);
162 
163     static bool setPermissions(const QFileSystemEntry &entry, QFile::Permissions permissions, QSystemError &error,
164                                QFileSystemMetaData *data = nullptr);
165 
166     // unused, therefore not implemented
167     static bool setFileTime(const QFileSystemEntry &entry, const QDateTime &newDate,
168                             QAbstractFileEngine::FileTime whatTime, QSystemError &error);
169 
170     static bool setCurrentPath(const QFileSystemEntry &entry);
171     static QFileSystemEntry currentPath();
172 
173     static QAbstractFileEngine *resolveEntryAndCreateLegacyEngine(QFileSystemEntry &entry,
174                                                                   QFileSystemMetaData &data);
175 private:
176     static QString slowCanonicalized(const QString &path);
177 #if defined(Q_OS_WIN)
178     static void clearWinStatData(QFileSystemMetaData &data);
179 #endif
180 };
181 
182 QT_END_NAMESPACE
183 
184 #endif // include guard
185