LibrePCB Developers Documentation
Loading...
Searching...
No Matches
transactionalfilesystem.h
Go to the documentation of this file.
1/*
2 * LibrePCB - Professional EDA for everyone!
3 * Copyright (C) 2013 LibrePCB Developers, see AUTHORS.md for contributors.
4 * https://librepcb.org/
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#ifndef LIBREPCB_CORE_TRANSACTIONALFILESYSTEM_H
21#define LIBREPCB_CORE_TRANSACTIONALFILESYSTEM_H
22
23/*******************************************************************************
24 * Includes
25 ******************************************************************************/
26#include "../exceptions.h"
27#include "directorylock.h"
28#include "filesystem.h"
29
30#include <QtCore>
31
32#include <memory>
33
34/*******************************************************************************
35 * Namespace / Forward Declarations
36 ******************************************************************************/
37namespace librepcb {
38
39class ZipWriter;
40
41/*******************************************************************************
42 * Class TransactionalFileSystem
43 ******************************************************************************/
44
70class TransactionalFileSystem final : public FileSystem {
71 Q_OBJECT
72
73public:
82 typedef std::function<bool(const QString& filePath)> FilterFunction;
83
95 typedef std::function<bool(const FilePath& dir)> RestoreCallback;
96
103 struct RestoreMode {
111 static bool no(const FilePath& dir) {
112 Q_UNUSED(dir);
113 return false;
114 }
115
123 static bool yes(const FilePath& dir) {
124 Q_UNUSED(dir);
125 return true;
126 }
127
138 static bool abort(const FilePath& dir) {
139 throw RuntimeError(__FILE__, __LINE__,
140 QString("Autosave backup detected in directory '%1'.")
141 .arg(dir.toNative()));
142 }
143 };
144
148 struct State {
149 QHash<QString, QByteArray> modifiedFiles;
150 QSet<QString> removedFiles;
151 QSet<QString> removedDirs;
152 };
153
154 // Constructors / Destructor
157 const FilePath& filepath, bool writable = false,
158 RestoreCallback restoreCallback = RestoreCallback(),
159 DirectoryLock::LockHandlerCallback lockCallback = nullptr,
160 QObject* parent = nullptr);
162 virtual ~TransactionalFileSystem() noexcept;
163
164 // Getters
165 const FilePath& getPath() const noexcept { return mFilePath; }
166 bool isWritable() const noexcept { return mIsWritable; }
167 bool isRestoredFromAutosave() const noexcept { return mRestoredFromAutosave; }
168
169 // Inherited from FileSystem
170 virtual FilePath getAbsPath(const QString& path = "") const noexcept override;
171 virtual QStringList getDirs(const QString& path = "") const noexcept override;
172 virtual QStringList getFiles(
173 const QString& path = "") const noexcept override;
174 virtual bool fileExists(const QString& path) const noexcept override;
175 virtual QByteArray read(const QString& path) const override;
176 virtual QByteArray readIfExists(const QString& path) const override;
177 virtual void write(const QString& path, const QByteArray& content) override;
178 virtual void renameFile(const QString& src, const QString& dst) override;
179 virtual void removeFile(const QString& path) override;
180 virtual void removeDirRecursively(const QString& path = "") override;
181
182 // General Methods
183 State saveState() const noexcept { return mState; }
184 void restoreState(const State& state) noexcept { mState = state; }
185 void loadFromZip(QByteArray content);
186 void loadFromZip(const FilePath& fp);
187 QByteArray exportToZip(FilterFunction filter = nullptr) const;
188 void exportToZip(const FilePath& fp, FilterFunction filter = nullptr) const;
189 void discardChanges() noexcept;
190 QStringList checkForModifications() const;
191 void autosave();
192 void save();
193 void releaseLock();
194
195 // Static Methods
196 static std::shared_ptr<TransactionalFileSystem> open(
197 const FilePath& filepath, bool writable,
198 RestoreCallback restoreCallback = &RestoreMode::no,
199 DirectoryLock::LockHandlerCallback lockCallback = nullptr,
200 QObject* parent = nullptr) {
201 return std::make_shared<TransactionalFileSystem>(
202 filepath, writable, restoreCallback, lockCallback, parent);
203 }
204 static std::shared_ptr<TransactionalFileSystem> openRO(
205 const FilePath& filepath,
206 RestoreCallback restoreCallback = &RestoreMode::no,
207 QObject* parent = nullptr) {
208 return open(filepath, false, restoreCallback, nullptr, parent);
209 }
210 static std::shared_ptr<TransactionalFileSystem> openRW(
211 const FilePath& filepath,
212 RestoreCallback restoreCallback = &RestoreMode::no,
213 DirectoryLock::LockHandlerCallback lockCallback = nullptr,
214 QObject* parent = nullptr) {
215 return open(filepath, true, restoreCallback, lockCallback, parent);
216 }
217 static QString cleanPath(QString path) noexcept;
218
219private: // Methods
220 bool isRemoved(const QString& path) const noexcept;
221 void exportDirToZip(ZipWriter& zip, const FilePath& zipFp, const QString& dir,
222 FilterFunction filter) const;
223 void saveDiff(const QString& type) const;
224 void loadDiff(const FilePath& fp);
225 void removeDiff(const QString& type);
226 void sanitizePathOrThrow(const QString& cleanedPath) const;
227 bool checkIfPathIsSafe(const QString& cleanedPath) const noexcept;
228
229private: // Data
234 mutable QRecursiveMutex mMutex;
235
236 // File system modifications
238};
239
240/*******************************************************************************
241 * End of File
242 ******************************************************************************/
243
244} // namespace librepcb
245
246#endif
This class can be used to implement file-based directory locks.
Definition directorylock.h:154
std::function< bool(const FilePath &dir, LockStatus status, const QString &user)> LockHandlerCallback
Callback type used to determine whether a lock should be overridden or not.
Definition directorylock.h:193
This class represents absolute, well-formatted paths to files or directories.
Definition filepath.h:127
QString toNative() const noexcept
Get the absolute filepath with native directory separators.
Definition filepath.cpp:108
Base class / interface for all file system implementations.
Definition filesystem.h:45
The RuntimeError class.
Definition exceptions.h:218
Transactional librepcb::FileSystem implementation.
Definition transactionalfilesystem.h:70
DirectoryLock mLock
Definition transactionalfilesystem.h:232
virtual void removeDirRecursively(const QString &path="") override
Definition transactionalfilesystem.cpp:233
QRecursiveMutex mMutex
Definition transactionalfilesystem.h:234
virtual bool fileExists(const QString &path) const noexcept override
Definition transactionalfilesystem.cpp:165
void discardChanges() noexcept
Definition transactionalfilesystem.cpp:302
bool mRestoredFromAutosave
Definition transactionalfilesystem.h:233
void autosave()
Definition transactionalfilesystem.cpp:342
virtual QStringList getFiles(const QString &path="") const noexcept override
Definition transactionalfilesystem.cpp:133
virtual void renameFile(const QString &src, const QString &dst) override
Definition transactionalfilesystem.cpp:218
State mState
Definition transactionalfilesystem.h:237
void releaseLock()
Definition transactionalfilesystem.cpp:390
bool checkIfPathIsSafe(const QString &cleanedPath) const noexcept
Definition transactionalfilesystem.cpp:545
virtual void write(const QString &path, const QByteArray &content) override
Definition transactionalfilesystem.cpp:208
void sanitizePathOrThrow(const QString &cleanedPath) const
Definition transactionalfilesystem.cpp:535
State saveState() const noexcept
Definition transactionalfilesystem.h:183
const FilePath & getPath() const noexcept
Definition transactionalfilesystem.h:165
virtual QStringList getDirs(const QString &path="") const noexcept override
Definition transactionalfilesystem.cpp:100
QStringList checkForModifications() const
Definition transactionalfilesystem.cpp:309
static std::shared_ptr< TransactionalFileSystem > open(const FilePath &filepath, bool writable, RestoreCallback restoreCallback=&RestoreMode::no, DirectoryLock::LockHandlerCallback lockCallback=nullptr, QObject *parent=nullptr)
Definition transactionalfilesystem.h:196
QByteArray exportToZip(FilterFunction filter=nullptr) const
Definition transactionalfilesystem.cpp:280
virtual ~TransactionalFileSystem() noexcept
Definition transactionalfilesystem.cpp:74
TransactionalFileSystem(const TransactionalFileSystem &other)=delete
void saveDiff(const QString &type) const
Definition transactionalfilesystem.cpp:458
bool isRemoved(const QString &path) const noexcept
Definition transactionalfilesystem.cpp:412
static std::shared_ptr< TransactionalFileSystem > openRW(const FilePath &filepath, RestoreCallback restoreCallback=&RestoreMode::no, DirectoryLock::LockHandlerCallback lockCallback=nullptr, QObject *parent=nullptr)
Definition transactionalfilesystem.h:210
bool isRestoredFromAutosave() const noexcept
Definition transactionalfilesystem.h:167
virtual void removeFile(const QString &path) override
Definition transactionalfilesystem.cpp:224
virtual QByteArray read(const QString &path) const override
Definition transactionalfilesystem.cpp:181
void exportDirToZip(ZipWriter &zip, const FilePath &zipFp, const QString &dir, FilterFunction filter) const
Definition transactionalfilesystem.cpp:426
void loadDiff(const FilePath &fp)
Definition transactionalfilesystem.cpp:498
void restoreState(const State &state) noexcept
Definition transactionalfilesystem.h:184
bool mIsWritable
Definition transactionalfilesystem.h:231
std::function< bool(const FilePath &dir)> RestoreCallback
Callback type used to determine whether a backup should be restored or not.
Definition transactionalfilesystem.h:95
void save()
Definition transactionalfilesystem.cpp:347
void removeDiff(const QString &type)
Definition transactionalfilesystem.cpp:522
static std::shared_ptr< TransactionalFileSystem > openRO(const FilePath &filepath, RestoreCallback restoreCallback=&RestoreMode::no, QObject *parent=nullptr)
Definition transactionalfilesystem.h:204
static QString cleanPath(QString path) noexcept
Definition transactionalfilesystem.cpp:399
bool isWritable() const noexcept
Definition transactionalfilesystem.h:166
std::function< bool(const QString &filePath)> FilterFunction
Function to filter files.
Definition transactionalfilesystem.h:82
void loadFromZip(QByteArray content)
Definition transactionalfilesystem.cpp:256
const FilePath mFilePath
Definition transactionalfilesystem.h:230
virtual QByteArray readIfExists(const QString &path) const override
Definition transactionalfilesystem.cpp:192
virtual FilePath getAbsPath(const QString &path="") const noexcept override
Definition transactionalfilesystem.cpp:93
Zip file writer.
Definition zipwriter.h:50
Definition occmodel.cpp:77
Definition uuid.h:186
Convenience class providing standard implementations for librepcb::TransactionalFileSystem::RestoreCa...
Definition transactionalfilesystem.h:103
static bool yes(const FilePath &dir)
Always restore the backup, if there is any.
Definition transactionalfilesystem.h:123
static bool abort(const FilePath &dir)
If there exists a backup, abort opening the directory by raising an exception.
Definition transactionalfilesystem.h:138
static bool no(const FilePath &dir)
Never restore a backup.
Definition transactionalfilesystem.h:111
Snapshot of modifications made to the file system.
Definition transactionalfilesystem.h:148
QSet< QString > removedDirs
Definition transactionalfilesystem.h:151
QHash< QString, QByteArray > modifiedFiles
Definition transactionalfilesystem.h:149
QSet< QString > removedFiles
Definition transactionalfilesystem.h:150