From kde-commits Mon Nov 29 16:25:25 2010 From: Marc Mutz Date: Mon, 29 Nov 2010 16:25:25 +0000 To: kde-commits Subject: KDE/kdepim/kleopatra/models Message-Id: <20101129162525.4AAE9AC8AA () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=129104797216847 SVN commit 1202092 by mutz: KeyCache: simplify RefreshKeysJob by using Kleo::ListAllKeysJob M +30 -62 keycache.cpp M +1 -2 keycache_p.h --- trunk/KDE/kdepim/kleopatra/models/keycache.cpp #1202091:1202092 @@ -46,6 +46,7 @@ #include #include #include +#include #include #include @@ -95,22 +96,7 @@ bool operator()( const char * s ) const { return !s || !*s; } }; - template - ForwardIterator unique_by_merge( ForwardIterator first, ForwardIterator last, BinaryPredicate pred ) { - first = std::adjacent_find( first, last, pred ); - if ( first == last ) - return last; - - ForwardIterator dest = first; - dest->mergeWith( *++first ); - while ( ++first != last ) - if ( pred( *dest, *first ) ) - dest->mergeWith( *first ); - else - *++dest = *first; - return ++dest; } -} class KeyCache::Private { friend class ::Kleo::KeyCache; @@ -859,29 +845,28 @@ { RefreshKeysJob * const q; public: - enum KeyType { - PublicKeys, - SecretKeys - }; - Private( KeyCache * cache, RefreshKeysJob * qq ); void doStart(); - Error startKeyListing( const char* protocol, KeyType type ); - void publicKeyJobDone( const KeyListResult & res, const std::vector & keys ) { - m_publicKeys.insert( m_publicKeys.end(), keys.begin(), keys.end() ); + Error startKeyListing( const char* protocol ); + void listAllKeysJobDone( const KeyListResult & res, const std::vector & nextKeys ) { + std::vector keys; + keys.reserve( m_keys.size() + nextKeys.size() ); + if ( m_keys.empty() ) + keys = nextKeys; + else + std::merge( m_keys.begin(), m_keys.end(), + nextKeys.begin(), nextKeys.end(), + std::back_inserter( keys ), + _detail::ByFingerprint() ); + m_keys.swap( keys ); jobDone( res ); } - void secretKeyJobDone( const KeyListResult & res, const std::vector & keys ) { - m_secretKeys.insert( m_secretKeys.end(), keys.begin(), keys.end() ); - jobDone( res ); - } void emitDone( const KeyListResult & result ); - void mergeKeysAndUpdateKeyCache(); + void updateKeyCache(); KeyCache * m_cache; uint m_jobsPending; - std::vector m_publicKeys; - std::vector m_secretKeys; + std::vector m_keys; KeyListResult m_mergedResult; private: @@ -903,7 +888,7 @@ m_mergedResult.mergeWith( result ); if ( m_jobsPending > 0 ) return; - mergeKeysAndUpdateKeyCache(); + updateKeyCache(); emitDone( m_mergedResult ); } @@ -933,10 +918,8 @@ void KeyCache::RefreshKeysJob::Private::doStart() { assert( m_jobsPending == 0 ); - m_mergedResult.mergeWith( KeyListResult( startKeyListing( "openpgp", PublicKeys ) ) ); - m_mergedResult.mergeWith( KeyListResult( startKeyListing( "smime", PublicKeys ) ) ); - m_mergedResult.mergeWith( KeyListResult( startKeyListing( "openpgp", SecretKeys ) ) ); - m_mergedResult.mergeWith( KeyListResult( startKeyListing( "smime", SecretKeys ) ) ); + m_mergedResult.mergeWith( KeyListResult( startKeyListing( "openpgp" ) ) ); + m_mergedResult.mergeWith( KeyListResult( startKeyListing( "smime" ) ) ); if ( m_jobsPending != 0 ) return; @@ -945,54 +928,39 @@ emitDone( hasError ? m_mergedResult : KeyListResult( Error( GPG_ERR_UNSUPPORTED_OPERATION ) ) ); } -void KeyCache::RefreshKeysJob::Private::mergeKeysAndUpdateKeyCache() +void KeyCache::RefreshKeysJob::Private::updateKeyCache() { - std::sort( m_publicKeys.begin(), m_publicKeys.end(), _detail::ByFingerprint() ); - std::sort( m_secretKeys.begin(), m_secretKeys.end(), _detail::ByFingerprint() ); - - std::vector keys; - keys.reserve( m_publicKeys.size() + m_secretKeys.size() ); - - std::merge( m_publicKeys.begin(), m_publicKeys.end(), - m_secretKeys.begin(), m_secretKeys.end(), - std::back_inserter( keys ), - _detail::ByFingerprint() ); - - keys.erase( unique_by_merge( keys.begin(), keys.end(), _detail::ByFingerprint() ), - keys.end() ); - std::vector cachedKeys = m_cache->keys(); std::sort( cachedKeys.begin(), cachedKeys.end(), _detail::ByFingerprint() ); std::vector keysToRemove; - std::set_difference( cachedKeys.begin(), cachedKeys.end(), keys.begin(), keys.end(), std::back_inserter( keysToRemove ), _detail::ByFingerprint() ); + std::set_difference( cachedKeys.begin(), cachedKeys.end(), + m_keys.begin(), m_keys.end(), + std::back_inserter( keysToRemove ), + _detail::ByFingerprint() ); m_cache->remove( keysToRemove ); - m_cache->refresh( keys ); + m_cache->refresh( m_keys ); } -Error KeyCache::RefreshKeysJob::Private::startKeyListing( const char* backend, KeyType type ) +Error KeyCache::RefreshKeysJob::Private::startKeyListing( const char* backend ) { const Kleo::CryptoBackend::Protocol * const protocol = Kleo::CryptoBackendFactory::instance()->protocol( backend ); if ( !protocol ) return Error(); - Kleo::KeyListJob * const job = protocol->keyListJob( /*remote*/false, /*includeSigs*/false, /*validate*/true ); + Kleo::ListAllKeysJob * const job = protocol->listAllKeysJob( /*includeSigs*/false, /*validate*/true ); if ( !job ) return Error(); - if ( type == PublicKeys ) connect( job, SIGNAL(result(GpgME::KeyListResult,std::vector)), - q, SLOT(publicKeyJobDone(GpgME::KeyListResult,std::vector)) ); - else - connect( job, SIGNAL(result(GpgME::KeyListResult,std::vector)), - q, SLOT(secretKeyJobDone(GpgME::KeyListResult,std::vector)) ); + q, SLOT(listAllKeysJobDone(GpgME::KeyListResult,std::vector)) ); const QString label = protocol == Kleo::CryptoBackendFactory::instance()->smime() - ? type == PublicKeys ? i18n("Listing public X.509 certificates") : i18n("Listing private X.509 certificates") - : type == PublicKeys ? i18n("Listing public OpenPGP certificates") : i18n("Listing private OpenPGP certificates") ; + ? i18n("Listing X.509 certificates") + : i18n("Listing OpenPGP certificates") ; (void)ProgressManager::createForJob( job, label ); connect( q, SIGNAL(canceled()), job, SLOT(slotCancel()) ); - const Error error = job->start( QStringList(), type == SecretKeys ); + const Error error = job->start( true ); if ( !error && !error.isCanceled() ) ++m_jobsPending; --- trunk/KDE/kdepim/kleopatra/models/keycache_p.h #1202091:1202092 @@ -60,8 +60,7 @@ class Private; friend class Private; kdtools::pimpl_ptr d; - Q_PRIVATE_SLOT( d, void publicKeyJobDone(GpgME::KeyListResult,std::vector) ) - Q_PRIVATE_SLOT( d, void secretKeyJobDone(GpgME::KeyListResult,std::vector) ) + Q_PRIVATE_SLOT( d, void listAllKeysJobDone(GpgME::KeyListResult, std::vector) ) Q_PRIVATE_SLOT( d, void doStart() ) }; }