[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    kdepim/certmanager
From:       Marc Mutz <Marc.Mutz () uni-bielefeld ! de>
Date:       2004-10-12 7:47:50
Message-ID: 20041012074750.1852816C35 () office ! kde ! org
[Download RAW message or body]

CVS commit by mutz: 

Fix Aegypten II issue 240 for good (CertManager part):

- Re-populate mItemsToDelete from the list of keys to delete (in flat
  list mode, dependant items were not deleted, as they were only
  discovered by the keyring analyser).
- Walk through mItemsToDelete and delete the items leafs-first, to
  avoid double-deletes (triggered when mItemsToDelete contains both
  item and it's parent, and the parent comes first in the list).

In other news:

- Add WFlags argument to ctor, and wire WDestructiveClose into the
  passed value (fixing _the_ typical [QK]MainWindow subclass mistake)
- Add a dtor and delete a couple of things that might linger around,
  but probably don't ever so often.


  M +27 -3     certmanager.cpp   1.109
  M +2 -1      certmanager.h   1.46


--- kdepim/certmanager/certmanager.cpp  #1.108:1.109
@@ -162,6 +162,6 @@ namespace {
 
 CertManager::CertManager( bool remote, const QString& query, const QString & import,
-                          QWidget* parent, const char* name )
-  : KMainWindow( parent, name ),
+                          QWidget* parent, const char* name, WFlags f )
+  : KMainWindow( parent, name, f|WDestructiveClose ),
     mCrlView( 0 ),
     mDirmngrProc( 0 ),
@@ -212,4 +212,9 @@ CertManager::CertManager( bool remote, c
 }
 
+CertManager::~CertManager() {
+  delete mDirmngrProc; mDirmngrProc = 0;
+  delete mHierarchyAnalyser; mHierarchyAnalyser = 0;
+}
+
 void CertManager::createStatusBar() {
   KStatusBar * bar = statusBar();
@@ -1065,4 +1070,10 @@ void CertManager::slotDeleteCertificate(
                         i18n("Certificate Deletion Failed") );
   }
+
+  mItemsToDelete.clear(); // re-create according to the real selection
+  for ( std::vector<GpgME::Key>::const_iterator it = keysToDelete.begin() ; it != \
keysToDelete.end() ; ++it ) +    if ( Kleo::KeyListViewItem * item = \
mKeyListView->itemByFingerprint( it->primaryFingerprint() ) ) +      \
mItemsToDelete.append( item ); +
   Kleo::MultiDeleteJob * job = new Kleo::MultiDeleteJob( \
Kleo::CryptoBackendFactory::instance()->smime() );  assert( job );
@@ -1084,7 +1095,20 @@ void CertManager::slotDeleteResult( cons
     showDeleteError( this, err );
   else {
+    const int infinity = 100; // infinite loop guard...
     mItemsToDelete.setAutoDelete( true );
-    mItemsToDelete.clear();
+    for ( int i = 0 ; i < infinity ; ++i ) {
+      QPtrListIterator<Kleo::KeyListViewItem> it( mItemsToDelete );
+      while ( Kleo::KeyListViewItem * cur = it.current() ) {
+        ++it;
+        if ( cur->childCount() == 0 ) {
+          mItemsToDelete.remove( cur );
+        }
+      }
+      if ( mItemsToDelete.isEmpty() )
+        break;
+    }
     mItemsToDelete.setAutoDelete( false );
+    Q_ASSERT( mItemsToDelete.isEmpty() );
+    mItemsToDelete.clear();
   }
   disconnectJobFromStatusBarProgress( err );

--- kdepim/certmanager/certmanager.h  #1.45:1.46
@@ -82,5 +82,6 @@ public:
     CertManager( bool remote = false, const QString& query = QString::null,
                  const QString& import=QString::null,
-                 QWidget* parent = 0, const char* name = 0);
+                 QWidget * parent=0, const char * name=0, WFlags f=0 );
+    ~CertManager();
 
     bool isRemote() const { return mRemote; }


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic