[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