1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
4#ifndef QMAKEVFS_H
5#define QMAKEVFS_H
6
7#include "qmake_global.h"
8
9#include <qiodevice.h>
10#include <qhash.h>
11#include <qstring.h>
12#ifdef PROEVALUATOR_THREAD_SAFE
13# include <qmutex.h>
14#endif
15
16#ifdef PROEVALUATOR_DUAL_VFS
17# ifndef PROEVALUATOR_CUMULATIVE
18# error PROEVALUATOR_DUAL_VFS requires PROEVALUATOR_CUMULATIVE
19# endif
20#endif
21
22QT_BEGIN_NAMESPACE
23
24class QMAKE_EXPORT QMakeVfs
25{
26public:
27 enum ReadResult {
28 ReadOk,
29 ReadNotFound,
30 ReadOtherError
31 };
32
33 enum VfsFlag {
34 VfsExecutable = 1,
35 VfsExact = 0,
36#ifdef PROEVALUATOR_DUAL_VFS
37 VfsCumulative = 2,
38 VfsCreate = 4,
39 VfsCreatedOnly = 8,
40#else
41 VfsCumulative = 0,
42 VfsCreate = 0,
43 VfsCreatedOnly = 0,
44#endif
45 VfsAccessedOnly = 16
46 };
47 Q_DECLARE_FLAGS(VfsFlags, VfsFlag)
48
49 QMakeVfs();
50 ~QMakeVfs();
51
52 static void ref();
53 static void deref();
54
55 int idForFileName(const QString &fn, VfsFlags flags);
56 QString fileNameForId(int id);
57 bool writeFile(int id, QIODevice::OpenMode mode, VfsFlags flags, const QString &contents, QString *errStr);
58 ReadResult readFile(int id, QString *contents, QString *errStr);
59 bool exists(const QString &fn, QMakeVfs::VfsFlags flags);
60
61#ifndef PROEVALUATOR_FULL
62 void invalidateCache();
63 void invalidateContents();
64#endif
65
66private:
67#ifdef PROEVALUATOR_THREAD_SAFE
68 static QMutex s_mutex;
69#endif
70 static int s_refCount;
71 static QAtomicInt s_fileIdCounter;
72 // Qt Creator's ProFile cache is a singleton to maximize its cross-project
73 // effectiveness (shared prf files from QtVersions).
74 // For this to actually work, real files need a global mapping.
75 // This is fine, because the namespace of real files is indeed global.
76 static QHash<QString, int> s_fileIdMap;
77 static QHash<int, QString> s_idFileMap;
78#ifdef PROEVALUATOR_DUAL_VFS
79# ifdef PROEVALUATOR_THREAD_SAFE
80 // The simple way to avoid recursing m_mutex.
81 QMutex m_vmutex;
82# endif
83 // Virtual files are bound to the project context they were created in,
84 // so their ids need to be local as well.
85 // We violate that rule in lupdate (which has a non-dual VFS), but that
86 // does not matter, because it has only one project context anyway.
87 QHash<QString, int> m_virtualFileIdMap[2]; // Exact and cumulative
88 QHash<int, QString> m_virtualIdFileMap; // Only one map, as ids are unique across realms.
89#endif
90
91#ifndef PROEVALUATOR_FULL
92# ifdef PROEVALUATOR_THREAD_SAFE
93 QMutex m_mutex;
94# endif
95 QHash<int, QString> m_files;
96 QString m_magicMissing;
97 QString m_magicExisting;
98#endif
99};
100
101Q_DECLARE_OPERATORS_FOR_FLAGS(QMakeVfs::VfsFlags)
102
103QT_END_NAMESPACE
104
105#endif // QMAKEVFS_H
106

source code of qtbase/qmake/library/qmakevfs.h