Add method to evict an item in FileProviderMaterialisedItemsModel
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Tue, 31 Oct 2023 09:27:49 +0000 (17:27 +0800)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Mon, 19 Feb 2024 14:45:15 +0000 (22:45 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
src/gui/CMakeLists.txt
src/gui/macOS/fileprovidermaterialiseditemsmodel.h
src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm [new file with mode: 0644]

index fb48ee902e1634c7de615321581524dbfca9b049..db37c388b65da2e6fb36bfa03e7b41be785b8456 100644 (file)
@@ -298,6 +298,7 @@ IF( APPLE )
             macOS/fileprovideritemmetadata_mac.mm
             macOS/fileprovidermaterialiseditemsmodel.h
             macOS/fileprovidermaterialiseditemsmodel.cpp
+            macOS/fileprovidermaterialiseditemsmodel_mac.mm
             macOS/fileprovidersettingscontroller.h
             macOS/fileprovidersettingscontroller_mac.mm
             macOS/fileprovidersocketcontroller.h
index faae4b9598cca73c61ad9ffeecd31c6d3e355996..e459e07606dd17567601eed0453dd4ca488ca3a0 100644 (file)
@@ -75,6 +75,7 @@ signals:
 
 public slots:
     void setItems(const QVector<FileProviderItemMetadata> &items);
+    void evictItem(const QString &identifier, const QString &domainIdentifier);
 
 private:
     QVector<FileProviderItemMetadata> _items;
diff --git a/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm b/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm
new file mode 100644 (file)
index 0000000..482e7e7
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2023 (c) Claudio Cambra <claudio.cambra@nextcloud.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+#include "fileprovidermaterialiseditemsmodel.h"
+
+#include <QLoggingCategory>
+
+#import <FileProvider/FileProvider.h>
+
+namespace OCC {
+
+namespace Mac {
+
+Q_LOGGING_CATEGORY(lcMacImplFileProviderMaterialisedItemsModelMac, "nextcloud.gui.macfileprovidermaterialiseditemsmodelmac", QtInfoMsg)
+
+void FileProviderMaterialisedItemsModel::evictItem(const QString &identifier, const QString &domainIdentifier)
+{
+    __block NSFileProviderManager *manager = nil;
+    NSString *const nsDomainIdentifier = domainIdentifier.toNSString();
+    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
+
+    // getDomainsWithCompletionHandler is asynchronous -- we create a dispatch semaphore in order
+    // to wait until it is done. This should tell you that we should not call this method very
+    // often!
+
+    [NSFileProviderManager getDomainsWithCompletionHandler:^(NSArray<NSFileProviderDomain *> *const domains, NSError *const error) {
+        if (error != nil) {
+            qCWarning(lcMacImplFileProviderMaterialisedItemsModelMac) << "Error fetching domains:"
+                                                                      << error.localizedDescription;
+            dispatch_semaphore_signal(semaphore);
+            return;
+        }
+
+        BOOL foundDomain = NO;
+
+        for (NSFileProviderDomain *const domain in domains) {
+            if ([domain.identifier isEqualToString:nsDomainIdentifier]) {
+                 foundDomain = YES;
+                 manager = [NSFileProviderManager managerForDomain:domain];
+            }
+        }
+
+        if (!foundDomain) {
+            qCWarning(lcMacImplFileProviderMaterialisedItemsModelMac) << "No matching item domain, cannot get manager";
+        }
+
+        dispatch_semaphore_signal(semaphore);
+    }];
+
+    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
+
+    if (manager == nil) {
+        qCWarning(lcMacImplFileProviderMaterialisedItemsModelMac) << "Received null manager for domain" << domainIdentifier
+                                                                  << "cannot evict item" << identifier;
+        return;
+    }
+
+    [manager evictItemWithIdentifier:identifier.toNSString() completionHandler:^(NSError *error) {
+        if (error != nil) {
+            qCWarning(lcMacImplFileProviderMaterialisedItemsModelMac) << "Error evicting item due to error:"
+                                                                      << error.localizedDescription;
+        }
+    }];
+
+    // TODO: Update the model
+}
+
+
+} // namespace OCC
+
+} // namespace Mac