diff --git a/src/models/keycache.cpp b/src/models/keycache.cpp index 4c93d8e10..142f2fa68 100644 --- a/src/models/keycache.cpp +++ b/src/models/keycache.cpp @@ -1,1751 +1,1796 @@ /* -*- mode: c++; c-basic-offset:4 -*- models/keycache.cpp This file is part of Kleopatra, the KDE keymanager SPDX-FileCopyrightText: 2007, 2008 Klarälvdalens Datakonsult AB SPDX-FileCopyrightText: 2018 Intevation GmbH - SPDX-FileCopyrightText: 2020 g10 Code GmbH + SPDX-FileCopyrightText: 2020, 2021 g10 Code GmbH SPDX-FileContributor: Ingo Klöcker SPDX-License-Identifier: GPL-2.0-or-later */ #include "keycache.h" #include "keycache_p.h" #include "kleo/enum.h" #include "kleo/keygroup.h" #include "kleo/keygroupconfig.h" #include "kleo/predicates.h" #include "kleo/stl_util.h" #include "kleo/dn.h" #include "utils/compat.h" #include "utils/filesystemwatcher.h" #include "utils/qtstlhelpers.h" #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include "kleo/debug.h" #include "libkleo_debug.h" #include using namespace std::chrono_literals; using namespace Kleo; using namespace GpgME; using namespace KMime::Types; static const unsigned int hours2ms = 1000 * 60 * 60; // // // KeyCache // // namespace { make_comparator_str(ByEMail, .first.c_str()); } +class Kleo::KeyCacheAutoRefreshSuspension +{ + KeyCacheAutoRefreshSuspension() + { + qCDebug(LIBKLEO_LOG) << __func__; + auto cache = KeyCache::mutableInstance(); + cache->enableFileSystemWatcher(false); + m_refreshInterval = cache->refreshInterval(); + cache->setRefreshInterval(0); + cache->cancelKeyListing(); + m_cache = cache; + } + +public: + ~KeyCacheAutoRefreshSuspension() + { + qCDebug(LIBKLEO_LOG) << __func__; + if (auto cache = m_cache.lock()) { + cache->enableFileSystemWatcher(true); + cache->setRefreshInterval(m_refreshInterval); + } + } + + static std::shared_ptr instance() + { + static std::weak_ptr self; + if (auto s = self.lock()) { + return s; + } else { + s = std::shared_ptr{new KeyCacheAutoRefreshSuspension{}}; + self = s; + return s; + } + } + +private: + std::weak_ptr m_cache; + int m_refreshInterval = 0; +}; + class KeyCache::Private { friend class ::Kleo::KeyCache; KeyCache *const q; public: explicit Private(KeyCache *qq) : q(qq), m_refreshInterval(1), m_initalized(false), m_pgpOnly(true), m_remarks_enabled(false) { connect(&m_autoKeyListingTimer, &QTimer::timeout, q, [this]() { q->startKeyListing(); }); updateAutoKeyListingTimer(); } ~Private() { if (m_refreshJob) { m_refreshJob->cancel(); } } template < template