From ce537eedc0035d5810f994010f5258e28b090f17 Mon Sep 17 00:00:00 2001 From: Volker Krause Date: Thu, 19 Jul 2007 08:48:28 +0000 Subject: [PATCH] Merge SVN commit 677090 by vkrause from enterprise branch: No more invalid reads while deleting/moving folders. svn path=/trunk/KDE/kdepim/; revision=689818 --- kmfoldermgr.cpp | 5 ++++- kmfoldertree.cpp | 4 ++++ kmmainwidget.cpp | 4 ++-- kmmainwidget.h | 3 ++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/kmfoldermgr.cpp b/kmfoldermgr.cpp index 4cc40db3c..60e337024 100644 --- a/kmfoldermgr.cpp +++ b/kmfoldermgr.cpp @@ -356,13 +356,16 @@ void KMFolderMgr::removeFolderAux(KMFolder* aFolder, bool success) break; } } - aFolder->parent()->removeAll(aFolder); // find the parent folder by stripping "." and ".directory" from the name QString parentName = fdir->name(); parentName = parentName.mid( 1, parentName.length()-11 ); KMFolderNode* parent = fdir->hasNamedFolder( parentName ); if ( !parent && fdir->parent() ) // dimap obviously has a different structure parent = fdir->parent()->hasNamedFolder( parentName ); + + // aFolder will be deleted by the next call! + aFolder->parent()->removeAll(aFolder); + // update the children state if ( parent ) static_cast(parent)->storage()->updateChildrenState(); diff --git a/kmfoldertree.cpp b/kmfoldertree.cpp index 254a483cc..f80c1a769 100644 --- a/kmfoldertree.cpp +++ b/kmfoldertree.cpp @@ -796,6 +796,10 @@ void KMFolderTree::slotFolderRemoved(KMFolder *aFolder) { KMFolderTreeItem *fti = static_cast (indexOfFolder(aFolder)); + if ( oldCurrent == fti ) + oldCurrent = 0; + if ( oldSelected == fti ) + oldSelected = 0; if (!fti || !fti->folder()) return; if (fti == currentItem()) { diff --git a/kmmainwidget.cpp b/kmmainwidget.cpp index a6dd239e3..52fa4ffd2 100644 --- a/kmmainwidget.cpp +++ b/kmmainwidget.cpp @@ -1980,7 +1980,7 @@ void KMMainWidget::folderSelected( KMFolder* aFolder, bool forceJumpToUnread ) // when the new folder is also an IMAP folder, because that's an // async operation and we don't want flicker if it results in just // a new splash. - bool newFolder = ( mFolder != aFolder ); + bool newFolder = ( (KMFolder*)mFolder != aFolder ); bool isNewImapFolder = aFolder && aFolder->folderType() == KMFolderTypeImap && newFolder; if( !mFolder || ( !isNewImapFolder && mShowBusySplashTimer ) @@ -3629,7 +3629,7 @@ void KMMainWidget::updateMessageActions() if(!(msg = mFolder->getMsg(aIdx))) return; - if (mFolder == kmkernel->outboxFolder()) + if ((KMFolder*)mFolder == kmkernel->outboxFolder()) mEditAction->setEnabled( !msg->transferInProgress() ); } diff --git a/kmmainwidget.h b/kmmainwidget.h index db9ff03fa..3da434408 100644 --- a/kmmainwidget.h +++ b/kmmainwidget.h @@ -37,6 +37,7 @@ #include #include #include +#include class Q3Accel; class QVBoxLayout; @@ -504,7 +505,7 @@ class KMAIL_EXPORT KMMainWidget : public QWidget KVBox *mSearchAndHeaders; QToolBar *mSearchToolBar; KMail::HeaderListQuickSearch *mQuickSearchLine; - KMFolder *mFolder; + QPointer mFolder; KMFolder *mTemplateFolder; QMenu *mViewMenu, *mBodyPartsMenu; KAction *mlistFilterAction;