]> dgit.raspbian.org Git - nextcloud-desktop.git/commitdiff
Add a file provider domain per account
authorClaudio Cambra <claudio.cambra@gmail.com>
Thu, 12 May 2022 20:49:32 +0000 (22:49 +0200)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 12 May 2023 05:21:06 +0000 (13:21 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
src/gui/fileprovider.h
src/gui/fileprovider_mac.mm
src/gui/main.cpp

index 0c816fe3ed56af9fb0b9bc532c5ea434c70449f5..65e0c0c4038b0e65901f7666bb0c6304adc7a98b 100644 (file)
 #ifndef FILEPROVIDER_H
 #define FILEPROVIDER_H
 
+#include <QObject>
+#include <QScopedPointer>
+
+#include "accountstate.h"
+
 namespace OCC {
 namespace Mac {
 
-    class FileProviderInitializer
-    {
-    public:
-        FileProviderInitializer();
-        ~FileProviderInitializer();
+class FileProvider : public QObject
+{
+public:
+    static FileProvider *instance();
+    ~FileProvider() override;
+
+    void setupFileProviderDomains();
+
+public slots:
+    void addFileProviderDomainForAccount(AccountState *account);
+    void removeFileProviderDomainForAccount(AccountState *account);
 
-    private:
-        class Private;
-        Private *d;
-    };
+private:
+    explicit FileProvider(QObject *parent = nullptr);
+    static FileProvider *_instance;
+    class Private;
+    QScopedPointer<Private> d;
+};
 
 } // namespace Mac
 } // namespace OCC
index 0a58ce1a7696a2f31f45292562a40fba9e24bdb6..e90f6fecc4076fcd20cc0dd94b9562a0ff393096 100644 (file)
@@ -25,46 +25,118 @@ Q_LOGGING_CATEGORY(lcMacFileProvider, "nextcloud.gui.macfileprovider")
 
 namespace Mac {
 
-class FileProviderInitializer::Private {
+FileProvider *FileProvider::_instance = nullptr;
+
+class FileProvider::Private {
   public:
-    Private() {
-        domainIdentifier = @SOCKETAPI_TEAM_IDENTIFIER_PREFIX APPLICATION_REV_DOMAIN;
-        name = @APPLICATION_NAME;
-        fileProviderDomain = [[NSFileProviderDomain alloc] initWithIdentifier:domainIdentifier displayName:name];
-        setupFileProvider();
+    Private()
+    {
     }
 
     ~Private() = default;
 
-    void setupFileProvider() {
+    void addFileProviderDomain(const QString &domainName, const QString &accountId)
+    {
+        qCDebug(lcMacFileProvider) << "Adding new file provider domain for account with id: " << accountId;
+
+        if(_registeredDomains.contains(accountId) && _registeredDomains.value(accountId) != nil) {
+            qCDebug(lcMacFileProvider) << "File provider domain for account with id already exists: " << accountId;
+            return;
+        }
+
+        NSFileProviderDomain *fileProviderDomain = [[NSFileProviderDomain alloc] initWithIdentifier:accountId.toNSString() displayName:domainName.toNSString()];
         [NSFileProviderManager addDomain:fileProviderDomain completionHandler:^(NSError *error) {
             if(error) {
-                NSLog(@"Add file provider domain: %i %@", [error code], [error localizedDescription]);
+                qCDebug(lcMacFileProvider) << "Error adding file provider domain: " << [error code] << [error localizedDescription];
             }
         }];
+
+        _registeredDomains.insert(accountId, fileProviderDomain);
     }
 
-    void removeFileProvider() {
+    void removeFileProviderDomain(const QString &accountId)
+    {
+        qCDebug(lcMacFileProvider) << "Removing file provider domain for account with id: " << accountId;
+
+        if(!_registeredDomains.contains(accountId)) {
+            qCDebug(lcMacFileProvider) << "File provider domain not found for id: " << accountId;
+            return;
+        }
+
+        NSFileProviderDomain* fileProviderDomain = _registeredDomains[accountId];
+
         [NSFileProviderManager removeDomain:fileProviderDomain completionHandler:^(NSError *error) {
             if(error) {
-                NSLog(@"Remove file provider domain: %i %@", [error code], [error localizedDescription]);
+                qCDebug(lcMacFileProvider) << "Error removing file provider domain: " << [error code] << [error localizedDescription];
+            }
+        }];
+
+        NSFileProviderDomain* domain = _registeredDomains.take(accountId);
+        [domain release];
+    }
+
+    void removeAllFileProviderDomains()
+    {
+        qCDebug(lcMacFileProvider) << "Removing all file provider domains.";
+
+        [NSFileProviderManager removeAllDomainsWithCompletionHandler:^(NSError *error) {
+            if(error) {
+                qCDebug(lcMacFileProvider) << "Error removing all file provider domains: " << [error code] << [error localizedDescription];
             }
         }];
     }
 
-    NSFileProviderDomainIdentifier domainIdentifier;
-    NSString *name;
-    NSFileProviderDomain *fileProviderDomain;
+private:
+    QHash<QString, NSFileProviderDomain*> _registeredDomains;
 };
 
-FileProviderInitializer::FileProviderInitializer() {
-    d = new FileProviderInitializer::Private();
-    d->setupFileProvider();
+FileProvider::FileProvider(QObject *parent)
+    : QObject(parent)
+{
+    d.reset(new FileProvider::Private());
+    d->checkExistingProviders();
+
+    connect(AccountManager::instance(), &AccountManager::accountAdded,
+             this, &FileProvider::addFileProviderDomainForAccount);
+    connect(AccountManager::instance(), &AccountManager::accountRemoved,
+             this, &FileProvider::removeFileProviderDomainForAccount);
+
+    setupFileProviderDomains(); // Initially fetch accounts in manager
+}
+
+FileProvider::~FileProvider()
+{
+    d->removeAllFileProviderDomains();
+}
+
+FileProvider *FileProvider::instance()
+{
+    if (!_instance) {
+        _instance = new FileProvider();
+    }
+    return _instance;
 }
 
-FileProviderInitializer::~FileProviderInitializer() {
-    d->removeFileProvider();
-    delete d;
+void FileProvider::setupFileProviderDomains()
+{
+    for(const auto &accountState : AccountManager::instance()->accounts()) {
+        addFileProviderDomainForAccount(accountState.data());
+    }
+}
+
+void FileProvider::addFileProviderDomainForAccount(AccountState *account)
+{
+    const auto accountDisplayName = account->account()->displayName();
+    const auto accountId = account->account()->id();
+
+    d->addFileProviderDomain(accountDisplayName, accountId);
+}
+
+void FileProvider::removeFileProviderDomainForAccount(AccountState* account)
+{
+    const auto accountId = account->account()->id();
+
+    d->removeFileProviderDomain(accountId);
 }
 
 } // namespace Mac
index 3b746d645e48db6561c918ad6db06f784aa4eecc..7ab8c99418082c5c7deebc6bc20aef27c45199df 100644 (file)
@@ -78,7 +78,7 @@ int main(int argc, char **argv)
     QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);
 #ifdef Q_OS_MAC
     Mac::CocoaInitializer cocoaInit; // RIIA
-    Mac::FileProviderInitializer fileProviderInit;
+    const auto fileProvider = OCC::Mac::FileProvider::instance();
 #endif
 
     auto surfaceFormat = QSurfaceFormat::defaultFormat();