diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index ca9a40f4d61dc..8694202473b80 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -296,6 +296,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 diff --git a/src/gui/macOS/fileprovidermaterialiseditemsmodel.h b/src/gui/macOS/fileprovidermaterialiseditemsmodel.h index faae4b9598cca..e459e07606dd1 100644 --- a/src/gui/macOS/fileprovidermaterialiseditemsmodel.h +++ b/src/gui/macOS/fileprovidermaterialiseditemsmodel.h @@ -75,6 +75,7 @@ class FileProviderMaterialisedItemsModel : public QAbstractListModel public slots: void setItems(const QVector &items); + void evictItem(const QString &identifier, const QString &domainIdentifier); private: QVector _items; diff --git a/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm b/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm new file mode 100644 index 0000000000000..482e7e7ee67ac --- /dev/null +++ b/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm @@ -0,0 +1,82 @@ +/* + * Copyright 2023 (c) Claudio Cambra + * + * 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 + +#import + +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 *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