add an option to enforce use of virtual files sync folder
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Thu, 4 Nov 2021 10:20:16 +0000 (11:20 +0100)
committerMatthieu Gallien <matthieu.gallien@nextcloud.com>
Fri, 5 Nov 2021 15:56:24 +0000 (16:56 +0100)
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
12 files changed:
NEXTCLOUD.cmake
config.h.in
src/common/vfs.cpp
src/gui/accountsettings.cpp
src/gui/folder.cpp
src/gui/folder.h
src/gui/folderman.cpp
src/gui/folderman.h
src/gui/folderwizard.cpp
src/gui/wizard/owncloudadvancedsetuppage.cpp
src/libsync/theme.cpp
src/libsync/theme.h

index ce246e8e8899ab0c77d8ebfb8c8dd05fae68c0b9..d34e682af89bbd5cbcad642856d3141718ede266 100644 (file)
@@ -34,6 +34,7 @@ option( BUILD_UPDATER "Build updater" OFF )
 
 option( WITH_PROVIDERS "Build with providers list" ON )
 
+option( ENFORCE_VIRTUAL_FILES_SYNC_FOLDER "Enforce use of virtual files sync folder when available" OFF )
 
 ## Theming options
 set(NEXTCLOUD_BACKGROUND_COLOR "#0082c9" CACHE STRING "Default Nextcloud background color")
index 1c7d921cd7ef114fa8a3f145aa687fdaf768cd41..e9eff6c929629eef492b5647eeb3766b60e56c78 100644 (file)
@@ -32,6 +32,7 @@
 #cmakedefine APPLICATION_OCSP_STAPLING_ENABLED "@APPLICATION_OCSP_STAPLING_ENABLED@"
 #cmakedefine APPLICATION_FORBID_BAD_SSL "@APPLICATION_FORBID_BAD_SSL@"
 #define APPLICATION_DOTVIRTUALFILE_SUFFIX "." APPLICATION_VIRTUALFILE_SUFFIX
+#cmakedefine01 ENFORCE_VIRTUAL_FILES_SYNC_FOLDER
 
 #cmakedefine ZLIB_FOUND @ZLIB_FOUND@
 
index 71ff5dae02d488e10a9ca7cd8a788b07475f031a..593c4c3bcdc6a095f4ed361d31a70a41f9e0c42e 100644 (file)
@@ -16,6 +16,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "config.h"
 #include "vfs.h"
 #include "plugin.h"
 #include "version.h"
index 43dab82a5769d56d0ccc8c51e50b65f91cd41737..76cf0cc39f28ec8a8d07fffd35659eaf1bbd6b63 100644 (file)
@@ -593,6 +593,7 @@ void AccountSettings::slotCustomContextMenuRequested(const QPoint &pos)
 
         ac = menu->addAction(tr("Disable virtual file support …"));
         connect(ac, &QAction::triggered, this, &AccountSettings::slotDisableVfsCurrentFolder);
+        ac->setDisabled(Theme::instance()->enforceVirtualFilesSyncFolder());
     }
 
     if (Theme::instance()->showVirtualFilesOption()
index 3a33d45427d9bf70f647bd5bdb7ff9265b080651..decbb927b52c276481e937e2c6b19f5b693fcc92 100644 (file)
@@ -671,7 +671,7 @@ void Folder::setVirtualFilesEnabled(bool enabled)
         startVfs();
         if (newMode != Vfs::Off) {
             _saveInFoldersWithPlaceholders = true;
-            SyncEngine::switchToVirtualFiles(path(), _journal, *_vfs);
+            switchToVirtualFiles();
         }
         saveToSettings();
     }
@@ -688,6 +688,11 @@ void Folder::setRootPinState(PinState state)
     slotNextSyncFullLocalDiscovery();
 }
 
+void Folder::switchToVirtualFiles()
+{
+    SyncEngine::switchToVirtualFiles(path(), _journal, *_vfs);
+}
+
 bool Folder::supportsSelectiveSync() const
 {
     return !virtualFilesEnabled() && !isVfsOnOffSwitchPending();
index 6efdd1eb0670ebf438d08de89397bb8df1f886d3..3bb96b2da4875ffba7465c04f3ea6ebe994e40e8 100644 (file)
@@ -287,6 +287,8 @@ public:
     bool isVfsOnOffSwitchPending() const { return _vfsOnOffPending; }
     void setVfsOnOffSwitchPending(bool pending) { _vfsOnOffPending = pending; }
 
+    void switchToVirtualFiles();
+
     /** Whether this folder should show selective sync ui */
     bool supportsSelectiveSync() const;
 
index 5a38814805872abd497ff9b3796d96c66afec985..73ad0c5535ea82a76d35560813452e79eaaa46f5 100644 (file)
@@ -292,6 +292,11 @@ void FolderMan::setupFoldersHelper(QSettings &settings, AccountStatePtr account,
                 SyncJournalDb::maybeMigrateDb(folderDefinition.localPath, folderDefinition.absoluteJournalPath());
             }
 
+            const auto switchToVfs = isSwitchToVfsNeeded(folderDefinition);
+            if (switchToVfs) {
+                folderDefinition.virtualFilesMode = bestAvailableVfsMode();
+            }
+
             auto vfs = createVfsFromPlugin(folderDefinition.virtualFilesMode);
             if (!vfs) {
                 // TODO: Must do better error handling
@@ -300,6 +305,9 @@ void FolderMan::setupFoldersHelper(QSettings &settings, AccountStatePtr account,
 
             Folder *f = addFolderInternal(std::move(folderDefinition), account.data(), std::move(vfs));
             if (f) {
+                if (switchToVfs) {
+                    f->switchToVirtualFiles();
+                }
                 // Migrate the old "usePlaceholders" setting to the root folder pin state
                 if (settings.value(QLatin1String(versionC), 1).toInt() == 1
                     && settings.value(QLatin1String("usePlaceholders"), false).toBool()) {
@@ -837,6 +845,19 @@ bool FolderMan::pushNotificationsFilesReady(Account *account)
     return pushFilesAvailable && pushNotifications && pushNotifications->isReady();
 }
 
+bool FolderMan::isSwitchToVfsNeeded(const FolderDefinition &folderDefinition) const
+{
+    auto result = false;
+    if (ENFORCE_VIRTUAL_FILES_SYNC_FOLDER &&
+            folderDefinition.virtualFilesMode != bestAvailableVfsMode() &&
+            folderDefinition.virtualFilesMode == Vfs::Off &&
+            OCC::Theme::instance()->showVirtualFilesOption()) {
+        result = true;
+    }
+
+    return result;
+}
+
 void FolderMan::slotEtagPollTimerTimeout()
 {
     qCInfo(lcFolderMan) << "Etag poll timer timeout";
index c3a1b1466cac19c7213d023d5733c2a805ea15ba..5a6c234e7d71e711c0ba1353a6700de0463efdd2 100644 (file)
@@ -324,6 +324,8 @@ private:
 
     bool pushNotificationsFilesReady(Account *account);
 
+    bool isSwitchToVfsNeeded(const FolderDefinition &folderDefinition) const;
+
     QSet<Folder *> _disabledFolders;
     Folder::Map _folderMap;
     QString _folderConfigPath;
index 3200f4210ed9dcb793d8a49692e9db33b1abbe6b..b240d72355fac9ab9f86cb32f3e253b3249058e8 100644 (file)
@@ -545,6 +545,11 @@ void FolderWizardSelectiveSync::initializePage()
             _virtualFilesCheckBox->setChecked(bestAvailableVfsMode() == Vfs::WindowsCfApi);
             _virtualFilesCheckBox->setEnabled(true);
             _virtualFilesCheckBox->setText(tr("Use virtual files instead of downloading content immediately %1").arg(bestAvailableVfsMode() == Vfs::WindowsCfApi ? QString() : tr("(experimental)")));
+
+            if (Theme::instance()->enforceVirtualFilesSyncFolder()) {
+                _virtualFilesCheckBox->setChecked(true);
+                _virtualFilesCheckBox->setDisabled(true);
+            }
         }
         //
     }
index 88b5229319d643e1bde6813713a51529f34a66ab..0d8cb6c1adffd58e48a5ca8275826b3e9068edd4 100644 (file)
@@ -59,6 +59,11 @@ OwncloudAdvancedSetupPage::OwncloudAdvancedSetupPage(OwncloudWizard *wizard)
     connect(_ui.pbSelectLocalFolder, &QAbstractButton::clicked, this, &OwncloudAdvancedSetupPage::slotSelectFolder);
     setButtonText(QWizard::FinishButton, tr("Connect"));
 
+    if (Theme::instance()->enforceVirtualFilesSyncFolder()) {
+        _ui.rSyncEverything->setDisabled(true);
+        _ui.rSelectiveSync->setDisabled(true);
+    }
+
     connect(_ui.rSyncEverything, &QAbstractButton::clicked, this, &OwncloudAdvancedSetupPage::slotSyncEverythingClicked);
     connect(_ui.rSelectiveSync, &QAbstractButton::clicked, this, &OwncloudAdvancedSetupPage::slotSelectiveSyncClicked);
     connect(_ui.rVirtualFileSync, &QAbstractButton::clicked, this, &OwncloudAdvancedSetupPage::slotVirtualFileSyncClicked);
index 8fd5b1a3fc808f8058bfbfc54041b42fd6d33ae2..ff7f58e607ff056026a8488bf8ae0c0c5af0e5a7 100644 (file)
@@ -859,6 +859,12 @@ bool Theme::showVirtualFilesOption() const
     return ConfigFile().showExperimentalOptions() || vfsMode == Vfs::WindowsCfApi;
 }
 
+bool Theme::enforceVirtualFilesSyncFolder() const
+{
+    const auto vfsMode = bestAvailableVfsMode();
+    return ENFORCE_VIRTUAL_FILES_SYNC_FOLDER && vfsMode != OCC::Vfs::Off;
+}
+
 QColor Theme::errorBoxTextColor() const
 {
     return QColor{"white"};
index f07c0de4a88a28d2a860ba46a915c6d4cd79b04d..6b9aefb255a7618d748f5cd3f8a89292499efed8 100644 (file)
@@ -565,6 +565,8 @@ public:
      */
     virtual bool showVirtualFilesOption() const;
 
+    virtual bool enforceVirtualFilesSyncFolder() const;
+
     /** @return color for the ErrorBox text. */
     virtual QColor errorBoxTextColor() const;