#include "common/filesystembase.h"
+#include <QDir>
#include <QPluginLoader>
#include <QLoggingCategory>
return {};
}
-Result<bool, QString> Vfs::checkAvailability(const QString &path)
+Result<void, QString> Vfs::checkAvailability(const QString &path, Vfs::Mode mode)
{
- const auto mode = bestAvailableVfsMode();
#ifdef Q_OS_WIN
if (mode == Mode::WindowsCfApi) {
const auto info = QFileInfo(path);
Q_UNUSED(mode)
Q_UNUSED(path)
#endif
- return true;
+ return {};
}
void Vfs::start(const VfsSetupParams ¶ms)
static QString modeToString(Mode mode);
static Optional<Mode> modeFromString(const QString &str);
- static Result<bool, QString> checkAvailability(const QString &path);
+ static Result<void, QString> checkAvailability(const QString &path, OCC::Vfs::Mode mode);
enum class AvailabilityError
{
ac->setDisabled(Theme::instance()->enforceVirtualFilesSyncFolder());
}
- if (Theme::instance()->showVirtualFilesOption() && !folder->virtualFilesEnabled() && Vfs::checkAvailability(folder->path())) {
- const auto mode = bestAvailableVfsMode();
+ if (const auto mode = bestAvailableVfsMode();
+ Theme::instance()->showVirtualFilesOption()
+ && !folder->virtualFilesEnabled() && Vfs::checkAvailability(folder->path(), mode)) {
if (mode == Vfs::WindowsCfApi || ConfigFile().showExperimentalOptions()) {
ac = menu->addAction(tr("Enable virtual file support %1 …").arg(mode == Vfs::WindowsCfApi ? QString() : tr("(experimental)")));
// TODO: remove when UX decision is made
_syncResult.setStatus(status);
// check if the local path exists
- checkLocalPath();
+ const auto folderOk = checkLocalPath();
_syncResult.setFolder(_definition.alias);
saveToSettings();
}
- // Initialize the vfs plugin
- startVfs();
+ if (folderOk) {
+ // Initialize the vfs plugin
+ startVfs();
+ }
}
Folder::~Folder()
_engine.reset();
}
-void Folder::checkLocalPath()
+bool Folder::checkLocalPath()
{
const QFileInfo fi(_definition.localPath);
_canonicalLocalPath = fi.canonicalFilePath();
if (FileSystem::isDir(_definition.localPath) && FileSystem::isReadable(_definition.localPath)) {
qCDebug(lcFolder) << "Checked local path ok";
} else {
+ QString error;
// Check directory again
if (!FileSystem::fileExists(_definition.localPath, fi)) {
- _syncResult.appendErrorString(tr("Local folder %1 does not exist.").arg(_definition.localPath));
- _syncResult.setStatus(SyncResult::SetupError);
- } else if (!FileSystem::isDir(_definition.localPath)) {
- _syncResult.appendErrorString(tr("%1 should be a folder but is not.").arg(_definition.localPath));
- _syncResult.setStatus(SyncResult::SetupError);
- } else if (!FileSystem::isReadable(_definition.localPath)) {
- _syncResult.appendErrorString(tr("%1 is not readable.").arg(_definition.localPath));
+ error = tr("Local folder %1 does not exist.").arg(_definition.localPath);
+ } else if (!fi.isDir()) {
+ error = tr("%1 should be a folder but is not.").arg(_definition.localPath);
+ } else if (!fi.isReadable()) {
+ error = tr("%1 is not readable.").arg(_definition.localPath);
+ }
+ if (!error.isEmpty()) {
+ _syncResult.appendErrorString(error);
_syncResult.setStatus(SyncResult::SetupError);
+ return false;
}
}
+ return true;
}
QString Folder::shortGuiRemotePathOrAppName() const
bool Folder::canSync() const
{
- return !syncPaused() && accountState()->isConnected();
+ return !syncPaused() && accountState()->isConnected() && _syncResult.status() != SyncResult::SetupError;
}
void Folder::setSyncPaused(bool paused)
ENFORCE(_vfs);
ENFORCE(_vfs->mode() == _definition.virtualFilesMode);
+ const auto result = Vfs::checkAvailability(path(), _vfs->mode());
+ if (!result) {
+ _syncResult.appendErrorString(result.error());
+ _syncResult.setStatus(SyncResult::SetupError);
+ return;
+ }
+
VfsSetupParams vfsParams;
vfsParams.filesystemPath = path();
vfsParams.displayName = shortGuiRemotePathOrAppName();
void showSyncResultPopup();
- void checkLocalPath();
+ bool checkLocalPath();
SyncOptions initializeSyncOptions() const;
}
}
+bool FolderMan::checkVfsAvailability(const QString &path, Vfs::Mode mode) const
+{
+ return unsupportedConfiguration(path) && Vfs::checkAvailability(path, mode);
+}
+
} // namespace OCC
/** removes current user from the share **/
void leaveShare(const QString &localFile);
+ /** Whether or not vfs is supported in the location. */
+ bool checkVfsAvailability(const QString &path, Vfs::Mode mode = bestAvailableVfsMode()) const;
+
signals:
/**
* signal to indicate a folder has changed its sync state.
bool FolderWizardSelectiveSync::validatePage()
{
- const bool useVirtualFiles = _virtualFilesCheckBox && _virtualFilesCheckBox->isChecked();
+ const auto mode = bestAvailableVfsMode();
+ const bool useVirtualFiles = (Theme::instance()->forceVirtualFilesOption() && mode == Vfs::WindowsCfApi) || (_virtualFilesCheckBox && _virtualFilesCheckBox->isChecked());
if (useVirtualFiles) {
- const auto availability = Vfs::checkAvailability(wizard()->field(QStringLiteral("sourceFolder")).toString());
+ const auto availability = Vfs::checkAvailability(wizard()->field(QStringLiteral("sourceFolder")).toString(), mode);
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);
bool OwncloudAdvancedSetupPage::validatePage()
{
if (useVirtualFileSync()) {
- const auto availability = Vfs::checkAvailability(localFolder());
+ const auto availability = Vfs::checkAvailability(localFolder(), bestAvailableVfsMode());
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);
_progressInfo->reset();
- if (!QDir(_localPath).exists()) {
+ if (!QFileInfo::exists(_localPath)) {
_anotherSyncNeeded = DelayedFollowUp;
// No _tr, it should only occur in non-mirall
Q_EMIT syncError(QStringLiteral("Unable to find local sync folder."), ErrorCategory::GenericError);