public:
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
[[nodiscard]] std::optional<std::pair<bool, bool>> fastEnumerationStateForExtension(const QString &extensionAccountId) const;
#include <QLoggingCategory>
#include "gui/accountmanager.h"
+#include "gui/macOS/fileprovider.h"
#include "gui/macOS/fileproviderdomainmanager.h"
#include "gui/macOS/fileproviderxpc_mac_utils.h"
}
}
-bool FileProviderXPC::fileProviderExtReachable(const QString &extensionAccountId)
-{
+bool FileProviderXPC::fileProviderExtReachable(const QString &extensionAccountId, const bool retry, const bool reconfigureOnFail)
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. "
<< "Not checking again";
return false;
const auto service = (NSObject<ClientCommunicationProtocol> *)_clientCommServices.value(extensionAccountId);
if (service == nil) {
+ qCWarning(lcFileProviderXPC) << "Could not get service for extension" << extensionAccountId;
return false;
}
_unreachableAccountExtensions.remove(extensionAccountId);
} else {
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;
}