]> dgit.raspbian.org Git - nextcloud-desktop.git/commitdiff
Set connection status for file provider domains
authorClaudio Cambra <claudio.cambra@gmail.com>
Fri, 13 May 2022 11:50:17 +0000 (13:50 +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>
shell_integration/MacOSX/OwnCloudFinderSync/FileProviderExt/FileProviderExtension.swift
src/gui/fileprovider.h
src/gui/fileprovider_mac.mm

index 53ee6bfefe37bb26caa3409e570f10ff9d1f1fd3..f32c49b87ee26b6cca02432961dc7020847f3e88 100644 (file)
 import FileProvider
 
 class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension {
+    let domain: NSFileProviderDomain
+    
     required init(domain: NSFileProviderDomain) {
+        self.domain = domain
         // The containing application must create a domain using `NSFileProviderManager.add(_:, completionHandler:)`. The system will then launch the application extension process, call `FileProviderExtension.init(domain:)` to instantiate the extension for that domain, and call methods on the instance.
         super.init()
     }
index 65e0c0c4038b0e65901f7666bb0c6304adc7a98b..296ebc551ebee20ae9ea0ab1ea14714fe1b57378 100644 (file)
@@ -23,6 +23,9 @@
 namespace OCC {
 namespace Mac {
 
+// NOTE: For the file provider extension to work, the app bundle will
+// need to be correctly codesigned!
+
 class FileProvider : public QObject
 {
 public:
@@ -31,9 +34,10 @@ public:
 
     void setupFileProviderDomains();
 
-public slots:
-    void addFileProviderDomainForAccount(AccountState *account);
-    void removeFileProviderDomainForAccount(AccountState *account);
+private slots:
+    void addFileProviderDomainForAccount(AccountState *accountState);
+    void removeFileProviderDomainForAccount(AccountState *accountState);
+    void setFileProviderForAccountIsConnected(AccountState *accountState);
 
 private:
     explicit FileProvider(QObject *parent = nullptr);
index e90f6fecc4076fcd20cc0dd94b9562a0ff393096..4f2669ffa84a760ae867e0f726b351d7e8658f0c 100644 (file)
@@ -35,8 +35,11 @@ class FileProvider::Private {
 
     ~Private() = default;
 
-    void addFileProviderDomain(const QString &domainName, const QString &accountId)
+    void addFileProviderDomain(const AccountState *accountState)
     {
+        const QString accountDisplayName = accountState->account()->displayName();
+        const QString accountId = accountState->account()->id();
+
         qCDebug(lcMacFileProvider) << "Adding new file provider domain for account with id: " << accountId;
 
         if(_registeredDomains.contains(accountId) && _registeredDomains.value(accountId) != nil) {
@@ -44,7 +47,7 @@ class FileProvider::Private {
             return;
         }
 
-        NSFileProviderDomain *fileProviderDomain = [[NSFileProviderDomain alloc] initWithIdentifier:accountId.toNSString() displayName:domainName.toNSString()];
+        NSFileProviderDomain *fileProviderDomain = [[NSFileProviderDomain alloc] initWithIdentifier:accountId.toNSString() displayName:accountDisplayName.toNSString()];
         [NSFileProviderManager addDomain:fileProviderDomain completionHandler:^(NSError *error) {
             if(error) {
                 qCDebug(lcMacFileProvider) << "Error adding file provider domain: " << [error code] << [error localizedDescription];
@@ -54,8 +57,9 @@ class FileProvider::Private {
         _registeredDomains.insert(accountId, fileProviderDomain);
     }
 
-    void removeFileProviderDomain(const QString &accountId)
+    void removeFileProviderDomain(const AccountState *accountState)
     {
+        const QString accountId = accountState->account()->id();
         qCDebug(lcMacFileProvider) << "Removing file provider domain for account with id: " << accountId;
 
         if(!_registeredDomains.contains(accountId)) {
@@ -86,6 +90,41 @@ class FileProvider::Private {
         }];
     }
 
+    void setFileProviderDomainConnected(const AccountState *accountState)
+    {
+        const QString accountDisplayName = accountState->account()->displayName();
+        const QString accountId = accountState->account()->id();
+        const bool accountIsConnected = accountState->isConnected();
+
+        qCDebug(lcMacFileProvider) << "Account state for account changed: " << accountDisplayName << accountIsConnected;
+
+        if(!_registeredDomains.contains(accountId)) {
+            qCDebug(lcMacFileProvider) << "File provider domain not found for id: " << accountId;
+            return;
+        }
+
+        NSFileProviderDomain* accountDomain = _registeredDomains.value(accountId);
+        NSFileProviderManager* providerManager = [NSFileProviderManager managerForDomain:accountDomain];
+
+        if(accountIsConnected) {
+            [providerManager reconnectWithCompletionHandler:^(NSError *error) {
+                if(error) {
+                    qCDebug(lcMacFileProvider) << "Error reconnecting file provider domain: " << accountDisplayName << [error code] << [error localizedDescription];
+                }
+            }];
+        } else {
+            NSString* reason = @"Nextcloud account disconnected.";
+            const auto isTemporary = accountState->state() != AccountState::SignedOut && accountState->state() != AccountState::ConfigurationError;
+            NSFileProviderManagerDisconnectionOptions disconnectOption = isTemporary ? 0 : NSFileProviderManagerDisconnectionOptionsTemporary;
+
+            [providerManager disconnectWithReason:reason options:disconnectOption completionHandler:^(NSError *error) {
+                if(error) {
+                    qCDebug(lcMacFileProvider) << "Error disconnecting file provider domain: " << accountDisplayName << [error code] << [error localizedDescription];
+                }
+            }];
+        }
+    }
+
 private:
     QHash<QString, NSFileProviderDomain*> _registeredDomains;
 };
@@ -94,12 +133,11 @@ FileProvider::FileProvider(QObject *parent)
     : QObject(parent)
 {
     d.reset(new FileProvider::Private());
-    d->checkExistingProviders();
 
     connect(AccountManager::instance(), &AccountManager::accountAdded,
-             this, &FileProvider::addFileProviderDomainForAccount);
+            this, &FileProvider::addFileProviderDomainForAccount);
     connect(AccountManager::instance(), &AccountManager::accountRemoved,
-             this, &FileProvider::removeFileProviderDomainForAccount);
+            this, &FileProvider::removeFileProviderDomainForAccount);
 
     setupFileProviderDomains(); // Initially fetch accounts in manager
 }
@@ -119,24 +157,27 @@ FileProvider *FileProvider::instance()
 
 void FileProvider::setupFileProviderDomains()
 {
-    for(const auto &accountState : AccountManager::instance()->accounts()) {
+    for(auto &accountState : AccountManager::instance()->accounts()) {
         addFileProviderDomainForAccount(accountState.data());
     }
 }
 
-void FileProvider::addFileProviderDomainForAccount(AccountState *account)
+void FileProvider::addFileProviderDomainForAccount(AccountState *accountState)
 {
-    const auto accountDisplayName = account->account()->displayName();
-    const auto accountId = account->account()->id();
+    d->addFileProviderDomain(accountState);
 
-    d->addFileProviderDomain(accountDisplayName, accountId);
+    connect(accountState, &AccountState::isConnectedChanged,
+            this, [this, accountState]{ setFileProviderForAccountIsConnected(accountState); });
 }
 
-void FileProvider::removeFileProviderDomainForAccount(AccountState* account)
+void FileProvider::removeFileProviderDomainForAccount(AccountState* accountState)
 {
-    const auto accountId = account->account()->id();
+    d->removeFileProviderDomain(accountState);
+}
 
-    d->removeFileProviderDomain(accountId);
+void FileProvider::setFileProviderForAccountIsConnected(AccountState *accountState)
+{
+    d->setFileProviderDomainConnected(accountState);
 }
 
 } // namespace Mac