]> dgit.raspbian.org Git - nextcloud-desktop.git/commitdiff
Disconnect the file provider domains when Nextcloud client is closed
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Sat, 11 Mar 2023 13:36:48 +0000 (14:36 +0100)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 12 May 2023 05:21:28 +0000 (13:21 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
src/gui/macOS/fileproviderdomainmanager.h
src/gui/macOS/fileproviderdomainmanager_mac.mm

index c8973b7e828dbc6400dca7c3ebbb3ff7857c40e0..221122af91dac679c2c9393f37b73138b751cbcd 100644 (file)
@@ -36,6 +36,7 @@ private slots:
 
     void addFileProviderDomainForAccount(const OCC::AccountState * const accountState);
     void removeFileProviderDomainForAccount(const OCC::AccountState * const accountState);
+    void disconnectFileProviderDomainForAccount(const OCC::AccountState * const accountState);
 
     void trySetupPushNotificationsForAccount(const OCC::Account * const account);
     void setupPushNotificationsForAccount(const OCC::Account * const account);
index ca96f6edf1568da50a034aa44573c72214eb61f5..4318c520bb7398b2663432430309a37a90901b30 100644 (file)
@@ -102,6 +102,20 @@ class FileProviderDomainManager::Private {
                     [domain retain];
                     _registeredDomains.insert(accountId, domain);
 
+                    NSFileProviderManager * const fpManager = [NSFileProviderManager managerForDomain:domain];
+                    [fpManager reconnectWithCompletionHandler:^(NSError * const error) {
+                        if (error) {
+                            qCDebug(lcMacFileProviderDomainManager) << "Error reconnecting file provider domain: "
+                                                                    << domain.displayName
+                                                                    << error.code
+                                                                    << error.localizedDescription;
+                            return;
+                        }
+
+                        qCDebug(lcMacFileProviderDomainManager) << "Successfully reconnected file provider domain: "
+                                                                << domain.displayName;
+                    }];
+
                 } else {
                     qCDebug(lcMacFileProviderDomainManager) << "Found existing file provider domain with no known configured account:"
                                                             << domain.displayName;
@@ -235,6 +249,39 @@ class FileProviderDomainManager::Private {
         }];
     }
 
+    void disconnectFileProviderDomainForAccount(const AccountState * const accountState)
+    {
+        Q_ASSERT(accountState);
+        const auto account = accountState->account();
+        Q_ASSERT(account);
+
+        const auto domainId = domainIdentifierForAccount(account);
+        qCDebug(lcMacFileProviderDomainManager) << "Removing file provider domain with id: " << domainId;
+
+        if(!_registeredDomains.contains(domainId)) {
+            qCDebug(lcMacFileProviderDomainManager) << "File provider domain not found for id: " << domainId;
+            return;
+        }
+
+        NSFileProviderDomain * const fileProviderDomain = _registeredDomains[domainId];
+        NSFileProviderManager * const fpManager = [NSFileProviderManager managerForDomain:fileProviderDomain];
+
+        [fpManager disconnectWithReason:@"Nextcloud application has been closed. Reopen to reconnect."
+                                options:NSFileProviderManagerDisconnectionOptionsTemporary
+                      completionHandler:^(NSError * const error) {
+            if (error) {
+                qCDebug(lcMacFileProviderDomainManager) << "Error disconnecting file provider domain: "
+                                                        << fileProviderDomain.displayName
+                                                        << error.code
+                                                        << error.localizedDescription;
+                return;
+            }
+
+            qCDebug(lcMacFileProviderDomainManager) << "Successfully disconnected file provider domain: "
+                                                    << fileProviderDomain.displayName;
+        }];
+    }
+
     void signalEnumeratorChanged(const Account * const account)
     {
         Q_ASSERT(account);
@@ -272,8 +319,13 @@ FileProviderDomainManager::FileProviderDomainManager(QObject * const parent)
 
     connect(AccountManager::instance(), &AccountManager::accountAdded,
             this, &FileProviderDomainManager::addFileProviderDomainForAccount);
+    // If an account is deleted from the client, accountSyncConnectionRemoved will be
+    // emitted first. So we treat accountRemoved as only being relevant to client
+    // shutdowns.
     connect(AccountManager::instance(), &AccountManager::accountSyncConnectionRemoved,
             this, &FileProviderDomainManager::removeFileProviderDomainForAccount);
+    connect(AccountManager::instance(), &AccountManager::accountRemoved,
+            this, &FileProviderDomainManager::disconnectFileProviderDomainForAccount);
 }
 
 FileProviderDomainManager *FileProviderDomainManager::instance()
@@ -349,7 +401,7 @@ void FileProviderDomainManager::signalEnumeratorChanged(const Account * const ac
     d->signalEnumeratorChanged(account);
 }
 
-void FileProviderDomainManager::removeFileProviderDomainForAccount(const AccountState *  const accountState)
+void FileProviderDomainManager::removeFileProviderDomainForAccount(const AccountState * const accountState)
 {
     Q_ASSERT(accountState);
     const auto account = accountState->account();
@@ -367,6 +419,15 @@ void FileProviderDomainManager::removeFileProviderDomainForAccount(const Account
     }
 }
 
+void FileProviderDomainManager::disconnectFileProviderDomainForAccount(const AccountState * const accountState)
+{
+    Q_ASSERT(accountState);
+    const auto account = accountState->account();
+    Q_ASSERT(account);
+
+    d->disconnectFileProviderDomainForAccount(accountState);
+}
+
 } // namespace Mac
 
 } // namespace OCC