#include "version.h"
#include "syncjournaldb.h"
+#include "common/filesystembase.h"
+
#include <QPluginLoader>
#include <QLoggingCategory>
return {};
}
+Result<bool, QString> Vfs::checkAvailability(const QString &path)
+{
+ const auto mode = bestAvailableVfsMode();
+#ifdef Q_OS_WIN
+ if (mode == Mode::WindowsCfApi) {
+ const auto fs = FileSystem::fileSystemForPath(path);
+ if (fs != QLatin1String("NTFS")) {
+ return tr("The Virtual filesystem feature requires a NTFS file system, %1 is using %2").arg(path, fs);
+ }
+ }
+#else
+ Q_UNUSED(path);
+#endif
+ return true;
+}
+
void Vfs::start(const VfsSetupParams ¶ms)
{
_setupParams = params;
static QString modeToString(Mode mode);
static Optional<Mode> modeFromString(const QString &str);
+ static Result<bool, QString> checkAvailability(const QString &path);
+
enum class AvailabilityError
{
// Availability can't be retrieved due to db error
ac = menu->addAction(tr("Remove folder sync connection"));
connect(ac, &QAction::triggered, this, &AccountSettings::slotRemoveCurrentFolder);
- if (folder->supportsVirtualFiles()) {
+ if (folder->virtualFilesEnabled()) {
auto availabilityMenu = menu->addMenu(tr("Availability"));
auto availability = folder->vfs().availability(QString());
if (availability) {
}
if (Theme::instance()->showVirtualFilesOption()
- && !folder->supportsVirtualFiles()
- && bestAvailableVfsMode() != Vfs::Off
- && !folder->isVfsOnOffSwitchPending()) {
- ac = menu->addAction(tr("Enable virtual file support%1...").arg(bestAvailableVfsMode() == Vfs::WindowsCfApi ? QString() : tr(" (experimental)")));
- connect(ac, &QAction::triggered, this, &AccountSettings::slotEnableVfsCurrentFolder);
+ && !folder->virtualFilesEnabled() && Vfs::checkAvailability(folder->path())) {
+ const auto mode = bestAvailableVfsMode();
+ if (mode == Vfs::WindowsCfApi || ConfigFile().showExperimentalOptions()) {
+ ac = menu->addAction(tr("Enable virtual file support%1...").arg(mode == Vfs::WindowsCfApi ? QString() : tr(" (experimental)")));
+ connect(ac, &QAction::triggered, this, &AccountSettings::slotEnableVfsCurrentFolder);
+ }
}
folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, {});
// Change the folder vfs mode and load the plugin
- folder->setSupportsVirtualFiles(true);
+ folder->setVirtualFilesEnabled(true);
folder->setVfsOnOffSwitchPending(false);
// Setting to Unspecified retains existing data.
qCInfo(lcAccountSettings) << "Disabling vfs support for folder" << folder->path();
// Also wipes virtual files, schedules remote discovery
- folder->setSupportsVirtualFiles(false);
+ folder->setVirtualFilesEnabled(false);
folder->setVfsOnOffSwitchPending(false);
// Wipe pin states and selective sync db
slotScheduleThisFolder();
}
-void Folder::setSupportsVirtualFiles(bool enabled)
+void Folder::setVirtualFilesEnabled(bool enabled)
{
Vfs::Mode newMode = _definition.virtualFilesMode;
if (enabled && _definition.virtualFilesMode == Vfs::Off) {
bool Folder::supportsSelectiveSync() const
{
- return !supportsVirtualFiles() && !isVfsOnOffSwitchPending();
+ return !virtualFilesEnabled() && !isVfsOnOffSwitchPending();
}
void Folder::saveToSettings() const
return other != this && other->cleanPath() == this->cleanPath();
});
- if (supportsVirtualFiles() || _saveInFoldersWithPlaceholders) {
+ if (virtualFilesEnabled() || _saveInFoldersWithPlaceholders) {
// If virtual files are enabled or even were enabled at some point,
// save the folder to a group that will not be read by older (<2.5.0) clients.
// The name is from when virtual files were called placeholders.
_folderWatcher->startNotificatonTest(path() + QLatin1String(".owncloudsync.log"));
}
-bool Folder::supportsVirtualFiles() const
+bool Folder::virtualFilesEnabled() const
{
return _definition.virtualFilesMode != Vfs::Off && !isVfsOnOffSwitchPending();
}
* and never have an automatic virtual file. But when it's on, the shell context menu will allow
* users to make existing files virtual.
*/
- bool supportsVirtualFiles() const;
- void setSupportsVirtualFiles(bool enabled);
+ bool virtualFilesEnabled() const;
+ void setVirtualFilesEnabled(bool enabled);
void setRootPinState(PinState state);
case FolderStatusDelegate::FolderErrorMsg:
return f->syncResult().errorStrings();
case FolderStatusDelegate::FolderInfoMsg:
- return f->supportsVirtualFiles() && f->vfs().mode() != Vfs::Mode::WindowsCfApi
+ return f->virtualFilesEnabled() && f->vfs().mode() != Vfs::Mode::WindowsCfApi
? QStringList(tr("Virtual file support is enabled."))
: QStringList();
case FolderStatusDelegate::SyncRunning:
case FolderStatusDelegate::SyncProgressOverallString:
return progress._overallSyncString;
case FolderStatusDelegate::FolderSyncText:
- if (f->supportsVirtualFiles()) {
+ if (f->virtualFilesEnabled()) {
return tr("Synchronizing VirtualFiles with local folder");
} else {
return tr("Synchronizing with local folder");
#include <QVBoxLayout>
#include <QEvent>
#include <QCheckBox>
+#include <QMessageBox>
#include <cstdlib>
bool FolderWizardSelectiveSync::validatePage()
{
- bool useVirtualFiles = _virtualFilesCheckBox && _virtualFilesCheckBox->isChecked();
+ const bool useVirtualFiles = _virtualFilesCheckBox && _virtualFilesCheckBox->isChecked();
+ if (useVirtualFiles) {
+ const auto availability = Vfs::checkAvailability(wizard()->field(QStringLiteral("sourceFolder")).toString());
+ if (!availability) {
+ auto msg = new QMessageBox(QMessageBox::Warning, tr("Virtual files are not available for the selected folder"), availability.error(), QMessageBox::Ok, this);
+ msg->setAttribute(Qt::WA_DeleteOnClose);
+ msg->open();
+ return false;
+ }
+ }
wizard()->setProperty("selectiveSyncBlackList", useVirtualFiles ? QVariant() : QVariant(_selectiveSync->createBlackList()));
wizard()->setProperty("useVirtualFiles", QVariant(useVirtualFiles));
return true;
// File availability actions
if (syncFolder
- && syncFolder->supportsVirtualFiles()
+ && syncFolder->virtualFilesEnabled()
&& syncFolder->vfs().socketApiPinStateActionsShown()) {
ENFORCE(!files.isEmpty());
bool OwncloudAdvancedSetupPage::validatePage()
{
+ if (useVirtualFileSync()) {
+ const auto availability = Vfs::checkAvailability(localFolder());
+ if (!availability) {
+ auto msg = new QMessageBox(QMessageBox::Warning, tr("Virtual files are not available for the selected folder"), availability.error(), QMessageBox::Ok, this);
+ msg->setAttribute(Qt::WA_DeleteOnClose);
+ msg->open();
+ return false;
+ }
+ }
+
if (!_created) {
setErrorString(QString());
_checking = true;