[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdepim
From: Thomas McGuire <mcguire () kde ! org>
Date: 2008-09-07 15:14:35
Message-ID: 1220800475.753740.12740.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 858193 by tmcguire:
Merged revisions 856673 via svnmerge from
svn+ssh://tmcguire@svn.kde.org/home/kde/branches/kdepim/enterprise4/kdepim
........
r856673 | mutz | 2008-09-03 16:14:04 +0200 (Wed, 03 Sep 2008) | 3 lines
Fix order of components, groups and entries from semi-random (QHash does _not_ have \
a defined ordering) to always use the order defined by gpgconf. BUG:170243
Also, plug a possible mem leak.
........
_M . (directory)
M +58 -43 libkleo/backends/qgpgme/qgpgmecryptoconfig.cpp
M +9 -3 libkleo/backends/qgpgme/qgpgmecryptoconfig.h
** trunk/KDE/kdepim #property svnmerge-integrated
- /branches/kdepim/enterprise4/kdepim:1-809779,809818-812631,812633-813585,813587-8 \
13603,813605-813670,813672-816390,816392-817226,817228-817261,817263-817679,817681-818 \
695,818697-819956,819958-819963,819965-823883,823885-827552,827723,827832-829047,82904 \
9-829050,829052-833251,833747,834308,834950-834951,834955-834958,834961-834968,834977- \
834992,835010,835023,835028-835042,835049,835071,835074,835078-835080,835083,835085,83 \
5088-835093,835096,835107,835112-835342,835353,835355,835357-835363,835365-835380,8353 \
82-835383,835395,835397,835400-835403,835408-835411,835415,835426,835430-835432,835434 \
-835435,835437,835439-835440,835447,835451-835938,836295,836363,836390,836393-836394,8 \
36404,836408,836472,836498,836510,836512,836524,837586,837719,837823,839641,839986-840 \
017,840019-840127,841817,841844,841986,841990,842323,842333,842495,842562-843750,84375 \
2-843753,843755-849403,849405-849784,849786-850255,850258-850261,850263-850305,850307-850329,850331-850387,850389-850421,850423-85
0483,850485-850486,850488-850497,850499-850502,850504-850505,850507-850509,850511,85 \
0513-850573,850575-851249,851251-851253,851256-851293,851297-851306,851308-851309,8513 \
12,851314-851316,851320,851322,851325-851328,851333,851336,851342,851349,851351-851352 \
,851354,851358,851360-851371,851373,851376,851378,851380,851384,851389,851391,851395-8 \
51397,851399-852143,852637,852652,852736,852743,852759,853293,853769,853818,853947-853 \
957,853973,853982,853985,854004,854007,854025,854085,854399,854550-854628,856353,856635 \
/branches/kdepim/kmail-soc:1-809833,812465,826213-826424 + \
/branches/kdepim/enterprise4/kdepim:1-809779,809818-812631,812633-813585,813587-813603 \
,813605-813670,813672-816390,816392-817226,817228-817261,817263-817679,817681-818695,8 \
18697-819956,819958-819963,819965-823883,823885-827552,827723,827832-829047,829049-829 \
050,829052-833251,833747,834308,834950-834951,834955-834958,834961-834968,834977-83499 \
2,835010,835023,835028-835042,835049,835071,835074,835078-835080,835083,835085,835088- \
835093,835096,835107,835112-835342,835353,835355,835357-835363,835365-835380,835382-83 \
5383,835395,835397,835400-835403,835408-835411,835415,835426,835430-835432,835434-8354 \
35,835437,835439-835440,835447,835451-835938,836295,836363,836390,836393-836394,836404 \
,836408,836472,836498,836510,836512,836524,837586,837719,837823,839641,839986-840017,8 \
40019-840127,841817,841844,841986,841990,842323,842333,842495,842562-843750,843752-843 \
753,843755-849403,849405-849784,849786-850255,850258-850261,850263-850305,850307-850329,850331-850387,850389-850421,850423-85
0483,850485-850486,850488-850497,850499-850502,850504-850505,850507-850509,850511,85 \
0513-850573,850575-851249,851251-851253,851256-851293,851297-851306,851308-851309,8513 \
12,851314-851316,851320,851322,851325-851328,851333,851336,851342,851349,851351-851352 \
,851354,851358,851360-851371,851373,851376,851378,851380,851384,851389,851391,851395-8 \
51397,851399-852143,852637,852652,852736,852743,852759,853293,853769,853818,853947-853 \
957,853973,853982,853985,854004,854007,854025,854085,854399,854550-854628,856353,856635,856673 \
/branches/kdepim/kmail-soc:1-809833,812465,826213-826424
--- trunk/KDE/kdepim/libkleo/backends/qgpgme/qgpgmecryptoconfig.cpp #858192:858193
@@ -78,6 +78,7 @@
QGpgMECryptoConfig::~QGpgMECryptoConfig()
{
+ clear();
}
void QGpgMECryptoConfig::runGpgConf( bool showErrors )
@@ -133,44 +134,53 @@
// Format: NAME:DESCRIPTION
const QStringList lst = line.split( ':' );
if ( lst.count() >= 2 ) {
- mComponents.insert( lst[0], new QGpgMECryptoConfigComponent( this, lst[0], \
lst[1] ) ); + const std::pair<QString,QGpgMECryptoConfigComponent*> pair( \
lst[0], new QGpgMECryptoConfigComponent( this, lst[0], lst[1] ) ); + \
mComponentsNaturalOrder.push_back( pair ); + mComponentsByName[pair.first] = \
pair.second; } else {
kWarning(5150) <<"Parse error on gpgconf --list-components output:" << line;
}
}
}
+namespace {
+ struct Select1St {
+ template <typename U, typename V>
+ const U & operator()( const std::pair<U,V> & p ) const { return p.first; }
+ template <typename U, typename V>
+ const U & operator()( const QPair<U,V> & p ) const { return p.first; }
+ };
+}
+
QStringList QGpgMECryptoConfig::componentList() const
{
if ( !mParsed )
const_cast<QGpgMECryptoConfig*>( this )->runGpgConf( true );
- QStringList names;
- QList<QString> keylist = mComponents.uniqueKeys();
- foreach (QString key, keylist) {
- names << key;
- }
- return names;
+ QStringList result;
+ std::transform( mComponentsNaturalOrder.begin(), mComponentsNaturalOrder.end(),
+ std::back_inserter( result ), Select1St() );
+ return result;
}
Kleo::CryptoConfigComponent* QGpgMECryptoConfig::component( const QString& name ) \
const {
if ( !mParsed )
const_cast<QGpgMECryptoConfig*>( this )->runGpgConf( false );
- return mComponents.value( name );
+ return mComponentsByName.value( name );
}
void QGpgMECryptoConfig::sync( bool runtime )
{
- foreach (QGpgMECryptoConfigComponent *it, mComponents){
- it->sync(runtime);
- }
+ Q_FOREACH (QGpgMECryptoConfigComponent *it, mComponentsByName)
+ it->sync(runtime);
}
void QGpgMECryptoConfig::clear()
{
s_duringClear = true;
- qDeleteAll(mComponents);
- mComponents.clear();
+ mComponentsNaturalOrder.clear();
+ qDeleteAll(mComponentsByName);
+ mComponentsByName.clear();
s_duringClear = false;
mParsed = false; // next call to componentList/component will need to run gpgconf \
again }
@@ -185,8 +195,9 @@
QGpgMECryptoConfigComponent::~QGpgMECryptoConfigComponent()
{
- qDeleteAll(mGroups);
- mGroups.clear();
+ mGroupsNaturalOrder.clear();
+ qDeleteAll(mGroupsByName);
+ mGroupsByName.clear();
}
void QGpgMECryptoConfigComponent::runGpgConf()
@@ -223,8 +234,10 @@
if( rc != 0 ) // can happen when using the wrong version of gpg...
kWarning(5150) <<"Running 'gpgconf --list-options" << mName <<"' failed." << \
strerror( rc ) <<", but try that command to see the real output"; else {
- if ( mCurrentGroup && !mCurrentGroup->mEntries.isEmpty() ) // only add non-empty \
groups
- mGroups.insert( mCurrentGroupName, mCurrentGroup );
+ if ( mCurrentGroup && !mCurrentGroup->mEntriesNaturalOrder.empty() ) { // only \
add non-empty groups + mGroupsByName.insert( mCurrentGroupName, mCurrentGroup );
+ mGroupsNaturalOrder.push_back( std::make_pair( mCurrentGroupName, \
mCurrentGroup ) ); + }
}
}
@@ -247,8 +260,10 @@
if ( level > 2 ) // invisible or internal -> skip it;
continue;
if ( flags & GPGCONF_FLAG_GROUP ) {
- if ( mCurrentGroup && !mCurrentGroup->mEntries.isEmpty() ) // only add \
non-empty groups
- mGroups.insert( mCurrentGroupName, mCurrentGroup );
+ if ( mCurrentGroup && !mCurrentGroup->mEntriesNaturalOrder.empty() ) { // \
only add non-empty groups + mGroupsByName.insert( mCurrentGroupName, \
mCurrentGroup ); + mGroupsNaturalOrder.push_back( std::make_pair( \
mCurrentGroupName, mCurrentGroup ) ); + }
//else
// kDebug(5150) <<"Discarding empty group" << mCurrentGroupName;
mCurrentGroup = new QGpgMECryptoConfigGroup( this, lst[0], lst[3], level );
@@ -259,7 +274,10 @@
mCurrentGroup = new QGpgMECryptoConfigGroup( this, "<nogroup>", QString(), \
0 ); mCurrentGroupName = "<nogroup>";
}
- mCurrentGroup->mEntries.insert( lst[0], new QGpgMECryptoConfigEntry( \
mCurrentGroup, lst ) ); + const QString & name = lst[0];
+ QGpgMECryptoConfigEntry * value = new QGpgMECryptoConfigEntry( \
mCurrentGroup, lst ); + mCurrentGroup->mEntriesByName.insert( name, value );
+ mCurrentGroup->mEntriesNaturalOrder.push_back( std::make_pair( name, value ) \
); }
} else {
// This happens on lines like
@@ -272,17 +290,15 @@
QStringList QGpgMECryptoConfigComponent::groupList() const
{
- QStringList names;
- QList<QString> keylist = mGroups.uniqueKeys();
- foreach (QString key, keylist) {
- names << key;
- }
- return names;
+ QStringList result;
+ std::transform( mGroupsNaturalOrder.begin(), mGroupsNaturalOrder.end(),
+ std::back_inserter( result ), Select1St() );
+ return result;
}
Kleo::CryptoConfigGroup* QGpgMECryptoConfigComponent::group(const QString& name ) \
const {
- return mGroups.value( name );
+ return mGroupsByName.value( name );
}
void QGpgMECryptoConfigComponent::sync( bool runtime )
@@ -293,11 +309,11 @@
QList<QGpgMECryptoConfigEntry *> dirtyEntries;
// Collect all dirty entries
- QList<QString> keylist = mGroups.uniqueKeys();
- foreach (QString key, keylist) {
- QHash<QString,QGpgMECryptoConfigEntry*> entry = mGroups[key]->mEntries;
- QList<QString> keylistentry = entry.uniqueKeys();
- foreach (QString keyentry, keylistentry) {
+ const QList<QString> keylist = mGroupsByName.uniqueKeys();
+ Q_FOREACH (const QString & key, keylist) {
+ const QHash<QString,QGpgMECryptoConfigEntry*> entry = \
mGroupsByName[key]->mEntriesByName; + const QList<QString> keylistentry = \
entry.uniqueKeys(); + Q_FOREACH (const QString & keyentry, keylistentry) {
if(entry[keyentry]->isDirty())
{
// OK, we can set it.currentKey() to it.current()->outputString()
@@ -359,7 +375,7 @@
}
else
{
- QList<QGpgMECryptoConfigEntry *>::Iterator it = dirtyEntries.begin();
+ QList<QGpgMECryptoConfigEntry *>::const_iterator it = dirtyEntries.begin();
for( ; it != dirtyEntries.end(); ++it ) {
(*it)->setDirty( false );
}
@@ -379,23 +395,22 @@
QGpgMECryptoConfigGroup::~QGpgMECryptoConfigGroup()
{
- qDeleteAll(mEntries);
- mEntries.clear();
+ mEntriesNaturalOrder.clear();
+ qDeleteAll(mEntriesByName);
+ mEntriesByName.clear();
}
QStringList QGpgMECryptoConfigGroup::entryList() const
{
- QStringList names;
- QList<QString> keylist = mEntries.uniqueKeys();
- foreach (QString key, keylist) {
- names << key;
- }
- return names;
+ QStringList result;
+ std::transform( mEntriesNaturalOrder.begin(), mEntriesNaturalOrder.end(),
+ std::back_inserter( result ), Select1St() );
+ return result;
}
Kleo::CryptoConfigEntry* QGpgMECryptoConfigGroup::entry( const QString& name ) const
{
- return mEntries.value( name );
+ return mEntriesByName.value( name );
}
////
@@ -499,7 +514,7 @@
QVariant QGpgMECryptoConfigEntry::stringToValue( const QString& str, bool unescape ) \
const {
- bool isString = isStringType();
+ const bool isString = isStringType();
if ( isList() ) {
QList<QVariant> lst;
--- trunk/KDE/kdepim/libkleo/backends/qgpgme/qgpgmecryptoconfig.h #858192:858193
@@ -42,6 +42,9 @@
#include <QVariant>
#include <QPointer>
+#include <vector>
+#include <utility>
+
class QGpgMECryptoConfigComponent;
class QGpgMECryptoConfigEntry;
/**
@@ -74,7 +77,8 @@
void runGpgConf( bool showErrors );
private:
- QHash<QString, QGpgMECryptoConfigComponent*> mComponents;
+ std::vector<std::pair<QString, QGpgMECryptoConfigComponent*> > \
mComponentsNaturalOrder; + QHash<QString, QGpgMECryptoConfigComponent*> \
mComponentsByName; bool mParsed;
};
@@ -102,7 +106,8 @@
void runGpgConf();
private:
- QHash<QString,QGpgMECryptoConfigGroup*> mGroups;
+ std::vector< std::pair<QString,QGpgMECryptoConfigGroup*> > mGroupsNaturalOrder;
+ QHash<QString,QGpgMECryptoConfigGroup*> mGroupsByName;
QString mName;
QString mDescription;
QGpgMECryptoConfigGroup* mCurrentGroup; // during parsing
@@ -126,7 +131,8 @@
private:
friend class QGpgMECryptoConfigComponent; // it adds the entries
QPointer<QGpgMECryptoConfigComponent> mComponent;
- QHash<QString,QGpgMECryptoConfigEntry*> mEntries;
+ std::vector< std::pair<QString,QGpgMECryptoConfigEntry*> > mEntriesNaturalOrder;
+ QHash<QString,QGpgMECryptoConfigEntry*> mEntriesByName;
QString mName;
QString mDescription;
Kleo::CryptoConfigEntry::Level mLevel;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic