20#ifndef LIBREPCB_CORE_TRANSACTIONALFILESYSTEM_H
21#define LIBREPCB_CORE_TRANSACTIONALFILESYSTEM_H
26#include "../exceptions.h"
140 QString(
"Autosave backup detected in directory '%1'.")
157 const FilePath& filepath,
bool writable =
false,
160 QObject* parent =
nullptr);
171 virtual QStringList
getDirs(const QString& path = "") const noexcept override;
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;
197 const
FilePath& filepath,
bool writable,
200 QObject* parent =
nullptr) {
201 return std::make_shared<TransactionalFileSystem>(
202 filepath, writable, restoreCallback, lockCallback, parent);
204 static std::shared_ptr<TransactionalFileSystem>
openRO(
207 QObject* parent =
nullptr) {
208 return open(filepath,
false, restoreCallback,
nullptr, parent);
210 static std::shared_ptr<TransactionalFileSystem>
openRW(
214 QObject* parent =
nullptr) {
215 return open(filepath,
true, restoreCallback, lockCallback, parent);
217 static QString
cleanPath(QString path)
noexcept;
220 bool isRemoved(
const QString& path)
const noexcept;
223 void saveDiff(
const QString& type)
const;
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
TransactionalFileSystem()=delete
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
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