Vfs: Send SyncFileStatusTracker data to vfs plugins
authorChristian Kamm <mail@ckamm.de>
Mon, 21 Jan 2019 10:24:16 +0000 (11:24 +0100)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:37 +0000 (10:58 +0100)
src/common/vfs.h
src/gui/folder.cpp
src/libsync/vfs/suffix/vfs_suffix.h

index a358619cbd329b1514020bc2a2b1eb2fbc162fcb..f9f209e13fb3de1c7b12adf1eba11d6d857a8466 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "ocsynclib.h"
 #include "result.h"
+#include "syncfilestatus.h"
 
 typedef struct csync_file_stat_s csync_file_stat_t;
 
@@ -153,6 +154,15 @@ public:
      */
     virtual bool statTypeVirtualFile(csync_file_stat_t *stat, void *stat_data) = 0;
 
+public slots:
+    /** Update in-sync state based on SyncFileStatusTracker signal.
+     *
+     * For some vfs plugins the icons aren't based on SocketAPI but rather on data shared
+     * via the vfs plugin. The connection to SyncFileStatusTracker allows both to be based
+     * on the same data.
+     */
+    virtual void fileStatusChanged(const QString &systemFileName, SyncFileStatus fileStatus) = 0;
+
 signals:
     /// Emitted when a user-initiated hydration starts
     void beginHydrating();
@@ -187,6 +197,9 @@ public:
 
     bool isDehydratedPlaceholder(const QString &) override { return false; }
     bool statTypeVirtualFile(csync_file_stat_t *, void *) override { return false; }
+
+public slots:
+    void fileStatusChanged(const QString &, SyncFileStatus) override {}
 };
 
 /// Check whether the plugin for the mode is available.
index db9c2c296181887ae3ec79ef97d9ae740805977e..f4a8107a13256d9c9f8280f75039219cbe0de3b4 100644 (file)
@@ -481,8 +481,11 @@ void Folder::startVfs()
     vfsParams.providerName = Theme::instance()->appNameGUI();
     vfsParams.providerVersion = Theme::instance()->version();
 
-    connect(_vfs.data(), &OCC::Vfs::beginHydrating, this, &Folder::slotHydrationStarts);
-    connect(_vfs.data(), &OCC::Vfs::doneHydrating, this, &Folder::slotHydrationDone);
+    connect(_vfs.data(), &Vfs::beginHydrating, this, &Folder::slotHydrationStarts);
+    connect(_vfs.data(), &Vfs::doneHydrating, this, &Folder::slotHydrationDone);
+
+    connect(&_engine->syncFileStatusTracker(), &SyncFileStatusTracker::fileStatusChanged,
+            _vfs.data(), &Vfs::fileStatusChanged);
 
     _vfs->registerFolder(vfsParams); // Do this always?
     _vfs->start(vfsParams);
@@ -637,6 +640,9 @@ void Folder::setSupportsVirtualFiles(bool enabled)
         _vfs->stop();
         _vfs->unregisterFolder();
 
+        disconnect(_vfs.data(), 0, this, 0);
+        disconnect(&_engine->syncFileStatusTracker(), 0, _vfs.data(), 0);
+
         _vfs.reset(createVfsFromPlugin(newMode).release());
 
         _definition.virtualFilesMode = newMode;
index 6c60c530abf992a9f32cb6c131d43596f1d2c2aa..2949533aa6cd865e8c59c6b5000c8ee9adfb4f57 100644 (file)
@@ -46,6 +46,9 @@ public:
 
     bool isDehydratedPlaceholder(const QString &filePath) override;
     bool statTypeVirtualFile(csync_file_stat_t *stat, void *stat_data) override;
+
+public slots:
+    void fileStatusChanged(const QString &, SyncFileStatus) override {}
 };
 
 class SuffixVfsPluginFactory : public QObject, public DefaultPluginFactory<VfsSuffix>