From: Claudio Cambra Date: Sat, 11 Mar 2023 13:36:48 +0000 (+0100) Subject: Disconnect the file provider domains when Nextcloud client is closed X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~96^2^2~55^2~145 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=7a18d9df3a0ddbb9ed53c2d33b2cf27e34ecc1e3;p=nextcloud-desktop.git Disconnect the file provider domains when Nextcloud client is closed Signed-off-by: Claudio Cambra --- diff --git a/src/gui/macOS/fileproviderdomainmanager.h b/src/gui/macOS/fileproviderdomainmanager.h index c8973b7e8..221122af9 100644 --- a/src/gui/macOS/fileproviderdomainmanager.h +++ b/src/gui/macOS/fileproviderdomainmanager.h @@ -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); diff --git a/src/gui/macOS/fileproviderdomainmanager_mac.mm b/src/gui/macOS/fileproviderdomainmanager_mac.mm index ca96f6edf..4318c520b 100644 --- a/src/gui/macOS/fileproviderdomainmanager_mac.mm +++ b/src/gui/macOS/fileproviderdomainmanager_mac.mm @@ -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