diff --git a/folderstorage.cpp b/folderstorage.cpp index 913f883e7..02f4ce379 100644 --- a/folderstorage.cpp +++ b/folderstorage.cpp @@ -84,6 +84,8 @@ FolderStorage::FolderStorage( KMFolder* folder, const char* aName ) mHasChildren = HasNoChildren; mContentsType = KMail::ContentsTypeMail; + + connect(this, SIGNAL(closed(KMFolder*)), mFolder, SIGNAL(closed())); } //----------------------------------------------------------------------------- @@ -627,7 +629,7 @@ int FolderStorage::rename(const QString& newName, KMFolderDir *newParent) QString oldLoc, oldIndexLoc, oldIdsLoc, newLoc, newIndexLoc, newIdsLoc; QString oldSubDirLoc, newSubDirLoc; QString oldName; - int rc=0, openCount=mOpenCount; + int rc=0; KMFolderDir *oldParent; assert(!newName.isEmpty()); @@ -697,11 +699,6 @@ int FolderStorage::rename(const QString& newName, KMFolderDir *newParent) } } - if (openCount > 0) - { - open("rename"); - mOpenCount = openCount; - } writeConfig(); // delete the old entry as we get two entries with the same ID otherwise @@ -711,6 +708,7 @@ int FolderStorage::rename(const QString& newName, KMFolderDir *newParent) emit locationChanged( oldLoc, newLoc ); emit nameChanged(); kmkernel->folderMgr()->contentsChanged(); + emit closed(folder()); // let the ticket owners regain return rc; } @@ -738,6 +736,7 @@ void FolderStorage::remove() KConfig* config = KMKernel::config(); config->deleteGroup( "Folder-" + folder()->idString() ); + emit closed(folder()); emit removed(folder(), (rc ? false : true)); } @@ -745,8 +744,6 @@ void FolderStorage::remove() //----------------------------------------------------------------------------- int FolderStorage::expunge() { - int openCount = mOpenCount; - assert(!folder()->name().isEmpty()); clearIndex( true, mExportsSernums ); // delete and remove from dict, if needed @@ -764,12 +761,6 @@ int FolderStorage::expunge() mDirty = false; needsCompact = false; //we're cleared and truncated no need to compact - if (openCount > 0) - { - open("expunge"); - mOpenCount = openCount; - } - mUnreadMsgs = 0; mTotalMsgs = 0; emit numUnreadMsgsChanged( folder() ); diff --git a/folderstorage.h b/folderstorage.h index 8f7dcfc94..8ac637cbc 100644 --- a/folderstorage.h +++ b/folderstorage.h @@ -421,6 +421,9 @@ signals: emmitted first. */ void expunged( KMFolder* ); + /** Emitted when the folder was closed and ticket owners have to reopen */ + void closed( KMFolder* ); + /** Emitted when the serial numbers of this folder were invalidated. */ void invalidated( KMFolder * ); diff --git a/kmfolder.cpp b/kmfolder.cpp index f094653a2..513b4974b 100644 --- a/kmfolder.cpp +++ b/kmfolder.cpp @@ -481,6 +481,7 @@ int KMFolder::canAccess() void KMFolder::close( const char *owner, bool force ) { + // do not emit closed() in here - as this would regain too early mStorage->close( owner, force ); } diff --git a/kmfolder.h b/kmfolder.h index 33516bfca..422bb0b9b 100644 --- a/kmfolder.h +++ b/kmfolder.h @@ -540,6 +540,10 @@ signals: folder changed. */ void changed(); + /** Emitted when the folder is closed for real - ticket holders should + * discard any messages */ + void closed(); + /** Emitted when the contents of a folder have been cleared (new search in a search folder, for example) */ void cleared(); diff --git a/kmfoldermbox.cpp b/kmfoldermbox.cpp index 3a53f9b6d..e2dd9893b 100644 --- a/kmfoldermbox.cpp +++ b/kmfoldermbox.cpp @@ -264,7 +264,7 @@ void KMFolderMbox::close(const char *owner, bool aForced) if (mOpenCount <= 0 || !mStream) { mOpenCount = 0; return; } if (mOpenCount > 0) mOpenCount--; if (mOpenCount > 0 && !aForced) { assert(mStream); return; } - + #if 0 // removed hack that prevented closing system folders (see kmail-devel discussion about mail expiring) if ( (folder() != kmkernel->inboxFolder()) && folder()->isSystemFolder() && !aForced ) @@ -1269,17 +1269,11 @@ int KMFolderMbox::compact( bool silent ) { // This is called only when the user explicitely requests compaction, // so we don't check needsCompact. - int openCount = mOpenCount; KMail::MboxCompactionJob* job = new KMail::MboxCompactionJob( folder(), true /*immediate*/ ); int rc = job->executeNow( silent ); // Note that job autodeletes itself. - if (openCount > 0) - { - open("mboxcompact"); - mOpenCount = openCount; - } // If this is the current folder, the changed signal will ultimately call // KMHeaders::setFolderInfoStatus which will override the message, so save/restore it QString statusMsg = BroadcastStatus::instance()->statusMsg(); diff --git a/kmheaders.cpp b/kmheaders.cpp index 7a3338a72..8d602d63b 100644 --- a/kmheaders.cpp +++ b/kmheaders.cpp @@ -673,6 +673,8 @@ void KMHeaders::setFolder( KMFolder *aFolder, bool forceJumpToUnread ) this, SLOT(folderCleared())); disconnect(mFolder, SIGNAL(expunged( KMFolder* )), this, SLOT(folderCleared())); + disconnect(mFolder, SIGNAL(closed()), + this, SLOT(folderClosed())); disconnect( mFolder, SIGNAL( statusMsg( const QString& ) ), BroadcastStatus::instance(), SLOT( setStatusMsg( const QString& ) ) ); disconnect(mFolder, SIGNAL(viewConfigChanged()), this, SLOT(reset())); @@ -706,6 +708,8 @@ void KMHeaders::setFolder( KMFolder *aFolder, bool forceJumpToUnread ) this, SLOT(folderCleared())); connect(mFolder, SIGNAL(expunged( KMFolder* )), this, SLOT(folderCleared())); + connect(mFolder, SIGNAL(closed()), + this, SLOT(folderClosed())); connect(mFolder, SIGNAL(statusMsg(const QString&)), BroadcastStatus::instance(), SLOT( setStatusMsg( const QString& ) ) ); connect(mFolder, SIGNAL(numUnreadMsgsChanged(KMFolder*)), @@ -2562,6 +2566,13 @@ void KMHeaders::folderCleared() emit selected(0); } + +void KMHeaders::folderClosed() +{ + mFolder->open( "kmheaders" ); + folderCleared(); +} + bool KMHeaders::writeSortOrder() { QString sortFile = KMAIL_SORT_FILE(mFolder); diff --git a/kmheaders.h b/kmheaders.h index 2928d0f22..c6e294751 100644 --- a/kmheaders.h +++ b/kmheaders.h @@ -221,6 +221,8 @@ public slots: void msgChanged(); /** For when the folder has been cleared */ void folderCleared(); + /** For when the folder has been cleared */ + void folderClosed(); /** For when the message with the given message id has been added to a folder */ void msgAdded(int); /** For when the message with the given id has been removed for a folder */