Q_LOGGING_CATEGORY(lcPlugin, "plugins", QtInfoMsg)
-Vfs *OCC::createVfsFromPlugin(Vfs::Mode mode, QObject *parent)
+std::unique_ptr<Vfs> OCC::createVfsFromPlugin(Vfs::Mode mode)
{
auto name = modeToPluginName(mode);
if (name.isEmpty())
return nullptr;
}
- auto vfs = qobject_cast<Vfs *>(factory->create(parent));
+ auto vfs = std::unique_ptr<Vfs>(qobject_cast<Vfs *>(factory->create(nullptr)));
if (!vfs) {
qCWarning(lcPlugin) << "Plugin" << pluginPath << "does not create a Vfs instance";
return nullptr;
#include <QScopedPointer>
#include <QSharedPointer>
+#include <memory>
+
#include "ocsynclib.h"
#include "result.h"
OCSYNC_EXPORT Vfs::Mode bestAvailableVfsMode();
/// Create a VFS instance for the mode, returns nullptr on failure.
-OCSYNC_EXPORT Vfs *createVfsFromPlugin(Vfs::Mode mode, QObject *parent);
+OCSYNC_EXPORT std::unique_ptr<Vfs> createVfsFromPlugin(Vfs::Mode mode);
} // namespace OCC
Q_LOGGING_CATEGORY(lcFolder, "nextcloud.gui.folder", QtInfoMsg)
Folder::Folder(const FolderDefinition &definition,
- AccountState *accountState, Vfs *vfs,
+ AccountState *accountState, std::unique_ptr<Vfs> vfs,
QObject *parent)
: QObject(parent)
, _accountState(accountState)
, _consecutiveFollowUpSyncs(0)
, _journal(_definition.absoluteJournalPath())
, _fileLog(new SyncRunFileLog)
- , _vfs(vfs)
+ , _vfs(vfs.release())
{
_timeSinceLastSyncStart.start();
_timeSinceLastSyncDone.start();
// Potentially upgrade suffix vfs to windows vfs
if (_definition.virtualFilesMode == Vfs::WithSuffix && _definition.upgradeVfsMode) {
- if (auto winvfs = createVfsFromPlugin(Vfs::WindowsCfApi, this)) {
+ if (auto winvfs = createVfsFromPlugin(Vfs::WindowsCfApi)) {
// Wipe the existing suffix files from fs and journal
- SyncEngine::wipeVirtualFiles(path(), _journal, _vfs);
+ SyncEngine::wipeVirtualFiles(path(), _journal, _vfs.data());
// Then switch to winvfs mode
- delete _vfs;
- _vfs = winvfs;
+ _vfs.reset(winvfs.release());
_definition.virtualFilesMode = Vfs::WindowsCfApi;
saveToSettings();
}
ENFORCE(_vfs);
ENFORCE(_vfs->mode() == _definition.virtualFilesMode);
- _vfs->setParent(this);
-
VfsSetupParams vfsParams;
vfsParams.filesystemPath = path();
vfsParams.remotePath = remotePath();
vfsParams.providerName = Theme::instance()->appNameGUI();
vfsParams.providerVersion = Theme::instance()->version();
- connect(_vfs, &OCC::Vfs::beginHydrating, this, &Folder::slotHydrationStarts);
- connect(_vfs, &OCC::Vfs::doneHydrating, this, &Folder::slotHydrationDone);
+ connect(_vfs.data(), &OCC::Vfs::beginHydrating, this, &Folder::slotHydrationStarts);
+ connect(_vfs.data(), &OCC::Vfs::doneHydrating, this, &Folder::slotHydrationDone);
_vfs->registerFolder(vfsParams); // Do this always?
_vfs->start(vfsParams);
if (enabled && _definition.virtualFilesMode == Vfs::Off) {
_definition.virtualFilesMode = bestAvailableVfsMode();
- _vfs = createVfsFromPlugin(_definition.virtualFilesMode, this);
+ _vfs.reset(createVfsFromPlugin(_definition.virtualFilesMode).release());
startVfs();
_saveInFoldersWithPlaceholders = true;
ENFORCE(_vfs);
// TODO: Must wait for current sync to finish!
- SyncEngine::wipeVirtualFiles(path(), _journal, _vfs);
+ SyncEngine::wipeVirtualFiles(path(), _journal, _vfs.data());
_vfs->stop();
_vfs->unregisterFolder();
- delete _vfs;
+ _vfs.reset(nullptr);
_definition.virtualFilesMode = Vfs::Off;
}
opt._newBigFolderSizeLimit = newFolderLimit.first ? newFolderLimit.second * 1000LL * 1000LL : -1; // convert from MB to B
opt._confirmExternalStorage = cfgFile.confirmExternalStorage();
opt._moveFilesToTrash = cfgFile.moveToTrash();
- opt._vfs = _vfs;
+ opt._vfs = _vfs.data();
QByteArray chunkSizeEnv = qgetenv("OWNCLOUD_CHUNK_SIZE");
if (!chunkSizeEnv.isEmpty()) {
#include <QUuid>
#include <set>
#include <chrono>
+#include <memory>
class QThread;
class QSettings;
public:
/** Create a new Folder
- *
- * The vfs instance will be parented to this.
*/
- Folder(const FolderDefinition &definition, AccountState *accountState, Vfs *vfs, QObject *parent = nullptr);
+ Folder(const FolderDefinition &definition, AccountState *accountState, std::unique_ptr<Vfs> vfs, QObject *parent = nullptr);
~Folder();
/**
* The vfs mode instance (created by plugin) to use. Null means no vfs.
*/
- Vfs *_vfs = nullptr;
+ QScopedPointer<Vfs> _vfs;
};
}
qCInfo(lcFolderMan) << "Successfully migrated syncjournal database.";
}
- Vfs *vfs = createVfsFromPlugin(folderDefinition.virtualFilesMode, nullptr);
+ auto vfs = createVfsFromPlugin(folderDefinition.virtualFilesMode);
if (!vfs && folderDefinition.virtualFilesMode != Vfs::Off) {
qCWarning(lcFolderMan) << "Could not load plugin for mode" << folderDefinition.virtualFilesMode;
}
- Folder *f = addFolderInternal(folderDefinition, account.data(), vfs);
+ Folder *f = addFolderInternal(folderDefinition, account.data(), std::move(vfs));
f->saveToSettings();
continue;
SyncJournalDb::maybeMigrateDb(folderDefinition.localPath, folderDefinition.absoluteJournalPath());
}
- Vfs *vfs = createVfsFromPlugin(folderDefinition.virtualFilesMode, nullptr);
+ auto vfs = createVfsFromPlugin(folderDefinition.virtualFilesMode);
if (!vfs && folderDefinition.virtualFilesMode != Vfs::Off) {
// TODO: Must do better error handling
qFatal("Could not load plugin");
}
- Folder *f = addFolderInternal(std::move(folderDefinition), account.data(), vfs);
+ Folder *f = addFolderInternal(std::move(folderDefinition), account.data(), std::move(vfs));
if (f) {
// Migration: Mark folders that shall be saved in a backwards-compatible way
if (backwardsCompatible)
folderDefinition.paused = paused;
folderDefinition.ignoreHiddenFiles = ignoreHiddenFiles();
- Vfs *vfs = nullptr;
- folder = addFolderInternal(folderDefinition, accountState, vfs);
+ folder = addFolderInternal(folderDefinition, accountState, std::unique_ptr<Vfs>());
if (folder) {
QStringList blackList = settings.value(QLatin1String("blackList")).toStringList();
if (!blackList.empty()) {
return nullptr;
}
- Vfs *vfs = createVfsFromPlugin(folderDefinition.virtualFilesMode, nullptr);
+ auto vfs = createVfsFromPlugin(folderDefinition.virtualFilesMode);
if (!vfs && folderDefinition.virtualFilesMode != Vfs::Off) {
qCWarning(lcFolderMan) << "Could not load plugin for mode" << folderDefinition.virtualFilesMode;
return 0;
}
- auto folder = addFolderInternal(definition, accountState, vfs);
+ auto folder = addFolderInternal(definition, accountState, std::move(vfs));
// Migration: The first account that's configured for a local folder shall
// be saved in a backwards-compatible way.
Folder *FolderMan::addFolderInternal(
FolderDefinition folderDefinition,
AccountState *accountState,
- Vfs *vfs)
+ std::unique_ptr<Vfs> vfs)
{
auto alias = folderDefinition.alias;
int count = 0;
folderDefinition.alias = alias + QString::number(++count);
}
- auto folder = new Folder(folderDefinition, accountState, vfs, this);
+ auto folder = new Folder(folderDefinition, accountState, std::move(vfs), this);
if (_navigationPaneHelper.showInExplorerNavigationPane() && folderDefinition.navigationPaneClsid.isNull()) {
folder->setNavigationPaneClsid(QUuid::createUuid());
* does not set an account on the new folder.
*/
Folder *addFolderInternal(FolderDefinition folderDefinition,
- AccountState *accountState, Vfs *vfs);
+ AccountState *accountState, std::unique_ptr<Vfs> vfs);
/* unloads a folder object, does not delete it */
void unloadFolder(Folder *);
SyncOptions vfsSyncOptions()
{
SyncOptions options;
- options._vfs = createVfsFromPlugin(Vfs::WithSuffix, nullptr);
+ // leak here
+ options._vfs = createVfsFromPlugin(Vfs::WithSuffix).release();
return options;
}