If fileProviderExtRecheable is false, try to reconfigure client communication service

Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
This commit is contained in:
Claudio Cambra 2024-11-05 16:05:33 +09:00
Родитель a255c1f1cb
Коммит 078dd25eb1
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: C839200C384636B0
2 изменённых файлов: 29 добавлений и 5 удалений

Просмотреть файл

@ -35,7 +35,7 @@ class FileProviderXPC : public QObject
public: public:
explicit FileProviderXPC(QObject *parent = nullptr); explicit FileProviderXPC(QObject *parent = nullptr);
[[nodiscard]] bool fileProviderExtReachable(const QString &extensionAccountId); [[nodiscard]] bool fileProviderExtReachable(const QString &extensionAccountId, bool retry = true, bool reconfigureOnFail = true);
// Returns enabled and set state of fast enumeration for the given extension // Returns enabled and set state of fast enumeration for the given extension
[[nodiscard]] std::optional<std::pair<bool, bool>> fastEnumerationStateForExtension(const QString &extensionAccountId) const; [[nodiscard]] std::optional<std::pair<bool, bool>> fastEnumerationStateForExtension(const QString &extensionAccountId) const;

Просмотреть файл

@ -17,6 +17,7 @@
#include <QLoggingCategory> #include <QLoggingCategory>
#include "gui/accountmanager.h" #include "gui/accountmanager.h"
#include "gui/macOS/fileprovider.h"
#include "gui/macOS/fileproviderdomainmanager.h" #include "gui/macOS/fileproviderdomainmanager.h"
#include "gui/macOS/fileproviderxpc_mac_utils.h" #include "gui/macOS/fileproviderxpc_mac_utils.h"
@ -144,10 +145,12 @@ void FileProviderXPC::createDebugArchiveForExtension(const QString &extensionAcc
} }
} }
bool FileProviderXPC::fileProviderExtReachable(const QString &extensionAccountId) bool FileProviderXPC::fileProviderExtReachable(const QString &extensionAccountId, const bool retry, const bool reconfigureOnFail)
{
const auto lastUnreachableTime = _unreachableAccountExtensions.value(extensionAccountId); const auto lastUnreachableTime = _unreachableAccountExtensions.value(extensionAccountId);
if (lastUnreachableTime.isValid() && lastUnreachableTime.secsTo(QDateTime::currentDateTime()) < ::reachableRetryTimeout) { if (!retry
&& !reconfigureOnFail
&& lastUnreachableTime.isValid()
&& lastUnreachableTime.secsTo(QDateTime::currentDateTime()) < ::reachableRetryTimeout) {
qCInfo(lcFileProviderXPC) << "File provider extension was unreachable less than a minute ago. " qCInfo(lcFileProviderXPC) << "File provider extension was unreachable less than a minute ago. "
<< "Not checking again"; << "Not checking again";
return false; return false;
@ -155,6 +158,7 @@ bool FileProviderXPC::fileProviderExtReachable(const QString &extensionAccountId
const auto service = (NSObject<ClientCommunicationProtocol> *)_clientCommServices.value(extensionAccountId); const auto service = (NSObject<ClientCommunicationProtocol> *)_clientCommServices.value(extensionAccountId);
if (service == nil) { if (service == nil) {
qCWarning(lcFileProviderXPC) << "Could not get service for extension" << extensionAccountId;
return false; return false;
} }
@ -170,7 +174,27 @@ bool FileProviderXPC::fileProviderExtReachable(const QString &extensionAccountId
_unreachableAccountExtensions.remove(extensionAccountId); _unreachableAccountExtensions.remove(extensionAccountId);
} else { } else {
qCWarning(lcFileProviderXPC) << "Could not reach file provider extension."; qCWarning(lcFileProviderXPC) << "Could not reach file provider extension.";
_unreachableAccountExtensions.insert(extensionAccountId, QDateTime::currentDateTime());
if (reconfigureOnFail) {
qCWarning(lcFileProviderXPC) << "Could not reach extension"
<< extensionAccountId
<< "going to attempt reconfiguring interface";
const auto ncDomainManager = FileProvider::instance()->domainManager();
const auto accountState = ncDomainManager->accountStateFromFileProviderDomainIdentifier(extensionAccountId);
const auto domain = (NSFileProviderDomain *)(ncDomainManager->domainForAccount(accountState.get()));
const auto manager = [NSFileProviderManager managerForDomain:domain];
const auto fpServices = FileProviderXPCUtils::getFileProviderServices(@[manager]);
const auto connections = FileProviderXPCUtils::connectToFileProviderServices(fpServices);
const auto services = FileProviderXPCUtils::processClientCommunicationConnections(connections);
_clientCommServices.insert(services);
}
if (retry) {
qCWarning(lcFileProviderXPC) << "Could not reach extension" << extensionAccountId << "retrying";
return fileProviderExtReachable(extensionAccountId, false, false);
} else {
_unreachableAccountExtensions.insert(extensionAccountId, QDateTime::currentDateTime());
}
} }
return response; return response;
} }